Поддерживаемые провайдеры

OpenAI

Конвертация OpenAI API в Meridian — что важно знать при работе с OpenAI через единый интерфейс.

Обзор

OpenAI — это базовая схема для Meridian. При работе с OpenAI напрямую параметры пробрасываются с минимальной конверсией: преимущественно валидация и фильтрация специфичных для OpenAI полей.

Поддерживаемые операции

ОперацияБез стримингаСтримингЭндпоинт
Chat Completions/v1/chat/completions
Responses API/v1/responses
Text Completions/v1/completions
Embeddings/v1/embeddings
Speech (TTS)/v1/audio/speech
Transcriptions (STT)/v1/audio/transcriptions
Image Generation/v1/images/generations
Image Edit/v1/images/edits
Image Variation/v1/images/variations
Files/v1/files
Batch/v1/batches
Video Generation/v1/videos
List Models/v1/models

1. Chat Completions

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringИдентификатор модели
messagesarrayМассив ChatMessage (docs)
temperaturefloatSampling temperature (0–2)
top_pfloatNucleus sampling
stopstring/arrayСтоп-последовательности
max_completion_tokensintМинимум 16, максимум — output tokens
frequency_penaltyfloatFrequency penalty (−2…2)
presence_penaltyfloatPresence penalty (−2…2)
logit_biasobjectКорректировки logit'ов токенов
logprobsboolВключить log-вероятности
top_logprobsintКоличество log-вероятностей на токен
seedintSeed для воспроизводимости
response_formatobjectФормат вывода (docs)
toolsarrayОбъекты Tool (docs)
tool_choicestring/object"auto", "none", "required" или конкретный инструмент
parallel_tool_callsboolРазрешить несколько одновременных tool-вызовов
stream_optionsobjectПараметры стриминга (docs)
reasoningobjectReasoning-параметры (docs)
userstringУсечён до 64 символов
metadataobjectПроизвольные метаданные
storeboolФильтруется при роутинге не в OpenAI
service_tierstringФильтруется при роутинге не в OpenAI
prompt_cache_keystringФильтруется при роутинге не в OpenAI
predictionobjectPredicted output для ускорения
audioobjectКонфигурация аудио-вывода
modalitiesarrayМодальности ответа (text, audio)

  • Reasoning. OpenAI поддерживает reasoning.effort (minimal, low, medium, high) и reasoning.max_tokens — оба пробрасываются напрямую. При роутинге в других провайдеров значение "minimal" приводится к "low" для совместимости.
  • Сообщения. Поддерживаются все роли: system, user, assistant, tool, developer (трактуется как system). Типы контента: текст, изображения по URL (image_url), аудио-вход (input_audio). Tool-сообщения содержат tool_call_id.
  • Инструменты. Стандартный формат OpenAI с поддержкой strict-режима. Tool choice: "auto", "none", "required" или конкретный инструмент по имени.
  • Ответы. Пробрасываются в стандартном формате OpenAI. Finish reasons: stop, length, tool_calls, content_filter. В usage содержатся счётчики токенов, при необходимости — детализация cached/reasoning токенов.
  • Стриминг. Server-Sent Events с delta.content, delta.tool_calls, finish_reason и usage (только в финальном чанке; Meridian подставляет автоматически). По умолчанию для всех стриминговых вызовов выставляется stream_options: { include_usage: true }.
  • Cache control. Поля cache_control удаляются из сообщений, content-блоков и определений инструментов перед отправкой.
  • Token enforcement. Для max_completion_tokens действует минимум 16: меньшие значения автоматически приводятся к 16.
  • Специальная обработка. Поле user усекается до 64 символов; prompt_cache_key, store, service_tier фильтруются при роутинге к не-OpenAI-провайдерам.

2. Responses API

Responses API — это API структурированного вывода от OpenAI.

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringИдентификатор модели
inputstring/arrayТекст или массив ContentBlock (docs)
max_output_tokensintМаксимальная длина вывода
backgroundboolЗапуск запроса в фоновом режиме
conversationstringID conversation для продолжения диалога
includearrayПоля для включения в ответ (например, "web_search_call.action.sources")
instructionsstringSystem-инструкции
max_tool_callsintМаксимальное число tool-вызовов
metadataobjectПроизвольные метаданные
parallel_tool_callsboolРазрешить параллельные tool-вызовы
previous_response_idstringID предыдущего ответа для продолжения
prompt_cache_keystringКлюч для prompt caching
reasoningobjectКонфигурация ResponsesParametersReasoning
safety_identifierstringИдентификатор для content filtering
service_tierstringService tier для запроса
stream_optionsobjectКонфигурация ResponsesStreamOptions
storeboolСохранить ответ для последующего получения
temperaturefloatSampling temperature
textobjectResponsesTextConfig для форматирования вывода
top_logprobsintЧисло log-вероятностей на токен
top_pfloatNucleus sampling
tool_choicestring/objectСтратегия ResponsesToolChoice
toolsarrayОбъекты ResponsesTool (docs)
truncationstringСтратегия усечения (auto или off)
userstringУсечён до 64 символов

