Skip to content

[feat] provider: first-class local vLLM-Omni backend (image/video/TTS/ASR) on consumer devices #224

Open

Description

@hsliuustc0106

Motivation

OpenDirector is local-first by design — projects stay on your machine, and generation uses the provider APIs or self-hosted model services you choose. The launch demo already used vLLM-Omni to serve video generation (FastH3), and #205 extends the audio side (voices for vLLM-Omni and MOSS).

On the vLLM-Omni side, an RFC was just filed to make consumer-device self-hosting first-class — a full multi-stage backend (diffusion image/video + TTS + ASR) behind one localhost endpoint on an RTX laptop or an Apple Silicon Mac:

This issue tracks the OpenDirector side of that work so the pairing works end-to-end out of the box.

Proposed work items

ID Item Scope Notes
V1 vLLM-Omni service preset in Settings → Model connections: endpoint mapping for chat (/v1/chat/completions), image (/v1/images/generations, /v1/images/edits), video (/v1/videos), TTS (/v1/audio/speech), ASR (/v1/audio/transcriptions when available), with 127.0.0.1 defaults. M Extends the existing service/connection model; ASR endpoint lands via vllm-omni#10007 S1
V2 Capability detection and graceful degradation: probe which stages the configured vLLM-Omni server actually serves (capabilities endpoint, vllm-omni#10007 S2) and surface per-stage availability in the UI instead of failing generation attempts on unconfigured stages. S–M Also benefits other partial-configuration setups
V3 Docs: "Run fully local with vLLM-Omni" guide — server startup for an RTX laptop (Linux/WSL2, pointing at #10008 profiles once published) and Apple Silicon status (experimental, #10009); localhost/CORS notes. S New page under docs/guides/; cross-link from the user guide's Model connections section
V4 Validate harness: end-to-end acceptance — idea → script → image/video → TTS → export on (a) a single 8/12/16 GB RTX laptop and (b) an M-series Mac (diffusion/TTS local, text stages as available). M Follows the [validate] convention; needs community hardware — see help wanted

Help wanted

  • Owners of RTX 30/40/50 laptops (8/12/16 GB) and Apple Silicon Macs: report hardware, OS, and results on V4 once the vLLM-Omni profiles land; early smoke results welcome before that.
  • Comments on V1 endpoint coverage — anything else the model-connection preset should map?

Cross-references: vllm-project/vllm-omni#10007, #10008, #10009; related here: #205 (audio voices), #107 (Q4 roadmap).

Activity

  1. added
    help wantedExtra attention is needed
    type:featNew capability or behaviour
    area:providerModel providers and generation protocols
    modality:videoVideo generation, editing or rendering
    modality:audioSpeech, music or audio processing
    on Nov 8, 2026
  2. Xingkai98 commented on Nov 10, 2026

    @Xingkai98

    I'd like to take V1 + V2 as one series (V1 first; happy to split). V1: a vLLM-Omni local-service preset mapping chat/images/videos/speech to 127.0.0.1 — ASR waits on vllm-omni#10007 S1. V2: stage-level capability probing, falling back to per-stage detection when capabilities aren't advertised, so unconfigured stages degrade instead of throwing. Fixtures + tests first. Could you assign these to me?

  3. FayeSpica commented on Nov 10, 2026

    @FayeSpica
    Collaborator

    Thanks, @Xingkai98 assigned.

    please collaborate with vllm-project/vllm-omni#10007.

    Feel free to ask any questions.

  4. bread-lxy commented on Nov 10, 2026

    @bread-lxy

    Hi, I'd like to contribute to V2 as well. I already have a local implementation of capability discovery, the model settings UI and checks before generation. It keeps existing connections usable when a service doesn't expose capabilities, and preserves accepted tasks when capabilities or settings change. I'm also working on the corresponding S2 endpoint in vllm-project/vllm-omni#10007.

    The two applications have been tested together over local HTTP without loading model weights. I'm finishing the input checks and Chinese/English UI wording, then I'll open a PR. Real-model validation is still pending.

    @Xingkai98 I saw you've been assigned V1 and V2. Can we compare our approaches and agree on how to split the V2 work? I'd like to be included in V2 too, and make sure we use the same capability API on both sides.

  5. FayeSpica commented on Nov 10, 2026

    @FayeSpica
    Collaborator

    Thanks, @bread-lxy! You’re both assigned now. Feel free to coordinate here on how you’d like to split the V2 work.

  6. Xingkai98 commented on Nov 10, 2026

    @Xingkai98

    @bread-lxy Thanks for the quick reply, and for laying out where your code already stands — that makes this much easier to split.

    If it works for you, I'd suggest:

    • V2 → you: capability discovery, the settings UI and the pre-generation checks, plus the upstream /v1/omni/capabilities endpoint. Your implementation is further along, so it would be a waste for us to write two versions of the same thing.
    • V1 → me: the vLLM-Omni local-service preset under Model connections (chat / images / videos / speech → 127.0.0.1, with ASR mapped but flagged unavailable until vllm-omni#10007 S1 lands), plus the bilingual copy and tests.
    • Shared, and I'm happy to take it on: the capability contract — a small stage/route → capability mapping table plus fixtures (full / partial / no capabilities, and the expected degradation), so both repos' tests run against the same shape and the HTTP shapes can't drift. I'd do this first, as its own small PR, before either of our main ones.

    To keep us out of each other's files: you'd keep integrations/model_capabilities.py, domain/capabilities.py and ModelSettings.tsx; I'd take providerPresets.ts, ModelServiceForm.tsx and the i18n files. application/model_catalog.py is the one we both need — could we split it as you owning capabilities() and me owning the preset resolution, each reviewing the other's PR?

    If you'd rather write the contract yourself, I'm equally happy to review it instead — no strong preference either way. Glad to be working on this with you, and thanks @FayeSpica for the assignment.

  7. bread-lxy commented on Nov 10, 2026

    @bread-lxy

    Thanks @Xingkai98, that split works for me: I'll handle V2's capability discovery, display and submission checks, plus the Omni endpoint. You'll handle V1's local-service presets and endpoint mappings, including the ASR availability handling and related copy/tests.

    Both draft PRs are open:

    • Omni S2 #10102: the capability endpoint and its response format.
    • OpenDirector V2 #266: capability display and request checks, including input limits and accepted-task preservation.

    On the connection form you proposed taking: my V2 PR already adds automatic-check settings and per-model capability checks to ModelServiceForm.tsx, with Chinese/English states and errors. These are capability-checking controls; the V1 service preset still needs to be added. Could you review those changes first? If they look reasonable to you, we can agree on how your preset work fits into the same form and translation files.

    Your split of model_catalog.py also works for me: capability checks on my side, preset resolution on yours. For the shared API format and test cases, there's already an implementation in these PRs. I'm happy for you to review and improve that as part of the shared work you offered.

    Thanks @FayeSpica for assigning us both!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:providerModel providers and generation protocolshelp wantedExtra attention is neededmodality:audioSpeech, music or audio processingmodality:imageImage generation or editingmodality:videoVideo generation, editing or renderingtype:featNew capability or behaviour

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions