上下文管理
上下文是一个含义丰富的术语。您可能会关注两类主要上下文:
- 本地上下文:代码可在运行期间访问的依赖项或数据,以及
onHandoff等回调和生命周期钩子。 - 智能体/LLM 上下文:语言模型在生成响应时可以看到的上下文。
本地上下文由 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);});参与单次运行的每个智能体、工具和钩子都必须使用相同类型的上下文。
本地上下文可用于保存以下内容:
- 与运行相关的数据(用户名、ID 等)
- 日志记录器或数据获取器等依赖项
- 辅助函数
在单次运行中,派生上下文共享相同的底层应用上下文、批准状态和用量追踪。嵌套的 agent.asTool() 运行可以附加不同的 toolInput,但默认不会获得应用状态的隔离副本。
RunContext 提供的内容
Section titled “RunContext 提供的内容”RunContext<T> 是应用自定义上下文对象的包装器。在实践中,您最常使用以下内容:
runContext.context:您自己的可变应用状态和依赖项。runContext.usage:当前运行汇总的 token 和请求用量。runContext.toolInput:当前运行在agent.asTool()内执行时的结构化输入。runContext.approveTool(...)/runContext.rejectTool(...):需要以编程方式更新批准状态时使用。
只有 runContext.context 是应用自定义对象。其他字段都是由 SDK 管理的运行时元数据。
如果您之后为人机协作序列化 RunState,这些运行时元数据会随状态一起保存。如果您打算持久化或传输序列化状态,请避免在 runContext.context 中存放机密信息。
如果您创建了 RunContext 的子类,请确认嵌套运行或派生运行仍会保留您所依赖的所有子类特有实例状态。SDK 会在嵌套运行期间在内部创建分叉上下文。
智能体/LLM 上下文
Section titled “智能体/LLM 上下文”调用 LLM 时,它能看到的唯一数据来自对话历史。要让其他信息可用,您有以下几种选择:
- 将信息添加到智能体的
instructions中,也称为系统消息或开发者消息。它可以是静态字符串,也可以是接收上下文并返回字符串的函数。 - 调用
Runner.run()时,将信息包含在input中。这与使用 instructions 的方式类似,但可以让您将消息放在指令层级中较低的位置。 - 通过函数工具公开信息,让 LLM 可以按需获取数据。
- 使用检索或 Web 搜索工具,让响应以文件、数据库或 Web 中的相关数据为依据。