Особая обработка сообщений (gpt-oss vs другие модели). OpenAI обрабатывает reasoning по-разному в зависимости от семейства моделей:

  • Не-gpt-oss модели (GPT-4o, o1 и т. п.): reasoning отправляется как summary. Reasoning-only сообщения (без summary, только с content-блоками) фильтруются — эти модели не принимают reasoning-блоки в запросе.
  • gpt-oss модели: reasoning отправляется как content blocks. Reasoning-summary в запросе конвертируются в content-блоки, потому что gpt-oss ожидает structured-блоки, а не summary.

Эта конверсия обеспечивает совместимость между разными архитектурами моделей в structured Responses API.

Token & parameter enforcement:

  • Для max_output_tokens действует минимум 16: меньшие значения автоматически приводятся к 16.
  • Поле reasoning.max_tokens автоматически удаляется из JSON-вывода (OpenAI Responses API его не принимает).

Прочие конверсии:

  • Action types zoom и region приводятся к screenshot.
  • Поля cache_control удаляются из сообщений и определений инструментов.
  • Неподдерживаемые типы инструментов тихо фильтруются (поддерживаются только: function, file_search, computer_use_preview, web_search, mcp, code_interpreter, image_generation, local_shell, custom, web_search_preview).

Ответ: содержит id, status (completed, incomplete, pending, error), массив output с контентом и usage.

Стриминг: Server-Sent Events с типами событий response.created, response.in_progress, response.output_item.added, response.content_part.added, response.output_text.delta, response.function_call_arguments.delta, response.completed, response.incomplete. По умолчанию для всех стриминговых вызовов выставляется stream_options: { include_usage: true }.


3. Text Completions (legacy)

Text Completions — legacy-API. Для новых интеграций используйте Chat Completions.

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringИдентификатор модели
promptstring/arrayПромпт(ы) для completion
max_tokensintМаксимум output-токенов
temperaturefloatSampling temperature
top_pfloatNucleus sampling
stopstring/arrayСтоп-последовательности
userstringУсечён до 64 символов

  • Массив prompts генерирует несколько completion'ов. Finish reasons: stop или length. Стриминг — SSE-формат, по умолчанию stream_options: { include_usage: true }.
  • Поле user усекается до 64 символов или сбрасывается в nil, если превышает лимит.

4. Embeddings

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringИдентификатор модели
inputstring/arrayТекст(ы) для embedding (docs)
encoding_formatstringfloat или base64
dimensionsintРазмерность выходного embedding
userstringНЕ усекается (в отличие от chat/text)

  • Стриминг не поддерживается. Возвращает массив embedding со счётчиками usage.

5. Speech (Text-to-Speech)

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringtts-1 или tts-1-hd
inputstringТекст для синтеза
voicestringalloy, echo, fable, onyx, nova, shimmer
response_formatstringmp3, opus, aac, flac, wav, pcm
speedfloat0.25–4.0 (по умолчанию 1.0)

  • Возвращает сырые бинарные аудио-данные. Стриминг поддерживается через SSE (base64-чанки), но не для всех моделей. По умолчанию stream_options: { include_usage: true }.

6. Transcriptions (Speech-to-Text)

Запросы используют multipart/form-data, а не JSON.

Параметры запроса

ПараметрТипОбязательныйЗамечания
filebinaryАудио-файл (multipart form-data)
modelstringwhisper-1
languagestringISO-639-1 код языка
promptstringПодсказывающий контекст
temperaturefloatSampling temperature
response_formatstringjson, text, srt, vtt, verbose_json

  • Поддерживаемые форматы аудио: mp3, mp4, mpeg, mpga, m4a, wav, webm.
  • Ответ содержит text, task, language, duration и опционально word-level timing. Стриминг — SSE, по умолчанию stream_options: { include_usage: true }.

7. Image Generation

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringИдентификатор модели (например, dall-e-3)
promptstringТекстовое описание изображения
nintЧисло изображений (1–10)
sizestring"256x256", "512x512", "1024x1024", "1792x1024", "1024x1792", "1536x1024", "1024x1536", "auto"
qualitystring"auto", "high", "medium", "low", "hd", "standard"
stylestring"natural", "vivid"
response_formatstring"url" или "b64_json"
backgroundstring"transparent", "opaque", "auto"
output_formatstring"png", "webp", "jpeg"
output_compressionintУровень компрессии (0–100%)
partial_imagesintЧисло партий частичных изображений (0–3)
moderationstring"low", "auto"
userstringИдентификатор пользователя

