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

Agents-SDK智能体开发[1]之入门

文章目录

  • 说明
  • 一 Agents-SDK简介
  • 二 Agents SDK基础入门
    • 2.1 接入DeepSeek模型并测试
    • 2.2 Agents SDK安装与调用
  • 三 构造多轮对话机器人
    • 3.1 具体响应结果特点
    • 3.2 多轮对话完整代码
    • 3.3 多轮对话内容
  • 四 接入ollama/vLLM本地模型

说明

  • 本文学自赋范社区公开课,仅供学习和交流使用,不用作任何商业用途!

一 Agents-SDK简介

  • Agents-SDK是一款企业级Multi-Agent开发框架,该框架是的Swarm的升级版,在保留了Swarm的高效便捷的Multi-Agent开发特性的同时,加入了更多面向企业级应用的功能。
  • openai agents github
  • Agents SDK博客
  • OpenAI Agents SDK能够通过一个轻量、易用、抽象极少的工具包来构建基于智能体的 AI 应用。该 SDK 仅包含极少量的原语(基础构件):
    • Agent(智能体):即带有指令和工具的大语言模型(LLM)
    • Handoff(交接):允许智能体将特定任务委托给其他智能体
    • Guardrail(护栏):用于对输入内容进行验证
  • 此外,SDK 自带内置的追踪功能,可以帮助你可视化和调试智能体的执行流程,同时也支持对流程进行评估,甚至用于模型的微调。结合 Python 和原语,能够表达工具与智能体之间的复杂关系,构建真实可用的应用程序。

  • OpenAI的Agents SDK 的设计遵循两个核心原则:
    • 功能足够强大,值得使用,但原语足够少,容易上手。
    • 默认配置即可很好地运行,但你也可以完全自定义行为逻辑。

  • SDK 的主要特性:
    • Agent 循环机制:内置的智能体循环逻辑,自动处理工具调用、结果返回给 LLM、直到任务完成的全过程
    • Python 优先:使用原生 Python 语言特性来编排与串联智能体,而无需学习新的抽象概念
    • Handoff(智能体间任务交接):强大的功能,可在多个智能体间协调与任务委派
    • Guardrail(输入验证护栏):支持与智能体并行运行输入验证逻辑,若验证失败可提前中断流程
    • 函数工具化:可以将任何 Python 函数转为工具,自动生成 Schema,并支持基于 Pydantic 的验证机制
    • 追踪系统(Tracing):内置追踪功能,可视化、调试、监控你的智能体流程,并结合 OpenAI 的评估、微调与蒸馏工具一同使用。

二 Agents SDK基础入门

  • 安装并验证openai模块
pip install openai
import openai
openai.__version__

2.1 接入DeepSeek模型并测试

from openai import OpenAI
OPENAI_API_KEY="hk-xx"
OPENAI_API_BASE="https://api.openai-hk.com/v1"
MODEL="deepseek-v3"
# 实例化客户端
client = OpenAI(api_key=OPENAI_API_KEY, base_url=OPENAI_API_BASE)
# 调用 deepseekv3 模型
response = client.chat.completions.create(model=MODEL,messages=[{"role": "user", "content": "你好,好久不见!请介绍下你自己。"}]
)
# 输出生成的响应内容
print(response.choices[0].message.content)

你好呀!很高兴再次相遇!😊 我是 DeepSeek Chat,由深度求索公司打造的智能 AI 助手。我的最新版本是 DeepSeek-V3,知识更新至 2024年7月,拥有强大的文本理解和生成能力,可以帮助你解答各种问题,包括学习、工作、编程、生活百科等。

我的特点:

  • 免费使用:目前无需付费,随时为你服务!
  • 超长上下文:支持 128K 上下文记忆,可以处理超长文档和复杂对话。
  • 文件阅读:能解析 PDF、Word、Excel、PPT、TXT 等文件,帮助你提取和分析信息。
  • 丰富知识库:覆盖科技、历史、金融、娱乐等多个领域,提供专业且准确的回答。
  • 中文优化:对中文理解和生成特别优化,交流更自然流畅。

