跳转至

把 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

安装依赖

uv add openai-agents

新建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

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
client.chat.completions.create(
    model="qwen-max",
    messages=[
        {"role": "user", "content": "法国的首都是什么?"}
    ]
)

这里openai agents 默认使用的是 responses api, 现在还很少有供应商提供responses 接口。

好在agents 框架提供了设置接口的方法 :

1
2
3
from agents import set_default_openai_api

set_default_openai_api("chat_completions")

使用 set_default_openai_api("chat_completions") 设置模型调用api 为 chat_completions

再次运行脚本,这次可以得到大模型的正常回复了, 但是又报了另外一个错误

1
2
3
法国的首都是巴黎。虽然这不是一个历史事件,但巴黎作为首都的历史可以追溯到公元前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 模型处理中文问题