Skip to content

修复 C 版本 OpenAI Chat 请求体转换并对齐工具调用语义#34

Merged
lloydzhou merged 1 commit into
mainfrom
fix/c-openai-chat-body
May 29, 2026
Merged

修复 C 版本 OpenAI Chat 请求体转换并对齐工具调用语义#34
lloydzhou merged 1 commit into
mainfrom
fix/c-openai-chat-body

Conversation

@lloydzhou
Copy link
Copy Markdown
Owner

变更内容

修复 C 版本在 --provider openai / OpenAI Chat Completions 接口下,请求体仍沿用 Claude 格式的问题。

原来的行为是:

  • URL 已切到 /chat/completions
  • 但 body 仍然是 Claude Messages 结构
  • convert_to_openai() 只是空壳,未真正参与请求构造

这会导致:

  • tools 没有按 OpenAI type=function 结构发送
  • system 没有转成 messages[].role=system
  • assistant 的 tool_use / user 的 tool_result 也没有转成 OpenAI chat 语义
  • 长会话 compact 后的 summary 请求在 OpenAI 模式下同样不兼容

具体修复

1. 实现 C 版 Claude -> OpenAI body conversion

c/transport.c 中补全 convert_to_openai(),对齐 bash / Rust / Go 的语义:

  • system -> prepend 为 OpenAI system message
  • Claude tools -> OpenAI {"type":"function","function":...}
  • assistant content blocks 中的 tool_use -> tool_calls
  • user content blocks 中的 tool_result -> role=tool
  • thinking / output_config.effort -> OpenAI thinking + reasoning_effort

2. 主请求路径接入转换

c/agent.c 中:

  • 继续先构造统一的 Claude request
  • provider=openai 时再调用 convert_to_openai()

3. compact / summary 请求也接入转换

修复长会话 compact 时的 OpenAI 路径:

  • summary 请求原来同样直接把 Claude conversation 发给 /chat/completions
  • 现在也统一走 convert_to_openai()

4. 对齐 OpenAI header 语义

修复一个顺手发现的对齐问题:

  • C 版原来在 OpenAI 请求中也发送 x-app: cli
  • 现在改为只在 Claude 请求中发送,与 bash 版一致

5. 补充回归测试

tests/test.sh 中新增 OpenAI request body 检查:

  • 跑 OpenAI mock
  • 读取 /last-request
  • 断言请求体中:
    • 包含 role=system
    • 包含 OpenAI tools[].type=function
    • 包含 parameters
    • 不再残留 Claude input_schema

验证

已验证:

  • make build-c
  • /bin/zsh -lc 'AGENT=./dist/cagent bash tests/test.sh 9904'

结果:

  • 125 passed, 0 failed

@lloydzhou lloydzhou merged commit b9b2f44 into main May 29, 2026
30 checks passed
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