Model synthesis
One prompt, several models. A synthesis request fans your prompt out to a panel of models that answer independently in parallel, then a synthesizer model reads the attributed candidates and streams back one merged reply. You get answers that survive disagreement between models — at the honest price of running each of them.
The three synthesis ids
Each id is a curated panel + synthesizer pairing. Send it anywhere a model id goes on the OpenAI Chat wire:
| id | Panel | Synthesizer |
|---|---|---|
| ih-synthesis-budget | glm-5.2 + deepseek-v4-pro | glm-5.2 |
| ih-synthesis | kimi-k2.6 + glm-5.2 | glm-5.2 |
| ih-synthesis-max | fable-5 + gpt-5.6-terra | fable-5 |
The compositions are curated for answer quality per dollar and will evolve as models come and go — the disclosure header below always tells you exactly who participated in your turn. ih-synthesis-max runs frontier models on both stages; picking it is the consent to frontier billing on every participant.
curl https://app.inferencehub.tech/v1/chat/completions \ -H "Authorization: Bearer sk-prov-live-YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "ih-synthesis", "stream": true, "messages": [{ "role": "user", "content": "Design a rate limiter for a multi-tenant API." }] }'Or bring your own panel
The model_synthesis tool gives you the same orchestration with explicit participants: name up to four analysis_models and a synthesizer_model, and set the request's model to the synthesizer. Any model you can reach on the chat wire can sit on the panel.
curl https://app.inferencehub.tech/v1/chat/completions \ -H "Authorization: Bearer sk-prov-live-YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "glm-5.2", "stream": true, "messages": [{ "role": "user", "content": "Design a rate limiter for a multi-tenant API." }], "tools": [{ "type": "model_synthesis", "analysis_models": ["glm-5.2", "kimi-k2.6"], "synthesizer_model": "glm-5.2" }] }'stream: true — the panel phase runs for up to a few minutes before the first visible token, and only a stream can stay honestly alive that long (you'll see SSE keepalive comments while the panel works). Non-streaming synthesis requests get a clean 400.Pricing: each participant at its normal rates
Synthesis has no bundle price and no markup. Every participant — each panel model and the synthesizer — bills as its own line item at that model's normal per-token rates, exactly as if you had called it directly. A synthesis turn therefore costs roughly the sum of asking each panel model yourself, plus the synthesizer pass over the candidates.
- Pay-as-you-go only (for now) — synthesis turns bill your prepaid balance and are not covered by subscription plan windows.
- Line items are linked — the portal's usage view shows one row per participant, tied to the request that spawned them, so you can audit exactly what a synthesis turn cost.
- A failed panelist bills only what it used — a candidate that errors or times out settles its actual tokens (often zero) and the synthesis continues without it.
How a turn runs
- Fresh questions fan out — a new user turn goes to the whole panel in parallel; the synthesizer then streams the merged answer.
- Tool follow-ups don't — when your agent returns tool results mid-conversation, the turn goes to the synthesizer alone (your function tools are its business, not the panel's), so agent loops don't multiply every step's cost.
- Survivors continue — if some panelists fail, synthesis proceeds on the rest; if every panelist fails, the synthesizer answers solo and the response discloses it. You still get an answer, never a wasted turn.
In coding agents
Any coding agent that speaks OpenAI Chat Completions against a custom base URL can use synthesis today — add a synthesis id as a custom model in Cursor or on Kilo Code's OpenAI-wire provider, exactly like any other model. The turn rules above are what make this practical: only your fresh prompts pay the panel's cost and latency, and every tool step in an agent loop runs the synthesizer alone at its normal single-model price and speed.
You always see who served you
Like Auto routing, synthesis is not a black box:
- the
x-ih-synthesisresponse header names every participant, e.g.panel=kimi-k2.6,glm-5.2; synthesizer=glm-5.2; - panel failures and timeouts are disclosed as SSE comments in the stream (a spec-mandated parser no-op — your client ignores them unless you look);
- the final usage chunk aggregates the whole turn's tokens, and the portal shows the per-participant breakdown.