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

BazaarLink Документация

BazaarLink — это унифицированный шлюз AI API для Тайваня, обеспечивающий доступ к сотням моделей из OpenAI, Anthropic, Google, Meta и других через единый OpenAI-совместимый шлюз. конечная точка API.

AI Файл навыков агента
Загрузите наш файл навыков в своего ИИ-помощника (Claude, Cursor, Copilot…), чтобы дать ему полное знание BazaarLink API:
Read https://bazaarlink.ai/skill.md and follow the instructions to integrate BazaarLink into your app.
Бесплатные модели и ограничения скорости
Ищете информацию о бесплатных моделях, ограничениях на поминутные запросы и бесплатных кредитах? Видеть Ограничения ставок · FAQ

Цены

BazaarLink использует модель цен с нулевой наценкой (идентичной официальной прейскурантной цене каждого поставщика). Комиссия за платформу взимается при пополнении счета (депозите): комиссия за транзакцию 10% плюс 5% Тайвань VAT на каналах TWD. Счет выставляется в формате USD с расценками TWD и едиными электронными счетами. Пополнение баланса с оплатой по мере использования; предприятия могут организовать ежемесячную оплату (Net-30, по договоренности).

Как это работает

  • Потребление (дебет): каждый вызов API оплачивается на основе фактического использования токенов по официальной прейскурантной цене USD провайдера, вычитаемой из вашего баланса — нулевая наценка, никакой дополнительной платы за потребление.
  • Пополнение (депозит): TWD конвертируется в USD по курсу продажи в реальном времени и добавляется к вашему балансу; При пополнении взимается комиссия за транзакцию 10%.
  • • Кредитная карта: взимается дополнительная фиксированная комиссия в размере 0.60 в долларах США; выдается квитанция.
  • • TWD каналы: 5% Тайвань добавляется VAT и выдается единый электронный счет для Тайваня.
  • • Банковский перевод: для крупных или корпоративных пополнений свяжитесь с нами, чтобы организовать банковский перевод и индивидуальное выставление счета.
  • Выставление счетов: электронные унифицированные счета поддерживаются для рабочих процессов расходов Тайваня; компании, которым необходимы закупки или ежемесячные счета, могут договориться на корпоративных условиях (Net-30, по договоренности).
Пример
Для пополнения счета в долларах США 10.00: канал TWD = $10.00 + комиссия 10% в долларах США 1.00 + 5% VAT US$0.55 = US$11.55 (выставлен единый счет); Кредитная карта = $10.00 + комиссия $1.00+ фиксированная плата в долларах США 0.60 = $11.60. После пополнения ваш баланс в долларах США 10.00 расходуется по официальным прейскурантным ценам без каких-либо дополнительных наценок.

О курсе валют

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

Защита от выставления счетов при сбое запроса

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

Когда с вас не взимается плата
Настройка не требуется. Это правило включается автоматически для общедоступных выводов и API мультимедиа. BazaarLink может поглотить стоимость, уже взимаемую вышестоящим провайдером, вместо того, чтобы перекладывать на вас стоимость неудачного запроса.
  • Восходящий канал не может подключиться, отклоняет запрос или не возвращает пригодный для использования ответ.
  • A поток останавливается до получения окончательной записи об использовании, даже после частичного содержимого.
  • Ответ не содержит данных об использовании или содержит только пустой объект использования с нулевым значением. Вывод токенов

0 не всегда означает бесплатность

Если запрос завершается нормально и поставщик возвращает допустимое использование, BazaarLink регулирует это использование. Не решайте, был ли запрос свободен только от выходных токенов: ответ с 0 выходными токенами все равно может быть выставлен счет за входные токены или действительные затраты, указанные в восходящем направлении. Проверьте возвращенную стоимость использования или запись активности на предмет окончательного платежа.

Быстрый старт

Три способа интеграции

Подход
Подходит для
Старт
Сырой APIЛюбой язык, нулевые зависимости, полный контроль запросов
OpenAI / Anthropic SDKУже на официальном SDK — поменять базу URL и только ключ
Агентные платформыLangChain, Vercel AI SDK, CrewAI и другие приложения-агенты

Начните работу менее чем за 5 минут. BazaarLink полностью совместим с OpenAI SDK — просто измените

База URL

https://bazaarlink.ai/api/v1

Использование OpenAI SDK

BazaarLink полностью совместим с OpenAI SDK. Просто измените базовый ключ URL и API — весь остальной код останется прежним.

from openai import OpenAI

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

completion = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[
        {"role": "user", "content": "What is the meaning of life?"}
    ],
)

print(completion.choices[0].message.content)
Нужен ключ API?
Получите ключ API с сайта API Страница ключей. Все ключи начинаются с sk-bl-.
Формат идентификатора модели — используйте provider/model-name
Всегда используйте полный формат provider/model (например, openai/gpt-4.1). Общие семейства (gpt-*, claude-*) имеют автоматический префикс на каждой конечной точке, а chat/completions дополнительно разрешает любое однозначное пустое имя из каталога, но имена, которые не могут быть разрешены, возвращают ошибку 400, поэтому полная форма является единственной гарантированной.
✓ openai/gpt-4o   anthropic/claude-sonnet-4.6   google/gemini-2.5-flash
✗ gpt-4.1   claude-sonnet-4.6   gemini-2.5-flash

Принесите свой ключ (BYOK)

Прикрепите ключи API своего вышестоящего поставщика (совместимые с OpenAI или Anthropic) к своей учетной записи или организации — соответствующие запросы затем передаются вверх через ваш ключ с плавным или строгим резервным режимом. Персональные ключи находятся на вкладке BYOK страницы ключей; организации управляют своими в настройках организации. Перейти в настройки BYOK →

Контентная фильтрация

Двусторонняя защита содержимого вашего трафика API: запросы, содержащие попытки внедрения подсказок, блокируются (400), а конфиденциальные данные в подсказках или ответах (ключи API, номера карт, национальные идентификаторы и т. д.) автоматически удаляются. Правила и список исключений настраиваются, включая статистику использования. Перейти к настройкам фильтра контента →

Миграция с OpenRouter

API API совместим с OpenRouter — большинство интеграций переключаются путем изменения двух значений: базового URL на https://bazaarlink.ai/api/v1 и ключа API на a. Ключ BazaarLink, начинающийся с sk-bl-.

  1. База URL: https://openrouter.ai/api/v1 → https://bazaarlink.ai/api/v1
  2. API ключ: sk-or-... → sk-bl-... (создайте его по адресу /keys)
  3. Model ID: тот же формат provider/model (например, anthropic/claude-sonnet-4.6); полный каталог по адресу GET /api/v1/models. Резервные варианты
  4. models[], настройки маршрутизации поставщика, потоковая передача, вызов инструментов и структурированные выходные данные используют одну и ту же форму запроса.
  from openai import OpenAI

  client = OpenAI(
-     base_url="https://openrouter.ai/api/v1",
-     api_key="sk-or-...",
+     base_url="https://bazaarlink.ai/api/v1",
+     api_key="sk-bl-...",
  )
Note
Billing находится в формате USD, доступны тайваньские электронные счета. Информацию о функциях, специфичных для OpenRouter (например, сортировка поставщиков :nitro), см. в разделах «Варианты модели» и «Выбор поставщика» на справочной странице API, где описано эквивалентное поведение.

Аутентификация

Для всех запросов API требуется заголовок авторизации с вашим ключом API.

Authorization: Bearer sk-bl-YOUR_API_KEY

Получите ключ API с сайта приборная панель. Храните свой ключ в безопасности — не раскрывайте его в клиентском коде.

Примечание по безопасности
Никогда не раскрывайте ключи API на стороне клиента JavaScript. Всегда прокси-запросы через ваш внутренний сервер.

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

HTTP-Referer
string
Ваш сайт URL, для отслеживания использования и анализа (необязательно)
X-Title
string
Название вашего приложения, отображаемое на информационных панелях (необязательно)

Принципы

BazaarLink разработан на основе трех основных принципов:

1. Единый интерфейс

Один API, один SDK, сотни моделей. Переключайтесь между OpenAI, Anthropic, Google Gemini, Meta Llama и другими, не меняя код — просто измените идентификатор модели.

2. Оптимизация цен

BazaarLink автоматически направляет к наиболее экономичному поставщику для выбранной вами модели. Вы платите только за то, что используете, счет выставляется в формате USD с полной поддержкой выставления счетов.

3. Высокая доступность

Автоматическое переключение при сбое означает, что в случае сбоя провайдера ваши запросы будут плавно перенаправлены. Никаких изменений кода, никаких простоев.

Мультимодальный

BazaarLink поддерживает мультимодальные входы — отправляйте изображения, аудио и файлы вместе с текстом в модели, которые их поддерживают. Контент передается вышестоящему провайдеру.

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

Ввод
Описание
Примеры моделей
ТекстСтандартные текстовые сообщенияВсе модели
ИзображенияURL или данные base64 URI — PNG, JPEG, WebP, GIFopenai/gpt-5.3-codexanthropic/claude-opus-4.6google/gemini-2.5-flash-lite+142 читать далее
Файлы / PDF-файлыДокумент через данные base64 URI (`data:application/pdf;base64,...`)openai/gpt-5.3-codexanthropic/claude-opus-4.6google/gemini-2.5-flash-lite+70 читать далее
АудиоRaw base64 — нет поддержки URL. Требуется поле `format`.google/gemini-2.5-flash-litexiaomi/mimo-v2.5google/gemini-3.1-pro-preview+13 читать далее
ВидеоURL (CDN) или данные base64 URIgoogle/gemini-2.5-flash-liteqwen/qwen3.5-plus-02-15minimax/minimax-m3+37 читать далее

Примеры:

# Image — URL or base64 data URI
curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-2.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"What is in this?"},
        {"type":"image_url","image_url":{"url":"https://example.com/photo.jpg"}}
      ]}]}'

# File / PDF — base64 data URI only, no URL
curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-2.5-flash","messages":[{"role":"user","content":[
        {"type":"file","file":{"filename":"doc.pdf","file_data":"data:application/pdf;base64,JVBER..."}},
        {"type":"text","text":"Summarize this."}
      ]}]}'

