BazaarLinkBazaarLink
Войти
ДокументацияAPI СсылкаSDK СсылкаАгентное использованиеAI Навыки

API Ссылка

Обзор BazaarLink от BazaarLink

BazaarLink предоставляет одну OpenAI-совместимую схему запросов и ответов для всех моделей и поставщиков, поэтому вы можете интегрировать один раз и переключать модели без переписывания приложения.

OpenAPI Спецификация

Полная версия BazaarLink API документирована в спецификации OpenAPI. Вы можете получить к нему доступ в формате YAML или JSON:

Используйте эти спецификации с пользовательским интерфейсом Swagger, Postman или любым генератором кода, совместимым с OpenAPI, для изучения API или создания клиентских библиотек.

Запросы

Формат запроса на завершение работ

Тело запроса на завершение чата отправляется на следующую конечную точку:

POST/api/v1/chat/completions

Полный список поддерживаемых полей см. Параметры

Схема запроса
// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use a provider-qualified catalog ID
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;            // Range: [0, 2]
  max_tokens?: number;             // Positive integer
  max_completion_tokens?: number;  // Alias mapped to max_tokens upstream
  n?: number;
  seed?: number;
  stop?: string | string[];

  // Sampling
  top_p?: number;
  top_k?: number;
  frequency_penalty?: number;      // Range: [-2, 2]
  presence_penalty?: number;       // Range: [-2, 2]
  repetition_penalty?: number;     // Range: (0, 2]
  min_p?: number;                  // Range: [0, 1]
  top_a?: number;                  // Range: [0, 1]

  // Token probabilities
  logit_bias?: Record<number, number>;
  logprobs?: boolean;
  top_logprobs?: number;

  // Stable end-user identifier for abuse prevention
  user?: string;

  // Tool calling
  tools?: Tool[];
  tool_choice?: ToolChoice;
  parallel_tool_calls?: boolean;

  // Structured output
  response_format?: ResponseFormat;
  structured_outputs?: boolean;

  // Plugin configuration — forwarded to upstreams that support plugins.
  plugins?: Plugin[];

  // Multimodal and image-generation options
  modalities?: Array<"text" | "image">;
  image_config?: Record<string, unknown>;
  input_audio?: InputAudio;

  // Provider-specific reasoning controls
  reasoning_effort?: "low" | "medium" | "high";
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

  // BazaarLink message transforms and fallback routing
  transforms?: Array<"middle-out">;
  models?: string[];             // Fallback list — this drives waterfall routing, not route
  route?: "fallback";            // Passthrough only; forwarded as-is, no local effect
  provider?: ProviderPreferences;
};

// Message types
type Message =
  | SystemMessage
  | UserMessage
  | AssistantMessage
  | ToolMessage;

type SystemMessage = {
  role: "system";
  content: string | ContentPart[];
  name?: string;
};

type UserMessage = {
  role: "user";
  content: string | ContentPart[];
  name?: string;
};

type AssistantMessage = {
  role: "assistant";
  content?: string | ContentPart[] | null;
  name?: string;
  tool_calls?: ToolCall[];
};

type ToolMessage = {
  role: "tool";
  content: string;
  tool_call_id: string;
  name?: string;
};

// Multimodal content parts
type ContentPart =
  | TextContentPart
  | ImageContentPart
  | FileContentPart
  | AudioContentPart
  | VideoContentPart;

type TextContentPart = {
  type: "text";
  text: string;
};

type ImageContentPart = {
  type: "image_url";
  image_url: {
    url: string;                    // Remote URL or base64 data URI
    detail?: string;
  };
};

type FileContentPart = {
  type: "file";
  file: {
    filename?: string;
    file_data: string;              // Base64 data URI
  };
};

type AudioContentPart = {
  type: "input_audio";
  input_audio: InputAudio;
};

type InputAudio = {
  data: string;                     // Raw base64 without a data URI prefix
  format: string;                   // For example "wav" or "mp3"
};

type VideoContentPart = {
  type: "video_url";
  video_url: {
    url: string;                    // Remote URL or base64 data URI
  };
};

// Tool calling subtypes
type FunctionDescription = {
  name: string;
  description?: string;
  parameters: object;               // JSON Schema object
};

type Tool = {
  type: "function";
  function: FunctionDescription;
};

type ToolChoice =
  | "none"
  | "auto"
  | "required"
  | {
      type: "function";
      function: {
        name: string;
      };
    };

type ToolCall = {
  id: string;
  type: "function";
  function: {
    name: string;
    arguments: string;
  };
};

// Structured output
type ResponseFormat =
  | {
      type: "json_object";
    }
  | {
      type: "json_schema";
      json_schema: {
        name: string;
        strict?: boolean;
        schema: object;
      };
    };

// Upstream plugin configuration
type Plugin = {
  id: string;
  enabled?: boolean;
  [key: string]: unknown;
};

// Reasoning controls vary by model family
type ReasoningConfig = {
  effort?: "low" | "medium" | "high";
  max_tokens?: number;
  exclude?: boolean;
};

type ThinkingConfig = {
  type?: "enabled" | "disabled";
  budget_tokens?: number;
};

// Provider routing preferences
type ProviderPreferences = {
  order?: string[];
  only?: string[];
  ignore?: string[];
  allow_fallbacks?: boolean;
  sort?:
    | "price"
    | "latency"
    | "throughput"
    | {
        by: string;
        partition?: string;
      };
  require_parameters?: boolean;
  data_collection?: "allow" | "deny";
  quantizations?: string[];
  max_price?: Record<string, number>;
};

Структурированный вывод

Заставьте модель возвращать действительный JSON, соответствующий схеме. Это важно для создания надежных приложений, которые программно анализируют выходные данные модели.

  • json_objectбазовый режим JSON; модель возвращает действительный JSON.
  • json_schemaрежим строгой схемы; выходные данные модели должны соответствовать предоставленной схеме JSON.

Плагины

BazaarLink перенаправляет массив плагинов на выбранный восходящий маршрут. Доступность плагина зависит от выбранной модели и провайдера; веб-плагин также включен в варианте модели :online.

JSON
{
  "model": "openai/gpt-4.1",
  "messages": [
    { "role": "user", "content": "What happened today?" }
  ],
  "plugins": [
    { "id": "web" }
  ]
}

Дополнительные заголовки

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

TypeScript
await fetch("https://bazaarlink.ai/api/v1/chat/completions", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <BAZAARLINK_API_KEY>",
    "Content-Type": "application/json",
    "HTTP-Referer": "https://your-app.example",
    "X-Title": "Your App"
  },
  body: JSON.stringify({
    model: "openai/gpt-4.1",
    messages: [{ role: "user", content: "Hello!" }]
  })
});

Assistant Предварительное заполнение

Добавьте частичное сообщение помощника в качестве последнего элемента, чтобы запросить продолжение маршрутов совместимой модели.

Как это работает
BazaarLink сохраняет и пересылает последнее сообщение помощника. Поведение продолжения реализуется выбранной восходящей моделью и поставщиком, поэтому оно не гарантируется на каждом маршруте.
TypeScript
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. Подробная информация об использовании и стоимости возвращается, когда она доступна.

Схема ответа
type Response = {
  id: string;
  object: "chat.completion" | "chat.completion.chunk";
  created: number;
  model: string;
  choices: Array<NonStreamingChoice | StreamingChoice>;
  usage?: {
    prompt_tokens: number;
    completion_tokens: number;
    total_tokens: number;
    cost?: number;
    prompt_tokens_details?: {
      cached_tokens: number;
      cache_write_tokens?: number;
      audio_tokens?: number;
    };
    completion_tokens_details?: {
      reasoning_tokens?: number;
      image_tokens?: number;
    };
  };
};

type NonStreamingChoice = {
  index: number;
  finish_reason: string | null;
  native_finish_reason: string | null;
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  native_finish_reason: string | null;
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
  };
};

Причина завершения

finish_reason использует нормализованные значения, такие как остановка, длина, вызовы_инструментов, фильтр_содержимого и ошибка. Native_finish_reason сохраняет исходное значение поставщика.

JSON
{
  "finish_reason": "stop",
  "native_finish_reason": "stop"
}

Запрос стоимости и статистики

Получение подробной статистики для одного завершения по идентификатору поколения (из идентификатора ответа chat/completions или заголовка потоковой передачи x-bz-gen-id).

TypeScript
const generation = await fetch(
  "https://bazaarlink.ai/api/v1/generation?id=<GENERATION_ID>",
  {
    headers: {
      Authorization: "Bearer <BAZAARLINK_API_KEY>"
    }
  }
).then((response) => response.json());

Chat Completions

Основная конечная точка. Совместим с OpenAI Chat Completions API.

POST/api/v1/chat/completions

Тело запроса

modelобязательно
string
Идентификатор модели, например. «openai/gpt-4o» или «anthropic/claude-3.5-sonnet»
messagesобязательно
Message[]
Масив объектов сообщений с ролью и содержимым.
stream
boolean
Если true, возвращает поток событий, отправленных сервером. По умолчанию: ложь
temperature
number
Температура отбора проб 0–2. Выше = более случайно. По умолчанию: 1
max_tokens
integer
Максимальное количество токенов для генерации
max_completion_tokens
integer
Псевдоним для max_tokens (совместим с OpenAI серии o). Оба принимаются; то, что предусмотрено, вступает в силу
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Ограничить выбор жетонов до K. 0 = отключено (учитывать все). По умолчанию: 0
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-серии: «низкое», «среднее» или «высокое». Прошло как есть
transforms
string[]
Message преобразуется для применения, например ["середина"]. Пропустить автоматическое применение к моделям с контекстом ≤8 тыс.
models
string[]
Резервный список моделей — BazaarLink пробует каждую по порядку в случае сбоя основной
route
string
Дополнительное поле совместимости маршрутизации — большинству пользователей это не нужно. Используйте «модели» в качестве запасного варианта.
provider
object
Расширенные настройки маршрутизации — большинству пользователей это не нужно.
user, logprobs, top_logprobs, logit_bias и Parallel_tool_calls поддерживаются только моделями семейства OpenAI.
Эти пять параметров удаляются из восходящего запроса всякий раз, когда решенная модель не распознается как собственная модель OpenAI — отправка их в anthropic/claude-*, google/gemini-* или любую другую цель, отличную от OpenAI, возвращает 200 с параметром. молча игнорируется, это не ошибка. Если вы устанавливаете один из них, а эффект не отображается, проверьте, является ли целевая модель OpenAI.

