Files
vllm-omni/recipes/Microsoft/Mage-VL.md
T

115 lines
4.2 KiB
Markdown

# Mage-VL
> Codec-native image/video understanding plus proactive full-duplex streaming.
## Summary
- Vendor: Microsoft
- Model: [`microsoft/Mage-VL`](https://huggingface.co/microsoft/Mage-VL)
- Task: Image understanding, video understanding, codec-native video understanding,
and event-gated streaming commentary
- Mode: Full-duplex WebSocket server and session adapter in
`vllm_omni/experimental/fullduplex/mage_vl`
- Maintainer: Community
## Status
This experimental integration provides the Mage-VL adapter contract: bounded causal
visual windows, codec-window input, rolling gate evaluation, explicit query handling,
per-session state isolation, and stale-output cancellation through the shared
full-duplex runtime.
The production transport exposes `WebSocket /v1/mage-vl/duplex`, with bearer-token
authentication, bounded concurrent sessions and message sizes, idle timeouts,
disconnect cancellation, per-session state cleanup, and serialized access to the
shared Transformers checkpoint. Native vLLM model execution remains follow-up work.
The default `frames` backend uses decoded frames and has no codec preprocessing
requirement. The optional `codec` backend requires `ffmpeg` and `ffprobe`, plus the
`cv-preinfer` executable provided by `codec-video-prep>=0.2.5`, on `PATH`. Server
startup fails with an actionable error when `cv-preinfer` is unavailable; use
`--video-backend frames` when codec preprocessing is not installed.
## Serving
```bash
python -m vllm_omni.experimental.fullduplex.mage_vl.serving.server \
--model microsoft/Mage-VL --host 0.0.0.0 --port 8090 \
--auth-token "$MAGE_VL_API_KEY" --max-sessions 32 \
--video-backend frames --num-frames 8 --target-fps 1 \
--gate-threshold 0.5 --attn-impl sdpa
python examples/online_serving/mage_vl/duplex_client.py \
--url ws://127.0.0.1:8090/v1/mage-vl/duplex \
--auth-token "$MAGE_VL_API_KEY" \
--video /path/to/segment.mp4 \
--prompt "Describe this video segment in detail."
```
Each input window is a JSON `input.append` event whose `data.data.video_base64`
contains an MP4 segment. A text `input.append` before the video requests an explicit
answer; without text, the StreamMind gate decides whether to respond proactively.
The server emits `session.created`, `response.created`, one or more
`response.delta`, and `response.done` events. Clients can send `response.cancel` for
barge-in and `close` for graceful shutdown.
The adapter can still be wired to another backend through `--adapter module:factory`,
including:
- a Transformers `trust_remote_code=True` backend for offline/local testing;
- the model author's SGLang-compatible serving path;
- a future native vLLM `mage_vl` backend.
## Adapter Shape
```python
from vllm_omni.experimental.fullduplex.core.session import DuplexSession, DuplexSessionConfig
from vllm_omni.experimental.fullduplex.mage_vl import MageVLDuplexAdapter, MageVLDuplexRuntime
adapter = MageVLDuplexAdapter(gate=run_mage_gate, generate=run_mage_decoder)
session = DuplexSession(
"stream-1",
DuplexSessionConfig(
input_modalities=("codec_window", "video", "image", "text"),
output_modalities=("text",),
proactive=True,
),
)
runtime = MageVLDuplexRuntime(session, adapter)
await runtime.run(input_events, emit_event)
```
Input events use the shared full-duplex protocol. For decoded video/image, pass the frame
payload directly. For codec-native streaming, pass `modality="codec_window"` and include
fields such as `segment_id`, `pts_ms`, `duration_ms`, `codec`, and `metadata`.
```python
{
"type": "input.append",
"modality": "codec_window",
"data": {
"kind": "h264",
"segment_id": "seg-42",
"pts_ms": 42000,
"duration_ms": 1000,
"codec": {
"motion_vectors": ...,
"residual_energy": ...,
},
"metadata": {"gop": "P"},
},
}
```
The gate callable receives the current rolling window and returns either a
`MageVLGateDecision`, a mapping with `should_respond` / `text` / `event_id`, a bool, or
a text string. Repeated `event_id` values are de-duplicated at the session adapter.
## Verification
```bash
pytest tests/e2e/features/fullduplex/test_mage_vl_adapter.py \
tests/examples/offline_inference/test_mage_vl.py
```