# Audio — raw base64, no URL. "format" is required
curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-2.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"Transcribe this."},
        {"type":"input_audio","input_audio":{"data":"UklGRi...","format":"wav"}}
      ]}]}'

# Video — URL (CDN) or base64 data URI
curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-2.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"Describe this video."},
        {"type":"video_url","video_url":{"url":"https://example.com/clip.mp4"}}
      ]}]}'

Отправка изображений

Используйте формат массива содержимого с частями image_url. Поддерживаемые форматы: PNG, JPEG, WebP и GIF (включая анимированные). Вы можете включить несколько изображений в одно сообщение — каждое как отдельную часть image_url:

curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer sk-bl-YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [{"role":"user","content":[
      {"type":"text","text":"What is in this image?"},
      {"type":"image_url","image_url":{"url":"https://example.com/photo.jpg","detail":"auto"}}
    ]}]
  }'
Отправка изображений
Всегда добавляйте текстовую часть рядом с изображениями. Для лучшей совместимости со всеми поставщиками рекомендуется упорядочивать текст сначала (текстовая часть перед частями изображения).
Отправка изображений
Проверьте страницу «Модели», чтобы узнать, какие методы ввода поддерживаются каждой моделью. Столбец модальности показывает, какие входные данные принимает каждая модель.

Ограничения

BazaarLink применяет два независимых ограничения: ограничение скорости запросов в минуту и кредитный лимит на расходы по счету. Превышение ограничения скорости возвращает HTTP 429; исчерпание кредитов возвращает HTTP 402.

Ограничения ставок

Ограничения скорости указаны для каждого пользователя (а не для каждого ключа) и измеряются в запросах в минуту (RPM). Дневного лимита нет. Уровень определяется автоматически в зависимости от кредитного баланса вашего аккаунта.

Уровень
RPM
Ежедневное использование
Примечания
Бесплатно (< кредитов $5)20 RPMБез ограниченийРазработка и тестирование
Оплачено (≥ кредитов в размере $5)200 RPMБез ограниченийПроизводственные нагрузки

При превышении ограничения скорости вы получаете ответ 429 с заголовком Retry-After. Реализуйте экспоненциальную отсрочку при повторных запросах.

Заголовки ответов

Каждый успешный ответ включает заголовки ограничения скорости для отслеживания на стороне клиента:

X-RateLimit-Limit: 200        # Max requests per minute for your tier
X-RateLimit-Remaining: 198    # Remaining requests in current window
X-RateLimit-Reset: 1740000060 # Unix timestamp when the window resets
X-Request-Id: chatcmpl-abc123 # Unique request ID for debugging

Кредитные лимиты Ответ

A 402 означает, что баланс вашего счета или ограничение расходов ключа достигло нуля — это не значит, что вы отправляете запросы слишком быстро. Эти ответы не содержат заголовков ограничения скорости, и если ограничение будет достигнуто в середине потока, вы получите событие ошибки SSE вместо изменения статуса HTTP.

402 Недостаточно кредитов
Когда ваш баланс достигает 0 долларов США, API возвращает HTTP 402 с сообщением «Недостаточно кредитов. Пополните счет, чтобы продолжить». — отслеживайте использование.стоимость в ответах, чтобы отслеживать расходы в режиме реального времени.

個人緊急煞車

針對您所有 API 金鑰套用的固定 1 分鐘 / 1 小時 USD 支出上限。當時間窗口的門檻被觸及時,新的請求將收到 HTTP 429;窗口於整點邊界自動重置。

cbEnabled
boolean
啟用
cbMinuteUsd
number | null
每分鐘 USD 上限 · 使用預設值
cbHourlyUsd
number | null
每小時 USD 上限 · 使用預設值
(繼承預設值)
數值至少為 0.01(或留空使用預設值)
個人緊急煞車 · 調整

Генерация изображения

Создавайте изображения с помощью /v1/chat/дополнений с модальностями:["image"] или OpenAI DALL·E-совместимого /v1/images/generations.

curl -N https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_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}'

Полный поток (потоковая передача, редактирование изображений, протокол SSE, список моделей) →

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

Async Трехэтапный процесс (отправка → опрос → контент). Создание видео занимает от 30 секунд до 5 минут.

curl https://bazaarlink.ai/api/v1/videos \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"alibaba/wan2.7-t2v","prompt":"a bird flying over mountains","duration":3}'
# → 202 { "id": "vjob_xxx", "status": "pending" }

Полный поток (опрос, загрузка, типы задач, предупреждения) →

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."},
        ],
    }],
)

Видеовходы

Отправляйте видеофайлы на модели, поддерживающие видеовход, для анализа, создания субтитров или вопросов о сценах и событиях. Работает с прямыми данными 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 →

Управление API Ключи

Ключи управления предназначены для программного управления ключами. Они могут создавать, перечислять, обновлять, отключать и удалять стандартные ключи API, но не могут вызывать модели ИИ.

Примечание
Клавиши управления не могут вызывать модели AI (chat/completions/messages/embeddings). Для доступа к модели используйте стандартный ключ API.

Создание ключа управления

Перейти вManagement API Страница ключейи нажмите «Создать» — это отдельная страница от ваших стандартных ключей API, а не селектор типа на той же странице.

Список ключей

GET https://bazaarlink.ai/api/v1/keys
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Response
{
  "keys": [
    {
      "id": "clxyz123...",
      "name": "Production Key",
      "keyType": "standard",
      "keyPrefix": "sk-bl-abc1",
      "keySuffix": "XyZ9",
      "enabled": true,
      "spendLimitUsd": 10.00,
      "spendLimitPeriod": "month",
      "expiresAt": null,
      "createdAt": "2026-01-01T00:00:00.000Z",
      "lastUsed": "2026-03-01T12:34:56.000Z",
      "requestCount": 1234,
      "totalTokens": 5678901
    }
  ]
}

Создать дополнительный ключ

POST https://bazaarlink.ai/api/v1/keys
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
Content-Type: application/json

{
  "name": "Agent Key",
  "limit": 10.00,
  "limit_reset": "monthly",
  "expires_at": "2026-12-31T23:59:59Z"
}

# limit_reset: daily | weekly | monthly
# expires_at:  ISO 8601 datetime (optional)

# Response — save the key value, it won't be shown again
{
  "id": "clxyz789...",
  "name": "Agent Key",
  "key": "sk-bl-xyz789abcdef...",
  "keyType": "standard",
  "spendLimitUsd": 10.00,
  "spendLimitPeriod": "month",
  "expiresAt": "2026-12-31T23:59:59.000Z",
  "enabled": true,
  "createdAt": "2026-03-01T00:00:00.000Z"
}

Update Key

PATCH https://bazaarlink.ai/api/v1/keys/:id
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
Content-Type: application/json

{"enabled": false}              # disable key
{"spendLimitUsd": 5, "spendLimitPeriod": "week"}  # set spend limit
{"spendLimitUsd": null}         # remove spend limit
# Response: {"updated": true}

Отменить ключ

DELETE https://bazaarlink.ai/api/v1/keys/:id
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Returns 204 No Content on success

Запрос баланса

GET https://bazaarlink.ai/api/v1/credits
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Response
{
  "data": {
    "total_credits": 12.345,
    "total_usage": 3.210
  }
}

Использование запросов

GET https://bazaarlink.ai/api/v1/usage?period=month
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# period: day | week | month | year

Атрибуция приложения

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

Примечание
Эти заголовки являются необязательными и не влияют на функциональность API. Однако их установка рекомендуется для отладки и определения использования.

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

HeaderDescription
HTTP-RefererВаш сайт URL, для отслеживания использования и анализа (необязательно)
X-TitleНазвание вашего приложения, отображаемое на информационных панелях (необязательно)
from openai import OpenAI

client = OpenAI(
    base_url="https://bazaarlink.ai/api/v1",
    api_key="sk-bl-YOUR_KEY",
    default_headers={
        "HTTP-Referer": "https://yourapp.com",  # Optional: your site URL
        "X-Title": "My Application",             # Optional: your app name
    },
)

response = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)

Коды ошибок

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

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.

Вызов инструмента

Tool Вызов (также известный как вызов функции) позволяет моделям вызывать внешние функции, которые вы определяете. Модель решает, когда вызывать инструмент, и генерирует структурированные аргументы — ваш код выполняет функцию и возвращает результаты для продолжения диалога.

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

Большинство передовых моделей поддерживают вызов инструментов. Вот несколько популярных вариантов:

Определение инструментов

Каждый инструмент представляет собой объект JSON, описывающий функцию, которую может вызывать модель. Поле параметров использует схему JSON.

nameобязательно
string
Имя функции (a–z, A–Z, 0–9, подчеркивание, тире)
descriptionобязательно
string
Четкое описание того, когда и как следует использовать функцию.
parametersобязательно
object
JSON Объект схемы, определяющий параметры функции

tool_choice Параметры

Значение
Поведение
"auto"Model решает, вызывать ли инструмент (по умолчанию).
"none"Model не будет вызывать какой-либо инструмент.
"required"Модель должна вызывать хотя бы один инструмент.
{"type": "function", "function": {"name": "get_weather"}}Model должна вызвать указанную функцию.

Полный поток

Вызов инструмента — это многоходовой процесс: (1) отправка запроса с помощью инструментов → (2) модель возвращает Tool_calls → (3) выполнение функций → (4) отправка результатов обратно → (5) модель генерирует окончательный ответ.

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":"user","content":"What is the weather in Taipei?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Get current weather for a city",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {"type": "string", "description": "City name"},
            "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
          },
          "required": ["city"]
        }
      }
    }],
    "tool_choice": "auto"
  }'
# Response carries tool_calls — run get_weather() yourself, then send the
# result back with role:"tool" (same shape as the Python/TS steps 3-5) to
# get the model's final answer.

Параллельные вызовы инструментов

Некоторые модели могут вызывать несколько инструментов в одном ответе. Обрабатывайте каждый вызов инструмента и возвращайте все результаты:

