Skip to content

fix(providers/transport): 回放的调用名里端点不收的字符换成下划线 - #407

Merged
Phantivia merged 1 commit into
mainfrom
fix/responses-replay-tool-name
Nov 12, 2026
Merged

Phantivia merged 1 commit into
mainfrom
fix/responses-replay-tool-name

Conversation

@Phantivia

Copy link
Copy Markdown
Member

Refs Pal-AI-Lab/Coopanion#703

问题

function_call 的 name 是模型写出的字符串,原样存进 session。模型写过一个带冒号的名字之后(#703 里是 app::pet_say,当时的回执是 [unknown tool]),Responses 端点对之后每一次重放都回 400:

Invalid 'input[339].name': string does not match pattern '^[a-zA-Z0-9_.-]+$'

400 不重试,下一批从同一份记录组出同样的请求,会话不再有回应。

改动

responsesInput() 出线时把 function_call.name 里 [a-zA-Z0-9_.-] 以外的每个字符换成 _。和「别的端点记下的项出线时不带 id」在同一处,只改出线副本:

  • 不看来源,不认 app:: 这类前缀。
  • call_id、回执、session 记录不动;调用和回执仍按 call_id 配对。
  • 合法的名字逐字节不变。

docs/providers.md 和 src/providers/README.md 同改。

范围

  • 字符集取上游拒收时报出的那一个。Open Responses 规范(src/protocol/open-responses/openapi.json)给 FunctionCallItemParam.name 的是 ^[a-zA-Z0-9_-]+$、最长 64;点号和长度没有被拒的现场,这里不处理。
  • 协议类型里带 name 的历史项只有 function_call。
  • Chat Completions 出口(history.ts)不动:接口文档只给工具声明的名字定了字符集(tools[].function.name),没有给历史里 tool_calls[].function.name 定,也没有被拒的现场。

验证

  • 新增一条测试:历史里有 app::pet_say 的调用和它的 [unknown tool] 回执时,出线的名字是 app__pet_say、call_id 不变、回执对得上、记录里的名字没改;带点号和连字符的名字原样出线。去掉修复这条失败。
  • pnpm test、pnpm run typecheck、pnpm run typecheck:web 通过。
  • 没有对真实的 Responses 端点跑过。

🤖 Generated with Claude Code

- 根因:function_call 的 name 是模型写出的字符串,原样存进 session;模型写过一个带冒号的
  名字(app::pet_say,回执 [unknown tool])之后,Responses 端点对每次重放都回 400
  「Invalid 'input[N].name': string does not match pattern '^[a-zA-Z0-9_.-]+$'」,整个会话卡住。
- 只改出线副本,不看来源、不认前缀:[a-zA-Z0-9_.-] 以外的每个字符换成 _。call_id、回执、
  session 记录不动,合法的名字逐字节不变。
- 字符集取上游拒收时报出的那一个。Open Responses 规范给 FunctionCallItemParam.name 的是
  ^[a-zA-Z0-9_-]+$ 且最长 64,点号和长度没有被拒的现场,不处理。
- Chat Completions 出口不动:接口文档只给工具声明的名字定了字符集,没有给历史里
  tool_calls 的名字定,也没有被拒的现场。
- 测试:历史里有 app::pet_say 的调用和它的 [unknown tool] 回执时,出线的名字合法、call_id
  不变、回执仍对得上、记录里的名字没改;修复前这条失败。

Refs Pal-AI-Lab/Coopanion#703

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@Phantivia
Phantivia merged commit 5d0e2d5 into main Nov 12, 2026
4 checks passed
@Phantivia
Phantivia deleted the fix/responses-replay-tool-name branch November 12, 2026 18:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant