Experimentos
Plan de Gateway OpenResponses
Contexto
OpenClaw Gateway actualmente expone un endpoint mínimo compatible con OpenAI Chat Completions en /v1/chat/completions (ver OpenAI Chat Completions). Open Responses es un estándar de inferencia abierto basado en la API de Respuestas de OpenAI. Está diseñado para flujos de trabajo agenticos y utiliza entradas basadas en ítems más eventos de streaming semántico. La especificación OpenResponses define /v1/responses, no /v1/chat/completions.
Objetivos
- Añadir un endpoint
/v1/responsesque se adhiera a la semántica de OpenResponses. - Mantener Chat Completions como una capa de compatibilidad que sea fácil de deshabilitar y eventualmente eliminar.
- Estandarizar la validación y el análisis con esquemas reutilizables y aislados.
No objetivos
- Paridad completa de características de OpenResponses en la primera iteración (imágenes, archivos, herramientas alojadas).
- Reemplazar la lógica interna de ejecución de agentes o la orquestación de herramientas.
- Cambiar el comportamiento existente de
/v1/chat/completionsdurante la primera fase.
Resumen de Investigación
Fuentes: OpenAPI de OpenResponses, sitio de especificación de OpenResponses y la publicación del blog de Hugging Face. Puntos clave extraídos:
POST /v1/responsesacepta camposCreateResponseBodycomomodel,input(string oItemParam[]),instructions,tools,tool_choice,stream,max_output_tokens, ymax_tool_calls.ItemParames una unión discriminada de:- ítems
messagecon rolessystem,developer,user,assistant function_callyfunction_call_outputreasoningitem_reference
- ítems
- Las respuestas exitosas devuelven un
ResponseResourceconobject: "response",status, e ítemsoutput. - El streaming utiliza eventos semánticos como:
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
- La especificación requiere:
Content-Type: text/event-streamevent:debe coincidir con el campo JSONtype- el evento terminal debe ser el literal
[DONE]
- Los ítems de razonamiento pueden exponer
content,encrypted_content, ysummary. - Los ejemplos de HF incluyen
OpenResponses-Version: latesten las solicitudes (cabecera opcional).
Arquitectura Propuesta
- Añadir
src/gateway/open-responses.schema.tsque contenga solo esquemas Zod (sin importaciones de gateway). - Añadir
src/gateway/openresponses-http.ts(oopen-responses-http.ts) para/v1/responses. - Mantener
src/gateway/openai-http.tsintacto como un adaptador de compatibilidad heredado. - Añadir la configuración
gateway.http.endpoints.responses.enabled(por defectofalse). - Mantener
gateway.http.endpoints.chatCompletions.enabledindependiente; permitir que ambos endpoints se activen/desactiven por separado. - Emitir una advertencia al inicio cuando Chat Completions esté habilitado para señalar su estado heredado.
Ruta de Desuso para Chat Completions
- Mantener límites estrictos de módulos: sin tipos de esquema compartidos entre responses y chat completions.
- Hacer que Chat Completions sea opcional por configuración para que pueda deshabilitarse sin cambios de código.
- Actualizar la documentación para etiquetar Chat Completions como heredado una vez que
/v1/responsessea estable. - Paso futuro opcional: mapear solicitudes de Chat Completions al manejador de Responses para una ruta de eliminación más simple.
Subconjunto Soportado en Fase 1
- Aceptar
inputcomo string oItemParam[]con roles de mensaje yfunction_call_output. - Extraer mensajes de sistema y desarrollador en
extraSystemPrompt. - Usar el
userofunction_call_outputmás reciente como el mensaje actual para las ejecuciones del agente. - Rechazar partes de contenido no soportadas (imagen/archivo) con
invalid_request_error. - Devolver un único mensaje de asistente con contenido
output_text. - Devolver
usagecon valores en cero hasta que se conecte la contabilidad de tokens.
Estrategia de Validación (Sin SDK)
- Implementar esquemas Zod para el subconjunto soportado de:
CreateResponseBodyItemParam+ uniones de partes de contenido de mensajeResponseResource- Formas de eventos de streaming utilizadas por el gateway
- Mantener los esquemas en un único módulo aislado para evitar desviaciones y permitir futura generación de código.
Implementación de Streaming (Fase 1)
- Líneas SSE con
event:ydata:. - 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]
Plan de Pruebas y Verificación
- Añadir cobertura e2e para
/v1/responses:- Autenticación requerida
- Forma de respuesta sin streaming
- Orden de eventos de streaming y
[DONE] - Enrutamiento de sesión con cabeceras y
user
- Mantener
src/gateway/openai-http.test.tssin cambios. - Manual: curl a
/v1/responsesconstream: truey verificar el orden de eventos y el terminal[DONE].
Actualizaciones de Documentación (Seguimiento)
- Añadir una nueva página de documentación para el uso y ejemplos de
/v1/responses. - Actualizar
/gateway/openai-http-apicon una nota de legado y un enlace a/v1/responses.
Refactorización de Browser Evaluate CDPPlan de PTY y Supervisión de Procesos