Конверсия запроса. OpenAI — базовая схема для image generation. Параметры пробрасываются с минимальной конверсией:

  • Model и Prompt: bifrostReq.Modelreq.Model, bifrostReq.Promptreq.Prompt.
  • Параметры: все поля из bifrostReq (ImageGenerationParameters) встраиваются непосредственно в OpenAI-структуру через struct embedding. Маппинг полей и трансформация не выполняются.
  • Стриминг: при включённом стриминге в тело запроса добавляется stream: true.

Конверсия ответа:

  • Без стриминга. OpenAI-ответы анмаршалятся напрямую в BifrostImageGenerationResponse, поскольку схема ответа Meridian — надмножество формата OpenAI. Все поля пробрасываются как есть.

  • Стриминг. OpenAI-ответы — Server-Sent Events с типами событий:

    • image_generation.partial_image — промежуточные чанки изображения с b64_json.
    • image_generation.completed — финальный чанк для каждого изображения с usage.
    • error — события ошибок.

    Каждый чанк содержит:

    • type — тип события;
    • sequence_number — порядковый номер чанка;
    • partial_image_index — индекс изображения (0…N) для partial-чанков;
    • b64_json — base64-кодированные данные изображения (указатель, может быть nil);
    • usage — счётчики токенов (только в completed-событиях);
    • created_at, size, quality, background, output_format — дополнительные метаданные.

    Meridian преобразует их в чанки BifrostImageGenerationStreamResponse с per-image chunkIndex для упорядочивания внутри каждого изображения; Index указывает, к какому изображению (0…N) относится чанк; PartialImageIndex устанавливается только для partial-чанков; usage прикрепляется к completed-чанкам; на каждый чанк фиксируется latency.

Эндпоинт: /v1/images/generations.


8. Image Edit

Запросы используют multipart/form-data, а не JSON.

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringИдентификатор модели
promptstringТекстовое описание правки
image[]binaryФайл(ы) изображения (multipart, поддерживается несколько)
maskbinaryФайл маски (multipart)
nintЧисло изображений (1–10)
sizestring"256x256", "512x512", "1024x1024", "1536x1024", "1024x1536", "auto"
qualitystring"auto", "high", "medium", "low", "standard"
response_formatstring"url" или "b64_json"
backgroundstring"transparent", "opaque", "auto"
input_fidelitystring"low", "high"
partial_imagesintЧисло партий частичных изображений (0–3)
output_formatstring"png", "webp", "jpeg"
output_compressionintУровень компрессии (0–100%)
userstringИдентификатор пользователя
streamboolВключить стриминг

Конверсия запроса:

  • Model и Input: bifrostReq.Modelreq.Model, bifrostReq.Input.Imagesreq.Input.Images, bifrostReq.Input.Promptreq.Input.Prompt.
  • Параметры: все поля из bifrostReq.Params (ImageEditParameters) встраиваются в OpenAI-структуру через struct embedding. Маппинг и трансформация не выполняются.
  • Multipart form data: запрос сериализуется как multipart/form-data:
    • Model и Prompt — отдельные form-поля (model, prompt).
    • Images — каждое изображение из Input.Images пишется отдельным полем image[] с автоопределением MIME-типа (image/jpeg, image/webp, image/png) и заголовком Content-Type.
    • Mask — если присутствует, пишется полем mask с MIME-типом и подходящим именем файла (mask.png, mask.jpg, mask.webp).
    • Опциональные параметры (n, size, quality, response_format, background, input_fidelity, partial_images, output_format, output_compression, user) — отдельные form-поля.
    • Числовые поля (n, partial_images, output_compression) конвертируются в строки через strconv.Itoa.
    • Стриминг: stream: "true" пишется как form-поле.

Конверсия ответа:

  • Без стриминга. OpenAI-ответы анмаршалятся напрямую в BifrostImageGenerationResponse. Все поля пробрасываются как есть.
  • Стриминг. SSE-события: image_edit.partial_image, image_edit.completed, error. Поля чанков и логика преобразования аналогичны image generation; добавляется устойчивая обработка interleaved-чанков через incomplete-image-tracking.

Эндпоинт: /v1/images/edits.


9. Image Variation

Запросы используют multipart/form-data, а не JSON.

Параметры запроса

ПараметрТипОбязательныйЗамечания
modelstringИдентификатор модели
imagebinaryИсходное изображение (multipart)
nintЧисло изображений (1–10)
sizestring"256x256", "512x512", "1024x1024", "1792x1024", "1024x1792", "1536x1024", "1024x1536", "auto"
response_formatstring"url" или "b64_json"
userstringИдентификатор пользователя

