Rebuild Fable 5's deep-research fan-out on your own keys (OrcaRouter)
Fan a research prompt out to a panel of models you choose, then fuse or judge the answers with an arbiter, in a routing DSL you version and control.
Run this workflow
CI-verified, 2/2 fixtures passing.
Build this with your agent
One copy-paste hands Claude Code, Codex, or Cursor the full recipe, steps included, nothing to fetch.
Intended Use
Anyone rebuilding a multi-model deep-research panel after losing a single model. CI runs OrcaRouter's DSL lint: routing.yaml parses, version is 1, the deep_research rule carries a parallel panel and an arbiter whose strategy is one of OrcaRouter's allowed values (best_of_n, synthesize, majority, first, tests_pass), and a default exists. No keys, no model calls. The actual deliberation is fenced.
Not for
- Treating a panel as equal to Fable 5, on research it lands close, not equal; and it is not free, every parallel leg bills as its own call
- Coding, where a synthesizer is the wrong judge (see the tests_pass recipe instead)
The Stack
Tested Against
docs.orcarouter.ai/routing/routing-dsl (2026-06)ruby@3.x (YAML stdlib)Side effects & data flow
- Network
- none, local only
- Writes
- ./routing.yaml
- Credentials
- none required
Prerequisites
- An OrcaRouter account (hosted DSL, BYOK)
- Provider API keys to actually run the panel
Steps
- 1
Author the fan-out routing rule and lint it
Pick the panel, pick the arbiter (synthesize to fuse, best_of_n to return the single best verbatim). Write routing.yaml with a deep_research rule that fans out to a parallel panel and resolves it with an arbiter. CI runs the DSL lint and checks the panel, a valid arbiter strategy, version 1, and a default; the panel and judge only run with your keys, so that step is fenced.
cat > routing.yaml <<'YAML' version: 1 rules: - id: deep_research when: task_class == "rag" || reasoning_cue_count > 2 use: parallel: - { model: "anthropic/claude-opus-4.8" } - { model: "openai/gpt-4o" } - { model: "google/gemini-3.1-pro-preview" } arbiter: strategy: synthesize model: "anthropic/claude-opus-4.8" template: best_answer_v1 max_latency_ms: 120000 default: delegate: balanced YAML ruby -ryaml -e ' c = YAML.safe_load(File.read("routing.yaml")) abort "BAD: version must be 1" unless c["version"] == 1 abort "BAD: no default" unless c["default"] rule = (c["rules"] || []).find { |r| r["id"] == "deep_research" } abort "BAD: no deep_research rule" unless rule use = rule["use"] || {} panel = use["parallel"] abort "BAD: deep_research has no parallel panel" unless panel.is_a?(Array) && panel.length >= 2 allowed = ["best_of_n", "synthesize", "majority", "first", "tests_pass"] arb = use["arbiter"] || {} abort "BAD: arbiter strategy not allowed" unless allowed.include?(arb["strategy"]) puts "config OK: deep_research fans out to a " + panel.length.to_s + "-model panel with arbiter strategy " + arb["strategy"] + ", version 1, default present" ' - 2
Run it on your keys (the model step, not checked by CI)
Point your OpenAI-compatible client at OrcaRouter; the deep_research rule fans out and the arbiter fuses or picks. Every leg bills at provider cost, so use it where being wrong is expensive. The deliberation is fenced.
Eval, 2 fixtures
Last passed: verified todayfanout-okcontainstimeout 30s · max $0Expected:
config OK: deep_research fans out to a 3-model panel with arbiter strategy synthesize, version 1, default presentclean-exitexit_codetimeout 30s · max $0Expected:
0
Results
The legitimate replacement for a hosted fusion plugin's research mode: a panel you pick plus an arbiter, billed at provider cost, versioned in your repo. OrcaRouter's own benchmark put a panel within ~1% of Fable 5 on research at roughly half the cost, self-reported and research-only.
Did this work for you?
Our CI checks the setup runs. You tell us if the whole thing worked. Tell us straight.
Liked this workflow?
Get new verified workflows in WebAfterAI, three issues a week (Tue, Thu, Sat).