无论是写作灵感、代码调试、学习辅导,还是闲聊放松,我都可以陪你!最近过得怎么样?有什么我可以帮你的吗? 😃


2.2 Agents SDK安装与调用

  • Agents SDK作为一个工业级的Multi-Agent开发框架,实际使用过程中有非常多的的技术细节,但如果希望快速测试一些功能,则只需要导入AgentRunner两个模块即可快速运行。其中Agent就是一个Multi-Agent系统中最小执行单元,而Runner则是运行一次次任务的调度函数。但是需要注意的是,由于Agents SDK默认支持的模型是OpenAI的GPT系列模型,因此在修改底层模型的时候,还需要额外导入AsyncOpenAI、OpenAIChatCompletionsModelModelSettings等模块。
  1. 安装Agents SDK依赖
    pip install openai-agents
    
  2. Agents SDK简单调用
    from openai import AsyncOpenAI
    from agents import OpenAIChatCompletionsModel,Agent,Runner,set_default_openai_client
    from agents.model_settings import ModelSettings
    OPENAI_API_KEY="hk-xxx"
    OPENAI_API_BASE="https://api.openai-hk.com/v1"
    MODEL="deepseek-v3"# 创建一个Agent对象并调用DeepSeek模型
    external_client = AsyncOpenAI(base_url =OPENAI_API_BASE,api_key=OPENAI_API_KEY,
    )
    set_default_openai_client(external_client)deepseek_model = OpenAIChatCompletionsModel(model=MODEL,openai_client=external_client)# ame就是Agent的名称,而instructions就是Agent的“系统提示”
    agent = Agent(name="Assistant", instructions="你是一名助人为乐的助手。",model=deepseek_model)result = await Runner.run(agent, "请写一首关于编程中递归的俳句。") 
    print(result.final_output)
    

三 构造多轮对话机器人

3.1 具体响应结果特点

  • 不同于传统的chat.completion APIMessages驱动(传入Message、传出Message),Agents SDK是事件驱动,Agents SDK会将整个运行过程看成是一次次的事件。例如上述创建完俳(pái)句后,全部的事件都保留在result中。

    result
    
    {RunResult(input='请写一首关于编程中递归的俳句。',new_items=[MessageOutputItem(agent=Agent(name='Assistant',handoff_description=None,tools=[],mcp_servers=[],mcp_config={},instructions='你是一名助人为乐的助手。',prompt=None,handoffs=[],model=<agents.models.openai_chatcompletions.OpenAIChatCompletionsModelobjectat0x000001787D93B4D0>,model_settings=ModelSettings(temperature=None,top_p=None,frequency_penalty=None,presence_penalty=None,tool_choice=None,parallel_tool_calls=None,truncation=None,max_tokens=None,reasoning=None,metadata=None,store=None,include_usage=None,response_include=None,extra_query=None,extra_body=None,extra_headers=None,extra_args=None),input_guardrails=[],output_guardrails=[],output_type=None,hooks=None,tool_use_behavior='run_llm_again',reset_tool_choice=True),raw_item=ResponseOutputMessage(id='__fake_id__',content=[ResponseOutputText(annotations=[],text='函数自调用,\n层层深入栈中游,\n终有归来时。',type='output_text')],role='assistant',status='completed',type='message'),type='message_output_item')],raw_responses=[ModelResponse(output=[ResponseOutputMessage(id='__fake_id__',content=[ResponseOutputText(annotations=[],text='函数自调用,\n层层深入栈中游,\n终有归来时。',type='output_text')],role='assistant',status='completed',type='message')],usage=Usage(requests=1,input_tokens=22,input_tokens_details=InputTokensDetails(cached_tokens=0),output_tokens=17,output_tokens_details=OutputTokensDetails(reasoning_tokens=0),total_tokens=39),response_id=None)],final_output='函数自调用,\n层层深入栈中游,\n终有归来时。',input_guardrail_results=[],output_guardrail_results=[],context_wrapper=RunContextWrapper(context=None,usage=Usage(requests=1,input_tokens=22,input_tokens_details=InputTokensDetails(cached_tokens=0),output_tokens=17,output_tokens_details=OutputTokensDetails(reasoning_tokens=0),total_tokens=39)),_last_agent=Agent(name='Assistant',handoff_description=None,tools=[],mcp_servers=[],mcp_config={},instructions='你是一名助人为乐的助手。',prompt=None,handoffs=[],model=<agents.models.openai_chatcompletions.OpenAIChatCompletionsModelobjectat0x000001787D93B4D0>,model_settings=ModelSettings(temperature=None,top_p=None,frequency_penalty=None,presence_penalty=None,tool_choice=None,parallel_tool_calls=None,truncation=None,max_tokens=None,reasoning=None,metadata=None,store=None,include_usage=None,response_include=None,extra_query=None,extra_body=None,extra_headers=None,extra_args=None),input_guardrails=[],output_guardrails=[],output_type=None,hooks=None,tool_use_behavior='run_llm_again',reset_tool_choice=True))
    }
    
  • 通过new_items属性来查看全部的事件,全部事件用一个列表进行表示。

    result.new_items
    
