메인 콘텐츠로 건너뛰기

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/responsesmodel, input (string 또는 ItemParam[]), instructions, tools, tool_choice, stream, max_output_tokens, max_tool_calls 같은 CreateResponseBody 필드를 받는다.
  • ItemParam 은 다음에 대한 discriminated union 이다.
    • 역할이 system, developer, user, assistantmessage 항목
    • function_call, function_call_output
    • reasoning
    • item_reference
  • 성공 응답은 object: "response", status, output 항목을 가진 ResponseResource 를 반환한다.
  • 스트리밍은 다음과 같은 의미론적 이벤트를 사용한다.
    • response.created, response.in_progress, response.completed, response.failed
    • response.output_item.added, response.output_item.done
    • response.content_part.added, response.content_part.done
    • response.output_text.delta, response.output_text.done
  • 사양은 다음을 요구한다.
    • Content-Type: text/event-stream
    • event: 값은 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 스키마를 구현한다.
    • CreateResponseBody
    • ItemParam + message content part union
    • ResponseResource
    • gateway 가 사용하는 streaming event shape
  • 드리프트를 막고 향후 코드 생성을 쉽게 하도록 스키마는 하나의 격리된 모듈에 둔다.

스트리밍 구현(Phase 1)

  • SSE 라인에 event:data: 를 모두 포함한다.
  • 요구되는 최소 시퀀스:
    • response.created
    • response.output_item.added
    • response.content_part.added
    • response.output_text.delta (필요한 만큼 반복)
    • response.output_text.done
    • response.content_part.done
    • response.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 포인터를 추가한다.