# 针对 Claude Code "Field required" 错误的修复方案文档 ## 1. 问题背景 在使用 Claude Code CLI 并通过 Antigravity-Manager 代理时,经常会出现以下报错: `messages.X.content.0.text.text: Field required` **根本原因**: Claude Code 在进行工具调用(Tool Use)时,发送或接收的消息块中可能包含空的 `text` 字段(例如 `{"text": ""}` 或 `{"text": " "}`)。 - **Google Gemini API**:严禁在请求的 `parts` 中包含空的文本块。 - **Anthropic 协议转换**:在转换过程中,如果未能对空字符串进行 `trim()` 和有效性校验,就会导致上游 API 拒绝请求。 ## 2. 针对性修改方案 本次修复主要涉及 `src-tauri/src/proxy/mappers/claude/` 目录下的两个核心文件: ### A. 请求端过滤 (src-tauri/src/proxy/mappers/claude/request.rs) **修改说明**:在将 Claude 消息转换为 Google 格式时,对所有 `ContentBlock::Text` 和降级的思维块(Thinking)进行严格过滤。 * **修改点 1 (`build_contents` 函数)**: * **现状**:仅检查了是否等于 `(no content)` 占位符。 * **修复**:引入 `!text.trim().is_empty()`,确保所有发送给 Google 的文本块都包含实际内容。 * **修改点 2 (思维块降级)**: * **现状**:当思维模式被禁用或块顺序异常时,思维块会被转换为 `text` 块。 * **修复**:确保降级过程中排除掉仅含空格的文本,并对内容进行 `trim()` 处理。 ### B. 响应端优化 (src-tauri/src/proxy/mappers/claude/streaming.rs) **修改说明**:优化流式响应转换逻辑,防止向客户端发送诱发状态机异常的空块。 * **修改点 1 (`emit_finish` 函数)**: * **现状**:在处理 Web 搜索(Grounding)结果时,会初始化一个 `text` 块。 * **修复**:只有当搜索摘要 `grounding_text.trim()` 确实非空时,才允许发送该内容块分片。 * **修改点 2 (`process_text` 处理器)**: * **修复**:增强了对 `trailing_signature`(签名暂存)场景下的逻辑鲁棒性,确保不会产生无意义的“幽灵”文本块。 ## 3. 已应用的代码详情 (Git Diff 摘要) ### Request Mapper: ```rust // 修复前 if text != "(no content)" { ... } // 修复后 if text != "(no content)" && !text.trim().is_empty() { ... } ``` ### Streaming State: ```rust // 修复前 if !grounding_text.is_empty() { ... } // 修复后 let trimmed_grounding = grounding_text.trim(); if !trimmed_grounding.is_empty() { ... } ``` ## 4. 验证与部署建议 1. **分步确认**:通过代理日志观察,确保不再出现 `messages.X.text: Field required` 的 HTTP 400 警告。 2. **连续对话测试**:进行一次涉及文件读写的复杂任务(例如 `claude fix bug`),确认在 `tool_use` 返回后,Claude Code 能正常发送下一轮请求。 3. **编译命令**: ```bash npm run tauri dev ``` --- *文档由 Antigravity AI 助手生成,用于记录 fix/claude-code-tool-use-empty-text 分支的变更细节。*