# Model may return multiple tool_calls
if message.tool_calls:
    messages = [
        {"role": "user", "content": "Weather and time in Tokyo?"},
        message,
    ]

    for tool_call in message.tool_calls:
        # Execute each function
        if tool_call.function.name == "get_weather":
            result = {"temperature": 22, "condition": "Clear"}
        elif tool_call.function.name == "get_time":
            result = {"time": "2026-02-23T15:30:00+09:00"}

        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result),
        })

    # Send all results back at once
    final = client.chat.completions.create(
        model="openai/gpt-4.1",
        messages=messages,
        tools=tools,
    )
    print(final.choices[0].message.content)

Вызовы инструментов потоковой передачи

При потоковой передаче вызовы инструментов поступают в виде частичных дельт, индексированных по позиции — строка аргументов каждой дельты накапливается по индексу до тех пор, пока Finish_reason не станет «tool_calls», что сигнализирует о завершении вызова.

# Streaming: tool_calls arrive as partial deltas indexed by position —
# accumulate function.arguments per index until finish_reason == "tool_calls".
stream = client.chat.completions.create(
    model="openai/gpt-4.1",
    messages=[{"role": "user", "content": "What's the weather in Taipei?"}],
    tools=tools,
    tool_choice="auto",
    stream=True,
)

tool_calls = {}
for chunk in stream:
    delta = chunk.choices[0].delta
    if delta.tool_calls:
        for tc in delta.tool_calls:
            entry = tool_calls.setdefault(tc.index, {"id": "", "name": "", "arguments": ""})
            if tc.id:
                entry["id"] = tc.id
            if tc.function.name:
                entry["name"] = tc.function.name
            if tc.function.arguments:
                entry["arguments"] += tc.function.arguments
    if chunk.choices[0].finish_reason == "tool_calls":
        for call in tool_calls.values():
            print(call["name"], json.loads(call["arguments"]))

Простой агентский цикл

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

# Generic loop: keep calling the model while it keeps requesting tools,
# stop once it returns a plain answer. max_iterations guards against loops.
messages = [{"role": "user", "content": "What's the weather in Taipei, and what time is it there?"}]
max_iterations = 10

for _ in range(max_iterations):
    response = client.chat.completions.create(
        model="openai/gpt-4.1",
        messages=messages,
        tools=tools,
    )
    message = response.choices[0].message
    messages.append(message)

    if not message.tool_calls:
        break  # model gave a final answer

    for tool_call in message.tool_calls:
        args = json.loads(tool_call.function.arguments)
        result = TOOL_MAPPING[tool_call.function.name](**args)
        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result),
        })
else:
    print("Warning: max_iterations reached without a final answer")

print(messages[-1].content)

Рекомендации по определению функций

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

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

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

Метод 1: формат_ответа (схема JSON)

для обеспечения строгого соответствия схеме JSON:

typeобязательно
string
Должен быть "json_schema"
json_schema.nameобязательно
string
A имя схемы (используется для кэширования)
json_schema.strict
boolean
Если это правда, гарантирует точное соответствие схемы.
json_schema.schemaобязательно
object
Определение схемы JSON
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":"user","content":"Review the movie Inception"}],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "movie_review",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {
            "title": {"type": "string"},
            "rating": {"type": "integer", "description": "Rating 1-10"},
            "summary": {"type": "string"},
            "pros": {"type": "array", "items": {"type": "string"}},
            "cons": {"type": "array", "items": {"type": "string"}}
          },
          "required": ["title", "rating", "summary", "pros", "cons"],
          "additionalProperties": false
        }
      }
    }
  }'

Советы

  • Используйте понятные, описательные имена свойств — модель использует их в качестве контекста.
  • Добавьте описания к свойствам схемы для управления моделью.
  • Set strict: true для гарантированного соответствия схемы (может немного увеличить задержку).
  • Сохраняйте простоту схем: глубокая вложенность схем может снизить качество вывода.
  • Протестируйте разные модели — некоторые справляются со сложными схемами лучше, чем другие.

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

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

curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-4.6",
    "messages": [
      {"role":"user","content":"What is the capital of France?"},
      {"role":"assistant","content":"The capital of France is"}
    ]
  }'
# Model continues: " Paris, known for the Eiffel Tower..."
Как это работает
BazaarLink сохраняет и пересылает последнее сообщение помощника. Поведение продолжения реализуется выбранной восходящей моделью и поставщиком, поэтому оно не гарантируется на каждом маршруте.

Преобразование сообщений

Автоматическое преобразование сообщений в соответствии с ограничениями контекста модели. Когда ваши сообщения выходят за рамки контекстного окна модели, преобразования разумно сжимают разговор, удаляя сообщения из середины.

Auto
Модели с контекстным окном, состоящим из 8 192 токенов или меньше, по умолчанию автоматически применяют средний выход. Чтобы отказаться, введите `transforms: []`. Чтобы включить любую модель, передайте `transforms: ["middle-out"]`.

Использование

// Enable middle-out on any model
{
  "model": "openai/gpt-4.1",
  "transforms": ["middle-out"],
  "messages": [
    { "role": "system", "content": "You are a helpful assistant." },
    ... // long conversation — middle will be trimmed to fit context
  ]
}

// Disable auto-trimming for small-context models
{ "transforms": [] }

Типы преобразования

Преобразование
Описание
middle-outУдаляет сообщения сначала с середины, сохраняя начало (системное приглашение, контекст) и конец (недавние сообщения).

Поведение по умолчанию

В моделях с контекстом ≤8k автоматически включается промежуточный выход. Для более крупных контекстных моделей включите это явно. Модели Anthropic Claude также автоматически обеспечивают ограничение в 1000 сообщений независимо от настроек преобразований.

Нулевое сохранение данных

BazaarLink по умолчанию не сохраняет содержимое вашего сообщения. На этой странице описывается, как обрабатываются ваши данные. Подходит для приложений, обрабатывающих конфиденциальные данные.

Обработка текущих данных

  • Содержимое сообщения: не сохраняется по умолчанию, удаляется из памяти после обработки
  • Метаданные платежных данных: количество токенов, временные метки, идентификаторы моделей.
  • Журналы использования: только запрос статистики, без содержания сообщений
  • Пересылка вверх по течению: сообщения пересылаются вышестоящим поставщикам — в соответствии с их политикой конфиденциальности. При кэшировании

Быстрое кэширование

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

Note
BazaarLink автоматически отслеживает экономию кэша и отражает ее в счетах. Поле `cached_tokens` в ответе показывает фактические попадания в кэш; `cacheDiscount` показывает сумму, сэкономленную по этому запросу.

Как это работает

Необходимость настройки кэширования зависит от поставщика. Модели семейства OpenAI автоматически кэшируют длинные повторяющиеся префиксы подсказок — никаких изменений запроса не требуется. Claude (Anthropic) моделирует кэширование только тогда, когда запрос содержит явную точку останова Cache_control; BazaarLink не добавляет это за вас, поэтому запрос Claude без маркера никогда не кэшируется. BazaarLink пересылает любые маркеры кэша, которые вы отправляете, как есть, и сообщает о результирующих токенах кэша read/write в ответе об использовании.

# OpenAI-family models: nothing to add, long repeated prefixes cache automatically.
response = client.chat.completions.create(
    model="openai/gpt-4.1",
    messages=[
        {"role": "system", "content": "You are an expert..."},  # cached automatically if long/repeated
        {"role": "user", "content": "Question here"},
    ],
)

# Check cache savings in the response usage
usage = response.usage
print(f"Prompt tokens: {usage.prompt_tokens}")
print(f"Cached tokens: {usage.prompt_tokens_details.cached_tokens}")
print(f"Cache savings: {usage.prompt_tokens_details.cached_tokens / usage.prompt_tokens * 100:.1f}%")
Claude требует явного маркера кэша_контроля.
Добавьте cache_control: {"type": "ephemeral"} в блок контента, который вы хотите кэшировать, как показано ниже. Anthropic также устанавливает собственную минимальную длину приглашения, прежде чем оно вообще будет кэшироваться — короткие приглашения автоматически пропускают кэширование даже при наличии маркера. Проверьте кэшированные_токены (OpenAI-shape) или кэш_read_input_tokens/cache_creation_input_tokens (Anthropic-shape) в ответе, чтобы подтвердить попадание.
# Claude models: you must mark the block to cache yourself.
response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[
        {
            "role": "system",
            "content": [
                {"type": "text", "text": "You are an expert...", "cache_control": {"type": "ephemeral"}}
            ],
        },  # BazaarLink does not add cache_control on your behalf
        {"role": "user", "content": "Question here"},
    ],
)

usage = response.usage
print(f"Cache read tokens: {getattr(usage, 'cache_read_input_tokens', 0)}")
print(f"Cache write tokens: {getattr(usage, 'cache_creation_input_tokens', 0)}")

Жетоны рассуждений

Модели рассуждения (например, серии DeepSeek R1, o1) думают внутренне, прежде чем дать окончательный ответ. Эти внутренние токены называются токенами рассуждения и оплачиваются отдельно.

Note
BazaarLink сообщает о токенах рассуждения в `usage.completion_tokens_details.reasoning_tokens` и показывает их отдельно в выставлении счетов.

Чтение жетонов рассуждения из ответов

response = client.chat.completions.create(
    model="deepseek/deepseek-r1",
    messages=[{"role": "user", "content": "Solve: if f(x) = x^2 + 3x, what is f(5)?"}],
)

# Read reasoning tokens from usage
usage = response.usage
print(f"Completion tokens: {usage.completion_tokens}")
if hasattr(usage, "completion_tokens_details"):
    details = usage.completion_tokens_details
    print(f"Reasoning tokens: {details.reasoning_tokens}")
    print(f"Output tokens: {details.accepted_prediction_tokens}")
const response = await client.chat.completions.create({
  model: "openai/o3-mini",
  messages: [{ role: "user", content: "Prove that sqrt(2) is irrational." }],
  // @ts-ignore - BazaarLink extension
  reasoning_effort: "high",  // low | medium | high
});

const usage = response.usage;
console.log("Reasoning tokens:", usage?.completion_tokens_details?.reasoning_tokens);

Управление режимом мышления

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

