跳到主要内容

课程说明:

  体验课时间有限,若想深度学习大模型技术,欢迎大家报名由我主讲的《2025大模型Agent智能体开发实战》(3月DeepSeek强化班)

31fd4bb178cc3d19456a042bfe7b0a6

《2025大模型Agent智能体开发实战》(3月DeepSeek强化班) 为【100+小时】体系大课,总共20大模块精讲精析,零基础直达大模型企业级应用!

91dddb4fd95cf6564d7c9d07d977202

重磅新增DeepSeek技术应用与智能体开发相关实战内容:

83019836b6d8ce8f8e07aaefa7e76b8

此外,若是对大模型底层原理感兴趣,也欢迎报名由我和菜菜老师共同主讲的《2025大模型原理与实战课程》(3月班)

8ac8006d9de5c40971271ac7e0273bf

两门大模型课程2月班目前上新特惠中,立减2000起,合购还有更多优惠哦~详细信息扫码添加助教,回复“大模型”,即可领取课程大纲&查看课程详情👇

d51f834cad2816b56f9b708f32cdd6f

《2025大模型Agent智能体开发实战》体验课

OpenAI Responses API快速入门实战

image-20250314193144243

2025年3月11号,OpenAI召开发布会,正式发布全新一代底层调用API:Responses API,并计划在未来一段时间,逐渐代替Chat.Completion API,在如今OpenAI的大模型调用方法已成为业内标准的今天,这一次更新,无疑将对未来的大模型开发生态带来重大影响。

  随着发布会一同发布的,还有三项Agent tools和一个开源Agent SDK,分别是:

  • Web Search:允许用户联网搜索相关信息;
  • File Search:允许用户将文件上传到OpenAI服务器上,并在模型对话时,实时对其进行检索;
  • computer use:允许用户借助大模型功能,来操作当前电脑或浏览器。
  • Agent SDK:swarm的升级版,一个开源的Multi-Agent开发框架。

对此,我曾专门录制视频进行入门介绍,感兴趣的同学可以戳此观看:https://www.bilibili.com/video/BV1SVQEYqERV/

image-20250314193607274

本届公开课,我们就围绕OpenAI本次更新内容进行详细讲解。

  • 课程资料及相关参考材料:OpenAI注册指南&公开课课件&国内反向代理地址,扫码即可领取。
image-20250314193843061 3eba70c0034d6f763125dc9160a0204
!pip install openai
import openai
openai.__version__
from openai import OpenAI
  • 传统chat.completion API调用方法回顾
openai_api_key = "YOUR_API_KEY"
base_url = "国内反向代理地址"
# 实例化客户端
client = OpenAI(api_key=openai_api_key,
base_url=base_url)
# 调用 GPT-4o-mini 模型
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "你好,好久不见!"}
]
)
response
image-20250314155412603 image-20250314155442641

一、Responses API基本调用方法介绍

  Responses API 是 OpenAI 为智能代理(Agents)提供的全新 API 基础构件,它结合了 Chat Completions API 的简洁性Assistants API 的内置工具能力,使得代理能够更智能地执行任务。

📌 核心特点

  • 简洁易用:继承了 Chat Completions API 的易用性。
  • 增强功能:支持内置工具(Tools),如函数调用(Function Calling)、Web 搜索、文件搜索、计算机控制等。
  • 适用于代理(Agents):可用于构建智能化任务执行系统

🔗 未来发展:Responses API 旨在成为 OpenAI 代理系统的核心 API,结合 Agents SDK,提供更灵活的任务编排能力。

image-20250312090251737

1.文本生成

  使用 OpenAI API,你可以通过一个 简单的提示(prompt) 让模型生成文本,类似于 ChatGPT 的工作方式。

response = client.responses.create(
model="gpt-4o",
input="你好,好久不见,请介绍下你自己!"
)
response
response.output_text

2. 响应结构

  OpenAI 的 API 响应包含一个内容数组output),每个内容项具有以下结构:

FENCE0

📌 重要说明:

  • output 可能包含多个结果,在多轮对话或批量生成时尤其明显。
  • 一些 SDK 提供 output_text 属性,可以直接获取所有文本输出,方便访问文本数据。
  • 除了纯文本,模型还可以返回 JSON 结构化数据(称为 Structured Outputs)。
response.output
response.output[0]
response.output[0].content
response.output[0].content[0]
response.output[0].content[0].text

3. 消息角色与指令控制

  我们可以使用不同的方式给模型提供指令

  1. 使用 instructions 参数 提供全局行为指令,如语气、目标等。(权重最高)
  2. 使用 input 数组,指定不同角色的消息
response = client.responses.create(
model="gpt-4o",
instructions="用海盗的口吻说话。",
input="JavaScript 中的分号是可选的吗?",
)
print(response.output_text)

📌 instructions 中定义“说话像海盗”后,模型会以海盗风格回答。

  此外,也可以使用 input 数组还可以指定多种角色,例如使用developer角色,developer 角色类似于 系统设定,用户输入 user 角色的内容,最终 模型按 developer 设定风格回答

response = client.responses.create(
model="gpt-4o",
input=[
{
"role": "developer",
"content": "用海盗的口吻说话。"
},
{
"role": "user",
"content": "JavaScript 中的分号是可选的吗?"
}
]
)
print(response.output_text)

4. 消息角色的优先级

OpenAI 规定不同角色的优先级如下:

角色优先级说明
developer最高由开发者提供的指令,优先级最高,类似 system
user次高由最终用户提供的输入,次于 developer
assistant最低由模型生成的响应。

5.推理模型调用

  • 查看可以调用的模型
models_list = client.models.list()
models_list.data
  • 借助o3模型进行调用
response = client.responses.create(
model="o3-mini",
input="你好,请帮我编写一个贪吃蛇小游戏,并能在html中运行。"
)
from IPython.display import display, Code, Markdown
response.output_text
print(response.output_text)
  • responses API参数列表
