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/responses que 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/completions durante la primera fase.

Arquitectura propuesta

  • Agregar src/gateway/open-responses.schema.ts con solo esquemas Zod (sin imports del gateway).
  • Agregar src/gateway/openresponses-http.ts (o open-responses-http.ts) para /v1/responses.
  • Mantener src/gateway/openai-http.ts intacto como adaptador de compatibilidad legacy.
  • Agregar configuración gateway.http.endpoints.responses.enabled (por defecto false).
  • Mantener gateway.http.endpoints.chatCompletions.enabled independiente; 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/responses esté estable.

Implementación de streaming (Fase 1)

  • Líneas SSE con tanto event: como data:.
  • Secuencia requerida (mínimo viable):
    • response.created
    • response.output_item.added
    • response.content_part.added
    • response.output_text.delta (repetir según sea necesario)
    • response.output_text.done
    • response.content_part.done
    • response.completed
    • [DONE]