BazaarLink предоставляет одну OpenAI-совместимую схему запросов и ответов для всех моделей и поставщиков, поэтому вы можете интегрировать один раз и переключать модели без переписывания приложения.
Поля маршрутизации клиента игнорируются
Поля provider (весь объект), transforms, route, service_tier верхнего уровня и preset удаляются перед отправкой upstream и не могут выбирать upstream или ценовой уровень. На эндпоинтах Chat Completions и Responses массив models поддерживается как локальный список резервных моделей: BazaarLink самостоятельно маршрутизирует каждую модель и применяет ее клиентскую цену; список не передается upstream. Суффиксы :nitro, :floor и :exacto, указанные клиентом, игнорируются. :eco остается экономичным тарифом BazaarLink и внутри преобразуется в BazaarLink :floor. :free остается отдельным вариантом модели в каталоге.
Дополнительная стоимость веб-поиска
Поведение веб-поиска через plugins, :online или web_search_options остается прежним, но может взиматься дополнительная плата upstream. Она списывается с ключа, использованного в запросе: платформенного ключа BazaarLink или вашего ключа BYOK.
OpenAPI Спецификация
Полная версия BazaarLink API документирована в спецификации OpenAPI. Вы можете получить к нему доступ в формате YAML или JSON:
Используйте эти спецификации с пользовательским интерфейсом Swagger, Postman или любым генератором кода, совместимым с OpenAPI, для изучения API или создания клиентских библиотек.
Запросы
Формат запроса на завершение работ
Тело запроса на завершение чата отправляется на следующую конечную точку:
Заставьте модель возвращать действительный JSON, соответствующий схеме. Это важно для создания надежных приложений, которые программно анализируют выходные данные модели.
json_object — базовый режим JSON; модель возвращает действительный JSON.
json_schema — режим строгой схемы; выходные данные модели должны соответствовать предоставленной схеме JSON.
Плагины
BazaarLink перенаправляет массив плагинов на выбранный восходящий маршрут. Доступность плагина зависит от выбранной модели и провайдера; веб-плагин также включен в варианте модели :online.
Идентифицируйте свое приложение в заголовках запросов, чтобы обеспечить отслеживание использования, видимость информационной панели и детальную аналитику.
Добавьте частичное сообщение помощника в качестве последнего элемента, чтобы запросить продолжение маршрутов совместимой модели.
Как это работает
BazaarLink сохраняет и пересылает последнее сообщение помощника. Поведение продолжения реализуется выбранной восходящей моделью и поставщиком, поэтому оно не гарантируется на каждом маршруте.
TypeScript
1
2
3
4
5
6
7
8
const response = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4.6",
messages: [
{ role: "user", content: "What is the meaning of life?" },
// Intentional partial response; compatible routes continue from here.
{ role: "assistant", content: "My best answer is" }
]
});
Ответы
BazaarLink нормализует ответы завершения разных моделей и поставщиков в одну форму, совместимую с OpenAI.
Формат ответа на завершение
Поле выбора всегда представляет собой массив. Потоковые ответы используют дельту; непотоковые ответы используют message. Подробная информация об использовании и стоимости возвращается, когда она доступна.
finish_reason использует нормализованные BazaarLink значения: stop, length, tool_calls, content_filter и error.
JSON
1
2
3
{"finish_reason":"stop"}
Запрос стоимости и статистики
Используйте непрозрачный ID запроса BazaarLink из response id или заголовка x-request-id для GET /v1/generation; в нестриминговом ответе тот же ID есть в x-generation-id. Статистика может появиться через несколько секунд; повторяйте запрос при 404 недолго.
Неоплаченная регистрация принимает name, необязательные description и referral_code. Ответ 201 содержит API-ключ, кредиты, claim token со сроком семь дней, URL обновления, реферальный код, free_model auto:free, базовый URL и ссылку на документацию. Используется существующий механизм бесплатной модели; для бесплатного веб-поиска нужен подтверждённый email, поэтому неоплаченные агенты не могут им пользоваться.
Платная регистрация начинается с требований HTTP 402: scheme exact, network eip155:196, asset USD-T0 и payTo. Повторите запрос с заголовком X-PAYMENT, чтобы получить те же поля регистрации и payment { txHash, network, amountUsd }. Платные агенты следуют обычным правилам платного аккаунта; существующие аккаунты могут пополняться через /api/x402/topup.
Человек может принять неоплаченный аккаунт агента через /claim в течение семидневного срока действия token. Действует лимит одна регистрация на IP за 24 часа и лимиты облачного провайдера; отклонённые запросы возвращают 429 с Retry-After.
POSThttps://api.bazaarlink.ai/api/x402/topup
Chat Completions
Основная конечная точка. Совместим с OpenAI Chat Completions API.
POST/v1/chat/completions
Тело запроса
modelобязательно
string
Используйте id или alias из GET /v1/models, например "claude-sonnet-4.6" или "anthropic/claude-sonnet-4.6".
messagesобязательно
Message[]
Масив объектов сообщений с ролью и содержимым.
stream
boolean
Если true, возвращает поток событий, отправленных сервером. По умолчанию: ложь
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
max_tokens
integer
Максимальное количество токенов для генерации
max_completion_tokens
integer
Псевдоним для max_tokens (совместим с OpenAI серии o). Оба принимаются; то, что предусмотрено, вступает в силу
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
frequency_penalty
number
Наказание повторяющихся токенов. Диапазон: [-2, 2]. По умолчанию: 0
presence_penalty
number
Назначать штрафы за токены в зависимости от присутствия. Диапазон: [-2, 2]. По умолчанию: 0
repetition_penalty
number
Уменьшить повторение входных токенов. Диапазон: (0, 2]. По умолчанию: 1.
min_p
number
Минимальная вероятность относительно верхнего токена. Диапазон: [0, 1]. По умолчанию: 0
top_a
number
Динамический топ-P на основе токена с наибольшей вероятностью. Диапазон: [0, 1]. По умолчанию: 0
seed
integer
Целочисленное начальное значение для детерминированной выборки. Не гарантируется для всех моделей
n
integer
Количество завершений, которые нужно сгенерировать. По умолчанию: 1
user
string
Идентификатор конечного пользователя для мониторинга и обнаружения злоупотреблений. На биллинг не влияет. Только модели семейства OpenAI — см. примечание ниже.
stop
string | string[]
Stop-последовательности — генерация останавливается при обнаружении
logit_bias
object
Сопоставьте идентификаторы токенов со значениями смещения [-100, 100], добавленными перед выборкой. Только модели семейства OpenAI — см. примечание ниже.
logprobs
boolean
Вернуть вероятности журнала для каждого выходного токена. Только модели семейства OpenAI — см. примечание ниже.
top_logprobs
integer
Количество наиболее вероятных токенов для каждой позиции (требуется logprobs: true). Диапазон: 0–20. Только модели семейства OpenAI — см. примечание ниже.
tools
Tool[]
Список инструментов (функций), которые может вызывать модель
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.
parallel_tool_calls
boolean
Включить параллельный вызов функций при наличии инструментов. По умолчанию: правда. Только модели семейства OpenAI — см. примечание ниже.
response_format
object
Force структурированный вывод JSON. См. раздел «Структурированный вывод».
structured_outputs
boolean
Запросите строгий вывод, соответствующий схеме JSON, у поставщиков, которые его поддерживают. Прошло как есть
reasoning
object
Конфигурация reasoning/thinking, специфичная для поставщика. Прошло как есть
reasoning_effort
string
OpenAI Усилие рассуждения в стиле o-серии: «низкое», «среднее» или «высокое». Прошло как есть
include_reasoning
boolean
true возвращает текст рассуждений в message.reasoning (при потоковой передаче — в delta.reasoning); false отключает рассуждения у моделей, которые рассуждают по умолчанию (см. раздел о рассуждениях), поэтому рассуждения не оплачиваются. Без reasoning_effort, reasoning и thinking по умолчанию рассуждают и возвращают текст только эти модели; остальные — только по запросу
user, logprobs, top_logprobs, logit_bias и Parallel_tool_calls поддерживаются только моделями семейства OpenAI.
Эти пять параметров удаляются из восходящего запроса всякий раз, когда решенная модель не распознается как собственная модель OpenAI — отправка их в anthropic/claude-*, google/gemini-* или любую другую цель, отличную от OpenAI, возвращает 200 с параметром. молча игнорируется, это не ошибка. Если вы устанавливаете один из них, а эффект не отображается, проверьте, является ли целевая модель OpenAI.
BazaarLink возвращает стандартизированный ответ и удаляет специфичные для upstream поля. usage.cost — сумма в USD, списанная с клиента за этот запрос.
Для запросов длительностью более 100 секунд рекомендуется использовать stream:true. Для нестриминговых запросов примерно через 12 секунд (значение по умолчанию, которое можно изменить в настройках развёртывания) сначала возвращается 200 и начинается отправка пробелов keepalive; если позже возникает ошибка, она возвращается как 200 + error JSON. Keepalive — это пробелы перед JSON-телом, которые стандартные JSON-парсеры игнорируют.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
typeResponse = {
id: string;
object: "chat.completion" | "chat.completion.chunk";
created: number; // Unix timestampmodel: string;
choices: (NonStreamingChoice | StreamingChoice)[];
usage?: ResponseUsage;
};
typeNonStreamingChoice = {
index: number;
finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | null;
message: {
role: "assistant";
content: string | null;
tool_calls?: ToolCall[];
reasoning?: string; // thinking text: when the request asked for it, or by default for the models listed in the reasoning docs sectionreasoning_details?: Array<{ type: string; text?: string }>;
};
};
typeStreamingChoice = {
index: number;
finish_reason: string | null;
delta: {
role?: string;
content?: string | null;
tool_calls?: ToolCall[];
reasoning?: string;
reasoning_details?: Array<{ type: string; text?: string }>;
};
};
typeResponseUsage = {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
cost: number; // USD amount charged to the customer for this requestprompt_tokens_details?: {
cached_tokens: number; // Tokens served from prompt cache (reduced cost)cache_write_tokens?: number; // Tokens written to cache in this requestaudio_tokens?: number;
};
completion_tokens_details?: {
reasoning_tokens?: number; // Thinking/reasoning tokens (e.g. o3, Qwen3, DeepSeek R1)image_tokens?: number;
};
};
typeToolCall = {
id: string;
type: "function";
function: { name: string; arguments: string };
};
Генерация изображения
BazaarLink предлагает два пути создания изображений: (A) /v1/chat/дополнения с модальностями: ["image"] — собственный путь, поддерживает потоковую передачу SSE и смешанный вывод текста и изображений; рекомендуется для новых интеграций. (B) /v1/images/generations — OpenAI DALL·E-совместимая форма запроса, но ответы представляют собой потоки событий SSE (необходимы для медленных моделей, чтобы избежать тайм-аута восходящего потока в 100 секунд). Оба пути отправляют один и тот же протокол событий SSE — выбор конечной точки является исключительно предпочтением формы запроса. Изображение EDITING (изменение существующего изображения) использует POST /v1/images/edits — OpenAI images.edit совместим, multipart/form-data с вашими исходными изображениями. Модели с возможностью редактирования имеют модальность текст+изображение->изображение (например, qwen/qwen-image-3); Модели чистого поколения — это текст->изображение — проверьте модальность каждой модели в GET/v1/models.
Response format
/v1/images/generations возвращает OpenAI-совместимую синхронизацию JSON по умолчанию (с 25 июля 2026 г.) — client.images.generate() работает без оболочки. Passstream: значение true, чтобы вместо этого выбрать поток событий SSE, который обеспечивает прогресс для моделей с длительным временем генерации.
Непотоковые запросы, которые выполняются дольше 20 секунд, сначала получают ответ HTTP 200 (затем соединение поддерживается пробелами), поэтому более поздняя ошибка возвращается как «200 с телом ошибки»: проверяйте объект `error` верхнего уровня (мы также добавляем `"object": "error"` и `"http_status"`). Если таймаут чтения вашего клиента велик (SDK OpenAI по умолчанию ждут 10 минут), отправьте `X-BazaarLink-Sync-Wait: 90` (целые секунды, 1–90, по умолчанию 20), чтобы для ошибок в пределах этого времени получить настоящий код статуса; в Python SDK используйте `default_headers={"X-BazaarLink-Sync-Wait": "90"}`, в Node SDK — `defaultHeaders: { "X-BazaarLink-Sync-Wait": "90" }`. В Windows отправляйте JSON из файла в UTF-8 командой `curl --data-binary @body.json`: текст, набранный после `-d` в консоли, не в UTF-8 и сразу отклоняется с 400 `invalid_utf8`.
A. /v1/chat/completions (родной, рекомендуется)
POST/v1/chat/completions
The canonical streaming path. Recommended for any new integration.
1
2
3
4
5
6
7
8
9
curl -N https://api.bazaarlink.ai/v1/chat/completions \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.4-image-2",
"messages": [{"role":"user","content":"a red cat on a sofa"}],
"modalities": ["image","text"],
"stream": true
}'
Image-to-image: включите часть image_url в массив содержимого. Поддерживает URI данных или URL-адреса изображений https (http:// отклоняется), до 8 изображений, ~10 МБ на данные URI. Сообщение, содержащее изображения, также должно включать текстовую часть (инструкцию по редактированию). Некоторые модели дополнительно поддерживают image_config (например, {"strength": 0,7}, 0–1 — нижний уровень остается ближе к исходному изображению), передаваемый в восходящий поток как есть.
1
2
3
4
5
6
7
8
9
10
11
12
curl -N https://api.bazaarlink.ai/v1/chat/completions \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.4-image-2",
"messages": [{"role":"user","content":[
{"type":"image_url","image_url":{"url":"data:image/png;base64,..."}},
{"type":"text","text":"change the background to a night city"}
]}],
"modalities": ["image"],
"stream": true
}'
Редактирование изображений (совместимо с OpenAI)
POST/v1/images/edits
The OpenAI SDK client.images.edit() работает напрямую (многочастная загрузка, синхронизация ответа JSON, возвращающего данные: [{ url }]). Те же ограничения, что и при передаче изображения в изображение: до 8 изображений по 10 МБ каждое; маска и response_format=b64_json пока не поддерживаются.
1
2
3
4
5
curl https://api.bazaarlink.ai/v1/images/edits \
-H "Authorization: Bearer $BL_API_KEY" \
-F model="openai/gpt-5.4-image-2" \
-F image=@cat.png \
-F prompt="change the background to a night city"
B. /v1/images/generations (DALL·E-совместимый)
POST/v1/images/generations
OpenAI DALL-E request shape. Sync JSON ({ created, data: [{ url }] }) is the default and works with client.images.generate() out of the box; pass stream: true to get the SSE event stream documented below instead.
1
2
3
4
5
6
7
8
curl https://api.bazaarlink.ai/v1/images/generations \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-image-1",
"prompt": "a red cat on a sofa",
"size": "1024x1024"
}'
Асинхронный трехэтапный поток (отправка → опрос → контент). Генерация видео занимает от 30 с до 5 минут, что не соответствует синхронной форме завершения чата request/response — поэтому BazaarLink предоставляет его как выделенную конечную точку /v1/videos с использованием шаблона идентификатора задания: submit возвращает идентификатор vjob_* → статус опроса → извлекает байты по завершении. Вызов модели видео через /chat/completions или /images/generations возвращает 400 (код: error_endpoint_for_video). Счета рассчитываются по фактической стоимости использования, когда задание завершается.
Видео задания
Одна конечная точка охватывает несколько задач. Выбор запуска задачи определяется тем, какие поля вы отправляете — одна модель может выполнять преобразование изображения в видео, ключевые кадры и продолжение. Не каждая модель поддерживает все задачи; неподдерживаемый запрос возвращает 400.
Преобразование текста в видео
prompt
Генерируйте только из текстового приглашения — без входных данных.
Преобразование изображения в видео
frame_images: [ first frame ]
Ваше изображение ЯВЛЯЕТСЯ картинкой: оно становится первым кадром и анимируется, сохраняя верность оригиналу. Например. фотография кота → тот же кот поворачивает голову в той же сцене.
Ключевые кадры (первый + последний)
frame_images: [ first, last ]
Дайте начало и конец изображения; модель интерполирует движение между ними.
Продолжение
input_video
Расширить существующий клип. Запрошенная продолжительность должна быть больше длины исходного видео.
Ссылка на видео
input_references: [ images ]
Ваши изображения — это REFERENCES, а не кадры: модель сохраняет subject/style и генерирует совершенно новую сцену. Например. фото кота + «танцы в лесу» → новое видео, где кошачий взгляд сохранен, но сцена и движение новые (1–9 ссылок). Отличие от изображения к видео: i2v сохраняет точное изображение; r2v преобразует объект в новые кадры.
Видеомонтаж
input_video + prompt
Отредактируйте существующее видео — измените сцену, стиль или движение. Оплата производится за секунды ввода видео + секунды вывода.
First/last изображения кадров (преобразование изображения в видео, ключевые кадры). Объекты { type: "image_url", image_url: {url},frame_type: "first_frame" | «last_frame» } или простые строки URL.
input_references
array
Справочные изображения для ссылок на видео — рекомендации subject/style, а не точные кадры.
input_video
string|object
Исходное видео URL для продолжения и редактирования видео. Должен быть общедоступным для восходящего потока.
aspect_ratio
string
Соотношение сторон, например 16:9 или 9:16. Игнорируется, когда входное изображение определяет соотношение.
watermark
boolean
Добавьте водяной знак. По умолчанию ложь.
callback_url
string
Webhook URL вызывается, когда задание достигает конечного состояния — только HTTPS, SSRF проверено. Нет подписи в v1; воспринимайте это как подсказку и подтвердите через GET /videos/{id}.
При отправке резервируются кредиты по оценке худшего случая. После завершения задания usage.cost показывает сумму в USD, списанную с клиента за запрос.
Разрешенные разрешения различаются в зависимости от модели: неподдерживаемое значение возвращает 400 со списком поддерживаемых.
Вход images/videos должен быть доступен из общедоступного URL. Хосты, защищенные хотлинками (например, некоторые вики), выходят из строя.
Входящие медиафайлы проходят модерацию исходного контента и иногда могут быть отклонены.
Для продолжения запрошенная продолжительность должна превышать длину исходного видео.
Соотношение сторон вывода соответствует входному изображению: квадратное изображение дает квадратное видео.
Видеомонтаж оплачивается по секундам входного видео плюс секунды сгенерированного выходного видео.
input_video (редактирование/продолжение) должен быть PUBLIC URL. Видео, которые вы создаете здесь, обслуживаются с помощью вашего ключа API, поэтому восходящий поток не может их получить — разместите исходное видео на общедоступном URL.
Полезные данные вебхука не имеют знака — проверьте status/amount через GET /videos/{id}, прежде чем действовать, и обратите внимание, что unsigned_urls являются абсолютными (в отличие от относительных путей в ответе на опрос).
Поддерживаемые видеомодели
Model ID
Modality
Tasks
minimax/hailuo-3-max
text+image->video
t2v, i2v
google/veo-3.1
text+image->video
t2v, i2v
bytedance/seedance-2.5
text+image+audio+video->video
—
x-ai/grok-imagine-video-1.5-lite
text+image->video
t2v, i2v
bytedance/seedance-2.0
text+image+audio+video->video
t2v, i2v
bytedance/seedance-1-5-pro
text+image->video
t2v, i2v
bytedance/seedance-2.0-fast
text+image+audio+video->video
t2v, i2v
Синтез речи
Преобразует текст в аудио по ID модели из /v1/models?output_modalities=speech. Оплата — по цене за миллион символов на странице модели. Аудио полностью буферизуется и затем возвращается бинарными данными; пошаговая потоковая выдача не поддерживается. Поля управления маршрутизацией provider, transforms, route, service_tier и preset игнорируются.
Отправьте multipart/form-data model и file или JSON model и input_audio:{data,format} (сырой base64). Форматы: wav, mp3, mp4, m4a, ogg, flac, webm, aac. Аудио: максимум 25 MiB; тело запроса: 50 MiB. audio.transcription_max_seconds_by_model задаёт лимит для модели; при отсутствии используется audio.transcription_max_seconds, затем значение по умолчанию 60 секунд. Более длинное аудио отклоняется до обработки с кодом 413 audio_too_long и не оплачивается. response_format: json или verbose_json; timestamp_granularities word/segment требует verbose_json. stream не поддерживается (400 unsupported_parameter); слишком большое аудио: 413 audio_too_large. provider игнорируется. Цены базы данных за usage.seconds или входные/выходные token; цена минуты = 60 × цена секунды. usage.cost — сумма клиента в USD.
query и documents возвращают ранжированные index и relevance_score. Единица оплаты — search: цена модели умножается на usage.search_units, а не на число документов. Потоковая передача (stream) не поддерживается.
POST/v1/rerank
1
2
3
4
curl https://api.bazaarlink.ai/v1/rerank \
-H "$BAZAARLINK_AUTH_HEADER" \
-H "Content-Type: application/json" \
-d '{"model":"your-rerank-model-id","query":"capital of France","documents":["Paris is the capital of France.","Berlin is in Germany."],"top_n":1}'
POST/v1/chat/completions
Передайте audio или input_audio в /v1/chat/completions и выберите аудиомодель. Настроенные ставки входных и выходных токенов единообразно применяются ко всем учтённым текстовым и аудиотокенам.
POST /v1/audio/speech совместим с OpenAI-compatible форматом: отправьте JSON и получите аудиофайл в бинарном виде. Семейство ElevenLabs включает elevenlabs/eleven-v4, eleven-v4-turbo, eleven-v3, eleven-v3-conversational, eleven-multilingual-v2, eleven-flash-v2.5, eleven-flash-v2, eleven-turbo-v2.5, eleven-turbo-v2. Актуальный список: GET /v1/models?output_modalities=speech. GET /v1/models по умолчанию возвращает только текстовые модели; добавьте ?output_modalities=speech (или all), чтобы увидеть список.
POST/v1/audio/speech
Параметры
Параметр
Тип
Обязателен
Описание
model
string
Да
ID модели речи, например elevenlabs/eleven-flash-v2.5.
input
string
Да
Текст для синтеза: до 4 096 символов на запрос (10 000 для elevenlabs/eleven-v4 и eleven-v4-turbo). Более длинный текст разбейте на несколько запросов.
voice
string
Да
Используемый голос; формат зависит от модели. См. правила выбора голоса ниже.
response_format
string
Нет
mp3 (по умолчанию) или pcm. opus, aac, flac и wav API принимает, но модели ElevenLabs сейчас отклоняют их с 400.
speed
number
Нет
Скорость речи от 0.25 до 4.0. Не каждая модель применяет её.
instructions
string
Нет
Указания по стилю голоса. Не каждая модель применяет их.
stability
number
Нет
Стабильность голоса, 0–1 (по умолчанию 0,5). Ниже — выразительнее, выше — ровнее. Действует для моделей elevenlabs/*, когда запрос обслуживается нашим прямым голосовым маршрутом; заголовок ответа X-Voice-Settings сообщает applied или ignored.
similarity_boost
number
Нет
Сходство с исходным голосом, 0–1 (по умолчанию 0,75). Eleven v3 не использует.
style
number
Нет
Усиление стиля, 0–1 (по умолчанию 0). Значения выше 0 увеличивают задержку. Eleven v4 не использует.
use_speaker_boost
boolean
Нет
Усиливает сходство с исходным говорящим (по умолчанию true); немного увеличивает задержку.
clone_strength
number
Нет
Сила клона, 0–1 (для большинства голосов рекомендуется 0). Только для ваших собственных профессиональных клонов (voice_…), обученных для Eleven v4.
language_code
string
Нет
Двухбуквенный код языка строчными буквами (ISO 639-1), например ar, ja или en, чтобы задать язык озвучивания. Модели multilingual-v2 не используют.
audio_effects
object
Нет
Необязательный объект аудиоэффектов: filter_preset_id (фильтр, например phone, old_radio), environment_id (реверберация, например small_room, hall), background_noise_id (например cafe), distance (0–1), send_level (уровень реверберации, 0–1) и pan (−1…1). ID — строчные буквы, цифры и подчёркивания; без доплаты. Реверберация или pan не равный 0 дают стерео и несовместимы с выводом pcm.
Семь настроек голоса выше необязательны; если их не указывать, ничего не меняется. Значение вне диапазона даёт 400 и не отправляется и не тарифицируется. Заголовок ответа X-Voice-Settings показывает, были ли использованы ваши настройки: applied — использованы; ignored — ответил резервный маршрут, поэтому настройки не использованы (аудио всё равно создаётся); нет заголовка — вы не передавали настроек голоса. Пример: stability 0 читает выразительнее, 1 — ровнее.
Правила выбора голоса
Модели ElevenLabs (elevenlabs/…) принимают одно из этих имён голосов (регистр не важен): george, sarah, adam, alice, bella, bill, brian, callum, charlie, chris, daniel, eric, harry, jessica, laura, liam, lily, matilda, river, roger, will. Для моделей ElevenLabs voice можно опустить (по умолчанию george). Любое другое значение даёт 400 invalid_voice. Ваш собственный голос (voice_…) описан в разделе «Собственные голоса» ниже.
Имена голосов OpenAI-style, например alloy, echo или nova, работают только с моделями, где они перечислены. Проверьте голоса на странице модели.
Собственные голоса (клонирование) открываются поэтапно: см. раздел «Собственные голоса» ниже (POST /v1/voices). Пока они не включены для вашего аккаунта, используйте одно из 21 готовых имён выше или публичный voice ID.
alloy не работает с моделью ElevenLabs
Если модель ElevenLabs получает голос, который не является voice ID и не входит в поддерживаемые имена (например alloy или Rachel), она возвращает 400 invalid_voice, а сообщение перечисляет допустимые имена. За неудачные запросы плата не взимается.
Встроенные голоса
Укажите в voice одно из имён ниже (строчными буквами). У каждого голоса есть короткий собственный пример, а GET /api/v1/audio/voices возвращает полный список (пол, возрастная группа, акцент, стиль и ссылки на примеры).
?lang= (en, zh-TW, zh-CN; по умолчанию Accept-Language) выбирает только язык description. Ссылки на примеры от него не зависят: preview_urls.en (то же, что preview_url) — английский клип, preview_urls.zh (то же, что preview_url_zh) — китайский.
Голос
Описание
Прослушать
george
Male, middle-aged, British accent. Mature and steady, suited to narration and storytelling.
sarah
Female, young adult, American accent. Professional and clear, suited to broadcast-style reading.
adam
Male, middle-aged, American accent. Everyday and approachable, suited to short social videos.
alice
Female, middle-aged, British accent. Professional and informative, suited to explainers and teaching.
bella
Female, middle-aged, American accent. Professional and informative, suited to explainers and teaching.
bill
Male, senior, American accent. Crisp and direct, suited to advertising voice-overs.
brian
Male, middle-aged, American accent. Polished and refined, suited to social and brand content.
callum
Male, middle-aged, American accent. Expressive, suited to characters and animation.
charlie
Male, young adult, Australian accent. Energetic and lively, suited to conversation.
chris
Male, middle-aged, American accent. Relaxed and casual, suited to conversation.
daniel
Male, middle-aged, British accent. Formal and measured, suited to news-style and educational reading.
eric
Male, middle-aged, American accent. Polished and warm, suited to conversation.
harry
Male, young adult, American accent. Rough and gritty, suited to character voices.
jessica
Female, young adult, American accent. Bright and cute, suited to conversation.
laura
Female, young adult, American accent. Playful with attitude, suited to social content.
liam
Male, young adult, American accent. Confident and upbeat, suited to social content.
lily
Female, middle-aged, British accent. Confident and clear, suited to explainers and teaching.
matilda
Female, middle-aged, American accent. Upbeat and friendly, suited to explainers and teaching.
river
Neutral voice, middle-aged, American accent. Calm and even, suited to conversation.
roger
Male, middle-aged, American accent. Polished and confident, suited to conversation.
will
Male, young adult, American accent. Laid-back and easygoing, suited to conversation.
Теги эмоций и действий (audio tags)
Пишите теги в квадратных скобках прямо в input, например [laughs], [whispers], [excited], [sighs], [crying], [curious] или [softly]. Теги передаются модели в точности как набраны и задают манеру произнесения следующих слов. Даже если текст не на английском, оставляйте теги на английском.
1
2
3
4
5
curl https://api.bazaarlink.ai/v1/audio/speech \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs/eleven-v3","input":"[laughs] That was actually funny. [whispers] Do not tell anyone.","voice":"george","response_format":"mp3"}' \
--output audio-tags.mp3
Поддерживаются моделью elevenlabs/eleven-v3 и семейством elevenlabs/eleven-v4. Другие модели речи не интерпретируют теги и могут прочитать скобки вслух, поэтому сначала проверьте короткую фразу.
Теги входят в число символов input и тарифицируются так же, как остальной текст.
Форматы вывода
Если response_format опущен, используется mp3 (Content-Type audio/mpeg); pcm (audio/pcm, сырой 16-bit PCM) тоже работает. API принимает opus, aac, flac и wav, но модели ElevenLabs сейчас отклоняют их с 400. Сохраняйте файл по заголовку Content-Type ответа.
Стоимость
Синтез речи оплачивается по числу символов ввода. Цена за символ указана на странице модели в /models и в GET /v1/models как pricing.character. На странице модели она показана за миллион символов.
Неверный запрос: нет model, input или voice; input длиннее 4 096 символов; speed вне 0.25–4.0; неподдерживаемый response_format; Unknown voice; unknown_model (проверьте ID в /models).
401
Ключ API отсутствует или недействителен. Отправьте Authorization: Bearer с ключом BazaarLink.
402
Недостаточно средств. Пополните баланс и повторите запрос.
403
Административный ключ не может вызывать модели либо учётная запись заблокирована. Используйте обычный ключ API.
429
Превышен лимит запросов. Подождите согласно Retry-After и повторите.
502
Сервис модели временно недоступен или передача аудио прервалась. Повторите запрос; неудачные запросы не оплачиваются.
POST /v1/audio/transcriptions совместим с OpenAI-compatible форматом: загрузите аудио через multipart/form-data или отправьте base64 input_audio в JSON и получите текст. Доступны elevenlabs/scribe-v2 и elevenlabs/scribe-v2-medical. Актуальный список: GET /v1/models?output_modalities=transcription. GET /v1/models по умолчанию возвращает только текстовые модели; добавьте ?output_modalities=transcription (или all), чтобы увидеть список.
POST/v1/audio/transcriptions
Параметры
Параметр
Тип
Обязателен
Описание
model
string
Да
ID модели транскрибации, например elevenlabs/scribe-v2.
json (по умолчанию) возвращает {text}; verbose_json добавляет язык, длительность и segments/words.
language
string
Нет
Необязательная подсказка языка, например en или zh. Пустое значение включает автоопределение.
prompt
string
Нет
Необязательный контекст для распознавания имён и терминов. Применяется не каждой моделью.
timestamp_granularities[]
string[]
Нет
word и/или segment. Применяется только с response_format=verbose_json; иначе игнорируется. Временные метки на уровне слов пока не возвращаются; segments возвращаются.
Форматы вывода
response_format принимает только json или verbose_json (text, srt и vtt не поддерживаются). stream не поддерживается. Длительность ограничена для каждой модели, по умолчанию 60 секунд. Более длинное аудио отклоняется до обработки с кодом 413 audio_too_long и не оплачивается. Разделите длинную запись.
Стоимость
Транскрибация оплачивается за секунду аудио. Цена за секунду указана на странице модели в /models и в GET /v1/models как pricing.second; цена за минуту в 60 раз выше. В ответе usage показаны оплачиваемые секунды, а usage.cost — сумма списания.
Неверный запрос: отсутствует model или file, пустое аудио, response_format не json/verbose_json, stream=true (unsupported_parameter) либо timestamp_granularities не word/segment.
401
Ключ API отсутствует или недействителен.
402
Недостаточно средств. Пополните баланс и повторите запрос.
413
audio_too_large: декодированное аудио превышает 25 MiB. audio_too_long: аудио превышает лимит модели (по умолчанию 60 секунд), отклоняется до обработки и не оплачивается. Сожмите или разделите файл.
429
Превышен лимит запросов. Подождите согласно Retry-After и повторите.
502
Сервис модели временно недоступен или передача аудио прервалась. Повторите запрос; неудачные запросы не оплачиваются.
Доступно только по заявке. Собственные голоса открываются для каждого аккаунта отдельно: для заявки обратитесь в службу поддержки. Пока аккаунт не включён, любой запрос /v1/voices отвечает 403 voice_cloning_not_enabled (и 404 not_found, пока функция выключена для всех). Лимиты и цена на этой странице — значения по умолчанию и могут измениться.
Загрузите короткую запись голоса, который вы вправе использовать, и получите наш идентификатор голоса (voice_…). Передайте его как voice в POST /v1/audio/speech. Голосом может пользоваться только тот, кто его создал.
Эндпоинты
POST/v1/voices
Создать голос (multipart/form-data)
GET/v1/voices
Список ваших голосов (limit 1–100, after = id голоса для следующей страницы)
GET/v1/voices/{id}
Получить один из ваших голосов
DELETE/v1/voices/{id}
Удалить голос (действует сразу)
POST/v1/voices/report
Пожаловаться на голос (ключ API не нужен)
Создание голоса: поля
Поле
Тип
Обязательно
Описание
name
string
Да
Название голоса, 1–60 символов.
files
file[]
Да
От 1 до 5 файлов с записью этого голоса (mp3, wav, m4a, ogg, flac, webm).
consent
boolean
Да
Должно быть true: вы подтверждаете, что вправе клонировать и использовать этот голос (см. «Согласие»).
consent_statement_version
string
Да
Версия заявления о согласии, которое вы подтверждаете. Сейчас "v1".
description
string
Нет
Необязательно, до 200 символов.
remove_background_noise
boolean
Нет
Необязательный boolean, по умолчанию false. Убирает фоновый шум в образцах перед клонированием.
Запрос синхронный: ответ 201 означает, что голос готов к использованию. Передайте заголовок Idempotency-Key (любая уникальная строка) и используйте тот же при повторе, чтобы повтор никогда не создавал и не тарифицировал второй голос.
Ответ
201 с полями id (voice_…), object ("voice"), name, description, status ("ready"), created_at (секунды Unix) и usage.cost_usd (списанная плата за создание). Другие сведения о том, как создаётся голос, за пределы наших систем не передаются.
GET /v1/voices возвращает только ваши голоса: { "object": "list", "data": [ … ], "has_more": false }. На id чужого голоса приходит 404 voice_not_found — так же, как на несуществующий id.
GET /v1/voices/{id} возвращает один голос (те же поля, без usage).
DELETE /v1/voices/{id} возвращает { "id": "voice_…", "object": "voice", "deleted": true } и действует сразу: запросы речи с этим голосом сразу завершаются ошибкой. Удаление бесплатно; плата за создание не возвращается.
Лимиты (по умолчанию)
До 3 голосов на человека.
От 1 до 5 аудиофайлов на голос, не более 10 МБ каждый и 25 МБ суммарно; форматы: mp3, wav, m4a, ogg, flac, webm. Лучше всего работает от 30 секунд до 5 минут чистой речи в сумме.
До 3 созданий в сутки (сутки по UTC).
Нужен аккаунт с подтверждённой электронной почтой и балансом не менее US$5.
Названия и описания, имитирующие публичных людей или звучащие как официальные голоса и голоса сотрудников, отклоняются (invalid_voice_name).
Записи используются только для создания голоса, мы их не храним. Мы сохраняем название голоса, владельца, запись о согласии и отметки времени.
Цена
Создание голоса стоит разовую плату (по умолчанию US$1.00); списанная сумма возвращается в usage.cost_usd, и плата берётся только если голос успешно создан. Использование собственного голоса в синтезе речи стоит столько же за символ, сколько другие голоса этой модели. Удаление бесплатно.
Согласие
При каждом создании нужно передавать consent=true и consent_statement_version="v1". Если заявление обновится, создание ответит 400 consent_version_mismatch, и вы подтвердите согласие заново с новой версией.
Черновик заявления, которое вы подтверждаете (окончательная формулировка проверяется и может измениться):
I confirm that I own the voice in these recordings or have the written permission of the person whose voice it is, that this person is an adult and has agreed to have their voice cloned and synthesized, and that I will not use the voice to impersonate a real person, to deceive, to harass, or for political persuasion, fraud or any unlawful purpose. I understand the voice can be removed and my account suspended if I break these rules.
Использование собственного голоса
Передайте id голоса как voice в POST /v1/audio/speech (voice=voice_…) вместе с речевой моделью семейства elevenlabs/*. Лимит ввода, форматы и цена за символ — как у модели. Id, которого нет, который удалён или заблокирован либо принадлежит другому человеку, получает ответ 400 invalid_voice; собственный голос нельзя использовать с другими моделями.
Если голос без разрешения имитирует вас или другого человека, сообщите: POST /v1/voices/report (ключ API не нужен) с JSON-телом из voice_id (voice_…) или sample_url, reason (impersonation, fraud, harassment, minor, political или other) и необязательных details и contact (адрес электронной почты). Всегда отвечает 202. Мы рассматриваем жалобы и удаляем голоса, нарушающие правила; аккаунты могут быть заблокированы.
Не клонируйте голоса публичных людей, знаменитостей, политиков и тех, кто не дал согласия. Не используйте клонированный голос, чтобы люди думали, что говорят с настоящим человеком, а также для обмана, преследования, политического убеждения или мошенничества.
Ошибки
Статус
Код
Значение
400
bad_request
Некорректный запрос: не multipart/form-data, нет аудиофайла, слишком длинный description или limit вне диапазона 1–100.
400
consent_required
Отсутствует consent=true.
400
consent_version_mismatch
Версия заявления о согласии устарела; подтвердите заново с текущей версией.
400
invalid_voice_name
Название пустое, длиннее 60 символов или недопустимо.
400
too_many_files
Больше 5 аудиофайлов.
401
invalid_api_key
Ключ API отсутствует или недействителен.
402
insufficient_balance
Недостаточно средств (плата за создание или минимальный баланс).
403
email_unverified
Сначала подтвердите адрес электронной почты.
403
voice_cloning_not_enabled
Для вашего аккаунта собственные голоса ещё не включены; для заявки обратитесь в службу поддержки.
403
voice_cloning_disabled
Собственные голоса сейчас не включены для этого сервиса.
404
voice_not_found
Такого голоса нет (или он не ваш).
404
not_found
Не найдено, включая любой запрос /v1/voices, пока функция не включена для вашего аккаунта.
405
method_not_allowed
Этот метод недоступен для данного пути.
409
duplicate_request
Тот же Idempotency-Key всё ещё обрабатывается; подождите и повторите.
413
file_too_large
Файл больше 10 МБ или все файлы вместе больше 25 МБ.
415
unsupported_file_type
Тип аудио не поддерживается; используйте mp3, wav, m4a, ogg, flac, webm.
422
voice_rejected
Проверка провайдера голоса не приняла образец (например, известный или встроенный голос либо известный голос, синтезированный ИИ). Голос не сохраняется, плата не списана. Используйте чёткую запись своего голоса или голоса, который вы вправе использовать.
Вы достигли максимального числа собственных голосов.
502
upstream_failed
Голос не удалось создать; плата не списана. Повторите с новым Idempotency-Key.
503
voice_capacity_full
Лимит собственных голосов сейчас исчерпан; плата не списана. Повторите позже.
504
upstream_timeout
Сервис голоса не ответил вовремя; плата не списана. Повторите с тем же Idempotency-Key.
API данных
Скоро — Общедоступные социальные и коммерческие данные через три эндпоинта BazaarLink. Сервис по умолчанию отключён. До его включения запросы будут возвращать service_paused.
Отправить запрос социальных данных
POST/v1/data/social
Параметры запроса
Код
Тип
Обязательно
Значение
platform
string
Да
ID платформы из каталога, например twitter или instagram.
action
string
Да
Действие, поддерживаемое этой платформой; доступные сочетания указаны в каталоге.
params
object
Нет
Входные данные для действия. Используйте required_params и optional_params из каталога.
mode
sync | async
Нет
Необязательно. async возвращает задачу для опроса; действия только с асинхронным режимом возвращают задачу даже без этого параметра.
Асинхронное действие или mode async возвращает HTTP 202 с непрозрачным ID задачи. Опросите GET /v1/data/jobs/{id}: HTTP 202 означает ожидание, а HTTP 200 возвращает завершённый ответ data.social. Задача истекает через 15 минут (HTTP 410 job_expired). Неизвестные задачи и задачи другого аккаунта возвращают HTTP 404 not_found. Завершённая задача оплачивается один раз при первом успешном получении.
{"object":"data.catalog","product":"BazaarLink Data API","platforms":[{"platform":"twitter","actions":[{"action":"search","label":"Keyword search","required_params":["keyword"],"optional_params":["sort"],"max_limit":200,"async":false,"price_usd":0.0048}]},{"platform":"instagram","actions":[{"action":"discover","label":"Discover","required_params":["keyword"],"optional_params":[],"max_limit":null,"async":true,"price_usd":0.0096}]}]}
Оплата
Цены зависят от платформы и действия и распределены по уровням. GET /v1/data/catalog показывает цену для клиента за каждое доступное действие. Успешный вызов оплачивается один раз; неудачные вызовы и вызовы без результатов бесплатны. Data API и веб-поиск используют общую ежедневную бесплатную квоту.
Evaluate a state against named questions with a decisions-output model. This alpha endpoint returns non-streaming JSON. Find available model ids with GET /v1/models?output_modalities=decisions; use this endpoint for Clef instead of chat/completions. Input tokens are billed at the selected model's customer price. Sufficient credits are required. Set BAZAARLINK_API_KEY to your API key; the sample builds its complete Authorization header in BAZAARLINK_AUTH_HEADER.
export BAZAARLINK_AUTH_HEADER="Authorization: $(printf '%s %s' 'Bearer' "$BAZAARLINK_API_KEY")"
curl https://api.bazaarlink.ai/v1/alpha/decisions \
-H "$BAZAARLINK_AUTH_HEADER" \
-H "Content-Type: application/json" \
-d '{
"model": "cloudflare/clef-flash",
"state": "The support agent issued a full refund.",
"questions": {
"refunded": {
"type": "noul",
"instructions": "Was a refund issued?"
}
}
}'
Видеовходы
Отправляйте видеофайлы на модели, поддерживающие видеовход, для анализа, создания субтитров или вопросов о сценах и событиях. Работает с прямыми данными URL или базовыми данными URI — URL более эффективен для общедоступного видео; base64 предназначен для локальных файлов или частного видео.
Поддерживаемые форматы
MP4 (H.264)MPEGMOVВебМ
1
2
3
4
5
6
7
8
9
10
11
12
13
response = client.chat.completions.create(
model="google/gemini-3.5-flash",
messages=[{
"role": "user",
"content": [
{
"type": "video_url",
"video_url": {"url": "https://example.com/video.mp4"},
},
{"type": "text", "text": "What is happening in this video?"},
],
}],
)
Отправляйте документы PDF непосредственно в сообщениях для моделей, которые изначально поддерживают ввод PDF (например, Claude, Gemini). BazaarLink перенаправляет файл прямо в модель — тарифицируется как обычные входные токены, без дополнительной оплаты или этапа обработки.
Поддерживаемые форматы
PDF документы (текст, изображения, таблицы, сканированные)
Данные в кодировке
An OpenAI Ответы Конечная точка, совместимая с API, для многоповоротных диалогов без сохранения состояния, вызова инструментов и мультимодальных входных данных. Идеально подходит для агентов и платформ, которые используют OpenAI Python SDK ≥ 1.x с client.responses.create().
POST/v1/responses
Note
Принимает ту же аутентификацию и модель маршрутизации, что и Chat Completions.
Тело запроса
modelобязательно
string
Используйте id или alias из GET /v1/models, например "claude-sonnet-4.6" или "anthropic/claude-sonnet-4.6".
inputобязательно
string | Item[]
User input — простая строка (одиночное сообщение) или массив элементов ввода для многооборотных/мультимодальных разговоров.
instructions
string
Инструкции системного уровня, эквивалентные системному сообщению. Необходимо отправлять повторно при каждом запросе.
stream
boolean
Если true, возвращает события потока ответов API SSE. Типы событий: ответ.создан, ответ.выходной_текст.дельта, ответ.завершено.
max_output_tokens
integer
Максимальное количество создаваемых выходных токенов (включая логические токены для моделей серии O).
Определения
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
tools
Tool[]
Tool (функции) — тот же формат схемы JSON, что и Chat Completions (принимает как плоскую форму ответов, так и вложенную форму). Собственные встроенные размещенные инструменты OpenAI (web_search_preview, file_search, Computer_use_preview) не поддерживаются; веб-поиск доступен через плагины: [{id:"web"}] — поддерживается только на некоторых маршрутах модели.
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.
parallel_tool_calls
boolean
Включить параллельный вызов функций при наличии инструментов. По умолчанию: правда. Только модели семейства OpenAI — см. примечание ниже.
response_format
object
Force структурированный вывод JSON. См. раздел «Структурированный вывод».
previous_response_id
string
Эта конечная точка не имеет состояния — при передаче ненулевого значения немедленно возвращается 400 (invalid_prompt), оно никогда не принимается и игнорируется. Вместо этого используйте режим без сохранения состояния: передайте полную историю разговоров во входной массив.
curl https://api.bazaarlink.ai/v1/responses \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.4-mini",
"instructions": "You are a helpful assistant.",
"input": "What is the capital of Taiwan?"
}'
Формат ответа
BazaarLink возвращает стандартизованный ответ и удаляет поля, специфичные для апстрима. Непрозрачный ID запроса BazaarLink в ответе совпадает с x-request-id; используйте его с GET /v1/generation. Нестриминговые ответы также возвращают тот же ID в x-generation-id. usage.cost — сумма в USD, списанная с клиента. Статистика может появиться через несколько секунд после завершения; при 404 ненадолго повторите запрос.
Замените сообщения входными данными (строкой или массивом), используйте инструкции вместо сообщения системной роли и прочитайте выходные данные[0].content[0].text вместо choice[0].message.content.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Chat Completions (before)
response = client.chat.completions.create(
model="openai/gpt-5.4-mini",
messages=[
{"role": "system", "content": "You are helpful."},
{"role": "user", "content": "Hello"},
]
)
text = response.choices[0].message.content
# Responses API (after)
response = client.responses.create(
model="openai/gpt-5.4-mini",
instructions="You are helpful.",
input="Hello"
)
text = response.output[0].content[0].text
Ограничения
previous_response_id или store: true отклоняется с кодом 400 (код ошибки valid_prompt) — не принимается и игнорируется. Всегда используйте режим без сохранения состояния: передавайте полную историю разговоров во входной массив.
Собственные встроенные размещенные инструменты
OpenAI (web_search_preview, file_search, Computer_use_preview) не поддерживаются. Веб-поиск доступен через плагины: [{id:"web"}] — поддерживается только на некоторых маршрутах модели.
background: true принимается, но игнорируется — каждый запрос выполняется синхронно до завершения.
Messages (Anthropic)
Anthropic-совместимый Messages API для Claude SDK. Укажите в SDK адрес BazaarLink и используйте API-ключ BazaarLink; поля ответа и метаданные биллинга соответствуют контракту BazaarLink, описанному ниже.
POST/v1/messages
Note
Принимает токен носителя или заголовок x-api-key (совместимость с Anthropic SDK). Максимальный размер тела: 10 МБ.
Тело запроса
modelобязательно
string
Используйте id или alias из GET /v1/models, например "claude-sonnet-4.6" или "anthropic/claude-sonnet-4.6".
max_tokensобязательно
integer
Максимальное количество токенов для генерации (положительное целое число).
messagesобязательно
Message[]
Масив сообщений диалога (непустой).
system
string
Дополнительная системная подсказка.
stream
boolean
Если true, возвращает поток событий, отправленных сервером. По умолчанию: ложь
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
BazaarLink возвращает стандартизованный ответ и удаляет поля, специфичные для апстрима. Непрозрачный ID запроса BazaarLink в ответе совпадает с x-request-id; используйте его с GET /v1/generation. Нестриминговые ответы также возвращают тот же ID в x-generation-id. usage.cost и usage.bz_cost содержат одну и ту же сумму в USD, списанную с клиента. Статистика может появиться через несколько секунд после завершения; при 404 ненадолго повторите запрос.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{"id":"85e6f35c71a31f19-SJC","type":"message","role":"assistant","model":"anthropic/claude-opus-4.6","content":[{"type":"text","text":"Hello! How can I help you today?"}],"stop_reason":"end_turn","usage":{"input_tokens":10,"output_tokens":12,"cache_read_input_tokens":0,"cache_creation_input_tokens":0,"cost":0.00042,"bz_cost":0.00042}}
Формат конверта ошибки зависит от типа сбоя. Ориентируйтесь на HTTP-статус и error.type, если он есть; error.code может быть строкой, числовым HTTP-статусом или отсутствовать. Рекомендации по обработке см. в разделе об ошибках.
Модели
Перечислите все доступные модели с информацией о ценах и возможностях. Для этой конечной точки аутентификация не требуется.
// /v1/models — Response SchematypeModelsResponse = {
data: Model[];
};
typeModel = {
id: string; // Model ID (e.g. "openai/gpt-4o")name: string; // Human-readable namecontext_length: number | null; // Max context window in tokensmodality: string | null; // e.g. "text->text", "text+image->text"architecture?: {
input_modalities?: string[];
output_modalities?: Array<
"text" | "image" | "embeddings" | "audio" |
"video" | "rerank" | "speech" | "transcription"
>;
};
pricing: {
prompt: string; // Input price per 1M tokens (USD)completion: string; // Output price per 1M tokens (USD)input_cache_read?: string; // Cache read price per token (USD); only when the model publishes oneinput_cache_write?: string; // Cache write price per token (USD); only when the model publishes oneimage_output?: string; // Image output price per token (USD); only token-billed image models (display only)
};
description?: string | null; // Model descriptiontop_provider?: {
max_completion_tokens?: number;
};
supported_parameters?: string[]; // e.g. ["tools", "response_format", "reasoning"]pricing_tiers?: { // Present only for models with input-length tiersabove_prompt_tokens: number; // Ascending; strict "greater than" thresholdprompt: string; // USD per token, override tiercompletion: string; // USD per token, override tierinput_cache_read?: string; // USD per token, only when the tier overrides itinput_cache_write?: string; // USD per token, only when the tier overrides it
}[];
};
Многоуровневое ценообразование на входную длину
Некоторые модели переключаются на другую таблицу цен, когда запрос превышает порог токена — меняется вся таблица, а не только токены выше порога. Пороговые значения строгие: приглашение с ровно N жетонами по-прежнему выставляет счета на уровне ниже N; более высокий уровень применяется только тогда, когда входные токены больше N.
pricing_tiers — это аналог ценообразования, который присутствует только в том случае, если у модели есть переопределенные уровни, превышающие базовую цену. Записи сортируются по возрастанию числа выше_промпт_токенов; prompt/completion — это USD на токен (та же единица измерения, что и pricing.prompt/pricing.completion). «pricing.prompt» и «pricing.completion» всегда остаются базовым (самым низким) уровнем.
Большинство моделей не имеют уровней — для них ключ Price_tiers просто отсутствует в ответе.
Jev оценивает состояние JSON по именованным вопросам и возвращает ответы типов boolean, choice или score. Используйте его, когда приложению нужен машиночитаемый результат по заданным критериям.
Только для оценки и принятия решений
Jev не поддерживает чат. Отправляйте запросы Jev на POST /v1/evaluations; запрос к POST /v1/chat/completions вернёт HTTP 400.
POST/v1/evaluations
Вызовите эту конечную точку с ключом API BazaarLink. Полный URL: https://api.bazaarlink.ai/v1/evaluations.
Описание полей
model
string
Необязательное поле. Если его нет, используется typesafe-ai/jev. Другой ID модели возвращает HTTP 400 с кодом model_not_available.
state
string | object | array
Обязательное поле. Передайте оцениваемое состояние как JSON-строку, объект или массив. Если сериализованные state и questions превышают 32 000 tokens, возвращается context_length_exceeded.
questions
record<string, Question>
Обязательное непустое поле-объект с именованными вопросами. Имя каждого вопроса становится ключом в объекте answers ответа.
type
boolean | choice | score
Обязательное поле каждого вопроса: boolean, choice или score.
instructions
string | object | array
Обязательное поле каждого вопроса. JSON-строка, объект или массив с описанием того, что нужно определить.
criteria
object | array
Зависит от type: для boolean необязательно; если указано, это объект только с ключами true или false. Для choice нужен непустой объект, а для score — упорядоченный массив минимум из двух элементов.
Типы ответов
boolean — criteria можно не указывать; если оно задано, допустимы только ключи true и false. Ответ содержит числовое значение probability.
choice — criteria должен быть непустым объектом, сопоставляющим названия вариантов критериям JSON. Ответ содержит строковое значение choice; ключами probabilities служат названия вариантов.
score — criteria должен быть упорядоченным массивом как минимум из двух элементов. score — число и математическое ожидание индексов 0..N-1 в порядке массива criteria; ключами probabilities служат эти индексы в виде строк.
Примеры запросов
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
curl --fail-with-body https://api.bazaarlink.ai/v1/evaluations \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe-ai/jev",
"state": "The support agent issued a full refund and apologised for the delay.",
"questions": {
"refunded": {
"type": "boolean",
"instructions": "Was a refund issued?"
},
"tone": {
"type": "choice",
"instructions": "Tone of the agent?",
"criteria": {
"apologetic": "The agent apologises",
"neutral": "No emotional language",
"hostile": "The agent is rude"
}
},
"quality": {
"type": "score",
"instructions": "How complete was the resolution?",
"criteria": [
"poor",
"partial",
"complete"
]
}
}
}'
Пример успешного ответа
В примере ответа есть id, object, model, answers, usage, rounding и warnings. Ключи answers — названия вопросов. В usage указаны input_tokens, output_tokens и total_tokens; в rounding показаны probabilityDecimals и scoreDecimals. warnings — массив; в этом примере он пуст. Внутри answers ключами probabilities для choice служат названия вариантов, а для score — строковые индексы criteria.
Отправка Jev на чат-конечную точку возвращает HTTP 400. Показанные ниже поля и значения соответствуют обработчику; message заменено заполнителем, фактический текст возвращает сервер.
При потоковой передаче данные об использовании возвращаются в последнем фрагменте перед сообщением [DONE] вместе с массивом выбора с пустой дельтой и параметром Finish_reason: «stop».
Keep-alive и финальный фрагмент
Поток может содержать строки-комментарии SSE и неизвестные или ping-события keep-alive. Игнорируйте их и разбирайте data-кадры; последний кадр может содержать usage перед data: [DONE].
1
2
3
4
5
6
7
: keepalive <- SSE comment line — ignore, do NOT JSON.parse
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hi"},"index":0}]}
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}
data: [DONE]
Отмена трансляции
Потоковые запросы можно отменить, закрыв клиентское соединение — например. вызов AbortController.abort() или закрытие объекта потока. BazaarLink прекращает ретрансляцию дальнейших фрагментов и отменяет исходящий запрос провайдера, как только будет получено уведомление об отмене.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
importOpenAIfrom"openai";
const client = newOpenAI({
baseURL: "https://api.bazaarlink.ai/v1",
apiKey: "sk-bl-YOUR_API_KEY",
});
const controller = newAbortController();
const stream = await client.chat.completions.create(
{
model: "anthropic/claude-sonnet-4.6",
messages: [{ role: "user", content: "Write a long story." }],
stream: true,
},
{ signal: controller.signal }
);
forawait (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content;
if (content) process.stdout.write(content);
}
// e.g. on a "Stop" button click:
controller.abort();
За прерванную трансляцию плата не взимается.
Если поток заканчивается до прибытия окончательного фрагмента использования (включая отмену на стороне клиента), для этого запроса нет достоверной информации о подсчете токенов, поэтому BazaarLink возвращает полную резервацию. Вам не выставляется счет за контент, уже доставленный вашему клиенту до отмены.
Не гарантируется мгновенная остановка провайдера
Закрытие соединения останавливает BazaarLink от немедленной ретрансляции и оплаты дальнейших токенов, но прекратит ли вышестоящий провайдер генерацию на своих собственных серверах в момент разрыва соединения, зависит от этого провайдера — некоторые могут продолжать выполнять вычисления некоторое время после отключения.
Ошибки среднего потока
Нет поля выбора в кадрах ошибок
Если сбой происходит после начала потоковой передачи (например, разрыв восходящего соединения), вы получаете кадр данных SSE в форме {error:{message,type,code}} вместо обычного {choices:[...]} — без изменения статуса HTTP, поскольку заголовки уже были отправлены. Прежде чем читать options[0].delta, проверьте наличие ключа ошибки и выставляйте счет только за уже переданные токены (применяется частичная оплата).
1
2
3
4
5
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"The capital of "},"index":0}]}
data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}
data: [DONE]
Embeddings
Embeddings — это числовые представления текста, которые отражают семантическое значение. Они преобразуют текст в векторы (массивы чисел), которые можно использовать для ряда задач машинного обучения. BazaarLink предоставляет унифицированную конечную точку, совместимую с OpenAI Embeddings API, поэтому вы можете вызывать модели внедрения от нескольких поставщиков через один интерфейс.
Ответы Embeddings используют непрозрачный ID запроса BazaarLink, совпадающий с x-request-id; используйте его с GET /v1/generation. Нестриминговый ответ также возвращает тот же ID в x-generation-id. usage.cost — сумма в USD, списанная с клиента за этот запрос. Статистика может появиться через несколько секунд после завершения; при 404 ненадолго повторите запрос.
Что такое встраивания?
Вложения преобразуют текст в многомерные векторы, где семантически схожие тексты расположены ближе друг к другу в векторном пространстве — например, «кошка» и «котенок» будут иметь схожие вложения, а «кошка» и «самолет» будут далеко друг от друга. Эти векторные представления позволяют машинам понимать взаимосвязи между фрагментами текста, что делает их основой для многих приложений искусственного интеллекта.
Общие случаи использования
Случай использования
Описание
RAG (генерация с расширенным поиском)Создавайте системы, которые извлекают соответствующий контекст из базы знаний перед генерированием ответа — встраивания находят наиболее релевантные документы для включения в контекст LLM.
Семантический поискПреобразуйте документы и запросы во встраивания, а затем находите наиболее релевантные документы по векторному сходству — это позволяет понять смысл, а не просто сопоставить ключевые слова, что дает лучшие результаты, чем поиск по ключевым словам.
Системы рекомендацийСоздавайте вложения для элементов (продуктов, статей, видео) и предпочтений пользователя, чтобы рекомендовать похожие элементы — векторное сравнение позволяет выявить семантически связанные элементы даже без общих ключевых слов.
Кластеризация и классификацияГруппируйте похожие документы или классифицируйте текст путем анализа шаблонов встраивания — документы со схожими вложениями обычно относятся к одной и той же теме или категории.
Обнаружение дубликатовНаходите повторяющийся или почти повторяющийся контент путем сравнения сходства встраивания — это работает, даже если контент был перефразирован или переформулирован.
Обнаружение аномалийВыявляйте необычное или необычное содержимое, выявляя встраивания, которые значительно отличаются от типичного шаблона набора данных.
POST/v1/embeddings
Note
Если upstream-источник не поддерживает запрошенную модель эмбеддингов, запрос может попробовать другой доступный источник. Если подходящих источников нет, запрос вернёт ошибку.
Параметры
modelобязательно
string
Используемая модель внедрения, например. "openai/text-embedding-3-small".
inputобязательно
string | string[] | ContentItem[]
Текст для встраивания — одна строка, массив строк для одного пакетного вызова или (для моделей, которые это поддерживают) массив элементов {content:[...]}, смешивающих части text и image_url.
dimensions
integer
Запрошенный размер выходного вектора. Уважается только моделями, поддерживающими переменные размеры (например, семейство OpenAI text-embedding-3); пересылается вышестоящему поставщику как есть и игнорируется моделями, которые его не поддерживают.
encoding_format
string
Запрошенная кодировка внедрения, например «плавающее» или «base64». Пересылается вышестоящему поставщику в неизменном виде — поддержка зависит от модели.
provider
object
Unsupported. The entire object is ignored and removed before forwarding; it cannot select an upstream or price tier.
Основной запрос
1
2
3
4
5
6
7
8
9
10
11
12
13
from openai import OpenAI
client = OpenAI(
base_url="https://api.bazaarlink.ai/v1",
api_key="sk-bl-YOUR_API_KEY",
)
response = client.embeddings.create(
model="openai/text-embedding-3-small",
input="The quick brown fox jumps over the lazy dog",
)
print(response.data[0].embedding) # 1536-dimensional vector
Пакетная обработка
Отправьте массив строк для встраивания нескольких текстов в один запрос — дешевле и быстрее, чем один вызов для каждого текста.
1
2
3
4
5
6
7
8
9
10
11
response = client.embeddings.create(
model="openai/text-embedding-3-small",
input=[
"Machine learning is a subset of artificial intelligence",
"Deep learning uses neural networks with multiple layers",
"Natural language processing enables computers to understand text",
],
)
for i, item inenumerate(response.data):
print(f"Embedding {i}: {len(item.embedding)} dimensions")
Многомодальный ввод (изображение + текст)
Модели с поддержкой ввода изображений (output_modalities включает «embeddings», а inputModalities включает «image») принимают элементы ввода в форме {content:[{type:"text",...}, {type:"image_url",...}]}, что позволяет встраивать изображение отдельно или вместе с текстом.
В зависимости от модели
Только некоторые модели внедрения принимают входные изображения — перед отправкой содержимого image_url проверьте поддерживаемые модели модальности на странице «Модели». Модели, содержащие только текст, отклонят эту форму.
Нет специальной конечной точки для списка моделей внедрений — вызовите GET /v1/models и отфильтруйте на стороне клиента записи, выходные_модальности которых включают «внедрения», или просмотрите страницу «Модели».
Ограничения
Нет потоковой передачи — встраивания всегда возвращаются как полный ответ, в отличие от завершения чата.
Каждая модель имеет максимальную входную длину; текст, выходящий за этот предел, обрезается или отклоняется в восходящем направлении.
Вложения для идентичных входных данных являются детерминированными — температура или случайность не учитываются.
Передовые практики
Выберите модель для достижения компромисса между speed/quality и стоимостью — модели меньшего размера (например, qwen/qwen3-embedding-4b) дешевле и быстрее; более крупные (например, openai/text-embedding-3-large) обычно встраиваются с более высокой точностью.
Объедините несколько текстовых сообщений в один запрос вместо одного звонка на одно текстовое сообщение — меньше циклов обработки, меньше накладных расходов.
Кэшируйте результаты — внедрения для одних и тех же входных данных никогда не меняются, поэтому сохраняйте их, а не восстанавливайте.
Сравнивайте с косинусным сходством, а не с евклидовым расстоянием — оно масштабно-инвариантно и лучше работает для многомерных векторов.
Следите за длиной контекста каждой модели — перед встраиванием длинных документов может потребоваться разделение на фрагменты.
Pure passthrough — без локальных значений по умолчанию
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
frequency_penalty
number
Наказание повторяющихся токенов. Диапазон: [-2, 2]. По умолчанию: 0
presence_penalty
number
Назначать штрафы за токены в зависимости от присутствия. Диапазон: [-2, 2]. По умолчанию: 0
repetition_penalty
number
Уменьшить повторение входных токенов. Диапазон: (0, 2]. По умолчанию: 1.
min_p
number
Минимальная вероятность относительно верхнего токена. Диапазон: [0, 1]. По умолчанию: 0
top_a
number
Динамический топ-P на основе токена с наибольшей вероятностью. Диапазон: [0, 1]. По умолчанию: 0
seed
integer
Целочисленное начальное значение для детерминированной выборки. Не гарантируется для всех моделей
max_tokens
integer
Максимальное количество токенов для генерации
n
integer
Количество завершений, которые нужно сгенерировать. По умолчанию: 1
logit_bias
object
Сопоставьте идентификаторы токенов со значениями смещения [-100, 100], добавленными перед выборкой. Только модели семейства OpenAI — см. примечание ниже.
logprobs
boolean
Вернуть вероятности журнала для каждого выходного токена. Только модели семейства OpenAI — см. примечание ниже.
top_logprobs
integer
Количество наиболее вероятных токенов для каждой позиции (требуется logprobs: true). Диапазон: 0–20. Только модели семейства OpenAI — см. примечание ниже.
response_format
object
Force структурированный вывод JSON. См. раздел «Структурированный вывод».
structured_outputs
boolean
Запросите строгий вывод, соответствующий схеме JSON, у поставщиков, которые его поддерживают. Прошло как есть
reasoning
object
Конфигурация reasoning/thinking, специфичная для поставщика. Прошло как есть
reasoning_effort
string
OpenAI Усилие рассуждения в стиле o-серии: «низкое», «среднее» или «высокое». Прошло как есть
include_reasoning
boolean
true возвращает текст рассуждений в message.reasoning (при потоковой передаче — в delta.reasoning); false отключает рассуждения у моделей, которые рассуждают по умолчанию (см. раздел о рассуждениях), поэтому рассуждения не оплачиваются. Без reasoning_effort, reasoning и thinking по умолчанию рассуждают и возвращают текст только эти модели; остальные — только по запросу
stop
string | string[]
Stop-последовательности — генерация останавливается при обнаружении
tools
Tool[]
Список инструментов (функций), которые может вызывать модель
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.
parallel_tool_calls
boolean
Включить параллельный вызов функций при наличии инструментов. По умолчанию: правда. Только модели семейства OpenAI — см. примечание ниже.
Кредиты
Запросить текущий кредитный баланс и использование API за весь срок действия.
GET/v1/credits
Auth
Требуется токен носителя (стандартный ключ API sk-bl-...).
Используйте непрозрачный ID запроса BazaarLink из response id или заголовка x-request-id для GET /v1/generation; в нестриминговом ответе тот же ID есть в x-generation-id. Статистика может появиться через несколько секунд; повторяйте запрос при 404 недолго.
GET/v1/generation?id=<generation-id>
Auth
Требуется токен носителя (стандартный ключ API). Обязательный параметр запроса: id.
Ошибки: 400 (отсутствует идентификатор), 401 (аутентификация), 404 (поколение не найдено).
API Ключевая информация
Запросите текущий уровень ограничения скорости ключа API и агрегированные счетчики использования (формат ответа соответствует общепринятым отраслевым соглашениям о ключах API).
is_free_tier = true, когда кредитный баланс < 10 долларов США. Окна находятся в формате UTC: ежедневно = текущий день, еженедельно = пн–вс, ежемесячно = 1st–EOM. Если для ключа установлен лимит расходов на ключ (с помощью параметра лимита ключа creation/update), limit/limit_remaining/limit_reset отражает этот лимит и использование соответствующего периода; в противном случае лимит равен нулю, и limit_remaining возвращается к кредитному балансу вашего аккаунта. expires_at — срок действия ключа (ноль, если его нет). is_management_key и is_provisioning_key — это псевдонимы одной и той же концепции — оба верны для ключа управления.
BYOK
BazaarLink не предлагает программу принесения собственного ключа (BYOK), поэтому эта конечная точка не возвращает никаких полей byok_usage.
Формат ошибок зависит от endpoint. Используйте HTTP-статус и error.type, если он есть. error.code может быть строкой, числом или отсутствовать; error.message предназначено только для отображения.
1
2
3
4
5
6
7
{"error":{"message":"Insufficient credits. Please top up to continue.","type":"invalid_request_error","code":"insufficient_credits"}}
HTTP
Формат ошибок зависит от endpoint. Используйте HTTP-статус и error.type, если он есть. error.code может быть строкой, числом или отсутствовать; error.message предназначено только для отображения.
Код
Название
Описание
424Сбой зависимостиНастроенный вами ключ BYOK отклонён upstream-провайдером; проверьте или замените его в настройках BYOK. Ошибка появляется только в строгом режиме
400Неверный запросНеверный запрос, пустой массив сообщений или отсутствуют обязательные поля
401НесанкционированныйAPI Ключ отсутствует, недействителен или отключен.
402Требуется оплатаНедостаточно средств на счете, достигнут предел расходов на ключ или превышен предел бюджета monthly/weekly
403ЗапрещеноУчетная запись заблокирована или не имеет разрешения
404Не найденЗапрошенная модель, поколение, ключ или другой ресурс не существует.
409КонфликтРесурс не находится в требуемом состоянии, например задание видео не завершено.
410УшелЗапрошенная модель снята с производства и должна быть заменена.
413Полезная нагрузка слишком великаТело запроса превышает 10 МБ; уменьшить размер контента или разделить запрос
416Диапазон неудовлетворителенЗапрошенный диапазон байтов недействителен для созданного видеоконтента.
429Слишком много запросовПревышен лимит скорости; перед повторной попыткой проверьте заголовок Retry-After
432Бесплатная квота исчерпанаTavily-совместимые эндпоинты (/v1/search, /v1/extract, /v1/crawl, /v1/map): бесплатная квота поиска исчерпана или баланс равен нулю или отрицателен; пополните баланс, чтобы продолжить. Тело ответа в формате Tavily: {"detail":{"error":"..."}}
500Ошибка сервераВнутренняя ошибка BazaarLink
502Плохой шлюзНи один upstream-источник не обработал запрос; запрос вернёт ошибку.
503Сервис недоступенДля этой модели не настроен ни один вышестоящий поставщик; связаться с администратором
504Тайм-аут шлюзаВосходящее соединение или поток остановлены и истекло время ожидания.
Машиночитаемые коды оплаты
Ответ
A 402 может представлять собой различные элементы управления. Эти стабильные коды позволяют клиентам показывать правильное следующее действие.
Код
Описание
byok_key_invalidНастроенный вами ключ BYOK отклонён upstream-провайдером; проверьте или замените его в настройках BYOK. Ошибка появляется только в строгом режиме.
budget_cap_reachedA Достигнут предел еженедельного или ежемесячного бюджета рекомендаций; поднимите или сбросьте крышку.
credit_limit_exceededA Жесткая кредитная линия организации, осуществляющей ежемесячные платежи, исчерпана; контактный биллинг.
insufficient_creditsA пользователь или организация с предоплатой не может зарезервировать достаточный баланс; добавить кредиты.
spend_limit_exceededКлюч API достиг настроенного ежедневного, еженедельного или ежемесячного лимита расходов.
capacity_unavailableThis model is temporarily at capacity. Retry shortly; the Retry-After header says how long to wait.
Подробные коды ошибок
Если запрос API завершается неудачно, error.code сообщает конкретную причину. Две ошибки могут использовать HTTP 400, но требуют разных исправлений: «unknown_model» означает, что имя модели неверно, а «image_too_large» означает, что изображение необходимо уменьшить. Используйте таблицу ниже, чтобы найти причину и следующее действие.
Статус
Недопустимые параметры, контекст, инструменты, схемы и отказы в отношении безопасности содержимого.
Код
HTTP
missing_required_field400
unsupported_param400
max_tokens_invalid400
context_too_long400
tool_use_unsupported400
malformed_tool_messages400
invalid_response_format_schema400
invalid_tools_definition400
content_moderation403
content_filter403
unknown_4xx400
Создание и редактирование изображений
Ввод изображения, многочастное редактирование, вывод и ошибки конвейера изображений.
Код
HTTP
invalid_image_url400
input_images_not_supported400
invalid_content_type400
mask_not_supported400
unsupported_response_format400
missing_prompt400
missing_image400
too_many_images400
invalid_image_type400
image_too_large400
invalid_n400
pipeline_error502
no_images502
Восходящая маршрутизация
Очистка ошибок подключения, аутентификации, регулирования и доступности поставщика.
Код
HTTP
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
capacity_unavailable429
upstream_unavailable502/503
byok_key_invalid424
Модерация контента
Все запросы автоматически проверяются перед отправкой модели. Запросы, нарушающие нашу политику использования, отклоняются до модели и возвращают ошибку 403.
Категории контента, которые блокируются
Модерация основана на нашей Политике допустимого использования (Acceptable Use Policy) и в первую очередь блокирует следующие категории контента:
Контент сексуальной эксплуатации
Угрозы насилия
Инструкции по совершению противоправных действий
Контент, связанный с биологической опасностью
Формат ответа 403
Запрос, заблокированный модерацией, возвращает ошибку в следующем формате:
1
2
3
4
5
6
7
{"error":{"message":"Your prompt was blocked by content moderation.","type":"invalid_request_error","code":"content_filter"}}
Заблокированные запросы не тарифицируются — вы не будете платить за отклонённый запрос.
Обжалование ложного срабатывания
Если вы считаете, что запрос был заблокирован ошибочно, обратитесь в службу поддержки, указав время запроса и (по возможности) request id — мы проверим.
Конфиденциальность
Каждый запрос автоматически проверяется на соответствие политике контента.
Для запросов, признанных нарушающими политику, содержимое сохраняется как доказательство соответствия требованиям.
Для остальных запросов полное содержимое промпта не сохраняется.
Ограничения ставок, бюджеты и экстренные тормоза
Эти элементы управления могут отклонить действительный запрос. Они отличаются от сбоев поставщика и требуют других действий по восстановлению.
Управление
HTTP
Как это определить
Ограничение скорости запроса429Строковый или числовой код 429; используйте заголовки Retry-After и X-RateLimit-*.
Блок штрафа за ограничение скорости429Цифровой код 429 и сообщение о временном ограничении; используйте Повтор-После.
Global проводит аварийное торможение503Цифровой код 503, сообщение о глобальном лимите расходов и повторная попытка через 30 или 300 секунд.
Org/team/member/user расходный тормоз429Цифровой код 429 и сообщение автоматического выключателя с указанием затронутой области.
Контроль выставления счетов и бюджета402Используйте коды строк стабильного платежа, перечисленные выше.
Формат ошибок зависит от endpoint. Используйте HTTP-статус и error.type, если он есть. error.code может быть строкой, числом или отсутствовать; error.message предназначено только для отображения.
Состояние видео и медиаресурсов
Проверка видео обычно возвращает числовой код 400. Отсутствующее задание возвращает 404, устаревшая модель возвращает 410, незавершенное видеоконтент возвращает 409, а недопустимый диапазон видеобайтов возвращает 416. Опрос до завершения или исправление заголовка Range перед повторной попыткой.
Политика повторных попыток
Повторять только те сбои, которые можно устранить без изменения запроса. Если присутствует Retry-After, подождите столько же; в противном случае используйте экспоненциальную задержку с джиттером. Ограничьте попытки и избегайте наслаивания ручных повторов поверх автоматических попыток SDK.
Повторить попытку с откатом
429, 502, 503 и 504. Соблюдайте параметр «Повторить попытку после», если он предусмотрен. Для запросов на создание не создавайте второе задание после неоднозначного сбоя сети, пока вы не проверите исходное задание.
Исправьте перед повторной попыткой
400, 401, 402, 403, 404, 409, 410, 413 и 416. Сначала измените запрос, учетные данные, баланс, разрешения, состояние ресурса или заголовок диапазона.
Обработка ошибок
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import random
import time
from openai import OpenAI, APIStatusError
client = OpenAI(
base_url="https://api.bazaarlink.ai/v1",
api_key="sk-bl-YOUR_API_KEY",
max_retries=0, # Avoid double retries; this example handles them.
)
RETRYABLE = {429, 502, 503, 504}
for attempt inrange(5):
try:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)
breakexcept APIStatusError as error:
if error.status_code notin RETRYABLE or attempt == 4:
raise
retry_after = error.response.headers.get("Retry-After")
delay = (
float(retry_after)
if retry_after
elsemin(8, 0.5 * (2 ** attempt)) + random.uniform(0, 0.25)
)
time.sleep(delay)
Форматы ошибок потоковой передачи
Ошибки, возникающие до потоковой передачи каких-либо токенов, возвращают стандартный ответ об ошибке HTTP с телом JSON.
После запуска потока ответ HTTP уже равен 200. Анализируйте каждый кадр данных SSE и обрабатывайте ошибку верхнего уровня или choice[0].finish_reason === "error" как неудавшийся, неполный ответ.
Если поток завершается ошибкой после начала, BazaarLink может отправить последнее SSE-событие с объектом error верхнего уровня, а затем data: [DONE]. Считайте ответ неполным и не используйте частичный вывод как завершённый результат.
1
2
3
4
5
data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}
data: [DONE]
// Branch on error.code; error.type can vary by failure path.
Версии
BazaarLink предоставляет единый стабильный путь API, /v1 — нет привязанных к дате версий или заголовков версий, которыми нужно управлять. API развивается постоянно, а не через пронумерованные выпуски.
Некритичные изменения
Отправка без предварительного уведомления:
Новые конечные точки
В каталог добавлены новые модели
Новые дополнительные параметры запроса
Новые поля ответа
Новые схемы с дополнительными свойствами
Дополнительные коды ответа status/error
Пишите клиентам в оборонительной форме.
Игнорируйте незнакомые поля ответа и не допускайте сбоев при неизвестных значениях в полях, подобных перечислению: новые добавляются по мере роста каталога и набора функций.
Важные изменения
Это редкие экземпляры, включая:
Удаление или переименование конечной точки, параметра или поля ответа.
Изменение типа поля
Сделать обязательным дополнительный параметр
Когда они все-таки происходят, критическое изменение применяется к конкретной конечной точке, а не ко всей поверхности /v1 — не существует какого-либо одного изменения версии, которое могло бы нарушить всю интеграцию сразу. Мы пока не публикуем официальный журнал изменений с пометкой «Критические изменения» (см. «Остаться в курсе» ниже); по вопросам, важным для интеграции, обращайтесь в службу поддержки, прежде чем полагаться на недокументированное поведение.
Политика прекращения поддержки
Одно обычное «критическое» событие, которого следует ожидать: отдельные модели выводятся из эксплуатации, поскольку вышестоящие поставщики устаревают. Запросите текущий статус модели через GET/v1/models.
1
2
3
4
5
6
7
GET https://api.bazaarlink.ai/v1/models
Authorization: Bearer sk-bl-YOUR_API_KEY
# A model within 30 days of its deprecation date shows in the catalog# with an "EOL" badge on the Models page. After the effective date it's# dropped from the catalog and calls return:# 410 { "error": { "type": "model_not_available", "code": "model_retired" } }
Будем в курсе
Мы пока не публикуем специальный журнал изменений API или канал RSS. На данный момент проверьте эту страницу напрямую, посмотрите статус модели через GET /v1/models или обратитесь в службу поддержки, если вам нужно предварительное уведомление о критической интеграции.
Поддержка
Поддержка
Здравствуйте! Чем мы можем помочь? Отправьте сообщение, и мы ответим в ближайшее время.