{"id":51230805,"url":"https://github.com/paperclipinc/chorus","last_synced_at":"2026-06-28T16:01:21.768Z","repository":{"id":365757981,"uuid":"1273197195","full_name":"paperclipinc/chorus","owner":"paperclipinc","description":"OpenAI-compatible Mixture-of-Agents fusion gateway in Rust: fan one request out to a panel of models, then synthesize one hardened answer. Self-hostable, backend-agnostic, exposed as a single model alias.","archived":false,"fork":false,"pushed_at":"2026-06-18T19:24:32.000Z","size":84,"stargazers_count":0,"open_issues_count":10,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T19:26:51.575Z","etag":null,"topics":["ai-gateway","inference","llm","mixture-of-agents","moa","openai-compatible","rust","self-hosted"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paperclipinc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-18T09:44:01.000Z","updated_at":"2026-06-18T19:24:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/paperclipinc/chorus","commit_stats":null,"previous_names":["paperclipinc/chorus"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/paperclipinc/chorus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperclipinc%2Fchorus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperclipinc%2Fchorus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperclipinc%2Fchorus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperclipinc%2Fchorus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paperclipinc","download_url":"https://codeload.github.com/paperclipinc/chorus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paperclipinc%2Fchorus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34894560,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-gateway","inference","llm","mixture-of-agents","moa","openai-compatible","rust","self-hosted"],"created_at":"2026-06-28T16:01:20.791Z","updated_at":"2026-06-28T16:01:21.736Z","avatar_url":"https://github.com/paperclipinc.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003echorus\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eAn OpenAI-compatible Mixture-of-Agents fusion gateway.\u003c/b\u003e\u003cbr/\u003e\n  Fan one chat-completion request out to a panel of models, then synthesize one hardened answer. Self-hostable, backend-agnostic, exposed as a single model alias.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"docs/\"\u003eDocumentation\u003c/a\u003e .\n  \u003ca href=\"#what-is-chorus\"\u003eWhat is chorus\u003c/a\u003e .\n  \u003ca href=\"#how-it-works\"\u003eHow it works\u003c/a\u003e .\n  \u003ca href=\"#comparison\"\u003eComparison\u003c/a\u003e .\n  \u003ca href=\"ROADMAP.md\"\u003eRoadmap\u003c/a\u003e .\n  \u003ca href=\"CONTRIBUTING.md\"\u003eContributing\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003e **Status: early.** The design is committed (see [`docs/`](docs/) and [ROADMAP.md](ROADMAP.md))\n\u003e and implementation is underway. This README describes the target design; every capability\n\u003e is tracked as an issue and gated on its milestone. Following the project's no-unverified-claims\n\u003e rule, no quality or cost numbers are stated here until they are reproducible from a committed\n\u003e benchmark.\n\n## What is chorus\n\nA single model is a single point of view. Mixture-of-Agents (MoA) asks several models the\nsame question in parallel and synthesizes their answers into one, which can beat any single\nmember on hard tasks. The published research supports this when it is done carefully, and it\nalso documents exactly how it goes wrong.\n\n`chorus` is a self-hostable, OpenAI-compatible gateway that does MoA well:\n\n- **OpenAI in, OpenAI out.** It speaks the chat-completions API and is registered as one\n  model alias (`fusion/\u003cprofile\u003e`), so any OpenAI-compatible client or agent uses it with\n  zero integration work.\n- **Backend-agnostic.** It talks to one OpenAI-compatible upstream and inherits that\n  upstream's auth, routing, and logging. The same binary runs against a local vLLM or Ollama,\n  a gateway like Bifrost, or a hosted API. It never talks to model providers directly.\n- **Cost-aware by default.** A router gate decides whether a query is hard enough to fuse, so\n  the expensive panel only fires when it earns its cost. Easy queries go straight to a single\n  model.\n- **Hardened against the known failure modes.** The aggregator is built to resist the social\n  and herding biases that make naive MoA worse than a single model: source anonymization,\n  length normalization, mandatory critical dissent, and a cap on any single source dominating.\n\nIt is developed open-core: this repository is Apache 2.0 in full, with no commercial feature\nheld back. See [docs/open-core.md](docs/open-core.md).\n\n## How it works\n\n```\nclient ──(model: fusion/research)──▶ chorus\n                                        │\n                                    router gate\n                                    /          \\\n                              easy: 1 model   hard: panel fan-out\n                                    \\          /   judge (structured analysis)\n                                     \\        /    synthesis (one hardened answer)\n                                      ▼      ▼\n                                   OpenAI-compatible backend\n```\n\n1. **Router gate.** Score the query; forward easy ones to a single model, fuse the hard ones.\n2. **Panel.** Fan out to a curated panel of comparable-strength models in parallel, tolerating\n   partial failure down to a quorum. A self-MoA mode samples one strong model N times when one\n   model clearly dominates.\n3. **Judge.** A structured analysis over the anonymized, length-normalized answers: consensus,\n   contradictions, unique insights, blind spots.\n4. **Synthesis.** One model writes the final answer grounded in that analysis, under a prompt\n   that mandates critical evaluation and forbids letting any single source dominate. Synthesis\n   generates a new answer; it is not a vote.\n5. **Usage.** Tokens spent across every stage are aggregated and reported, so the cost of a\n   fused answer is never hidden.\n\nThe full design, including the evidence base behind each decision, is in\n[docs/](docs/).\n\n## Quickstart\n\n\u003e The interface below is the target shape and is tracked on the roadmap. Until the first\n\u003e release lands, build from source; see [CONTRIBUTING.md](CONTRIBUTING.md).\n\nDefine a profile in `config.toml`:\n\n```toml\n[backend]\nbase_url = \"http://localhost:8000/v1\"   # any OpenAI-compatible endpoint\napi_key_env = \"CHORUS_BACKEND_KEY\"\n\n[[profiles]]\nname = \"research\"\n\n  [profiles.router]\n  policy = \"always_fuse\"\n  single_model = \"your/strong-model\"\n\n  [profiles.panel]\n  members = [\"your/model-a\", \"your/model-b\", \"your/model-c\"]\n  min_quorum = 2\n\n  [profiles.aggregator]\n  judge = \"your/strong-model\"\n  synthesizer = \"your/other-strong-model\"\n  anonymize_sources = true\n```\n\nCall it like any model:\n\n```bash\ncurl http://localhost:8080/v1/chat/completions \\\n  -H \"Authorization: Bearer $CHORUS_KEY\" \\\n  -d '{\"model\": \"fusion/research\", \"messages\": [{\"role\": \"user\", \"content\": \"...\"}]}'\n```\n\n## Comparison\n\n- **vs a single model.** chorus trades latency and tokens for quality on hard queries, and the\n  router gate keeps that cost off easy queries. A single model is cheaper and faster when the\n  question is easy, which is exactly when the router forwards to it.\n- **vs OpenRouter Fusion.** Same panel/judge/synthesis idea, but self-hostable, backend-agnostic,\n  and open source, so it runs entirely on your own infrastructure with no third-party data path.\n- **vs the original Together MoA.** chorus is a maintained, production-shaped service (OpenAI\n  surface, router gate, partial-failure quorum, streaming synthesis, usage accounting, aggregator\n  hardening) rather than reference scripts, and it defaults to a single layer because deeper\n  layers multiply cost and propagate a bad proposer's influence.\n- **vs routing-only (e.g. RouteLLM).** Routing picks one model; chorus routes AND fuses. The\n  router gate is the cost front door; fusion is what beats the single best model on the hard tail.\n\n## Contributing\n\nContributions are welcome under the [DCO](CONTRIBUTING.md) (no CLA). The roadmap is the\npriority order; start near the top. No em or en dashes anywhere; see the coding conventions\nin [CLAUDE.md](CLAUDE.md).\n\n## License\n\nApache 2.0. See [LICENSE](LICENSE). The \"chorus\" name and marks are reserved; see\n[TRADEMARKS.md](TRADEMARKS.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaperclipinc%2Fchorus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaperclipinc%2Fchorus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaperclipinc%2Fchorus/lists"}