For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
ModelsChatRankingsDocs
DocsAPI ReferenceClient SDKsAgent SDKCookbookChangelog
DocsAPI ReferenceClient SDKsAgent SDKCookbookChangelog
  • Overview
    • Quickstart
    • Principles
    • Models
    • Stripe Projects
    • FAQ
    • Report Feedback
  • Models & Routing
    • Model Fallbacks
    • Provider Selection
    • Auto Exacto
    • Private Models
      • Auto Router
      • Body Builder
      • Free Models Router
      • Latest Model Resolution
      • Pareto Router
      • Fusion Router
  • Features
    • Workspaces
    • Presets
    • Response Caching
    • Tool Calling
    • Structured Outputs
    • Message Transforms
    • Zero Completion Insurance
    • ZDR
    • App Attribution
    • Service Tiers
    • Sovereign AI
    • Router Metadata
    • Input & Output Logging
LogoLogo
ModelsChatRankingsDocs
On this page
  • Overview
  • How it works
  • Two ways to use it
  • Quick start
  • Configuration
  • Forcing fusion on every request
  • Response
  • Cost
  • Recursion protection
  • Related
Models & RoutingRouters

Fusion Router

Multi-model deliberation as a model slug

Was this page helpful?
Previous

Workspaces

Organize your projects, teams, and agents into separate environments
Next
Built with

The Fusion Router (openrouter/fusion) gives your model access to a multi-model deliberation tool. When invoked, a panel of models answers your prompt in parallel, then a judge model compares their responses and returns structured analysis — consensus, contradictions, coverage gaps, unique insights, and blind spots. Your model uses that analysis to write a better final answer.

Overview

Use Fusion when a single model isn’t enough — research questions, expert critique, “compare and contrast” prompts, or anything where the cost of being wrong outweighs the cost of a few extra completions.

How it works

  1. You send a request with model: "openrouter/fusion". The router resolves the alias to a real model and attaches the openrouter:fusion tool.
  2. Your model reads the prompt and decides whether the task warrants deliberation. If so, it invokes openrouter:fusion. (Use tool_choice: "required" to guarantee invocation.)
  3. The panel — a set of models — answers your prompt in parallel, each with openrouter:web_search and openrouter:web_fetch enabled.
  4. The judge receives all panel responses, with openrouter:web_search and openrouter:web_fetch available, and compares them — it doesn’t merge them. It returns structured analysis as JSON: what all or most models agreed on (treated as higher-confidence consensus), where they disagreed, what only some models covered, unique insights from individual models, and blind spots none of them addressed.
  5. Your model receives the analysis and writes the final answer.

openrouter:web_search and openrouter:web_fetch are enabled on both the panel and the judge calls, so models can pull fresh sources while they answer and analyze.

Two ways to use it

1{
2 "model": "openrouter/fusion",
3 "messages": [
4 { "role": "user", "content": "What are the strongest arguments for and against carbon taxes?" }
5 ]
6}

Both hit the same pipeline. The model alias is simpler — it auto-injects the tool so you don’t have to declare it. The server tool form gives you more control (choose your own outer model, combine fusion with other tools).

In both cases, the model decides when to call openrouter:fusion. For prompts that don’t need deliberation, it answers directly — including invoking any other tools you’ve defined. Add tool_choice: "required" to force fusion on every request.

Quick start

1import { OpenRouter } from '@openrouter/sdk';
2
3const openRouter = new OpenRouter({
4 apiKey: '<OPENROUTER_API_KEY>',
5});
6
7const completion = await openRouter.chat.send({
8 model: 'openrouter/fusion',
9 messages: [
10 {
11 role: 'user',
12 content: 'Survey the strongest arguments for and against a carbon tax. Where do experts disagree?',
13 },
14 ],
15});
16
17console.log(completion.choices[0].message.content);

Configuration

You can override the default panel and judge by declaring the tool explicitly with a parameters block. This is optional — omit it entirely and fusion uses the Quality preset defaults.

1const completion = await openRouter.chat.send({
2 model: '~anthropic/claude-opus-latest',
3 messages: [
4 {
5 role: 'user',
6 content: 'Compare ridge, lasso, and elastic-net regression. Where does each shine?',
7 },
8 ],
9 tools: [
10 {
11 type: 'openrouter:fusion',
12 parameters: {
13 analysis_models: [
14 '~anthropic/claude-opus-latest',
15 '~openai/gpt-latest',
16 '~google/gemini-pro-latest',
17 ],
18 model: '~openai/gpt-latest',
19 },
20 },
21 ],
22});
FieldDefaultDescription
analysis_modelsQuality preset (~anthropic/claude-opus-latest, ~openai/gpt-latest, ~google/gemini-pro-latest)Models that form the panel. Each runs in parallel with openrouter:web_search and openrouter:web_fetch enabled. 1–8 models allowed.
modelYour outer modelThe judge model that produces the structured analysis JSON. Defaults to the same model handling your request.
max_tool_calls8Max tool-calling steps each panel model and the judge may take in their openrouter:web_search / openrouter:web_fetch loop before they must return text. Range 1–16.
max_completion_tokensProvider defaultMax output tokens (including reasoning) per inner panel/judge call. Keeps reasoning-heavy models from exhausting their budget before producing visible text.
reasoningProvider defaultReasoning config forwarded to the panel and judge calls — an object with optional effort and max_tokens.
temperatureProvider defaultSampling temperature (0–2) forwarded to the panel and judge calls.

Forcing fusion on every request

By default, the model decides when to call openrouter:fusion. To guarantee it runs on every request, set tool_choice: "required":

1const completion = await openRouter.chat.send({
2 model: 'openrouter/fusion',
3 messages: [
4 {
5 role: 'user',
6 content: 'Compare ridge, lasso, and elastic-net regression.',
7 },
8 ],
9 tool_choice: 'required',
10});

Because openrouter/fusion only injects one tool (openrouter:fusion), requiring some tool call effectively forces fusion. If your request also includes other tools, the model may pick one of those instead.

Response

The response model field reports the concrete model that handled the request — not the openrouter/fusion alias:

1{
2 "id": "gen-...",
3 "model": "anthropic/claude-opus-4.5",
4 "choices": [
5 {
6 "message": {
7 "role": "assistant",
8 "content": "..."
9 }
10 }
11 ]
12}

To confirm a generation went through the Fusion Router, check the generation metadata. The router field reports openrouter/fusion:

1{
2 "data": {
3 "id": "gen-...",
4 "model": "anthropic/claude-opus-4.5",
5 "router": "openrouter/fusion"
6 }
7}

Cost

Fusion runs N panel calls + 1 judge call in addition to your normal request. With the default 3-model panel, expect roughly 4–5× the cost of a single completion on the same prompt. Cost scales linearly with panel size.

Recursion protection

Inner fusion calls carry an x-openrouter-fusion-depth header. Panel and judge models cannot recursively invoke openrouter:fusion — the plugin refuses to inject the tool a second time, keeping deliberation bounded to a single level.

Related

  • openrouter:fusion server tool
  • Fusion plugin
  • Auto Router
  • Pareto Router
  • /labs/fusion — interactive playground