参数名类型必填/可选默认值说明
modelstring必填指定要使用的模型 ID,例如 gpt-4ogpt-4o-mini
storeboolean or null可选false是否存储本次对话的输出,供模型精炼或评估产品使用。
metadataobject or null可选null开发者自定义的标签和值,用于过滤仪表盘中的补全结果。
frequency_penaltynumber or null可选0数值在 -2.02.0 之间,正值减少重复生成内容的可能性。
logit_biasmap可选null调整某些特定 tokens 出现的可能性,值在 -100100 之间。
logprobsboolean or null可选false是否返回生成的每个 token 的对数概率。
top_logprobsinteger or null可选null指定返回最有可能出现的前几个 tokens 及其概率,需开启 logprobs
max_completion_tokensinteger or null可选null指定模型生成的最大 token 数,包括可见文本和推理 tokens。
ninteger or null可选1每个输入生成的对话补全选项数量,值越大,生成的回复越多。
presence_penaltynumber or null可选0数值在 -2.02.0 之间,正值鼓励生成新的主题和内容。
response_formatobject可选null指定生成结果的格式,可以设置为 json_schema 以确保结构化输出,或 json_object 用于 JSON 格式。
seedinteger or null可选null保持生成的一致性,重复相同请求将尽量生成相同的结果。
service_tierstring or null可选auto指定服务延迟等级,适用于付费订阅用户,默认为 auto
stopstring / array / null可选null最多指定 4 个序列,API 遇到这些序列时会停止生成进一步的 tokens。
streamboolean or null可选false是否启用流式响应,若启用,生成的 tokens 将逐步返回。
stream_optionsobject or null可选null流式响应的选项,仅当 streamtrue 时设置。
temperaturenumber or null可选1控制生成输出的随机性,值越高生成的文本越随机。建议调整此值或 top_p,而不是同时调整。
top_pnumber or null可选1使用核采样方法,选择最有可能的 tokens,总概率达到 top_p 百分比。建议与 temperature 二选一。
toolsarray可选null模型可以调用的工具列表,目前仅支持函数调用。
userstring可选null表示最终用户的唯一标识符,用于监控和检测滥用行为。

参数解释:

  1. 模型和输出相关参数

    • model 是必填参数,决定使用哪个模型(如 gpt-4ogpt-4o-mini)。
    • store 控制是否存储生成的对话结果,便于后续模型训练或评估。
    • metadata 用于添加开发者自定义的标签,便于在仪表盘中过滤补全结果。
    • max_completion_tokensn 控制生成内容的数量和长度,帮助管理生成成本。
  2. 生成行为控制

    • frequency_penaltypresence_penalty 都用于影响生成结果的内容重复度和新颖性。
    • logit_bias 是用于调整特定 token 出现概率的高级控制工具。
    • temperaturetop_p 通过不同的方式控制生成结果的随机性,建议选其一进行调整。
  3. 高级功能

    • logprobstop_logprobs 用于返回每个 token 的概率信息,适合对模型输出进行更细粒度分析。
    • stream 启用后会实时返回生成的结果,适用于需要逐步展示内容的场景。
    • tools 允许模型调用外部工具(如函数),适用于扩展模型的功能。
  4. 服务和用户相关参数

    • service_tier 控制服务的延迟和稳定性,适合高性能要求的付费用户。
    • user 用于标识最终用户,有助于监控使用行为,防止滥用。

三、Web Search(网页搜索)功能实现

  OpenAI Agents SDK 支持网页搜索,允许模型在生成回答之前查询最新的信息,类似于 ChatGPT 的搜索功能,并提供清晰的引用来源。

image-20250312090429795
response = client.responses.create(
model="gpt-4o",
tools=[{"type": "web_search_preview"}], # 启用 Web 搜索工具
input="今天有什么正面的新闻吗?"
)
print(response.output_text)

📌 效果

  • 该 API 请求会调用 web_search_preview,允许模型在回答前搜索最新的新闻
  • 模型可以自行决定是否使用该工具。
response
response1 = client.responses.create(
model="gpt-4o",
tools=[{"type": "web_search_preview"}], # 启用 Web 搜索工具
input="请帮我讲个笑话吧。"
)
print(response1.output_text)

2. 强制使用 Web 搜索

如果希望确保模型一定使用 Web 搜索(避免它仅使用内部知识回答),可以设置 tool_choice 参数

FENCE0

📌 作用

  • 让 Web 搜索始终执行,而不是让模型决定是否使用搜索工具。
  • 提升一致性,但可能会增加查询时间

3. 输出格式与引用

如果模型调用了 Web 搜索,API 响应将包含两部分

  1. Web 搜索调用的 ID
  2. 模型的回答,并带有网页来源的引用信息

📌 示例输出:

FENCE0

response
response.output
len(response.output)
response.output[0]
response.output[1]
response.output[1].content
response.output[1].content[0]
response.output[1].content[0].annotations
response.output[1].content[0].text

4. 指定位置搜索

Web 搜索可以根据用户的位置优化搜索结果。你可以指定:

  • country(国家):两字母 ISO 代码,如 "US"(美国)、"GB"(英国)。
  • city(城市):如 "London"(伦敦)。
  • region(地区):如 "California"(加州)。
  • timezone(时区):如 "America/Chicago"(芝加哥时间)。
response = client.responses.create(
model="gpt-4o",
tools=[{
"type": "web_search_preview",
"user_location": {
"type": "approximate",
"country": "CN",
"city": "Beijing",
"region": "Beijing",
}
}],
input="北京三里屯附近最好吃的餐厅有哪些?",
)
print(response.output_text)

  OpenAI Agents SDK 支持文件搜索功能,允许模型在生成回答之前检索用户上传的文件中的相关信息。

image-20250312090525528 image-20250314194727475 image-20250314195103591
vector_store = client.vector_stores.create(
name="test-file"
)
print(vector_store)
vector_store.id
  • 上传文档
image-20250314195802868 image-20250314195332931
# 准备上传到OpenAI的文件
file_paths = ["OpenAI Agents API翻译文档.md"]
file_streams = [open(path, "rb") for path in file_paths]
file_streams
file_batch = client.vector_stores.file_batches.upload_and_poll(
vector_store_id=vector_store.id, files=file_streams
)
print(file_batch.status)
print(file_batch.file_counts)
image-20250314194900218 image-20250314200244128

1. 文件搜索功能概述

file_search 工具可以让模型在已上传的文件知识库(vector stores)中进行语义搜索关键词搜索,从而扩展模型的内在知识。

📌 特点

  • 托管工具(由 OpenAI 负责管理,无需用户自行实现搜索逻辑)。
  • 自动调用:模型决定何时使用该工具进行检索。
  • 向量存储支持:通过创建向量存储并上传文件来增强模型的知识。

📌 相关概念

  • Vector Store(向量存储):一个可存储文本向量化数据的数据库,支持语义检索
  • Semantic Search(语义搜索):利用向量表示进行相似性匹配,而不仅仅是关键字匹配。

📌 学习更多:可参考 OpenAI Retrieval Guide(检索指南)

2. 使用文件搜索

在使用文件搜索前,用户需要:

  1. 创建向量存储(Vector Store)
  2. 上传文件到向量存储
  3. 在 API 调用中启用 file_search,并指定向量存储 ID

📌 ⚠️ 限制

  • 目前 一次搜索仅支持一个向量存储vector_store_ids 只能包含一个 ID)。

3.启用文件检索

