OpenAI--Agent SDK简介

项目概述

OpenAI Agents SDK 是一个轻量级但功能强大的框架,用于构建多智能体工作流。它主要利用大语言模型(LLM),通过配置智能体、交接、护栏和跟踪等功能,实现复杂的工作流管理。以下是对其各个部分运行过程和代码流程的详细介绍。

项目链接:OpenAI Agent SDK项目地址

核心架构

项目整体架构图

根据提供的代码库信息,OpenAI Agents SDK 项目的整体架构可以分为以下几个主要模块:

Output
Tracing
Models
Agents
Application
调用
交接
检查
RunResult
Trace
Model
Agent
Tool
Handoff
Guardrail
Runner
用户输入
架构图说明:
  1. 应用层(Application):用户通过输入触发 Runner 开始执行代理流程。
  2. 代理层(Agents)
    • Agent 是核心组件,包含指令、工具、交接和护栏等配置。
    • Tool 是代理可以调用的工具,用于执行特定任务。
    • Handoff 允许代理将控制权转移给其他代理。
    • Guardrail 用于输入和输出的验证,确保代理的安全性。
  3. 模型层(Models)Agent 调用 Model 来生成响应。
  4. 跟踪层(Tracing)Runner 在执行过程中会生成跟踪信息,方便调试和优化。
  5. 输出层(Output):最终生成 RunResult 作为执行结果。

项目整体流程图

用户输入
Runner初始化
选择起始Agent
运行输入护栏检查
是否通过护栏检查?
调用Model生成响应
抛出InputGuardrailTripwireTriggered异常
是否有最终输出?
运行输出护栏检查
是否有交接?
切换到新的Agent
是否有工具调用?
执行工具调用
是否通过输出护栏检查?
返回RunResult
抛出OutputGuardrailTripwireTriggered异常
流程图说明:
  1. 用户输入触发 Runner 初始化,并选择起始 Agent
  2. 对输入进行护栏检查,如果未通过则抛出异常。
  3. 调用 Model 生成响应。
  4. 判断是否有最终输出,如果有则进行输出护栏检查。
  5. 如果没有最终输出,判断是否有交接或工具调用,根据情况进行相应处理。
  6. 输出护栏检查通过后,返回 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_agentenglish_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)
  • 运行过程
    1. 使用智能体的模型和设置以及消息历史调用 LLM。
    2. 处理 LLM 返回的响应,包括解析工具调用、交接等信息。
    3. 如果响应有最终输出,返回并结束循环。
    4. 如果响应有交接,切换到新的智能体并回到步骤 1。
    5. 处理工具调用(如果有)并追加工具响应消息,然后回到步骤 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
  • 运行过程
    1. 如果智能体设置了 output_type,最终输出是当 LLM 返回符合该类型的结构化输出时。
    2. 如果没有 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 通过智能体、交接、护栏和跟踪等机制,构建了一个灵活、可扩展的多智能体工作流框架。其代码流程清晰,通过 RunnerRunImpl 类实现了智能体的运行和管理,通过 TraceProvider 类实现了跟踪功能,通过 Agent 类实现了智能体的配置和管理。开发者可以根据自己的需求,配置不同的智能体和工具,构建复杂的工作流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【】序列操作

A. Tower 彭教授建造了 n n n 个不同高度的积木塔。其中 i i i 个塔的高度为 a i a_i ai​ 。 寿教授不喜欢这些塔,因为它们的高度太随意了。他决定先移除其中的 m m m 个,然后执行下面的一些操作(或不执行): 选…

QwQ-32B 模型结构

QwQ-32B 是一种基于 Transformer 架构 的大型语言模型(LLM),由阿里巴巴的 Qwen 团队开发,专注于推理任务。以下是其核心结构和技术特点: 1. 基础架构 Transformer 结构:QwQ-32B 采用多层 Transformer 架构…

【Linux】:自定义协议(应用层)

朋友们、伙计们,我们又见面了,本期来给大家带来应用层自定义协议相关的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通…

【C++】二叉树和堆的链式结构

本篇博客给大家带来的是用C语言来实现堆链式结构和二叉树的实现! 🐟🐟文章专栏:数据结构 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想&#xff…

鸿蒙保姆级教学

鸿蒙(HarmonyOS)是华为推出的一款面向全场景的分布式操作系统,支持手机、平板、智能穿戴、智能家居、车载设备等多种设备。鸿蒙系统的核心特点是分布式架构、一次开发多端部署和高性能。以下是从入门到大神级别的鸿蒙开发深度分析&#xff0c…

关于Docker是否被淘汰虚拟机实现连接虚拟专用网络Ubuntu 22.04 LTS部署Harbor仓库全流程

