Plan de integración OpenResponses en el Gateway
Contexto
El Gateway de OpenClaw actualmente expone un endpoint minimal compatible con OpenAI Chat Completions en /v1/chat/completions (ver API HTTP de OpenAI Chat Completions).
Open Responses es un estándar abierto de inferencia basado en la API Responses de OpenAI. Está diseñado para flujos de trabajo con agentes y usa entradas basadas en items más eventos de streaming semánticos. La especificación OpenResponses define /v1/responses, no /v1/chat/completions.
Objetivos
- Agregar un endpoint
/v1/responsesque se adhiera a la semántica de OpenResponses. - Mantener Chat Completions como una capa de compatibilidad fácil de desactivar y eventualmente eliminar.
- Estandarizar validación y parsing con esquemas aislados y reutilizables.
No objetivos
- Paridad completa de funcionalidades OpenResponses en la primera pasada (imágenes, archivos, herramientas alojadas).
- Reemplazar la lógica interna de ejecución del agente u orquestación de herramientas.
- Cambiar el comportamiento existente de
/v1/chat/completionsdurante la primera fase.
Arquitectura propuesta
- Agregar
src/gateway/open-responses.schema.tscon solo esquemas Zod (sin imports del gateway). - Agregar
src/gateway/openresponses-http.ts(oopen-responses-http.ts) para/v1/responses. - Mantener
src/gateway/openai-http.tsintacto como adaptador de compatibilidad legacy. - Agregar configuración
gateway.http.endpoints.responses.enabled(por defectofalse). - Mantener
gateway.http.endpoints.chatCompletions.enabledindependiente; permitir alternar ambos endpoints por separado.
Ruta de deprecación de Chat Completions
- Mantener límites estrictos de módulo: sin tipos de esquema compartidos entre responses y chat completions.
- Hacer Chat Completions opt-in por configuración para que pueda desactivarse sin cambios de código.
- Actualizar documentación para etiquetar Chat Completions como legacy una vez que
/v1/responsesesté estable.
Implementación de streaming (Fase 1)
- Líneas SSE con tanto
event:comodata:. - Secuencia requerida (mínimo viable):
response.createdresponse.output_item.addedresponse.content_part.addedresponse.output_text.delta(repetir según sea necesario)response.output_text.doneresponse.content_part.doneresponse.completed[DONE]