Семейство моделейПараметрПо умолчанию
qwen3-*enable_thinking: booleanfalse (платформа по умолчанию)
openai/o1, o3, o4-minireasoning_effort: "low" | "medium" | "high"medium
deepseek/deepseek-r1Всегда включено (невозможно отключить)
# Qwen3: explicitly enable thinking mode
response = client.chat.completions.create(
    model="qwen/qwen3-32b",
    messages=[{"role": "user", "content": "Prove the Pythagorean theorem"}],
    extra_body={"enable_thinking": True},  # opt-in to thinking
)

# usage.completion_tokens_details.reasoning_tokens shows thinking token count

Единый объект рассуждения (новый формат)

BazaarLink также поддерживает унифицированный объект рассуждения, который работает во всех семействах моделей с единым согласованным API:

ПолеЗначенияПрименяется к
reasoning.effort"xhigh" | "high" | "medium" | "low" | "none"OpenAI o-series, Grok
reasoning.max_tokensintegerAnthropic Claude, Gemini
reasoning.excludebooleanСкрыть мысли от ответа (модель все еще рассуждает)
// Claude extended thinking — specify thinking budget in tokens
const response = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.5",
  messages: [{ role: "user", content: "Prove the Pythagorean theorem" }],
  // @ts-ignore - BazaarLink extension
  reasoning: { max_tokens: 5000 },
});

// OpenAI o3 — specify effort level
const response2 = await client.chat.completions.create({
  model: "openai/o3",
  messages: [{ role: "user", content: "Solve this math problem..." }],
  // @ts-ignore - BazaarLink extension
  reasoning: { effort: "high" },
});

// Hide thinking content from response (model still thinks)
const response3 = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.5",
  messages: [{ role: "user", content: "What is 2+2?" }],
  // @ts-ignore - BazaarLink extension
  reasoning: { max_tokens: 2000, exclude: true },
});
Цены
Токены Thinking оплачиваются как токены завершения. Некоторые провайдеры взимают более высокую плату за режим мышления — Qwen3 стоит в 2 раза дороже стандартной цены, когда мышление активно. BazaarLink по умолчанию устанавливает для Qwen3 значение Enable_thinking=false, чтобы избежать непредвиденных затрат.

Задержка и производительность

Оптимизация задержки ответа AI API имеет решающее значение для удобства пользователей. Ниже приведены ключевые факторы, влияющие на задержку в архитектуре BazaarLink, а также рекомендации по оптимизации.

Note
BazaarLink записывает `duration_ms` (сквозная задержка) и `throughput` (tokens/sec) для каждого запроса — ищите их через GET /api/v1/generation?id=... или в экспорте действий CSV.

Факторы, влияющие на задержку

  • Размер модели: модели большего размера (70B+), как правило, генерируются медленнее.
  • Нагрузка поставщика: зависит от поставщика и времени суток.
  • Количество токенов: чем больше max_tokens, тем дольше время завершения
  • Потоковая передача и непотоковая передача: поток: true доставляет первый токен быстрее.
  • Длина контекста: очень длинные контексты увеличивают время предварительной обработки.

Советы по оптимизации

  • Предпочитайте потоковую передачу (stream: true), чтобы уменьшить воспринимаемую задержку.
  • Используйте вариант :nitro для выбора поставщиков с высокой пропускной способностью.
  • Выбирайте модели меньшего размера (flash/mini/haiku) для сценариев, чувствительных к задержке.
  • Используйте поставщик.sort: «задержка», чтобы автоматически выбирать поставщика с наименьшей задержкой.
  • Включите кэширование запросов, чтобы уменьшить задержку при повторных запросах.
import time

# Measure time to first token with streaming
start = time.time()
first_token_time = None

stream = client.chat.completions.create(
    model="google/gemini-2.5-flash",  # Fast model
    messages=[{"role": "user", "content": "Hello!"}],
    stream=True,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content and not first_token_time:
        first_token_time = time.time() - start

print(f"Time to first token: {first_token_time:.3f}s")
# Look up per-request latency and throughput after the fact, using the
# generation ID from the response (or the final streamed chunk).
curl "https://bazaarlink.ai/api/v1/generation?id=chatcmpl-abc123" \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY"

# Response
{
  "data": {
    "id": "chatcmpl-abc123",
    "model": "google/gemini-2.5-flash",
    "duration_ms": 842,
    "throughput": 61.2,
    "usage": { "prompt_tokens": 12, "completion_tokens": 48, "total_tokens": 60 }
  }
}
# Use provider.sort for automatic latency optimization
response = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
    extra_body={
        "provider": {
            "sort": "latency",  # Always pick lowest-latency provider
        }
    },
)

Оптимизация времени работы

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

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

Механизмы доступности

  • Автоматический выключатель: автоматически обнаруживает и изолирует неисправных поставщиков
  • Автоматическое переключение при сбое: плавное переключение на резервного поставщика — никаких изменений кода не требуется.
  • Мониторинг состояния поставщика: непрерывно отслеживает частоту ошибок и задержку для каждого поставщика.
  • Retry логика: временные ошибки (5xx) автоматически повторяются

Автоматический выключатель

# BazaarLink handles failover automatically — no code changes needed.
# Configure fallback models for maximum resilience:

response = client.chat.completions.create(
    model="openai/gpt-4o",       # Primary model
    messages=[{"role": "user", "content": "Hello!"}],
    extra_body={
        "models": [              # Fallback chain
            "openai/gpt-4o",
            "anthropic/claude-sonnet-4.6",
            "google/gemini-2.5-flash",
        ],
        "route": "fallback",     # Enable fallback routing
    },
)

# Check if failover was used (in usage logs)
# "is_failover": true indicates the primary provider was bypassed
Мониторинг состояния поставщика — это внутренний обзор операционной системы.
GET /api/admin/provider-health — это внутренняя конечная точка панели управления операциями, доступная для проверки подлинности администратора. Он возвращает полную рабочую нагрузку (объем запросов для каждого поставщика, частоту ошибок, процентили задержки, статистику отработки отказа и т. д.) — это не общедоступный клиент API, поэтому мы не воспроизводим здесь точные поля.

Ограждения

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

Текущий объем
Личные ключи API не имеют встроенных пользовательских ограждений — безопасность контента полностью зависит от собственных систем безопасности вышестоящего поставщика. Если вам нужны настраиваемые правила фильтрации контента (block/redact/flag, правила ключевых слов и регулярных выражений, встроенные шаблоны PII), создайте организацию и используйте ключ организации API, настроенный в разделе «Защиты фильтра контента».

Планируемые функции (пока недоступны ни для личных ключей, ни для ключей организации)

Ограждение
Описание
PII обнаружениеОбнаружение и редактирование личной информации
Ограничение темыОграничивать ответы моделей только утвержденными темами.
Проверка выводаПроверка выходных данных модели на соответствие пользовательским правилам перед возвратом.

Текущее поведение

Личные ключи API: все вышестоящие поставщики имеют свои собственные системы безопасности контента — ответы модели, запускающие фильтры контента, возвращаются с Finish_reason: «content_filter», а BazaarLink не применяет дополнительную фильтрацию. Ключи организации API: org_admin может настраивать пользовательские правила (block/redact/flag) в разделе «Защитные ограждения фильтра содержимого», применяемые до того, как текст достигнет модели.

Cursor IDE Интеграция

Используйте BazaarLink в качестве переопределения OpenAI курсора URL. Встроенная настройка с автоматическим преобразованием тел ответов API, нормализацией формата инструмента и соглашением о префиксе bz- для моделей Claude.

Быстрая настройка

В Курсоре откройте «Настройки» → «Модели», затем:

  1. Установите для переопределения OpenAI Base URL значение https://bazaarlink.ai/v1.
  2. Установите Override OpenAI API Key на ваш ключ sk-bl-... BazaarLink
  3. Добавьте желаемое название модели — см. ниже Claude (префикс bz-).
Обратная совместимость
Устаревшая версия URL https://bazaarlink.ai/v1/cursor все еще работает — теперь это тонкий реэкспорт /v1/chat/completions. В новых установках следует напрямую использовать /v1.

Префикс bz- (для моделей Claude)

Проверка Cursor на стороне клиента перенаправляет любое имя модели, начинающееся с claude-, посредством собственной интеграции Cursor с Anthropic, минуя переопределение URL. Чтобы заставить Cursor отправить запрос на BazaarLink, добавьте к имени модели префикс bz-. Сервер удаляет префикс и разрешает остальное через карту псевдонимов.

Введите курсорРешает:
bz-claude-sonnet-4.6anthropic/claude-sonnet-4.6
bz-claude-opus-4.7anthropic/claude-opus-4.7
gpt-4oopenai/gpt-4o
gemini-2.5-flashgoogle/gemini-2.5-flash

Варианты «точка-дефис» нормализованы: bz-claude-sonnet-4.6 и bz-claude-sonnet-4-6 разрешаются для одной и той же модели.

CURSOR_MODEL_MAP env var (переопределение оператора)

Для локальных развертываний BazaarLink установите эту переменную env, чтобы переназначить произвольные имена моделей на стороне курсора в канонические идентификаторы каталога:

CURSOR_MODEL_MAP=gpt-claude-sonnet:anthropic/claude-sonnet-4.6,gpt-opus:anthropic/claude-opus-4.7

Теперь gpt-claude-sonnet, введенный в курсор, сопоставляется с серверной стороной anthropic/claude-sonnet-4.6. Полезно, когда вы хотите, чтобы курсор считал модель семейством GPT (поэтому она маршрутизируется через переопределение URL), в то время как вы на самом деле обслуживаете Claude.

Что происходит автоматически