response = client.responses.create(
model="gpt-4o-mini",
input="你知道OpenAI的responses API是什么么?",
tools=[{
"type": "file_search",
"vector_store_ids": ["vs_67d41ac1c3e08191ad00db04996b631f"] # 指定要搜索的向量存储
}]
)
print(response.output_text)

4. API 响应结构

file_search 工具被调用后,API 响应将包含两部分

  1. file_search_call:存储搜索请求的 ID 和查询内容。
  2. message:存储模型的回答,并包含文件引用信息(file citations)
response

📌 解析

  • file_search_call:存储搜索请求的 ID、状态和查询内容。

  • message

    • output_text:模型生成的文本。
    • annotations:提供引用文件信息,包括 file_idfilename,标明信息的来源。

让 API 响应包含搜索结果

response = client.responses.create(
model="gpt-4o-mini",
input="你知道OpenAI的responses API是什么么?",
tools=[{
"type": "file_search",
"vector_store_ids": ["vs_67d41ac1c3e08191ad00db04996b631f"]
}],
include=["output[*].file_search_call.search_results"]
)

📌 作用

  • include 参数指定要包含 search_results,以便直接获取搜索的原始数据。
print(response)
response.output_text

此时检索到的20个文档片段如下:

response.output[0].results

五、计算机使用(Computer Use)

  OpenAI 的 计算机使用代理(Computer-Using Agent, CUA) 允许模型模拟人在计算机上操作,例如点击、输入、滚动等,从而执行自动化任务。

image-20250312090619991

1. 概述

Computer Use(计算机使用) 是 OpenAI 提供的一种增强版 CUA(计算机使用代理),基于 computer-use-preview 模型,结合:

  • GPT-4o 的视觉能力(识别屏幕截图)
  • 高级推理能力(模拟计算机界面交互)

📌 特点

  • 允许模型执行计算机操作(如点击、输入文本、滚动页面)。
  • 通过截图感知界面变化,并决定下一步操作。
  • 可用于网页浏览、数据输入、在线购物、表单填写等任务

📌 当前状态

  • Beta 版,可能存在漏洞或错误。
  • 不适用于高安全性任务(如银行交易、个人账户管理)。
  • 必须符合 OpenAI 的使用政策

📌 适用 API

  • Responses API
  • 不适用于 Chat Completions

2. 工作原理

计算机使用工具的执行流程是一个循环(loop)

  1. 发送请求:用户提供目标任务(如“在 Bing 搜索 OpenAI 最新新闻”)。

  2. 接收响应

    • 模型可能返回计算机操作(computer_call)(如点击、输入)。
    • 也可能返回推理结果(reasoning)安全检查(safety_check)
  3. 执行操作:应用代码模拟操作,如点击、输入文本。

  4. 获取更新状态:执行操作后,截图当前界面并传回模型。

  5. 重复以上步骤,直到模型完成任务或用户停止。

📌 该流程适用于

  • 浏览器操作browser
  • 本地操作macwindowsubuntu

3. 环境设置

为了安全地运行 CUA(计算机使用代理),建议:

  • 使用隔离环境(sandbox),避免影响真实系统。
  • 创建本地虚拟机 以模拟计算机环境。

📌 示例环境

环境类型适用场景
本地浏览器网页自动化(如搜索、填表)
虚拟机(VM)安全测试,避免破坏主系统
云端实例远程执行自动化任务

本地环境设置方法如下:

如果希望以最小的配置尝试 Computer Use 工具,可以使用 PlaywrightSelenium 等浏览器自动化框架。

⚠️ 安全提示
在本地运行浏览器自动化框架 可能存在安全风险,建议按照以下方式进行安全防护:

推荐的安全设置

  1. 使用沙盒环境(sandboxed environment)
  2. 设置 env 为一个空对象,以避免暴露主机环境变量给浏览器
  3. 配置启动标志(flags),以禁用扩展程序和文件系统
  4. 启动浏览器实例

启动浏览器实例
示例:使用 Playwright 启动浏览器
安装 Playwright SDK

!pip install playwright
!playwright install chromium
import asyncio
from playwright.async_api import async_playwright
import nest_asyncio

# 允许 Jupyter Notebook 运行异步任务
nest_asyncio.apply()

async def run():
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False, # 设为 False 以可视化运行浏览器
args=[
"--disable-extensions", # 禁用扩展程序
"--disable-file-system" # 禁用文件系统访问
]
)
page = await browser.new_page()
await page.set_viewport_size({"width": 1024, "height": 768}) # 设置窗口大小
await page.goto("https://bing.com") # 访问 Bing 网站
await page.wait_for_timeout(10000) # 等待 10 秒
await browser.close() # 关闭浏览器

# 运行异步任务
asyncio.run(run())
20250314173603

4. CUA 集成流程

要在你的应用程序中集成 Computer Use 工具,你需要遵循以下步骤

1️⃣ 向模型发送请求(Send a request to the model)

  • 在请求中包含 Computer Use 工具,作为可用工具的一部分。
  • 指定显示尺寸(display size)和环境信息(environment)。
  • 可选:在首次请求中附加环境的初始状态截图,帮助模型理解当前界面。

2️⃣ 接收模型的响应(Receive a response from the model)

  • 检查模型返回的响应中是否包含 computer_call 项目。
  • computer_call 代表模型建议的下一步操作,例如:
    • 点击(clicking)指定位置
    • 输入文本(typing in text)
    • 滚动页面(scrolling)
    • 等待(waiting)

3️⃣ 执行请求的操作(Execute the requested action)

  • 通过代码在计算机或浏览器环境中执行模型建议的操作。

4️⃣ 捕获更新后的界面状态(Capture the updated state)

  • 执行操作后,截取当前界面的最新状态作为截图,用于下一步交互。

5️⃣ 循环执行(Repeat)

  • 更新后的状态作为 computer_call_output,并发送新的请求。
  • 继续这个循环交互,直到:
    • 模型不再请求新操作,或
    • 你决定终止执行
image-20250314164921138

具体代码执行流程如下:

🌟1. 向模型发送请求(Send a request to the model)

发送请求以创建 Response,使用 computer-use-preview 模型,并启用 computer_use_preview 工具。
该请求应包括 环境的详细信息,以及初始输入提示(input prompt)

📌 可选项
你可以 附加环境的初始状态截图,帮助模型更好地理解当前界面。

📌 注意
要使用 computer_use_preview 工具,必须将 truncation 参数 设置为 "auto"

(默认情况下,truncation 是禁用的)。

from openai import OpenAI
client = OpenAI()

