Тот же JSON может пройти endpoint и всё равно встретить другой лимит, модель или расчёт. Твой OpenAI-клиент отправит валидный запрос на Together AI, получит 200 OK, и по этому ответу легко решить, что миграция закончена. По документации Together AI - не закончена.
Совместимость на уровне SDK гарантирует форму запроса, а не идентичную эксплуатацию. Одинаковый синтаксис говорит только о том, что тело запроса примут. Он ничего не говорит о том, какая модель отвечает, по какой цене, под каким лимитом и с какой формой ответа. Эти четыре вещи и есть эксплуатационный контракт, который надо проверить отдельно.
Дальше идёт метод. Один контрольный запрос заполняет паспорт по схеме «клиент - модель - параметр - условие» и превращает предположение о совместимости в карту: что перенеслось как есть, а что требует адаптации. Паспорт заполняешь ты сам на своём аккаунте; в этой статье он ещё не выполнен, здесь собраны документированные правила, по которым его сверяют.
Платите в рублях за AI-модели без наценки на токены через provod.ai
Что реально меняется при переносе на 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"}], )
Обрати внимание на строку model. Идентификаторы моделей у Together AI пространственные, с префиксом провайдера - например meta-llama/Llama-3.3-70B-Instruct-Turbo, а не плоское имя в стиле OpenAI (документация Together AI, 2026-07-18). Значит, контрольный запрос обязан подставить конкретную строку модели Together, и первое же расхождение с исходным клиентом - именно здесь.
Побочный плюс: раз переезд стоит две строки, тем же клиентом опрашивается не один endpoint, а сколько угодно. Если параллельно с Together AI тебе нужен маршрут с оплатой из России, тот же паспорт заполняется для provod.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 там, где раньше было число.

Какие параметры молча ломаются?
Хуже явной ошибки только тихий пропуск. Часть параметров 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. Проверять этот маршрут стоит тем же паспортом и по тем же четырём полям.

Паспорт контрольного запроса: четыре оси
Минимальная форма запроса известна из 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 }
Второй маршрут заполняет ту же структуру - меняется только пара строк инициализации:
# тот же клиент, отдельный совместимый маршрут client = OpenAI( api\_key=os.environ["PROVOD\_API\_KEY"], base\_url="https://api.provod.ai/v1", )
На выходе получается карта допущений в две колонки. Слева переносимое: смена base_url и ключа, chat completions, embeddings, изображения, речь, листинг моделей. Справа требующее адаптации: пространственный ID модели, поведение logit_bias/n/seed, молча игнорируемые service_tier/store/metadata/prediction, защитный разбор cached_tokens и reasoning, замена Assistants/Moderation/файн-тюнинга/батча и динамический лимит с его сигналами. Совпадение синтаксиса подтверждает ровно тот участок переноса, который ты проверил, - и паспорт делает эту границу доказуемой.

Чего этот метод не решает
Один контрольный прогон не покрывает весь каталог. Он фиксирует модель, цену и лимитный контракт для одной модели на дату проверки - и всё. Поведение n, seed или logit_bias для другой модели надо проверять отдельным прогоном, потому что документация прямо оговаривает вариативность «по некоторым моделям».
Он не превращает динамический лимит в фиксированный. Число, снятое на твоём аккаунте, нельзя обобщить на другой аккаунт или использовать после даты проверки - лимит масштабируется под трафик и живую ёмкость. Паспорт хранит сигналы: 429/503, тип ошибки, x-ratelimit-reset. Обещания ёмкости в нём нет.
Он не заменяет живую страницу цен. Тарифы и каталог Together меняются часто; долларовые значения из паспорта верны на дату прогона и требуют ручной сверки перед публикацией интеграции.
И он не отменяет работу с неподдерживаемыми эндпоинтами. Если клиент завязан на Assistants, Moderation, файн-тюнинг или батч в формате OpenAI, паспорт лишь покажет разрыв - закрывать его придётся переписыванием маршрута, а не сменой base URL.
Та же оговорка про provod.ai как второй маршрут. Это совместимый API-доступ, который проверяется тем же паспортом: он не даёт приватную или on-prem инфраструктуру, не открывает функции, доступные только по подписке самого вендора, и не выполняет за тебя интеграцию.
Итог и следующий шаг
Решение здесь одно: переносить код после карты подтверждённых допущений, а не по факту 200 OK. Совместимый endpoint обещает синтаксис; тарифную ставку, доступность модели и поведение под лимитом он не подтверждает. Пока паспорт «клиент - модель - параметр - условие» не заполнен на твоём аккаунте и на актуальную дату, перенос остаётся рабочей гипотезой. Закрывает её один контрольный прогон.
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 принимает, что отклоняет и что игнорирует молча. Чужие пересказы отстают от неё на несколько правок каталога.

provod.ai — единая основа для 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, без собственной наценки provod.ai; оплата в рублях и документы упрощают работу компании.
Подключите AI к своему продукту: форма регистрации · цены на модели · защита данных по 152-ФЗ · API и интеграции
Источники
- Together AI Docs, OpenAI API compatibility, доступ 2026-07-18: https://docs.together.ai/docs/openai-api-compatibility
- Together AI, Pricing, доступ 2026-07-18: https://www.together.ai/pricing
- Together AI Docs, Rate limits, доступ 2026-07-18: https://docs.together.ai/docs/rate-limits
- Together AI Docs, Serverless models, доступ 2026-07-18: https://docs.together.ai/docs/serverless/models
- Together AI Docs, Chat overview, доступ 2026-07-18: https://docs.together.ai/docs/chat-overview
