• IanShaw's avatar
    fix: 修复 /v1/messages 间歇性 400 错误 (#18) · 34c10204
    IanShaw authored
    * fix(upstream): 修复上游格式兼容性问题
    
    - 跳过Claude模型无signature的thinking block
    - 支持custom类型工具(MCP)格式转换
    - 添加ClaudeCustomToolSpec结构体支持MCP工具
    - 添加Custom字段验证,跳过无效custom工具
    - 在convertClaudeToolsToGeminiTools中添加schema清理
    - 完整的单元测试覆盖,包含边界情况
    
    修复: Issue 0.1 signature缺失, Issue 0.2 custom工具格式
    改进: Codex审查发现的2个重要问题
    
    测试:
    - TestBuildParts_ThinkingBlockWithoutSignature: 验证thinking block处理
    - TestBuildTools_CustomTypeTools: 验证custom工具转换和边界情况
    - TestConvertClaudeToolsToGeminiTools_CustomType: 验证service层转换
    
    * feat(gemini): 添加Gemini限额与TierID支持
    
    实现PR1:Gemini限额与TierID功能
    
    后端修改:
    - GeminiTokenInfo结构体添加TierID字段
    - fetchProjectID函数返回(projectID, tierID, error)
    - 从LoadCodeAssist响应中提取tierID(优先IsDefault,回退到第一个非空tier)
    - ExchangeCode、RefreshAccountToken、GetAccessToken函数更新以处理tierID
    - BuildAccountCredentials函数保存tier_id到credentials
    
    前端修改:
    - AccountStatusIndicator组件添加tier显示
    - 支持LEGACY/PRO/ULTRA等tier类型的友好显示
    - 使用蓝色badge展示tier信息
    
    技术细节:
    - tierID提取逻辑:优先选择IsDefault的tier,否则选择第一个非空tier
    - 所有fetchProjectID调用点已更新以处理新的返回签名
    - 前端gracefully处理missing/unknown tier_id
    
    * refactor(gemini): 优化TierID实现并添加安全验证
    
    根据并发代码审查(code-reviewer, security-auditor, gemini, codex)的反馈进行改进:
    
    安全改进:
    - 添加validateTierID函数验证tier_id格式和长度(最大64字符)
    - 限制tier_id字符集为字母数字、下划线、连字符和斜杠
    - 在BuildAccountCredentials中验证tier_id后再存储
    - 静默跳过无效tier_id,不阻塞账户创建
    
    代码质量改进:
    - 提取extractTierIDFromAllowedTiers辅助函数消除重复代码
    - 重构fetchProjectID函数,tierID提取逻辑只执行一次
    - 改进代码可读性和可维护性
    
    审查工具:
    - code-reviewer agent (a09848e)
    - security-auditor agent (a9a149c)
    - gemini CLI (bcc7c81)
    - codex (b5d8919)
    
    修复问题:
    - HIGH: 未验证的tier_id输入
    - MEDIUM: 代码重复(tierID提取逻辑重复2次)
    
    * fix(format): 修复 gofmt 格式问题
    
    - 修复 claude_types.go 中的字段对齐问题
    - 修复 gemini_messages_compat_service.go 中的缩进问题
    
    * fix(upstream): 修复上游格式兼容性问题 (#14)
    
    * fix(upstream): 修复上游格式兼容性问题
    
    - 跳过Claude模型无signature的thinking block
    - 支持custom类型工具(MCP)格式转换
    - 添加ClaudeCustomToolSpec结构体支持MCP工具
    - 添加Custom字段验证,跳过无效custom工具
    - 在convertClaudeToolsToGeminiTools中添加schema清理
    - 完整的单元测试覆盖,包含边界情况
    
    修复: Issue 0.1 signature缺失, Issue 0.2 custom工具格式
    改进: Codex审查发现的2个重要问题
    
    测试:
    - TestBuildParts_ThinkingBlockWithoutSignature: 验证thinking block处理
    - TestBuildTools_CustomTypeTools: 验证custom工具转换和边界情况
    - TestConvertClaudeToolsToGeminiTools_CustomType: 验证service层转换
    
    * fix(format): 修复 gofmt 格式问题
    
    - 修复 claude_types.go 中的字段对齐问题
    - 修复 gemini_messages_compat_service.go 中的缩进问题
    
    * fix(format): 修复 claude_types.go 的 gofmt 格式问题
    
    * feat(antigravity): 优化 thinking block 和 schema 处理
    
    - 为 dummy thinking block 添加 ThoughtSignature
    - 重构 thinking block 处理逻辑,在每个条件分支内创建 part
    - 优化 excludedSchemaKeys,移除 Gemini 实际支持的字段
      (minItems, maxItems, minimum, maximum, additionalProperties, format)
    - 添加详细注释说明 Gemini API 支持的 schema 字段
    
    * fix(antigravity): 增强 schema 清理的安全性
    
    基于 Codex review 建议:
    - 添加 format 字段白名单过滤,只保留 Gemini 支持的 date-time/date/time
    - 补充更多不支持的 schema 关键字到黑名单:
      * 组合 schema: oneOf, anyOf, allOf, not, if/then/else
      * 对象验证: minProperties, maxProperties, patternProperties 等
      * 定义引用: $defs, definitions
    - 避免不支持的 schema 字段导致 Gemini API 校验失败
    
    * fix(lint): 修复 gemini_messages_compat_service 空分支警告
    
    - 在 cleanToolSchema 的 if 语句中添加 continue
    - 移除重复的注释
    
    * fix(antigravity): 移除 minItems/maxItems 以兼容 Claude API
    
    - 将 minItems 和 maxItems 添加到 schema 黑名单
    - Claude API (Vertex AI) 不支持这些数组验证字段
    - 添加调试日志记录工具 schema 转换过程
    - 修复 tools.14.custom.input_schema 验证错误
    
    * fix(antigravity): 修复 additionalProperties schema 对象问题
    
    - 将 additionalProperties 的 schema 对象转换为布尔值 true
    - Claude API 只支持 additionalProperties: false,不支持 schema 对象
    - 修复 tools.14.custom.input_schema 验证错误
    - 参考 Claude 官方文档的 JSON Schema 限制
    
    * fix(antigravity): 修复 Claude 模型 thinking 块兼容性问题
    
    - 完全跳过 Claude 模型的 thinking 块以避免 signature 验证失败
    - 只在 Gemini 模型中使用 dummy thought signature
    - 修改 additionalProperties 默认值为 false(更安全)
    - 添加调试日志以便排查问题
    
    * fix(upstream): 修复跨模型切换时的 dummy signature 问题
    
    基于 Codex review 和用户场景分析的修复:
    
    1. 问题场景
       - Gemini (thinking) → Claude (thinking) 切换时
       - Gemini 返回的 thinking 块使用 dummy signature
       - Claude API 会拒绝 dummy signature,导致 400 错误
    
    2. 修复内容
       - request_transformer.go:262: 跳过 dummy signature
       - 只保留真实的 Claude signature
       - 支持频繁的跨模型切换
    
    3. 其他修复(基于 Codex review)
       - gateway_service.go:691: 修复 io.ReadAll 错误处理
       - gateway_service.go:687: 条件日志(尊重 LogUpstreamErrorBody 配置)
       - gateway_service.go:915: 收紧 400 failover 启发式
       - request_transformer.go:188: 移除签名成功日志
    
    4. 新增功能(默认关闭)
       - 阶段 1: 上游错误日志(GATEWAY_LOG_UPSTREAM_ERROR_BODY)
       - 阶段 2: Antigravity thinking 修复
       - 阶段 3: API-key beta 注入(GATEWAY_INJECT_BETA_FOR_APIKEY)
       - 阶段 3: 智能 400 failover(GATEWAY_FAILOVER_ON_400)
    
    测试:所有测试通过
    
    * fix(lint): 修复 golangci-lint 问题
    
    - 应用 De Morgan 定律简化条件判断
    - 修复 gofmt 格式问题
    - 移除未使用的 min 函数
    34c10204
gemini_messages_compat_service_test.go 3.01 KB