把 openai 的 agents 运行起来可真费劲
最近看各种 agent 框架有点上头,查看openai 自己的agent 框架文档时,觉得好简单,于是就想实践一下,可是真正操作起来却是困难重重。。。
下面记录一下遇到的各种问题。
以下代码是在官方文档的基础之上稍微做了一些修改。 首先就是更换国内的模型,我这里是用的是qwen-max。
然后将api_key 存到 .env 文件中
| OPENAI_API_KEY=sk-xxxxx
OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
|
安装依赖
新建main.py 文件,写入以下代码。
| from agents import Agent, Runner
import anyio
from dotenv import load_dotenv
load_dotenv()
history_tutor_agent = Agent(
name="History Tutor",
model="qwen-max",
handoff_description="你是一个历史和地理专家,你帮助学生回答历史和地理问题。",
instructions="您为历史查询提供帮助。清楚地解释重要事件和背景",
)
math_tutor_agent = Agent(
name="Math Tutor",
model="qwen-max",
handoff_description="数学问题的专家代理",
instructions="你在数学问题上提供帮助。解释你每一步的推理,并举例说明",
)
triage_agent = Agent(
name="Triage Agent",
model="qwen-plus",
instructions="You determine which agent to use based on the user's homework question",
handoffs=[history_tutor_agent, math_tutor_agent]
)
async def main():
result = await Runner.run(triage_agent, "法国的首都是什么?")
print(result.final_output)
if __name__ == "__main__":
anyio.run(main)
|
上面的agent 代码很简单,就是创建两个 agent , 一个用于回答历史和地理问题,一个用于回答数学问题。
然后再创建一个协调器 agent,它用了一个名词 Handoffs, 也就是将任务交接给哪个agent 来执行。
openai 的 agents 框架用一个Runner 来运行,如这里问
法国的首都是什么?
按照框架的以及大模型的预期结果,应该 Handoff 到 history_tutor_agent ,然后给出回答。
可是第一步就运行出错了!
默认请求的路径问题
| Error getting response: Error code: 404. (request_id: None)
|
这就新鲜了,以前用阿里的qwen 模型,OPENAI_BASE_URL 一直都没有变,怎么就404了呢,于是我尝试打印到底请求了哪个url
| {
"method": "post",
"url": "/responses",
"headers": {
"User-Agent": "Agents/Python 0.0.15"
},
"json_data": {
...
}
}
|
| DEBUG:openai._base_client:Sending HTTP Request: POST https://dashscope.aliyuncs.com/compatible-mode/v1/responses
|
这里怎么请求的是 /responses
了? 而不是之前一直请求的 /chat/completions
了?
查看文档
OpenAI Responses是OpenAI为利用内置工具构建Agent推出的新API, 它结合了Chat Completions的易用性和Assistants API的工具调用能力,为开发者构建具备Agent能力的应用提供了更灵活的基础。 它内置了一些工具如 网络搜索,文件搜索,计算机使用工具
调用的时候使用 client.responses.create
| from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-4.1",
input="Write a one-sentence bedtime story about a unicorn."
)
print(response.output_text)
|
以往调用对话接口使用的是 client.chat.completions.create
| client.chat.completions.create(
model="qwen-max",
messages=[
{"role": "user", "content": "法国的首都是什么?"}
]
)
|
这里openai agents 默认使用的是 responses api, 现在还很少有供应商提供responses 接口。
好在agents 框架提供了设置接口的方法 :
| from agents import set_default_openai_api
set_default_openai_api("chat_completions")
|
使用 set_default_openai_api("chat_completions")
设置模型调用api 为 chat_completions
。
再次运行脚本,这次可以得到大模型的正常回复了, 但是又报了另外一个错误
| 法国的首都是巴黎。虽然这不是一个历史事件,但巴黎作为首都的历史可以追溯到公元前3世纪,当时它是凯尔特人的一个小渔村。随后,在罗马帝国时期发展成为一个重要的城市,并且从中世纪开始一直作为法国的政治、经济和文化中心。如果你对巴黎或者法国历史有更具体的问题,我很乐意提供帮助!
INFO:httpx:HTTP Request: POST https://api.openai.com/v1/traces/ingest "HTTP/1.1 403 Forbidden"
ERROR:openai.agents:[non-fatal] Tracing client error 403: {"error":{"code":"unsupported_country_region_territory","message":"Country, region, or territory not supported","param":null,"type":"request_forbidden"}}
|
agents 又去请求了 https://api.openai.com/v1/traces/ingest
这个url,我现在使用的是阿里千问平台的key, 请求openai 的接口肯定是不行的,这个接口又是干啥的?
屏蔽掉 Traces
Traces 为 Agents SDK 包含的内置跟踪功能,可收集代理运行期间的事件全面记录:LLM 生成、工具调用、交接、防护措施,甚至发生的自定义事件。使用Traces 仪表板,用户可以在开发和生产过程中调试、可视化和监控您的工作流程。

有点类似于langsmith, 这个默认也是开启的,但是目前我还用不到,看着这个报错有点难受,就想关了吧,官方文档上有介绍两种方法可以关闭
1. 设置环境变量 OPENAI_AGENTS_DISABLE_TRACING=1
2. 设置 agents.run.RunConfig.tracing_disabled = True
遗憾的是,这两种方法我测试都不行,最后在官方github issues 下面看到一个方法
| from agents import set_tracing_disabled
set_tracing_disabled(True)
|
使用 set_tracing_disabled(True)
最终关掉了Traces 。
中文模型问题
最开始我使用的是 qwen-plus
模型,由于我将agent 中的 handoff_description 和 instructions 翻译成了中文,结果使用 qwen-plus
模型会报错,最后切换成 qwen-max
才可行
最终的代码为:
| from agents import Agent, Runner
import anyio
from agents import set_tracing_disabled
from agents import set_default_openai_api
from dotenv import load_dotenv
load_dotenv()
set_tracing_disabled(True)
set_default_openai_api("chat_completions")
# 以下代码相同,省略
|
总结
本文解决了初次使用 openai agents 框架所遇到的三个问题
1. 修改默认 /responses
接口为 /chat/completions
2. 通过 agents.run.RunConfig.tracing_disabled = True
关掉默认的Traces
3. 使用更加强大的 qwen-max 模型处理中文问题