OpenResponses Gateway 통합 계획
배경
OpenClaw Gateway는 현재 /v1/chat/completions에 최소한의 OpenAI 호환 Chat Completions 엔드포인트를 노출합니다 (OpenAI Chat Completions 참조).
Open Responses는 OpenAI Responses API를 기반으로 한 개방형 추론 표준입니다. 에이전트 워크플로를 위해 설계되었으며 항목 기반 입력과 시맨틱 스트리밍 이벤트를 사용합니다. OpenResponses 명세는 /v1/chat/completions가 아닌 /v1/responses를 정의합니다.
목표
- OpenResponses 시맨틱을 따르는
/v1/responses엔드포인트 추가. - Chat Completions를 비활성화하기 쉽고 최종적으로 제거할 수 있는 호환성 레이어로 유지.
- 격리된 재사용 가능한 스키마로 유효성 검증 및 파싱 표준화.
비목표
- 첫 패스에서 완전한 OpenResponses 기능 동등성 (이미지, 파일, 호스팅 도구).
- 내부 에이전트 실행 로직이나 도구 오케스트레이션 교체.
- 첫 단계에서 기존
/v1/chat/completions동작 변경.
제안 아키텍처
/v1/responses를 위한src/gateway/openresponses-http.ts(또는open-responses-http.ts) 추가.- Zod 스키마만 포함하는
src/gateway/open-responses.schema.ts추가 (게이트웨이 임포트 없음). src/gateway/openai-http.ts는 레거시 호환성 어댑터로 유지.- 설정
gateway.http.endpoints.responses.enabled추가 (기본false). gateway.http.endpoints.chatCompletions.enabled는 독립적으로 유지; 두 엔드포인트를 개별 토글 가능.- Chat Completions가 활성화되면 시작 시 레거시 상태를 알리는 경고 발생.
1단계 지원 범위
input을 문자열 또는 메시지 역할과function_call_output가 있는ItemParam[]로 수용.- 시스템 및 개발자 메시지를
extraSystemPrompt로 추출. - 가장 최근
user또는function_call_output을 에이전트 실행을 위한 현재 메시지로 사용. - 지원되지 않는 콘텐츠 파트(이미지/파일)는
invalid_request_error로 거부. output_text콘텐츠가 있는 단일 어시스턴트 메시지 반환.- 토큰 계정이 연결될 때까지 0값으로
usage반환.
스트리밍 구현 (1단계)
event:와data:모두 포함하는 SSE 라인.- 필수 시퀀스 (최소 실행 가능):
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는 변경 없이 유지.
Chat Completions 폐지 경로
- 엄격한 모듈 경계 유지: responses와 chat completions 간 공유 스키마 타입 없음.
- Chat Completions를 설정으로 옵트인하여 코드 변경 없이 비활성화 가능.
/v1/responses가 안정화되면 Chat Completions를 레거시로 표시하도록 문서 업데이트.- 선택적 향후 단계: 더 단순한 제거 경로를 위해 Chat Completions 요청을 Responses 핸들러로 매핑.