Signed-off-by: Huang, Zeyu <11222265+fhfuih@users.noreply.github.com> Signed-off-by: Samit <285365963@qq.com> Co-authored-by: Samit <285365963@qq.com>
119 lines
3.7 KiB
Python
119 lines
3.7 KiB
Python
import re
|
|
|
|
from .types import Modality, ModelMode, Spec
|
|
|
|
|
|
def _bagel_payload_preprocessor(payload: dict) -> dict:
|
|
try:
|
|
for message in payload["messages"]:
|
|
for content in message["content"]:
|
|
if content["type"] == "text":
|
|
content["text"] = "<|im_start|>" + content["text"] + "<|im_end|>"
|
|
except (KeyError, TypeError):
|
|
raise RuntimeError("Internal Error: malformatted BAGEL payload")
|
|
return payload
|
|
|
|
|
|
def _qwen25_payload_preprocessor(payload: dict) -> dict:
|
|
if payload["messages"][0]["role"] != "system":
|
|
payload["messages"] = [
|
|
{
|
|
"role": "system",
|
|
"content": (
|
|
"You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group,"
|
|
"capable of perceiving auditory and visual inputs, as well as generating text and speech."
|
|
),
|
|
},
|
|
*payload["messages"],
|
|
]
|
|
return payload
|
|
|
|
|
|
_MODEL_PIPELINE_SPECS: dict[str, Spec] = {
|
|
r"BAGEL-7B-MoT": {
|
|
"stages": [
|
|
"diffusion" # The vLLM-Omni interface treats it as a single-stage diffusion model
|
|
],
|
|
"modes": [
|
|
{
|
|
"mode": ModelMode.UNDERSTANDING,
|
|
"input_modalities": [Modality.TEXT, Modality.IMAGE],
|
|
}
|
|
],
|
|
"payload_preprocessor": _bagel_payload_preprocessor,
|
|
},
|
|
r"Qwen2.5-Omni*": {
|
|
"stages": ["autoregression", "autoregression", "autoregression"],
|
|
"payload_preprocessor": _qwen25_payload_preprocessor,
|
|
"modes": [
|
|
{
|
|
"mode": ModelMode.UNDERSTANDING,
|
|
"input_modalities": [
|
|
Modality.TEXT,
|
|
Modality.IMAGE,
|
|
Modality.VIDEO,
|
|
Modality.AUDIO,
|
|
],
|
|
}
|
|
],
|
|
},
|
|
r"Qwen3-Omni*": {
|
|
"stages": ["autoregression", "autoregression", "autoregression"],
|
|
"modes": [
|
|
{
|
|
"mode": ModelMode.UNDERSTANDING,
|
|
"input_modalities": [
|
|
Modality.TEXT,
|
|
Modality.IMAGE,
|
|
Modality.VIDEO,
|
|
Modality.AUDIO,
|
|
],
|
|
}
|
|
],
|
|
},
|
|
}
|
|
# Convert dict keys to regex patterns
|
|
MODEL_PIPELINE_SPECS: dict[re.Pattern, Spec] = {}
|
|
for k, v in _MODEL_PIPELINE_SPECS.items():
|
|
MODEL_PIPELINE_SPECS[re.compile(k)] = v
|
|
del _MODEL_PIPELINE_SPECS
|
|
|
|
|
|
def lookup_model_spec(model: str) -> tuple[Spec | None, str | None]:
|
|
try:
|
|
last_component = model.rstrip("/").rsplit("/", 1)[-1]
|
|
except IndexError:
|
|
last_component = model
|
|
for pattern, spec in MODEL_PIPELINE_SPECS.items():
|
|
if pattern.search(last_component):
|
|
return spec, pattern.pattern
|
|
return None, None
|
|
|
|
|
|
# ============== DEMONSTRATION ==============
|
|
|
|
if __name__ == "__main__":
|
|
test_paths = [
|
|
"Qwen/Qwen2.5-Omni-7B",
|
|
"MyModels/Qwen2.5-Omni-3B",
|
|
"/root/home/Qwen2.5-Omni-7B",
|
|
"Qwen/Qwen3-Omni",
|
|
"Qwen/Qwen3-Omni-30B-A3B-Instruct",
|
|
"Custom/Path/UnknownModel-Instruct",
|
|
"Not/Matching/Anything",
|
|
]
|
|
|
|
test_payload = {"messages": [{"role": "user", "content": "prompt"}]}
|
|
|
|
print("Testing registry lookups:\n")
|
|
for path in test_paths:
|
|
spec, _ = lookup_model_spec(path)
|
|
if spec:
|
|
if preprocessor := spec.get("payload_preprocessor"):
|
|
result = preprocessor(test_payload)
|
|
print(f"✓ {path:<40} → {result}")
|
|
else:
|
|
print(f"✓ {path:<40} → No preprocessor")
|
|
else:
|
|
print(f"✗ {path:<40} → No match")
|