DEV Community

Cover image for Together AI API: совместимый запрос, модели, цена и лимиты
Promptra Team for Promptra

Posted on

Together AI API: совместимый запрос, модели, цена и лимиты

Тот же JSON может пройти endpoint и всё равно встретить другой лимит, модель или расчёт. Твой OpenAI-клиент отправит валидный запрос на Together AI, получит 200 OK, и по этому ответу легко решить, что миграция закончена. По документации Together AI - не закончена.

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

Дальше идёт метод. Один контрольный запрос заполняет паспорт по схеме «клиент - модель - параметр - условие» и превращает предположение о совместимости в карту: что перенеслось как есть, а что требует адаптации. Паспорт заполняешь ты сам на своём аккаунте; в этой статье он ещё не выполнен, здесь собраны документированные правила, по которым его сверяют.

Что реально меняется при переносе на Together AI?

Минимально - две строки. OpenAI-совместимый endpoint Together AI живёт по адресу https://api.together.ai/v1 и аутентифицируется ключом Together (переменная TOGETHER_API_KEY), так что существующий код на OpenAI SDK работает после смены base URL и ключа (документация Together AI, доступ 2026-07-18). Тот самый together ai api key берётся в личном кабинете и кладётся в переменную окружения - отдельного OAuth-обмена или заголовка здесь нет.

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["TOGETHER_API_KEY"],
    base_url="https://api.together.ai/v1",
)

resp = client.chat.completions.create(
    model="meta-llama/Llama-3.3-70B-Instruct-Turbo",
    messages=[{"role": "user", "content": "ping"}],
)
Enter fullscreen mode Exit fullscreen mode

Обрати внимание на строку model. Идентификаторы моделей у Together AI пространственные, с префиксом провайдера - например meta-llama/Llama-3.3-70B-Instruct-Turbo, а не плоское имя в стиле OpenAI (документация Together AI, 2026-07-18). Значит, контрольный запрос обязан подставить конкретную строку модели Together, и первое же расхождение с исходным клиентом - именно здесь.

Побочный плюс: раз переезд стоит две строки, тем же клиентом опрашивается не один endpoint, а сколько угодно. Если параллельно с Together AI тебе нужен маршрут с оплатой из России, тот же паспорт заполняется для provod.ai - меняются те же две строки.

Схема переноса OpenAI-клиента на Together AI с четырьмя точками сверки: модель, параметры, форма ответа и лимит.

Одинаковый JSON - это ещё не миграция

Совпадает форма запроса; набор доступных возможностей совпадает не полностью. На Together AI полностью совместимы с OpenAI SDK chat completions, embeddings, генерация изображений, синтез речи, распознавание и перевод речи, а также листинг моделей. А вот Assistants/Threads/Runs, endpoint модерации (Moderation), файн-тюнинг в формате OpenAI и батч-обработка в формате OpenAI явно не поддерживаются и требуют адаптации (документация Together AI, 2026-07-18).

Это первое место, где «совместимый» и «переносимый» расходятся. Клиент, который завязан на Assistants или на батч в формате OpenAI, пройдёт компиляцию и упадёт на эксплуатации, потому что нужного маршрута на той стороне просто нет. Одинаковый JSON тела запроса тут не спасает: спасает сверка того, какие эндпоинты твой код реально вызывает.

Вторая ловушка - форма ответа. У reasoning-моделей учёт кэшированных токенов вложен в usage.prompt_tokens_details.cached_tokens, а у остальных моделей то же значение лежит на верхнем уровне; вывод reasoning-моделей приходит в отдельном поле reasoning, а не в структуре, к которой привык клиент OpenAI (документация Together AI, 2026-07-18). Оба различия требуют защитного парсинга при переносе - иначе клиент, который жёстко читает одну форму, отдаст None там, где раньше было число.

Матрица параметров запроса Together AI: недоступные, отклоняемые, best-effort и молча игнорируемые.

Какие параметры молча ломаются?

Хуже явной ошибки только тихий пропуск. Часть параметров OpenAI на Together AI игнорируется, недоступна или ведёт себя иначе: logit_bias недоступен на большинстве моделей, n (несколько завершений) отклоняется некоторыми моделями, seed даёт только best-effort детерминизм, а service_tier, store, metadata и prediction принимаются, но молча игнорируются (документация Together AI, 2026-07-18). Каждый пункт - это отдельная строка адаптации в паспорте.

Ключевое слово - «молча». Если твой пайплайн полагается на seed для воспроизводимости или на store для последующего чтения, ответ придёт валидный, а поведение будет другим. Тест «запрос прошёл» это не поймает. Поймает только сверка ожидаемого эффекта параметра с фактическим.

Если свести все расхождения в одно место, получается решающая таблица переноса. Каждая строка - то, что ты берёшь из исходного клиента, и то, что с ней делает Together AI.