{[MessageOutputItem(agent=Agent(name='Assistant',handoff_description=None,tools=[ ],mcp_servers=[],mcp_config={},instructions='你是一名助人为乐的助手。',prompt=None,handoffs=[],model=<agents.models.openai_chatcompletions.OpenAIChatCompletionsModelobjectat0x000001787D93B4D0>,model_settings=ModelSettings(temperature=None,top_p=None,frequency_penalty=None,presence_penalty=None,tool_choice=None,parallel_tool_calls=None,truncation=None,max_tokens=None,reasoning=None,metadata=None,store=None,include_usage=None,response_include=None,extra_query=None,extra_body=None,extra_headers=None,extra_args=None),input_guardrails=[],output_guardrails=[],output_type=None,hooks=None,tool_use_behavior='run_llm_again',reset_tool_choice=True),raw_item=ResponseOutputMessage(id='__fake_id__',content=[ResponseOutputText(annotations=[],text='函数自调用,\n层层深入栈中游,\n终有归来时。',type='output_text')],role='assistant',status='completed',type='message'),type='message_output_item')]
}
  • 可以发现列表中只有一个事件,可以通过len(result.new_items)进行验证,即是一次MessageOutputItem,也就是消息创建事件(也就是大模型发生一次回复)。
    type(result.new_items[0])
    
    agents.items.MessageOutputItem
    
  • 具体回复的内容,则可以通过raw_item来查看result.new_items[0].raw_item
    ResponseOutputMessage(id='__fake_id__', content=[ResponseOutputText(annotations=[], text='函数自调用,  \n层层深入栈中游,  \n终有归来时。', type='output_text')], role='assistant', status='completed', type='message')
    
  • Agents SDK为了方便我们快速构造多轮对话机器人,专门提供了一个to_input_list()方法,可以直接将用户的输入和本次输出结果拼接成一个消息列表。
    result.to_input_list()
    
    [{'content': '请写一首关于编程中递归的俳句。', 'role': 'user'},{'id': '__fake_id__','content': [{'annotations': [],'text': '函数自调用,  \n层层深入栈中游,  \n终有归来时。','type': 'output_text'}],'role': 'assistant','status': 'completed','type': 'message'}]
    

  • 验证消息列表记忆
    messages = result.to_input_list()
    messages.append({"role": "user", "content":"请问我的上一个问题是什么?"})
    print(messages)
    result = await Runner.run(agent, messages)
    print(result.final_output)
    print(result.to_input_list())
    
[{'content': '请写一首关于编程中递归的俳句。', 'role': 'user'}, {'id': '__fake_id__', 'content': [{'annotations': [], 'text': '函数自调用,  \n层层深入栈中游,  \n终有归来时。', 'type': 'output_text'}], 'role': 'assistant', 'status': 'completed', 'type': 'message'}, {'role': 'user', 'content': '请问我的上一个问题是什么?'}]
你上一个问题是:  
**"请写一首关于编程中递归的俳句。"**  需要调整或补充回答吗?还是想继续探讨递归或俳句?  😊[{'content': '请写一首关于编程中递归的俳句。', 'role': 'user'}, {'id': '__fake_id__', 'content': [{'annotations': [], 'text': '函数自调用,  \n层层深入栈中游,  \n终有归来时。', 'type': 'output_text'}], 'role': 'assistant', 'status': 'completed', 'type': 'message'}, {'role': 'user', 'content': '请问我的上一个问题是什么?'}, {'id': '__fake_id__', 'content': [{'annotations': [], 'text': '你上一个问题是:  \n**"请写一首关于编程中递归的俳句。"**  \n\n需要调整或补充回答吗?还是想继续探讨递归或俳句?  😊', 'type': 'output_text'}], 'role': 'assistant', 'status': 'completed', 'type': 'message'}]

