当前位置: 首页 > news >正文

# 使用OpenAI Agents实现智能代理的生命周期管理

目录

    • 引言
    • 完整代码
    • 核心概念
      • 1. 代理生命周期钩子(Agent Hooks)
      • 2. 功能工具(Function Tools)
      • 3. 多代理协作
    • 实现细节
      • 1. 代理生命周期监控
      • 2. 代理配置
      • 3. 异步执行
    • 运行效果
    • 最佳实践
    • 总结

引言

在人工智能应用开发中,智能代理(Agent)的生命周期管理是一个重要话题。本文将通过一个实际的代码示例,详细介绍如何使用OpenAI Agents框架实现智能代理的生命周期管理和多代理协作。

完整代码

import asyncio
import random
from typing import Any

from pydantic import BaseModel

from agents import Agent, AgentHooks, RunContextWrapper, Runner, Tool, function_tool


class CustomAgentHooks(AgentHooks):
    def __init__(self, display_name: str):
        self.event_counter = 0
        self.display_name = display_name

    async def on_start(self, context: RunContextWrapper, agent: Agent) -> None:
        self.event_counter += 1
        print(f"### ({self.display_name}) {self.event_counter}: Agent {agent.name} started")

    async def on_end(self, context: RunContextWrapper, agent: Agent, output: Any) -> None:
        self.event_counter += 1
        print(
            f"### ({self.display_name}) {self.event_counter}: Agent {agent.name} ended with output {output}"
        )

    async def on_handoff(self, context: RunContextWrapper, agent: Agent, source: Agent) -> None:
        self.event_counter += 1
        print(
            f"### ({self.display_name}) {self.event_counter}: Agent {source.name} handed off to {agent.name}"
        )

    async def on_tool_start(self, context: RunContextWrapper, agent: Agent, tool: Tool) -> None:
        self.event_counter += 1
        print(
            f"### ({self.display_name}) {self.event_counter}: Agent {agent.name} started tool {tool.name}"
        )

    async def on_tool_end(
        self, context: RunContextWrapper, agent: Agent, tool: Tool, result: str
    ) -> None:
        self.event_counter += 1
        print(
            f"### ({self.display_name}) {self.event_counter}: Agent {agent.name} ended tool {tool.name} with result {result}"
        )



@function_tool
def random_number(max: int) -> int:
    """
    Generate a random number up to the provided maximum.
    """
    return random.randint(0, max)


@function_tool
def multiply_by_two(x: int) -> int:
    """Simple multiplication by two."""
    return x * 2


class FinalResult(BaseModel):
    number: int


multiply_agent = Agent(
    name="Multiply Agent",
    instructions="Multiply the number by 2 and then return the final result.",
    tools=[multiply_by_two],
    hooks=CustomAgentHooks(display_name="Multiply Agent"),
    model="glm-4",
)

start_agent = Agent(
    name="Start Agent",
    instructions="Generate a random number. If it's even, stop. If it's odd, hand off to the multipler agent.",
    tools=[random_number],
    handoffs=[multiply_agent],
    hooks=CustomAgentHooks(display_name="Start Agent"),
    model="glm-4"
)

from agents import Agent, Runner,RunConfig,OpenAIProvider
run_config = RunConfig(model_provider = OpenAIProvider(
    api_key="your api key",
    base_url="https://open.bigmodel.cn/api/paas/v4/",
    use_responses=False,
    )
)


async def main() -> None:
    user_input = input("Enter a max number: ")
    await Runner.run(
        start_agent,
        input=f"Generate a random number between 0 and {user_input}.",run_config=run_config
    )

    print("Done!")


if __name__ == "__main__":
    asyncio.run(main())

python .My_test\agent_lifecycle_Test.py
Enter a max number: 250
### (Start Agent) 1: Agent Start Agent started
### (Start Agent) 2: Agent Start Agent started tool random_number
### (Start Agent) 3: Agent Start Agent ended tool random_number with result 137
### (Start Agent) 4: Agent Start Agent handed off to Multiply Agent
### (Multiply Agent) 1: Agent Multiply Agent started
### (Multiply Agent) 2: Agent Multiply Agent started tool multiply_by_two
### (Multiply Agent) 3: Agent Multiply Agent ended tool multiply_by_two with result 274
### (Multiply Agent) 4: Agent Multiply Agent ended with output The final result is 274.
Done!
OPENAI_API_KEY is not set, skipping trace export