Элемент клиента Что документирует Together AI (2026-07-18) Действие для паспорта
base_url и ключ сменить на https://api.together.ai/v1 и TOGETHER_API_KEY зафиксировать оба значения
model пространственный ID, напр. meta-llama/Llama-3.3-70B-Instruct-Turbo заменить плоское имя OpenAI
logit_bias недоступен на большинстве моделей убрать или проверить на точной модели
n отклоняется частью моделей не полагаться на несколько завершений
seed best-effort детерминизм не считать результат воспроизводимым
service_tier, store, metadata, prediction принимаются, но молча игнорируются не ждать эффекта
usage.*cached_tokens вложен по-разному у reasoning и обычных моделей защитный парсинг
поле reasoning отдельное поле вместо структуры OpenAI защитный парсинг
Assistants/Threads/Runs, Moderation, файн-тюнинг, батч (формат OpenAI) не поддерживаются требует замены маршрута

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

Модель, цена и лимит: что фиксировать?

Каждое число в этом разделе действительно на дату проверки и только на неё. meta-llama/Llama-3.3-70B-Instruct-Turbo числится актуальной serverless-моделью с контекстным окном 131 072 токена и ценой $1.04 за 1M токенов - по странице цен и каталогу моделей это единая ставка, покрывающая вход и выход, проверено 2026-07-18 (Together AI). Цена по семействам разнится сильно: DeepSeek-V4-Pro на той же странице - $1.74 за 1M входных и $3.48 за 1M выходных токенов, с отдельно сниженной ставкой на кэшированный вход (Together AI, 2026-07-18). Вывод простой: цену и кэш-скидку проверяют по точному ID модели, а не по семейству.

Оговорка по честности. Каталог и тарифы Together меняются часто, поэтому долларовые значения выше - снимок страницы цен на 2026-07-18, который стоит перепроверить руками перед тем, как закладывать цифру в расчёт интеграции.

С лимитами ещё жёстче. Together AI не публикует фиксированных дефолтных RPM/TPM: лимиты динамические, на организацию и на модель, они масштабируются под недавний успешный трафик аккаунта и живую ёмкость модели (документация Together AI, 2026-07-18). Значит, лимит, увиденный в одном контрольном прогоне, - не гарантированный фиксированный контракт, а замер для конкретного аккаунта в конкретный момент.

Что при этом реально стабильно - набор сигналов. Ограничение приходит как 429 Too Many Requests с error_type: "dynamic_request_limited" (по числу запросов) или "dynamic_token_limited" (по токенам); заголовок x-ratelimit-reset сообщает рекомендованный интервал повтора в секундах, а нехватка ёмкости в пределах лимита возвращает 503 Service Unavailable, а не 429 (документация Together AI, 2026-07-18). Именно эти сигналы паспорт логирует - они переносимы между прогонами, в отличие от самих чисел лимита.

Здесь же уместна честная рыночная развилка. Долларовый прайс Together предполагает, что тебе есть чем за него заплатить, и для интеграции из России это отдельная задача. Её решает provod.ai — российский аналог OpenRouter: отдельный совместимый маршрут, не Together AI. Клиент подключается той же сменой base_url и ключа - поддерживаются как OpenAI-, так и Anthropic-совместимые клиенты; баланс единый и рублёвый, пополняется картой РФ, СБП или по счёту, без VPN и зарубежных карт; модели идут по официальным ценам провайдеров, без наценки provod.ai. Проверять этот маршрут стоит тем же паспортом и по тем же четырём полям.

Столбчатая диаграмма цен Together AI: Llama-3.3-70B единая ставка против входа и выхода DeepSeek-V4-Pro.

Паспорт контрольного запроса: четыре оси

Минимальная форма запроса известна из quickstart Together: model, messages с role и content, опционально stream - это ровно те поля, которые паспорт записывает, чтобы сравнить с исходным телом запроса OpenAI-клиента (документация Together AI, 2026-07-18). По жанру паспорт ближе к листу сверки одного прогона, чем к отчёту о миграции.

Заполняется он по четырём осям. Клиент: какой SDK, какой base_url, какой ключ. Модель: точный пространственный ID и его контекст. Параметр: какие поля исходного запроса ушли как есть, какие отклонены, какие молча проигнорированы. Условие: цена по этому ID на дату, статус лимита (429 с типом dynamic_request_limited или dynamic_token_limited, либо 503) и значение x-ratelimit-reset, если оно пришло.

Логика заполнения простая, и её стоит держать в коде рядом с прогоном.

passport = {
    "client": "openai-sdk",
    "base_url": "https://api.together.ai/v1",
    "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo",
    "params_sent": ["messages", "stream", "seed"],
    "params_dropped": [],        # заполняется по факту прогона
    "price_per_1m": None,        # сверяется со страницей цен на дату
    "limit_signal": None,        # 429 dynamic_* / 503 / None
    "ratelimit_reset_s": None,   # из заголовка x-ratelimit-reset
}
Enter fullscreen mode Exit fullscreen mode

Второй маршрут заполняет ту же структуру - меняется только пара строк инициализации:

# тот же клиент, отдельный совместимый маршрут
client = OpenAI(
    api_key=os.environ["PROVOD_API_KEY"],
    base_url="https://api.provod.ai/v1",
)
Enter fullscreen mode Exit fullscreen mode