3.2 多轮对话完整代码

from openai import AsyncOpenAI
from agents import OpenAIChatCompletionsModel,Agent,Runner,set_default_openai_client
from agents.model_settings import ModelSettings
from IPython.display import display, Code, Markdown, Image
OPENAI_API_KEY="hk-xxx"
OPENAI_API_BASE="https://api.openai-hk.com/v1"
MODEL="deepseek-v3"# 创建一个Agent对象并调用DeepSeek模型
external_client = AsyncOpenAI(base_url =OPENAI_API_BASE,api_key=OPENAI_API_KEY,
)
set_default_openai_client(external_client)deepseek_model = OpenAIChatCompletionsModel(model=MODEL,openai_client=external_client)# ame就是Agent的名称,而instructions就是Agent的“系统提示”
agent = Agent(name="Assistant", instructions="你是一名助人为乐的助手。",model=deepseek_model)async def chat(Agent):input_items = []while True:user_input = input("💬 请输入你的消息(输入quit/exit退出):")if user_input.lower() in ["exit", "quit"]:print("✅ 对话已结束")break# 主动添加询问消息input_items.append({"content": user_input, "role": "user"})# 自动添加事件中的回答消息result = await Runner.run(Agent, input_items)display(Markdown(result.final_output))input_items = result.to_input_list()await chat(agent)

3.3 多轮对话内容

💬 请输入你的消息(输入quit/exit退出): 你好,你可以帮助我吗/

当然可以!我很乐意帮助你。请告诉我你需要什么帮助,无论是学习、工作、生活问题,还是其他任何疑问,我都会尽力为你解答。😊
你可以直接在这里描述你的问题或需求,我会尽快给你最实用的建议或信息!

💬 请输入你的消息(输入quit/exit退出): 我想赶紧研究生毕业,给我两条建议

当然!如果你想加速研究生毕业,以下是两条最核心的建议,结合效率和可行性:

  1. 明确毕业条件,优先完成“硬指标”
    研究进度:快速锁定导师认可的毕业课题(避免中途换题),集中精力完成论文核心章节(如实验/数据分析),其他部分(如文献综述)可后期补充。
    发表要求:如果学校要求发表论文,优先投递周期短的期刊/会议(如EI会议、校定核心期刊),或与导师协商用项目报告、专利等替代部分要求。
  2. 高效时间管理 + 主动沟通
    制定极简计划:将任务拆解到周,例如:
    第1-3个月:完成实验或建模;
    第4-5个月:写论文+投稿;
    第6个月:修改/准备答辩。
    高频同步导师:每周固定时间汇报进展(哪怕只有一点),让导师看到你的主动性,避免后期因反馈延迟耽误时间。
    额外提示:如果时间紧迫,可申请提前答辩(需提前查清学校政策),或利用课题组已有数据/合作项目减少工作量。
    如果需要具体某方面的技巧(比如如何快速写论文、应对导师拖延),可以告诉我,我再展开细说! 💪

💬 请输入你的消息(输入quit/exit退出): 我上一个问题是什么来着?
你上一个问题是:“我想赶紧研究生毕业,给我两条建议”
我回复了两条核心建议(明确毕业条件 + 高效时间管理),并附带了额外提示。需要我复述具体内容,或补充其他方面吗? 😊(小提醒:如果想回顾之前的对话,可以随时告诉我~)

💬 请输入你的消息(输入quit/exit退出): quit
✅ 对话已结束

四 接入ollama/vLLM本地模型

  • 接入本地模型测试
