Routing DSL: buat panel model yang berpikir seperti Fable 5
Selama dua tahun, buku pedoman untuk "lebih cerdas" telah "menunggu model berikutnya." Kami pikir itu adalah unit kemajuan yang salah. Perbatasan bukanlah satu titik pemeriksaan — itu adalah panel.
Itu Routing DSL adalah cara Anda membangun panel itu. Ini adalah strategi routing yang dapat diprogram — YAML + CEL — yang mengubah endpoint OrcaRouter Anda menjadi grafik inferensi: rute berdasarkan kesulitan, rute berdasarkan tugas, sebarkan ke beberapa model sekaligus, nilai atau beri suara pada output mereka, mundur saat kepercayaan rendah, dan sesuaikan semuanya untuk biaya, latensi, atau kualitas. Anda menulis aturan; gateway mengompilasi dan menjalankannya pada setiap permintaan dalam ~5 ms.
Postingan ini adalah tur teknik: tata bahasa, variabel yang dapat Anda cabangkan, keempat arbiter, kaskade, dan kumpulan aturan produksi lengkap di bagian akhir.
Hasil pertama
Dua tolok ukur ilustratif. (Angka-angka bersifat ilustratif — angka-angka tersebut dimaksudkan untuk menunjukkan bentuk dari efek, bukan untuk dikutip sebagai skor resmi.)
Perbandingan Frontier — titik akhir DSL dengan rute kesulitan vs. frontier solo:

panel Fusion vs. model solo — mencetak skor pada 93 dari 100 tugas (dari OpenRouter):

