コンテキスト管理
コンテキストという用語には多くの意味があります。ここでは、主に次の 2 種類のコンテキストについて考えます。
- コードが実行中にアクセスできる ローカルコンテキスト:ツールに必要な依存関係やデータ、
onHandoffなどのコールバック、ライフサイクルフック - 言語モデルが応答を生成するときに参照できる エージェント / LLM コンテキスト
ローカルコンテキスト
Section titled “ローカルコンテキスト”ローカルコンテキストは、RunContext<T> 型で表されます。状態や依存関係を保持する任意のオブジェクトを作成し、Runner.run() に渡します。すべてのツール呼び出しとフックには RunContext ラッパーが渡されるため、そのオブジェクトの読み取りや変更が可能です。
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 が公開する情報
Section titled “RunContext が公開する情報”RunContext<T> は、アプリケーションで定義したコンテキストオブジェクトのラッパーです。実際には、主に次のものを使用します。
runContext.context:変更可能な独自のアプリケーション状態と依存関係runContext.usage:現在の実行で集計されたトークンとリクエストの使用量runContext.toolInput:現在の実行がagent.asTool()内で行われている場合の構造化入力runContext.approveTool(...)/runContext.rejectTool(...):プログラムから承認状態を更新する場合
アプリケーションで定義するオブジェクトは runContext.context だけです。その他のフィールドは、SDK が管理するランタイムメタデータです。
後で 人間の介入(HITL) のために RunState をシリアライズすると、そのランタイムメタデータも状態とともに保存されます。シリアライズした状態を永続化または送信する予定がある場合は、runContext.context に機密情報を格納しないでください。
RunContext をサブクラス化する場合は、ネストまたは派生した実行でも、依存しているサブクラス固有のインスタンス状態が保持されることを確認してください。SDK はネストされた実行中に、内部で分岐したコンテキストを作成します。
エージェント / LLM コンテキスト
Section titled “エージェント / LLM コンテキスト”LLM が呼び出されたときに参照できるデータは、会話履歴に含まれるものだけです。追加情報を利用可能にするには、次の方法があります。
- エージェントの
instructionsに追加します。これはシステムメッセージまたは開発者メッセージとも呼ばれます。静的な文字列のほか、コンテキストを受け取って文字列を返す関数も指定できます。 Runner.run()を呼び出すときにinputに含めます。これは instructions を使用する方法に似ていますが、メッセージを指揮系統のより下位に配置できます。- 関数ツールを通じて公開し、LLM が必要に応じてデータを取得できるようにします。
- 検索ツールや Web 検索ツールを使用し、ファイル、データベース、または Web の関連データに基づいて応答を生成します。