Схема запроса (TypeScript)

// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use a provider-qualified catalog ID
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;            // Range: [0, 2]
  max_tokens?: number;             // Positive integer
  max_completion_tokens?: number;  // Alias mapped to max_tokens upstream
  n?: number;
  seed?: number;
  stop?: string | string[];

  // Sampling
  top_p?: number;
  top_k?: number;
  frequency_penalty?: number;      // Range: [-2, 2]
  presence_penalty?: number;       // Range: [-2, 2]
  repetition_penalty?: number;     // Range: (0, 2]
  min_p?: number;                  // Range: [0, 1]
  top_a?: number;                  // Range: [0, 1]

  // Token probabilities
  logit_bias?: Record<number, number>;
  logprobs?: boolean;
  top_logprobs?: number;

  // Stable end-user identifier for abuse prevention
  user?: string;

  // Tool calling
  tools?: Tool[];
  tool_choice?: ToolChoice;
  parallel_tool_calls?: boolean;

  // Structured output
  response_format?: ResponseFormat;
  structured_outputs?: boolean;

  // Plugin configuration — forwarded to upstreams that support plugins.
  plugins?: Plugin[];

  // Multimodal and image-generation options
  modalities?: Array<"text" | "image">;
  image_config?: Record<string, unknown>;
  input_audio?: InputAudio;

  // Provider-specific reasoning controls
  reasoning_effort?: "low" | "medium" | "high";
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

  // BazaarLink message transforms and fallback routing
  transforms?: Array<"middle-out">;
  models?: string[];             // Fallback list — this drives waterfall routing, not route
  route?: "fallback";            // Passthrough only; forwarded as-is, no local effect
  provider?: ProviderPreferences;
};

// Message types
type Message =
  | SystemMessage
  | UserMessage
  | AssistantMessage
  | ToolMessage;

type SystemMessage = {
  role: "system";
  content: string | ContentPart[];
  name?: string;
};

type UserMessage = {
  role: "user";
  content: string | ContentPart[];
  name?: string;
};

type AssistantMessage = {
  role: "assistant";
  content?: string | ContentPart[] | null;
  name?: string;
  tool_calls?: ToolCall[];
};

type ToolMessage = {
  role: "tool";
  content: string;
  tool_call_id: string;
  name?: string;
};

// Multimodal content parts
type ContentPart =
  | TextContentPart
  | ImageContentPart
  | FileContentPart
  | AudioContentPart
  | VideoContentPart;

type TextContentPart = {
  type: "text";
  text: string;
};

type ImageContentPart = {
  type: "image_url";
  image_url: {
    url: string;                    // Remote URL or base64 data URI
    detail?: string;
  };
};

type FileContentPart = {
  type: "file";
  file: {
    filename?: string;
    file_data: string;              // Base64 data URI
  };
};

type AudioContentPart = {
  type: "input_audio";
  input_audio: InputAudio;
};

type InputAudio = {
  data: string;                     // Raw base64 without a data URI prefix
  format: string;                   // For example "wav" or "mp3"
};

type VideoContentPart = {
  type: "video_url";
  video_url: {
    url: string;                    // Remote URL or base64 data URI
  };
};

// Tool calling subtypes
type FunctionDescription = {
  name: string;
  description?: string;
  parameters: object;               // JSON Schema object
};

type Tool = {
  type: "function";
  function: FunctionDescription;
};

type ToolChoice =
  | "none"
  | "auto"
  | "required"
  | {
      type: "function";
      function: {
        name: string;
      };
    };

type ToolCall = {
  id: string;
  type: "function";
  function: {
    name: string;
    arguments: string;
  };
};

// Structured output
type ResponseFormat =
  | {
      type: "json_object";
    }
  | {
      type: "json_schema";
      json_schema: {
        name: string;
        strict?: boolean;
        schema: object;
      };
    };

// Upstream plugin configuration
type Plugin = {
  id: string;
  enabled?: boolean;
  [key: string]: unknown;
};

// Reasoning controls vary by model family
type ReasoningConfig = {
  effort?: "low" | "medium" | "high";
  max_tokens?: number;
  exclude?: boolean;
};

type ThinkingConfig = {
  type?: "enabled" | "disabled";
  budget_tokens?: number;
};

// Provider routing preferences
type ProviderPreferences = {
  order?: string[];
  only?: string[];
  ignore?: string[];
  allow_fallbacks?: boolean;
  sort?:
    | "price"
    | "latency"
    | "throughput"
    | {
        by: string;
        partition?: string;
      };
  require_parameters?: boolean;
  data_collection?: "allow" | "deny";
  quantizations?: string[];
  max_price?: Record<string, number>;
};

Пример запроса

curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4.1",
    "messages": [
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "Explain quantum computing in one paragraph."}
    ],
    "temperature": 0.7,
    "max_tokens": 512
  }'

Ответ

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1740000000,
  "model": "openai/gpt-4.1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Quantum computing leverages quantum mechanics..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 28,
    "completion_tokens": 74,
    "total_tokens": 102,
    "cost": 0.0006480,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0
    }
  }
}

Схема ответа (TypeScript)

BazaarLink нормализует ровно два поля — модель и удаление поля поставщика — и пересылает остальную часть восходящего ответа как есть. Такие поля, как Native_finish_reason, system_fingerprint и Reasoning, присутствуют только тогда, когда их заполняет конкретный вышестоящий поставщик; не полагайтесь на их присутствие в каждой модели. Usage.cost является исключением: это всегда собственная сумма settled/billed settled/billed, а не значение, передаваемое из восходящего потока.

type Response = {
  id: string;
  object: "chat.completion" | "chat.completion.chunk";
  created: number;                 // Unix timestamp
  model: string;
  choices: (NonStreamingChoice | StreamingChoice)[];
  usage?: ResponseUsage;
  cost?: number;                   // Total cost in USD
};

type NonStreamingChoice = {
  index: number;
  finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | null;
  native_finish_reason: string | null;  // Provider's original finish reason
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  native_finish_reason: string | null;  // Provider's original finish reason
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
  };
};

type ResponseUsage = {
  prompt_tokens: number;
  completion_tokens: number;
  total_tokens: number;
  cost: number;                      // Total cost for this request in USD
  prompt_tokens_details?: {
    cached_tokens: number;           // Tokens served from prompt cache (reduced cost)
    cache_write_tokens?: number;     // Tokens written to cache in this request
    audio_tokens?: number;
  };
  completion_tokens_details?: {
    reasoning_tokens?: number;       // Thinking/reasoning tokens (e.g. o3, Qwen3, DeepSeek R1)
    image_tokens?: number;
  };
};

type ToolCall = {
  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-edit); Модели чистого поколения — это текст->изображение — проверьте модальность каждой модели в GET/v1/models.

Response format

/api/v1/images/generations возвращает OpenAI-совместимую синхронизацию JSON по умолчанию (с 25 июля 2026 г.) — client.images.generate() работает без оболочки. Passstream: значение true, чтобы вместо этого выбрать поток событий SSE, который обеспечивает прогресс для моделей с длительным временем генерации.

A. /v1/chat/completions (родной, рекомендуется)

POST/api/v1/chat/completions

The canonical streaming path. Recommended for any new integration.

curl -N https://bazaarlink.ai/api/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 — нижний уровень остается ближе к исходному изображению), передаваемый в восходящий поток как есть.

curl -N https://bazaarlink.ai/api/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/api/v1/images/edits

The OpenAI SDK client.images.edit() работает напрямую (многочастная загрузка, синхронизация ответа JSON, возвращающего данные: [{ url }]). Те же ограничения, что и при передаче изображения в изображение: до 8 изображений по 10 МБ каждое; маска и response_format=b64_json пока не поддерживаются.

curl https://bazaarlink.ai/api/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/api/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.

curl https://bazaarlink.ai/api/v1/images/generations \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-image-2",
    "prompt": "a red cat on a sofa",
    "size": "1024x1024"
  }'
modelобязательно
string
Идентификатор модели, например. google/gemini-2.5-flash-image
promptобязательно
string
Текстовая подсказка
size
string
Размер вывода (сопоставляется автоматически)
n
integer
Количество изображений (по умолчанию 1)
# Streaming variant — progressive delivery for long generations
curl -N https://bazaarlink.ai/api/v1/images/generations \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Accept: text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"model":"openai/gpt-5.4-image-2","prompt":"a red cat on a sofa","stream":true}'

SSE event protocol

Both endpoints emit the same event types:

event: heartbeat        # every 60 s, keeps Cloudflare happy
data: {}

event: image            # upstream URL, fastest path
data: {"index": 0, "url": "https://upstream/a.png"}

event: image-cached     # bazaarlink Redis-backed proxy URL (1 hr TTL)
data: {"index": 0, "url": "https://bazaarlink.ai/api/v1/images/proxy/<token>"}

event: usage            # final cost / token count
data: {"promptTokens": 12, "completionTokens": 7080, "cost": 0.226, "durationMs": 163400, "imageCount": 1}

