通过 OpenAILike 把 Agno Agent 接到 Router One
Agno 在你的应用中运行 Agent、工具和团队。OpenAILike 把其中的 Chat Completions 请求发给 Router One,Agent 循环、状态与工具执行仍由 Agno 负责。本指南基于 Agno 3.1.1 的 OpenAILike Chat Completions 适配器,并于 2026-10-09 按 Agno 3.1.2 源码(2026 年 10 月 8 日发布)复核:OpenAILike 的默认值与 openai:<model-id> 简写的解析都没有变化。
安装 客户端,并显式 设置两个 变量
在 Python 环境中安装 agno 和 openai。为这个 Agent 创建专用 Router One Key,并在控制台设置 maxSpend。ROUTER_ONE_MODEL 填 /models 中当前可用的聊天模型完整 ID,保留厂商前缀。先运行下方不带工具的示例,再逐步加入应用逻辑。
python -m pip install "agno==3.1.1" openai export ROUTER_ONE_API_KEY="sk-your-router-one-key" export ROUTER_ONE_MODEL="<exact-model-id-from-/models>" python agent.py
把 Agno 配置到 Router One base URL
从 agno.models.openai.like 导入 OpenAILike,把模型实例传给 Agent。base_url 填 https://api.router.one/v1,显式传入 api_key,id 填精确目录 ID。OpenAILike 原样发送 id:anthropic/claude-sonnet-5 前面不需要再加 openai/ 或 custom/。首次运行的示例关闭 SDK、模型层和指导性重试,方便核对请求次数。成功后可改用 agent.print_response("Say hello in one sentence.", stream=True) 开启流式;这个适配器会自动请求 stream_options.include_usage。
from os import environ
from agno.agent import Agent
from agno.models.openai.like import OpenAILike
agent = Agent(
model=OpenAILike(
id=environ["ROUTER_ONE_MODEL"],
api_key=environ["ROUTER_ONE_API_KEY"],
base_url="https://api.router.one/v1",
max_retries=0,
retries=0,
retry_with_guidance=False,
),
)
agent.print_response("Say hello in one sentence.")模型类 决定 请求 协议
Agno 3.1.1 会把 openai:<model-id> 这样的字符串简写解析为 OpenAIResponses,而不是 OpenAILike。简写中的前缀选择适配器,与 openai/gpt-5.5 这样的 Router One 模型 ID 是两回事。本指南走 Chat Completions,因此显式构造 OpenAILike 实例。若主动换成 OpenAIResponses 或 OpenResponses,先确认所选模型及需要的功能支持 /v1/responses。模型 ID 不变,换一个类也可能改变请求端点。
分别 核对 Agent 运行与 模型 请求 次数
一次 Agent 运行可能在每次工具结果返回后继续调用模型。tool_call_limit 限制工具执行次数,不是 token 预算,也不限制每一种模型请求。重试也分层:max_retries 属于 OpenAI 客户端,model.retries 重发模型请求,Agent.retries 则可能重跑整个运行过程。加入会修改外部状态的工具之前,应先明确这些设置。使用带消费上限的专用 Key,再按模型、时间、tokens 和 request_id 与控制台 → 日志核对;Agno 的 metrics 是用量报告,不是 Router One 的结算金额。仅凭没有日志不能证明请求没到网关:尚待定价的记录可能暂时不展示。
知识库的 Embedding 要单独 配置
修改 Agent.model 不会顺带改掉知识库或它的 embedder。例如 Agno 官方 PgVector 示例单独配置 OpenAIEmbedder,与 Agent 模型是两个客户端。Embedding 保留在本地模型或提供该接口的供应商上;Router One 没有 /v1/embeddings。文档、检索、会话存储与工具执行仍在你的 Agno 应用中。如果另配 reasoning、parser 或 output model,也要分别指定连接参数,它们会发起额外模型请求。
Agno 该填 哪个 模型 ID?
从 /models 页复制精确的模型 ID,保留大小写、连字符和版本后缀,不要用展示名称代替。打开该模型的详情页,核对支持的 API 端点、上下文窗口和工具调用等能力,再与 Agno 当前选择的 provider 和功能对应。模型出现在目录里,不等于当前客户端能调用它的所有功能。建议为每个客户端或应用单独建 API Key,并设置 maxSpend 消费上限。
Agno 用的是哪种 API 协议?
OpenAI 兼容描述的是接口格式,不能据此推断 Chat Completions(/v1/chat/completions)、Responses(/v1/responses)和 Anthropic Messages(/v1/messages)可以互换。先核对工具当前版本、provider 配置和实际请求路径,再查模型详情与 API 兼容性事实页。一次普通对话成功,也不能证明服务端工具、历史状态或文件编辑功能都受支持。
在请求日志里 核对 Agno 的调用
先在 Agno 发出一次简单文本请求,再到控制台 → 日志按时间、模型和 request_id 找到这条记录,核对 Token、花费、总耗时和状态码。成功后再分别验证流式输出、工具调用和多轮历史。失败时保留实际请求路径、完整错误消息及 request_id;没有对应日志时,要么请求没到达网关(客户端配置或网络问题),要么网关在调用模型之前就拒绝了它——Key 问题的 401、余额不足或 Key 达到 maxSpend 上限的 402、Key 或账户自身限额触发的 429,或模型 ID、端点不对的 400 / 404;在输出任何内容之前就失败的流式请求也可能没有日志。看客户端收到的状态码和错误消息就能区分是哪一种;先确认这一点,再判断是不是网关或上游故障。
常见 问题
已经 设置 OPENAI_API_KEY,为什么 OpenAILike 还是 返回 401?
在 Agno 3.1.1 中,OpenAILike 的 api_key 默认值是字符串 not-provided。这个非空值会阻止 OpenAIChat 回退读取 OPENAI_API_KEY,因此不传 api_key 时实际发送的是 Authorization: Bearer not-provided(按 Agno 3.1.1 与 3.1.2 的源码,2026-10-09 核对)。应显式写 api_key=environ["ROUTER_ONE_API_KEY"]。已经显式传入正确 Key 时,保留响应正文和请求 ID,再检查 Key 是否被撤销或复制错误。
OpenAILike 会自动 去掉 模型 ID 的厂商 前缀吗?
不会。它的 Chat Completions 实现发送 model=self.id。使用完整目录 ID,原本有 anthropic/ 或 openai/ 就保留;grok-4.6 这类 ID 本来就不带前缀。不要照搬 LiteLLM 或 Mastra 接入指南中额外添加的路由前缀。base_url 缺少 /v1 是另一种路径错误,不是模型名称的问题。
使用 OpenAILike 就能让每个 模型都 返回 结构 化输出吗?
不能。适配器可以构造结构化输出请求,但端点和所选模型仍需支持相应 schema 与参数。先测通普通文本,再分别验证 output_schema 和工具调用。遇到不支持的参数或 schema 错误时,应核对实际错误与模型能力,不要修改已经正确的 base URL。
Agno 能通过 网关用 哪些 模型?
选用当前目录中同时支持 Agno 所用端点和所需功能的模型。精确 ID、当前单价与能力以 /models 及模型详情为准;不要仅按 GPT、Claude 等系列名判断兼容性。客户端能列出模型,只说明它从自身配置或 GET /v1/models 读到了这个 ID,仍需验证实际调用。
能列出 模型,但调用报 400 或 404,怎么办?
先记录实际请求路径和错误消息,再核对精确模型 ID。400 可能是参数、工具类型或模型与端点不匹配;404 可能是请求路径或资源不存在,不能直接判定模型下线。若错误提示 must be called via,按它指明的端点调整客户端 provider,或换用支持当前端点的模型。不要在所有工具里统一增删 /v1 或 /chat/completions。
中国 大陆能 直连吗?
能。网关在大陆可直连、无需 VPN,配置与全球环境完全一致。
报 401/402/403/429 怎么 排查?
先看客户端收到的响应:状态码、错误消息和 X-Request-ID 响应头。401(Key 缺失、不存在、已吊销或已过期)、402(钱包余额不足,或这把 Key 达到 maxSpend 上限)以及 Key 或账户自身限额触发的 429,都在调用任何模型之前被拒绝,不会出现在控制台 → 日志里;模型 ID 或端点写错导致的 400 / 404 也一样。401 查 Key 是否完整传入、在控制台 → API 密钥里是否仍有效;402 充值或调高这把 Key 的 maxSpend;403 请保留完整错误消息。429 请退避后重试;日志里能查到的 429 是网关重试之后上游仍返回的。保留 request_id,再按错误码速查页逐项排查。