RouterShift предоставляет интерфейсы, совместимые с OpenAI, Anthropic и Gemini, для моделей, активных для вашего ключа. За протокольной границей применяются маршрутизация, переход к резервным вариантам, тарификация и подтверждающие записи аудита.
Ключевые возможности
OpenAI-совместимый API — готовая замена для любого клиента OpenAI SDK
Настраиваемые стратегии маршрутизации: по весам, по кругу, по задержке и с резервными вариантами
Встроенный автоматический выключатель и ограничение запросов для защиты приложения
Семантическое кэширование для снижения задержки и затрат на повторяющиеся запросы
Комплексное логирование, мониторинг и аналитика расходов
Поддержка нескольких провайдеров с автоматическим фоллбэком при недоступности провайдера
Базовый URL для OpenAI
Все запросы API используют следующий базовый URL. API полностью совместим с клиентскими библиотеками OpenAI — достаточно изменить базовый URL и использовать API-ключ RouterShift.
https://api.routershift.com/v1
Anthropic-совместимый базовый URL
Для Anthropic SDK или Claude Code. Обратите внимание: без суффикса /v1 — SDK добавляет /v1/messages автоматически.
https://api.routershift.com
Совместимость с несколькими протоколами
Клиенты OpenAI, Anthropic и Gemini обычно подключаются заменой базового URL и учётных данных. Расширения родного протокола не переносятся автоматически: преобразование между протоколами поддерживает только поля с эквивалентной семантикой. Документированные интерфейсы описаны в OpenAPI; ограничения маршрутов и моделей сохраняются.
Поддерживаемые категории моделей
GET /v1/models является источником сведений о моделях, доступных вашему ключу. Доступность также зависит от продукта, состояния маршрутов, разрешений, баланса, региона и приватного доступа.
Получение помощи
Если вы столкнулись с проблемами или у вас есть вопросы, обратитесь к разделам ниже. По вопросам биллинга обращайтесь в поддержку через консоль. Для актуального статуса посетите страницу статуса.
Полный список эндпоинтов
Таблица представляет собой удобный указатель публичного контура данных. Машиночитаемый контракт доступен по /api/openapi.yaml, интерактивная справка — по /api/docs. Ограничения ключа продолжают действовать.
GET/v1/version
Версия и совместимость API плоскости данных
GET/v1/models
Список моделей
GET/v1/requests/:id
Исходная квитанция: читать свидетельства выполнения и расчётов без повторной отправки
GET/v1/requests/:id/result
Сохранённый аудиорезультат: читать поддерживаемые исходные результаты без новой генерации
POST/v1/chat/completions
Чат-завершения (совместимо с OpenAI)
POST/v1/contracted/chat/completions
Чат-завершения (совместимо с OpenAI)
POST/v1/messages
Messages API (совместимо с Anthropic)
POST/v1/messages/count_tokens
Оценка токенов Messages (текст, размышления и инструменты; не точный нативный расход)
Задача изображения: проверка существующей задачи без повторного запуска генерации
POST/v1/audio/transcriptions
Транскрибация аудио
POST/v1/audio/speech
Синтез речи
POST/v1/contracted/audio/speech
Синтез речи
POST/v1/tts
Расширенный синтез речи
POST/v1/transcriptions
Расширенная транскрибация
POST/v1/contracted/transcriptions
Расширенная транскрибация
POST/v1/midjourney/imagine
Генерация изображений Midjourney
POST/v1/suno/generate
Генерация музыки Suno
POST/v1/video/generations
Задача генерации видео
POST/v1/contracted/video/generations
Задача генерации видео
GET/v1/video/tasks/:task_id
Статус задачи генерации видео
POST/v1/chat/completions/async
Асинхронная задача — отправка
GET/v1/chat/completions/async/:task_id
Асинхронная задача — проверка статуса
GET/v1/chat/completions/async/:task_id/result
Асинхронная задача — получение результата
POST/v1/batch
Пакетная обработка
GET/v1/batch/:batch_id
Статус пакетной задачи
GET/v1/batch/:batch_id/results
Загрузка результатов пакетной задачи
POST/v1/batch/:batch_id/cancel
Отмена пакетной задачи
POST/v1/mcp/
Шлюз инструментов MCP JSON-RPC
GET/v1/mcp/sse
SSE-транспорт MCP
POST/v1/a2a/
Шлюз A2A JSON-RPC
GET/v1/a2a/sse
Поток событий SSE A2A
Метод
Путь
Описание
GET
/v1/version
Версия и совместимость API плоскости данных
GET
/v1/models
Список моделей
GET
/v1/requests/:id
Исходная квитанция: читать свидетельства выполнения и расчётов без повторной отправки
GET
/v1/requests/:id/result
Сохранённый аудиорезультат: читать поддерживаемые исходные результаты без новой генерации
POST
/v1/chat/completions
Чат-завершения (совместимо с OpenAI)
POST
/v1/contracted/chat/completions
Чат-завершения (совместимо с OpenAI)
POST
/v1/messages
Messages API (совместимо с Anthropic)
POST
/v1/messages/count_tokens
Оценка токенов Messages (текст, размышления и инструменты; не точный нативный расход)
POST
/v1/models/gemini/:model/generateContent
Генерация содержимого Gemini
POST
/v1/models/gemini/:model/streamGenerateContent
Потоковая генерация контента Gemini
POST
/v1/embeddings
Текстовые эмбеддинги
POST
/v1/rerank
Реранкинг
POST
/v1/chat/completions/estimate
Предварительная оценка токенов и стоимости
POST
/v1/images/generations
Генерация изображений
POST
/v1/contracted/images/generations
Генерация изображений
GET
/v1/images/tasks/:id
Задача изображения: проверка существующей задачи без повторного запуска генерации
POST
/v1/audio/transcriptions
Транскрибация аудио
POST
/v1/audio/speech
Синтез речи
POST
/v1/contracted/audio/speech
Синтез речи
POST
/v1/tts
Расширенный синтез речи
POST
/v1/transcriptions
Расширенная транскрибация
POST
/v1/contracted/transcriptions
Расширенная транскрибация
POST
/v1/midjourney/imagine
Генерация изображений Midjourney
POST
/v1/suno/generate
Генерация музыки Suno
POST
/v1/video/generations
Задача генерации видео
POST
/v1/contracted/video/generations
Задача генерации видео
GET
/v1/video/tasks/:task_id
Статус задачи генерации видео
POST
/v1/chat/completions/async
Асинхронная задача — отправка
GET
/v1/chat/completions/async/:task_id
Асинхронная задача — проверка статуса
GET
/v1/chat/completions/async/:task_id/result
Асинхронная задача — получение результата
POST
/v1/batch
Пакетная обработка
GET
/v1/batch/:batch_id
Статус пакетной задачи
GET
/v1/batch/:batch_id/results
Загрузка результатов пакетной задачи
POST
/v1/batch/:batch_id/cancel
Отмена пакетной задачи
POST
/v1/mcp/
Шлюз инструментов MCP JSON-RPC
GET
/v1/mcp/sse
SSE-транспорт MCP
POST
/v1/a2a/
Шлюз A2A JSON-RPC
GET
/v1/a2a/sse
Поток событий SSE A2A
Соответствие протоколов
RouterShift совместим с несколькими API-протоколами. В таблице ниже указаны базовый URL и конфигурация SDK для каждого.
Совместимо с OpenAI
https://api.routershift.com/v1
Models: <available-model-code>
Authorization: Bearer / x-api-key
Совместимо с Anthropic
https://api.routershift.com
Models: <available-model-code>
x-api-key: sk-xxx
Нативный Gemini
https://api.routershift.com/v1
Models: <available-model-code>
Authorization: Bearer
Базовый URL
Пример параметра модели
Заголовок авторизации
https://api.routershift.com/v1
Стандартный SDK OpenAI — достаточно изменить base_url
<available-model-code>
Authorization: Bearer / x-api-key
https://api.routershift.com
Стандартный SDK Anthropic — достаточно изменить base_url
<available-model-code>
x-api-key: sk-xxx
https://api.routershift.com/v1
Нативный формат Gemini, прямой вызов generateContent
<available-model-code>
Authorization: Bearer
Единая аутентификация
Все эндпоинты используют одну аутентификацию. Оба формата заголовков работают одинаково:
Формат совместимый с OpenAI
Authorization: Bearer sk-xxx
Формат совместимый с Anthropic
x-api-key: sk-xxx
Возможности платформы
Обзор RouterShift API
RouterShift предоставляет интерфейсы, совместимые с OpenAI, Anthropic и Gemini, для моделей, активных для вашего ключа. За протокольной границей применяются маршрутизация, переход к резервным вариантам, тарификация и подтверждающие записи аудита.
RouterShift использует предоплаченные кошельки и снимок цены для каждого запроса. Успешные запросы списываются по цене продажи клиенту и настроенным измерениям продукта.
Ключевые возможности
GET /v1/models является источником сведений о моделях, доступных вашему ключу. Доступность также зависит от продукта, состояния маршрутов, разрешений, баланса, региона и приватного доступа.
OpenAI-совместимый API — готовая замена для любого клиента OpenAI SDK
Настраиваемые стратегии маршрутизации: по весам, по кругу, по задержке и с резервными вариантами
Встроенный автоматический выключатель и ограничение запросов для защиты приложения
RouterShift предоставляет чат, эмбеддинги, каталог моделей и другие поддерживаемые эндпоинты. Используйте формат запросов и ответов выбранного эндпоинта, совместимого с OpenAI, Anthropic или Gemini.
Добавляйте инструменты агенту через MCP или используйте Python/Node SDK в приложении: это параллельные способы подключения. Выполните четыре шага локальной настройки stdio и не сохраняйте учётные данные в общих конфигурациях или системе контроля версий.
Создать отдельный каталог и установить MCP
Настроить локальный клиент stdio
Перезапустить коннектор и проверить десять инструментов
RouterShift использует предоплаченные кошельки и снимок цены для каждого запроса. Успешные запросы списываются по цене продажи клиенту и настроенным измерениям продукта.
Сверяйте статус, задержку, нативное использование, источник кеша и расходы по дате, модели и ключу; настройте доступные бюджеты и оповещения.
Интеграции SDK и агентов
Используйте стандартный совместимый клиент или SDK RouterShift для Python и Node.js; оба варианта работают по одному действующему API-контракту.
Загрузки Python 0.3.7 и Node 0.3.7
Загрузки фиксированных версий на этой странице соответствуют Python 0.3.7 и Node 0.3.7 и включают подробное обнаружение моделей. Требуется Python 3.9 или новее; Node.js и локальный MCP требуют Node 20 или новее. Архивы не означают публикацию в npm или PyPI. Обычному Node SDK необязательные зависимости MCP не нужны.
Исходный код клиента и учётные данные поставщика не нужны. Укажите язык/среду и версию SDK, model_code + operation + mode, обезличенные параметры, ограничения медиа и срок URL, восстановление, бюджет по валюте и параллельность. REST — контракт выполнения; SDK — необязательные тонкие клиенты, локальный MCP — вход stdio для агентов. Собственный SDK использует источник без /v1. SDK поставщика может требовать изменения полей и повторов; замена только ключа или базового URL не гарантирует мультимодальную совместимость. Согласуйте обезличенные примеры запросов/ответов и ожидаемые результаты. Сначала проверьте синтетические 200/202, ожидающий GET, неполный SSE, неизвестную отправку и повторную доставку; платная приёмка требует отдельного разрешения и явного бюджета.
Сначала выполните этот запрос только для чтения и скопируйте точный код модели в примеры ниже. Список показывает, что видит ключ; он не подтверждает, что для модели включены все операции или режимы.
Используйте тот же рабочий ключ для GET /v1/models?details=1: задачи не создаются, средства не резервируются, поставщик не вызывается; авторизация, журналы и лимиты сохраняются. Проверяйте пути/режимы details.operations, constraints.status и import_contract.status/reason. Сохраняйте измерения, условия, валюту, точность, селекторы, время наблюдения и semantic_sha256. Справочная цена не равна исполнимому контракту. Отсутствующие/неизвестные ограничения не означают неограниченный ввод; available не гарантирует средства. Это не полная Schema ввода и не универсальная проекция нетокенных контрактов. models.list() по умолчанию остаётся обычным списком; явно запрашивайте подробности включёнными методами SDK или через REST. Для constraints значение available описывает проверенное подмножество операции; unsupported требует отдельного руководства.
Различайте details.constraints.operations[].scope: reviewed_subset — проверенное подмножество операции; finite_admission_opt_in относится только к явно ограниченным запросам, а не ко всему обычному чату. parameters — не полная Schema ввода. При наличии details.admission проверяйте status, profile, /details/admission/required_headers и объявленные пределы ввода/вывода; неизвестные модели остаются unavailable. Обнаружение не предоставляет средства или универсальный предел цены.
Node 0.3.7 включает listDetails() и параметр details=true для models.list; Python 0.3.7 включает models.list(details=True) и list_details(). Эти методы подробного обнаружения входят в пакеты данной версии. models.list() по умолчанию остаётся обычным списком; старые установки не получают новые методы автоматически.
Python, Node и MCP могут вызывать текстовые модели. Агент может сохранить основную модель и обращаться к RouterShift по мере необходимости. Права и списания остаются в той же API.
import os
from routershift import RequestOptions, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
response = client.chat.completions.create(
model="YOUR_TEXT_MODEL_CODE",
messages=[{"role": "user", "content": "Summarize this project in one sentence."}],
request_options=RequestOptions(max_retries=0),
)
print(response.choices[0].message.content)
Запросы Omni по HTTP
Пример передаёт WAV-аудио и запрашивает текст и звук через поток HTTP. Выберите проверенный маршрут, совместимый с OpenAI, с поддерживаемыми моделью режимом stream и голосом. Для моделей только с SSE требуется stream:true; routershift_chat тоже принимает этот параметр. SDK сохраняет блоки содержимого, audio, modalities, вызовы инструментов и аудиоответы. HTTP Omni не предоставляет Realtime WebSocket или произвольное преобразование протоколов поставщиков.
import base64
import os
from pathlib import Path
from routershift import RequestOptions, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
audio_data = base64.b64encode(Path("/absolute/path/to/sample.wav").read_bytes()).decode()
response = client.chat.completions.create(
model="YOUR_OMNI_MODEL_CODE",
messages=[{"role": "user", "content": [
{"type": "text", "text": "Describe the sound."},
{"type": "input_audio", "input_audio": {"data": audio_data, "format": "wav"}},
]}],
stream=True,
modalities=["text", "audio"],
audio={"voice": "YOUR_MODEL_VOICE", "format": "wav"},
request_options=RequestOptions(max_retries=0),
)
for chunk in response:
if chunk.choices:
delta = chunk.choices[0].delta or {}
print(delta.get("content", ""), end="")
if delta.get("audio"):
print(delta["audio"].get("transcript", ""), end="")
Синтез речи
audio.speech вызывает /v1/audio/speech. Python возвращает байты аудио; Node — байты data и фактический contentType. Выберите поддерживаемые моделью голос и формат. Аудио не сохраняется автоматически в локальный файл.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
speech = client.audio.speech(
model="YOUR_SPEECH_MODEL_CODE",
input="Welcome to RouterShift.",
voice="YOUR_MODEL_VOICE",
response_format="wav",
)
print(len(speech))
Расшифровка аудио
audio.transcribe отправляет явно выбранный аудиофайл как multipart в /v1/audio/transcriptions. Сохраните фактическое расширение файла. Пример запрашивает JSON и читает text; языки и форматы зависят от маршрута.
import os
from pathlib import Path
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
transcript = client.audio.transcribe(
model="YOUR_TRANSCRIPTION_MODEL_CODE",
file=Path("/absolute/path/to/sample.wav").read_bytes(),
filename="sample.wav",
response_format="json",
)
print(transcript.text)
Расшифровка аудио по HTTPS-URL
Используйте audio.transcribe_url в Python, audio.transcribeURL в Node.js или отправьте JSON с file_url в /v1/transcriptions. SDK проверяет HTTPS-URL и не загружает запись локально. Вкладки Go и Java используют стандартные HTTP-клиенты этих языков; RouterShift не заявляет о собственных SDK для Go или Java.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
transcript = client.audio.transcribe_url(
"YOUR_TRANSCRIPTION_MODEL_CODE",
"https://media.example/recording.wav",
language="en",
audio_format="wav",
response_format="json",
)
print(transcript.text)
Создание изображений и проверка задач
Используйте images.generate с моделью, для которой включена генерация изображений. Для моделей с асинхронными изображениями добавьте async_=True в Python или async: true в Node.js, затем передайте полученный id в images.retrieve. Готовый ответ содержит data с URL изображений, а ожидающий — id и status.
import os
from routershift import ImageTaskResponse, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
image = client.images.generate(
model="YOUR_IMAGE_MODEL_CODE",
prompt="A quiet garden in watercolor",
)
print(image)
if isinstance(image, ImageTaskResponse):
print(client.images.retrieve(image.id))
Отправка видео на генерацию и проверка статуса
videos.create создаёт одну задачу генерации видео и возвращает task_id. Сохраните его перед вызовом videos.retrieve; у ожидающей задачи video_url может пока отсутствовать. Оба SDK также предоставляют videos.poll для ожидания с ограничением времени. Путь API — /v1/video/generations, слово video в единственном числе.
Проверенные нативные маршруты Seedance и Wan 3.0 поддерживают generate_audio: отсутствие поля сохраняет настройку поставщика, false убирает звуковую дорожку, true включает её. Wan преобразует поле в parameters.audio; по умолчанию звук сейчас включён. Тариф видео Wan одинаков со звуком и без него, без отдельной платы за аудио. Другие маршруты могут не поддерживать поле; явно заданные значения нельзя незаметно удалять.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
task = client.videos.create(
model="YOUR_VIDEO_MODEL_CODE",
prompt="A slow camera movement through a garden",
)
print(task.task_id)
result = client.videos.retrieve(task.task_id)
print(result.status, result.video_url)
Выбор параметров по модели
Передавайте только параметры, прошедшие приёмку для выбранной модели и операции. Сохраняйте явные false и seed=0; отсутствие поля оставляет значение поставщика по умолчанию. Здесь описана реализация, а не подтверждённая доступность в рабочей среде.
Qwen Image 3.0: seed, watermark, prompt_extend и enable_thinking зависят от модели. prompt_extend_mode принимает direct или agent; agent требует расширения промпта и не предназначен для редактирования изображений. enable_thinking действует только при включённом расширении промпта и не включает prompt_extend автоматически.
Видео Wan 3.0: seed, watermark и prompt_extend зависят от модели. generate_audio управляет созданием аудио; обязательность и поддержка параметра определяются выбранной моделью. Материалы file/link требуют prompt_extend=true или отсутствия параметра; явное false отклоняется.
Ark Seedance: текущий маршрут платформы не принимает seed и prompt_extend. Не переносите параметры Qwen или Wan между поставщиками.
Поддержка в коде не означает развёртывание, а развёртывание — приёмку продукта. Расширенное редактирование, продление видео, MOV, Draft, HappyHorse, Wan 2.7, Animate и VACE в офлайн-разработке не означают включённые продукты. Перед платным запросом проверьте модель, операцию и параметры.
От референсных изображений к видео с первым кадром (REST, SDK, MCP)
В примере из трёх HTTPS-референсов без портретов создаётся изображение, а его полученный HTTPS-адрес передаётся как image_url для первого кадра видео. Замените оба кода модели на видимые вашему ключу в /v1/models и отдельно разрешённые для соответствующих операций; видимость не означает разрешение. Показанные 720p и 5 секунд должны поддерживаться выбранным видеомаршрутом.
Ark: используйте разрешённый маршрут редактирования Seedream Pro и маршрут Seedance с первым кадром. Три референса допустимы только для модели, которая их поддерживает; 2048x1152 не является общим размером. Для портретов реальных людей действуют отдельные правила; исключение для генерации по тексту в рамках одной учётной записи не разрешает объединять три фотографии.
Bailian: разрешённый маршрут редактирования Qwen Image 3.0 принимает от одного до трёх референсов и возвращает URL; не ожидайте b64_json и не считайте асинхронный режим изображений включённым по умолчанию. Wan использует image_url для первого кадра. Разрешение и длительность должны поддерживаться выбранным маршрутом; возможности консоли поставщика не доказывают доступность маршрута платформы.
Вкладки показывают последовательность, а не автоматические повторы. Для REST или MCP вызывайте каждый шаг отдельно. Если готовый URL изображения уже получен, пропустите запрос задачи; иначе один раз запросите исходную задачу и продолжайте только при наличии пригодного HTTPS-адреса. Сохраните task_id видео и один раз запросите ту же задачу; незавершённую задачу можно проверить позже.
Задачи изображения через REST и SDK возвращают id, а задачи видео — task_id. Локальный MCP выдаёт structuredContent.task_id, когда идентификатор задачи существует: сначала проверьте isError и next_action, затем прочитайте structuredContent.outputs[].url или приложенное содержимое изображения MCP. Только настоящий HTTPS-адрес можно передать как image_url для видео; приложенное изображение само по себе не является URL. Не предполагайте, что MCP возвращает REST data[0].url.
Явный ответ с отказом 400 отличается от транспортного тайм-аута с неизвестным результатом отправки. При ошибке сохраните безопасный код и сообщение, X-Request-ID и идентификатор задачи, если он получен; не ожидайте исходных причин поставщика и не отправляйте платный POST автоматически повторно. Ошибка запроса задачи означает лишь недоступность её статуса, а не неудачу генерации. Тайм-аут ожидания не отменяет работу и не возвращает оплату. Бюджет, списание и расчёт определяются записями платформы, а не этим примером или показанной ценой поставщика.
Добавить инструменты моделей агенту
Добавляйте инструменты агенту через MCP или используйте Python/Node SDK в приложении: это параллельные способы подключения. Выполните четыре шага локальной настройки stdio и не сохраняйте учётные данные в общих конфигурациях или системе контроля версий.
1. Создать отдельный каталог и установить MCP
Используйте Node 20 или новее. Эта установка только для MCP добавляет две peer-зависимости протокола; обычной установке Node SDK они не нужны.
Замените пример пути, задайте API-ключ только в локальном окружении и сохраните доверенный origin API без /v1, учётных данных, строки запроса или фрагмента. На вкладке Codex используется документированный синтаксис stdio и env_vars.
4. Перезапустить коннектор и проверить десять инструментов
Перезапустите или перезагрузите клиент MCP, убедитесь, что видны все десять инструментов, и сначала вызовите routershift_list_models только для чтения. Вызывайте оплачиваемый инструмент модели, только когда намерены отправить соответствующую операцию.
Доступны десять инструментов: routershift_list_models, routershift_estimate_chat, routershift_chat, routershift_generate_image, routershift_create_video, routershift_get_task, routershift_get_request, routershift_speech, routershift_transcribe, routershift_transcribe_url. Сначала выберите модель для нужной операции. Проверяйте задачи изображений и видео через routershift_get_task, передавая kind (image или video) и task_id. Запрашивайте квитанцию запроса через routershift_get_request с request_id только для чтения; это не отправляет и не активирует платную операцию. В 0.3.7 details:true читает подробные модели и договоры. routershift_estimate_chat только читает конечную верхнюю границу допуска: без вызова поставщика, резервирования и автоматического исполнения; funds_verified=false. Оценка не является итоговым счётом или разрешением на вызов.
routershift_chat принимает HTTPS-ссылки на изображения и видео; audio_file читает явно выбранный абсолютный путь WAV/MP3 размером до 16 MiB. routershift_transcribe читает выбранный локальный аудиофайл через file_path; routershift_transcribe_url передаёт HTTPS file_url без загрузки. Речь и аудио Omni возвращаются встроенными. routershift_generate_image принимает response_format url или b64_json; для ограниченного по размеру корректного вывода b64_json в формате PNG, JPEG, WebP или GIF он возвращает нативное содержимое image MCP, не записывая, не загружая и не размещая файл и не копируя Base64 в текстовый JSON. Слишком большие данные или неизвестный формат явно пропускаются; не отправляйте платный запрос повторно для получения пропущенного вывода. Адаптер не сканирует каталоги и не сохраняет результаты автоматически.
На вкладке JSON показана распространённая структура mcpServers; на вкладке TOML — документированный синтаксис Codex. Расположение конфигурации и права на дочерние процессы зависят от клиента. Клиентам только с удалённым MCP нужен отдельно поддерживаемый транспорт; эти примеры не заявляют проверку во всех интерфейсах агентов.
Локальный адаптер MCP позволяет вызывать API RouterShift для текста, мультимодальности, аудио и задач. Существующий шлюз /v1/mcp предоставляет доступ к настроенным внешним инструментам. Его конфигурация HTTP/SSE не заменяет приведённую здесь локальную конфигурацию инструментов моделей.
Доступ к моделям, ожидание и оплата
UGC-платформы: отправьте один раз, сохраните ID задачи и исходный X-Request-ID, затем проверяйте ту же задачу. Собственный ID операции не гарантирует безопасный повтор на сервере. REST, SDK и MCP используют общие задачи и расчёты; смена способа доступа не должна повторять генерацию с неизвестным исходом.
При доступном import_contract и поддерживаемой операции используйте endpoint_prefix/request_header (X-RouterShift-Customer-Contract) на /v1/contracted/... с полным запросом и semantic_sha256. Такой же заголовок на обычном /v1 не включает защиту. При неподдерживаемом контракте, 404 или изменении хеша остановитесь; не повторяйте без защиты. Защищённый чат также требует X-RouterShift-Token-Bound, X-RouterShift-Max-Admission-Quote и X-RouterShift-Quote-Currency с проверенным конечным контрактом ввода/вывода/рассуждений. Не выводите их из хеша или длины контекста. Публичный расчёт и admission_quote с bound_proven=false или funds_verified=false не разрешают расходы и не задают универсальный предел.
Разделяйте отправку, выполнение, доставку и расчёты. Без ID задачи сначала выясните исход, не отправляйте новый POST. Ошибка GET означает лишь недоступность статуса. Если генерация завершилась, но загрузка не удалась, восстановите доставку того же известного результата. released и reconciliation_required прекращают опрос, но не доказывают успех или возврат денег.
Сохраните исходный ID и читайте квитанцию через GET /v1/requests/ORIGINAL_REQUEST_ID. GET /v1/requests/ORIGINAL_REQUEST_ID/result читает только поддерживаемые сохранённые аудиорезультаты, а не универсальное хранилище. Python 0.3.7 (начиная с 0.3.6) audio.retrieve/poll запрашивает нативный ASR 202; Node 0.3.7 не заявляет равнозначных методов. Эти GET не повторяют отправку и не запускают восстановление расчётов. Сохраняйте синхронные результаты и реальные асинхронные ID. Неизвестную отправку, сбой доставки и незавершённый расчёт различайте; тайм-аут не разрешает повторять платный POST.
При receipt.metering.basis=recorded_settlement_context видны лишь сохранённые измерения уже рассчитанных запросов. Это не исходная квитанция поставщика, не его счёт и не полная разбивка расходов. Сохраняйте строки quantity/unit/pricing_unit_divisor; отсутствующие или неподдерживаемые свидетельства остаются unavailable. Не подставляйте ноль вместо неизвестного расхода, не вычисляйте итоговую плату и не запускайте восстановление из этой проекции только для чтения.
Статус и список асинхронных чатов сохраняют status и добавляют execution_status, billing_status, reason_code, next_action и retry_allowed: false. completed означает доступность результата, а не завершение расчётов; unknown не означает бесплатность или возврат средств. _billing_status в SDK изображений и billing_status в MCP копируют только фактический допустимый заголовок X-Billing-Status; отсутствующий или недопустимый заголовок не заполняется. Запрос статуса не запускает восстановление расчётов и не разрешает повторную отправку.
Скопируйте полный идентификатор из расходов пользователя или журнала запросов администратора и ищите точный request_id: непустой корректный UTF-8, не более 256 байт, без пробельных и управляющих символов. Действующие права и фильтры времени и модели сохраняются; отсутствие совпадения не доказывает отсутствие приёма запроса или платы. Храните отдельно идентификатор исходной отправки, задачи и последующих запросов статуса. CSV по-прежнему охватывает весь выбранный период, а не только строки с указанным идентификатором.
Контролируйте новые отправки очередью приложения и лимитами пользователей; ограничивайте время опроса и распределяйте запросы. Тайм-аут прекращает локальное ожидание, а не работу поставщика. Имитационные тесты не подтверждают его мощность для одновременной генерации.
Замените YOUR_* своими кодами моделей, голосами или идентификаторами задач. /v1/models перечисляет видимые ключу коды, но не подтверждает текст, Omni, изображения, видео, аудио или все режимы. Проверьте входы, выходы и разрешённые режимы выбранной модели. Универсальная поддержка моделей или Realtime не заявляется.
Обычный чат/Messages SDK сохраняет автоматические повторы: для UGC-чата/Omni явно задайте Python RequestOptions(max_retries=0) или Node maxRetries=0, redirect=error. Отсутствие повторов у специальных медиаметодов не распространяется на все методы. Запросы изображений, видео, речи и расшифровки не повторяются автоматически; чат MCP также отправляется один раз. Тайм-аут или прекращение ожидания не отменяет работу, не возвращает средства и не делает повтор безопасным. Сохраните id изображения и task_id видео. released и reconciliation_required — конечные состояния, а не подтверждение успешной генерации.
Вызовы SDK и MCP используют те же API, цены, учёт потребления, кошелёк и расчёты, что и прямые запросы. Они не создают отдельный баланс или систему оплаты. URL результата не подтверждает завершение расчётов; проверяйте статус оплаты API, если он доступен, и записи консоли.
as_of в оценке цены означает время запроса, а не срок гарантии тарифа. Принятые задания рассчитываются по сохранённому ценовому договору и фактическому нативному потреблению, без последующих изменений каталога или цен ключа. Фиксированный тариф не означает фиксированную итоговую сумму. Отсутствующие или противоречивые данные потребления требуют сверки, а не списания предположительной суммы. Проверяйте исходное задание, не запускайте новое с другими параметрами.
Официальные SDK
Типизированные клиенты для моделей, чата, сообщений, эмбеддингов, медиа и асинхронных задач без консольных API сессии.
Совместимые экосистемы
Совместимые клиенты OpenAI, Anthropic и Gemini используют поддерживаемое подмножество протокола. Проверьте префикс URL, поля, разбор ответов и повторы; замена только ключа или URL не гарантирует мультимедиа за пределами чата.
Протоколы агентов
MCP и A2A обеспечивают стабильную совместимость, не раскрывая внутреннюю маршрутизацию.
Независимые релизы SDK
SDK выпускаются независимо от платформы. Python 0.3.7 и Node 0.3.7 включают методы подробного обнаружения. Проверяйте загрузки фиксированных версий по SHA-256; архивы не означают публикацию в npm или PyPI либо нативную приёмку модели. Действующий контракт OpenAPI остаётся источником истины.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
models = client.models.list()
print([model.id for model in models])
response = client.chat.completions.create(
model="YOUR_MODEL_CODE",
messages=[{"role": "user", "content": "Hello"}],
)
Аутентификация
Все API-запросы требуют аутентификации через Bearer-токен. Вы можете генерировать и управлять API-ключами в панели консоли.
Формат API-ключа
API-ключи начинаются с sk- с последующим уникальным идентификатором. Держите ключи в безопасности и не раскрывайте их в клиентском коде или системах контроля версий.
Заголовок авторизации
Укажите ваш API-ключ в заголовке Authorization каждого запроса:
Authorization: Bearer YOUR_API_KEY
Рекомендации по безопасности
Никогда не встраивайте API-ключи в исходный код. Используйте переменные окружения или менеджер секретов.
Регулярно ротируйте API-ключи в панели консоли — создавайте новые и отзывайте старые без простоев.
Используйте разные API-ключи для сред разработки и продакшена.
Установите лимиты использования и IP-ограничения для API-ключей для дополнительной безопасности.
Отслеживайте использование ключей в панели консоли на предмет необычной активности.
Никогда не коммитьте API-ключи в систему контроля версий. Добавьте .env в .gitignore.
HMAC-подписи вебхуков
Пользовательские вебхуки передают в X-RS-Signature шестнадцатеричный HMAC-SHA256 дайджест тела. X-RS-Event и X-RS-Delivery обозначают событие и доставку.
Выполнение запросов
RouterShift предоставляет чат, эмбеддинги, каталог моделей и другие поддерживаемые эндпоинты. Используйте формат запросов и ответов выбранного эндпоинта, совместимого с OpenAI, Anthropic или Gemini.
Чат-завершения
Отправьте запрос чат-завершения с именем модели, массивом сообщений и необязательными параметрами: temperature, max_tokens и top_p. RouterShift направляет запрос к соответствующему провайдеру на основе вашей конфигурации маршрутизации.
Потоковые ответы
Включите потоковую передачу установкой stream: true. RouterShift поддерживает Server-Sent Events (SSE) для потоковой передачи токенов в реальном времени. Формат потока совместим со спецификацией потоковой передачи OpenAI.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.routershift.com/v1",
api_key=os.environ["ROUTERSHIFT_API_KEY"],
)
stream = client.chat.completions.create(
model="YOUR_MODEL_CODE",
messages=[{"role": "user", "content": "Tell me a story"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
Асинхронные запросы
Для длительных задач или пакетной обработки используйте асинхронный режим. Отправьте запрос и опрашивайте результаты — полезно для рабочих нагрузок, превышающих типичные таймауты.
Пакетная обработка
Загрузите JSONL-файл через POST /v1/batch и опрашивайте статус и результаты. Время и цена зависят от режима выполнения и договора модели; пакет сам по себе не гарантирует скидку или фиксированный срок завершения.
Эмбеддинги
Генерируйте векторные эмбеддинги для текста через эндпоинт /v1/embeddings. Эмбеддинги полезны для семантического поиска, кластеризации и генерации с дополненным поиском (RAG).
Оценка токенов
Отправьте тело чат-запроса в POST /v1/chat/completions/estimate для предварительной оценки токенов и стоимости. Оценка не является итоговым списанием: расчёт определяется фактическим использованием и ценовым договором.
Лимиты и управление запросами
Фактические лимиты определяются API-ключом, политикой клиента, маршрутом модели и пропускной способностью поставщика. Заголовки ответа и консоль отражают рабочую конфигурацию.
Лимиты по умолчанию
Ключи платформы возвращают x-ratelimit-limit-{tps,rpm,tpm,tph} и для активных лимитов x-ratelimit-remaining-{tps,rpm,tpm,tph}. Retry-After появляется лишь когда ожидание может освободить ёмкость, с округлением вверх до целых секунд; успех повтора не гарантирован. Без этого заголовка проверьте квоту на запрос и политику. Не отправляйте автоматически POST с неизвестным результатом; используйте ограниченную задержку со случайным разбросом только для безопасно повторяемых запросов.
Коды HTTP-ответов
429429 Too Many Requests — Вы превысили лимит частоты. Проверьте заголовок Retry-After и снизьте частоту.
403403 Доступ запрещён — Ключу не разрешено использовать эту модель, маршрут или операцию. Проверьте области действия ключа и политику клиента.
503503 Service Unavailable — Для запрошенной модели нет доступного поставщика. Автоматический выключатель мог временно отключить всех поставщиков.
401401 Unauthorized — Отсутствует или некорректно сформирован заголовок Authorization.
400400 Bad Request — Неверные параметры запроса. Проверьте сообщение об ошибке.
Биллинг и тарифы
RouterShift использует предоплаченные кошельки и снимок цены для каждого запроса. Успешные запросы списываются по цене продажи клиенту и настроенным измерениям продукта.
Модель тарификации
Списание выполняется по утверждённой цене продажи клиенту с фиксацией модели, валюты, версии цены и измерений для каждого запроса. Публичный каталог показывает цены списка для сравнения; себестоимость относится к расчётам с поставщиком.
Биллинг и счета
Сверяйте вызовы, токены, измерения кеша и расходы по дате, модели и API-ключу. Счета и возвраты используют серверные доказательства цены; последующие изменения не переписывают историю.
Кошелёк и кредиты
Кошельки CNY и USD учитываются отдельно. Доступные денежные средства уже не включают замороженные суммы; не вычитайте их повторно. Личный льготный кредит и обеспечение платформы по умолчанию отключены и требуют отдельно утверждённых лимитов и капитала. Занятый кредит и непогашенный основной долг — не денежный баланс и не автоматический доступ к моделям. Допуск требует проверенного договора учёта и доказанного предела стоимости. Текущий прогресс — не окончательный счёт; неизвестные результаты или расход ожидают сверки. Пополнение учитывается после подтверждённого получения платежа.
Пакеты и купоны
Пакеты, акции, купоны и планы экономии влияют на цену только при наличии применимого правила. Финансирование скидки отделено от обязательств перед поставщиком.
Движок комиссий реселлеров
Реселлеры получают процент от маржи платформы за каждый запрос от приглашённых пользователей. Переопределение комиссионных ставок по моделям позволяет гибко настраивать партнёрские программы — напр. 15% на GPT-4o, 10% на Claude. Атрибуция автоматическая через пригласительные ссылки; расчёт в реальном времени за каждый запрос.
Частный доступ
Частный доступ объединяет BYOK и пулы учётных записей ИИ с централизованным контролем, гибкой оплатой и отказоустойчивостью.
Интеграция BYOK
Привяжите собственные ключи после активации частного доступа. Поставщик выставляет счёт отдельно; сервисные сборы RouterShift зависят от тарифа и действующих освобождений. BYOK не делает всё использование бесплатным.
Пулы учётных записей
Подключайте внешние пулы через единый шлюз ключей и общий уровень политик.
Режим подписки
Частный доступ — дополнительная услуга. До активации проверьте месячную плату или сбор за использование, валюту, продление и освобождения выбранного тарифа. Основной API платформы оплачивается по факту использования.
Аварийное переключение
Если частный источник недоступен, допустимые маршруты платформы для той же модели могут проверяться последовательно с учётом прав ключа и региона. Действуют цена продажи и проверки баланса и бюджета; частная подписка или освобождение от сервисного сбора не делают эти запросы бесплатными.
Аудируемые расчёты в CNY и USD
Единая цепочка финансовых фактов: цены, списания, разделение дохода, возвраты, платежи и счета. Один аккаунт даёт доступ к локальным и мировым моделям: клиент работает в CNY, а зарубежные расходы рассчитываются в их валюте.
Валюты продажи и себестоимости разделены
Внутренние товары продаются и фактурируются в CNY; USD-расходы поставщика не передают клиенту валютный риск на каждый запрос.
Снимок цены и курса на запрос
Фиксируются утверждённые версии курса и цены, а также реальные движения кошелька; история не переписывается.
Обязательства в исходной валюте
Задолженность перед поставщиком сохраняет его исходную валюту; маржа, комиссия и налог учитываются отдельно.
Возврат по исходному пути
Возврат отменяет исходные CNY/USD-движения; реальная обратная конверсия отдельно фиксирует курсовую прибыль или убыток.
Обработка ошибок
Разберитесь с типичными ошибками API и как их корректно обрабатывать в вашем приложении.
Структура ответа об ошибке
Все ошибки следуют стандартному формату с объектом error, содержащим message, type, code и param (если применимо).
Учитывайте Retry-After, если он присутствует. Повторяйте только идемпотентные или безопасно воспроизводимые операции, используйте ограниченную экспоненциальную задержку с джиттером и останавливайтесь по бюджету попыток или времени приложения.
Типичные типы ошибок
invalid_request_error — Некорректное тело запроса или отсутствуют обязательные параметры.
authentication_error — Неверный, истёкший или отозванный API-ключ.
rate_limit_error — Слишком много запросов. Снизьте частоту и учитывайте заголовки Retry-After.
server_error — Временная проблема провайдера или платформы. Повторите с экспоненциальной задержкой.
upstream_error — Нет доступного поставщика или его вызов завершился ошибкой. Проверьте error.code перед повтором запроса.
Ошибки инференса в формате OpenAI содержат машиночитаемое поле error.code. Для программной обработки используйте это поле, а не текст сообщения.
AUTH_INVALIDНеверные учетные данные
AUTH_EXPIREDСессия истекла
AUTH_EMAIL_NOT_VERIFIEDЭлектронная почта не подтверждена
AUTH_INSUFFICIENTДоступ запрещен
WALLET_LOWНедостаточный баланс
WALLET_EMPTYКошелек пуст
RATE_LIMIT_GLOBALПревышен лимит запросов
RATE_LIMIT_KEYПревышен лимит запросов API-ключа
RES_MODEL_NOT_FOUNDМодель не найдена
UPSTREAM_UNREACHABLEПоставщик недоступен
UPSTREAM_ERRORОшибка поставщика
UPSTREAM_TIMEOUTТаймаут поставщика
INTERNAL_ERRORВнутренняя ошибка сервера
error.code
Описание
AUTH_INVALID
Неверные учетные данные
AUTH_EXPIRED
Сессия истекла
AUTH_EMAIL_NOT_VERIFIED
Электронная почта не подтверждена
AUTH_INSUFFICIENT
Доступ запрещен
WALLET_LOW
Недостаточный баланс
WALLET_EMPTY
Кошелек пуст
RATE_LIMIT_GLOBAL
Превышен лимит запросов
RATE_LIMIT_KEY
Превышен лимит запросов API-ключа
RES_MODEL_NOT_FOUND
Модель не найдена
UPSTREAM_UNREACHABLE
Поставщик недоступен
UPSTREAM_ERROR
Ошибка поставщика
UPSTREAM_TIMEOUT
Таймаут поставщика
INTERNAL_ERROR
Внутренняя ошибка сервера
Обработка таймаутов
Выбирайте таймауты соединения, запроса и простоя потока с учетом нагрузки и задержки модели. Синхронные, потоковые, асинхронные и пакетные операции не должны использовать одно фиксированное значение.