event: done
data: {}

Поддерживаемые модели изображений

Model IDModalityi2i (edits)

Создание видео

Асинхронный трехэтапный поток (отправка → опрос → контент). Генерация видео занимает от 30 с до 5 минут, что не соответствует синхронной форме завершения чата request/response — поэтому BazaarLink предоставляет его как выделенную конечную точку /api/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
Отредактируйте существующее видео — измените сцену, стиль или движение. Оплата производится за секунды ввода видео + секунды вывода.

1. Отправьте задание (немедленно возвращает vjob_xxx)

POST/api/v1/videos
modelобязательно
string
Идентификатор модели, например. alibaba/wan2.7-t2v
promptобязательно
string
Текстовая подсказка
duration
integer
Продолжительность в секундах (зависит от модели)
resolution
string
Разрешение — 480p/720p/1080p и т. д.
generate_audio
boolean
Создать звуковую дорожку (true/false)
frame_images
array
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}.
curl https://bazaarlink.ai/api/v1/videos \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "alibaba/wan2.7-t2v",
    "prompt": "a bird flying over mountains",
    "duration": 3,
    "resolution": "720p",
    "generate_audio": false
  }'
# → 202 { "id": "vjob_xxx", "status": "pending" }
Note
Отправьте резервы в худшем случае × продолжительность × множитель; по завершении реальный восходящий поток `usage.cost` устанавливает дельту.

2. Статус опроса

GET/api/v1/videos/{id}
curl -H "Authorization: Bearer $BL_API_KEY" \
  https://bazaarlink.ai/api/v1/videos/vjob_xxx
Note
Каждый GET должен находиться на расстоянии ≥ 8 с, чтобы фактически попасть в восходящий поток (что позволяет избежать ограничений скорости).
Note
При статусе=failed пользователю возвращается полная сумма резерва.

3. Загрузите видеоконтент (MP4)

GET/api/v1/videos/{id}/content
curl -H "Authorization: Bearer $BL_API_KEY" \
  -o output.mp4 \
  https://bazaarlink.ai/api/v1/videos/vjob_xxx/content

Полезно знать

  • Разрешенные разрешения различаются в зависимости от модели: неподдерживаемое значение возвращает 400 со списком поддерживаемых.
  • Вход images/videos должен быть доступен из общедоступного URL. Хосты, защищенные хотлинками (например, некоторые вики), выходят из строя.
  • Входящие медиафайлы проходят модерацию исходного контента и иногда могут быть отклонены.
  • Для продолжения запрошенная продолжительность должна превышать длину исходного видео.
  • Соотношение сторон вывода соответствует входному изображению: квадратное изображение дает квадратное видео.
  • Видеомонтаж оплачивается по секундам входного видео плюс секунды сгенерированного выходного видео.
  • input_video (редактирование/продолжение) должен быть PUBLIC URL. Видео, которые вы создаете здесь, обслуживаются с помощью вашего ключа API, поэтому восходящий поток не может их получить — разместите исходное видео на общедоступном URL.
  • Полезные данные вебхука не имеют знака — проверьте status/amount через GET /videos/{id}, прежде чем действовать, и обратите внимание, что unsigned_urls являются абсолютными (в отличие от относительных путей в ответе на опрос).

Поддерживаемые видеомодели

Model IDModalityTasks
bytedance/seedance-2.0text+image+audio+video->videot2v, i2v
bytedance/seedance-2.0-fasttext+image+audio+video->videot2v, i2v
google/veo-3.1text+image->videot2v, i2v
openai/sora-2-protext+image->videot2v, i2v
bytedance/seedance-1-5-protext+image->videot2v, i2v
alibaba/happyhorse-1.0text->videot2v
alibaba/wan2.6-r2v-flashtext+image+video->videor2v
alibaba/wan2.5-i2v-previewtext+image->videoi2v
alibaba/happyhorse-1.1text->videot2v
alibaba/wan2.7-t2vtext->videot2v
alibaba/wan2.7-i2vtext+image+video->videoi2v, kf2v, continuation
alibaba/wan2.6-t2vtext->videot2v
alibaba/wan2.5-t2v-previewtext->videot2v
alibaba/wan2.2-t2v-plustext->videot2v
alibaba/wan2.7-r2vtext+image+video->videor2v
alibaba/wan2.1-t2v-plustext->videot2v
alibaba/wan2.1-t2v-turbotext->videot2v
alibaba/wan2.6-i2v-flashtext+image->videoi2v
alibaba/wan2.2-i2v-flashtext+image->videoi2v
alibaba/wan2.7-videoedittext+image+video->videovideoedit
alibaba/wan2.6-i2vtext+image->videoi2v
alibaba/wan2.2-i2v-plustext+image->videoi2v
alibaba/wan2.6-r2vtext+image+video->videor2v

Видеовходы

Отправляйте видеофайлы на модели, поддерживающие видеовход, для анализа, создания субтитров или вопросов о сценах и событиях. Работает с прямыми данными URL или базовыми данными URI — URL более эффективен для общедоступного видео; base64 предназначен для локальных файлов или частного видео.

Поддерживаемые форматы

MP4 (H.264)MPEGMOVВебМ
response = client.chat.completions.create(
    model="google/gemini-2.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?"},
        ],
    }],
)

Полная ссылка на API →

PDF Входы

Отправляйте документы PDF непосредственно в сообщениях для моделей, которые изначально поддерживают ввод PDF (например, Claude, Gemini). BazaarLink перенаправляет файл прямо в модель — тарифицируется как обычные входные токены, без дополнительной оплаты или этапа обработки.

Поддерживаемые форматы

  • PDF документы (текст, изображения, таблицы, сканированные) Данные в кодировке
  • Base64 URL (`data:application/pdf;base64,...`)
  • Многостраничные документы
  • Только PDF-файлы без пароля
import base64

with open("document.pdf", "rb") as f:
    pdf_data = base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "file",
                "file": {
                    "filename": "document.pdf",
                    "file_data": f"data:application/pdf;base64,{pdf_data}",
                },
            },
            {"type": "text", "text": "Summarize this document."},
        ],
    }],
)

Responses API

An OpenAI Ответы Конечная точка, совместимая с API, для многоповоротных диалогов без сохранения состояния, вызова инструментов и мультимодальных входных данных. Идеально подходит для агентов и платформ, которые используют OpenAI Python SDK ≥ 1.x с client.responses.create().

POST/api/v1/responses
Note
Принимает ту же аутентификацию и модель маршрутизации, что и Chat Completions.

Тело запроса

modelобязательно
string
Идентификатор модели, например. «openai/gpt-4o» или «anthropic/claude-3.5-sonnet»
inputобязательно
string | Item[]
User input — простая строка (одиночное сообщение) или массив элементов ввода для многооборотных/мультимодальных разговоров.
instructions
string
Инструкции системного уровня, эквивалентные системному сообщению. Необходимо отправлять повторно при каждом запросе.
stream
boolean
Если true, возвращает события потока ответов API SSE. Типы событий: ответ.создан, ответ.выходной_текст.дельта, ответ.завершено.
max_output_tokens
integer
Максимальное количество создаваемых выходных токенов (включая логические токены для моделей серии O). Определения
temperature
number
Температура отбора проб 0–2. Выше = более случайно. По умолчанию: 1
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. См. раздел «Структурированный вывод».
models
string[]
Резервный список моделей — BazaarLink пробует каждую по порядку в случае сбоя основной
transforms
string[]
Message преобразуется для применения, например ["середина"]. Пропустить автоматическое применение к моделям с контекстом ≤8 тыс.
previous_response_id
string
Эта конечная точка не имеет состояния — при передаче ненулевого значения немедленно возвращается 400 (invalid_prompt), оно никогда не принимается и игнорируется. Вместо этого используйте режим без сохранения состояния: передайте полную историю разговоров во входной массив.
provider
object
Расширенные настройки маршрутизации — большинству пользователей это не нужно.

Схема запроса (TypeScript)

type ResponsesRequest = {
  model: string;                    // "provider/model-name"
  input: string | InputItem[];      // string or multi-turn array

  // Optional
  instructions?: string;            // System-level message
  stream?: boolean;                 // Default: false
  max_output_tokens?: number;
  temperature?: number;             // Range: [0, 2], default: 0.7
  top_p?: number;
  tools?: Tool[];
  tool_choice?: "auto" | "none" | "required" | object;
  parallel_tool_calls?: boolean;    // Default: true
  previous_response_id?: string;    // Not supported — use full input array
  provider?: ProviderPreferences;   // Same as Chat Completions
};

type InputItem =
  | { type?: "message"; role: "user" | "assistant" | "system" | "developer"; content: string | ContentBlock[] }
  | { type: "function_call_output"; call_id: string; output: string }   // tool result
  | { type: "function_call"; call_id: string; name: string; arguments: string };

type ContentBlock =
  | { type: "input_text"; text: string }
  | { type: "input_image"; image_url: string; detail?: "auto" | "low" | "high" };

Пример запроса

curl https://bazaarlink.ai/api/v1/responses \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "instructions": "You are a helpful assistant.",
    "input": "What is the capital of Taiwan?"
  }'

Формат ответа

// Non-streaming response object
type ResponsesResponse = {
  id: string;             // "resp_..."
  object: "response";
  created_at: number;
  completed_at: number;
  status: "completed" | "failed" | "incomplete";
  model: string;
  output: OutputItem[];
  usage: {
    input_tokens: number;   // equivalent to prompt_tokens
    output_tokens: number;  // equivalent to completion_tokens
    total_tokens: number;
    cost?: number;          // actual cost in credits
  } | null;
  error: null | { code: string; message: string };
};