response = client.responses.create(
model="computer-use-preview",
tools=[{
"type": "computer_use_preview",
"display_width": 1024,
"display_height": 768,
"environment": "browser" # other possible values: "mac", "windows", "ubuntu"
}],
input=[
{
"role": "user",
"content": "Check the latest OpenAI news on bing.com."
}
# Optional: include a screenshot of the initial state of the environment
# {
# type: "input_image",
# image_url: f"data:image/png;base64,{screenshot_base64}"
# }
],
reasoning={
"generate_summary": "concise",
},
truncation="auto"
)

print(response.output)

📌 效果

  • 该 API 请求会启动计算机代理,让它在 Bing 上搜索 OpenAI 新闻
  • 可选:传入界面截图(Base64 编码)以帮助模型理解当前环境。
🌟 2. 接收建议操作

模型的 API 响应可能包含:

  • 文本输出
  • 计算机操作(computer_call)
  • 其他工具调用

📌 示例:模型返回点击操作

FENCE0

📌 解析

  • computer_call:告诉应用程序执行点击操作(在 x=156, y=50)。
  • reasoning:提供推理过程(如果有)。
  • pending_safety_checks:如果存在安全检查,应用程序需要处理。
🌟 3. 执行操作

在 计算机或浏览器 环境中执行模型建议的操作。

📌 如何通过代码将 computer_call 映射到具体操作 取决于你的环境。

def handle_model_action(page, action):
"""
Given a computer action (e.g., click, double_click, scroll, etc.),
execute the corresponding operation on the Playwright page.
"""
action_type = action.type

try:
match action_type:

case "click":
x, y = action.x, action.y
button = action.button
print(f"Action: click at ({x}, {y}) with button '{button}'")
# Not handling things like middle click, etc.
if button != "left" and button != "right":
button = "left"
page.mouse.click(x, y, button=button)

case "scroll":
x, y = action.x, action.y
scroll_x, scroll_y = action.scroll_x, action.scroll_y
print(f"Action: scroll at ({x}, {y}) with offsets (scroll_x={scroll_x}, scroll_y={scroll_y})")
page.mouse.move(x, y)
page.evaluate(f"window.scrollBy({scroll_x}, {scroll_y})")

case "keypress":
keys = action.keys
for k in keys:
print(f"Action: keypress '{k}'")
# A simple mapping for common keys; expand as needed.
if k.lower() == "enter":
page.keyboard.press("Enter")
elif k.lower() == "space":
page.keyboard.press(" ")
else:
page.keyboard.press(k)

case "type":
text = action.text
print(f"Action: type text: {text}")
page.keyboard.type(text)

case "wait":
print(f"Action: wait")
time.sleep(2)

case "screenshot":
# Nothing to do as screenshot is taken at each turn
print(f"Action: screenshot")

# Handle other actions here

case _:
print(f"Unrecognized action: {action}")

except Exception as e:
print(f"Error handling action {action}: {e}")
🌟 4. 获取更新后的界面状态

执行操作后,截取当前环境的最新状态截图,以反映操作后的界面变化。

📌 注意

  • 截图的获取方式因环境不同而有所不同
  • 你需要根据具体环境选择合适的方法来捕获更新后的界面状态
def get_screenshot(page):
"""
Take a full-page screenshot using Playwright and return the image bytes.
"""
return page.screenshot()

📌 效果

  • 代码会截图当前屏幕,并将其作为 input_image 传给模型,继续执行任务。
🌟5. 循环执行(Repeat)

当你获取到 最新的截图 后,可以将其作为 computer_call_output 发送回模型,以获取下一步操作

📌 循环执行

  • 只要模型返回 computer_call 项目,就继续按照 「发送请求 → 执行操作 → 获取截图」 的流程重复执行,直到模型不再请求新操作
import time
import base64
from openai import OpenAI
client = OpenAI()

def computer_use_loop(instance, response):
"""
Run the loop that executes computer actions until no 'computer_call' is found.
"""
while True:
computer_calls = [item for item in response.output if item.type == "computer_call"]
if not computer_calls:
print("No computer call found. Output from model:")
for item in response.output:
print(item)
break # Exit when no computer calls are issued.

# We expect at most one computer call per response.
computer_call = computer_calls[0]
last_call_id = computer_call.call_id
action = computer_call.action

# Execute the action (function defined in step 3)
handle_model_action(instance, action)
time.sleep(1) # Allow time for changes to take effect.

# Take a screenshot after the action (function defined in step 4)
screenshot_bytes = get_screenshot(instance)
screenshot_base64 = base64.b64encode(screenshot_bytes).decode("utf-8")

# Send the screenshot back as a computer_call_output
response = client.responses.create(
model="computer-use-preview",
previous_response_id=response.id,
tools=[
{
"type": "computer_use_preview",
"display_width": 1024,
"display_height": 768,
"environment": "browser"
}
],
input=[
{
"call_id": last_call_id,
"type": "computer_call_output",
"output": {
"type": "input_image",
"image_url": f"data:image/png;base64,{screenshot_base64}"
}
}
],
truncation="auto"
)

return response
处理会话历史(Handling conversation history)

你可以使用 previous_response_id 参数,将当前请求与上一次响应关联。

  • 如果你不想自己管理会话历史,建议使用此方法。

📌 如果不使用 previous_response_id,请确保:

  • inputs 数组中包含 上一次请求返回的所有 response output 项目
  • 如果响应中包含 reasoning 项目,也需要一并包含。
确认安全检查(Acknowledge safety checks)

OpenAI 在 API 中实施了安全检查,以防止提示词注入(prompt injection)模型错误
这些安全检查包括:

1️⃣ 恶意指令检测(Malicious instruction detection)

  • 评估截图图像,检测是否存在对抗性内容,防止其改变模型行为。

2️⃣ 无关域名检测(Irrelevant domain detection)

  • 检查 current_url(如果提供),确定当前访问的域名是否与会话历史相关

3️⃣ 敏感域名检测(Sensitive domain detection)

  • 检查 current_url(如果提供),如果检测到访问了敏感域名,则会触发警告。

📌 如果触发上述一个或多个检查

  • 模型返回 computer_call 时,会附带 pending_safety_checks 参数,指示需要进行安全检查。

五、Computer Use功能展示

image-20250314170317504
  • 基本环境准备

FENCE0

  • 设置API-KEY

FENCE0

然后输入OPENAI_API_KEY="YOUR_API_KEY"

  • 调用测试

FENCE0

1741954666217

六、MateGen功能演示

Code AI Agent架构图

交互式智能编程助手MateGen

功能介绍与入门使用教程

image-20240812140533197

