Pick a provider, not a port
The panel shows a backend picker — Claude / ChatGPT / Gemini / Antigravity / Grok / Kimi / GLM / Ollama / LM Studio / llama.cpp / OpenRouter / Custom endpoint chips (experimental providers like Copilot appear behind the experimental toggle). Clicking one connects that provider on the single shared orchestrator (one bridge port serves all providers; each panel tab picks its provider in the handshake). The Bridge URL lives under Advanced for user-managed orchestrators. Switching providers starts a fresh chat — conversations aren’t shared across providers — and the panel posts a system note saying so. The composer placeholder follows the active backend (“Ask Claude…” / “Ask Ollama…”).Sign in (once per provider — or not at all)
- Claude —
claude(orclaude setup-token) — claude.ai OAuth (subscription). - ChatGPT (Codex) —
codex login— ChatGPT login (subscription); runs through the Codex app-server. - ChatGPT (direct OAuth) — no extra step if you’ve ever run
codex login: thechatgptbackend reuses~/.codex/auth.jsonand talks to ChatGPT directly (no Codex process). If the ack says the auth file is missing, runcodex loginonce. - Gemini —
gemini— Google sign-in. Note the free individual Google login was retired 2026-06-18: the Gemini CLI backend now needs aGEMINI_API_KEYor an enterprise/Code Assist account. Individual subscribers: use Antigravity below. - Antigravity (Google subscription) — install the official Antigravity
CLI from antigravity.google, run
agyonce and complete the Google Sign-In (AI Pro/Ultra and free tiers). The backend drivesagy -pper turn with--continueconversation continuity, reads the live model catalog fromagy models, and wires the ComfyUI + panel MCP tools through a merge-safe workspace.agents/mcp_config.json. Reduced capabilities by design (no documented machine-readable event stream): final answer text streams in, but there’s no per-tool progress and no image input. Conversation continuity usesagy --continue(the account’s latest conversation), so run ONE antigravity tab at a time — a second tab, or an interactiveagysession in a terminal, can steal the thread.COMFYUI_MCP_ANTIGRAVITY_MODELpins a model,COMFYUI_MCP_ANTIGRAVITY_PATHpoints at a non-standard install. - Grok — install the Grok CLI (xAI / Grok Build) and run
grokonce to sign in; the backend drives it in ACP mode. The panel also offers an in-panel OAuth sign-in row when Grok isn’t ready. - Kimi (recommended) — install the Kimi Code CLI
and run
kimi login(device-code flow); the backend reuses that login from~/.kimi-code/credentials/kimi-code.json(the legacy~/.kimipath is still read as a fallback). This uses your Kimi Code subscription and is the preferred way to run Kimi — cheaper and higher-limit than the pay-per-token Moonshot key below. SetKIMI_API_KEYinstead only for CI / no-CLI use, orKIMI_CODE_HOMEto point at a non-default credentials dir (KIMI_SHARE_DIRis still honoured for anyone who set the older name). In-panel OAuth sign-in is offered too. - GLM — set
ZAI_API_KEY(Z.AI Coding Plan;GLM_API_KEY/ZHIPUAI_API_KEYalso accepted). No CLI. - Kimi K3 (Moonshot) — the pay-per-token alternative when you don’t
have a Kimi Code subscription (prefer the Kimi route above if you do). Set
MOONSHOT_API_KEYfrom platform.kimi.ai. No CLI. This is the Moonshot platform key (default modelkimi-k3, basehttps://api.moonshot.ai/v1) — distinct from the Kimi provider above, which is the Kimi Code coding subscription. Override the model withCOMFYUI_MCP_MOONSHOT_MODELand the base withCOMFYUI_MCP_MOONSHOT_BASE_URL. - MiniMax — set
MINIMAX_API_KEYfrom platform.minimax.io. No CLI. The default model isMiniMax-M3and the default base is the global endpointhttps://api.minimax.io/v1(OpenAI-compatible, plain Bearer auth). For the China region, setCOMFYUI_MCP_MINIMAX_BASE_URL=https://api.minimaxi.com/v1. Override the model withCOMFYUI_MCP_MINIMAX_MODEL. - Atlas Cloud — set
ATLASCLOUD_API_KEYfrom the Atlas Cloud console. The default model isqwen/qwen3.5-flashover the OpenAI-compatiblehttps://api.atlascloud.ai/v1endpoint. Override the model withCOMFYUI_MCP_ATLASCLOUD_MODELor the base URL withCOMFYUI_MCP_ATLASCLOUD_BASE_URL. - Copilot (experimental) — sign in from the panel’s experimental provider row. Off by default; enable experimental backends in Settings first.
- Ollama (local) — no sign-in. Install Ollama and pull a tool-calling
model (
ollama pull gemma4:e4b). For a hosted model instead, setCOMFYUI_MCP_OLLAMA_API=openai,COMFYUI_MCP_OLLAMA_BASE_URL(e.g.https://openrouter.ai/api/v1), and an API key (COMFYUI_MCP_OLLAMA_API_KEY/OPENROUTER_API_KEY). - Custom endpoint — no sign-in flow. Point it at any OpenAI-compatible
/v1(vLLM, DeepSeek, Together, Azure, a remote llama-server) in Settings → Custom endpoint; add an API key there if the server needs one (masked input, stored 0600 by the orchestrator). See Local LLMs → Custom endpoint.
Connect-time readiness & onboarding
Every provider chip degrades HONESTLY when it isn’t ready: the connect ack tells you the exact missing step (“Set ZAI_API_KEY…”, “runcodex login…”,
“Sign in from the experimental row…”) instead of failing on your first
message — and a provider whose credentials appear later flips to ready on
the next Connect without a restart.
The panel detects each provider’s readiness at Connect time — a CLI on
PATH plus a login on disk for the subscription providers, a present binary
for Ollama (a stopped daemon degrades gracefully at connect). You don’t have
to guess which provider is set up:
- An onboarding card appears only when no provider is ready, with the one-time setup step per provider (for Ollama that’s an install + a model pull, not a sign-in).
- If your saved provider pick isn’t usable, the panel auto-switches to a ready provider (your saved preference is restored once you set it up).
- A not-ready provider’s row becomes a “set up” action that seeds a setup prompt to the working agent.
How each provider is driven
The orchestrator depends on a provider-neutralAgentBackend port
(dependency injection). Each provider is an adapter:
The
panel_* tool definitions live in one shared list, registered onto
every path, so the live-canvas surface (including the destructive-confirm
gating for panel_clear / panel_restart_comfyui) is identical across
providers. Parity is automatic — no path reimplements a tool. The Ollama/any-LLM
backend additionally wraps both tool surfaces behind six router tools so
small models aren’t drowned in schemas — see Local LLMs & other agents.
Capability matrix
A capability descriptor per backend lets the panel degrade gracefully on the features a provider can’t do:Audio input — which backends, honestly
The agent can drive ComfyUI’s audio tools on every backend. Hearing an audio file is narrower, and the table above is deliberately conservative because a silently dropped attachment is worse than a refused one:-
Ollama (the
ollamabackend, native/api/chat) — supported, capability- checked, and verified end to end. Audio rides theimages[]array, which is Ollama’s own carrier for audio rather than a hack. Confirmed live against a local Ollama withgemma4:e2b, which transcribed a real WAV.- Per-model, not per-provider. Before sending anything, the backend asks
POST /api/showwhether this model reports theaudiocapability. If it doesn’t, the attachment is refused by name, the reported capability list is quoted back to you, and you’re told which models can hear (ollama pull gemma4:e2b/gemma4:e4b/nemotron3:33b). NoteGET /api/tagsalso returns acapabilitiesarray and is not the same answer — the same model reported no audio there and audio from/api/show— so only/api/showis consulted. - The
audioflag is not a hearing guarantee. It is inherited from the architecture. A namespaced Gemma 4 fork can listaudio, accept a WAV inimages[]with HTTP 200, and return a fluent fabricated transcript (huihui_ai/gemma-4-abliterated:E4b-qat, #1972). Native Ollama therefore also requires the model tag to be one of the Ollama-tested set above; anything else — includingartokun/gemma4-comfyui-mcp— is refused before bytes hit the image slot. - The capability is re-checked on every turn that carries audio, because an
Ollama tag is mutable:
ollama pullcan replace the weights under the same name, and a cached verdict could outlive the model it described.
- Per-model, not per-provider. Before sending anything, the backend asks
-
LM Studio / llama.cpp / OpenRouter / GLM / Kimi / Moonshot / MiniMax /
Atlas Cloud / Copilot / custom OpenAI-compatible endpoints — attempted, NOT
capability-checked. These all speak
/v1/chat/completions, which has no capability endpoint to ask, so audio is sent as aninput_audiocontent part and you are told, on that turn, that the delivery is unconfirmed: “I cannot confirm the model actually receives them — if the reply does not reflect what is in the file, it did not hear it.” Refusing instead would deny audio to every endpoint that simply has no capability API; a guard that cannot run is not a verdict. Theinput_audioshape itself was verified against Ollama’s OpenAI-compatible endpoint; whether any given third-party host honours it is not something we can check, and we don’t claim to. -
Claude, ChatGPT (Codex), Codex CLI, Gemini, Grok, Antigravity, pi — no
audio input in this build. Attaching audio is refused before the turn is
built, and both you and the model are told, naming the provider and what
would work instead.
On Gemini/Grok this is a deliberate omission rather than a protocol gap: ACP
does define an
audioContentBlock, but it requires the agent to advertise anaudioprompt capability first, and neither CLI has been observed doing so. A send path that can never be exercised, whose failure mode is an attachment the user is never told did not arrive, is worse than an honest refusal — so it isn’t shipped.
Read/WebFetch on image content (raster files by
extension and magic bytes, PDFs, notebook outputs, and ComfyUI /view URLs)
whenever Blind is on — read live per call, so a mid-session toggle binds the
very next tool call. The API/local lanes (Ollama family, GLM, Kimi, custom
endpoints) carry only our tool surface, so the MCP scrub covers them fully. The
CLI lanes (Codex, Gemini, Grok, Antigravity, pi, Copilot) run their own
agent binaries whose built-in file tools we cannot hook — turning Blind on
there posts a visible warning saying exactly that, rather than implying a
guarantee we can’t keep.
How an audio file gets onto a turn
The orchestrator accepts audio on a panelmessage frame in two ways:
images
would otherwise hand an audio file to a vision content part. Anything with an
audio extension is moved to the audio path automatically — including formats we
cannot encode (.wma, .mid, .aiff), so you get “convert it to one of…”
rather than an image error.
Sending the same file in both arrays (as the example above does) is safe: a
ref is identified by filename + subfolder + type, so it is delivered once and
counts once against the two-attachments-per-turn limit. It is not mistaken for
a second file and then refused for not fitting.
A composer control for picking an audio file lives in the panel
(
comfyui-mcp-panel), which is a separate repository — that part is not in this
release. Until it lands, the wire contract above is what a client sends, and the
route is exercised end to end from the orchestrator side./revert, double-Esc, per-turn
snapshots) works on every backend because it lives in the orchestrator, not
the provider.
Reasoning effort across a switch
The effort/model picker is per-provider. A chosen effort survives a provider switch by mapping to the nearest valid level for the target backend (the panel and the orchestrator backends do the same mapping):- Claude:
low·medium·high·xhigh·max - ChatGPT (Codex):
none·minimal·low·medium·high·xhigh·max·ultra(max/ultraon GPT-5.6-class models) - Gemini / Ollama: no user-facing effort scale — the selector is hidden.
Knowledge & cost parity
Because only Claude can load native skills, the bundled expertise is published as one MCP tool any backend can call —list_packs, whose actions
cover the skills (skill_list, skill_read), the installer packs (list,
read_workflow) and the server’s templates (list_templates) — plus the
local-GPU-vs-paid-API guardrail (action: "check_runtime") and one-shot
panel_load_workflow. See Skills, Packs & Runtime Cost.
See also
- Sidebar Panel — the full panel UX
- Local LLMs & other agents — the 6-tool router, model requirements, Hermes/OpenClaw/Copilot setup
- LLM Arena — score YOUR model on real ComfyUI tasks
- Skills, Packs & Runtime Cost — the parity + cost tools
- Design doc:
design/agent-backend-injection.md