模型点三道菜,回喂被拒 400

简介: 模型一次发起多个工具调用(并行 tool_calls),结果怎么喂回去两家规矩不同:OpenAI 每个结果自成一条,Anthropic 要求全部合并进同一条 user 消息、还不许两条 user 相邻——逐条回喂直接 400。本文附 codeAgent 真实源码 _convert_messages_to_anthropic:一次遍历完成格式翻译、连续工具结果合并和 system 抽离。

「手写中文版 claude code」教学系列:codeAgent 是我从零手写的 claude code 复刻——不套壳不翻译,从界面到 Agent 主循环一行行实现,注释全是中文大白话,适合当 Agent 开发教材从头读到尾。
上一课治好了工具的"钱袋子"(按套餐发说明书省钱);这一课钻进工具真正跑起来之后的环节——模型一次点好几道菜,结果怎么端回去才不被 API 拒。
仓库:https://github.com/Harvil1/codeAgent

翻车现场

模型一口气发起三个工具调用(读文件 A、读文件 B、跑个命令),我执行完按 OpenAI 的习惯逐条回喂:

assistant (tool_calls: [A, B, C])
tool (result A)
tool (result B)
tool (result C)

切到 Anthropic 格式的端点,直接 400。原因:Anthropic 协议规定所有 tool_result 必须装在同一条 user 消息里,而且不允许两条 user 消息相邻。OpenAI 的"一菜一盘"在它家是非法摆盘。

修复:翻译层统一合并

agent/llm_client.py 里的转换函数,docstring 就是踩坑记录:

def _convert_messages_to_anthropic(self, messages: list) -> list:
    """把 OpenAI 格式的整段对话历史翻译成 Anthropic 格式。

    最关键的一步:把连续多条工具结果合并成一条 user 消息。
    因为 Anthropic 协议规定所有工具结果必须装在同一个 user 消息里,
    不允许两条 user 消息挨着;而 OpenAI 那边每个工具结果各自成条。
    (另外 system 消息在这里被抽走——它要走顶层参数,见上层拼装。)

    参数:
        messages:OpenAI 格式的消息列表

    返回:Anthropic 格式的消息列表。
    """
    conversation = []
    i = 0
    while i < len(messages):
        m = messages[i]
        role = m.get("role")

        if role == "system":
            i += 1
            continue  # system 走顶层参数,不进消息列表
        ...

核心手法是双指针扫描:遇到连续的 tool 消息块,一口气收进同一个 user 消息再往下走;顺带把 system 抽走(OpenAI 的 system 是消息列表的一员,Anthropic 的 system 是顶层参数——又一个差异点)。

并行回喂还有三个坑,一并说了

1. id 配对不能错。 三个结果必须各回各的 tool_call_id,张冠李戴模型会拿着 A 的结果回答 C 的问题——不报错但全错,比 400 更难查。

2. 顺序无所谓,配对才要命。 协议不要求结果按发起顺序回,但 id 必须一一对应。

3. 换端点不换代码。 这层翻译存在的意义:主循环只说 OpenAI 方言,Client 子类负责翻译——加新服务商只写一个翻译器,主循环零改动。

小结

  1. 并行 tool_calls 的结果回喂,Anthropic 要求合并成单条 user、禁连续 user
  2. 转换层双指针扫描:合并 tool 块 + 抽离 system,一次遍历搞定
  3. id 严格配对;协议差异全部闷在 Client 层,主循环保持方言纯净

下一篇:模型点了菜厨房没做——发送前的孤儿 tool_call 对账兜底(附 _fix_tool_call_pairs 源码)。


仓库在这,注释全中文,欢迎 Star ⭐:https://github.com/Harvil1/codeAgent

标签:Agent Function Calling 大模型API Python

目录
相关文章
|
15天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8131 15
|
13天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
2226 13
|
13天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1825 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
12天前
|
人工智能 编解码 并行计算
MiniMax-H3 一键整合包技术文档:8G 显存运行 AI 漫剧制作 —— 角色替换 / 动作迁移 / 文图生视频部署与调参指南
MiniMax H3 是 MiniMax 开源的全模态视频生成模型,支持文/图/音/视多条件输入,输出最高2K、15秒带双声道音频视频。本文档详述其Int8量化版在8GB显存下的本地一键部署、三段式工作流(EDIT/REPLACE/CONTINUE)、参数调优及常见问题排查。(239字)
|
7天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
7天前
|
人工智能 JSON 编解码
【2026最新版】ComfyUI本地部署教程,新手也能看懂!
ComfyUI是本地运行的AI绘画工具,采用节点式工作流设计:通过拖拽连接“加载模型”“提示词编码”“采样”“解码”等模块,实现高度可控的文生图。新手推荐使用秋叶整合包,一键启动、内置模型管理与插件安装器,轻松上手。(239字)
|
21天前
|
缓存 IDE Java
【保姆级】Android Studio下载、安装和汉化教程(2026最新)
Android Studio 是 Google 官方推出的免费 Android 应用开发集成环境,基于 IntelliJ IDEA,内置模拟器、调试器、性能分析及 Compose 界面工具,功能全面,文档丰富,是安卓开发首选工具。(239字)
2277 1

热门文章

最新文章