MateGen简介

  MateGen是一款由九天老师团队开发的交互式智能编程助手,可以在Python代码环境中运行,核心功能如下

  • 多轮对话与无限上下文记忆:可以在对话过程中逐渐深入理解你的需求,并长期记住上下文信息。
  • 基于RAG的本地知识库问答:支持在海量文本中进行高精度检索,围绕本地文本进行知识库问答。
  • 本地代码解释器:可以连接本地Python环境,编写和执行Python代码,辅助完成编程任务。
  • NL2SQL:能够连接本地MySQL环境,根据需求编写和执行SQL代码,帮助完成数据查询和提取任务。
  • 图像识别:可以处理用户提供的图片,并针对图片内容进行信息识别和回答问题。
  • 联网功能:可以在互联网、知乎或GitHub上搜索相关信息,回答用户提出的问题。
  • Kaggle竞赛辅导:能够搜索Kaggle竞赛相关信息,下载热门Kernel,并进行知识库问答,辅导参与竞赛。
  • 论文解读和数据分析报告编写:可以帮助解读学术论文或编写数据分析报告。

而在实际使用过程中,九天老师团队秉持实用性优先的原则设计的MateGen还具备如下特性:

  • 易用性:MateGen为在线Agent,无需任何网络工具和硬件门槛即可使用,各项功能不用进行参数设置,MateGen会自动根据用户需求开启不同功能;
  • 强悍的RAG系统:支持本地文件夹一键同步创建云端词向量数据库,且最大支持1000份文档、10G体量的文本搜索问答;
  • 复杂问题拆解与自动debug:面对复杂任务,MateGen会自动进行任务拆解,并在不同环节调用不同工具进行处理,同时,若部分环节运行出问题,MateGen会首先尝试自动优化运行流程,并在多次尝试无法解决问题时向用户寻求帮助;
  • 高效率Function calling:MateGen同时具备Multi Function calling(一个任务开启多个功能)和Parallel Function calling(一个功能开多个执行器),借此提高响应效率。

此外,欢迎大家观看《MateGen项目介绍》视频了解更多信息:

889303a0860f0e190639aa3a221971c

目前MateGen已在GitHub上线,欢迎大家关注点星:https://github.com/fufankeji/MateGen


一、MateGen下载与API-KEY获取

1.虚拟环境创建与MateGen安装

  MateGen安装非常简单,可以直接通过pip install mategen进行安装,需要注意的是,MateGen运行所需依赖较多,因此推荐借助虚拟环境进行安装。首先创建一个名为mategen的虚拟环境:
FENCE0 并且将这个虚拟环境添加到Jupyter的Kernel列表中: FENCE1

若要更新MateGen,则可输入如下命令: FENCE0

以上代码需要在命令行环境中运行

然后在Jupyter的Kernel中选择mategen,即可进入到对应虚拟环境运行MateGen:

image-20240706230000498

然后运行如下代码测试是否安装成功:

!pip install mategen
import MateGen
from MateGen import *

安装后按照如下方式导入即可:

# 查看MateGen版本号
MateGen.__version__

注:最新版本可能随时发生变化,大家安装最新版即可。

2.MateGen API-KEY获取

  本部分公开课仅作演示,实际内容为付费课程案例之一:《2025大模型Agent智能体开发实战》(3月DeepSeek强化班)

31fd4bb178cc3d19456a042bfe7b0a6 d51f834cad2816b56f9b708f32cdd6f

二、MateGen对话功能与本地知识库问答功能介绍

  • MateGen实例化

  MateGen的调用流程和sklearn模型调用流程类似,都是先需要实例化一个MateGen聊天机器人,然后再执行对话。实例化过程如下:

mategen = MateGenClass(api_key = openai_api_key)

每个新的API-KEY实例化MateGen时,需要同步基础指令和调度流程等,因此需要等待一小段时间。此后若不更换API-KEY,则无需重复这个流程。

  • 增强模式

  MateGen支持两种运行模式,普通模式与增强模式,开启增强模式时MateGen会有更强的性能表现,但同时也会有更长的响应时间以及更高昂的费用。默认情况下MateGen以普通模式运行,当设置参数enhanced_mode为True时则开启增强模式:

mategen = MateGenClass(api_key = 'YOUR_API_KEY',
enhanced_mode = True)

帮助文档的各项实验均基于增强模式运行得到的结果。

1.MateGen基础对话功能介绍

  • MateGen对话方式与无限上下文

  我们可以使用MateGen.chat()的方式开启对话,MateGen支持单次对话和多次对话两种模式,无论哪种模式,MateGen都具备多轮对话记忆以及拥有无限对话上下文。用户无需担心多轮对话内容总量超出模型最大对话上下文,MateGen会根据用户对话情况,智能截取聊天内容带入模型,并且采用时间衰减和未知信息增加权重等策略,实现无限上下文。

  当MateGen.chat()带入对话文本时,即可实现单次对话:

mategen.chat("你好,很高兴见到你!")

而若不带入对话文本,则可以实现多轮对话:

mategen.chat()

并且随时开启MateGen,都拥有多轮对话记忆:

mategen.chat('好的,请问我的上一个问题是?')

甚至当我们删除MateGen或重启代码环境,MateGen仍然可以读取保存在服务器上的对话记录,实现多轮对话:

del mategen
mategen = MateGenClass(api_key = 'YOUR_API_KEY')
mategen.chat("请你帮我总结下咱俩之前的对话内容。")
  • 清理消息

  若不想保存历史消息,也可调用mategen.clear_messages()清理历史消息:

mategen.clear_messages()
  • token消耗统计

  同时,无论是否清理消息,MateGen都能实时统计token消耗总量。

mategen.print_usage()

本地token技术可能会因为硬件环境变化而统计有误,实际每个MateGen的token消耗量都会由服务器进行更加准确的统计。

2.借助MateGen进行本地知识库问答

  MateGen自带先进的知识库检索(RAG)功能,能够围绕海量文本进行高精度检索问答、文本总结、文本翻译改写等。MateGen为每位用户提供了10G的在线文档存储空间,允许用户上传1000份文档,并且可以围绕PDF、md、ppt、word、txt等主流文档格式进行词向量化存储和读取。在设置了知识库问答的时候,MateGen会根据用户提问,自动判断是否需要进行知识库检索,并不会强制检索再进行回答

2.1 设置本地知识库地址

  MateGen的知识库问答允许用户把本地文件夹的内容批量上传,同时允许创建多个知识库(一个文件夹对应一个知识库),并且可以在问答过程随时切换知识库。首次开启知识库问答之前建议先设置本地知识库的根目录地址,便于存储各个知识库文件夹,若不设置,则MateGen会默认在系统根目录下创建一个知识库文件夹。

  我们可以借助如下函数指定知识库根目录地址,例如我们设置E盘下work文件夹为知识库根目录地址:

mategen.set_knowledge_base_url('E:\\work')

