Show HN: Openfusion - enhanced results from a panel of models Openfusion, an open-source drop-in compound-model proxy, lets users point any OpenAI-compatible tool at it to fan out prompts to a panel of LLMs in parallel, then a judge model synthesizes a single answer. The project aims to improve answer quality by combining multiple models, offering a tunable alternative to OpenRouter's Fusion. It includes a terminal chat, web playground, and supports presets like 'quality' and 'budget'. An open-source, drop-in compound-model proxy. Point any OpenAI-compatible tool at it, set model: "openfusion" , and your prompt is fanned out to a panel of LLMs in parallel — then a judge model reads every response consensus, contradictions, blind spots and streams back a single synthesized answer that aims to beat any one of them. It's the open version of the mixture-of-agents idea behind OpenRouter's Fusion: better answers from models you already pay for, as a tunable, forkable recipe instead of a black box. Quick start · How it works how-it-works · Playground playground · Routing & strategies routing--strategies · vs. OpenRouter Fusion openfusion-vs-openrouter-fusion · Benchmarks benchmarks · Contributing /shahar-dagan/openfusion/blob/main/CONTRIBUTING.md New here? You only need the first two to run it; the rest is for tuning and contributing. | Path | What it is | |---|---| openfusion/ | The proxy FastAPI . Start with server.py ; see | web/ | The playground UI source React + shadcn . Built assets ship in openfusion/static/ . | examples/ | Copy-paste config recipes preset, dev, panel, bench… . You don't need a config to start. | bench/ | Reproducible head-to-head harness; bench/FINDINGS.md is where fusion does and doesn't pay off. | DESIGN.md · docs/ | Design rationale, architecture, and security notes. | Beta — panel fan-out, judge synthesis, SSE streaming, web-tool fusion, an Auto Router, debate/ vote/ranked aggregators, production limits, and an interactive playground. See DESIGN.md /shahar-dagan/openfusion/blob/main/DESIGN.md and docs/ARCHITECTURE.md /shahar-dagan/openfusion/blob/main/docs/ARCHITECTURE.md for architecture and security notes. openfusion has two front ends — an interactive terminal chat and a web playground. No clone, no config, no env vars needed to start. uvx --from git+https://github.com/shahar-dagan/openfusion openfusion ephemeral, needs uv …or: pip install git+https://github.com/shahar-dagan/openfusion && openfusion Bare openfusion drops you into a Rich-rendered chat with the model panel — a banner, a live panel-progress spinner, Markdown answers with syntax-highlighted code, and slash commands /preset , /tokens , /models , /key , /clear . On first run it asks for your OpenRouter key and saves it ~/.config/openfusion/credentials , so later runs don't re-prompt; use /key to change it. Pipe for one-shots: echo "…" | openfusion . openfusion web opens the playground in your browser …or: docker run -p 8000:8000 ghcr.io/shahar-dagan/openfusion openfusion web pops the playground open at http://localhost:8000 once the server is ready pass --no-open , or it's skipped automatically in non-interactive/headless/Docker contexts . Paste your key kept only in server memory and fuse. With nothing configured it boots the Budget preset a diverse panel + judge with web search so the first run lands where fusion actually wins. uv tool install . from a clone — or: pipx install . && pipx ensurepath For active development, pip install -e . inside an activated venv the command then works only while that venv is active . A bare pip install -e . does not put openfusion on your global PATH — see Troubleshooting troubleshooting . For a fixed recipe, write an openfusion.yaml start from examples/preset.yaml.example — preset: quality | budget , or examples/default.yaml.example for a fully spelled-out panel/judge . A preset expands to a diverse OpenRouter panel + judge with web tools on, mirroring OpenRouter Fusion's Quality/Budget switch: | Preset | Panel | Judge | Tools | |---|---|---|---| quality | Claude Sonnet 4 · Gemini 3 Pro · DeepSeek V4 Pro | Claude Sonnet 4 | web search + fetch | budget | GPT-4o-mini · DeepSeek V4 Pro · Kimi K2.6 | DeepSeek V4 Pro | web search + fetch | Use as a drop-in API from the OpenAI SDK with openfusion web running : python from openai import OpenAI client = OpenAI base url="http://localhost:8000/v1", api key="local-dev" stream = client.chat.completions.create model="openfusion", messages= {"role": "user", "content": "Explain mixture-of-agents in one paragraph."} , stream=True, for chunk in stream: print chunk.choices 0 .delta.content or "", end="" Or straight from the terminal, no server needed: openfusion ask "Compare Postgres and SQLite for a small SaaS." --max-tokens 800 ask runs one fusion against your configured panel and streams the synthesized answer to stdout panel progress goes to stderr . --max-tokens caps every call — lower is faster and cheaper. Speed & length.Fusion runs N panel calls plus a judge, so it's slower than one model — the panel runs in parallel and the judge streams as soon as the panel finishes. The judge is prompted to stay concise, and you cap length with --max-tokens CLI , max tokens API , the response- length control in the playground Settings, or cost controls in config. Three knobs control whether and how a prompt is fused. All are optional and off/default. - Auto Router router.enabled: true — a per-prompt gate that answers simple prompts with a single pass-through call and reserves the panel for prompts that look like they benefit long, analytical, or containing code . Default is a cheap heuristic no extra model call ; mode: model uses a small classifier model and falls back to the heuristic if it errors: router: enabled: true mode: heuristic heuristic | model | always | never min chars: 280 prompts at/over this length fuse classifier: required for mode: model base url: https://openrouter.ai/api/v1 api key: ${OPENROUTER API KEY} model: openai/gpt-4o-mini - Strategy strategy: — how the panel is produced: self fusion one model sampled N times , panel a fixed diverse panel , or debate a diverse panel where each member revises after seeing the others' answers, then the judge synthesizes . Debate trades extra cost/latency for cross-examination: strategy: debate debate: rounds: 1 revision rounds before the judge - Aggregator aggregator: — how answers become one: judge synthesis, default , vote majority vote, cheaper, best for verifiable short-answer tasks , or ranked one short judge call picks the single best answer — cheaper than synthesis, uses model judgment unlike vote . - Analysis transparency analysis.emit: true — surface the judge's structured reasoning consensus / contradictions / partial coverage / unique insights / blind spots as a separate SSE event: analysis and an analysis field on non-streaming responses , without polluting the answer body. - Prompt caching cache.enabled: true — mark the shared prefix so self-fusion's N samples reuse a cached prompt on providers that support it a no-op elsewhere . For public deployments, bound load and spend both default to 0 = unlimited : limits: max in flight: 64 cap concurrent requests; over-limit returns 503 rate limit per minute: 60 per gateway key or per client when unauthenticated ; over-limit returns 429 These are best-effort, single-process guards — pair them with provider-side budgets and, for multi-replica deployments, an edge rate limiter. A request to model: "openfusion" is fanned out to a panel of models in parallel each optionally doing its own web research , then a judge model reads every answer and synthesizes one — streamed back over SSE, with the structured analysis and cost alongside. php flowchart LR C "Client