OpenResponses Gateway Plan
Plan d’intégration OpenResponses Gateway
Section intitulée « Plan d’intégration OpenResponses Gateway »Contexte
Section intitulée « Contexte »Le OpenClaw Gateway expose actuellement un point de terminaison minimal compatible Chat Completions OpenAI à
/v1/chat/completions (voir Chat Completions OpenAI).
Open Responses est une norme d’inférence ouverte basée sur l’OpenAI des Réponses API. Elle est conçue
pour les flux de travail d’agents et utilise des entrées basées sur des éléments ainsi que des événements de flux sémantiques. La spécification OpenResponses
définit /v1/responses, et non /v1/chat/completions.
Objectifs
Section intitulée « Objectifs »- Ajouter un point de terminaison
/v1/responsesqui adhère à la sémantique OpenResponses. - Conserver Chat Completions comme une couche de compatibilité facile à désactiver et à supprimer éventuellement.
- Standardiser la validation et l’analyse avec des schémas isolés et réutilisables.
Hors objectifs
Section intitulée « Hors objectifs »- Parité complète des fonctionnalités OpenResponses lors de la première phase (images, fichiers, outils hébergés).
- Remplacer la logique d’exécution de l’agent interne ou l’orchestration des outils.
- Modifier le comportement
/v1/chat/completionsexistant lors de la première phase.
Résumé de la recherche
Section intitulée « Résumé de la recherche »Sources : OpenResponses OpenAPI, site de spécification OpenResponses, et l’article de blog Hugging Face.
Points clés extraits :
POST /v1/responsesaccepte les champsCreateResponseBodytels quemodel,input(chaîne ouItemParam[]),instructions,tools,tool_choice,stream,max_output_tokens, etmax_tool_calls.ItemParamest une union discriminée de :- Éléments
messageavec les rôlessystem,developer,user,assistant function_calletfunction_call_outputreasoningitem_reference
- Éléments
- Les réponses réussies renvoient un
ResponseResourceavec des élémentsobject: "response",statusetoutput. - Le streaming utilise des événements sémantiques tels que :
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 spécification exige :
Content-Type: text/event-streamevent:doit correspondre au champ JSONtype- l’événement terminal doit être littéral
[DONE]
- Les éléments de raisonnement peuvent exposer
content,encrypted_contentetsummary. - Les exemples HF incluent
OpenResponses-Version: latestdans les requêtes (en-tête optionnel).
Architecture proposée
Section intitulée « Architecture proposée »- Ajouter
src/gateway/open-responses.schema.tscontenant uniquement des schémas Zod (pas d’importations de passerelle). - Ajouter
src/gateway/openresponses-http.ts(ouopen-responses-http.ts) pour/v1/responses. - Conserver
src/gateway/openai-http.tsintact en tant qu’adaptateur de compatité hérité. - Ajouter la configuration
gateway.http.endpoints.responses.enabled(par défautfalse). - Garder
gateway.http.endpoints.chatCompletions.enabledindépendant ; autoriser l’activation des deux points de terminaison séparément. - Émettre un avertissement au démarrage lorsque Chat Completions est activé pour signaler son statut hérité.
Chemine de dépréciation pour Chat Completions
Section intitulée « Chemine de dépréciation pour Chat Completions »- Maintenir des limites de module strictes : aucun type de schéma partagé entre les réponses et les complétions de chat.
- Rendre les complétions de chat optionnelles via la configuration afin qu’elles puissent être désactivées sans modification du code.
- Mettre à jour la documentation pour étiqueter les complétions de chat comme obsolètes une fois
/v1/responsesest stable. - Étape future facultative : mapper les demandes de complétions de chat vers le gestionnaire de réponses pour un chemin de suppression plus simple.
Sous-ensemble pris en charge Phase 1
Section intitulée « Sous-ensemble pris en charge Phase 1 »- Accepter
inputcomme chaîne ouItemParam[]avec des rôles de message etfunction_call_output. - Extraire les messages système et développeur dans
extraSystemPrompt. - Utiliser le
userou lefunction_call_outputle plus récent comme message actuel pour les exécutions d’agent. - Rejeter les parties de contenu non prises en charge (image/fichier) avec
invalid_request_error. - Renvoyer un seul message assistant avec le contenu
output_text. - Renvoyer
usageavec des valeurs mises à zéro jusqu’à ce que la comptabilisation des jetons soit connectée.
Stratégie de validation (sans SDK)
Section intitulée « Stratégie de validation (sans SDK) »- Implémenter des schémas Zod pour le sous-ensemble pris en charge de :
CreateResponseBodyItemParam+ unions de parties de contenu de messageResponseResource- Formes d’événements de streaming utilisées par la passerelle
- Garder les schémas dans un module unique et isolé pour éviter la dérive et permettre une génération de code future.
Implémentation du streaming (Phase 1)
Section intitulée « Implémentation du streaming (Phase 1) »- Lignes SSE avec à la fois
event:etdata:. - Séquence requise (minimum viable) :
response.createdresponse.output_item.addedresponse.content_part.addedresponse.output_text.delta(répéter si nécessaire)response.output_text.doneresponse.content_part.doneresponse.completed[DONE]
Plan de tests et de vérification
Section intitulée « Plan de tests et de vérification »- Ajouter une couverture e2e pour
/v1/responses:- Authentification requise
- Forme de réponse non-stream
- Ordre des événements de flux et
[DONE] - Routage de session avec des en-têtes et
user
- Garder
src/gateway/openai-http.test.tsinchangé. - Manuel : curl vers
/v1/responsesavecstream: trueet vérifier l’ordre des événements et le terminal[DONE].
Mises à jour de la documentation (Suite)
Section intitulée « Mises à jour de la documentation (Suite) »- Ajouter une nouvelle page de documentation pour l’utilisation et les exemples de
/v1/responses. - Mettre à jour
/gateway/openai-http-apiavec une note d’obsolètes et un pointeur vers/v1/responses.