注意,Windows下需要通过两个反斜杠来表示文件夹层级关系。修改知识库地址之后,需要重启Jupyter才能生效。

2.2 开启知识库对话

  设置完成后即可开启知识库问答,首次开启知识库问答时需要输入知识库名称,例如此处创建一个名为'OpenML'的知识库:

mategen = MateGenClass(api_key = 'YOUR_API_KEY',
knowledge_base_chat=True)

注,此处我们重新实例化了一个MateGen,但正如此前所说,MateGen并不会因为重新实例化而丢失多轮对话记忆,这个实例化过程也可以看成是重新设置参数的过程。

然后即可在E:\work下查看知识库地址,目前知识库地址为E:\work\knowledge_base\OpenML,其中knowledge_base是知识库根目录:

image-20240707152757132

接下来我们将九天老师机器学习公开课课件全部放进去,公开课课件总共636页,属于海量文本专业知识检索:

image-20240707153507902

MateGen知识库问答测试文档下载:链接:https://pan.baidu.com/s/1Gn7vpDHWQYp_x601r5R4yQ?pwd=sst0 提取码:sst0

当然,哪怕是开启了知识库,MateGen也会根据用户提问的内容,决定是否进行知识库检索:

  • 自主判断是否需要检索
# 提一个机器学习之外的问题
mategen.chat('请帮我简单介绍下Transformer基本原理')

接下来进一步测试MateGen RAG性能。我们分别从专业知识点(类似大海捞针)、大规模文本总结以及情感判断分析三个方面测试MateGen的RAG性能:

  • 知识点提取

首次围绕某知识库对话,系统会先上传知识库文档,并进行词向量化处理,因此首次开启对话会略微耗费一点时间,之后再次开启对话则无需再次进行词向量化处理。

# 专业知识点提取
mategen.chat('请帮我检索下知识库,并详细总结Mini Batch K-Means聚类算法的建模流程。')
  • 海量文本总结
# 海量文本总结
mategen.chat('现在你的知识库OpenML包含的文档,是九天老师机器学习公开课课件。请帮我总结下,九天老师在公开课中讲解了几种决策树算法呢?')
  • 情感判别
mategen.chat('根据知识库所存储的课件,你觉得九天老师的机器学习公开课质量如何?')

  不难看出**MateGen的RAG系统稳定高效,适合各种问答场景。**除了日常问答外,带有课件知识库的MateGen还可以进行教学辅导,例如指导学生课前预习、课中答疑、课后复习等。

2.3 更新知识库

  对于相同的知识库,若想增删一些文件,可以先在本地文件夹内操作,然后再调用upload_knowledge_base更新知识库即可:

mategen.upload_knowledge_base(knowledge_base_name='OpenML')

2.4 切换知识库问答

  MateGen还支持随时切换知识库进行问答。例如此时我们再创建一个知识库,用于存储MateGen的使用指南文档:

mategen = MateGenClass(api_key = 'YOUR_API_KEY',
knowledge_base_chat=True)

系统会自动创建MateGen文件夹:

image-20240707155027222

我们在MateGen文件夹中放置MateGen使用指南:

image-20240707155211341

然后开启对话,这里需要注意的是,在切换知识库后,我们需要先清理MateGen历史对话消息,以免历史对话消息影响后续RAG质量:

mategen.clear_messages()

清理完历史消息后再进行知识库问答:

mategen.chat('请检索你的知识库,并告诉我MateGen应该如何查看token消耗情况。')

  然后随时可以切换回OpenML知识库进行问答,我们可以直接输入0,然后在知识库序号中选择OpenML进行问答即可:

mategen = MateGenClass(api_key = 'YOUR_API_KEY',
knowledge_base_chat=True)
mategen.chat('请检索你的知识库,并帮我介绍下网格搜索优化算法的优劣势')

并且由于MateGen本身是无限对话长度,因此哪怕现在没有调用MateGen使用方法知识库,但MateGen仍然可以读取此前对话记忆进行回答:

mategen.chat('很好,你是否还记得MateGen应该如何查看token消耗来着?')

2.5 取消知识库问答

  关闭知识库问答功能也非常简单,再次实例化MateGen,并取消knowledge_base_chat设置:

mategen = MateGenClass(api_key = 'YOUR_API_KEY')
mategen.clear_messages()

3.借助MateGen实现NL2SQL

  MateGen可以连接MySQL数据库,并且可以稳定高效实现NL2SQL。无需额外手动设置,当系统检测到用户需要进行数据库相关操作时,MateGen就会自动开启NL2SQL功能,完成SQL代码编写和运行:

  • 输入数据库基本参数
mategen.chat('请帮我查看当前数据库中,总共有几张表。')
mategen.chat('好的,host:localhost,port:3306,ueser:root,password:19920229,database name:telco_db')

目前MateGen只支持MySQL数据库,更多数据库种类连接方式正在开发中。

  • 数据库查询
mategen.chat('请帮我查看下,这八张表中,四个不带_new尾缀的数据集,数据量是否相同。')
  • 数据查询
mategen.chat('你做得很好,接下来请帮我在user_payments表中,查看月消费金额最高的用户ID,以及对应的总消费金额是多少。')
  • 数据读取
mategen.chat('很好,接下来请帮我将user_churn表读取到当前文件夹中,并命名为user_churn.csv')

然后即可在当前代码运行文件夹内找到这个数据集:

image-20240707174225784

4.借助MateGen实现NL2Python:本地代码解释器实现流程

  MateGen还可以实现NL2Python,可以连接本地Python环境进行自动编程,进而辅助用户完成数据读取、数据预处理、数据建模、数据可视化等事项。

  • 读取数据集
mategen.chat('好的,接下来请帮我将当前文件夹内的user_churn.csv读取到当前Python环境中。')

然后我们即可在当前操作空间中查看读取到的数据集:

# 更新命名空间,即可在本地调用代码操作结果
globals().update(MateGen.export_variables())
user_churn_df.head()
  • 数据可视化
mategen.chat('好的,请用可视化的方式帮我分析下Churn字段的取值分布。')

  这里需要注意,当涉及到绘图任务的时候,若设置了阿里云图床,则MateGen会自动将图片上传至oss图床,并保存每张图片的公开访问网址,方便后续组合图片形成数据分析报告。

在没有图床的情况下MateGen绘图功能也可正常使用,阿里云oss图床设置方法见下文《MateGen联网方式设置》部分。

除了可以进行数据清洗和数据可视化相关工作之外,MateGen还可以来进行机器学习建模或深度学习建模等复杂编程任务,并且,若带入企业代码库文档,MateGen还可以模仿企业代码习惯来进行编程。