Когда запрос достигает /api/v1/chat/completions, BazaarLink прозрачно применяет эти преобразования совместимости — вам не нужно ничего делать на стороне клиента:

  • Автоматическое обнаружение тел ответов API — если тело содержит входные данные вместо сообщений, оно преобразуется в форму Chat Completions (курсор отправляет ответы в формате API для моделей семейства GPT).
  • Wraps определения плоского инструмента — агент курсора отправляет { имя, описание, параметры } без оболочки функции. Мы обертываем его так, чтобы Anthropic не отклонялся как «Инструмент», не найденный в предоставленных инструментах.
  • Приводит неверный инструмент Tool_choice — Курсор отправляет { type: "auto" } (форма объекта, без функции). Спецификация OpenAI требует строковой формы для auto/none/required, поэтому мы приводим.
  • Strips поля только для OpenAI при маршрутизации к поставщикам, не относящимся к OpenAI — Parallel_tool_calls, logprobs, top_logprobs, logit_bias, service_tier, user удаляются перед пересылкой (в противном случае Anthropic возвращает 400).
  • Maps max_output_tokens → max_tokens и полосы Responses-API-только поля (previous_response_id, усечение, фон, хранилище). Поле рассуждений сохраняется для тел, родных для Chat-Completions.

Режим агента курсора

Вызов инструментов осуществляется через стандартный поток вызова инструментов Chat Completions. Курсор отправляет инструменты (Shell, Read, Write, Grep и т. д.) с помощью Tool_choice: "auto"; BazaarLink перенаправляет выбранному вами провайдеру, который решает, следует ли вызывать инструмент. Вызовы инструментов возвращаются как стандартные OpenAItool_calls deltas; Курсор выполняется локально и продолжает диалог. Работает одинаково независимо от того, выбираете ли вы gpt-4o (родной OpenAI) или bz-claude-sonnet-4.6.

Отладка отклонений восходящего потока
Если вы видите ошибки поставщика 4xx, проверьте панель администратора «Состояние поставщика». Каждый ответ 4xx сохраняется с полным телом ошибки восходящего потока и сводкой тела перенаправленного нами запроса — щелкните любую строку 🔴, чтобы развернуть JSON.

Модель маршрутизации

BazaarLink использует формат provider/model-name для маршрутизации запросов к правильному вышестоящему поставщику. Это дает вам доступ ко всем основным моделям через единую конечную точку API.

Формат идентификатора модели

{provider}/{model-name}

# Examples
openai/gpt-5.4-mini
anthropic/claude-sonnet-4.6
google/gemini-3-flash-preview
deepseek/deepseek-v3.2

Приоритет маршрутизации

