[GH-ISSUE #311] 反代理在 CherryStudio 中可以正常工作,但在 Cline 和 Claude Code 中请求失败,返回 400 错误 "Improperly formed request"。 #225

Closed
opened 2026-02-27 07:18:33 +03:00 by kerem · 2 comments
Owner

Originally created by @yangyiting434633-lgtm on GitHub (Feb 6, 2026).
Original GitHub issue: https://github.com/justlovemaki/AIClient-2-API/issues/311

问题描述 / Problem Description

反代理在 CherryStudio 中可以正常工作,但在 Cline 和 Claude Code 中请求失败,返回 400 错误 "Improperly formed request"。

The proxy works correctly with CherryStudio but fails with Cline and Claude Code, returning 400 error "Improperly formed request".

环境信息 / Environment

  • OS: Windows 10
  • Node.js: v22.19.0
  • 反代理版本: [2.9.1]
  • Provider: claude-kiro-oauth

客户端兼容性 / Client Compatibility

客户端 请求端点 结果
CherryStudio /v1/chat/completions (OpenAI) 成功
Cline /v1/chat/completions (OpenAI) 400 错误
Claude Code /v1/messages?beta=true (Claude) 400 错误

日志对比分析 / Log Comparison

CherryStudio (成功)

[INFO] [Server] Received request: POST /v1/chat/completions
[INFO] [Request Convert] Converting request from openai to claude-kiro-oauth
[INFO] [Kiro] Calling generateContentStream with model: claude-opus-4-6 (real streaming)
[INFO] [Kiro] No tools provided, adding placeholder tool
[INFO] [Kiro] History does not end with assistantResponseMessage, adding empty one
  • 无 tools 参数
  • 添加了 placeholder tool
  • 请求成功

Cline (失败)

[INFO] [Server] Received request: POST /v1/chat/completions
[INFO] [Request Convert] Converting request from openai to claude-kiro-oauth
[INFO] [Kiro] Calling generateContentStream with model: claude-opus-4-6 (real streaming)
[INFO] [Kiro] History does not end with assistantResponseMessage, adding empty one
[ERROR] [Kiro] Stream API call failed (Status: 400, Code: ERR_BAD_REQUEST)
  • 没有显示 [Kiro] No tools provided 或任何 tools 处理日志
  • 说明 Cline 发送了 tools,但可能格式不正确或转换失败

Claude Code (失败)(注:这一部分报错是我自己尝试修改代码后的报错日志,但问题仍未得到解决,所以请着重Cline的报错)

[INFO] [Server] Received request: POST /v1/messages?beta=true
[INFO] [Request Convert] Request format matches backend provider. No conversion needed.
[INFO] [Kiro] Ignoring tool: WebSearch
[INFO] [Kiro] Truncated tool 'Bash' description: 10741 -> 9219 chars
[INFO] [Kiro] History does not end with assistantResponseMessage, adding empty one
[ERROR] [Kiro] Stream API call failed (Status: 400, Code: ERR_BAD_REQUEST)
  • 使用 Claude 原生格式,无需转换
  • Tools 被处理(过滤 WebSearch,截断 Bash 描述)
  • 仍然返回 400 错误
  • 这里Claude Code的报错我尝试了自己修改代码,但并未解决问题。

错误响应 / Error Response

AWS API 返回的错误:

{"message":"Improperly formed request.","reason":null}

错误类型:ValidationException

关键发现 / Key Findings

  1. CherryStudio 成功的原因:没有发送 tools,代码自动添加了 placeholder tool

  2. Cline 失败的可能原因

    • Cline 发送了 tools 参数
    • 日志中没有显示 tools 处理信息,可能是 OpenAI -> Claude 转换时 tools 格式不兼容
    • OpenAIConverter 假设 tools 格式为 { function: { name, description, parameters } }
    • Cline 可能发送了不同格式的 tools
  3. Claude Code 失败的可能原因

    • 发送的是 Claude 原生格式,tools 已经是 Kiro 格式 (toolSpecification)
    • buildCodewhispererRequest 方法可能没有正确处理已经是 Kiro 格式的 tools

请求头信息 / Request Headers

失败请求的 headers:

amz-sdk-request: attempt=1; max=1
x-amzn-kiro-agent-mode: vibe
x-amz-user-agent: aws-sdk-js/1.0.0 KiroIDE-0.8.140-...
user-agent: aws-sdk-js/1.0.0 ua/2.1 os/windows#10.0.19045 lang/js md/nodejs#22.19.0 api/codewhispererruntime#1.0.0 ...

相关代码 / Relevant Code

  1. src/converters/strategies/OpenAIConverter.js - toClaudeRequest 方法中的 tools 转换(约第 268 行)
  2. src/providers/claude/claude-kiro.js - buildCodewhispererRequest 方法中的 tools 处理

复现步骤 / Steps to Reproduce

  1. 配置反代理使用 claude-kiro-oauth provider
  2. 使用 CherryStudio 发送简单消息(无 tools)→ 成功
  3. 使用 Cline 发送消息 → 400 错误
  4. 使用 Claude Code 发送消息 → 400 错误

期望行为 / Expected Behavior

反代理应该能够正确处理来自不同客户端的请求,包括:

  1. 无 tools 的请求(CherryStudio)
  2. 带有 OpenAI 格式 tools 的请求(Cline)
  3. 带有 Claude/Kiro 格式 tools 的请求(Claude Code)
Originally created by @yangyiting434633-lgtm on GitHub (Feb 6, 2026). Original GitHub issue: https://github.com/justlovemaki/AIClient-2-API/issues/311 ## 问题描述 / Problem Description 反代理在 CherryStudio 中可以正常工作,但在 Cline 和 Claude Code 中请求失败,返回 400 错误 "Improperly formed request"。 The proxy works correctly with CherryStudio but fails with Cline and Claude Code, returning 400 error "Improperly formed request". ## 环境信息 / Environment - OS: Windows 10 - Node.js: v22.19.0 - 反代理版本: [2.9.1] - Provider: `claude-kiro-oauth` ## 客户端兼容性 / Client Compatibility | 客户端 | 请求端点 | 结果 | |--------|----------|------| | CherryStudio | `/v1/chat/completions` (OpenAI) | ✅ 成功 | | Cline | `/v1/chat/completions` (OpenAI) | ❌ 400 错误 | | Claude Code | `/v1/messages?beta=true` (Claude) | ❌ 400 错误 | ## 日志对比分析 / Log Comparison ### CherryStudio (成功) ``` [INFO] [Server] Received request: POST /v1/chat/completions [INFO] [Request Convert] Converting request from openai to claude-kiro-oauth [INFO] [Kiro] Calling generateContentStream with model: claude-opus-4-6 (real streaming) [INFO] [Kiro] No tools provided, adding placeholder tool [INFO] [Kiro] History does not end with assistantResponseMessage, adding empty one ``` - 无 tools 参数 - 添加了 placeholder tool - 请求成功 ### Cline (失败) ``` [INFO] [Server] Received request: POST /v1/chat/completions [INFO] [Request Convert] Converting request from openai to claude-kiro-oauth [INFO] [Kiro] Calling generateContentStream with model: claude-opus-4-6 (real streaming) [INFO] [Kiro] History does not end with assistantResponseMessage, adding empty one [ERROR] [Kiro] Stream API call failed (Status: 400, Code: ERR_BAD_REQUEST) ``` - **没有显示 `[Kiro] No tools provided` 或任何 tools 处理日志** - 说明 Cline 发送了 tools,但可能格式不正确或转换失败 ### Claude Code (失败)(注:这一部分报错是我自己尝试修改代码后的报错日志,但问题仍未得到解决,所以请着重Cline的报错) ``` [INFO] [Server] Received request: POST /v1/messages?beta=true [INFO] [Request Convert] Request format matches backend provider. No conversion needed. [INFO] [Kiro] Ignoring tool: WebSearch [INFO] [Kiro] Truncated tool 'Bash' description: 10741 -> 9219 chars [INFO] [Kiro] History does not end with assistantResponseMessage, adding empty one [ERROR] [Kiro] Stream API call failed (Status: 400, Code: ERR_BAD_REQUEST) ``` - 使用 Claude 原生格式,无需转换 - Tools 被处理(过滤 WebSearch,截断 Bash 描述) - 仍然返回 400 错误 - 这里Claude Code的报错我尝试了自己修改代码,但并未解决问题。 ## 错误响应 / Error Response AWS API 返回的错误: ```json {"message":"Improperly formed request.","reason":null} ``` 错误类型:`ValidationException` ## 关键发现 / Key Findings 1. **CherryStudio 成功的原因**:没有发送 tools,代码自动添加了 placeholder tool 2. **Cline 失败的可能原因**: - Cline 发送了 tools 参数 - 日志中没有显示 tools 处理信息,可能是 OpenAI -> Claude 转换时 tools 格式不兼容 - OpenAIConverter 假设 tools 格式为 `{ function: { name, description, parameters } }` - Cline 可能发送了不同格式的 tools 3. **Claude Code 失败的可能原因**: - 发送的是 Claude 原生格式,tools 已经是 Kiro 格式 (`toolSpecification`) - `buildCodewhispererRequest` 方法可能没有正确处理已经是 Kiro 格式的 tools ## 请求头信息 / Request Headers 失败请求的 headers: ``` amz-sdk-request: attempt=1; max=1 x-amzn-kiro-agent-mode: vibe x-amz-user-agent: aws-sdk-js/1.0.0 KiroIDE-0.8.140-... user-agent: aws-sdk-js/1.0.0 ua/2.1 os/windows#10.0.19045 lang/js md/nodejs#22.19.0 api/codewhispererruntime#1.0.0 ... ``` ## 相关代码 / Relevant Code 1. `src/converters/strategies/OpenAIConverter.js` - `toClaudeRequest` 方法中的 tools 转换(约第 268 行) 2. `src/providers/claude/claude-kiro.js` - `buildCodewhispererRequest` 方法中的 tools 处理 ## 复现步骤 / Steps to Reproduce 1. 配置反代理使用 `claude-kiro-oauth` provider 2. 使用 CherryStudio 发送简单消息(无 tools)→ 成功 3. 使用 Cline 发送消息 → 400 错误 4. 使用 Claude Code 发送消息 → 400 错误 ## 期望行为 / Expected Behavior 反代理应该能够正确处理来自不同客户端的请求,包括: 1. 无 tools 的请求(CherryStudio) 2. 带有 OpenAI 格式 tools 的请求(Cline) 3. 带有 Claude/Kiro 格式 tools 的请求(Claude Code)
kerem closed this issue 2026-02-27 07:18:33 +03:00
Author
Owner

@justlovemaki commented on GitHub (Feb 8, 2026):

你可以开启AI监控,导出日志分析下
Improperly formed request 就是参数问题
Cline 直接使用claude协议,没必要转
Claude Code 我这边没有报错,无法修复

<!-- gh-comment-id:3866371519 --> @justlovemaki commented on GitHub (Feb 8, 2026): 你可以开启AI监控,导出日志分析下 Improperly formed request 就是参数问题 Cline 直接使用claude协议,没必要转 Claude Code 我这边没有报错,无法修复
Author
Owner

@yangyiting434633-lgtm commented on GitHub (Feb 8, 2026):

找到问题了,在工具调用中cline传递了一个描述未空的工具,导致了kiro不接受这个描述为空的工具引发报错。我不知道这个是cline本身的问题还是软件转换格式引发的错误,总之我在代码中添加了tool的不为空判断,再次使用软件便可以在cline和claudecode中正常使用。

你可以开启AI监控,导出日志分析下 Improperly formed request 就是参数问题 Cline 直接使用claude协议,没必要转 Claude Code 我这边没有报错,无法修复

<!-- gh-comment-id:3867061537 --> @yangyiting434633-lgtm commented on GitHub (Feb 8, 2026): 找到问题了,在工具调用中cline传递了一个描述未空的工具,导致了kiro不接受这个描述为空的工具引发报错。我不知道这个是cline本身的问题还是软件转换格式引发的错误,总之我在代码中添加了tool的不为空判断,再次使用软件便可以在cline和claudecode中正常使用。 > 你可以开启AI监控,导出日志分析下 Improperly formed request 就是参数问题 Cline 直接使用claude协议,没必要转 Claude Code 我这边没有报错,无法修复
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/AIClient-2-API-justlovemaki#225
No description provided.