5.MateGen复杂任务规划执行与自动debug功能

  截止目前,我们介绍了MateGen的知识库问答、NL2SQL和NL2Python等功能,在继续介绍MateGen其他进阶功能之前,需要说明的是,MateGen的各项功能支持组合使用。当面对复杂任务的时候,MateGen会自动组合各项功能来构建执行流程,自动逐步执行任务,同时每一步遇到了任何问题都会自动debug。

  • NL2SQL+NL2Python联动

  例如,我们可以让MateGen直接从MySQL中读取数据集到Python中并本地进行保存,这个简单的例子中就涉及到NL2SQL和NL2Python两个功能的串联实现。

mategen.chat('接下来请帮我将数据库中user_payments读取到当前Python环境中,并在当前文件夹中保存一份user_payments.csv文件')
  • 知识库问答+NL2SQL+NL2Python

  同时,MateGen也支持在任何处理的环节即时查询知识库,这里我们创建一个telco_db知识库,然后保存一份md文件,其中包含了各数据集字段信息和重要字段列表。我们尝试让MateGen先读取这个知识库,获取重要字段列表信息,然后再从各个数据集中获取重要字段列表组成一个新的数据集,并读取到本地:

mategen = MateGenClass(api_key = 'YOUR_API_KEY',
knowledge_base_chat=True)

其中telco_db文件夹中放置如下文件:

image-20240707211246277

其中telco_data_dictionary内容包含了数据库中每个数据集中所包含的字段情况、以及重要字段说明如下:

image-20240707211336385

接下来让MateGen在这一系列数据集中提取关键字段:

mategen.chat('请查阅你的知识库,确认数据集中最重要的字段,并帮我从不带尾缀_new的几张表中,挑选这些字段组成一张新的表,并保存在MySQL中,取名为telco')

上述流程中,不仅涉及到RAG、NL2SQL、NL2Python,还涉及到自动debug过程,上述过程中第一次将新数据集写入MySQL时遇到了缺失值、第二次操作时由遇到了重名数据集、第三次才顺利将数据集写入。

MateGen会即时自主根据执行结果来调整执行流程,若反复多次都无法尝试成功,并不会无限尝试下去,而是会向用户求助。

然后即可查看当前操作空间中是否已经顺利读取该数据集:

# 更新命名空间,即可在本地调用代码操作结果
globals().update(MateGen.export_variables())
telco_df.head()

数据集中关键字段和知识库中列举关键字段一致:

telco_df.columns
image-20240707211928265

数据库中也成功保存了telco数据集:

image-20240707212050570

除此之外,MateGen还支持Multi Function calling(一个任务开启多个功能)和Parallel Function calling(一个功能开多个执行器),借此提高响应效率。

mategen.clear_messages()

6.MateGen视觉能力

  MateGen具备视觉能力,只需要在提问时附带图片连接,就可以调用MateGen的视觉能力、围绕图片进行识别再进行回答:

image-20240707212637973
mategen.chat('请帮我描述下这张图片上的内容:https://ml2022.oss-cn-hangzhou.aliyuncs.com/img/image-20240707212637973.png')
  • MateGen视觉+NL2Python联动

  同样,MateGen的视觉功能可以和别的功能联动,例如我们可以给MateGen输入一张图片,然后让其模仿绘制一张新的图,并且可以直接通过对话来修改图片。例如有张图片如下:

image-20240630215206479

接下来让MateGen先读取该图片,再借助其Python代码解释器,绘制一张一样的图片。

mategen.chat('请帮我描述下这张图片上的内容:https://ml2022.oss-cn-hangzhou.aliyuncs.com/fig_b92cda8f15534922a7ef72ff329146fb.png')
mategen.chat('非常好!现在,请基于你对这张图片的理解,使用Python代码帮我创建一组数据,使其满足图片上的数据分布,并编写一段Python绘图代码,绘制类似的图片,并直接运行你编写的代码。')
image-20240630215206479

可以看出基本能够对原图进行模仿绘制。接下来尝试对其进行修改,同样,我们让MateGen先参考一张图的配色,然后修改原图。参考图片如下:

image-20240701222610915
mategen.chat('我觉这张图片颜色不够好看,请帮我参考这张图片上的主配色:https://ml2022.oss-cn-hangzhou.aliyuncs.com/img/image-20240701222610915.png,调整原图配色。')
image-20240701223909424

7.MateGen联网能力

注意,由于MateGen会借助爬虫爬取公开数据,爬虫需要用到的cookies经常会失效,因此以下功能不一定能顺利运行,推荐先使用check_network_environment()函数测试下各项联网功能能否正常运行,并使用internet_config_assistant()获取联网设置帮助,并将自己的cookie输入作为参数,以便顺利实现联网功能。

7.1 MateGen联网功能实现

  MateGen自带联网功能,当用户的问题超出MateGen知识库时,MategGen就会开启联网功能,从互联网上获取答案。MateGen的互联网搜索由谷歌搜索API驱动(但无需联网工具即可使用),会从知乎、Github获取相关信息,更适合获取技术相关信息。同时,MateGen还可以调用Kaggle API,若用户有需求,可以从Kaggle上获取竞赛说明和热门Kernel方案构建知识库再来进行问答。

mategen.chat('请帮我介绍下阿里云最新发布的Qwen2大模型。')
mategen.chat('Qwen2可以用vLLM部署么?流程是什么样的呢?')

  搜索问答的本质是爬取信息创建本地知识库,然后再进行回答,只要开启搜索就会创建一个临时文件夹,并取名为auto_search,保存在knowledge_base中:

image-20240701231035060

若有需要,也可以将其设置为永久知识库。

7.2 MateGen Kaggle竞赛辅导功能

  除了能够适时开启联网功能并进行搜索问答外,MateGen还专门围绕Kaggle竞赛信息获取进行了优化。当用户希望了解某项竞赛信息时,只需要在MateGen参数位上输入kaggle_competition_guidance=True即可,并在弹出的对话框中输入感兴趣的Kaggle竞赛名称,MateGen就会自动使用Kaggle API,获取该项比赛的Overview(概览信息)、Data(数据集信息)以及热门Kernels(其他参赛者热门竞赛方案),并在本地创建竞赛同名知识库,并自动开启围绕当前竞赛知识库的问答功能。例如我们想要了解Kaggle上的一项名为House Prices - Advanced Regression Techniques比赛,即可按照如下方式执行:

image-20240702004111331
mategen = MateGenClass(api_key=api_key,
kaggle_competition_guidance=True)

此时当前竞赛的本地知识库位置如下:

image-20240702005129111

获取的竞赛知识库文件如下,其中包含了比赛介绍、数据集介绍和热门竞赛方案:

image-20240702005219380

