【agents sdk , agents lifecycle】
我来帮你在JavaScript版本的OpenAI Agents中找到Hooks相关的功能。让我先搜索一下代码库中的Hooks实现。
Search files...
让我再搜索一下JavaScript版本中运行时如何使用和配置Hooks,特别是类似Python版本中`CustomHooks()`的功能。
Search files...
Ran tool
现在让我查看一下具体的Hooks实现和使用示例:
Read file: openai-agents-js/packages/agents-core/src/lifecycle.ts
Read file: openai-agents-js/examples/basic/agent-lifecycle-example.ts
让我再看一下如何在Runner实例上设置Hooks以及示例:
Search files...
Read file: openai-agents-js/examples/basic/lifecycle-example.ts
好的!我找到了JavaScript版本的OpenAI Agents中Hooks的实现。与Python版本不同,JavaScript版本采用了事件监听器的方式来实现Hooks功能。
JavaScript版本的Hooks实现
1. Hooks的位置
Hooks主要在以下文件中定义:
// AgentHooks 和 RunHooks 的核心实现
export class AgentHooks<TContext, TOutput> extends EventEmitterDelegate<AgentHookEvents<TContext, TOutput>>
export class RunHooks<TContext, TOutput> extends EventEmitterDelegate<RunHookEvents<TContext, TOutput>>
2. 两种类型的Hooks
Agent Level Hooks (AgentHooks):
- 每个Agent实例都继承自AgentHooks
- 可以监听单个Agent的生命周期事件
Runner Level Hooks (RunHooks):
- Runner类继承自RunHooks
- 可以监听整个运行过程的全局事件
3. 使用方式
在Agent上设置Hooks:
import { Agent } from '@openai/agents';
const agent = new Agent({
name: 'My Agent',
instructions: 'You are a helpful assistant.'
});
// 设置Agent级别的hooks
agent.on('agent_start', (ctx, agent) => {
console.log(`${agent.name} started`);
});
agent.on('agent_end', (ctx, output) => {
console.log(`${agent.name} ended with output ${output}`);
});
agent.on('agent_tool_start', (ctx, tool) => {
console.log(`Tool ${tool.name} started`);
});
agent.on('agent_tool_end', (ctx, tool, result) => {
console.log(`Tool ${tool.name} ended with result ${result}`);
});
agent.on('agent_handoff', (ctx, nextAgent) => {
console.log(`Handoff to ${nextAgent.name}`);
});
在Runner上设置Hooks:
import { Runner } from '@openai/agents';
const runner = new Runner({
tracingDisabled: true // 对应Python版本的tracing_disabled=True
});
// 设置Runner级别的hooks (全局)
runner.on('agent_start', (ctx, agent) => {
console.log(`[Global] ${agent.name} started`);
});
runner.on('agent_end', (ctx, agent, output) => {
console.log(`[Global] ${agent.name} ended`);
});
runner.on('agent_tool_start', (ctx, agent, tool) => {
console.log(`[Global] ${agent.name} started tool ${tool.name}`);
});
runner.on('agent_tool_end', (ctx, agent, tool, result) => {
console.log(`[Global] ${agent.name} tool ${tool.name} ended`);
});
runner.on('agent_handoff', (ctx, fromAgent, toAgent) => {
console.log(`[Global] Handoff from ${fromAgent.name} to ${toAgent.name}`);
});
4. 对比Python版本
你的Python代码:
result = await Runner.run(
starting_agent=agent,
input=user_query,
hooks=CustomHooks().set_verbose(True), # Python版本的hooks
run_config=RunConfig(tracing_disabled=True)
)
对应的JavaScript版本:
const runner = new Runner({
tracingDisabled: true // 对应tracing_disabled=True
});
// 设置verbose hooks
runner.on('agent_start', (ctx, agent) => {
console.log(`运行查询: Agent ${agent.name} started`);
});
runner.on('agent_end', (ctx, agent, output) => {
console.log(`Agent ${agent.name} ended with output: ${output}`);
});
const result = await runner.run(agent, user_query);
5. 完整示例
我在源码中找到了完整的示例:
agent.on('agent_start', (ctx, agent) => {
eventCounter++;
console.log(
`### ${eventCounter}: ${agent.name} started. Usage: ${toPrintableUsage(ctx?.usage)}`,
);
});
agent.on('agent_end', (ctx, output) => {
eventCounter++;
console.log(
`### ${eventCounter}: ${agent.name} ended with output ${JSON.stringify(output)}. Usage: ${toPrintableUsage(ctx?.usage)}`,
);
});
// ... 更多事件监听器
总结
JavaScript版本没有像Python版本那样的CustomHooks
类,而是通过EventEmitter模式实现:
- 使用
agent.on()
或runner.on()
来设置事件监听器 - 事件类型包括:
agent_start
、agent_end
、agent_tool_start
、agent_tool_end
、agent_handoff
- Runner配置通过构造函数参数传递(如
tracingDisabled: true
)
这种设计更符合JavaScript的事件驱动编程风格。