type OutputItem =
  | {
      type: "message";
      id: string;
      role: "assistant";
      status: "completed";
      content: Array<{ type: "output_text"; text: string; annotations: [] }>;
    }
  | { type: "function_call"; id: string; call_id: string; name: string; arguments: string; status: "completed" };

Миграция с Chat Completions

Замените сообщения входными данными (строкой или массивом), используйте инструкции вместо сообщения системной роли и прочитайте выходные данные[0].content[0].text вместо choice[0].message.content.

# Chat Completions (before)
response = client.chat.completions.create(
    model="openai/gpt-4o-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-4o-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-совместимые сообщения API для Claude SDK. Используйте точно так же, как и с API из Anthropic — просто измените базу URL и заголовок аутентификации.

POST/api/v1/messages
Note
Принимает токен носителя или заголовок x-api-key (совместимость с Anthropic SDK). Максимальный размер тела: 10 МБ.

Тело запроса

modelобязательно
string
Идентификатор модели, например. «openai/gpt-4o» или «anthropic/claude-3.5-sonnet»
max_tokensобязательно
integer
Максимальное количество токенов для генерации (положительное целое число).
messagesобязательно
Message[]
Масив сообщений диалога (непустой).
system
string
Дополнительная системная подсказка.
stream
boolean
Если true, возвращает поток событий, отправленных сервером. По умолчанию: ложь
temperature
number
Температура отбора проб 0–2. Выше = более случайно. По умолчанию: 1
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Ограничить выбор жетонов до K. 0 = отключено (учитывать все). По умолчанию: 0
stop_sequences
string[]
Пользовательские строки последовательности остановки.
tools
Tool[]
Список инструментов (функций), которые может вызывать модель
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.

Пример запроса

from anthropic import Anthropic

client = Anthropic(
    base_url="https://bazaarlink.ai/api/v1",
    api_key="sk-bl-YOUR_KEY"
)

response = client.messages.create(
    model="anthropic/claude-opus-4",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}]
)
print(response.content[0].text)

Ответ

{
  "id": "msg_...",
  "type": "message",
  "role": "assistant",
  "model": "anthropic/claude-opus-4",
  "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,
    "bz_cost": 0.00042
  }
}

Ошибки: 400 (проверка), 402 (недостаточно кредитов), 429 (ограничение скорости), 502 (ошибка восходящего потока/отсутствует ключ), 503 (перезапуск сервера).

Модели

Перечислите все доступные модели с информацией о ценах и возможностях. Для этой конечной точки аутентификация не требуется.

GET/api/v1/models
# Text models (default)
curl https://bazaarlink.ai/api/v1/models

# Complete catalog
curl "https://bazaarlink.ai/api/v1/models?output_modalities=all"

Ответ

{
  "data": [
    {
      "id": "openai/gpt-4.1",
      "name": "GPT 4.1",
      "context_length": 1047576,
      "modality": "text+image+file->text",
      "pricing": {
        "prompt": "2.00",
        "completion": "8.00"
      }
    }
  ]
}
// /v1/models — Response Schema
type ModelsResponse = {
  data: Model[];
};

type Model = {
  id: string;                    // Model ID (e.g. "openai/gpt-4.1")
  name: string;                  // Human-readable name
  context_length: number | null; // Max context window in tokens
  modality: 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)
  };
  description?: string | null;   // Model description
  top_provider?: {
    max_completion_tokens?: number;
  };
  supported_parameters?: string[]; // e.g. ["tools", "response_format", "reasoning"]
  pricing_tiers?: {               // Present only for models with input-length tiers
    above_prompt_tokens: number;  // Ascending; strict "greater than" threshold
    prompt: string;                // USD per token, override tier
    completion: string;            // USD per token, override tier
  }[];
};

Многоуровневое ценообразование на входную длину

Некоторые модели переключаются на другую таблицу цен, когда запрос превышает порог токена — меняется вся таблица, а не только токены выше порога. Пороговые значения строгие: приглашение с ровно N жетонами по-прежнему выставляет счета на уровне ниже N; более высокий уровень применяется только тогда, когда входные токены больше N.

pricing_tiers — это аналог ценообразования, который присутствует только в том случае, если у модели есть переопределенные уровни, превышающие базовую цену. Записи сортируются по возрастанию числа выше_промпт_токенов; prompt/completion — это USD на токен (та же единица измерения, что и pricing.prompt/pricing.completion). «pricing.prompt» и «pricing.completion» всегда остаются базовым (самым низким) уровнем.

Большинство моделей не имеют уровней — для них ключ Price_tiers просто отсутствует в ответе.

{
  "id": "openai/gpt-4.1",
  "name": "GPT 4.1",
  "pricing": {
    "prompt": "2.00",
    "completion": "8.00"
  },
  "pricing_tiers": [
    {
      "above_prompt_tokens": 128000,
      "prompt": "4.00",
      "completion": "16.00"
    }
  ]
}

Доступные модели (257)

Это модели, доступные в настоящее время на BazaarLink, динамически загружаемые из нашей базы данных:

