gpt-6-astra 绑定 function tools 后为何未自动路由到 Responses API?

👁 240 次阅读

gpt-6-astra 绑定 function tools 后为何未自动路由到 Responses API?

来源:[langchain-ai/langchain Issue #40346]

现象描述

使用 ChatOpenAI(model="gpt-6-astra") 并通过 bind_tools 绑定函数工具后调用,抛出 openai.BadRequestError,HTTP 状态码 400,错误消息为: > Function tools with reasoning_effort are not supported for gpt-6-astra in /v1/chat/completions. To use function tools, use /v1/responses or set reasoning_effort to ‘none’ 复现代码如下:
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

@tool
def lookup(q: str) -> str:
    """Look up information."""
    return f"result for {q}"

model = ChatOpenAI(model="gpt-6-astra", max_tokens=16)
model.bind_tools([lookup]).invoke(
    "Reply with the single word OK. Do not call any tool."
)
调用路径停留在 /v1/chat/completions 上,而非模型所需的 /v1/responses 端点。报错信息中建议的 reasoning_effort="none" 变通方案同样失败,因为 gpt-6-astra 不支持 none 值。 不带 tools 的 gpt-6-astra 普通调用经 Chat Completions 可成功,因此故障仅与 function tools 的组合相关。

背景原因

根据 issue 讨论,根因在于 LangChain 的 OpenAI 集成中,_RESPONSES_API_ONLY_PREFIXES 列表当前包含 gpt-5.6-sol 但不包含 gpt-6-astra。该列表决定了哪些模型前缀在涉及 tool call 时自动路由到 Responses API。由于 gpt-6-astra 未被纳入,function tool 调用默认停留在 Chat Completions 路径上,除非用户显式设置 use_responses_api=True。 关联 issue 梳理:
  • #40133:通过把 gpt-5.6-sol 加入 _RESPONSES_API_ONLY_PREFIXES 处理了同一失败模式。
  • #40330:为 gpt-6-astra 增加了 reasoning-effort profile,但未同步更新 Responses API 路由逻辑。
  • #38860:在探索为较早 GPT 模型族的 function tools 做条件式 Responses 路由,尚未合入,且不覆盖 gpt-6-astra。
提交者在 master 分支 commit 60357692 上做了三组对照实验,结果如下:
测试场景路由端点结果
gpt-6-astra + function tool(默认配置)/v1/chat/completions400 错误
gpt-6-astra + function tool + use_responses_api=True/v1/responses200 成功
gpt-5.6-sol + function tool(默认配置)/v1/responses200 成功

排查或量化方法

当遇到 400 错误且消息包含 “Function tools with reasoning_effort are not supported” 时,可按以下步骤排查:
1. 确认模型名:检查 ChatOpenAI(model=...) 中的模型字符串是否以 gpt-6-astra 开头。
2. 确认是否绑定了工具:检查调用链中是否存在 bind_tools 或 with_structured_output 等涉及 function calling 的操作。
3. 确认当前路由端点:查看请求日志或抓包,确认请求发往的是 /v1/chat/completions 还是 /v1/responses。
4. 验证不带工具是否正常:移除 bind_tools 后单独调用,确认模型本身可用。
5. 检查 LangChain 版本:确认 langchain_openai 版本,该 issue 报告环境为 langchain_openai 1.6.2、openai 3.8.0、Python 3.12.10。

完整解决方案

临时变通方案(立即可用)

在初始化 ChatOpenAI 时显式设置 use_responses_api=True,强制路由到 Responses API:
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

@tool
def lookup(q: str) -> str:
    """Look up information."""
    return f"result for {q}"

model = ChatOpenAI(
    model="gpt-6-astra",
    max_tokens=16,
    use_responses_api=True  # 强制走 /v1/responses
)
result = model.bind_tools([lookup]).invoke(
    "Reply with the single word OK. Do not call any tool."
)
print(result.content)
该方案经 issue 提交者验证,返回 200。

根治方案(等待合入)

据 issue 讨论,根治方案与 #40133 一致:在 libs/partners/openai/ 下的 base.py 中,将 gpt-6-astra 加入 _RESPONSES_API_ONLY_PREFIXES,使 _model_prefers_responses_api 默认将 function-tool 调用路由到 /v1/responses。同时扩展 test_model_prefers_responses_api 测试用例,覆盖 base 模型名与带日期快照的模型名。不带 tool 的调用行为不变。
该 issue 当前状态为 open,尚未分配,无 PR 提交,无维护者回复。唯一评论来自 RauhanAhmed(2026-09-10 08:10 UTC),表示愿意认领并请求 assign,方案与上述一致。

参数或对比表格

配置项值说明
modelgpt-6-astra触发问题的模型名
max_tokens16复现用最小 token 数
use_responses_apiTrue临时变通,强制 Responses API
reasoning_effort不可设为 “none”gpt-6-astra 不支持该值
langchain_openai1.6.2报告时版本
openai SDK3.8.0报告时版本
Python3.12.10报告时版本

常见错误排查

1. 设置 reasoning_effort="none" 后仍报错:gpt-6-astra 不支持 none 值,该变通无效,应改用 use_responses_api=True。 2. 仅部分调用失败,普通对话正常:不带 tools 的 gpt-6-astra 调用经 Chat Completions 可成功,故障仅与 function tools 组合相关,需检查是否涉及 bind_tools 或结构化输出。 3. 升级 langchain_openai 后问题未解决:截至 2026-09-10,该 issue 仍为 open 状态,官方尚未合入统一方案,升级版本不会自动修复。 4. 使用 with_structured_output 也报错:结构化输出同样涉及 function calling 路径,与 bind_tools 触发相同路由问题,解决方案一致。 5. gpt-5.6-sol 无此问题:#40133 已将 gpt-5.6-sol 加入 _RESPONSES_API_ONLY_PREFIXES,gpt-5.6-sol 的 function tool 调用默认路由到 /v1/responses,因此不受影响。

实践建议

  • 当前使用 gpt-6-astra 配合 function tools 时,务必在 ChatOpenAI 初始化中设置 use_responses_api=True。
  • 监控 LangChain GitHub 仓库中 issue #40346 的状态变化,关注是否被 assign 及 PR 合入。
  • 在 CI 测试中增加 gpt-6-astra + tools 的路由验证用例,防止回归。
  • 若项目中使用多个 OpenAI 模型,可封装工厂函数,对已知需要 Responses API 的模型前缀自动设置 use_responses_api=True,减少手动配置遗漏。
  • 关注关联 issue #38860 的进展,该 issue 探索条件式 Responses 路由,若合入可能提供更通用的自动路由机制。

FAQ

Q:为什么报错信息建议设置 reasoning_effort="none" 但实际不行? A:报错信息是 OpenAI API 的通用提示,建议通过设置 reasoning_effort 为 none 来避免 function tools 与推理参数的冲突。但 gpt-6-astra 模型本身不支持 none 值,因此该建议对该模型无效。正确的变通方式是设置 use_responses_api=True。 Q:use_responses_api=True 会影响不带工具的调用吗? A:据 issue 讨论,不带 tool 的 gpt-6-astra 调用经 Chat Completions 可成功。设置 use_responses_api=True 会将所有调用路由到 /v1/responses,对不带工具的调用行为不产生负面影响,但请求路径会发生变化。如需保持不带工具的调用走 Chat Completions,可考虑仅在有工具的调用场景下使用该参数。 Q:该问题何时能修复? A:截至 2026-09-10,该 issue 为 open 状态,尚未分配,无 PR,无维护者回复。社区开发者 RauhanAhmed 已表示愿意认领并请求 assign,但尚未获批准。修复时间取决于维护者的分配决策。 Q:能否通过配置 OpenAI API base URL 来绕过? A:据 issue 讨论,问题根因在于 LangChain 内部的路由逻辑(_RESPONSES_API_ONLY_PREFIXES 列表未包含 gpt-6-astra),而非 API base URL 配置。修改 base URL 无法解决路由端点选择问题。 Q:gpt-5.6-sol 和 gpt-6-astra 的路由行为有何差异? A:gpt-5.6-sol 已通过 #40133 加入 _RESPONSES_API_ONLY_PREFIXES,function tool 调用默认路由到 /v1/responses,无需额外配置。gpt-6-astra 尚未加入该列表,function tool 调用默认停留在 /v1/chat/completions,需手动设置 use_responses_api=True 才能正常工作。

订阅 AI 百事知

每周精选 AI 工具评测、行业资讯与使用教程,第一时间送达。

🔗 相关阅读(你可能还想看)

📄 Gemini Omni 1.2 Flash 发布:视频降价30%、原生15秒,单条成本只贵5分钱
谷歌 11 月 5 日开放 Gemini Omni 1.2 Flash:720p 视频每秒 0.07 美元,比上代降 3
📄 GPT-6 Cyber 发布:121 万美元,948 条通往 root 的路
OpenAI 发布 GPT-6 Cyber:在 Linux 内核上跑出 948 个本地提权利用,整轮 API 成本 12
📄 Anthropic冲刺IPO:170亿营收、8950亿算力承诺、首次在招股书披露递归自我改进风险
📄 Anthropic IPO招股书曝光:单季营收170亿美元背后的8954亿美元算力账单
📄 阿里千问接入 Apple Intelligence:中国版 iPhone 的 AI 时刻来了
📄 苹果AI中国落地靴子落地:千问接入Apple Intelligence,11月4日开测
📄 苹果官宣:Apple Intelligence 国行版落地,阿里千问深度接入 Siri 与系统写作工具
苹果官宣 Apple Intelligence 国行版 11 月 4 日开测、12 月随 iOS 27.3 正式上线。阿
📄 Anthropic 递交 S-1 启动 IPO:Claude 母公司估值剑指 2 万亿美元
📄 Cerebras 公开万亿参数模型部署方案:59 块晶圆跑 3T 参数,推理 2000 tokens/秒
🤖 想直接和 AI 对话?
免费体验 DeepSeek V4 等顶级模型,无需注册,随问随答
🎯 立即体验 AI 工具

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

🤖 嘟嘟客服
滚动至顶部
🤖 嘟嘟客服
🤖 嘟嘟客服
';i.value='';m.innerHTML+='
...
';fetch('/dify-chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({query:q,user:'w'+Date.now()})}).then(function(r){return r.json()}).then(function(d){var a=d.answer||'暂时无法回复';m.removeChild(m.lastChild);m.innerHTML+='
'+a+'
'}).catch(function(){m.removeChild(m.lastChild);m.innerHTML+='
网络异常
'})">发送