Форматы и операции
Входящие 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 | 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 и наоборот. Транслируется всё, включая стриминг в обе стороны.
Стрим 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 растёт при каждой успешной перезагрузке конфига. Если правка
в панели не подействовала, смотреть надо сюда первым делом.