OpenAI--Agent SDK简介
项目概述
OpenAI Agents SDK 是一个轻量级但功能强大的框架,用于构建多智能体工作流。它主要利用大语言模型(LLM),通过配置智能体、交接、护栏和跟踪等功能,实现复杂的工作流管理。以下是对其各个部分运行过程和代码流程的详细介绍。
项目链接:OpenAI Agent SDK项目地址
核心架构
项目整体架构图
根据提供的代码库信息,OpenAI Agents SDK 项目的整体架构可以分为以下几个主要模块:
架构图说明:
- 应用层(Application):用户通过输入触发
Runner开始执行代理流程。 - 代理层(Agents):
Agent是核心组件,包含指令、工具、交接和护栏等配置。Tool是代理可以调用的工具,用于执行特定任务。Handoff允许代理将控制权转移给其他代理。Guardrail用于输入和输出的验证,确保代理的安全性。
- 模型层(Models):
Agent调用Model来生成响应。 - 跟踪层(Tracing):
Runner在执行过程中会生成跟踪信息,方便调试和优化。 - 输出层(Output):最终生成
RunResult作为执行结果。
项目整体流程图
流程图说明:
- 用户输入触发
Runner初始化,并选择起始Agent。 - 对输入进行护栏检查,如果未通过则抛出异常。
- 调用
Model生成响应。 - 判断是否有最终输出,如果有则进行输出护栏检查。
- 如果没有最终输出,判断是否有交接或工具调用,根据情况进行相应处理。
- 输出护栏检查通过后,返回
RunResult;否则抛出异常。
核心概念
1. 智能体(Agents)
智能体是配置了指令、工具、护栏和交接功能的大语言模型。在代码中,Agent 类是核心,它包含了智能体的基本信息。
from agents import Agentagent = Agent(name="Assistant", instructions="You are a helpful assistant")
- 运行过程:当调用
Runner.run()或Runner.run_sync()时,会启动一个循环,不断与 LLM 交互,直到得到最终输出。 - 代码流程:
Runner.run()或Runner.run_sync()调用RunImpl.execute_tools_and_side_effects()方法。- 在
execute_tools_and_side_effects()中,首先处理模型响应,包括解析工具调用、交接等信息。 - 然后根据响应结果,决定是继续运行、进行交接还是返回最终输出。
2. 交接(Handoffs)
交接允许智能体将特定任务的控制权转移给其他智能体。
spanish_agent = Agent(name="Spanish agent", instructions="You only speak Spanish.")
english_agent = Agent(name="English agent", instructions="You only speak English")
triage_agent = Agent(name="Triage agent",instructions="Handoff to the appropriate agent based on the language of the request.",handoffs=[spanish_agent, english_agent]
)
- 运行过程:当
triage_agent收到请求时,根据请求的语言将任务交接给spanish_agent或english_agent。 - 代码流程:
- 在
RunImpl.execute_tools_and_side_effects()中,处理模型响应时,如果发现有交接信息,调用execute_handoffs()方法。 execute_handoffs()方法会将控制权转移到新的智能体,并重新开始循环。
- 在
3. 护栏(Guardrails)
护栏是可配置的安全检查,用于输入和输出验证。
from agents import InputGuardrail, GuardrailFunctionOutput
from pydantic import BaseModelclass HomeworkOutput(BaseModel):is_homework: boolreasoning: strguardrail_agent = Agent(name="Guardrail check",instructions="Check if the user is asking about homework.",output_type=HomeworkOutput
)
- 运行过程:在智能体运行过程中,护栏会对输入和输出进行验证,如果不符合条件,可能会中断流程。
- 代码流程:
- 在
RunImpl.execute_tools_and_side_effects()中,处理最终输出时,会根据输出类型进行验证。 - 如果输出类型是结构化的,会调用
output_schema.validate_json()方法进行验证。
- 在
4. 跟踪(Tracing)
跟踪是内置的智能体运行跟踪功能,可用于查看、调试和优化工作流。
from agents.tracing.setup import TraceProvidertrace_provider = TraceProvider()
- 运行过程:在智能体运行过程中,会创建跟踪信息并发送到指定的后端。
- 代码流程:
TraceProvider类负责管理跟踪处理器。- 在创建跟踪或跨度时,会调用相应的处理器进行处理。
- 处理器会在跟踪开始、结束,跨度开始、结束等事件发生时进行相应的操作。
项目使用步骤
1. 环境搭建
python -m venv env
source env/bin/activate
- 运行过程:创建一个虚拟环境并激活它,确保项目的依赖与系统环境隔离。
- 代码流程:这是 Python 标准的虚拟环境创建和激活步骤,由 Python 解释器和操作系统完成。
2. 安装 SDK
pip install openai-agents
- 运行过程:使用
pip工具从 Python Package Index(PyPI)下载并安装openai-agents包。 - 代码流程:
pip会解析依赖关系,下载所需的包,并将其安装到虚拟环境中。
3. 示例代码
Hello world 示例
from agents import Agent, Runneragent = Agent(name="Assistant", instructions="You are a helpful assistant")result = Runner.run_sync(agent, "Write a haiku about recursion in programming.")
print(result.final_output)
- 运行过程:创建一个简单的智能体,调用
Runner.run_sync()方法与 LLM 交互,获取最终输出并打印。 - 代码流程:
- 创建
Agent对象,设置名称和指令。 - 调用
Runner.run_sync()方法,该方法会调用RunImpl.execute_tools_and_side_effects()方法进行处理。 - 在
execute_tools_and_side_effects()中,与 LLM 交互,处理响应,直到得到最终输出。 - 返回最终输出并打印。
- 创建
交接示例
from agents import Agent, Runner
import asynciospanish_agent = Agent(name="Spanish agent",instructions="You only speak Spanish.",
)english_agent = Agent(name="English agent",instructions="You only speak English",
)triage_agent = Agent(name="Triage agent",instructions="Handoff to the appropriate agent based on the language of the request.",handoffs=[spanish_agent, english_agent],
)async def main():result = await Runner.run(triage_agent, input="Hola, ¿cómo estás?")print(result.final_output)if __name__ == "__main__":asyncio.run(main())
- 运行过程:创建三个智能体,其中
triage_agent负责根据请求语言进行交接,调用Runner.run()方法处理请求,最终输出结果。 - 代码流程:
- 创建三个
Agent对象,设置名称、指令和交接信息。 - 调用
Runner.run()方法,该方法会调用RunImpl.execute_tools_and_side_effects()方法进行处理。 - 在
execute_tools_and_side_effects()中,处理模型响应时发现交接信息,调用execute_handoffs()方法将控制权转移到spanish_agent。 spanish_agent处理请求并返回最终输出。- 返回最终输出并打印。
- 创建三个
函数示例
import asynciofrom agents import Agent, Runner, function_tool@function_tool
def get_weather(city: str) -> str:return f"The weather in {city} is sunny."agent = Agent(name="Hello world",instructions="You are a helpful agent.",tools=[get_weather],
)async def main():result = await Runner.run(agent, input="What's the weather in Tokyo?")print(result.final_output)if __name__ == "__main__":asyncio.run(main())
- 运行过程:创建一个带有工具的智能体,调用
Runner.run()方法处理请求,智能体调用工具获取天气信息并返回最终输出。 - 代码流程:
- 使用
@function_tool装饰器将get_weather函数转换为工具。 - 创建
Agent对象,设置名称、指令和工具。 - 调用
Runner.run()方法,该方法会调用RunImpl.execute_tools_and_side_effects()方法进行处理。 - 在
execute_tools_and_side_effects()中,处理模型响应时发现工具调用,调用execute_function_tool_calls()方法执行工具。 - 工具执行后返回结果,继续与 LLM 交互,直到得到最终输出。
- 返回最终输出并打印。
- 使用
智能体循环
当调用 Runner.run() 时,会运行一个循环,直到得到最终输出。
# 伪代码表示循环过程
while True:# 1. 调用 LLMresponse = call_llm(agent, message_history)# 2. 处理响应processed_response = process_response(response)# 3. 检查是否有最终输出if processed_response.has_final_output():return processed_response.final_output# 4. 检查是否有交接if processed_response.has_handoff():agent = processed_response.handoff_agentcontinue# 5. 处理工具调用process_tool_calls(processed_response.tool_calls)# 6. 更新消息历史update_message_history(processed_response)
- 运行过程:
- 使用智能体的模型和设置以及消息历史调用 LLM。
- 处理 LLM 返回的响应,包括解析工具调用、交接等信息。
- 如果响应有最终输出,返回并结束循环。
- 如果响应有交接,切换到新的智能体并回到步骤 1。
- 处理工具调用(如果有)并追加工具响应消息,然后回到步骤 1。
- 代码流程:
- 在
Runner.run()方法中,调用RunImpl.execute_tools_and_side_effects()方法,该方法内部实现了循环逻辑。 - 在
execute_tools_and_side_effects()中,使用ModelResponse对象表示 LLM 的响应,使用ProcessedResponse对象表示处理后的响应。 - 根据
ProcessedResponse对象的属性,判断是否有最终输出、交接或工具调用,并进行相应的处理。
- 在
最终输出
最终输出是智能体在循环中产生的最后结果。
# 判断最终输出的伪代码
if agent.output_type:# 有输出类型,检查是否为结构化输出if response.has_structured_output(agent.output_type):final_output = response.structured_output
else:# 无输出类型,检查是否无工具调用或交接if not response.has_tool_calls() and not response.has_handoff():final_output = response.message
- 运行过程:
- 如果智能体设置了
output_type,最终输出是当 LLM 返回符合该类型的结构化输出时。 - 如果没有
output_type(即纯文本响应),则第一个没有任何工具调用或交接的 LLM 响应被视为最终输出。
- 如果智能体设置了
- 代码流程:
- 在
RunImpl.execute_tools_and_side_effects()中,处理最终输出时,根据output_schema判断是否有输出类型。 - 如果有输出类型,调用
output_schema.validate_json()方法验证是否为结构化输出。 - 如果没有输出类型,检查是否有工具调用或交接,如果没有则将消息作为最终输出。
- 在
开发流程
1. 安装 uv
uv --version
- 运行过程:检查
uv工具是否安装。 - 代码流程:由操作系统执行命令,检查
uv工具的版本信息。
2. 安装依赖
make sync
- 运行过程:使用
make工具执行sync目标,安装项目的依赖。 - 代码流程:
make工具会读取Makefile文件,执行相应的命令,安装依赖。
3. 代码检查和测试
make tests # run tests
make mypy # run typechecker
make lint # run linter
- 运行过程:
make tests:运行项目的测试代码,确保功能的正确性。make mypy:运行类型检查器,检查代码中的类型错误。make lint:运行代码检查工具,检查代码的风格和规范。
- 代码流程:
make tests会执行pytest命令,运行tests目录下的测试代码。make mypy会执行mypy命令,对项目代码进行类型检查。make lint会执行ruff命令,对项目代码进行风格和规范检查。
总结
OpenAI Agents SDK 通过智能体、交接、护栏和跟踪等机制,构建了一个灵活、可扩展的多智能体工作流框架。其代码流程清晰,通过 Runner 和 RunImpl 类实现了智能体的运行和管理,通过 TraceProvider 类实现了跟踪功能,通过 Agent 类实现了智能体的配置和管理。开发者可以根据自己的需求,配置不同的智能体和工具,构建复杂的工作流。
相关文章:
OpenAI--Agent SDK简介
项目概述 OpenAI Agents SDK 是一个轻量级但功能强大的框架,用于构建多智能体工作流。它主要利用大语言模型(LLM),通过配置智能体、交接、护栏和跟踪等功能,实现复杂的工作流管理。以下是对其各个部分运行过程和代码流…...
pytorch小记(十三):pytorch中`nn.ModuleList` 详解
pytorch小记(十三):pytorch中nn.ModuleList 详解 PyTorch 中的 nn.ModuleList 详解1. 什么是 nn.ModuleList?2. 为什么不直接使用普通的 Python 列表?3. nn.ModuleList 的基本用法示例:构建一个包含两层全连…...
SpringData Redis:RedisTemplate配置与数据操作
文章目录 引言一、Redis概述与环境准备二、RedisTemplate基础配置三、连接属性配置四、操作String类型数据五、操作Hash类型数据六、操作List类型数据七、操作Set类型数据八、操作ZSet类型数据九、事务与管道操作总结 引言 Redis作为高性能的NoSQL数据库,在分布式系…...
Qt按钮控件常用的API
1.创建按钮 QPushButton *btnnew QPushButton; 以顶层方式弹出窗口控件 代码: #include "widget.h" #include "ui_widget.h" #include"QPushButton"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&…...
如何检查CMS建站系统的插件是否安全?
检查好CMS建站系统的插件安全是确保网站安全的重要环节,对于常见的安全检查,大家可以利用以下几种有效的方法和工具,来帮你评估插件的安全性。 1. 检查插件来源和开发者信誉 选择可信来源:仅从官方插件库或可信的第三方开发者处…...
修改HuggingFace模型默认缓存路径
huggingface模型的默认缓存路径是~/.cache/huggingface/hub/ 通常修改为自己的路径会更为方便。 方式一:cache_dir 参数 可以通过from_pretrained函数中的 cache_dir 参数来指定,缺点,每次都需要手动指定,比较麻烦。 如&#x…...
ORA-12541: TNS:no listener
问题描述:使用 PL/SQL Developer 连接数据库时出现ORA-12541错误。 1.查询监听状态 [oraclelocalhost admin]$ lsnrctl statusLSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-MAR-2025 10:47:57Copyright (c) 1991, 2021, Oracle. All rights reserv…...
【Matlab GUI】封装matlab GUI为exe文件
注:封装后的exe还是需要有matlab环境才能运行 (1)安装MCRinstaller.exe文件,在matlab安装目录下的toolbox/compiler/deploy/win64文件夹里 (2)安装完MCRinstaller.exe,字命令窗口输入&#x…...
【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发
在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上,将隧道转发改成直接转发 一、改成直接转发需要改动的配置 (一)将连接AP的接口改成trunk口,并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …...
Redis能否替代MySQL作为主数据库?深入解析两者的持久化差异与适用边界——基于AOF持久化与关系型数据库的对比
一、Redis的持久化机制与可靠性分析 AOF持久化原理与策略 Redis的AOF(Append Only File)通过记录所有写操作命令实现持久化,支持三种策略: **always模式**:每条命令执行后立即同步到磁盘,理论上数据丢失…...
机器人ROS学习:Ubuntu22.04安装ROS2和Moveit2实现运动规划
通过本篇文章学习,你可以收获以下内容: 学会在 Ubuntu22.04 上安装 Moveit2学会下载编译运行 Moveit2 样例程序学会使用样例程序进行运动规划等 版本平台 系统版本:ubuntu22.04ROS2 版本:humbleMoveit 版本:moveit2…...
GIT标签(Tag)操作
在Git中,标签(Tag)用于标记特定的提交点,通常用于发布版本。 切换到需要打标签的分支: git checkout <branch-name>创建标签 git tag v1.0.0 git tag -a v1.0.0 -m "Release version 1.0.0"查看所…...
生成式AI红队测试:如何有效评估大语言模型
OWASP最新指南为组建生成式AI红队或调整现有红队以适应新技术提供了详细的指导。 红队测试是一种经过时间检验的网络安全系统测试和加固方法,但它需要不断适应技术的演变。近年来,生成式AI和大语言模型(LLM)的爆发,是…...
技术路线图ppt模板_流程图ppt图表_PPT架构图
技术路线图ppt模板 / 学术ppt模板 - 院士增选、国家科技奖、杰青、长江学者特聘教授、校企联聘教授、重点研发、优青、青长、青拔.. / 学术ppt案例 WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 - 科学技术奖ppt:自然科学奖 | 技术…...
Leetcode-131.Palindrome Partitioning [C++][Java]
目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-131.Palindrome Partitioninghttps://leetcode.com/problems/palindrome-partitioning/description/131. 分割回文串 - 力扣(LeetCode)131. 分割回文串 - 给你一个字符串 s,请你…...
LeetCode 解题思路 20(Hot 100)
解题思路: 递归定义对称性: 若两棵子树镜像对称,需满足: 当前节点值相等;左子树的左节点与右子树的右节点对称;左子树的右节点与右子树的左节点对称。 终止条件: 两个节点均为空 → 对称&am…...
挖矿------获取以太坊测试币
文章目录 挖矿------获取以太坊测试币通过水龙头获取以太坊测试币了解Sepolia是什么?水龙头(Faucet)是什么?Gitcoin Passport是什么? 操作1.MetaMask钱包2.将MetaMask切换到Sepolia测试网络3.用MetaMask连接Gitcoin Pa…...
每天五分钟深度学习框架pytorch:基于pytorch搭建循环神经网络RNN
本文重点 我们前面介绍了循环神经网络RNN,主要分析了它的维度信息,其实它的维度信息是最重要的,一旦我们把维度弄清楚了,一起就很简单了,本文我们正式的来学习一下,如何使用pytorch搭建循环神经网络RNN。 RNN的搭建 在pytorch中我们使用nn.RNN()就可以创建出RNN神经网络…...
XEasyWork:面向AI应用的可视化工作流开发平台
文章目录 前言 一、平台核心价值 1.1产品定位 1.2 技术优势 二、技术架构解析 2.1战略级整合 自主开发模块 2.2集成开源项目 三、体验地址 三、未来规划 总结 前言 在人工智能技术快速落地的今天,开发者在构建AI应用时仍面临两大挑战:技术栈复杂带来的高…...
C#进阶(多线程相关)
1。进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,【是系统进行资源分配的基本单位】,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体…...
【C++】:C++11详解 —— 右值引用
目录 左值和右值 左值的概念 右值的概念 左值 vs 右值 左值引用 和 右值引用 左值引用 右值引用 左值引用 vs 右值引用 使用场景 左值引用的使用场景 左值引用的短板 右值引用的使用场景 1. 实现移动语义(资源高效转移) 2. 优化容器操作&a…...
【css酷炫效果】纯CSS实现虫洞穿越效果
【css酷炫效果】纯CSS实现穿越效果 缘创作背景html结构css样式完整代码基础版进阶版(虫洞穿越) 效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90491973 缘 创作随缘,不定时…...
Linux IP 配置
Linux IP 配置 1 环境介绍2 网卡信息配置3 使用nmtui工具配置4 更多Linux命令学习使用列表 1 环境介绍 虚拟机,服务器安装系统完成后,先要配置ip 地址,这样可以方便远程若是物理服务器一般会有4个网卡信息麒麟v10,CentOS7&#x…...
设计模式之装饰器模式:原理、实现与应用
引言 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象动态添加新的行为。装饰器模式提供了一种灵活的替代方案,避免了通过继承扩展功能的局限性。本文将深入探讨装…...
c语言笔记 结构体基础
目录 基础知识 结构体定义 基础知识 在c语言中变量是有类型的,比如整型,char型,浮点型等,这些都是单一的类型,那么如果说我要定义一个学生的信息,那么这些单一的类型是不足以表达一个学生的全部信息&#…...
Vue 登录 记住密码,设置存储时间
Vue 登录 记住密码,设置存储时间 一、手动存储login.vue 二、使用vue-cookies插件main.jslogin.vue 一、手动存储 login.vue 提示: // 设置cookie方法 setCookie(loginName, password, days) {let text encryptDes(password, des123)//使用des方法加…...
C++ 学习笔记(三)—— 入门+类和对象
1、内联函数(inline) 内联函数主要是解决C语言的宏的缺陷提出来的; 宏的缺陷: 1)容易出错,语法坑很多; 2)不能调试; 3)没有类型安全的检查; 宏的…...
KVM安全模块生产环境配置与优化指南
KVM安全模块生产环境配置与优化指南 一、引言 在当今复杂多变的网络安全环境下,生产环境中KVM(Kernel-based Virtual Machine)的安全配置显得尤为重要。本指南旨在详细阐述KVM安全模块的配置方法,结合强制访问控制(M…...
基于 SSE 和 WebSocket 的在线文本实时传输工具
简介 在线文本实时传输工具支持 SSE(Server-Sent Events) 和 WebSocket,可在不同设备间快速共享和同步文本,适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步:文本输入后,另一端用户可立即看到…...
数图亮相第三届全国生鲜创新峰会,赋能生鲜零售数字化转型
2025年3月15-18日,第三届全国生鲜创新峰会在湖北宜昌召开,主题为“生鲜破局,重塑价值”。峰会汇聚行业专家、企业领袖及精英,探讨生鲜零售新机遇与挑战。作为领先的“智慧零售”服务商,数图信息科技受邀出席࿰…...