核心概念

1. 代理生命周期钩子(Agent Hooks)

代理生命周期钩子是监控和管理代理运行状态的重要机制。通过继承AgentHooks类,我们可以实现以下关键事件的监控:

  • 代理启动(on_start)
  • 代理结束(on_end)
  • 代理交接(on_handoff)
  • 工具使用开始(on_tool_start)
  • 工具使用结束(on_tool_end)

2. 功能工具(Function Tools)

使用@function_tool装饰器,我们可以轻松地将普通Python函数转换为代理可用的工具:

@function_tool
def random_number(max: int) -> int:
    """生成随机数工具"""
    return random.randint(0, max)

@function_tool
def multiply_by_two(x: int) -> int:
    """数字乘2工具"""
    return x * 2

3. 多代理协作

示例中实现了两个协作的智能代理:

  • Start Agent:负责生成随机数并判断是否需要交接
  • Multiply Agent:负责将数字乘以2

实现细节

1. 代理生命周期监控

class CustomAgentHooks(AgentHooks):
    def __init__(self, display_name: str):
        self.event_counter = 0
        self.display_name = display_name

通过实现各种钩子方法,我们可以详细追踪代理的运行状态和行为。

2. 代理配置

multiply_agent = Agent(
    name="Multiply Agent",
    instructions="Multiply the number by 2 and then return the final result.",
    tools=[multiply_by_two],
    hooks=CustomAgentHooks(display_name="Multiply Agent"),
    model="glm-4",
)

3. 异步执行

使用asyncio实现异步操作,提高系统效率:

async def main() -> None:
    user_input = input("Enter a max number: ")
    await Runner.run(
        start_agent,
        input=f"Generate a random number between 0 and {user_input}.",
        run_config=run_config
    )

运行效果

执行程序后,我们可以看到完整的代理生命周期:

  1. Start Agent启动并生成随机数
  2. 根据数字的奇偶性决定是否交接
  3. Multiply Agent接收并处理数字
  4. 最终输出处理结果

最佳实践

  1. 使用钩子机制监控代理行为
  2. 合理划分代理职责
  3. 实现清晰的代理间通信
  4. 使用异步编程提高效率
  5. 做好错误处理和日志记录

总结

通过OpenAI Agents框架,我们可以轻松实现智能代理的生命周期管理和多代理协作。这种方式不仅提高了代码的可维护性,也为构建复杂的AI应用提供了坚实的基础。

相关文章:

  • 32、构造函数
  • CentOS 系统安装 docker 以及常用插件
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
  • mapbox基础,使用线类型geojson加载symbol符号图层,用于标注文字
  • 零信任架构实战手册-企业安全升级
  • 【AD】6-1 PCB常用规则
  • 7年全栈开发经验 · 兼职技术合作
  • 基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别
  • 【协议篇】RPC、gRPC
  • React封装axios请求方法
  • 在Vue3中集成XGPlayer视频播放器的完整指南
  • 鸿蒙 Next 实现线程之间的通信
  • export HADOOP_CLASSPATH=`hadoop classpath`
  • 将大模型输出答案清洗数学公式格式为markdown文件
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(49)万鸦壶焚网络 - 网络延迟时间(Bellman-Ford)
  • 使用 Doris 和 LakeSoul
  • 蓝桥备赛(19)- 哈希表和 unordered_ set 与unordered_map(上)
  • 程序化广告行业(13/89):DSP的深入解析与运营要点
  • C++自学方法论:从零基础到工程实践的体系化路径研究
  • Leetcode:34(二分查找)
  • 媒体谈平台帮商家“拉黑”客户:平台治理需兼顾商家与消费者权益
  • MiniMax发布新一代语音大模型
  • 俄美元首通话超2小时,普京称愿与乌方共同起草和平备忘录
  • 媒体报道一民企投资400万运营出租车4年未获批,广西隆林县回应
  • 盲人不能刷脸认证、营业厅拒人工核验,央媒:别让刷脸困住尊严
  • 取得金奖西瓜品种独家使用权的上海金山,为何要到异地“试种”?