OpenAI
openai/gpt-5.3-codex400K ctx · $1.75/$14.00text+image+file->text
openai/gpt-3.5-turbo-instruct4K ctx · $1.50/$2.00text->text
openai/gpt-5.4-nano400K ctx · $0.20/$1.25text+image+file->text
openai/gpt-5-codex400K ctx · $1.25/$10.00text+image->text
openai/text-embedding-ada-0028K ctx · $0.10/$0.00text->embeddings
openai/gpt-5.2-codex400K ctx · $1.75/$14.00text+image->text
openai/gpt-4-turbo-preview128K ctx · $10.00/$30.00text->text
openai/o4-mini200K ctx · $1.10/$4.40text+image+file->text
openai/o1-pro200K ctx · $150.00/$600.00text+image+file->text
openai/gpt-5.4-mini400K ctx · $0.75/$4.50text+image+file->text
openai/gpt-5.1400K ctx · $1.25/$10.00text+image+file->text
openai/o3-pro200K ctx · $20.00/$80.00text+image+file->text
openai/gpt-5.6-luna-pro1050K ctx · $1.00/$6.00text+image+file->text
openai/gpt-48K ctx · $30.00/$60.00text->text
openai/gpt-5.6-sol1050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-4o-mini-2024-07-18128K ctx · $0.15/$0.60text+image+file->text
openai/gpt-5-mini400K ctx · $0.25/$2.00text+image+file->text
openai/gpt-5.6-luna1050K ctx · $1.00/$6.00text+image+file->text
openai/gpt-4o-2024-08-06128K ctx · $2.50/$10.00text+image+file->text
openai/o3-deep-research200K ctx · $10.00/$40.00text+image+file->text
openai/gpt-5.2-chat128K ctx · $1.75/$14.00text+image+file->text
openai/gpt-5.2400K ctx · $1.75/$14.00text+image+file->text
openai/gpt-5.1-chat128K ctx · $1.25/$10.00text+image+file->text
openai/o4-mini-deep-research200K ctx · $2.00/$8.00text+image+file->text
openai/text-embedding-3-small8K ctx · $0.02/$0.00text->embeddings
openai/gpt-4.1-nano1048K ctx · $0.10/$0.40text+image+file->text
openai/o3200K ctx · $2.00/$8.00text+image+file->text
openai/gpt-3.5-turbo16K ctx · $0.50/$1.50text->text
openai/gpt-5.51050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-3.5-turbo-06134K ctx · $1.00/$2.00text->text
openai/gpt-4.11048K ctx · $2.00/$8.00text+image+file->text
openai/gpt-5-pro400K ctx · $15.00/$120.00text+image+file->text
openai/gpt-4.1-mini1048K ctx · $0.40/$1.60text+image+file->text
openai/gpt-oss-20b131K ctx · $0.03/$0.13text->text
openai/gpt-5.2-pro400K ctx · $21.00/$168.00text+image+file->text
openai/o4-mini-high200K ctx · $1.10/$4.40text+image+file->text
openai/gpt-3.5-turbo-16k16K ctx · $3.00/$4.00text->text
openai/gpt-4o-mini128K ctx · $0.15/$0.60text+image+file->text
openai/gpt-5.3-chat128K ctx · $1.75/$14.00text+image+file->text
openai/gpt-4o-2024-05-13128K ctx · $5.00/$15.00text+image+file->text
openai/gpt-oss-120b131K ctx · $0.15/$0.60text->text
openai/o3-mini200K ctx · $1.10/$4.40text+file->text
openai/gpt-4-turbo128K ctx · $10.00/$30.00text+image->text
openai/gpt-5.4-pro1050K ctx · $30.00/$180.00text+image+file->text
openai/text-embedding-3-large8K ctx · $0.13/$0.00text->embeddings
openai/gpt-5.41050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5.1-codex-max400K ctx · $1.25/$10.00text+image->text
openai/gpt-5-nano400K ctx · $0.05/$0.40text+image+file->text
openai/o1200K ctx · $15.00/$60.00text+image+file->text
openai/gpt-5.1-codex-mini400K ctx · $0.25/$2.00text+image->text
openai/gpt-5.6-terra-pro1050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5.6-terra1050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5400K ctx · $1.25/$10.00text+image+file->text
openai/gpt-5.6-sol-pro1050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-5.1-codex400K ctx · $1.25/$10.00text+image->text
openai/o3-mini-high200K ctx · $1.10/$4.40text+file->text
openai/gpt-4o-2024-11-20128K ctx · $2.50/$10.00text+image+file->text
openai/sora-2-pro · $0.00/$0.00text+image->video
openai/gpt-4o128K ctx · $2.50/$10.00text+image+file->text
openai/gpt-oss-safeguard-20b131K ctx · $0.07/$0.30text->text
openai/gpt-5.4-image-2272K ctx · $8.00/$15.00text+image+file->text+image
openai/gpt-image-1400K ctx · $10.00/$10.00text+image->image
openai/gpt-image-2400K ctx · $8.00/$8.00text+image->image
openai/gpt-image-1-mini400K ctx · $2.50/$2.50text+image->image
Qwen
qwen/qwen3.7-plus1000K ctx · $0.32/$1.28text+image->text
qwen/qwen3.7-max1000K ctx · $1.48/$4.42text->text
qwen/qwen3.5-plus-02-151000K ctx · $0.26/$1.56text+image+video->text
qwen/qwen3-coder-flash1000K ctx · $0.20/$0.97text->text
qwen/qwen-2.5-coder-32b-instruct33K ctx · $0.66/$1.00text->text
qwen/qwen-plus1000K ctx · $0.26/$0.78text->text
qwen/qwen3.6-35b-a3b262K ctx · $0.14/$1.00text+image+video->text
qwen/qwen3-coder262K ctx · $0.30/$1.00text->text
qwen/qwen-plus-2025-07-281000K ctx · $0.26/$0.78text->text
qwen/qwen3-235b-a22b-2507262K ctx · $0.09/$0.55text->text
qwen/qwen3.5-plus-202604201000K ctx · $0.30/$1.80text+image+video->text
qwen/qwen3-embedding-4b33K ctx · $0.02/$0.00text->embeddings
qwen/qwen3-coder-30b-a3b-instruct262K ctx · $0.07/$0.27text->text
qwen/qwen-2.5-7b-instruct33K ctx · $0.04/$0.10text->text
qwen/qwen3-coder-plus1000K ctx · $0.65/$3.25text->text
qwen/qwen3-next-80b-a3b-instruct262K ctx · $0.10/$1.10text->text
qwen/qwen-2.5-72b-instruct33K ctx · $0.36/$0.40text->text
qwen/qwen-plus-2025-07-28:thinking1000K ctx · $0.40/$1.20text->text
qwen/qwen3-vl-235b-a22b-thinking131K ctx · $0.40/$4.00text+image->text
qwen/qwen3-vl-8b-thinking131K ctx · $0.18/$2.10text+image->text
qwen/qwen3-30b-a3b-instruct-2507262K ctx · $0.05/$0.19text->text
qwen/qwen3.5-flash-02-231000K ctx · $0.07/$0.26text+image+video->text
qwen/qwen3-vl-235b-a22b-instruct262K ctx · $0.21/$1.90text+image->text
qwen/qwen3.5-27b262K ctx · $0.20/$1.56text+image+video->text
qwen/qwen3-235b-a22b131K ctx · $0.46/$1.82text->text
qwen/qwen3.5-9b262K ctx · $0.10/$0.15text+image+video->text
qwen/qwen3-32b131K ctx · $0.08/$0.28text->text
qwen/qwen3-30b-a3b131K ctx · $0.13/$0.52text->text
qwen/qwen3-8b131K ctx · $0.12/$0.46text->text
qwen/qwen3-max-thinking262K ctx · $0.78/$3.90text->text
qwen/qwen3-vl-8b-instruct262K ctx · $0.12/$0.46text+image->text
qwen/qwen3.5-122b-a10b262K ctx · $0.26/$2.08text+image+video->text
qwen/qwen3-next-80b-a3b-thinking262K ctx · $0.15/$1.20text->text
qwen/qwen3-vl-30b-a3b-thinking262K ctx · $0.20/$2.40text+image->text
qwen/qwen2.5-vl-72b-instruct128K ctx · $0.80/$1.00text+image->text
qwen/qwen3-235b-a22b-thinking-2507262K ctx · $0.30/$3.00text->text
qwen/qwen3.5-35b-a3b262K ctx · $0.14/$1.00text+image+video->text
qwen/qwen3-coder-next262K ctx · $0.12/$0.80text->text
qwen/qwen3-max262K ctx · $0.78/$3.90text->text
qwen/qwen3-30b-a3b-thinking-250782K ctx · $0.20/$2.40text->text
qwen/qwen3-vl-30b-a3b-instruct262K ctx · $0.13/$0.52text+image->text
qwen/qwen3-vl-32b-instruct131K ctx · $0.10/$0.42text+image->text
qwen/qwen3-14b131K ctx · $0.23/$0.91text->text
qwen/qwen3.5-397b-a17b262K ctx · $0.39/$2.34text+image+video->text
qwen/qwen3.6-27b262K ctx · $0.29/$2.40text+image+video->text
qwen/qwen3.6-plus1000K ctx · $0.33/$1.95text+image+video->text
qwen/qwen3-embedding-8b33K ctx · $0.01/$0.00text->embeddings
qwen/qwen-image-maxtext->image
qwen/qwen-image-plustext->image
qwen/qwen-image-edittext+image->image
qwen/qwen-image-2.0-protext->image
qwen/qwen-image-edit-plustext+image->image
qwen/qwen-image-2.0text->image
qwen/qwen-imagetext->image
qwen/qwen-image-edit-maxtext+image->image
Alibaba
alibaba/wan2.7-image-protext->image
alibaba/happyhorse-1.0 · $0.00/$0.00text->video
alibaba/wan2.6-r2v-flash · $0.00/$0.00text+image+video->video
alibaba/wan2.2-t2i-flashtext->image
alibaba/wan2.1-t2i-plustext->image
alibaba/wan2.1-t2i-turbotext->image
alibaba/z-image-turbotext->image
alibaba/wan2.2-t2i-plustext->image
alibaba/wan2.6-imagetext->image
alibaba/wan2.5-i2v-preview · $0.00/$0.00text+image->video
alibaba/happyhorse-1.1 · $0.00/$0.00text->video
alibaba/wan2.7-t2v · $0.00/$0.00text->video
alibaba/wan2.7-i2v · $0.00/$0.00text+image+video->video
alibaba/wan2.6-t2v · $0.00/$0.00text->video
alibaba/wan2.5-t2v-preview · $0.00/$0.00text->video
alibaba/wan2.2-t2v-plus · $0.00/$0.00text->video
alibaba/wan2.7-r2v · $0.00/$0.00text+image+video->video
alibaba/wan2.1-t2v-plus · $0.00/$0.00text->video
alibaba/wan2.1-t2v-turbo · $0.00/$0.00text->video
alibaba/wan2.6-i2v-flash · $0.00/$0.00text+image->video
alibaba/wan2.2-i2v-flash · $0.00/$0.00text+image->video
alibaba/wan2.5-t2i-previewtext->image
alibaba/wan2.7-videoedit · $0.00/$0.00text+image+video->video
alibaba/wan2.6-i2v · $0.00/$0.00text+image->video
alibaba/wan2.5-i2i-previewtext+image->image
alibaba/wan2.2-i2v-plus · $0.00/$0.00text+image->video
alibaba/wan2.6-r2v · $0.00/$0.00text+image+video->video
alibaba/wan2.6-t2itext->image
alibaba/wan2.7-imagetext->image
Google
google/gemini-3.1-pro-preview1049K ctx · $2.00/$12.00text+image+file+audio+video->text
google/gemini-3.1-flash-lite-preview1049K ctx · $0.25/$1.50text+image+file+audio+video->text
google/gemini-2.5-flash-lite1049K ctx · $0.10/$0.40text+image+file+audio+video->text
google/gemma-3-4b-it131K ctx · $0.05/$0.10text+image->text
google/gemini-embedding-2-preview8K ctx · $0.20/$0.00text+image+file+audio+video->embeddings
google/gemini-2.5-flash-image33K ctx · $0.30/$2.50text+image->text+image
google/gemini-3.5-flash1049K ctx · $1.50/$9.00text+image+file+audio+video->text
google/gemini-2.5-pro-preview1049K ctx · $1.25/$10.00text+image+file+audio->text
google/gemma-3n-e4b-it33K ctx · $0.06/$0.12text->text
google/gemini-3.1-flash-image131K ctx · $0.50/$3.00text+image->text+image
google/gemini-2.5-flash1049K ctx · $0.30/$2.50text+image+file+audio+video->text
google/gemini-3-flash-preview1049K ctx · $0.50/$3.00text+image+file+audio+video->text
google/gemma-3-12b-it131K ctx · $0.05/$0.15text+image->text
google/gemma-2-27b-it8K ctx · $0.65/$0.65text->text
google/gemini-2.5-pro1049K ctx · $1.25/$10.00text+image+file+audio+video->text
google/gemma-4-31b-it262K ctx · $0.14/$0.40text+image+video->text
google/gemini-embedding-00120K ctx · $0.15/$0.00text->embeddings
google/gemini-2.5-pro-preview-05-061049K ctx · $1.25/$10.00text+image+file+audio+video->text
google/gemini-3.5-flash-lite1049K ctx · $0.30/$2.50text+image+file+audio+video->text
google/gemma-3-27b-it262K ctx · $0.08/$0.45text+image->text
google/veo-3.1 · $0.00/$0.00text+image->video
google/gemini-3-pro-image131K ctx · $2.00/$12.00text+image->text+image
google/gemini-3.1-pro-preview-customtools1049K ctx · $2.00/$12.00text+image+file+audio+video->text
google/gemma-4-26b-a4b-it262K ctx · $0.07/$0.34text+image+video->text
google/gemini-3.6-flash1049K ctx · $1.50/$7.50text+image+file+audio+video->text
google/gemini-3.1-flash-image-preview66K ctx · $0.50/$3.00text+image->text+image
Anthropic
anthropic/claude-opus-4.61000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-sonnet-4.61000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-sonnet-41000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-sonnet-51000K ctx · $2.00/$10.00text+image+file->text
anthropic/claude-haiku-4.5200K ctx · $1.00/$5.00text+image+file->text
anthropic/claude-sonnet-4.51000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-opus-4.71000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-fable-51000K ctx · $10.00/$50.00text+image+file->text
anthropic/claude-opus-4.81000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-3-haiku200K ctx · $0.25/$1.25text+image->text
anthropic/claude-opus-4.5200K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-4200K ctx · $15.00/$75.00text+image+file->text
anthropic/claude-opus-4.1200K ctx · $15.00/$75.00text+image+file->text
anthropic/claude-opus-51000K ctx · $5.00/$25.00text+image+file->text
Zhipu AI
z-ai/glm-4.7205K ctx · $0.40/$1.75text->text
z-ai/glm-5205K ctx · $1.00/$3.20text->text
z-ai/glm-5.1205K ctx · $1.40/$4.40text->text
z-ai/glm-5.21049K ctx · $1.40/$4.40text->text
z-ai/glm-5v-turbo203K ctx · $1.20/$4.00text+image+video->text
z-ai/glm-5-turbo203K ctx · $1.20/$4.00text->text
z-ai/glm-4.6v131K ctx · $0.30/$0.90text+image+video->text
z-ai/glm-4.6205K ctx · $0.50/$2.00text->text
z-ai/glm-4.7-flash203K ctx · $0.06/$0.40text->text
z-ai/glm-4.5-air131K ctx · $0.13/$0.85text->text
z-ai/glm-4.5131K ctx · $0.60/$2.20text->text
z-ai/glm-4.5v66K ctx · $0.60/$1.80text+image->text
DeepSeek
deepseek/deepseek-v3.2164K ctx · $0.28/$0.42text->text
deepseek/deepseek-v4-pro1049K ctx · $2.40/$4.80text->text
deepseek/deepseek-v4-flash1049K ctx · $0.20/$0.40text->text
deepseek/deepseek-v3.2-exp164K ctx · $0.27/$0.41text->text
deepseek/deepseek-r1164K ctx · $0.70/$2.50text->text
deepseek/deepseek-v3.1-terminus164K ctx · $0.27/$1.00text->text
deepseek/deepseek-chat-v3-0324164K ctx · $0.27/$1.12text->text
deepseek/deepseek-r1-0528164K ctx · $0.50/$2.15text->text
deepseek/deepseek-r1-distill-llama-70b8K ctx · $0.80/$0.80text->text
deepseek/deepseek-chat-v3.1164K ctx · $0.25/$0.95text->text
deepseek/deepseek-chat164K ctx · $0.40/$1.30text->text
Moonshot AI
moonshotai/kimi-k31049K ctx · $3.00/$15.00text+image->text
moonshotai/kimi-k2.7-code-highspeed · $1.90/$8.00
moonshotai/kimi-k2.7-code262K ctx · $0.95/$4.00text+image->text
moonshotai/kimi-k2.5262K ctx · $0.60/$3.00text+image->text
moonshotai/kimi-k2.6262K ctx · $0.86/$3.57text+image->text
moonshotai/kimi-k2131K ctx · $0.57/$2.30text->text
moonshotai/kimi-k2-0905262K ctx · $0.60/$2.50text->text
moonshotai/kimi-k2-thinking262K ctx · $0.60/$2.50text->text
xAI
x-ai/grok-4.202000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.20-multi-agent2000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.31000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.5500K ctx · $2.00/$6.00text+image+file->text
x-ai/grok-build-0.1256K ctx · $1.00/$2.00text+image+file->text
Perplexity
perplexity/sonar-pro200K ctx · $3.00/$15.00text+image->text
perplexity/sonar-reasoning-pro128K ctx · $2.00/$8.00text+image->text
perplexity/sonar127K ctx · $1.00/$1.00text+image->text
perplexity/sonar-deep-research128K ctx · $2.00/$8.00text->text
perplexity/sonar-pro-search200K ctx · $3.00/$15.00text+image->text
MiniMax
minimax/minimax-m2.7205K ctx · $0.30/$1.20text->text
minimax/minimax-m2.5205K ctx · $0.30/$1.20text->text
minimax/minimax-m31049K ctx · $0.30/$1.20text+image+video->text
minimax/minimax-m2.1205K ctx · $0.30/$1.20text->text
Tencent
tencent/kinfra-text-embedding-4b · $0.08/$0.00
tencent/hy3 · $0.13/$0.53
tencent/hy-mt2-plus · $0.10/$0.40
tencent/kinfra-text-embedding-0.6b · $0.07/$0.00
bytedance-seed
bytedance-seed/seed-2.0-mini262K ctx · $0.10/$0.40text+image+video->text
bytedance-seed/seed-1.6-flash262K ctx · $0.07/$0.30text+image+video->text
bytedance-seed/seed-1.6262K ctx · $0.25/$2.00text+image+video->text
bytedance-seed/seed-2.0-lite262K ctx · $0.25/$2.00text+image+video->text
Nous
nousresearch/hermes-3-llama-3.1-70b131K ctx · $0.70/$0.70text->text
nousresearch/hermes-3-llama-3.1-405b131K ctx · $1.00/$1.00text->text
nousresearch/hermes-4-70b131K ctx · $0.13/$0.40text->text
nousresearch/hermes-4-405b131K ctx · $1.00/$3.00text->text
ByteDance
bytedance/seedance-2.0 · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-2.0-fast · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-1-5-pro · $0.00/$0.00text+image->video
Mistral
mistralai/mistral-large128K ctx · $2.00/$6.00text+file->text
mistralai/mixtral-8x22b-instruct66K ctx · $2.00/$6.00text+file->text
NVIDIA
nvidia/nemotron-3-super-120b-a12b1000K ctx · $0.30/$0.90text->text
nvidia/nemotron-3-nano-30b-a3b262K ctx · $0.05/$0.20text->text
xiaomi
xiaomi/mimo-v2.51050K ctx · $0.14/$0.28text+image+audio+video->text
xiaomi/mimo-v2.5-pro1050K ctx · $0.43/$0.87text->text
ibm-granite
ibm-granite/granite-4.0-h-micro131K ctx · $0.02/$0.11text->text
Meta
meta-llama/llama-3.2-1b-instruct60K ctx · $0.03/$0.20text->text
Tongyi-MAI
Tongyi-MAI/Z-Image-Turbotext->image

