メインコンテンツまでスキップ

パイプラインステージ

生成はユーザー入力からメッセージの保存までの 14 の固定ステージを通過し、すべてのプラグインフックは優先度、タイムアウト、キャンセル、権限、エラー分離について同じルールに従います。

ステージの順序

順序は固定されており、すべての生成で同一です:

User input
→ Macros
→ Character/persona data
→ Lorebook
→ Memory/RAG
→ Token counting
→ Context shifting
→ Plugin interceptors
→ Instruct format rendering
→ Provider serialization
→ Request
→ Streaming response
→ Post-processing hooks
→ Save message

ステージごとの説明

  1. ユーザー入力 — 下書きメッセージと、このリクエストの生成オプションが取得されます。
  2. マクロ{{user}}{{char}}、カスタム変数が replaceMacros で解決されます。未知のマクロはそのまま残されます。
  3. キャラクター/ペルソナデータ — キャラクターカードのフィールドとアクティブなペルソナがメッセージ配列に組み立てられます。
  4. ロアブック — 一致するロアブックエントリが起動ルールに従って挿入されます。必須とマークされたエントリは削除から保護されます。
  5. メモリ/RAG — メモリとベクターリコールのブロックが取得され、ランク付けされます。
  6. トークンカウント — ローカルのトークナイザープロファイルが組み立てられたコンテキストをカウントします。
  7. コンテキストシフティング — コンテキストがトークン予算に収められます。コンテキストシフティング を参照してください。
  8. プラグインインターセプター — プラグインはメッセージ配列を検査・変更できます。最後のインターセプターの後、パイプラインはトークンを数え直し、予算を再適用するため、どのプラグインもこれを回避できません。
  9. インストラクトフォーマットのレンダリング — クリーンなメッセージ配列が選択されたインストラクトフォーマットにレンダリングされるか、構造化されたまま保持されます。インストラクトフォーマット を参照してください。
  10. プロバイダーのシリアライゼーション — アダプターがプロバイダーリクエストを構築します: チャットアダプターは構造化されたメッセージ配列を、テキストアダプターはレンダリングされたプロンプト文字列を受け取ります。
  11. リクエストAbortSignal、タイムアウト、クライアント切断処理付きでリクエストが送信されます。
  12. ストリーミング応答 — 応答が SSE でストリーミングされます。任意の assistantPrefill が最初のデルタに正確に 1 回前置されます。
  13. 後処理フック — プラグインは保存前にストリーミングされた応答を処理できます。
  14. メッセージの保存 — 最終メッセージ、そのバリアント、生成メタデータが 1 つのトランザクションで保存されます。

フックのルール

すべてのプラグインフックは同じコントラクトで定義されます:

  • 順序と優先度 — フックは優先度順に実行され、同じ優先度は決定的に順序付けられます。
  • タイムアウト — 各フックにはタイムアウトがあります。それを超えたフックは中断されます。
  • キャンセル — フックは生成の AbortSignal を受け取り、発火したら作業を停止しなければなりません。
  • 権限 — フックは、プラグインが宣言したケイパビリティに必要な権限を保持している場合にのみ実行されます。
  • 例外の分離 — あるプラグインのフックのエラーは捕捉され、ログに記録され、スキップされます。パイプラインは継続し、壊れたインターセプターが生成全体を黙って壊すことは決してありません。
  • 診断ログ — すべてのプロンプト変更が記録されます。変更ログは生成診断で返され、応答メッセージの meta に保存されるため、実際に送信されたものを常に確認できます。

プロンプトの後処理

チャットモードでは、メッセージ配列はシリアライゼーションの前にオプションの再構築ステージを通過できます — 古典的な mergeMessages アルゴリズムの移植です。モードには mergesemistrictsingle に加え、ツールメッセージを保持する _tools バリアントがあります。テキストモードでは、インストラクトレンダリングがすでにロールを 1 つの文字列にまとめているため、このステージはスキップされます。

関連情報