План интеграции OpenResponses Gateway
Контекст
Mayros Gateway в настоящее время предоставляет минимальный совместимый с OpenAI эндпоинт Chat Completions на
/v1/chat/completions (см. OpenAI Chat Completions).
Open Responses - это открытый стандарт вывода, основанный на Responses API OpenAI. Он разработан
для агентских рабочих процессов и использует входные данные на основе элементов плюс семантические события потоковой передачи. Спецификация OpenResponses
определяет /v1/responses, а не /v1/chat/completions.
Цели
- Добавить эндпоинт
/v1/responses, соответствующий семантике OpenResponses. - Сохранить Chat Completions как слой совместимости, который легко отключить и в конечном итоге удалить.
- Стандартизировать валидацию и разбор с изолированными, переиспользуемыми схемами.
Не-цели
- Полная поддержка функций OpenResponses в первом проходе (изображения, файлы, размещенные инструменты).
- Замена внутренней логики выполнения агента или оркестрации инструментов.
- Изменение существующего поведения
/v1/chat/completionsво время первой фазы.
Резюме исследования
Источники: OpenAPI OpenResponses, сайт спецификации OpenResponses и пост в блоге Hugging Face.
Извлеченные ключевые пункты:
POST /v1/responsesпринимает поляCreateResponseBody, такие какmodel,input(строка илиItemParam[]),instructions,tools,tool_choice,stream,max_output_tokensиmax_tool_calls.ItemParam- это размеченное объединение:- элементы
messageс ролямиsystem,developer,user,assistant function_callиfunction_call_outputreasoningitem_reference
- элементы
- Успешные ответы возвращают
ResponseResourceсobject: "response",statusи элементамиoutput. - Потоковая передача использует семантические события, такие как:
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
- Спецификация требует:
Content-Type: text/event-streamevent:должен совпадать с полем JSONtype- терминальное событие должно быть буквальным
[DONE]
- Элементы Reasoning могут предоставлять
content,encrypted_contentиsummary. - Примеры HF включают
OpenResponses-Version: latestв запросах (опциональный заголовок).
Предлагаемая архитектура
- Добавить
src/gateway/open-responses.schema.ts, содержащий только схемы Zod (без импортов gateway). - Добавить
src/gateway/openresponses-http.ts(илиopen-responses-http.ts) для/v1/responses. - Сохранить
src/gateway/openai-http.tsнетронутым как адаптер совместимости legacy. - Добавить конфигурацию
gateway.http.endpoints.responses.enabled(по умолчаниюfalse). - Сохранить
gateway.http.endpoints.chatCompletions.enabledнезависимым; разрешить оба эндпоинта переключаться отдельно. - Выдавать предупреждение при запуске, когда Chat Completions включен, для сигнализации статуса legacy.
Путь устаревания для Chat Completions
- Поддерживать строгие границы модулей: нет общих типов схем между responses и chat completions.
- Сделать Chat Completions opt-in через конфигурацию, чтобы его можно было отключить без изменений кода.
- Обновить документацию для маркировки Chat Completions как legacy после стабилизации
/v1/responses. - Опциональный будущий шаг: отображать запросы Chat Completions на обработчик Responses для более простого пути удаления.
Поддерживаемое подмножество фазы 1
- Принять
inputкак строку илиItemParam[]с ролями сообщений иfunction_call_output. - Извлечь system и developer сообщения в
extraSystemPrompt. - Использовать самое последнее сообщение
userилиfunction_call_outputкак текущее сообщение для запусков агента. - Отклонять неподдерживаемые части содержимого (image/file) с
invalid_request_error. - Возвращать одно сообщение assistant с содержимым
output_text. - Возвращать
usageс обнуленными значениями до подключения учета токенов.
Стратегия валидации (без SDK)
- Реализовать схемы Zod для поддерживаемого подмножества:
CreateResponseBodyItemParam+ объединения частей содержимого сообщенийResponseResource- Формы событий потоковой передачи, используемые gateway
- Сохранить схемы в одном, изолированном модуле, чтобы избежать расхождения и разрешить будущую кодогенерацию.
Реализация потоковой передачи (фаза 1)
- SSE строки с обоими
event:иdata:. - Требуемая последовательность (минимально жизнеспособная):
response.createdresponse.output_item.addedresponse.content_part.addedresponse.output_text.delta(повторять по необходимости)response.output_text.doneresponse.content_part.doneresponse.completed[DONE]
План тестов и проверки
- Добавить e2e покрытие для
/v1/responses:- Требуется аутентификация
- Форма ответа без потоковой передачи
- Порядок событий потоковой передачи и
[DONE] - Маршрутизация сессий с заголовками и
user
- Сохранить
src/gateway/openai-http.e2e.test.tsбез изменений. - Вручную: curl к
/v1/responsesсstream: trueи проверить порядок событий и терминальный[DONE].
Обновления документации (продолжение)
- Добавить новую страницу документации для использования
/v1/responsesи примеров. - Обновить
/gateway/openai-http-apiс заметкой legacy и указателем на/v1/responses.