Посмотрите все модели на Страница моделей.

Streaming

Комплект stream: true , чтобы получить поток событий, отправленных сервером (SSE). Каждое событие содержит фрагмент ответа.

from openai import OpenAI

client = OpenAI(
    base_url="https://bazaarlink.ai/api/v1",
    api_key="sk-bl-YOUR_API_KEY",
)

stream = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{"role": "user", "content": "Count to 10 slowly."}],
    stream=True,
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

SSE Формат

data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hello"},"index":0}]}

data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":" world"},"index":0}]}

data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{"prompt_tokens":10,"completion_tokens":4,"total_tokens":14}}

data: [DONE]
Использование в потоковом режиме
При потоковой передаче данные об использовании возвращаются в последнем фрагменте перед сообщением [DONE] вместе с массивом выбора с пустой дельтой и параметром Finish_reason: «stop».

Keep-alive и финальный фрагмент

Streams может содержать строки комментариев SSE (начинающиеся с двоеточия) или события пульса в качестве контрольных событий — пропустите строки, не относящиеся к данным: вместо JSON.анализа необработанного потока. Последний фрагмент данных содержит данные об использовании (количество токенов и стоимость) перед данными: [DONE]. Успешные ответы включают заголовок X-Request-Id — включайте его при сообщении о проблемах.

: keepalive          <- SSE comment line — ignore, do NOT JSON.parse

data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hi"},"index":0}]}

data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}

data: [DONE]

Отмена трансляции

Потоковые запросы можно отменить, закрыв клиентское соединение — например. вызов AbortController.abort() или закрытие объекта потока. BazaarLink прекращает ретрансляцию дальнейших фрагментов и отменяет исходящий запрос провайдера, как только будет получено уведомление об отмене.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://bazaarlink.ai/api/v1",
  apiKey: "sk-bl-YOUR_API_KEY",
});

const controller = new AbortController();

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 }
);

for await (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, проверьте наличие ключа ошибки и выставляйте счет только за уже переданные токены (применяется частичная оплата).
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"The capital of "},"index":0}]}

data: {"error":{"message":"Upstream connection lost.","type":"upstream_error","code":502}}

data: [DONE]

Embeddings

Embeddings — это числовые представления текста, которые отражают семантическое значение. Они преобразуют текст в векторы (массивы чисел), которые можно использовать для ряда задач машинного обучения. BazaarLink предоставляет унифицированную конечную точку, совместимую с OpenAI Embeddings API, поэтому вы можете вызывать модели внедрения от нескольких поставщиков через один интерфейс.

Что такое встраивания?

Вложения преобразуют текст в многомерные векторы, где семантически схожие тексты расположены ближе друг к другу в векторном пространстве — например, «кошка» и «котенок» будут иметь схожие вложения, а «кошка» и «самолет» будут далеко друг от друга. Эти векторные представления позволяют машинам понимать взаимосвязи между фрагментами текста, что делает их основой для многих приложений искусственного интеллекта.

Общие случаи использования

