QuorumRouter is a Open source Deno framework with two distinct multi-model paths. Best Route fans prompts out to independent model adapters, validates every response with Zod, requires quorum, and synthesizes the strongest answer. Agent Chat gives different models shared conversation context so they can challenge, revise, and converge across visible turns. Any repository mutation still requires external SafeLoop authority, exact-digest approval, watched execution, and verified artifacts.
No reviews yetBe the first to leave a review for QuorumRouter
Maker
📌
Hey Product Hunt 👋
I built QuorumRouter because multi-model AI systems often blur two fundamentally different ideas:
1. asking several models independently and selecting the best answer;
2. letting different models actually talk, disagree, revise, and converge.
QuorumRouter keeps those paths separate.
Best Route runs model candidates in isolated contexts, validates every response, requires quorum, compares the results, and synthesizes the strongest final answer.
Agent Chat invokes two distinct working provider/model wrappers and passes bounded conversation context between them. The CLI displays every model identity, reply target, and response as it arrives—so you can see one model challenge another, cause a revision, and move toward a conclusion.
If fewer than two working model identities can be established, Agent Chat fails closed rather than pretending a single-model response is a conversation.
Here is the real CLI path:
npx --yes github:sakamoto-sann/quorum-router#main my-quorum-router
cd my-quorum-router
deno task intake
deno task models:list
RUN_EXTERNAL_MODEL_DOGFOOD=1 \
RUN_EXPERIMENTAL_AGENT_CHAT=1 \
QUORUM_ROUTER_AGENT_CHAT_MAX_TURNS=6 \
deno task agent-chat \
--prompt "Debate the safest migration plan"
I verified the live path with a four-turn conversation between:
OpenAI/codex-cli ↔️ Cognition/devin-cli
Each turn preserved model identity and replying to lineage, passed schema validation and redaction checks, and was recorded in out/agent-chat-trace.json.
When a conversation produces an action with side effects, the models still do not receive execution authority. The exact proposal goes to SafeLoop, which handles policy checks, digest-bound approval, watched execution, artifact verification, and audit receipts. If approval or verification fails, the workflow stops.
The launch videos are deterministic visualizations rather than recordings of live model API traffic. The live wrapper-backed Agent Chat command is implemented separately and available from the source-backed scaffold.
MIT-licensed open source. Commercial and production use are permitted.
I’d especially appreciate feedback on:
- whether Best Route and Agent Chat feel clearly differentiated;
- which provider combinations you want next;
- what kinds of agent actions should always fail closed;
- how you would use visible cross-model debate in your own workflow.
Thanks for checking it out—I’ll be here answering questions throughout the launch! 🚀
Report
the "return conflicting digests for manual review instead of auto-picking a winner" choice is the right instinct - a system that quietly resolves disagreement is more dangerous than one that admits it can't decide. one thing I'd want over time: if the same adapter is consistently the one whose digest doesn't match quorum on certain task types (not randomly, but a pattern), does QuorumRouter surface that as a signal that one provider is systematically weak there, or does every disagreement look like an isolated one-off unless you're tracking it yourself?
Report
Maker
@galdayan Good point. Today, each disagreement is preserved in the trace, but we don’t yet aggregate patterns by adapter and task type. That’s a natural next step: surfacing repeated outliers as a reliability signal without treating minority answers as automatically wrong.
Report
@sakamoto_sann that's the right framing - a per-adapter reliability signal over time is way more useful than treating each disagreement as independent noise. keep the "minority isn't automatically wrong" part though, that's the detail that stops this from just becoming majority-rules with extra steps
Report
Maker
@galdayan Exactly. Reliability should be an advisory signal, not a shortcut to weighted majority rule. Repeated outliers can trigger inspection, but the dissent must stay visible—and without ground truth, the minority shouldn’t be labeled wrong. We’ve shipped per-run Decision Reports; task-specific calibration is the next layer.
Report
@sakamoto_sann per-run Decision Reports as the layer above the aggregate signal makes sense - keeps a human or downstream process able to actually inspect why a given run got flagged rather than trusting a single reliability score blindly. curious how granular task-specific calibration ends up being, per task type or closer to per prompt pattern
Report
Maker
@galdayan We landed on a hierarchy: task type → task subtype → prompt-pattern bucket, with parent fallback when the narrower bucket is too sparse. Pattern labels are caller-defined categories, not raw prompts. It’s shipped in v0.1.13, and still advisory-only—the signal explains the run, but doesn’t silently change routing or model weights.
Report
@sakamoto_sann that makes sense, caller-defined pattern labels means the taxonomy quality is on us not the tool. what happens when a caller mislabels a pattern bucket though - does the parent fallback catch that kind of drift automatically or would a bad label just quietly sit there until someone notices the calibration looks off
Report
How does the quorum threshold get set, and can I tune how strict the validation is per model adapter?
Report
Maker
@satemireono The quorum is set with minSuccessfulAdapters. By default, QuorumRouter requires 2 valid adapter outputs, or 1 when only one adapter is configured. If adaptive routing selects a smaller eligible set, the effective threshold is capped to that set.
Zod validation is currently strict at the shared contract level: every adapter must return a valid ModelOutput, and the synthesis must match FinalSynthesis. An adapter can add stricter provider-specific validation internally, but there isn’t a declarative per-adapter “strictness” setting yet. That’s a useful addition we’re considering.
This accurately distinguishes:
- configurable quorum count; - shared schema validation; - adapter-specific custom validation; - the absence of a first-class strictness knob.
Report
How does quorum validation actually pick the strongest answer when models disagree, and is there a way to see why one response won over another?
Report
Maker
@lknurbykgesmo2 Quorum validation doesn’t simply crown the majority answer. Each response must pass the same schema, then the synthesis step compares the valid candidates. The trace shows which models responded, what passed validation, and the final selection path. We’re working on making the “why this answer won” evidence even clearer.
Report
This one is close to home, I also run multiple models against the same question in my product. The interesting case is when they genuinely disagree. Quorum works when there is a clear majority, but sometimes the minority answer turns out to be the right one. How does Best Route handle a real split, does it synthesize anyway or surface the disagreement to the caller?
Report
Maker
@henry_s_jung A real split is preserved, not quietly erased. Best Route can synthesize valid candidates, but conflicting digests remain visible in the trace; it doesn’t pretend disagreement equals certainty. For higher-risk workflows, that split can be surfaced for manual review.
Report
What happens when the models don't reach quorum — do you return an error, retry, or fall back to the strongest single answer? That edge case seems like where the fail-closed promise actually gets tested.
Report
Maker
@andrei_rebrov1 If the required quorum isn’t reached, QuorumRouter fails closed with a quorum error. It does not silently fall back to the strongest single answer. Retries only apply to bounded transport failures, not semantic disagreement or validation failure.
Report
Curious how it handles costs in Best Route when multiple models get pinged per request, any built-in controls or do we wire that up ourselves?
Report
Maker
@necdet654042 The core library supports estimated per-adapter costs and a budget manager that can block candidates before invocation. The generated Best Route demo doesn’t yet include live token billing or a CLI spending cap, so production users should provide cost estimates and bound the candidate set.
the "return conflicting digests for manual review instead of auto-picking a winner" choice is the right instinct - a system that quietly resolves disagreement is more dangerous than one that admits it can't decide. one thing I'd want over time: if the same adapter is consistently the one whose digest doesn't match quorum on certain task types (not randomly, but a pattern), does QuorumRouter surface that as a signal that one provider is systematically weak there, or does every disagreement look like an isolated one-off unless you're tracking it yourself?
@galdayan Good point. Today, each disagreement is preserved in the trace, but we don’t yet aggregate patterns by adapter and task type. That’s a natural next step: surfacing repeated outliers as a reliability signal without treating minority answers as automatically wrong.
@sakamoto_sann that's the right framing - a per-adapter reliability signal over time is way more useful than treating each disagreement as independent noise. keep the "minority isn't automatically wrong" part though, that's the detail that stops this from just becoming majority-rules with extra steps
@galdayan Exactly. Reliability should be an advisory signal, not a shortcut to weighted majority rule. Repeated outliers can trigger inspection, but the dissent must stay visible—and without ground truth, the minority shouldn’t be labeled wrong. We’ve shipped per-run Decision Reports; task-specific calibration is the next layer.
@sakamoto_sann per-run Decision Reports as the layer above the aggregate signal makes sense - keeps a human or downstream process able to actually inspect why a given run got flagged rather than trusting a single reliability score blindly. curious how granular task-specific calibration ends up being, per task type or closer to per prompt pattern
@sakamoto_sann that makes sense, caller-defined pattern labels means the taxonomy quality is on us not the tool. what happens when a caller mislabels a pattern bucket though - does the parent fallback catch that kind of drift automatically or would a bad label just quietly sit there until someone notices the calibration looks off
How does the quorum threshold get set, and can I tune how strict the validation is per model adapter?
@satemireono The quorum is set with minSuccessfulAdapters. By default, QuorumRouter requires 2 valid adapter outputs, or 1 when only one adapter is configured. If adaptive routing selects a smaller eligible set, the effective threshold is capped to that set.
Zod validation is currently strict at the shared contract level: every adapter must return a valid ModelOutput, and the synthesis must match FinalSynthesis. An adapter can add stricter provider-specific validation internally, but there isn’t a declarative per-adapter “strictness” setting yet. That’s a useful addition we’re considering.
This accurately distinguishes:
- configurable quorum count;
- shared schema validation;
- adapter-specific custom validation;
- the absence of a first-class strictness knob.
How does quorum validation actually pick the strongest answer when models disagree, and is there a way to see why one response won over another?
@lknurbykgesmo2 Quorum validation doesn’t simply crown the majority answer. Each response must pass the same schema, then the synthesis step compares the valid candidates. The trace shows which models responded, what passed validation, and the final selection path. We’re working on making the “why this answer won” evidence even clearer.
This one is close to home, I also run multiple models against the same question in my product. The interesting case is when they genuinely disagree. Quorum works when there is a clear majority, but sometimes the minority answer turns out to be the right one. How does Best Route handle a real split, does it synthesize anyway or surface the disagreement to the caller?
@henry_s_jung A real split is preserved, not quietly erased. Best Route can synthesize valid candidates, but conflicting digests remain visible in the trace; it doesn’t pretend disagreement equals certainty. For higher-risk workflows, that split can be surfaced for manual review.
What happens when the models don't reach quorum — do you return an error, retry, or fall back to the strongest single answer? That edge case seems like where the fail-closed promise actually gets tested.
@andrei_rebrov1 If the required quorum isn’t reached, QuorumRouter fails closed with a quorum error. It does not silently fall back to the strongest single answer. Retries only apply to bounded transport failures, not semantic disagreement or validation failure.
Curious how it handles costs in Best Route when multiple models get pinged per request, any built-in controls or do we wire that up ourselves?
@necdet654042 The core library supports estimated per-adapter costs and a budget manager that can block candidates before invocation. The generated Best Route demo doesn’t yet include live token billing or a CLI spending cap, so production users should provide cost estimates and bound the candidate set.