【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_startagent_endagent_tool_startagent_tool_endagent_handoff
  • Runner配置通过构造函数参数传递(如tracingDisabled: true

这种设计更符合JavaScript的事件驱动编程风格。

posted @ 2025-07-04 13:45  十三山入秋  阅读(17)  评论(0)    收藏  举报