コンテンツにスキップ

skill_router

ユーザー(またはピア agent)の発話を、適切な Skill・agent・直接返答へルーティングします。reyn chat が毎ターン使用します。

Phase

router は 2 Phase のワークフローとして動作します:

  1. classify — インテント(chitchat / memory_recall / stable_knowledge / clarification / task / fresh_lookup)を判定し、routing_decision で終了するか match へ引き渡します。
  2. matchtask および fresh_lookup インテントに対し、特定の Skill(またはピア agent)へディスパッチするか、web_research へ遷移します。

classify Phase はメモリ書き込みも担当します。毎ターン新しい発話を検査し、ユーザー/フィードバック/プロジェクト/参照情報を永続化するために file/write op を発行することがあります。メモリの読み込みは ChatSession が事前にマージします(concepts/memory を参照)。

エントリー artifact: chat_routing_request

ChatSession が毎ターン構築します。主なフィールド:

フィールド 出所 説明
user_message inbox payload ルーティング対象の最新発話
chat_id session agent 自身の名前(classify がメモリパス構築時に使用)
history_path session history.jsonl へのパス。classify preprocessor がスライスします
compaction config ヒストリースライスの head/tail サイズ
available_skills session プロジェクト + stdlib カタログ(router/compactor を除外。FP-0011 で skill_narrator を削除)。profile.allowed_skills が設定されている場合はフィルタリング済み
available_agents registry Topology ルールで到達可能な他の agent — [{name, role}, ...]
memory_index session 共有 + agent レイヤーをマージ済み({status, content})。content(shared)(agent: <name>) セクションを含む Markdown

最終出力: routing_decision

フィールド 役割
reply_text string(任意) ユーザーに直接表示するテキスト — 中間通知または最終回答
skills_to_run array(任意) 今ターン実行するプロジェクト / stdlib Skill
messages_to_agents array(任意) ピア agent へのデリゲーション — [{to, request}, ...]

ChatSession は空でない配列をそれぞれディスパッチします。reply_text はユーザー起点のチェーンでは即座にユーザーへ届きます。agent 起点のチェーン(ピア agent がこのリクエストを受信した場合)では、messages_to_agents が空でないとき router の reply_text は全デリゲートが応答するまで保留される deferred reply に入ります。

Skill 選択ガイダンス

match Phase が優先する選択:

  • 特定の Skillrouting.examples.positive が明確に一致する場合。明確に定義されたタスクに適しています。
  • agent デリゲーションavailable_agents にリクエストに合う role を持つピアがいる場合。
  • 直接返答 — どちらにも当てはまらずリクエストが小さい場合(または confidence < 0.6 で clarification が発火する場合)。

同じ decision で Skill と agent の両方を選ぶことはできません — どちらか一方のブランチを選択してください。

ソース

src/reyn/chat/session.py — 通常の skill ディレクトリではなく、組み込みシステム skill として実装されています

関連情報