Случай использования
Описание
RAG (генерация с расширенным поиском)Создавайте системы, которые извлекают соответствующий контекст из базы знаний перед генерированием ответа — встраивания находят наиболее релевантные документы для включения в контекст LLM.
Семантический поискПреобразуйте документы и запросы во встраивания, а затем находите наиболее релевантные документы по векторному сходству — это позволяет понять смысл, а не просто сопоставить ключевые слова, что дает лучшие результаты, чем поиск по ключевым словам.
Системы рекомендацийСоздавайте вложения для элементов (продуктов, статей, видео) и предпочтений пользователя, чтобы рекомендовать похожие элементы — векторное сравнение позволяет выявить семантически связанные элементы даже без общих ключевых слов.
Кластеризация и классификацияГруппируйте похожие документы или классифицируйте текст путем анализа шаблонов встраивания — документы со схожими вложениями обычно относятся к одной и той же теме или категории.
Обнаружение дубликатовНаходите повторяющийся или почти повторяющийся контент путем сравнения сходства встраивания — это работает, даже если контент был перефразирован или переформулирован.
Обнаружение аномалийВыявляйте необычное или необычное содержимое, выявляя встраивания, которые значительно отличаются от типичного шаблона набора данных.
POST/api/v1/embeddings
Note
Не все вышестоящие поставщики поддерживают встраивание. Если ваш настроенный поставщик не поддерживает запрошенную модель, BazaarLink автоматически переключится на следующего доступного поставщика.

Параметры

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
Настройки маршрутизации поставщика — order,allow_fallbacks, data_collection и другие поля, описанные в разделе «Выбор поставщика».

Основной запрос

from openai import OpenAI

client = OpenAI(
    base_url="https://bazaarlink.ai/api/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

Пакетная обработка

Отправьте массив строк для встраивания нескольких текстов в один запрос — дешевле и быстрее, чем один вызов для каждого текста.

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 in enumerate(response.data):
    print(f"Embedding {i}: {len(item.embedding)} dimensions")

Многомодальный ввод (изображение + текст)

Модели с поддержкой ввода изображений (output_modalities включает «embeddings», а inputModalities включает «image») принимают элементы ввода в форме {content:[{type:"text",...}, {type:"image_url",...}]}, что позволяет встраивать изображение отдельно или вместе с текстом.

В зависимости от модели
Только некоторые модели внедрения принимают входные изображения — перед отправкой содержимого image_url проверьте поддерживаемые модели модальности на странице «Модели». Модели, содержащие только текст, отклонят эту форму.
import requests

response = requests.post(
    "https://bazaarlink.ai/api/v1/embeddings",
    headers={
        "Authorization": "Bearer sk-bl-YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "model": "google/gemini-embedding-2-preview",
        "input": [{
            "content": [
                {"type": "text", "text": "A scenic boardwalk through a green meadow"},
                {"type": "image_url", "image_url": {"url": "https://example.com/boardwalk.jpg"}},
            ]
        }],
        "encoding_format": "float",
    },
)

embedding = response.json()["data"][0]["embedding"]
print(f"Embedding dimension: {len(embedding)}")

Маршрутизация поставщика

Control, который восходящий обслуживает запрос на встраивание так же, как и завершение чата — полную ссылку на поле см. в разделе «Выбор поставщика».

{
  "model": "openai/text-embedding-3-small",
  "input": "Your text here",
  "provider": {
    "order": ["openai"],
    "allow_fallbacks": true,
    "data_collection": "deny"
  }
}

Поиск моделей внедрения

Нет специальной конечной точки для списка моделей внедрений — вызовите GET /api/v1/models и отфильтруйте на стороне клиента записи, выходные_модальности которых включают «внедрения», или просмотрите страницу «Модели».

Ограничения

  • Нет потоковой передачи — встраивания всегда возвращаются как полный ответ, в отличие от завершения чата.
  • Каждая модель имеет максимальную входную длину; текст, выходящий за этот предел, обрезается или отклоняется в восходящем направлении.
  • Вложения для идентичных входных данных являются детерминированными — температура или случайность не учитываются.

Передовые практики

  • Выберите модель для достижения компромисса между speed/quality и стоимостью — модели меньшего размера (например, qwen/qwen3-embedding-4b) дешевле и быстрее; более крупные (например, openai/text-embedding-3-large) обычно встраиваются с более высокой точностью.
  • Объедините несколько текстовых сообщений в один запрос вместо одного звонка на одно текстовое сообщение — меньше циклов обработки, меньше накладных расходов.
  • Кэшируйте результаты — внедрения для одних и тех же входных данных никогда не меняются, поэтому сохраняйте их, а не восстанавливайте.
  • Сравнивайте с косинусным сходством, а не с евклидовым расстоянием — оно масштабно-инвариантно и лучше работает для многомерных векторов.
  • Следите за длиной контекста каждой модели — перед встраиванием длинных документов может потребоваться разделение на фрагменты.

Параметры

Параметры выборки определяют процесс генерации токена. BazaarLink передает поддерживаемые параметры вышестоящему поставщику; неподдерживаемые параметры игнорируются.

Параметры выборки

Pure passthrough — без локальных значений по умолчанию
Они пересылаются вышестоящему провайдеру в том виде, в каком они были отправлены — BazaarLink никогда не внедряет и не применяет значения по умолчанию. «По умолчанию» ниже описывает собственное поведение поставщика, когда поле опущено, а не гарантия BazaarLink.
temperature
number
Температура отбора проб 0–2. Выше = более случайно. По умолчанию: 1
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Ограничить выбор жетонов до K. 0 = отключено (учитывать все). По умолчанию: 0
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-серии: «низкое», «среднее» или «высокое». Прошло как есть
stop
string | string[]
Stop-последовательности — генерация останавливается при обнаружении
tools
Tool[]
Список инструментов (функций), которые может вызывать модель
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.
parallel_tool_calls
boolean
Включить параллельный вызов функций при наличии инструментов. По умолчанию: правда. Только модели семейства OpenAI — см. примечание ниже.

BazaarLink — только параметры

transforms
string[]
Message преобразуется для применения, например ["середина"]. Пропустить автоматическое применение к моделям с контекстом ≤8 тыс.
models
string[]
Резервный список моделей — BazaarLink пробует каждую по порядку в случае сбоя основной
route
string
Дополнительное поле совместимости маршрутизации — большинству пользователей это не нужно. Используйте «модели» в качестве запасного варианта.
provider
object
Расширенные настройки маршрутизации — большинству пользователей это не нужно.

Кредиты

Запросить текущий кредитный баланс и использование API за весь срок действия.

GET/api/v1/credits
Auth
Требуется токен носителя (стандартный ключ API sk-bl-...).

Пример запроса

curl https://bazaarlink.ai/api/v1/credits \
  -H "Authorization: Bearer sk-bl-YOUR_KEY"

Ответ

{
  "data": {
    "total_credits": 100.00,
    "total_usage": 12.34
  }
}

Ошибки: 401 (ключ missing/invalid), 403 (приостановленный пользователь).

Сведения о генерации

Получение подробной статистики для одного завершения по идентификатору поколения (из идентификатора ответа chat/completions или заголовка потоковой передачи x-bz-gen-id).

GET/api/v1/generation?id=<generation-id>
Auth
Требуется токен носителя (стандартный ключ API). Обязательный параметр запроса: id.

Пример запроса

curl "https://bazaarlink.ai/api/v1/generation?id=gen_abc123" \
  -H "Authorization: Bearer sk-bl-YOUR_KEY"

Ответ

{
  "data": {
    "id": "gen_xyz...",
    "model": "openai/gpt-4.1",
    "provider": "openai",
    "created_at": "2026-04-20T10:00:00.000Z",
    "app_name": "MyApp",
    "finish_reason": "stop",
    "status": 200,
    "duration_ms": 1234,
    "first_token_ms": 234,
    "throughput": 45.6,
    "usage": {
      "prompt_tokens": 100,
      "completion_tokens": 200,
      "total_tokens": 300,
      "prompt_tokens_details": { "cached_tokens": 50 },
      "completion_tokens_details": { "reasoning_tokens": 30 },
      "cost": 0.00123
    },
    "cost_breakdown": {
      "subtotal": 0.00123,
      "cache_discount": 0.00015,
      "total": 0.00108
    }
  }
}

Ошибки: 400 (отсутствует идентификатор), 401 (аутентификация), 404 (поколение не найдено).

API Ключевая информация

Запросите текущий уровень ограничения скорости ключа API и агрегированные счетчики использования (формат ответа соответствует общепринятым отраслевым соглашениям о ключах API).

GET/api/v1/key
Auth
Требуется токен носителя (стандартный ключ API).

Ответ

{
  "data": {
    "label": "Production Key",
    "limit": null,
    "limit_remaining": 100.00,
    "limit_reset": null,
    "expires_at": null,
    "is_free_tier": false,
    "is_management_key": false,
    "is_provisioning_key": false,
    "usage": 12.34,
    "usage_daily": 0.12,
    "usage_weekly": 0.45,
    "usage_monthly": 1.23,
    "requests": 1234,
    "requests_daily": 10,
    "requests_weekly": 50,
    "requests_monthly": 200,
    "rate_limit": { "requests": 600, "interval": "1m", "note": "Paid-tier rate limit." }
  }
}
Note
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.

Ошибки: 401 (аутентификация), 404 (отсутствует пользователь — редко).

Регистрация агента

Самостоятельная регистрация агентов ИИ (ботов, автономных систем). Возвращает ключ API с пробными кредитами и токеном заявки на обновление учетной записи.

POST/api/v1/agents/register
Rate Limit
Аутентификация не требуется, но IP-адрес ограничен одной регистрацией в 24 часа.

Тело запроса

nameобязательно
string
Имя агента (непустое, обрезанное, не более 100 символов).
description
string
Описание дополнительного агента.
referral_code
string
Необязательный реферальный код.

Пример запроса

curl -X POST https://bazaarlink.ai/api/v1/agents/register \
  -H "content-type: application/json" \
  -d '{
    "name": "My Agent",
    "description": "Autonomous research bot"
  }'

Ответ

