Содержание

Форматы и операции

Входящие API

Формат Эндпоинты
OpenAI /v1/models, /v1/completions, /v1/chat/completions, /v1/responses, /v1/embeddings, /v1/audio/speech, /v1/audio/transcriptions, /v1/audio/translations, /v1/images/generations, /v1/images/edits, /v1/images/variations
Anthropic /v1/models, /v1/messages, /v1/messages/count_tokens

Оба живут на одном префиксе /v1 — пути не пересекаются, кроме /v1/models, где диалект определяется по заголовкам: anthropic-version или x-api-key → Anthropic, иначе OpenAI.

Любой SDK работает, если указать base_url: http://gateway:8080/v1.

Операции по провайдерам

Операция OpenAI Anthropic Google Ollama/vLLM
List Models
Text Completion (+ Stream) ✅¹ ✅¹
Chat Completion (+ Stream)
Responses (+ Stream) ✅¹ ✅¹ ✅¹
Embedding
Speech (+ Stream)
Transcription (+ Stream)
Image Generation (+ Stream)
Image Edit (+ Stream)
Image Variation
Count Tokens —² —²

¹ Обслуживается трансляцией в основной эндпоинт провайдера — для клиента прозрачно.

² У OpenAI нет такого эндпоинта; возвращается честный 501, а не выдуманная оценка. Придуманное число здесь было бы хуже отказа: на него бы заложились.

Операция, которой у провайдера нет, отвечает 501 с указанием провайдера и операции. Адаптеры наследуют этот отказ по умолчанию и переопределяют только то, что действительно обслуживают, — поэтому добавление девятнадцатой операции в интерфейс не ломает все адаптеры сразу и не даёт разыменования nil.

Кросс-форматная трансляция

Клиент на OpenAI SDK может обслуживаться Anthropic и наоборот. Транслируется всё, включая стриминг в обе стороны.

Chat и Responses тоже переводятся друг в друга, в обе стороны и потоком — настраивается на провайдере, см. Провайдеры.

Стрим Anthropic блочно-ориентирован (content_block_start, _delta, _stop), OpenAI — плоский (choices[].delta). Между ними стейт-машины: собрать блоки в плоский поток и разобрать плоский поток на блоки — не симметричные задачи, и каждая написана отдельно.

Фрагменты аргументов инструментов приходят по частям; они склеиваются по индексу на проходе, так что журнал видит те же аргументы, что и клиент, а гейт при этом не буферизует ответ.

Эндпоинты Ollama

POST /api/show отвечает заглушкой. Клиенты Ollama спрашивают им про возможности модели до всякого запроса, и 404 они показывают пользователю как поломку сервера.

Отвечается тем минимумом, на который они действительно смотрят — capabilities, — а описательные поля (modelfile, template, параметры) остаются пустыми, а не выдуманными: они описывают, как Ollama сама запускала бы веса, чего гейт не знает и не мог бы честно заполнить.

В журнал не пишется и авторизации не требует. Остальные /api/* не реализованы.

Служебное

GET /healthz — генерация конфига и счётчики логов, без авторизации:

{"status":"ok","config_generation":7,"logs_written":1204,"logs_dropped":0}

config_generation растёт при каждой успешной перезагрузке конфига. Если правка в панели не подействовала, смотреть надо сюда первым делом.