接下来MateGen会自动带入该知识库进行问答,从而顺利完成竞赛辅导工作:

mategen.chat('请检索知识库,帮我详细介绍下House Prices这个竞赛')
mategen.chat('在你的知识库中,有什么比较精彩的高分竞赛方案么?能帮我分享下他们的思路么?')

image-20250314202908080

2025年3月11号,OpenAI召开发布会,正式发布全新一代底层调用API:Responses API,并计划在未来一段时间,逐渐代替Chat.Completion API,在如今OpenAI的大模型调用方法已成为业内标准的今天,这一次更新,无疑将对未来的大模型开发生态带来重大影响。

  随着发布会一同发布的,还有三项Agent tools和一个开源Agent SDK,分别是:

  • Web Search:允许用户联网搜索相关信息;
  • File Search:允许用户将文件上传到OpenAI服务器上,并在模型对话时,实时对其进行检索;
  • computer use:允许用户借助大模型功能,来操作当前电脑或浏览器。
  • Agent SDK:swarm的升级版,一个开源的Multi-Agent开发框架。

对此,我曾专门录制视频进行入门介绍,感兴趣的同学可以戳此观看:https://www.bilibili.com/video/BV1SVQEYqERV/

image-20250314193607274
!pip install openai
import openai
openai.__version__
from openai import OpenAI
  • 传统chat.completion API调用方法回顾
openai_api_key = "YOUR_API_KEY"
base_url = "国内反向代理地址"
# 实例化客户端
client = OpenAI(api_key=openai_api_key,
base_url=base_url)
# 调用 GPT-4o-mini 模型
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "你好,好久不见!"}
]
)
response
  • Agent SDK安装流程
!pip install openai-agents
from agents import Agent, Runner
Agent?
Runner?

一、各类模型&服务接入Agent SDK流程

1.OpenAI+国内反向代理地址接入Agent SDK

from openai import AsyncOpenAI
from agents import OpenAIChatCompletionsModel,Agent,Runner
from agents.model_settings import ModelSettings
from agents import set_default_openai_client, set_tracing_disabled
external_client = AsyncOpenAI(
base_url = base_url,
api_key=openai_api_key,
)
set_default_openai_client(external_client)
set_tracing_disabled(True)
agent = Agent(name="Assistant", instructions="你是一名助人为乐的助手。")
result = await Runner.run(agent, "请写一首关于编程中递归的俳句。")

俳(pái)句。

print(result.final_output)

2.DeepSeek在线API接入流程

  • 测试API能否连接
ds_api_key = 'YOUR_DS_API'
# 实例化客户端
client = OpenAI(api_key=ds_api_key,
base_url="https://api.deepseek.com")
# 调用 deepseekv3 模型
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": "你好,好久不见!请介绍下你自己。"}
]
)
# 输出生成的响应内容
print(response.choices[0].message.content)
  • 测试接入Agent SDK
external_client = AsyncOpenAI(
base_url = "https://api.deepseek.com",
api_key=ds_api_key,
)
set_default_openai_client(external_client)
set_tracing_disabled(True)
agent = Agent(name="Assistant",
instructions="你是一名助人为乐的助手。",
model=OpenAIChatCompletionsModel(
model="deepseek-chat",
openai_client=external_client,
))
result = await Runner.run(agent, "请写一首关于编程中递归的俳句。")
print(result.final_output)

3.ollama+本地模型接入流程

这里选择QwQ模型作为本地模型进行接入测试,更多QwQ模型本地部署与调用介绍,详见:https://www.bilibili.com/video/BV1hZRTYUEtR/

image-20250314203453865

这里需要先启动后台ollama服务,然后进行连接测试

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='qwq-32b-bnb',
)

print(response.choices[0].message.content)
  • 测试接入Agent SDK
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="qwq-32b-bnb",
openai_client=external_client,
))
result = await Runner.run(agent, "请写一首关于编程中递归的俳句。")
print(result.final_output)
  • Function calling功能测试
ollama_model=OpenAIChatCompletionsModel(
model="qwq",
openai_client=external_client,
)
# 定义代理(Agents)
chinese_agent = Agent(
name="Chinese agent",
instructions="你只能用中文进行回答",
model=ollama_model
)

english_agent = Agent(
name="English agent",
instructions="你只能用英文进行回答",
model=ollama_model
)

triage_agent = Agent(
name="Triage agent",
instructions="根据请求的语言,将任务交给合适的代理。",
handoffs=[chinese_agent, english_agent],
model=ollama_model
)

result = await Runner.run(triage_agent, input="你好,好久不见!")
print(result.final_output)
result = await Runner.run(triage_agent, input="Hello, how are you?")
print(result.final_output)
import requests,json
def get_weather(loc):
"""
查询即时天气函数
:param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\
注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则loc参数需要输入'Beijing';
:return:OpenWeather API查询即时天气的结果,具体URL请求地址为:https://api.openweathermap.org/data/2.5/weather\
返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息
"""
# Step 1.构建请求
url = "https://api.openweathermap.org/data/2.5/weather"

# Step 2.设置查询参数
params = {
"q": loc,
"appid": open_weather_key, # 输入API key
"units": "metric", # 使用摄氏度而不是华氏度
"lang":"zh_cn" # 输出语言为简体中文
}

# Step 3.发送GET请求
response = requests.get(url, params=params)

# Step 4.解析响应
data = response.json()
return json.dumps(data)
get_weather("Beijing")
import asyncio
from agents import Agent, Runner, function_tool
@function_tool
def get_weather(loc):
"""
查询即时天气函数
:param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\
注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则loc参数需要输入'Beijing';
:return:OpenWeather API查询即时天气的结果,具体URL请求地址为:https://api.openweathermap.org/data/2.5/weather\
返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息
"""
# Step 1.构建请求
url = "https://api.openweathermap.org/data/2.5/weather"

# Step 2.设置查询参数
params = {
"q": loc,
"appid": open_weather_key, # 输入API key
"units": "metric", # 使用摄氏度而不是华氏度
"lang":"zh_cn" # 输出语言为简体中文
}

# Step 3.发送GET请求
response = requests.get(url, params=params)

# Step 4.解析响应
data = response.json()
return json.dumps(data)
# 创建一个代理,并添加 `get_weather` 工具
agent = Agent(
name="Hello world",
instructions="You are a helpful agent.",
tools=[get_weather],
model=ollama_model
)
result = await Runner.run(agent, input="你好,请问今天北京天气如何?")
print(result.final_output)

能够发现,各项功能能顺利实现,接下来进入到正式的功能介绍中。为了便于大家运行,这里统一使用deepseek在线API为基础模型进行调用,类似的可以将其更换为ollama模型等。