• shuanbao0's avatar
    fix(gateway): 兼容 Cursor /v1/chat/completions 的 Responses API body · b7edc3ed
    shuanbao0 authored
    
    
    Cursor 云端 (User-Agent: Go-http-client/2.0) 发往 /v1/chat/completions 的
    body 使用 Responses API 格式:
        {"model":"gpt-5.4","input":[{"role":"system","content":"..."}],"stream":true}
    
    原代码用 ChatCompletionsRequest 反序列化,该结构体没有 Input 字段,
    Cursor 的 input 数组被静默丢弃,ChatCompletionsToResponses 转换后产出
    input: null,Codex 上游以 "Invalid type for 'input': expected a string,
    but got an object" 拒绝请求(上游 typeof null === 'object')。
    
    修复:在 ForwardAsChatCompletions 里用 gjson 检测 body shape,当 input
    存在且 messages 缺失时,跳过 Chat→Responses 转换,用 sjson 仅改写 model
    字段后原样透传 body。billing 所需的 ServiceTier 和 Reasoning.Effort 通过
    gjson 从 raw body 提取,下游 codex OAuth transform 路径保持不变。
    
    测试:新增 openai_cursor_warmup_pipeline_test.go,覆盖 5 个 shape 检测
    用例(正向/标准请求不误伤/两字段共存/空 body/JSON 回读)。
    Co-Authored-By: default avatarClaude Opus 4.6 (1M context) <noreply@anthropic.com>
    b7edc3ed
openai_gateway_chat_completions.go 18.4 KB