Skip to content

feat(gateway): /v1/responses——OpenAI Responses API 双向翻译(流式/非流式/previous_response_id LRU) - #9

Open
jk-uzi wants to merge 1 commit into
dengyie:mainfrom
jk-uzi:pr/gateway-responses
Open

jk-uzi wants to merge 1 commit into
dengyie:mainfrom
jk-uzi:pr/gateway-responses

Conversation

@jk-uzi

@jk-uzi jk-uzi commented Oct 5, 2026

Copy link
Copy Markdown

概述

新增 OpenAI Responses API 兼容端点 POST /v1/responses,将 Responses 协议双向翻译为上游 Anthropic Messages 协议。目标客户端:Codex CLI 等原生走 Responses 协议的调用方。

实现

  • 新增 app/responses_compat.py:
    • responses_to_anthropic:instructions→system;input 条目(message/reasoning/function_call/function_call_output,兼容客户端无 type 的 chat 简写发法)→ Anthropic 消息与块,相邻同角色合并;reasoning.effort 映射 minimal/low→low、high→high、xhigh→max(medium 即上游默认档,不带字段);max_output_tokens→max_tokens;tools 仅映射 function 类型
    • anthropic_to_responses:thinking→reasoning(summary_text)、text→message(output_text)、tool_use→function_call;stop_reason=max_tokens→status:"incomplete"
    • ResponsesStreamConverter:Anthropic SSE → Responses SSE(event:+data: 帧、sequence_number 递增、无 [DONE] 哨兵、以 response.completed 收尾)
  • 新增 app/response_store.py:previous_response_id 内存 LRU(256 条、线程锁、重启清零);首轮 input 同样入库,保证第二轮续接不丢首轮 user 内容
  • 路由 POST /v1/responses 镜像 /v1/chat/completions:鉴权/provider/归一化/reqlog(kind=responses)/调度容灾全套复用,_dispatch 与 _try_account 零改动
  • 空映射结果本地 400 早失败(附可读提示),不把空 messages: [] 发上游

测试

  • 单测 45 + 集成 7(tests/unit/test_responses_compat.py、tests/integration/test_gateway_responses.py,Mock 上游,离线可跑)
  • 真实上游冒烟:非流式 / 流式事件序 / previous_response_id 两轮续接均通过

文档

  • docs/development/04-api-spec.md:新增 §1.4 端点小节(字段映射、effort 映射表、LRU 语义、流式事件序);§1.6 错误表补 previous_response_id 未命中
  • README:三协议口径;测试文档登记 RS-001015 / INT-040045;路线图 M2 对应项打勾

设计取舍

  • response_store 为进程内存 LRU(与 reqlog 同哲学:续接便利而非持久会话,重启清零,客户端可重发全量 input 兜底)
  • 加密推理(encrypted_content)透传与服务端持久化 store=true 未实现(上游无对应概念),文档已注明

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