66 lines
2.6 KiB
TOML
66 lines
2.6 KiB
TOML
[package]
|
|
name = "sglang-mm"
|
|
description = "Rust-accelerated multimodal preprocessing for SGLang"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
|
|
# Consumed by python/setup.py: registers this crate as a PyO3 extension module
|
|
# of the main sglang wheel at the given import path. debug = false keeps
|
|
# editable installs on release builds (image preprocessing is perf-sensitive).
|
|
# features: the wheel build needs the PyO3 bindings, which are NOT default (see
|
|
# [features] below).
|
|
[package.metadata.sglang]
|
|
python-module = "sglang.srt.rust_extensions._multimodal"
|
|
debug = false
|
|
features = ["python", "parallel"]
|
|
|
|
[lib]
|
|
# Unique per-crate artifact name (the shared workspace target/ dir cannot hold
|
|
# multiple `lib_core` cdylibs). The importable Python module is `_multimodal`: the
|
|
# name comes from the `#[pymodule]` entry point and the setuptools-rust target,
|
|
# which renames the built artifact.
|
|
name = "sglang_mm_core"
|
|
# cdylib: the PyO3 module (`sglang.srt.rust_extensions._multimodal`).
|
|
# rlib: pure-Rust core linked by sglang-server's Rust MM path.
|
|
crate-type = ["cdylib", "rlib"]
|
|
|
|
[features]
|
|
# Both features are deliberately NOT default: cargo unifies a package's
|
|
# features across everything selected in one invocation, so anything default-on
|
|
# here would leak back into sglang-server's copy of this crate under
|
|
# `cargo build --workspace` even though the server depends on it with
|
|
# `default-features = false`. Opting in explicitly keeps the pure-Rust core
|
|
# pure no matter how the workspace is built; the wheel asks for both via
|
|
# `[package.metadata.sglang] features` above.
|
|
default = []
|
|
# Every PyO3 binding.
|
|
python = ["dep:pyo3", "dep:numpy"]
|
|
# Fan work out onto crate-owned rayon pools (see `common::par`). Off for the
|
|
# rlib: sglang-server provides concurrency across requests and owns its core
|
|
# budget, so preprocessing runs inline on the calling thread and rayon is not
|
|
# linked at all. Orthogonal to `python` so both shapes stay testable.
|
|
parallel = ["dep:rayon"]
|
|
|
|
[dependencies]
|
|
pyo3 = { workspace = true, optional = true }
|
|
numpy = { version = "0.29", optional = true }
|
|
|
|
base64 = "0.22"
|
|
blake3 = "1"
|
|
half = "2.4"
|
|
# The formats the Python (PIL) path commonly accepts; all pure-Rust decoders.
|
|
image = { version = "0.25", default-features = false, features = [
|
|
"jpeg",
|
|
"png",
|
|
"webp",
|
|
"gif",
|
|
"bmp",
|
|
] }
|
|
rayon = { version = "1.10", optional = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
# Native media fetch (stage 1 of the server MM pipeline); rustls so the
|
|
# extension never links the system OpenSSL.
|
|
ureq = { version = "2", default-features = false, features = ["tls", "gzip"] }
|