1.今天的第一个主题: 第一个主题是关于Docker是否真的被K8S弃用,还是可以继续兼容,因为我们知道在去年的时候,由于不可控的原因,docker的所有国内镜像源都被Ban了,再加上K8S自从V1.20之后,宣布…

八股学习-JUC java并发编程

本文仅供个人学习使用,参考资料:JMM(Java 内存模型)详解 | JavaGuide 线程基础概念 用户线程:由用户空间程序管理和调度的线程,运行在用户空间。 内核线程:由操作系统内核管理和调度的线程&…

遗传算法+四模型+双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测

遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-BiLSTM-Attention、CNN-BiL…

Linux怎样源码安装Nginx

1. 安装必要的依赖 在编译 Nginx 之前,你需要安装一些必要的依赖包,像编译工具和库文件等。以 CentOS 系统为例,可借助yum命令来安装: bash sudo yum install -y gcc pcre-devel zlib-devel openssl-devel要是使用的是 Ubuntu 系…

【入门初级篇】报表基础操作与功能介绍

【入门初级篇】报表的基本操作与功能介绍 视频要点 (1)报表组件的创建 (2)指标组件的使用:一级、二级指标操作演示 (3)表格属性设置介绍 (4)图表属性设置介绍 &#xff0…

【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】

新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍 在新能源汽车蓬勃发展的浪潮中,三电系统(电池、电机、电控)无疑是其核心驱动力。而恒压源与恒流源,作为电源管理的关键要素,在…

在线JSON格式校验工具站

在线JSON校验格式化工具(Be JSON)在线,JSON,JSON 校验,格式化,xml转json 工具,在线工具,json视图,可视化,程序,服务器,域名注册,正则表达式,测试,在线json格式化工具,json 格式化,json格式化工具,json字符串格式化,json 在线查看器,json在线,json 在线验…

图片黑白处理软件推荐

图片黑白二值化是一款小巧实用的图片处理软件,软件大小仅268K。 它的操作极其简单,用户只需将需要处理的图片直接拖入软件,就能实现图片漂白效果。 从原图和处理后的图片对比来看,效果显著。这种图片漂白处理在打印时能节省墨水&a…

【AI知识】常见的优化器及其原理:梯度下降、动量梯度下降、AdaGrad、RMSProp、Adam、AdamW

常见的优化器 梯度下降(Gradient Descent, GD)局部最小值、全局最小值和鞍点凸函数和非凸函数动量梯度下降(Momentum)自适应学习率优化器AdaGrad(Adaptive Gradient Algorithm)​RMSProp(Root M…

1.5.5 掌握Scala内建控制结构 - 异常处理

本次实战聚焦于Scala内建控制结构中的异常处理机制。通过具体案例演示了如何使用try-catch-finally结构来处理程序运行中可能出现的异常情况。在try块中调用可能抛出异常的方法,catch块则根据不同异常类型进行捕获并处理,finally块则无论是否发生异常都会…

信息系统运行管理员教程4--信息系统软件运维

第四章 信息系统软件运维 信息系统软件是信息系统运行的核心,其运维的目的是保证信息系统软件能正常而可靠地运行,并能使系统不断得到改善和提高,以充分发挥作用。 第1节 信息系统软件运维概述 1.信息系统软件运维的概念 信息系统软件运维…

以光盘读写系统演示面向对象设计的原则与方法

面向对象设计(OOD)是软件开发中的核心方法,强调通过对象、类、继承、封装和多态等概念来构建系统。以下是面向对象设计的原则、方法及常用技术手段: 一、面向对象设计原则(SOLID原则) 单一职责原则&#x…

齿轮热处理学习笔记分享

对于一个做冷加工的人来说,热处理是一个神秘的话题,但是一点都不去了解的话,工作也无法进行。所以抽点时间来学习一下齿轮热处理相关的内容,做成笔记分享给爱学习的小伙伴们,文章较长,需要一些耐心去阅读&a…

WPF 布局舍入(WPF 边框模糊 或 像素错位 的问题)

1. 什么是 WPF 布局舍入? 在 WPF 开发过程中,可能会遇到界面模糊、边框错位、文本渲染不清晰等问题。这些现象通常是由于 WPF 采用 设备无关像素(DIP, Device Independent Pixels),在不同 DPI 设置下,UI 元…

Linux中vscode编程,小白入门喂饭级教程

确保Ubuntu联网 因为后面安装VScode需要从互联网下载。 安装GCC 在桌面空白处右键->打开终端 执行命令:gcc -v 在最后一行可以看到gcc version 7.5.0 如果提示Command ‘gcc’ not found,就查一下如何安装gcc,先把gcc安装好。 安装VS…