type = "advisor" では、1 つの実行モデル(executor)がクライアントに見えるすべての
ターンを提供します。より強力なアドバイザー(advisor)が、実行モデルの締めくくりのターン
— 作業前に示す計画、または作業を終えたという主張 — をクライアントが見る前にレビューします。
APPROVE は留め置いたターンを送り出し、REDO はそのターンを捨てて、アドバイザーの計画とともに
実行モデルを作業に差し戻します。アドバイザーがターンを提供することはないので、クライアントが
目にするのは実行モデルの出力だけです。
設定する
[[models]]
id = "claude-reviewed"
[models.router]
type = "advisor"
executor_target = "claude-sonnet-4-6"
advisor_target = "claude-opus-4-8"
gate_trigger = "no_tool_call"
max_reviews = 1
# gate_stall_turns = 0
# gate_min_tool_results = 0
# advisor_max_tokens = 2048
# transcript_max_chars = 200000
# fail_open = trueレビューを起こす条件:
gate_trigger = "no_tool_call"(既定値)は、実行モデルがツール呼び出しなしで終えた最初の ターンをレビューします。gate_min_tool_resultsを設定すると、会話にその数の tool result が たまってはじめて、そうしたターンがレビュー対象になります。gate_trigger = "pattern"は代わりにgate_trigger_patternで発火します。これは アンカーなしで検索する正規表現です。gate_stall_turnsは、会話にその数のアシスタントターンがたまると、作業途中の チェックポイントとしてさらに 1 ターンをレビューします。0で無効です。
max_reviews はセッションごとのレビュー数の上限です。x-claude-code-session-id のない
リクエストはそれ自体を 1 つのセッションとして数えるため、セッションのない呼び出し元どうしで
予算を共有することはありません。アドバイザーは transcript_max_chars まで中央を削った
トランスクリプトを見ます。reviewer_system_prompt と redo_feedback_prefix は、パッケージの
APPROVE/REDO レビュアープロンプトと、実行モデルに差し戻す REDO 計画の前に置く文言を
置き換えます。
6 つの呼び出しごとの上限は
[models.router] に置きます。3 つの gated_* の上限が、留め置く実行モデルのターンに上限を
課します。
どのターンを留め置くか
ターンが gate_trigger に該当するかどうかは、ターンが完成してはじめてわかります。そのため、
セッションにレビューの予算が残っているあいだは実行モデルのすべてのターンを留め置き、
ゲートに該当しなかったターンはレビューなしで提供します。max_reviews を使い切るか、その
セッションでレビューモデルの呼び出しが 3 回失敗すると(失敗した呼び出しはレビューを払い
戻します)、そのセッションの残りのターンはバッファリングなしでライブにストリーミングされます。
留め置いたターンをどう提供するか、それに何のコストがかかるかは
留め置くターンで説明します。留め置くターンでは、最初の
バイトがターン全体の完了後に届きます。
REDO
留め置いたターンは、応答ヘッダーがひとつもクライアントに届く前に捨てます。捨てたターンと アドバイザーの計画を会話に追加し、実行モデルを再実行します。この再実行はライブで ストリーミングされます。
レビューが失敗したとき
fail_open = true(既定値)では、レビューが失敗すると留め置いたターンを提供します。
fail_open = false なら代わりにリクエストを 502 で失敗させます — セッションが
max_judge_calls を使い切ったためレビューを送らなかった場合も同様です。どちらの場合も、
失敗したレビューはやはりその結果(例:upstream_error、timeout)として数え、
max_judge_calls が拒否したレビューは budget_exhausted として数えます。
gated_* の上限を超えたか、終端マーカーの前に終わった留め置くターンは、ヘッダーを送る前に
捨て、リクエストは Anthropic エラー形式のゲートウェイ所有の 502 で失敗します。REDO でも
フェイルオーバーの試行でもありません — アップストリームはすでに 2xx で応答しています。
すべての失敗のケースは
設定リファレンスに
まとめてあります。
資格情報とプローブ
advisor_target と違い、executor_target は passthrough ルートでも構いません。実行
モデルのターンはクライアント自身の応答なので呼び出し元の資格情報を運びますが、レビューは
ジャッジ呼び出しなので、それをひとつも運ばないからです。
ジャッジ呼び出しを参照してください。
count_tokens プローブはレビューも留め置く呼び出しも行わず、常に executor_target で
応答します。
クライアントから見えるもの
x-gateway-route-source |
意味 |
|---|---|
advisor_approve |
実行モデルのターンをレビューして承認し、それを再生しました |
advisor_pass |
実行モデルのターンをレビューなしで提供しました — ゲートに該当しなかったか、レビューを予約できませんでした |
advisor_fail_open |
完成した実行モデルのターンのあとでレビューが失敗したため、そのターンを提供しました |
advisor_redo |
レビュアーが REDO と答えました。これは実行モデルのライブの再実行です |
advisor_exhausted |
レビューの予算を使い切ったか、レビューモデルの呼び出しが 3 回失敗したため、実行モデルがバッファリングなしでストリーミングします |
gated_error |
留め置いたターンを提供できませんでした |
レビューは shunt.router.judge_calls{algorithm="advisor"} で数え、GET /routes は
advisor_target を judges に並べます。すべてのキーは
設定リファレンスにあります。