При отправке запроса BazaarLink разрешает вышестоящего поставщика в следующем порядке:

  1. Exact match — ищет маршрут модели, соответствующий полному идентификатору модели.
  2. Provider Подстановочный знак — возвращается к маршрутам поставщика/* (например, openai/*)
  3. Global wildcard — возвращается к * маршрутам с подстановочными знаками.
  4. Ключ поставщика по умолчанию — только для известной модели каталога, используются активированные ключи, помеченные как ключи по умолчанию.

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

Автомаршрутизатор

Auto Router v3 распределяет запрос по одному из 14 уровней задач, а затем использует текущую основную и резервную цепочку, настроенную для этого уровня. Платные и бесплатные столы управляются отдельно в консоли администратора.

  • auto — платная таблица маршрутизации. Успешно решенная модель оплачивается по опубликованной цене.
  • auto:free — свободная таблица маршрутизации. Звонки в пределах бесплатной квоты стоят 0$; после достижения квоты финансируемые аккаунты могут переключиться на платную автоматическую маршрутизацию, если не отключен платный резервный вариант.

Как использовать

Установите модель «auto» (платная) или «auto:free» (бесплатная), чтобы включить автоматическую маршрутизацию:

curl https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"auto","messages":[{"role":"user","content":"Review this TypeScript function"}]}'

Как версия 3 выбирает уровень

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

  • Оценка уровней: сообщения, инструменты, длина, ключевые слова и структурные сигналы, выберите один из 14 уровней.
  • Жесткие переопределения: видение, формальные рассуждения и специализированные задачи могут напрямую выбирать уровень.
  • Поиск маршрута: выбранный режим считывает текущий основной уровень и до пяти резервных; отключенный уровень возвращает 503
  • Execution: BazaarLink пробует основную, а затем настроенную резервную цепочку по порядку.
  • Отслеживание ответов: решенная модель возвращается в теле ответа и заголовке X-Auto-Resolved-Model.

Таблицы текущих моделей

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

auto

Tier
Primary
Fallbacks
State
simpleopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-haiku-4.5
enabled
standardgoogle/gemini-3-flash-preview
openai/gpt-5.4-minianthropic/claude-haiku-4.5
enabled
complexgoogle/gemini-3.1-pro-preview
anthropic/claude-sonnet-4.6openai/gpt-5.4-pro
enabled
reasoninganthropic/claude-opus-4.7
openai/gpt-5.4-progoogle/gemini-3.1-pro-preview
enabled
codingopenai/gpt-5.3-codex
anthropic/claude-sonnet-4.6openai/gpt-5.4-pro
enabled
visionopenai/gpt-5.4-image-2
enabled
imageopenai/gpt-5.4-image-2
enabled
videobytedance/seedance-2.0-fast
bytedance/seedance-2.0anthropic/claude-sonnet-4.6
enabled
dataopenai/gpt-5.4-pro
anthropic/claude-sonnet-4.6google/gemini-3.1-pro-preview
enabled
searchperplexity/sonar-pro
perplexity/sonar-reasoning-proopenai/gpt-5.4-pro
enabled
socialopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-haiku-4.5
enabled
emailopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-sonnet-4.6
enabled
calendaropenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-preview
enabled
tradinganthropic/claude-opus-4.7
openai/gpt-5.4-progoogle/gemini-3.1-pro-preview
enabled

auto:free

Tier
Primary
Fallbacks
State
simpledeepseek/deepseek-v4-flash
enabled
standarddeepseek/deepseek-v4-flash
enabled
complexminimax/minimax-m2.5
enabled
reasoningminimax/minimax-m2.5
enabled
codingdeepseek/deepseek-v4-flash
enabled
visionopenai/gpt-5.4-image-2
disabled
imageopenai/gpt-5.4-image-2
disabled
videogoogle/gemini-2.5-flash-lite
disabled
datadeepseek/deepseek-v4-flash
enabled
searchminimax/minimax-m2.5
enabled
socialdeepseek/deepseek-v4-flash
enabled
emaildeepseek/deepseek-v4-flash
enabled
calendardeepseek/deepseek-v4-flash
enabled
tradingdeepseek/deepseek-v4-flash
enabled

Выбранные модели имеют ограниченный по скорости уровень бесплатного пользования. Бесплатное право на участие предоставляется платформой для каждой модели — назовите модель по ее обычному идентификатору; суффикс :free является необязательным псевдонимом (добавление его к платной модели не делает ее бесплатной).

После исчерпания бесплатной квоты
Как только квота будет израсходована, запросы будут автоматически продолжаться по оплаченной цене модели до тех пор, пока на вашем счете есть баланс — никаких перерывов в обслуживании, оплата взимается точно так же, как и любой платный звонок. Если вы предпочитаете потерпеть неудачу, чем получить счет, отправьте заголовок X-Free-Fallback: false или отключите автоматический резервный вариант в настройках ключа; вместо этого вы получите 429. При отсутствии баланса запросы на превышение квоты всегда возвращают 429.
X-Auto-Resolved-Model
Фактическая выбранная модель возвращается в заголовке ответа X-Auto-Resolved-Model и в поле модели тела ответа.

Варианты модели

Добавьте суффикс к любому идентификатору модели, чтобы изменить поведение маршрутизации. BazaarLink поддерживает 7 типов вариантов.

Варианты типов
Существует две категории вариантов: независимые идентификаторы модели (модель с суффиксом является отдельной конечной точкой) и ярлыки маршрутизации (суффикс изменяет способ выбора поставщика BazaarLink без изменения самой модели).

Независимые идентификаторы моделей

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

:free
:extended
:thinking
:exacto

Ярлыки маршрутизации

Эти суффиксы изменяют выбор поставщика без изменения идентификации модели. Суффикс удаляется перед сопоставлением маршрутов.

:floor   # lowest listed input price first
:nitro   # throughput-oriented shortcut
:online  # enable web-search routing

Поведение нескольких поставщиков

Для восходящих потоков, поддерживающих варианты, суффиксы передаются как есть. Для прямых поставщиков (например, прямых OpenAI, Fireworks) суффикс удаляется, и BazaarLink обрабатывает маршрутизацию локально.

Бесплатные модели

Выбранные модели имеют ограниченный по скорости уровень бесплатного пользования. Бесплатное право на участие предоставляется платформой для каждой модели — назовите модель по ее обычному идентификатору; суффикс :free является необязательным псевдонимом (добавление его к платной модели не делает ее бесплатной).

  • Вызовите обычный идентификатор модели (например, deepseek/deepseek-v4-flash). Запросы автоматически обслуживаются бесплатно в пределах бесплатной квоты.
  • Бесплатное использование для каждого пользователя ограничено количеством запросов в минуту и ​​дневным лимитом. Ограничения масштабируются в зависимости от уровня учетной записи (без кредита/зачислено).
  • Если вы превысите бесплатную квоту и у вас появятся кредиты, запросы автоматически перейдут на платный уровень по указанной цене. Отправьте X-Free-Fallback: false, чтобы отключить автоматический возврат и вместо этого получить 429. Без кредитов запросы на превышение квоты возвращают 429.
  • GET /api/v1/models перечисляет запись :free для каждой модели с уровнем бесплатного пользования; auto:free всегда маршрутизирует к свободной модели.

Модели с бесплатным уровнем прямо сейчас

Вызовите эти идентификаторы моделей напрямую, чтобы использовать бесплатную квоту. Список меняется по мере добавления или удаления моделей — запросите API для получения актуального набора.

deepseek/deepseek-v4-flash

Бесплатные ограничения квоты

Предмет
Значение
Запросов в минуту (RPM)10 / min
Дневной бюджет запроса150 / day
Множитель уровня аккаунта — без кредита× 1
Множитель уровня аккаунта — финансируемый× 3

Ваш дневной бюджет = дневной бюджет запроса выше × множитель уровня вашего аккаунта, рассчитываемый отдельно для каждой бесплатной модели. auto:free дополнительно обеспечивает ограничение количества параллельных IP-адресов. Отдельные модели могут иметь более жесткие или более мягкие ограничения, установленные платформой — в блоке «Уровень бесплатного пользования» на странице модели всегда отображаются действующие значения.

После исчерпания бесплатной квоты

Как только квота будет израсходована, запросы будут автоматически продолжаться по оплаченной цене модели до тех пор, пока на вашем счете есть баланс — никаких перерывов в обслуживании, оплата взимается точно так же, как и любой платный звонок. Если вы предпочитаете потерпеть неудачу, чем получить счет, отправьте заголовок X-Free-Fallback: false или отключите автоматический резервный вариант в настройках ключа; вместо этого вы получите 429. При отсутствии баланса запросы на превышение квоты всегда возвращают 429.

# Return 429 instead of switching to paid routing
-H "X-Free-Fallback: false"

Управление организацией

Когда несколько человек используют BazaarLink, создайте организацию, чтобы группировать участников в команды и управлять ключами API, разрешенными моделями, бюджетами и выставлением счетов в одном месте. Организация владеет общим балансом, а команды и участники могут иметь свои собственные ежемесячные лимиты.

Управляйте своей организацией
Чтобы добавить команды, пригласить участников или изменить настройки организации, Откройте настройки и выберите организацию.

Трехуровневая бюджетная система

Каждый запрос API проверяет ограничения участников, команд и организаций. Ошибка ежемесячного бюджета или баланса возвращает HTTP 402; расход аварийного торможения возвращает HTTP 429.

  1. Member ежемесячный бюджет (OrgMember.monthlyBudget)
  2. Ежемесячный бюджет команды (Team.monthlyBudget)
  3. Org баланс кредитов (Организация.кредиты)

Отчеты об использовании

Откройте организацию и выберите «Отчеты», чтобы просмотреть ежемесячные расходы четырьмя способами:

  • Обзор: общие расходы, ставка маржи, график дневных тенденций
  • По команде: расходы на каждую команду, процент доли, разбивка по модели, использование бюджета.
  • By Model: расходы на модель, средняя цена ($/1 млн токенов)
  • По участнику: расходы на каждого участника — только org_admin

Все представления поддерживают экспорт CSV с префиксом BOM для прямой совместимости с Excel.

Создание организаций и управление ими

  1. Откройте «Настройки» и создайте организацию в разделе «Организации».
  2. Выберите название организации, чтобы открыть раздел управления
  3. Создавайте группы и при необходимости назначайте коды центров затрат и ежемесячные бюджеты.
  4. Пригласите участников по электронной почте, назначьте роль и команду.
  5. Issue API ключи для участников — использование автоматически помечается правильной командой/участником.
  6. Просмотрите страницу отчетов, чтобы узнать ежемесячные расходы с разбивкой по команде, модели или участнику.

Роли участников

org_adminАдминистратор организации. Управляет всеми командами, участниками, ключами API, разрешенными моделями, бюджетами, выставлением счетов, отчетами, настройками и экстренными тормозами.
billing_viewerПросмотрщик финансов. Может просматривать обзор, выставление счетов, список ключей API и отчеты, но не может изменять настройки или просматривать расходы на каждого участника.
команда_adminАдминистратор команды. Управляет только членами своей команды, приглашениями, ключами API, бюджетами и аварийными тормозами.
членПостоянный участник. Использует назначенные организации ключи API и подчиняется ограничениям участников, команд, организаций и моделей.

Чем еще может управлять организация?

Помимо участников и команд, область управления организацией обеспечивает:

  • API ключи: создавайте ключи для организации, команды или участника и ограничивайте их разрешенные модели.
  • Фильтрация контента: блокируйте, редактируйте или регистрируйте конфиденциальный текст до того, как он достигнет модели.
  • Разрешенные модели: ограничение моделей для организации, команды, участника или отдельного ключа API.
  • Бюджеты и экстренное торможение: установите ежемесячные лимиты и minute/hour защитите расходы
  • Отчеты и выставление счетов: просмотр расходов, использования модели, распределения команд, баланса, кредитных лимитов и платежей.
  • Журналы изменений и безопасности: отслеживание изменений настроек, попаданий в фильтры содержимого и событий безопасности.
  • Планы учреждения: организации образования могут дополнительно управлять студенческими сессиями и квотами

Контентная фильтрация

Это правила, принадлежащие организации, которые проверяют текст перед его отправкой в модель через ключ организации API. Администратор организации может включать, редактировать и тестировать правила в разделе «Настройки» → «Фильтрация контента».

  • block: отклонить весь запрос с помощью HTTP 403 до того, как он достигнет модели.
  • отредактировать: заменить совпавший текст на [REDACTED], затем отправить очищенный текст
  • flag: отправить запрос без изменений и записать совпадение в журнал аудита организации.
  • Используйте встроенные шаблоны конфиденциальных данных и ввода подсказок или создавайте правила для ключевых слов и регулярных выражений.
  • До 100 правил; регулярные выражения проверяются на безопасность, а правила можно просмотреть с помощью тестового текста.
В настоящее время ограничено вводом текста
Filtering в настоящее время охватывает текст Chat Completions, строковый ввод в ответах и текстовое содержимое в сообщениях. Изображения, аудио, видео, некоторый структурированный или мультимодальный контент, а также выходные данные модели не проверяются. Не рассматривайте это как полное предотвращение потери данных или модерацию вывода.

Управление API (v1)

Используйте элемент управления API, чтобы составлять список организаций, создавать команды, добавлять участников или обновлять бюджеты, не нажимая на веб-интерфейс. `/api/v1/orgs` управляет организацией и участниками; отчеты о затратах используют отдельные пути `/api/orgs/:orgId/reports/*`, указанные ниже.

Аутентификация
GET /api/v1/orgs перечисляет организации, принадлежащие владельцу ключа, и принимает действительный ключ API или сеанс входа. Для запросов на чтение или изменение конкретной организации, команды или участника требуется ключ управления носителем, принадлежащий org_admin, или сеанс входа в систему этого org_admin. Создайте ключ управления на странице ключей организации API.

Организации

GET/api/v1/orgs

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

GET/api/v1/orgs/:orgId

Получите подробную информацию об организации, включая количество команд и участников.

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

Команды

GET/api/v1/orgs/:orgId/teams

Список команд с указанием количества участников, упорядоченных по имени.

POST/api/v1/orgs/:orgId/teams
nameобязательно
string
Отображаемое имя группы (должно быть уникальным в пределах организации)
costCenterCode
string
Код учетного МВЗ
monthlyBudget
number | null
Ограничение ежемесячных расходов команды в USD
PATCH/api/v1/orgs/:orgId/teams/:teamId

Частичное обновление — включает только те поля, которые нужно изменить.

DELETE/api/v1/orgs/:orgId/teams/:teamId
# Create a team
curl https://bazaarlink.ai/api/v1/orgs/{orgId}/teams \
  -X POST \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Engineering", "costCenterCode": "ENG-001", "monthlyBudget": 500}'

Члены

GET/api/v1/orgs/:orgId/members

Перечислите всех участников с вложенным пользователем (id/name/email) и информацией о команде.

POST/api/v1/orgs/:orgId/members
emailобязательно
string
Электронная почта существующего пользователя BazaarLink
role
string
org_admin | биллинг_просмотрщик | команда_администратор | участник (по умолчанию: участник)
teamId
string
Назначить команду (обязательно, если роль — team_admin)
monthlyBudget
number | null
Ограничение ежемесячных расходов на одного участника в USD

404, если у адреса электронной почты нет учетной записи BazaarLink. 409, если вы уже являетесь участником. Роль по умолчанию: участник.

PATCH/api/v1/orgs/:orgId/members/:memberId

Частичное обновление роли, идентификатора команды или ежемесячного бюджета.

DELETE/api/v1/orgs/:orgId/members/:memberId

Возвращает 400, если целью является последний org_admin.

# Add a member
curl https://bazaarlink.ai/api/v1/orgs/{orgId}/members \
  -X POST \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "alice@example.com", "role": "member", "monthlyBudget": 50}'

# Remove a member
curl https://bazaarlink.ai/api/v1/orgs/{orgId}/members/{memberId} \
  -X DELETE \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

Отчеты API

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

Укажите год и месяц (1–12). Обзор и по команде по умолчанию относятся к текущему месяцу, если они опущены, тогда как для по модели, по участнику и экспорта требуются оба значения. Предоставление обоих каждый раз позволяет избежать сюрпризов, связанных с конечной точкой.

Конечная точка
Описание
GET /api/orgs/:orgId/reports/overviewОбщие расходы, ставка маржи, дневной тренд
GET /api/orgs/:orgId/reports/by-teamРасходы на команду, доля %, разбивка по модели, использование бюджета
GET /api/orgs/:orgId/reports/by-modelРасходы на модель, средняя цена ($/1 млн токенов)
GET /api/orgs/:orgId/reports/by-memberРасходы на каждого участника — только org_admin
GET /api/orgs/:orgId/reports/exportCSV скачать; добавить ?view=обзор|по команде|по модели|по участнику
# Monthly overview via management key
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/overview?year=2026&month=3" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

# By-team breakdown
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/by-team?year=2026&month=3" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

# Export CSV (downloads file)
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/export?year=2026&month=3&view=by-team" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -o report.csv

Ссылка на ответ об ошибке

401Ключ API недействителен или отозван
403Отказ RBAC (недостаточная роль) или модель не в белом списке разрешенных моделей
402Ежемесячный бюджет, кредитный лимит или доступный баланс недостаточны
429Ограничение скорости или ограниченное использование аварийного торможения; следовать Retry-After, если он присутствует
503Экстренное торможение или временное отключение обслуживания на всей платформе.

Разрешенные модели (белый список)

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

Как это работает

  • Три независимых уровня — Организация, Команда, Участник — каждый содержит свой собственный список (String[] в базе данных).
  • Когда все три слоя пусты, разрешена любая модель (поведение по умолчанию).
  • Если один или несколько слоев непусты, эффективный список представляет собой пересечение непустых слоев — модель должна быть разрешена для прохождения на каждом ограниченном уровне.
  • Изменения вступают в силу в течение нескольких секунд (60 секунд в памяти + 5 минут в кэше Redis; оба очищаются при обновлении).

Формат шаблона

  • Точное совпадение — например. openai/gpt-4o (только эта модель).
  • Подстановочный знак поставщика — например. openai/* (любая модель с префиксом openai/).
  • Только строчные буквы. Макс. 200 записей в списке, 100 символов в записи.

Где управлять

Организационный портал → Разрешенные модели. org_admin может редактировать списки организаций/команд/членов; Team_admin может редактировать свою команду и ее участников.

Ошибка ответа при блокировке

Вызовы запрещенной модели возвращают HTTP 403 со следующим телом:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{
  "error": {
    "message": "Model is not allowed for this account",
    "code": "model_not_allowed"
  }
}

Управление API

Все конечные точки принимают ключ управления веб-сеансом или носителем (sk-bl-...). PATCH заменяет весь список; передайте [] для очистки.

# Org-level list
GET    /api/orgs/:orgId/allowed-models
PATCH  /api/orgs/:orgId/allowed-models

# Team-level list
GET    /api/orgs/:orgId/teams/:teamId/allowed-models
PATCH  /api/orgs/:orgId/teams/:teamId/allowed-models

# Member-level list
GET    /api/orgs/:orgId/members/:memberId/allowed-models
PATCH  /api/orgs/:orgId/members/:memberId/allowed-models

# Example: restrict an org to OpenAI + a specific Anthropic model
curl -X PATCH https://bazaarlink.ai/api/orgs/$ORG_ID/allowed-models \
  -H "Authorization: Bearer sk-bl-..." \
  -H "Content-Type: application/json" \
  -d '{"allowedModels": ["openai/*", "anthropic/claude-sonnet-4.6"]}'

Автоматический выключатель (выключатель расхода)

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

Как это работает

  • В Redis отслеживаются два фиксированных окна для каждой области: стоимость восходящего потока за 1 минуту и ​​1 час (USD).
  • Если расходы какого-либо окна достигают порогового значения, все последующие запросы в этой области отклоняются до тех пор, пока окно не будет перезагружено.
  • По умолчанию: 5 долларов США в минуту, 20 долларов США в час, включено по умолчанию.
  • Counters живут в Redis с помощью TTL — восстановление происходит автоматически, ручной сброс не требуется для поездок org/team/участника.

Scopes (участник переопределяет команду, переопределяет организацию)

Каждый слой может устанавливать свои собственные пороговые значения. Порядок разрешения следующий: участник → команда → организация → платформа по умолчанию — первое ненулевое значение выигрывает для каждого поля (cbEnabled, cbMinuteUsd, cbHourlyUsd). Уровень

  • Org — применяется ко всем ключам организации. Устанавливается в Оргпортале → Выключатель.
  • Уровень команды — применяется ко всем ключам, помеченным этой командой. Переопределяет org для этих ключей. Уровень
  • Member — применяется только к ключам, помеченным для этого участника. Переопределяет команду и организацию.

Поведение при отключении

При отключении запросы быстро завершаются сбоем (восходящий вызов не выполняется). Ответ — HTTP 429 с таким телом:

HTTP/1.1 429 Too Many Requests
Content-Type: application/json

{
  "error": {
    "message": "Spend circuit breaker tripped at member scope (minute window: $5.2341 ≥ $5.00). Try again later or contact your organization owner."
  }
}
Глобальный или ограниченный масштаб
A отдельный глобальный автоматический выключатель всей платформы (управляемый оператором, не видимый на портале организации) возвращает HTTP 503 с заголовком Retry-After. Операторы установили его для защиты платформы от злоупотреблений со стороны нескольких арендаторов — его нельзя переопределить в настройках вашей организации.

Журнал аудита

Записывается каждое событие отключения и каждое изменение конфигурации:

  • Trip события — действия org.cb.tripped/team.cb.tripped/org_member.cb.tripped. Дедуплицируется до одной записи на область + окно в час, поэтому продолжительное отключение не переполняет журнал.
  • Изменения конфигурации — действия org.cb.update/team.cb.update/org_member.cb.update. Захватите значения before/after плюс актер.

Управление API

Администраторы организации могут читать и обновлять настройки через API. Все конечные точки принимают ключ управления веб-сеансом или носителем (sk-bl-...). Отправьте любое подмножество полей в теле PATCH; null очищает поле и возвращается к родительскому слою.

# Org-level config
GET    /api/orgs/:orgId/circuit-breaker
PATCH  /api/orgs/:orgId/circuit-breaker

# Team-level config
GET    /api/orgs/:orgId/teams/:teamId/circuit-breaker
PATCH  /api/orgs/:orgId/teams/:teamId/circuit-breaker

# Member-level config
GET    /api/orgs/:orgId/members/:memberId/circuit-breaker
PATCH  /api/orgs/:orgId/members/:memberId/circuit-breaker

# Example: tighten the org-level cap to $2/min, $10/hr
curl -X PATCH https://bazaarlink.ai/api/orgs/$ORG_ID/circuit-breaker \
  -H "Authorization: Bearer sk-bl-..." \
  -H "Content-Type: application/json" \
  -d '{"cbMinuteUsd": 2, "cbHourlyUsd": 10, "cbEnabled": true}'

# GET response (org scope)
{
  "settings":         { "cbEnabled": true, "cbMinuteUsd": 2,  "cbHourlyUsd": 10  },
  "resolvedSettings": { "cbEnabled": true, "cbMinuteUsd": 2,  "cbHourlyUsd": 10  },
  "liveSpend":        { "minuteSpend": 0.4123, "hourSpend": 3.8721 }
}

API Поворот ключа

Регулярная смена ключей API — это лучшая практика обеспечения безопасности. BazaarLink поддерживает ротацию ключей без простоев — сначала создайте новый ключ, затем перенесите его, а затем отзовите старый. Ключи

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

Этапы вращения

  1. Создайте новый ключ API.
  2. Обновите приложение или переменные окружения, чтобы использовать новый ключ
  3. Убедитесь, что новый ключ работает правильно.
  4. Отключить или удалить старый ключ
# Key CRUD via Bearer auth requires a MANAGEMENT key (keyType: "management").
# Standard keys get 403 on /api/v1/keys — create a management key first,
# or rotate keys from the dashboard UI instead.

# Step 1: Create new key (management key auth)
POST https://bazaarlink.ai/api/v1/keys
Authorization: Bearer $BL_MANAGEMENT_KEY
{"name": "Production v2"}
# → saves new key: sk-bl-NEW_KEY_VALUE

# Step 2: Update your application
# export BAZAARLINK_API_KEY=sk-bl-NEW_KEY_VALUE

# Step 3: Verify new key works
curl https://bazaarlink.ai/api/v1/models \
  -H "Authorization: Bearer sk-bl-NEW_KEY_VALUE"

# Step 4: Revoke old key (management key auth again)
DELETE https://bazaarlink.ai/api/v1/keys/:old_key_id
Authorization: Bearer $BL_MANAGEMENT_KEY

Экспорт активности

Загрузите полную историю использования API как CSV для финансового аудита, анализа затрат или составления отчетов о соответствии.

CSV Экспорт

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

CSV

Column
Description
dateISO 8601 timestamp (UTC)
modelModel ID (e.g. openai/gpt-4o)
providerUpstream provider name
prompt_tokensInput token count
completion_tokensOutput token count
total_tokensTotal tokens (prompt + completion)
reasoning_tokensReasoning tokens (o-series / thinking models)
cached_tokensPrompt cache hit tokens
cost_usdCost in USD credits
duration_msEnd-to-end latency in milliseconds
finish_reasonstop / length / content_filter / error
statusHTTP status code from upstream
app_nameX-Title header value (app attribution)

JSON Использование API

Для программного доступа запросите агрегированную статистику, сгруппированную по периоду, модели или ключу:

# Query usage data (grouped / aggregated)
GET https://bazaarlink.ai/api/v1/usage
Authorization: Bearer sk-bl-YOUR_KEY

# With period filtering (day | week | month | year)
GET https://bazaarlink.ai/api/v1/usage?period=month

# Response
{
  "period": "month",
  "since": "2025-01-01T00:00:00.000Z",
  "credits": 10.5000,
  "totals": {
    "spend": 0.1812,
    "requests": 309,
    "tokens": 161200,
    "promptTokens": 95000,
    "completionTokens": 66200
  },
  "byModel": [{ "model": "openai/gpt-4o", "spend": 0.0028, "tokens": 1200, "requests": 5 }],
  "byKey":   [{ "keyName": "My Agent", "spend": 0.0028, "tokens": 1200, "requests": 5 }],
  "byApp":   [{ "appName": "MyApp", "spend": 0.0015, "tokens": 600, "requests": 3 }],
  "timeSeries": [{ "date": "2025-01-15", "model": "openai/gpt-4o", "cost": 0.0012, "tokens": 500, "requests": 2 }]
}

Учет использования

Запросите подробную статистику использования через API, включая потребление токенов, анализ затрат и историю запросов.

Примечание
Счет за использование данных выставляется в формате USD. Записи отдельных запросов доступны на странице журналов или с помощью экспорта CSV. Агрегированная статистика (по периоду, модели или ключу) доступна через конечную точку `/api/v1/usage` с аутентификацией по токену носителя.

Справочник по полю ответа

FieldTypeDescription
modelstringModel ID used (e.g., openai/gpt-4o)
providerstringUpstream provider name
prompt_tokensnumberInput tokens consumed
completion_tokensnumberOutput tokens generated
total_tokensnumberTotal tokens (prompt + completion)
reasoning_tokensnumberReasoning tokens (for thinking models)
cached_tokensnumberPrompt tokens served from cache
costnumberTotal cost in USD credits
duration_msnumberEnd-to-end latency in milliseconds
throughputnumberGeneration speed in tokens/sec
finish_reasonstringstop | length | content_filter | error
statusnumberHTTP status code from upstream
app_namestring | nullApplication name (X-Title header)
key_namestringAPI key name used for the request
import httpx

# Aggregated stats (Bearer token — period: day | week | month | year)
response = httpx.get(
    "https://bazaarlink.ai/api/v1/usage",
    headers={"Authorization": "Bearer sk-bl-YOUR_KEY"},
    params={"period": "month"},
)

data = response.json()
totals = data["totals"]
print("This month: US$%.4f  (%d requests)" % (totals["spend"], totals["requests"]))

# Cost breakdown by model
for m in data["byModel"]:
    print("  %s: US$%.4f  (%d reqs, %d tokens)" % (m["model"], m["spend"], m["requests"], m["tokens"]))

План учреждения

План учреждения позволяет любому учреждению (школе, предприятию, конференции, правительству и т. д.) выдавать своим членам краткосрочные токены сеанса с помощью одного ключа уровня организации. Участникам не нужно создавать учетную запись платформы. Организация контролирует, какие участники могут запрашивать токены по домену электронной почты (например, nthu.edu.tw); все использование выставляется на счет организации. На этой странице в качестве примера используется образовательный сценарий — тот же механизм работает для любого учреждения, которому требуется краткосрочный многопользовательский временный доступ.

Для кого это?
Учреждения (школы, предприятия, конференции, государственные учреждения и т. д.), которые хотят предоставить группе участников доступ к AI API без создания индивидуальных учетных записей и без раздачи долгоживущих ключей API.

Обзор архитектуры

  • Ключ учрежденияНачинается с sk-edu-. Создано администратором организации на странице ключей организации. Невозможно использовать напрямую в качестве токена-носителя для вызова API — прямые вызовы возвращают 403.
  • Токен сеанса участникаНачинается с edu-sess-. Участники получают его после проверки электронной почты. Время жизни по умолчанию составляет 24 часа; может быть отозван администратором организации.
  • Разрешенные доменыОрганизация настраивает, какие домены электронной почты (точное совпадение, без обхода суффикса) могут запрашивать сеанс.
  • Атрибуция использованияВсе запросы учащихся выставляются на счет организации. Использование можно просмотреть для каждого сеанса и для каждого электронного письма на панели управления организации.

Шаг 1. Запрос на активацию плана учреждения

Свяжитесь с отделом продаж или поддержки BazaarLink (sales@bazaarlink.ai / support@bazaarlink.ai) и сообщите нам, что ваша организация хочет включить институциональный план со списком разрешенных доменов электронной почты (например, nthu.edu.tw). Мы активируем функцию для вашей организации:

{
  "orgType": "education",
  "eduConfig": {
    "allowedDomains": ["nthu.edu.tw", "student.nthu.edu.tw"],
    "sessionTtlSeconds": 86400,
    "verificationTtlSeconds": 900,
    "maxSessionsPerEmailPerKey": 5
  }
}
Соответствие домена точное
nthu.edu.tw соответствует только @nthu.edu.tw — он не будет соответствовать @nthu.edu.attacker.com. Субдомены должны быть указаны явно (например, Student.nthu.edu.tw).

Шаг 2. Администратор организации создает ключ учреждения.

На странице «Ключи» организации API выберите «Образование» в качестве типа ключа при создании нового ключа (это внутреннее кодовое имя для ключа учреждения). Система генерирует ключ sk-edu-... и показывает его ONCE — сохраните его и распространите по официальным каналам членам этой организации.

Шаг 3. Участник запрашивает код подтверждения.

Участники могут запросить проверочный код двумя способами: (а) посетить / получить доступ и ввести ключ учреждения + свой институциональный адрес электронной почты — страница вызывает для них API; (б) напрямую вызвать API:

POST/api/edu/request-code
curl -X POST https://bazaarlink.ai/api/edu/request-code \
  -H "Content-Type: application/json" \
  -d '{
    "key": "sk-edu-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "email": "alice@nthu.edu.tw"
  }'

# Success (incl. unknown key/email — enumeration defence) → {"ok":true,"sent":true}
# Rate limit / resend cooldown → 429 {"error":"rate_limited"} or {"error":"cooldown"}
# Sends a 6-digit verification code to the email; default 15-minute lifetime
Антиперечисление
Код запроса всегда возвращает 202 независимо от того, существует ли ключ или разрешен ли домен электронной почты, что не позволяет злоумышленникам проверить, какие ключи учреждения существуют. Неудачные попытки записываются в журнал аудита организации.

Шаг 4. Участник отправляет код для обмена на токен сеанса.

POST/api/edu/verify
curl -X POST https://bazaarlink.ai/api/edu/verify \
  -H "Content-Type: application/json" \
  -d '{
    "key":   "sk-edu-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "email": "alice@nthu.edu.tw",
    "code":  "646291"
  }'

# Success → 200
{
  "token":     "edu-sess-827d11a1ec67d175cfd4f67f929261f4",
  "expiresAt": "2026-05-04T11:16:00.163Z",
  "organization": { "id": "...", "name": "NTHU AI Lab" }
}

# Wrong code → 400 {"error":"invalid"}
# 5 wrong attempts → 429 {"error":"too_many_attempts"} (code invalidated; re-request)

Шаг 5. Используйте токен сеанса для вызова API.

Используйте токен edu-sess-... в качестве токена-носителя для любой конечной точки чата/завершения/встраивания:

curl -X POST https://bazaarlink.ai/api/v1/chat/completions \
  -H "Authorization: Bearer edu-sess-827d11a1ec67d175cfd4f67f929261f4" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-haiku-4.5",
    "messages": [{"role": "user", "content": "Hello"}]
  }'
sk-edu-ключи нельзя использовать напрямую
Отправка sk-edu-... непосредственно в качестве токена носителя в конечную точку чата возвращает:
403 — Education keys cannot be used directly. Visit /access to exchange for a session.
Это преднамеренные обратные ворота — они не позволяют учреждению передавать долгоживущие ключи отдельным членам.

Панель управления организации: мониторинг и отзыв

Организации образовательного типа получают вкладку «Образование» на боковой панели навигации, на которой представлены:

  • НастройкиНастройте разрешенные домены, TTL, максимальное количество сеансов на одно письмо для каждого ключа, а также квоты на запрос / токен / USD для каждого сеанса.
  • СессииСписок всех активных/истекших/отмененных сессий; фильтровать по электронной почте; отменить отдельные сеансы.
  • Статистика использованияКоличество вызовов за сеанс, потребление токенов и накопленная стоимость.

Безопасность и ограничения

ПредметПо умолчаниюОписание
Сеанс TTL24 часаСрок действия токена сеанса; истекшие сеансы требуют повторной проверки.
Код подтверждения TTL15 минутСрок действия кода подтверждения электронной почты.
Длина кода проверки6 цифрХранится в Redis как хэш HMAC-SHA256, а не в виде открытого текста.
Угадай предел5 попытокВ остальном код немедленно становится недействительным.
Время восстановления кода запроса60 секундМинимальный интервал между повторными запросами одного и того же (ключа, электронной почты).
Ограничение скорости на IP-адрес10 / 15 мин.Антиспам.
Ограничение скорости на ключ100/часПредотвращает массовую рассылку электронных писем.
Максимальное количество сеансов на одно письмо5Настраивается в eduConfig; предотвращает накопление токенов в одном почтовом ящике.
Распространение отзыва≤ 60 секундL1/L2 кэш TTL; после отзыва БД распространение на все узлы занимает до 60 секунд.

Атрибуция выставления счетов и использования

Все запросы, выполненные с помощью токенов сеанса, выставляются на 100 % счет организации, владеющей ключом учреждения, в соответствии с тем, как вышестоящие поставщики (OpenAI / Anthropic / и т. д.) выставляют счета (за токен). Панель мониторинга организации поддерживает детализацию по сеансам, электронной почте и ключам.

Пожаловаться на отзыв

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

Как сообщить

Канал
Наилучший вариант для
Время ответа
Страница контактовОбщие отзывы, пожелания по функциям1-2 рабочих дня
Электронная почтаОтчеты об ошибках, технические проблемыВ течение 24 часов
API Заголовки ответовАвтоматические отчеты об ошибках и показателяхАвтоматическая

Что включить

  • Идентификатор запроса (из поля идентификатора ответа)
  • Использованная модель и отправленные параметры
  • Ожидаемое и фактическое поведение
  • Временные метки и частота возникновения проблем
  • Сообщения об ошибках или коды состояния HTTP

Посетите нашу страницу контактов, чтобы оставить отзыв.

FAQ

Чем BazaarLink отличается от прямого вызова OpenAI?
BazaarLink обеспечивает выставление счетов USD с ценами, указанными в NTD, унифицированными счетами, поддержкой в ​​Китае и единым API для всех основных моделей. Вы можете получить доступ к OpenAI, Anthropic, Google и другим сервисам с помощью одного и того же кода.
Нужно ли мне изменить существующий код?
Просто измените базовый ключ URL и API. Все остальные настройки (кроме идентификаторов моделей) остаются неизменными.
Хранит ли BazaarLink мои сообщения?
По умолчанию мы не сохраняем содержимое сообщений. Мы регистрируем количество токенов и временные метки только для целей выставления счетов.
Как мне получить единый счет (統一發票)?
Корпоративные клиенты, выставляющие ежемесячные счета, получают единый тайваньский электронный счет (統一發票, включая идентификационный номер налогоплательщика) в каждом платежном цикле. Пополнения счета с оплатой по мере использования через Stripe в настоящее время генерируют только квитанцию ​​Stripe — свяжитесь с отделом продаж, чтобы перейти на ежемесячное выставление счетов, если вам нужен тайваньский электронный счет.
Какие способы оплаты поддерживаются?
Принимаются все основные кредитные карты (Visa, Mastercard, American Express).
Какие функции OpenAI SDK поддерживаются?
Завершение чата, потоковая передача, вызов инструментов, структурированный вывод (response_format) и предварительное заполнение помощником всей работы. Функции передаются вышестоящему провайдеру.
Могу ли я использовать BazaarLink с такими платформами агентов, как LangChain или CrewAI?
Да! Любая платформа, поддерживающая OpenAI API, работает с BazaarLink. Просто установите базовый URL и используйте ключ BazaarLink API. Примеры см. в разделе «Использование агентов».
Поддержка
Поддержка
Здравствуйте! Чем мы можем помочь?
Отправьте сообщение, и мы ответим в ближайшее время.