{
  "api_key": "sk-bl-xxxxx...",
  "credits": 0.10,
  "credits_usd": "$0.1000",
  "claim_token": "abc...xyz",
  "claim_expires": "2026-04-27T10:00:00.000Z",
  "upgrade_url": "https://bazaarlink.ai/claim?token=...",
  "referral_code": "aBcDeFgH",
  "free_model": "auto:free",
  "message": "Welcome to BazaarLink!...",
  "referral_message": "Share referral link:...",
  "base_url": "https://bazaarlink.ai/api/v1",
  "docs": "https://bazaarlink.ai/llms.txt"
}

Ошибки: 400 (неверное тело/отсутствует имя), 429 (ограничение скорости — 1/IP/24h), 500 (внутреннее).

Коды ошибок

Ошибка формата ответа Конечные точки вывода

Model возвращают конверт ошибки, совместимый с OpenAI. Поле типа может отличаться или быть опущено на специализированных конечных точках; используйте статус HTTP и error.code для логики программы вместо анализа сообщения. Статус и код ошибки

{
  "error": {
    "message": "Insufficient credits. Please top up to continue.",
    "type": "invalid_request_error",
    "code": "insufficient_credits"
  }
}

HTTP

Перед началом потоковой передачи статус HTTP определяет общий класс сбоя. error.code — это либо числовой статус, либо стабильная строка для сбоев, требующих определенного устранения. Предпочитайте строковый код, если он присутствует, вернитесь к статусу HTTP и рассматривайте error.message как удобочитаемый текст.

Код
Название
Описание
400Неверный запросНеверный запрос, пустой массив сообщений или отсутствуют обязательные поля
401НесанкционированныйAPI Ключ отсутствует, недействителен или отключен.
402Требуется оплатаНедостаточно средств на счете, достигнут предел расходов на ключ или превышен предел бюджета monthly/weekly
403ЗапрещеноУчетная запись заблокирована или не имеет разрешения
404Не найденЗапрошенная модель, поколение, ключ или другой ресурс не существует.
409КонфликтРесурс не находится в требуемом состоянии, например задание видео не завершено.
410УшелЗапрошенная модель снята с производства и должна быть заменена.
413Полезная нагрузка слишком великаТело запроса превышает 10 МБ; уменьшить размер контента или разделить запрос
416Диапазон неудовлетворителенЗапрошенный диапазон байтов недействителен для созданного видеоконтента.
429Слишком много запросовПревышен лимит скорости; перед повторной попыткой проверьте заголовок Retry-After
500Ошибка сервераВнутренняя ошибка BazaarLink
502Плохой шлюзВсе вышестоящие поставщики вышли из строя; была предпринята попытка переключения при отказе
503Сервис недоступенДля этой модели не настроен ни один вышестоящий поставщик; связаться с администратором
504Тайм-аут шлюзаВосходящее соединение или поток остановлены и истекло время ожидания.

Машиночитаемые коды оплаты Ответ

A 402 может представлять собой различные элементы управления. Эти стабильные коды позволяют клиентам показывать правильное следующее действие.

Код
Описание
budget_cap_reachedA Достигнут предел еженедельного или ежемесячного бюджета рекомендаций; поднимите или сбросьте крышку.
credit_limit_exceededA Жесткая кредитная линия организации, осуществляющей ежемесячные платежи, исчерпана; контактный биллинг.
insufficient_creditsA пользователь или организация с предоплатой не может зарезервировать достаточный баланс; добавить кредиты.
spend_limit_exceededКлюч API достиг настроенного ежедневного, еженедельного или ежемесячного лимита расходов.

Подробные коды ошибок

Если запрос API завершается неудачно, error.code сообщает конкретную причину. Две ошибки могут использовать HTTP 400, но требуют разных исправлений: «unknown_model» означает, что имя модели неверно, а «image_too_large» означает, что изображение необходимо уменьшить. Используйте таблицу ниже, чтобы найти причину и следующее действие. Статус

Модель и конечная точка
Ошибки поиска модели, жизненного цикла, ценообразования, модальности и совместимости конечных точек.
Код
HTTP
unknown_model400
invalid_model_id400
model_not_found404
model_retired410
model_endpoint_mismatch400
embedding_on_chat_endpoint400
model_not_priced400
invalid_modality_for_model400
Запрос и безопасность
Недопустимые параметры, контекст, инструменты, схемы и отказы в отношении безопасности содержимого.
Код
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
upstream_unavailable502/503

Ограничения ставок, бюджеты и экстренные тормоза

Эти элементы управления могут отклонить действительный запрос. Они отличаются от сбоев поставщика и требуют других действий по восстановлению.

Управление
HTTP
Как это определить
Ограничение скорости запроса429Цифровой код 429; используйте заголовки Retry-After и X-RateLimit-*.
Блок штрафа за ограничение скорости429Цифровой код 429 и сообщение о временном ограничении; используйте Повтор-После.
Global проводит аварийное торможение503Цифровой код 503, сообщение о глобальном лимите расходов и повторная попытка через 30 или 300 секунд.
Org/team/member/user расходный тормоз429Цифровой код 429 и сообщение автоматического выключателя с указанием затронутой области.
Контроль выставления счетов и бюджета402Используйте коды строк стабильного платежа, перечисленные выше.

Примечание о совместимости: пути ограничения скорости и аварийного торможения в настоящее время выдают числовые значения error.code. Не принимайте недокументированные строковые коды. Используйте статус HTTP, Retry-After и документированное ответное сообщение, пока не будет введен стабильный строковый код.

Состояние видео и медиаресурсов

Проверка видео обычно возвращает числовой код 400. Отсутствующее задание возвращает 404, устаревшая модель возвращает 410, незавершенное видеоконтент возвращает 409, а недопустимый диапазон видеобайтов возвращает 416. Опрос до завершения или исправление заголовка Range перед повторной попыткой.

Политика повторных попыток

Повторять только те сбои, которые можно устранить без изменения запроса. Если присутствует Retry-After, подождите столько же; в противном случае используйте экспоненциальную задержку с джиттером. Ограничьте попытки и избегайте наслаивания ручных повторов поверх автоматических попыток SDK.

Повторить попытку с откатом
429, 502, 503 и 504. Соблюдайте параметр «Повторить попытку после», если он предусмотрен. Для запросов на создание не создавайте второе задание после неоднозначного сбоя сети, пока вы не проверите исходное задание.
Исправьте перед повторной попыткой
400, 401, 402, 403, 404, 409, 410, 413 и 416. Сначала измените запрос, учетные данные, баланс, разрешения, состояние ресурса или заголовок диапазона.

Обработка ошибок

import random
import time
from openai import OpenAI, APIStatusError

client = OpenAI(
    base_url="https://bazaarlink.ai/api/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 in range(5):
    try:
        response = client.chat.completions.create(
            model="openai/gpt-4.1",
            messages=[{"role": "user", "content": "Hello!"}],
        )
        break
    except APIStatusError as error:
        if error.status_code not in RETRYABLE or attempt == 4:
            raise
        retry_after = error.response.headers.get("Retry-After")
        delay = (
            float(retry_after)
            if retry_after
            else min(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 с объектом ошибки верхнего уровня, за которым следуют данные: [DONE]. Фрагменты, дословно передаваемые из некоторых восходящих потоков, вместо этого могут содержать ошибку выбора (choices[0].finish_reason === "error") — обрабатывают и то, и другое.

// If the stream fails mid-flight, BazaarLink emits a final SSE event
// with a top-level "error" object, followed by data: [DONE]
data: {"error":{"message":"Upstream stream interrupted. The response is incomplete.","type":"upstream_error","code":502}}

data: [DONE]

// Chunks relayed verbatim from some upstreams may instead carry the error
// inline on the choice: choices[0].finish_reason === "error" with an
// "error" object ({ code, message }) on the choice — handle both shapes.
// Branch on error.code; error.type can vary by failure path.

Версии

BazaarLink предоставляет единый стабильный путь API, /api/v1 — нет привязанных к дате версий или заголовков версий, которыми нужно управлять. API развивается постоянно, а не через пронумерованные выпуски.

Некритичные изменения

Отправка без предварительного уведомления:

  • Новые конечные точки
  • В каталог добавлены новые модели
  • Новые дополнительные параметры запроса
  • Новые поля ответа
  • Новые схемы с дополнительными свойствами
  • Дополнительные коды ответа status/error
Пишите клиентам в оборонительной форме.
Игнорируйте незнакомые поля ответа и не допускайте сбоев при неизвестных значениях в полях, подобных перечислению: новые добавляются по мере роста каталога и набора функций.

Важные изменения

Это редкие экземпляры, включая:

  • Удаление или переименование конечной точки, параметра или поля ответа.
  • Изменение типа поля
  • Сделать обязательным дополнительный параметр

Когда они все-таки происходят, критическое изменение применяется к конкретной конечной точке, а не ко всей поверхности /api/v1 — не существует какого-либо одного изменения версии, которое могло бы нарушить всю интеграцию сразу. Мы пока не публикуем официальный журнал изменений с пометкой «Критические изменения» (см. «Остаться в курсе» ниже); по вопросам, важным для интеграции, обращайтесь в службу поддержки, прежде чем полагаться на недокументированное поведение.

Политика прекращения поддержки

Одно обычное «критическое» событие, которого следует ожидать: отдельные модели выводятся из эксплуатации, поскольку вышестоящие поставщики устаревают. Запросите текущий статус модели через GET/api/v1/models.

GET https://bazaarlink.ai/api/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 /api/v1/models или обратитесь в службу поддержки, если вам нужно предварительное уведомление о критической интеграции.

Поддержка
Поддержка
Здравствуйте! Чем мы можем помочь?
Отправьте сообщение, и мы ответим в ближайшее время.
Справочник API | Чаты, эмбеддинги и маршрутизация моделей