Tiga hal yang layak ditatap:
Setiap panel fusi mengalahkan setiap anggotanya sendiri. Opus 4.8 + GPT-5.5 (~67.5%) mengalahkan keduanya, Opus solo (~58.5%) dan GPT-5.5 solo (~60%), dengan selisih 7–9 poin. Ketidaksepakatan adalah sinyal; arbitrase memanennya.
Fusion mencapai tingkat berikutnya. Tiga panel berbeda menyilang Fable 5 solo (~65.5%) hanya menggunakan model di bawahnya.
Anda tidak perlu anggota yang mahal. Opus + Opus self-fusion (~65.5%) sepadan dengan Fable 5 dengan satu model dan satu sampler. Sebuah panel murah model — Gemini 3 Flash + Kimi K2.6 + DeepSeek V4 Pro (~64.5%) — berada sedikit di bawah Fable 5 dengan biaya per-token yang jauh lebih murah. Itulah inti tesisnya: beli kecerdasan dengan topologi, bukan dengan tingkat harga berikutnya.
Routing DSL adalah permukaan kontrol yang memungkinkan Anda menggunakan topologi itu hanya di tempat yang menguntungkan — model murah pada 80% yang mudah, panel fusi pada hard tail.
Tata bahasa dalam 30 detik
Aturan adalah versi, daftar aturan, dan default yang diperlukan. Aturan dievaluasidari atas ke bawah; saat when: yang benar pertama menang. Tidak ada when berarti "selalu cocok."
versi: 1
rules:
- id: only_rule
use: { model: "claude-sonnet-4-6" }
default:
delegate: balancedwhen: adalah CEL ekspresi boolean — terisolasi, regex hanya RE2, tanpa loop, tanpa I/O, evaluasi mikrodetik, dengan batas waktu tunggal 5 ms yang dibagi di seluruh aturan. use: adalah efek: ke mana permintaan pergi dan bagaimana itu diatur. Batasan sengaja dibuat kecil (≤30 aturan, ≤16 KiB sumber, ≤200 karakter per when:) sehingga aturan tetap dapat diaudit.
Primitif 1 — rute berdasarkan tingkat kesulitan dan tugas
Distributor mengklasifikasikan setiap permintaan sebelum merutekan dan mengekspos fitur-fitur tersebut ke CEL. Anda melakukan percabangan langsung pada fitur-fitur tersebut:
versi: 1
rules:
- id: hard_reasoning
when: difficulty > 0.8
use:
model: "claude-opus-4-8"
reasoning_effort: "high"
thinking_budget_tokens: 32000
- id: code_path
when: task_class == "code" && code_keyword_density > 0.5
use: { model: "gpt-5.5" }
- id: cheap_chat
when: difficulty < 0.3
use: { model: "gemini-3-flash" }
default:
delegate: balancedVariabel yang dapat Anda baca di when: (disingkat — lihat referensi lengkap di dokumentasi):
GroupExamples
Bentuk permintaan
request.input_tokens, request.output_max_tokens, request.stream, request.vision, request.message_count, request.has_toolsKlasifikasi
task_class (chat/code/agent/vision/audio/rag/creative), difficulty (0.0–1.0), code_keyword_density, reasoning_cue_count, log_prompt_tokens, tool_countSesi
agent_state.turn, agent_state.tools_used, agent_state.has_edited, agent_state.last_test_failed, agent_state.consecutive_errors, agent_state.models_triedKonteks
headers["x-…"], user.group, token.name, time.hour, workspace.id
…plus six macros for the things regex-over-payload is good at: system_prompt_matches(re), user_message_matches(re), tool_definitions_include(name), tool_calls_present_any([…]), tool_results_from_any([…]), header_matches(name, re).Setiap tujuan dapat membawa kenop per panggilan, diterjemahkan ke parameter asli masing-masing penyedia oleh adaptor relai: reasoning_effort (rendah/sedang/tinggi), thinking_budget_tokens (1024–64000), samples (1–16), temperature (0.0–2.0), ditambah param_override / header_override yang dilindungi denylist. Itu sudah cukup untuk membangun endpoint yang dirutekan berdasarkan tingkat kesulitan dari Tabel A: model murah pada bagian mudah, Opus dengan anggaran berpikir pada bagian sulit.
Primitif 2 — menyebar ke panel (fusi)
Ini adalah dari mana peningkatan benchmark berasal. Sebuah paralel: efek mengirimkan permintaan ke 2–5 cabang secara bersamaan, lalu sebuah arbiter memutuskan apa yang sebenarnya dilihat klien:
- id: hard_tail_panel
when: difficulty > 0.7 && task_class == "agent"
use:
parallel:
- { model: "anthropic/claude-opus-4-8", reasoning_effort: "high" }
- { model: "openai/gpt-5.5", thinking_budget_tokens: 16000 }
- { model: "google/gemini-3.1-pro", temperature: 0.3 }
arbiter:
strategy: best_of_n
model: "anthropic/claude-sonnet-4-6" # the judge
template: judge_code
max_latency_ms: 120000
on_disagreement: # majority-only escape hatch
model: "anthropic/claude-opus-4-8"
reasoning_effort: "high"Empat strategi arbiter, masing-masing jawaban berbeda untuk 'keluaran siapa yang menang?':
pertama — lomba kaki, sajikan kesuksesan pertama, batalkan yang kalah. Mengoptimalkan latensi (anda mendapatkan yang tercepat dari N).
mayoritas — suara terstruktur di seluruh keluaran cabang, tanpa panggilan model tambahan. Ketika cabang-cabang terpecah tanpa mayoritas yang ketat, cabang opsional on_disagreement: mengirim ulang upaya baru yang lebih kuat, bukan melayani tie-break. Mengoptimalkan ketahanan pada tugas dengan jawaban kanonik.
best_of_n — sebuah hakim LLM membaca semua kandidat dan memberi peringkat. Ini adalah konfigurasi Opus + GPT-5.5 → judge dari Tabel B. Mengoptimalkan kualitas pada pekerjaan terbuka; kembali ke yang pertama berhasil jika hakim mengalami kesalahan.
tests_pass — berbasis eksekusi: layani kandidat yang patchnya benar-benar membuat rangkaian pengujian lolos. Tidak ada tebakan juri — kerangka kerja yang memutuskan. Ini adalah arbiter terkuat untuk kerja kode/agen. Verifikator berada di luar gateway (terhubung melalui VerifierProvider); tanpa yang terhubung, ia menurun ke first-successful.
max_latency_ms (1000–600000, default 120000) membatasi fan-out sehingga satu leg yang lambat tidak dapat menghentikan respons — yang lambat akan dijatuhkan. Menyusun parallel di dalam parallel ditolak saat lint; panel tersebut sengaja hanya satu tingkat.
Catatan ketersediaan: runtime fan-out N-way dibatasi di belakang flag server ROUTING_DSL_ENSEMBLE_RUNTIME sedangkan penagihan per-leg diperkuat di staging — itulah sebabnya fusion adalah preview, bukan GA. Dengan flag off, aturan parallel: dengan bersih melayani leg pertamanya, sehingga Anda dapat membuat dan membayangi panel Anda hari ini dan mengaktifkannya saat fusion tiba di wilayah Anda.
Primitive 3 — pengganti dan kaskade kepercayaan
Fan-out mengeluarkan biaya N× di muka. Sebuah cascade mengeluarkan biaya tambahan hanya ketika jawaban pertama terlihat salah. Setelah respons, on_low_confidence: mengevaluasi sinyal dan, jika ada yang terpicu, mengirim ulang ke tujuan yang lebih kuat:
- id: agent_with_safety_net
when: task_class == "agent"
use:
pool: "@pool:fast"
on_low_confidence:
signals: [patch_invalid, self_doubt, next_turn_test_failed]
threshold: { low_logprob: -1.5 }
use:
model: "claude-opus-4-8"
reasoning_effort: "high"Sinyal-sinyal: patch_invalid (diff gagal git apply --check), self_doubt (set regex frasa hedging), low_logprob (rata-rata logprob token di bawah ambang, di mana penyedia mengeksposnya), dan next_turn_test_failed (kait lintas-giliran — prompt giliran ini membawa bentuk tes-tes gagal giliran sebelumnya). Cascades didesain dengan kedalaman-1. Pasangkan dengan agent_state.models_tried untuk mendapatkan keragaman pada percobaan ulang — jangan pernah kirim perbaikan ke model yang baru saja gagal.
Menyetel dial: biaya, latensi, kualitas
DSL yang sama menyatakan ketiga tujuan; Anda memilih per aturan:
Biaya — delegasi: yang paling murah, pertahankan model murah pada ekor yang mudah, dan cadangkan fan-out untuk difficulty > 0.7. Panel murah Tabel B (~64.5% ≈ Fable 5 solo) adalah bukti keberadaan: penggabungan model kecil dapat menggantikan model frontier dengan biaya per-token yang lebih kecil. Tapi perlu disadari, — fusi menggunakan "tagih setiap kaki" model: panel best_of_n 3-kaki menagih tiga kandidat ditambah juri. Ekonomi berhasil karena Anda (a) hanya fan out pada minoritas permintaan yang sulit dan (b) menggabungkan lebih murah anggota daripada model frontier yang Anda gantikan.
Latensi — arbiter: { strategy: first } ditambah dengan max_latency_ms yang ketat memberikan Anda yang tercepat dari N dengan batas maksimum yang absolut.
Kualitasbest_of_n untuk pekerjaan terbuka, tests_pass ketika ada suite yang menjadi landasan. samples dan thinking_budget_tokens membeli lebih banyak dalam satu leg.
Mengoperasikannya tanpa merusak prod
Perubahan routing menakutkan, sehingga DSL hadir dengan rel pengaman yang diharapkan oleh seorang SRE:
Lint pada setiap penyimpanan — skema, pemeriksaan tipe CEL (setiap when: harus bernilai bool), resolusi referensi, rentang knob, daftar blokir header/param. Kesalahan dikembalikan sebagai {baris, kolom, pesan, aturan} dan dirender sebagai chip gutter di editor.
Uji coba — POST permintaan sintetis (task_class, difficulty, agent_state, …) dan dapatkan aturan yang cocok, efek yang diselesaikan, dan waktu evaluasi sebelum semuanya dikirim.
Mode bayangan — selama 24 jam setelah penyimpanan pertama, DSL dievaluasi tetapi tidak digunakan; log bayangan mencatat pilihan yang akan diambil dan konsol menampilkan perbedaan (persentase rute yang diubah, perkiraan delta biaya harian, jumlah pemicu per aturan).
Canary — sebuah penggeser lalu lintas 0–100. Naikkan bertahap dari 5 → 25 → 50 → 100 sambil memantau metrik per-irisan; putar balik dengan menggeser ke 0.
Audit + rollback — setiap simpan/pemulihan menulis baris audit dalam transaksi yang sama; suntingan bersamaan mendapatkan kode 409 dengan versi saat ini sehingga Anda mencoba ulang dengan status yang baru.
Kasus uji, pemutaran ulang jejak, dan tampilan AI "jelaskan kumpulan aturan ini" melengkapinya. Anda dapat menemukannya di dasbor di bawah routing → strategy → DSL.
Seperangkat aturan yang lengkap
Murah pada yang mudah, sedang pada yang sedang, panel fusi yang dinilai pada ekor agen yang keras, dengan kaskade kepercayaan di bawahnya:
versi: 1
rules:
- id: trivial
when: difficulty < 0.3 && !has_tools
use: { model: "gemini-3-flash" }
- id: standard
when: difficulty < 0.7
use:
model: "gpt-5.5"
on_low_confidence:
signals: [self_doubt, low_logprob]
use: { model: "claude-opus-4-8", reasoning_effort: "high" }
- id: hard_agent_panel
when: difficulty >= 0.7 && task_class == "agent"
use:
parallel:
- { model: "anthropic/claude-opus-4-8", reasoning_effort: "high" }
- { model: "openai/gpt-5.5", thinking_budget_tokens: 16000 }
- { model: "google/gemini-3.1-pro" }
arbiter:
strategy: tests_pass # execution-grounded; judged fallback if no harness
max_latency_ms: 180000
on_disagreement:
model: "claude-opus-4-8"
reasoning_effort: "high"
default:
delegate: balancedTitik akhir itu adalah yang berada di puncak Tabel A — bukan karena ia menemukan model yang lebih baik, tetapi karena ia menghabiskan model yang tepat pada permintaan yang tepat dan menggabungkan panel tepat di tempat panel itu menang.
Mulai menulis
Lompatan berikutnya dalam kemampuan tidak harus menunggu checkpoint berikutnya. Ini adalah grafik yang bisa Anda tulis sore ini: rute berdasarkan kesulitan, melebar di ekor yang sulit, menilai atau menguji output, mengalir ke bawah saat kepercayaan menurun.
Dokumen: https://docs.orcarouter.ai/routing/routing-dsl
UI: routing → Buat router -> Strategi routing → DSL (ahli)
Frontier adalah sebuah panel. Buatlah panel Anda sendiri.