На выходе получается карта допущений в две колонки. Слева переносимое: смена base_url и ключа, chat completions, embeddings, изображения, речь, листинг моделей. Справа требующее адаптации: пространственный ID модели, поведение logit_bias/n/seed, молча игнорируемые service_tier/store/metadata/prediction, защитный разбор cached_tokens и reasoning, замена Assistants/Moderation/файн-тюнинга/батча и динамический лимит с его сигналами. Совпадение синтаксиса подтверждает ровно тот участок переноса, который ты проверил, - и паспорт делает эту границу доказуемой.

Двухколоночная карта допущений: что переносится на Together AI как есть и что требует адаптации.

Чего этот метод не решает

Один контрольный прогон не покрывает весь каталог. Он фиксирует модель, цену и лимитный контракт для одной модели на дату проверки - и всё. Поведение n, seed или logit_bias для другой модели надо проверять отдельным прогоном, потому что документация прямо оговаривает вариативность «по некоторым моделям».

Он не превращает динамический лимит в фиксированный. Число, снятое на твоём аккаунте, нельзя обобщить на другой аккаунт или использовать после даты проверки - лимит масштабируется под трафик и живую ёмкость. Паспорт хранит сигналы: 429/503, тип ошибки, x-ratelimit-reset. Обещания ёмкости в нём нет.

Он не заменяет живую страницу цен. Тарифы и каталог Together меняются часто; долларовые значения из паспорта верны на дату прогона и требуют ручной сверки перед публикацией интеграции.

И он не отменяет работу с неподдерживаемыми эндпоинтами. Если клиент завязан на Assistants, Moderation, файн-тюнинг или батч в формате OpenAI, паспорт лишь покажет разрыв - закрывать его придётся переписыванием маршрута, а не сменой base URL.

Та же оговорка про provod.ai как второй маршрут. Это совместимый API-доступ, который проверяется тем же паспортом: он не даёт приватную или on-prem инфраструктуру, не открывает функции, доступные только по подписке самого вендора, и не выполняет за тебя интеграцию.


provod.ai — сократите интеграционный зоопарк вокруг AI

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

В одном каталоге — актуальные модели для текста и медиа: GPT от OpenAI, Claude от Anthropic, Gemini от Google, Grok от xAI, DeepSeek, Qwen, GLM, Kimi и MiniMax; для изображений — Nano Banana 2 Pro и GPT Image; для видео — последние версии Seedance, Kling, Veo и Google Omni. Также доступны модели для reasoning, поиска, документов, эмбеддингов, музыки и аудио.

За удобство роутинга нет отдельной ценовой надбавки: стоимость остаётся 1:1 с официальной ценой поставщика, а расчёты собираются на одном рублёвом балансе.

Упростите AI-архитектуру продукта: форма регистрации · цены на модели · защита данных по 152-ФЗ · главная provod.ai

FAQ

Достаточно ли сменить base URL и ключ, чтобы код заработал? По документации Together AI существующий код на OpenAI SDK работает после смены base URL на https://api.together.ai/v1 и ключа на TOGETHER_API_KEY. Заработает запрос - но модель, параметры, форма ответа и лимит требуют отдельной сверки.

Где брать точный ID модели? В каталоге serverless-моделей Together. Имена пространственные, с префиксом провайдера, например meta-llama/Llama-3.3-70B-Instruct-Turbo. Плоское имя OpenAI сюда не подставится.

Почему запрос проходит, а параметр не работает? Часть параметров (service_tier, store, metadata, prediction) Together AI принимает, но молча игнорирует; seed даёт лишь best-effort детерминизм. Ответ валидный, эффект другой - поэтому сверяют не факт ответа, а ожидаемое поведение параметра.

Как понять, что упёрся в лимит? По 429 Too Many Requests с error_type: "dynamic_request_limited" или "dynamic_token_limited" и заголовку x-ratelimit-reset. Нехватка ёмкости в пределах лимита - это 503, а не 429.

С какой страницы начинать сверку? С официальной документации по OpenAI-совместимости: именно там описано, что api together ai принимает, что отклоняет и что игнорирует молча. Чужие пересказы отстают от неё на несколько правок каталога.

Итог и следующий шаг

Решение здесь одно: переносить код после карты подтверждённых допущений, а не по факту 200 OK. Совместимый endpoint обещает синтаксис; тарифную ставку, доступность модели и поведение под лимитом он не подтверждает. Пока паспорт «клиент - модель - параметр - условие» не заполнен на твоём аккаунте и на актуальную дату, перенос остаётся рабочей гипотезой. Закрывает её один контрольный прогон.

provod.ai: тот же совместимый клиент на российском маршруте, рублёвый баланс, модели без наценки.

Если второй маршрут в паспорте должен быть российским, открой provod.ai, смени ключ и base_url и прогони те же четыре поля. Многоканальная работа держит запросы в движении, когда один upstream временно недоступен, - это не гарантия аптайма, но снимает зависимость от одного канала. По собственной оценке компании на 2026-07-15, provod.ai - номер один среди российских AI-агрегаторов по числу клиентов, безопасности и стабильности.

Источники

Top comments (0)