コンテンツにスキップ

コンテキスト管理

コンテキストは多義的な用語です。主に気にすることになるコンテキストには 2 つの種類があります。

  1. 実行中にコードからアクセスできる ローカルコンテキスト: ツールが必要とする依存関係やデータ、onHandoff のようなコールバック、ライフサイクルフック
  2. 応答生成時に言語モデルが参照できる エージェント / LLM コンテキスト

ローカルコンテキストは RunContext<T> 型で表されます。状態や依存関係を保持する任意のオブジェクトを作成し、それを Runner.run() に渡します。すべてのツール呼び出しとフックは RunContext ラッパーを受け取り、そのオブジェクトの読み取りや変更を行えます。

Local context example
import { Agent, run, RunContext, tool } from '@openai/agents';
import { z } from 'zod';
interface UserInfo {
name: string;
uid: number;
}
const fetchUserAge = tool({
name: 'fetch_user_age',
description: 'Return the age of the current user',
parameters: z.object({}),
execute: async (
_args,
runContext?: RunContext<UserInfo>,
): Promise<string> => {
return `User ${runContext?.context.name} is 47 years old`;
},
});
async function main() {
const userInfo: UserInfo = { name: 'John', uid: 123 };
const agent = new Agent<UserInfo>({
name: 'Assistant',
tools: [fetchUserAge],
});
const result = await run(agent, 'What is the age of the user?', {
context: userInfo,
});
console.log(result.finalOutput);
// The user John is 47 years old.
}
main().catch((error) => {
console.error(error);
process.exit(1);
});

1 回の実行に参加するすべてのエージェント、ツール、フックは、同じコンテキストの を使う必要があります。

ローカルコンテキストの用途の例:

  • 実行に関するデータ(ユーザー名、ID など)
  • ロガーやデータフェッチャーなどの依存関係
  • ヘルパー関数

1 回の実行の中では、派生コンテキストは同じ基盤アプリコンテキスト、承認、および使用状況トラッキングを共有します。ネストされた agent.asTool() 実行では異なる toolInput を付与できる場合がありますが、デフォルトではアプリ状態の独立したコピーは取得しません。

RunContext<T> は、アプリで定義したコンテキストオブジェクトのラッパーです。実際には、主に次を使います。

  • 独自の可変なアプリ状態と依存関係のための runContext.context
  • 現在の実行で集計されたトークン / リクエスト使用量のための runContext.usage
  • 現在の実行が agent.asTool() 内で行われている場合の構造化入力のための runContext.toolInput
  • 承認状態をプログラムから更新する必要がある場合の runContext.approveTool(...) / runContext.rejectTool(...)

アプリで定義したオブジェクトなのは runContext.context だけです。その他のフィールドは SDK が管理するランタイムメタデータです。

後で human-in-the-loop 用に RunState をシリアライズする場合、そのランタイムメタデータも状態とともに保存されます。シリアライズされた状態を永続化または送信する予定があるなら、runContext.context にはシークレットを置かないようにしてください。

RunContext を継承する場合は、ネストされた実行や派生実行でも、依存しているサブクラス固有のインスタンス状態が保持されることを確認してください。SDK はネストされた実行中に内部で fork されたコンテキストを作成します。

エージェント / LLM コンテキスト

Section titled “エージェント / LLM コンテキスト”

LLM が呼び出されるとき、参照できるデータは会話履歴に含まれるものだけです。追加情報を利用可能にするには、いくつか方法があります。

  1. Agent の instructions に追加する。これは system message または developer message とも呼ばれます。静的な文字列でも、コンテキストを受け取って文字列を返す関数でも構いません
  2. Runner.run() の呼び出し時に input に含める。これは instructions の手法に似ていますが、メッセージを chain of command のより下位に配置できます
  3. 関数ツール経由で公開し、LLM が必要に応じてデータを取得できるようにする
  4. 取得系ツールまたは Web 検索ツールを使い、ファイル、データベース、または Web 上の関連データに基づいて応答をグラウンディングする