Skip to content

Ship a CLI 'fleet up' path so two models serve behind one gateway endpoint (unblocks convertible cross-model subagent delegation) #17

Description

@OriNachum

Why this matters (consumer: convertible)

convertible v0.15.0 shipped subagent delegation: a drive can delegate a scoped sub-task to a nested child drive on a different model, via a subagent loop tool. The per-subagent model switch goes through the OpenAI surface — the child inherits the parent's base_url and overrides only the model name (convertible/subagents.pyrun_subagentdataclasses.replace(parent_config, model=...)). So a true cross-model delegation (parent on mmangkad/Qwen3.6-27B-NVFP4 → subagent on mmangkad/Qwen3.6-35B-A3B-NVFP4) needs both models answering at one OpenAI-compatible base_url, routed by the request's model field.

model-gear's gateway is precisely that. From model_gear/gateway/__init__.py:

"model-gear gateway — a stdlib OpenAI-compatible reverse proxy for the fleet. Fronts two always-warm vLLM backends on one port, routes each request by its model field, defaults unknown/missing names to the primary, and fails over to the other backend when the chosen one is down. Runs as the gateway container in a model init --fleet deployment (python -m model_gear.gateway)."

And docs/qwen3.6-35b-a3b-nvfp4.md directs operators to run model fleet upmodel assess / model benchmark.

The gap (observed on the spark box, 2026-05-30)

The fleet is documented but not reachable from the installed CLI, and not deployed:

  1. No CLI surface for it. model -h subcommands are: switch, serve, start, stop, status, assess, benchmark, init, whoami, learn, explain, overview, doctor, cli — there is no fleet command. model init -h offers only --force/--apply/--jsonno --fleet. Yet gateway/__init__.py references model init --fleet and docs/qwen3.6-35b-a3b-nvfp4.md references model fleet up. Docs + code reference a path the shipped CLI does not expose.
  2. Single-model deployment running. ~/.model-gear/docker-compose.yml + .env are the single-model template (VLLM_MODEL=mmangkad/Qwen3.6-27B-NVFP4, VLLM_PORT=8001). docker ps shows only model-gear-vllm (27B, :8001) — no gateway / vllm-fallback container, and no python -m model_gear.gateway host process.
  3. Fallback model absent. mmangkad/Qwen3.6-35B-A3B-NVFP4 is not in the HF cache (~/.cache/huggingface/hub holds the 27B + nvidia/Qwen3-32B-NVFP4, not the 35B-A3B). Its own doc says: "Status: configured, not yet load-tested on this hardware."

So there is currently no supported way to get the 27B and 35B answering at one endpoint.

Ask

Expose the fleet path in the shipped CLI — model fleet up (or model init --fleet + model serve --fleet) — that:

  1. Scaffolds the two-backend + gateway compose (primary + fallback vLLM, gateway on one host port) into the deployment dir.
  2. Pulls the fallback weights if absent and starts all three services.
  3. Reports the gateway base_url + the two served-model names.

so a client can address http://<host>:<gateway-port>/v1 with model: mmangkad/Qwen3.6-27B-NVFP4 or model: mmangkad/Qwen3.6-35B-A3B-NVFP4 and have the gateway route by name.

Acceptance criteria

  • A single model fleet up (final verb name TBD) brings up two vLLM backends + the gateway from ~/.model-gear, idempotently.
  • curl http://<host>:<gateway-port>/v1/models lists both served names.
  • A chat/completions request with model: <27B> and one with model: <35B> each return from the correct backend (with the documented fail-over when one is down).
  • model status reports the fleet topology (both backends + gateway health), not just a single container.
  • model -h / model init -h and docs/gateway-fleet.md agree with the shipped surface — no dangling references to a verb that doesn't exist.

Context

Filed while validating convertible's subagent delegation live against mmangkad/Qwen3.6-27B-NVFP4 on :8001. The same-model case (27B → 27B) already works end to end; the cross-model case (27B → 35B) is blocked only on having both models behind one endpoint, which the fleet gateway provides.

  • convertible (Claude)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions