dsl 戦略です ——
アプリは引き続き orcarouter/{name} を呼び出し、ルーティングロジックは
ダッシュボードに置かれ、再デプロイなしにバージョン管理・編集できます。
DSL を使うべきとき
「最安のライブモデル」や「最高品質」で意図が表現できるなら組み込み戦略を 使ってください。リクエストの内容やコンテキストにルーティングが依存する 場合に DSL を使います:- タスク特化 —— コードはコーディングモデルへ、ビジョンはビジョン モデルへ、安価なチャットは安価なモデルへ送る。
- 難易度を意識したルーティング —— 難しいリクエストだけを高価なモデル へエスカレートし、簡単なものは安く保つ。
- エージェントを意識したルーティング —— セッション状態 (エージェント がどのツールを使ったか、テストが今失敗したか、何ターン目か) に基づいて 異なるルーティングを行う。
- 時間 / テナント / ヘッダのルール —— 時間帯、ユーザーグループ、または リクエストヘッダによる異なるルーティング。
有効化
ダッシュボードの Routing でルーターを開き、その Strategy を DSL に設定します。これでこのルーター用の DSL エディタが現れます。 ルーターに関するその他のすべては引き続き適用されます —— Allowed models の glob、Default model のセーフティネット、orcarouter/{name} での
呼び出しです。
エディタ
エディタは、意図から動作するルールセットへ素早く到達できるように 作られています:- テンプレート はあなたのワークスペースの実モデルでシードされます (一度きりのティアマッピングダイアログ経由)。空のファイルから始めたり 「未知のモデル」の壁にぶつかることはありません。
- Insert —— 識別子を手で打つ代わりに、オートコンプリートから
Model、Router (
orcarouter/<name>)、Pool を挿入します。 - Generate —— 欲しいルーティングを平易な言葉で記述すると、あなたの 実モデルに基づいた、コンパイル済みでリント済みの DSL が返ってきます。
- Explain —— 現在のルールセットが何をするかの平易な英語による言い換え。
- インラインリント —— すべてのエラーが
{line, column, message}を 報告し、すべてのリントコードに?の説明があります。優先順位 (first-match-wins) と一般的な CEL パターンがその場で示されます。
ファイル構造
ルールセットは 3 つのトップレベルキーを持つ YAML です:when: 条件と use: 効果です:
when: が真になる最初のルールが勝ちます。
どれもマッチしない場合は default: が適用されます。ルールは最も具体的な
ものから順に並べてください —— 早い位置にある広範なルールは、その下の
すべてを覆い隠してしまいます。
when: —— 条件
条件は CEL
(Common Expression Language) で記述します: 設計上安全です —— ループなし、
I/O なし、マイクロ秒での評価、RE2 正規表現のみ。次の 6 つのパターンが
実際のルールの大半をカバーします:
| Pattern | Example |
|---|---|
| Field access | task_class == "agent" |
| Numeric compare | difficulty > 0.6 && request.input_tokens < 50000 |
| Boolean logic | agent_state.has_edited && !agent_state.has_run_tests |
| List membership | "Edit" in agent_state.tools_used |
| Regex macro | system_prompt_matches("(?i)planning agent") |
| Tool macro | tool_calls_present_any(["Edit","Write","apply_patch"]) |
変数
リクエストの形状| Variable | Type |
|---|---|
model | string |
request.input_tokens | int |
request.output_max_tokens | int |
request.stream | bool |
request.vision | bool |
request.message_count | int |
request.has_system_prompt | bool |
request.has_tools | bool |
| Variable | Type | Meaning |
|---|---|---|
task_class | string | chat / code / agent / vision / audio / rag / creative |
difficulty | double | 0.0–1.0 |
code_keyword_density | double | 0.0–1.0 |
reasoning_cue_count | int | プロンプト内で検出された推論の手がかり数 |
tool_count | int | リクエスト上の個別のツール定義数 |
agent_state.*、会話をまたいで永続化)
| Variable | Type |
|---|---|
agent_state.turn | int |
agent_state.tools_used | list<string> |
agent_state.files_read | list<string> |
agent_state.has_edited | bool |
agent_state.has_run_tests | bool |
agent_state.last_test_failed | bool |
agent_state.consecutive_errors | int |
agent_state.elapsed_seconds | int |
agent_state.models_tried | list<string> |
| Variable | Type |
|---|---|
headers["x-foo"] | string |
user.id / user.group | int / string |
token.id / token.name | int / string |
time.hour / time.weekday | int (UTC) |
workspace.id | int |
マクロ
一般的な「リクエストの中身を見る」チェックのために登録された CEL 関数:| Macro | Returns |
|---|---|
system_prompt_matches(regex) | 結合されたシステムメッセージに対する RE2 |
user_message_matches(regex) | 最後のユーザーメッセージに対する RE2 |
tool_definitions_include(name) | あるツールがリクエスト上で宣言されている |
tool_calls_present_any(list) | リクエストがこれらのツール呼び出しのいずれかを含む |
tool_results_from_any(list) | リクエストがいずれかからの tool ロールメッセージを持つ |
header_matches(name, regex) | ヘッダ値に対する RE2 |
use: —— 効果
use: ブロックは destination (ちょうど 1 つ) と、任意の数の
オプションの呼び出し単位の knob を指定します。
Destination
delegate: dsl は拒否されます (再帰してしまうため)。特定のチャネルへの
固定 (channels: / @channel:) は現在利用できず、未対応としてリントされ
ます —— 代わりに model、models、pool でルーティングしてください。呼び出し単位の knob
任意の destination と組み合わせて上流呼び出しを形作ります:param_override と header_override はデニーリストを強制します ——
model、messages、stream、tools、認証ヘッダなどはオーバーライド
できません (それらは課金、監査、エージェント状態を覆してしまうため)。
信頼度カスケード & アンサンブル (高度)
2 つの高度な効果により、ルールが弱い最初の回答に反応したり、複数の モデルにファンアウトしたりできます。他のどのルールとも同じように記述 します。 カスケード —— 低信頼度シグナルでより強力な効果へリトライします:アンサンブル / カスケードのランタイムはゲートされており、既定では
オフです。 各並列レッグと各カスケード修復はそれぞれ独立した呼び出しと
して課金されるため、レッグ単位の課金が検証されるまで、ファンアウト
ランタイムはサーバーフラグの背後にあります。オフの状態では、
parallel:
ルールは最初のレッグのみを提供し、カスケードはシグナルを記録するものの
再ディスパッチはしません —— ルールセットは引き続き通常どおりリント・
保存され、その主効果をルーティングします。ワークスペースでアンサンブル
ランタイムを有効化するにはお問い合わせください。安全にロールアウトする
新しいルールセットは、保存した瞬間にトラフィックを引き継ぐわけでは ありません:- シャドウモード —— 最初の保存後の一定期間、DSL は評価されますが
使われません: 以前の戦略が引き続きトラフィックを処理し、その間に
ゲートウェイは DSL が行ったであろうことを記録します。ダッシュボードは
差分レポートを表示します —— ルートが異なる割合、予測されるコスト差分、
ルール別の発火回数、
default:に落ちた頻度です。ルールを信頼する前に これを読んでください。 - カナリア —— DSL をライブトラフィックの一定割合 (5 → 25 → 50 → 100) に段階投入し、スライス別メトリクスを監視しながら、 割合を 0 にスライドすることで即座にロールバックできます。
制限と検証
すべての保存で厳格なリントが実行され、無効なルールセットは{line, column, message, rule} とともに拒否されます:
- スキーマ —— 必須キー、正しい型/列挙、未知のフィールドなし。
- サイズ —— ルール ≤ 30、YAML ≤ 16 KiB、
when:1 つあたり ≤ 200 文字。 - CEL —— パースされ、変数環境に対して型チェックされ、未知の識別子が
なく、
when:は bool に評価される必要があります。 - 効果 ——
use:ブロックごとにちょうど 1 つの destination; すべてのmodel/models/@pool:参照がワークスペース内で解決できること。 - knob の範囲 ——
thinking_budget_tokens ∈ [1024, 64000]、temperature ∈ [0, 2]、samples ∈ [1, 16]。 - 予約 ——
_で始まるルール id は予約済み; ルール id としてのdefaultは拒否されます (トップレベルのdefault:ブロックを使用)。
完全な例
X-Orca-Router と
X-Orca-Resolved-Model のレスポンスヘッダ
を読みます。
API リファレンス
DSL はルーター単位で管理されます; 書き込みには Developer+ が必要です。| Method & path | Role | Purpose |
|---|---|---|
GET /api/user/routers/:id/dsl | Member | ソース + バージョン + シャドウ/カナリア状態。 |
PUT /api/user/routers/:id/dsl | Developer+ | リント + 保存 (新バージョン、監査対象)。 |
POST /api/user/routers/:id/dsl/lint | Member | ドラフトをリント → {errors:[…]}。 |
POST /api/user/routers/dsl/lint | Member | ステートレスなリント (ルーター id なし)。 |
POST /api/user/routers/:id/dsl/dryrun | Member | 合成リクエストを評価 → トレース + マッチしたルール。 |
GET /api/user/routers/:id/dsl/history | Member | バージョン履歴、新しい順。 |
POST /api/user/routers/:id/dsl/rollback/:version | Developer+ | 再リントして古いバージョンを復元。 |
FAQ
名前付きルーターの戦略とどう違いますか?
名前付きルーターの戦略とどう違いますか?
これは戦略です —— cheapest / quality / balanced / adaptive と並ぶ
dsl オプションです。他の戦略は価格と品質で選びますが、DSL は
リクエストの形状、分類、エージェント状態に対してあなたが書いた
ルールで選びます。ルールの効果として、またはデフォルトとして、
引き続き組み込み戦略へ delegate: できます。どのルールもマッチしない場合はどうなりますか?
どのルールもマッチしない場合はどうなりますか?
トップレベルの
default: 効果が適用されます。これは必須なので、
常に定義された結果があります —— 一般的には delegate: balanced か
特定のセーフティネットモデルです。ホットパスで信頼できない CEL を実行しても安全ですか?
ホットパスで信頼できない CEL を実行しても安全ですか?
はい。CEL は標準ライブラリ関数のみのサンドボックス、数ミリ秒の評価
デッドライン、RE2 正規表現 (線形時間、ReDoS なし)、データベース・
ネットワーク・ファイルシステムへのアクセスなし、で実行されます。
変数環境はスカラとリストの固定セットです。
実トラフィックに触れる前にルールセットをテストできますか?
実トラフィックに触れる前にルールセットをテストできますか?
3 つの方法があります: エディタ内で合成リクエストに対して dry-run
する、シャドウモードのままにして差分レポートを読む、その後
100% へ段階投入する前にライブトラフィックの小さな割合へ カナリア
する、です。