Конверсия запроса:

  • Model и Input: bifrostReq.Modelreq.Model, bifrostReq.Input.Image.Imagereq.Input.Image.Image.
  • Параметры: все поля из bifrostReq.Params (ImageVariationParameters) встраиваются через struct embedding.
  • Multipart form data:
    • model — form-поле;
    • image — поле с MIME-типом (image/jpeg, image/webp, image/png); если MIME не определяется, по умолчанию image/png;
    • опциональные n, size, response_format, user — form-поля; n конвертируется в строку.
  • Несколько изображений: дополнительные изображения сверх первого (через ExtraParams["images"]) сохраняются в ExtraParams, но в OpenAI уходит только первое — апстрим поддерживает один входной image.

Конверсия ответа:

  • Без стриминга. OpenAI-ответы анмаршалятся в BifrostImageVariationResponse (тип-алиас для BifrostImageGenerationResponse).
  • Стриминг для image variation не поддерживается.

Эндпоинт: /v1/images/variations.


10. Files API

Загрузка

ПараметрТипОбязательныйЗамечания
filebinaryЗагружаемый файл (multipart)
purposestringbatch, fine-tune или assistants
filenamestringПроизвольное имя файла (по умолчанию file.jsonl)

Ответ — FileObject с id, bytes, created_at, filename, purpose, status (docs).

Листинг

ПараметрТипОбязательныйЗамечания
purposestringФильтр по purpose
limitintРазмер страницы
afterstringКурсор пагинации
orderstringasc или desc

Курсорная пагинация с флагом has_more.

Получение / удаление / содержимое

  • GET /v1/files/{file_id} — метаданные файла;
  • DELETE /v1/files/{file_id} — удаление;
  • GET /v1/files/{file_id}/content — скачивание содержимого.

11. Batch API

Создание batch'а

ПараметрТипОбязательныйЗамечания
input_file_idstringусловноID файла ИЛИ массив requests (взаимоисключающие)
requestsarrayусловноОбъекты BatchRequestItem (конвертируются в JSONL)
endpointstringЦелевой эндпоинт (например, /v1/chat/completions)
completion_windowstring24h (по умолчанию)
metadataobjectПроизвольные метаданные

Ответ: BifrostBatchCreateResponse с id, endpoint, input_file_id, status, created_at, request_counts (docs). Статусы (BatchStatus): validating, failed, in_progress, finalizing, completed, expired, cancelling, cancelled.

Листинг batch'ей

ПараметрТипОбязательныйЗамечания
limitintРазмер страницы
afterstringКурсор пагинации

Получение / отмена

  • GET /v1/batches/{batch_id}BifrostBatchRetrieveResponse (docs);
  • POST /v1/batches/{batch_id}/cancel — отмена (docs).

Получение результатов

  1. Batch должен быть в статусе completed (есть output_file_id).
  2. Скачайте output-файл через Files API.
  3. Распарсите JSONL — каждая запись BatchResultItem: {id, custom_id, response: {status_code, body}}.

12. List Models

GET /v1/models — листинг доступных моделей с метаданными. Идентификаторы моделей в ответах Meridian имеют префикс openai/ (например, openai/gpt-4o). Результаты агрегируются по всем настроенным API-ключам. Тело и параметры запроса не нужны.


13. Video Generation

Создание (POST /v1/videos)

ПараметрТипОбязательныйЗамечания
modelstringНапример, sora-2
promptstringТекстовое описание видео
input_referencestringВходное изображение для image-to-video. Только base64 data URL (например, data:image/png;base64,...); обычные URL не принимаются.
secondsstringДлительность в секундах
sizestringРазрешение: 720x1280 (по умолчанию), 1280x720, 1024x1792, 1792x1024

Ответ: BifrostVideoGenerationResponseid, status, model, prompt, created_at.

Статусы задачи: queuedin_progresscompleted / failed.

Получение / скачивание / удаление / листинг / remix

ОперацияЭндпоинтЗамечания
СтатусGET /v1/videos/{id}Поллинг до status: completed
СкачиваниеGET /v1/videos/{id}/contentВозвращает сырые байты видео
УдалениеDELETE /v1/videos/{id}Удаляет задачу
ЛистингGET /v1/videosQuery-параметры: after, limit, order
RemixPOST /v1/videos/{id}/remixТело: {"prompt": "..."}

Типичные коды ошибок

Маппинг HTTP-статусов → тип ошибки:

  • 400invalid_request_error;
  • 401authentication_error;
  • 403permission_error;
  • 404not_found_error;
  • 429rate_limit_error;
  • 500api_error.

Содержание