from openai import OpenAI
client = OpenAI(base_url='http://localhost:11434/v1/',api_key='ollama',  # required but ignored
)
prompt = "你好,好久不见!"
messages = [{"role": "user", "content": prompt}
]response = client.chat.completions.create(messages=messages,model='deepseek-r1:14b',
)print(response.choices[0].message.content)
  • 接入Agent SDK测试
from openai import AsyncOpenAI
from agents import OpenAIChatCompletionsModel,Agent,Runner,set_default_openai_client
from agents import set_tracing_disabled  # or from your framework's module
external_client = AsyncOpenAI(base_url = 'http://localhost:11434/v1',api_key='ollama', 
)
set_default_openai_client(external_client)
set_tracing_disabled(True)
agent = Agent(name="Assistant", instructions="你是一名助人为乐的助手。",model=OpenAIChatCompletionsModel(model="deepseek-r1:14b",openai_client=external_client,))
result = await Runner.run(agent, "请写一首关于编程中递归的诗句。") 
print(result.final_output)
嗯,用户让我写一首关于编程中递归的诗句。首先,我得理解什么是递归。递归是一种函数调用自身的方法,在解决问题时会将问题分解为更小的子问题。 接下来,我要把递归的特点融入诗句里。递归通常涉及重复执行和逐步缩小的问题规模。所以,我想用一些自然现象或者循环的概念来比喻。 考虑到诗的韵律和意象,我想到阶梯和螺旋这两个形象。阶梯代表逐步分解问题,而螺旋则象征不断深入的过程。这样可以很好地表现出递归的特点。 然后,我需要找出押韵的词汇,让诗句更流畅。第一句“函数清点阶与梯”用了“梯”,有押韵的感觉。第二句“调用自身旋入迷”中的“迷”对仗也不错,同时表达了深入的过程。 第三和第四句需要总结递归带来的结果。“数层深意终自现”说明通过多次调用,问题的深层含义逐渐显现。最后一句“解法重生始Adjacent(相邻)”暗示了在重复过程中,新的解法出现,类似于函数调用时的状态变化。 整体来看,这样的诗句既贴合递归的概念,又有诗意和韵律感。希望用户能够通过这首诗更好地理解和记忆递归的特点。

函数清点阶与梯,
调用自身旋入迷。
数层深意终自现,
解法重生始Adjacent(相邻)。

http://www.dtcms.com/a/310712.html

相关文章:

  • 智能客服系统实战:多轮对话与知识库检索完整实现
  • DL环境捉虫
  • Python从入门到精通——第四章 程序流程控制
  • 第五届智能通信与计算国际学术会议(ICICC 2025)
  • 电子合同管理台账功能详解
  • Dify API接口上传文件 postman配置
  • Param关键字的使用
  • Pycaita二次开发基础代码解析:几何体重命名与参数提取技术
  • 如何使用Postman做接口测试
  • VS Code 插件开发教程
  • 麻醉深度监护系统市场规模从 857 百万美元向 1244 百万美元跨越,2031 年将形成更大的市场
  • 机试01——C++基础语法与库函数
  • Luckysheet 打印终极指南(预览视图+打印功能) : 2025 最新实现
  • Codeforces Educational 181(ABCD)
  • c++--格式化/clang-format
  • 亚像素级精度的二维图像配准方法
  • Java 20 新特性解析与代码示例
  • 研报复现|阿梅特欧卡莫斯集中投资法则
  • 【Kubernetes 指南】基础入门——Kubernetes 集群(二)
  • DQL 超维分析
  • QT6 源,十章绘图(2)画刷 QBrush:刷子只涉及填充颜色,线型,填充图片,以及变换矩阵这几个属性,附源代码带注释。
  • 使用全连接神经网络训练和预测MNIST以及CIFAR10
  • 十、SpringBootWeb快速入门-入门案例
  • 玻尔兹曼分布与玻尔兹曼探索
  • 户外广告牌识别误检率↓78%!陌讯动态感知算法实战解析
  • 力扣面试150题--数字范围按位与
  • 【文章素材】ACID 原子性与数据库
  • 五自由度机械臂阻抗控制下的力跟踪
  • 神经网络学习笔记
  • 台式机 Server 20.04 CUDA11.8