ポリシー、キャップ、ラベル

Goa-AIが設計時RunPolicyとランタイムオーバーライドを使用してエージェントラン周りのキャップ、時間予算、ポリシーを適用する方法を学ぶ。

設計時RunPolicy

設計時に、RunPolicyでエージェントごとのポリシーを設定します:

Agent("chat", "会話ランナー", func() {
    RunPolicy(func() {
        DefaultCaps(
            MaxToolCalls(8),
            MaxConsecutiveFailedToolCalls(3),
        )
        TimeBudget("2m")
        InterruptsAllowed(true)
    })
})

これはエージェントの登録にアタッチされたruntime.RunPolicyになります:

  • キャップMaxToolCallsMaxConsecutiveFailedToolCalls
  • 時間予算TimeBudgetFinalizerGrace(ランタイムのみ)
  • 中断InterruptsAllowed
  • 欠落フィールド動作OnMissingFields

これらは強力なデフォルトです:オーバーライドされない限り、ランタイムはすべてのランでそれらを適用します。

ランタイムポリシーオーバーライド

一部の環境では、設計を変更せずにポリシーを厳しくしたり緩めたりしたい場合があります。ランタイムは以下を公開します:

err := rt.OverridePolicy(chat.AgentID, runtime.RunPolicy{
    MaxToolCalls:                  3,
    MaxConsecutiveFailedToolCalls: 1,
    InterruptsAllowed:             true,
})

ゼロ以外のフィールド(およびInterruptsAllowedがtrueの場合)のみが適用されます。未指定のフィールドは設計時のデフォルトを維持します。

ガイドライン:

  • 安定した契約レベルの境界には設計時RunPolicyを使用、
  • ローカル実験や緊急キャップには**OverridePolicy**を控えめに使用。

ラベルとポリシーエンジン

Goa-AIはpolicy.Engineを介してプラガブルなポリシーエンジンと統合します。ポリシーは以下を受け取ります:

  • ツールメタデータ(ID、タグ)、
  • ランコンテキスト(SessionID、TurnID、ラベル)、
  • ツール失敗後のRetryHint情報。

ポリシー決定は以下ができます:

  • ツールを許可/拒否、
  • キャップや時間予算を調整、
  • 追加ラベルでランをアノテート。

ラベルは以下に流れます:

  • run.Context.Labels – ラン中にプランナーで利用可能、
  • run.Record.Labels – ランメタデータと共に永続化(検索/ダッシュボードに便利)。

ポリシーとRetryHintの連携

ツールが失敗してRetryHintを返すと、ランタイムはそれをpolicy.RetryHintに変換し、続行方法を決定する前にポリシーエンジンに渡します:

  • ポリシーは:キャップを減らすか問題のあるツールを無効化、ラベルでレビュー用にランをマーク、または決定を完全にプランナーに委ねる。
  • プランナーは:RetryHintに基づいてコールを修復してリトライ、AwaitClarificationにエスカレート、またはベストエフォートの回答でファイナライズ。