OpenResponses Gateway 통합 계획
맥락
OpenClaw Gateway 는 현재/v1/chat/completions 에서 최소한의 OpenAI 호환 Chat Completions 엔드포인트를 노출한다(OpenAI Chat Completions 참고).
Open Responses 는 OpenAI Responses API 를 기반으로 한 공개 추론 표준이다. 에이전트형 워크플로를 위해 설계되었으며 item 기반 입력과 의미론적 스트리밍 이벤트를 사용한다. OpenResponses 사양은 /v1/chat/completions 가 아니라 /v1/responses 를 정의한다.
목표
- OpenResponses 의미론을 따르는
/v1/responses엔드포인트를 추가한다. - Chat Completions 는 쉽게 비활성화하고 결국 제거할 수 있는 호환 계층으로 유지한다.
- 검증과 파싱을 격리되고 재사용 가능한 스키마로 표준화한다.
비목표
- 첫 단계에서 OpenResponses 전체 기능(images, files, hosted tools)까지 모두 맞추지는 않는다.
- 내부 에이전트 실행 로직이나 tool orchestration 을 교체하지 않는다.
- 첫 단계에서는 기존
/v1/chat/completions동작을 변경하지 않는다.
리서치 요약
출처: OpenResponses OpenAPI, OpenResponses specification site, Hugging Face 블로그 글. 추출된 핵심 사항:POST /v1/responses는model,input(string 또는ItemParam[]),instructions,tools,tool_choice,stream,max_output_tokens,max_tool_calls같은CreateResponseBody필드를 받는다.ItemParam은 다음에 대한 discriminated union 이다.- 역할이
system,developer,user,assistant인message항목 function_call,function_call_outputreasoningitem_reference
- 역할이
- 성공 응답은
object: "response",status,output항목을 가진ResponseResource를 반환한다. - 스트리밍은 다음과 같은 의미론적 이벤트를 사용한다.
response.created,response.in_progress,response.completed,response.failedresponse.output_item.added,response.output_item.doneresponse.content_part.added,response.content_part.doneresponse.output_text.delta,response.output_text.done
- 사양은 다음을 요구한다.
Content-Type: text/event-streamevent:값은 JSON 의type필드와 일치해야 함- 종료 이벤트는 문자 그대로
[DONE]이어야 함
- reasoning 항목은
content,encrypted_content,summary를 노출할 수 있다. - HF 예제는 요청에
OpenResponses-Version: latest헤더를 포함한다(선택 사항).
제안 아키텍처
- Zod 스키마만 담는
src/gateway/open-responses.schema.ts를 추가한다(gateway import 없음). /v1/responses용으로src/gateway/openresponses-http.ts(또는open-responses-http.ts)를 추가한다.src/gateway/openai-http.ts는 레거시 호환 어댑터로 유지한다.- 설정
gateway.http.endpoints.responses.enabled를 추가한다(기본값false). gateway.http.endpoints.chatCompletions.enabled는 독립적으로 유지하여 두 엔드포인트를 별도로 토글할 수 있게 한다.- Chat Completions 가 활성화되어 있으면 시작 시 레거시 상태를 알리는 경고를 출력한다.
Chat Completions 폐기 경로
- 엄격한 모듈 경계를 유지한다. responses 와 chat completions 가 스키마 타입을 공유하지 않도록 한다.
- Chat Completions 는 설정 기반 opt-in 으로 만들어 코드 변경 없이 비활성화 가능하게 한다.
/v1/responses가 안정화되면 문서에서 Chat Completions 를 레거시로 표시한다.- 향후 선택 과제로, 제거 경로를 단순화하기 위해 Chat Completions 요청을 Responses 핸들러로 매핑할 수 있다.
Phase 1 지원 범위
input으로 string 또는 message 역할과function_call_output을 포함한ItemParam[]을 받는다.- system 및 developer 메시지를
extraSystemPrompt로 추출한다. - 에이전트 실행 시 가장 최근의
user또는function_call_output을 현재 메시지로 사용한다. - 지원하지 않는 content part(image/file)는
invalid_request_error로 거부한다. output_text콘텐츠를 담은 단일 assistant 메시지를 반환한다.- 토큰 집계가 연결되기 전까지
usage는 0 값으로 반환한다.
검증 전략(SDK 없이)
- 다음 지원 범위에 대한 Zod 스키마를 구현한다.
CreateResponseBodyItemParam+ message content part unionResponseResource- gateway 가 사용하는 streaming event shape
- 드리프트를 막고 향후 코드 생성을 쉽게 하도록 스키마는 하나의 격리된 모듈에 둔다.
스트리밍 구현(Phase 1)
- SSE 라인에
event:와data:를 모두 포함한다. - 요구되는 최소 시퀀스:
response.createdresponse.output_item.addedresponse.content_part.addedresponse.output_text.delta(필요한 만큼 반복)response.output_text.doneresponse.content_part.doneresponse.completed[DONE]
테스트 및 검증 계획
/v1/responses에 대한 e2e 커버리지를 추가한다.- 인증 필요
- 비스트림 응답 형태
- 스트림 이벤트 순서와
[DONE] - 헤더와
user를 이용한 세션 라우팅
src/gateway/openai-http.test.ts는 변경하지 않는다.- 수동 확인:
stream: true로/v1/responses에 curl 을 보내고 이벤트 순서와 종료[DONE]를 검증한다.
문서 업데이트(후속)
/v1/responses사용법과 예제를 위한 새 문서 페이지를 추가한다./gateway/openai-http-api를 업데이트해 레거시 안내와/v1/responses포인터를 추가한다.