<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Promptra</title>
    <description>The latest articles on DEV Community by Promptra (@promptra-team).</description>
    <link>https://dev.to/promptra-team</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13529%2F97e96b89-d8a1-4fee-b9a3-2de14b579b35.png</url>
      <title>DEV Community: Promptra</title>
      <link>https://dev.to/promptra-team</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/promptra-team"/>
    <language>en</language>
    <item>
      <title>Закрывающие документы по нейросетям в 2026: договор, акт, УПД, счёт-фактура</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Wed, 17 Jun 2026 14:45:04 +0000</pubDate>
      <link>https://dev.to/promptra-team/zakryvaiushchiie-dokumienty-po-nieirosietiam-v-2026-doghovor-akt-upd-schiot-faktura-27eo</link>
      <guid>https://dev.to/promptra-team/zakryvaiushchiie-dokumienty-po-nieirosietiam-v-2026-doghovor-akt-upd-schiot-faktura-27eo</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65estmk3k83eh6zsxc8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65estmk3k83eh6zsxc8n.png" alt="Пакет закрывающих документов по AI-услугам: договор, УПД, счёт, платёжное поручение — на столе бухгалтера" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Расход на нейросеть, который не подкреплён правильным пакетом первичных документов, налоговая снимает с базы по налогу на прибыль и доначисляет недоимку. Это уже не теоретическая угроза 2023 года, когда платежи в OpenAI ещё можно было прятать в категорию «прочие услуги связи». С 1 января 2026 года основной электронный документооборот для услуг переехал на новый формат универсального передаточного документа версии 5.03, а 152-ФЗ обзавёлся поправками, которые отдельной строкой регулируют использование персональных данных для обучения моделей. Если ваша IT-компания тратит на доступ к большим языковым моделям от 50 тыс. ₽ в месяц и выше, пакет закрывающих документов из «приятной формальности» превратился в обязательный элемент налогового и регуляторного контура.&lt;/p&gt;

&lt;p&gt;Этот разбор написан для бухгалтера, финансового директора и FinOps-специалиста, у которого AI-расходы перестали быть случайными и которому нужен внятный регламент: что должно лежать в папке «AI-сервисы» к концу каждого месяца, чтобы при выездной проверке ФНС не пришлось объясняться о платежах через card2card и переводах в адрес ИП-посредников без агентского договора.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что такое первичка по AI-услугам и почему это не «обычный SaaS»
&lt;/h2&gt;

&lt;p&gt;Долгое время бухгалтерия в IT-компаниях работала с зарубежными SaaS-подписками по упрощённой схеме. Slack, Notion, Figma, GitHub приходили инвойсами в долларах, оплачивались с корпоративной карты или через PayPal/Stripe-аналоги, а на сторону учёта переезжали как «прочие расходы по основной деятельности» с банковской выпиской в качестве единственного подтверждения. Такой подход работал, пока расходы были невелики и платежи можно было обосновать через личные карты сотрудников с последующей компенсацией.&lt;/p&gt;

&lt;p&gt;С AI-сервисами эта модель ломается. Причины три, и каждая из них регулируется отдельным куском НК РФ:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Первое — порядок признания расхода.&lt;/strong&gt; По общим правилам &lt;a href="https://ppt.ru/art/pervichnye-uchetnye-dokumenty/zakryvayushchie-dokumenty-v-uchete-organizatsii" rel="noopener noreferrer"&gt;первичных учётных документов&lt;/a&gt; (ст. 9 закона № 402-ФЗ «О бухгалтерском учёте») расход признаётся в учёте только при наличии документа, подтверждающего факт хозяйственной операции. Банковская выписка таким документом не является — она лишь подтверждает движение средств. Нужен акт оказанных услуг, накладная или их современный эквивалент — УПД.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Второе — статус контрагента.&lt;/strong&gt; Если ваш провайдер AI-API — нерезидент РФ (например, прямое подключение к OpenAI или Anthropic через зарубежное юр.лицо), то по ст. 309 НК РФ возникает обязанность налогового агента: вы должны удержать налог на прибыль источника и НДС в качестве налогового агента (ст. 161 НК РФ). На практике у большинства IT-компаний это превращается в кошмар валютного контроля и переоформление документов через юристов международного налогового права.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Третье — формулировка предмета услуги.&lt;/strong&gt; Для бухгалтера и налоговой инспектора фраза «оплата за подписку на сервис» содержательно пуста. Должна быть конкретика: «оказание услуг по предоставлению доступа к программно-аппаратному комплексу автоматической обработки запросов на основе моделей машинного обучения» — или аналогичная развёрнутая формулировка, которая позволяет однозначно квалифицировать расход. Без такой формулировки в акте инспектор имеет полное право переквалифицировать платёж в выплату дохода физическому лицу с доначислением НДФЛ и страховых взносов — особенно если оплата шла на счёт ИП.&lt;/p&gt;

&lt;p&gt;Именно поэтому работа с AI-сервисами через российского посредника становится не вопросом удобства, а вопросом налоговой устойчивости. Посредник принимает на себя функции налогового агента в части расчётов с нерезидентом, формирует первичку в российском стандарте и снимает с вашей бухгалтерии необходимость разбираться с валютным контролем по каждому платежу.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikeh7mlhzhhfeo5e16o9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikeh7mlhzhhfeo5e16o9.png" alt="Схема: прямое подключение к OpenAI vs работа через российского посредника — налоговая нагрузка и документооборот" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  УПД 5.03 — главный документ 2026 года
&lt;/h2&gt;

&lt;p&gt;Универсальный передаточный документ — российская изобретательность в чистом виде. Это один документ, который одновременно закрывает функции акта оказанных услуг (или товарной накладной) и счёта-фактуры. Введён приказом ФНС России от 21.10.2013 № ММВ-20-3/96@, развивался долго, но в 2025 году получил кардинальное обновление.&lt;/p&gt;

&lt;p&gt;Приказ ФНС России от 15.11.2024 № ЕД-7-26/1032@ (&lt;a href="https://www.garant.ru/consult/account/1984933/" rel="noopener noreferrer"&gt;garant.ru&lt;/a&gt;) утвердил новый формат электронного УПД версии 5.03, который вступил в силу 23 января 2025 года. Старый формат 5.02 продолжал действовать в течение переходного периода, но &lt;a href="https://tochka.com/knowledge/edo/s-2026-goda-upd-stanovitsya-edinstvennym-elektronnym-dokumentom-fns-otmenyaet-starye-formaty/" rel="noopener noreferrer"&gt;с 1 января 2026 года&lt;/a&gt; формат 5.03 стал единственным легитимным электронным форматом для передачи закрывающих документов через ЭДО — независимо от того, оформляете вы услуги, работы или товары.&lt;/p&gt;

&lt;p&gt;Что важно знать бухгалтеру о УПД 5.03:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Один XML-файл вместо двух.&lt;/strong&gt; Раньше для услуг, облагаемых НДС, требовалось два отдельных документа — акт и счёт-фактура. УПД 5.03 объединяет их в один структурированный файл, который читается и поставщиком, и покупателем в любой бухгалтерской программе, поддерживающей формат (&lt;a href="https://www.kontur-extern.ru/info/83204-ispolzovanie_upd" rel="noopener noreferrer"&gt;Контур.Экстерн&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Три функции вместо двух.&lt;/strong&gt; УПД может выступать в трёх ролях, обозначаемых атрибутом «функция»:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Функция «1» — счёт-фактура + первичный документ (для контрагентов с НДС);&lt;/li&gt;
&lt;li&gt;Функция «2» — только первичный документ (для контрагентов на УСН без НДС);&lt;/li&gt;
&lt;li&gt;Функция «3» — только счёт-фактура (исключительная, редкая для услуг).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Машиночитаемая структура.&lt;/strong&gt; XML-формат позволяет автоматически загружать УПД в 1С:Бухгалтерию, SAP, Контур.Бухгалтерию и аналоги. Для бухгалтера это значит, что после получения документа через ЭДО не нужно вручную вбивать суммы, ставки НДС, номенклатуру — всё подтягивается в учёт автоматически.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Обязательные реквизиты.&lt;/strong&gt; УПД 5.03 включает все требования ст. 169 НК РФ к счёту-фактуре плюс реквизиты первичного учётного документа по ст. 9 № 402-ФЗ. Это значит наличие: номера и даты, наименований сторон, ИНН/КПП, адресов, описания услуги, единицы измерения, количества, цены, ставки НДС, суммы НДС, итоговой суммы, подписей уполномоченных лиц с указанием должности и реквизитами доверенности (если подписант не директор).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Электронная подпись — квалифицированная.&lt;/strong&gt; УПД 5.03 подписывается только усиленной квалифицированной электронной подписью (УКЭП), выданной аккредитованным удостоверяющим центром. Простая или неквалифицированная подпись не принимается — это требование № 63-ФЗ «Об электронной подписи».&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Для AI-сервисов поле «Наименование товара (описание выполненных работ, оказанных услуг)» — критическое. Корректная формулировка должна включать: характер услуги (предоставление доступа), объект услуги (API больших языковых моделей / нейросетей), период оказания (например, май 2026), привязку к договору (номер и дата). Например:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Оказание услуг по предоставлению доступа к API больших языковых моделей за май 2026 г. по договору-оферте № 1 от 01.04.2026&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1nibfn58hh4cwowhbqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1nibfn58hh4cwowhbqz.png" alt="Структура УПД 5.03: верхняя часть как счёт-фактура, нижняя как акт услуг, единая XML-обёртка" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Если ваш провайдер AI-услуг отказывается передавать УПД через ЭДО под предлогом «у нас нет такой возможности» или предлагает бумажный акт с подписью отсканированной печати — это сигнал, что у контрагента не выстроен налоговый учёт по российскому стандарту. С 2026 года такая позиция приведёт к проблемам обеих сторон: ваша бухгалтерия не сможет нормально вести книгу покупок, а провайдер рискует попасть под санкции ФНС за нарушение требований к электронному документообороту.&lt;/p&gt;

&lt;h2&gt;
  
  
  Альтернатива УПД: договор + счёт + акт + счёт-фактура
&lt;/h2&gt;

&lt;p&gt;Универсальный передаточный документ не единственный путь. Классическая четвёрка документов — договор, счёт на оплату, акт оказанных услуг, счёт-фактура — остаётся легальной альтернативой и применяется в ряде ситуаций:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Бумажный документооборот.&lt;/strong&gt; Если у одной из сторон не подключён ЭДО (что для услуг между юр.лицами с 2026 года скорее исключение), документы могут передаваться в бумажном виде. Тогда УПД технически тоже возможен на бумаге, но классическая четвёрка привычнее для бухгалтерий старой школы.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Специфические договорные конструкции.&lt;/strong&gt; В сложных смешанных договорах (например, лицензионный договор + договор оказания услуг + дополнительное соглашение по обработке персональных данных) удобнее разделять документооборот по типам обязательств.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Длинные расчётные циклы.&lt;/strong&gt; Если услуга оказывается в течение нескольких месяцев с авансовыми платежами и поэтапной приёмкой, бухгалтеры предпочитают раздельное оформление счетов-фактур на аванс и закрывающих актов после каждого этапа.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Однако для типового сценария «ежемесячный доступ к AI-API с постоплатой по факту использования» четыре отдельных документа создают избыточную бумажную нагрузку:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Договор-оферта&lt;/strong&gt; — фиксирует общие условия (тарифы, ответственность, лимиты, политика обработки данных). Один на всё время сотрудничества.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Счёт на оплату&lt;/strong&gt; — выставляется при пополнении баланса или по итогам периода. Не является первичным документом, но используется банком для идентификации платежа.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Акт оказанных услуг&lt;/strong&gt; — подтверждает факт оказания услуги в конкретном периоде. Подписывается обеими сторонами.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Счёт-фактура&lt;/strong&gt; — налоговый документ для целей НДС, формируется отдельно. Подписывается только поставщиком.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;В сумме это четыре документа в обороте против одного УПД на ту же операцию. Бухгалтерии IT-компаний с большим количеством AI-расходов крайне рекомендуется требовать УПД 5.03 — это сокращает объём первички на 75% при той же юридической силе.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5senzdpl39zjher8rst.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5senzdpl39zjher8rst.png" alt="Сравнительная инфографика: классическая четвёрка документов против одного УПД 5.03 — экономия времени бухгалтера" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  152-ФЗ для AI-сервисов: что изменилось в 2025–2026 годах
&lt;/h2&gt;

&lt;p&gt;Использование больших языковых моделей почти всегда связано с обработкой персональных данных — даже если вы об этом не задумывались. Промт «составь резюме сотрудника Иванова И. И., родившегося в Москве в 1985 году, с опытом работы в банковской сфере» — это уже передача персональных данных третьей стороне (оператору LLM) для их обработки. И это автоматически делает вашу компанию субъектом регулирования № 152-ФЗ «О персональных данных».&lt;/p&gt;

&lt;p&gt;Закон № 420-ФЗ от 30 мая 2025 года (&lt;a href="https://stakhanovets.ru/blog/152-fz-o-zashhite-personalnyh-dannyh-trebovaniya-i-shtrafy-v-2026-godu/" rel="noopener noreferrer"&gt;Stakhanovets&lt;/a&gt;) внёс серьёзные поправки в № 152-ФЗ, которые специально адресовали взрывной рост использования AI:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Усиление требований к локализации.&lt;/strong&gt; По обновлённой ст. 18 № 152-ФЗ операторы персональных данных обязаны хранить и обрабатывать персональные данные граждан РФ исключительно на серверах, физически расположенных на территории Российской Федерации. Это означает, что прямая отправка персональных данных в OpenAI, Anthropic, Google Gemini — нарушение закона, если соответствующие серверные мощности находятся за рубежом.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Согласие на использование данных для обучения моделей ИИ.&lt;/strong&gt; В обновлённой редакции ст. 9 № 152-ФЗ согласие субъекта на обработку персональных данных должно отдельно содержать пункт о возможности использования этих данных для машинного обучения или обучения нейросетей. Стандартная фраза «согласен на обработку моих персональных данных» больше недостаточна — нужно явное упоминание AI-сценариев.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Обязательное обезличивание.&lt;/strong&gt; Перед отправкой данных во внешние модели (даже на российские LLM-сервисы) оператор обязан провести обезличивание — заменить идентифицирующую информацию на условные обозначения, удалить паспортные данные, точные адреса, ИНН. Это требование вытекает из принципов минимизации данных (ст. 5 № 152-ФЗ).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Технические меры защиты.&lt;/strong&gt; ФСТЭК и Роскомнадзор уточнили перечень обязательных технических мер: шифрование каналов передачи (TLS 1.3 минимум), журналирование всех операций обработки, контроль доступа на уровне ролей, регулярное резервное копирование, сегментация сети, антивирусная защита, защита от утечек (DLP) — для операторов от уровня УЗ-3 и выше.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Штрафы выросли кардинально.&lt;/strong&gt; С 30 мая 2025 года штрафы за нарушение № 152-ФЗ для юридических лиц составляют от 300 тыс. до 18 млн ₽ — в зависимости от категории нарушения. Повторные нарушения и утечки персональных данных могут довести штраф до 500 млн ₽ (&lt;a href="https://b-152.ru/pdn-i-ii" rel="noopener noreferrer"&gt;b-152.ru&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Что это означает на практике для IT-компании, использующей AI-API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Проверьте регистрацию провайдера в Роскомнадзоре.&lt;/strong&gt; Любой посредник или провайдер AI-услуг, через которого вы передаёте персональные данные, обязан быть включён в Реестр операторов персональных данных. Без этого — работать с ним нельзя, расход не примут, а вам как заказчику грозит штраф за выбор недобросовестного контрагента.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подписывайте отдельное соглашение об обработке ПДн.&lt;/strong&gt; Стандартная оферта на доступ к AI-API не закрывает все требования № 152-ФЗ. Нужно подписать дополнительное соглашение или включить в основной договор раздел «Порядок обработки персональных данных», где зафиксировать: какие категории ПДн передаются, цели обработки, срок хранения, меры защиты, ответственность за утечки.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Внедрите процесс обезличивания на стороне приложения.&lt;/strong&gt; Перед отправкой промта в LLM — пропускайте его через слой маскирования: имена → токены, номера телефонов → плейсхолдеры, точные адреса → города. Это снижает риски при возможной утечке на стороне модели.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Проверяйте локализацию серверной инфраструктуры провайдера.&lt;/strong&gt; Российский посредник, который физически проксирует запросы в зарубежную модель, обязан хранить логи и метаданные на территории РФ. Запросите у провайдера подтверждение размещения серверов в РФ (например, скриншот ЦОД, сертификат, договор с дата-центром).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh30yqii5qxjiy8cfy65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh30yqii5qxjiy8cfy65.png" alt="Карта данных при работе с AI через посредника: персональные данные не покидают РФ, в зарубежную модель уходит обезличенный промт" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ЭДО-операторы: Диадок, СБИС, 1С-ЭДО — что выбрать
&lt;/h2&gt;

&lt;p&gt;Чтобы получать УПД 5.03 в электронном виде, обеим сторонам — и провайдеру, и покупателю — нужно быть подключёнными к одному из аккредитованных ФНС операторов электронного документооборота. Их в России десятки, но более 80% юридически значимого трафика обеспечивают три крупных игрока:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Контур.Диадок&lt;/strong&gt; — флагман рынка, ~40% юридически значимого трафика по результатам &lt;a href="https://vc.ru/official_/2856443-reyting-operatorov-edo-v-rossii" rel="noopener noreferrer"&gt;рейтинга операторов ЭДО&lt;/a&gt;. Полная интеграция с другими сервисами СКБ Контур (Эльба, Бухгалтерия, Экстерн, Маркет), удобный веб-кабинет, мобильное приложение, открытый API для интеграции с 1С и SAP. Тариф для покупателя — входящие документы бесплатно, исходящие от 5 ₽ за документ. Минимум 200 документов в год для подключения корпоративного тарифа.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;СБИС (Тензор)&lt;/strong&gt; — второй по объёму, с уклоном в мульти-сервисность. Помимо ЭДО, СБИС предлагает CRM, бухгалтерию, систему сдачи отчётности, кадровый учёт, инструменты для торговли — всё в одном экосистемном решении. Конкурентная цена для небольших компаний, гибкие пакеты. Сильная сторона — встроенная сверка с контрагентами и автоматическое формирование актов сверки.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1С-ЭДО&lt;/strong&gt; — оператор от 1С Софт, ориентированный на пользователей экосистемы 1С. Если у вас 1С:Бухгалтерия 8.3, 1С:ERP или 1С:Управление торговлей — 1С-ЭДО встроен в учётную программу и не требует переключения между интерфейсами. Тариф включён в стандартную поддержку 1С (ИТС) — для многих компаний это значит «бесплатно сверх того, что уже платится».&lt;/p&gt;

&lt;p&gt;Помимо троих лидеров, на рынке работают: Калуга Астрал (Астрал.ЭДО), Такском, Энтер.Эра, Линк, Колибри.ЭДО — все они интегрированы в общую систему роуминга.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11kgzznm40usy13ciufz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11kgzznm40usy13ciufz.png" alt="Сравнение трёх крупнейших операторов ЭДО в РФ: Диадок, СБИС, 1С-ЭДО — функционал, цены, целевая аудитория" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Роуминг между операторами.&lt;/strong&gt; Раньше для обмена документами обе стороны должны были быть подключены к одному и тому же оператору, либо настраивать сложный роуминг вручную. Сейчас &lt;a href="https://getmark.ru/blog/o-markirovke/rouming-edo-mezhdu-operatorami-nastrojka-sbis-diadok-kontur/" rel="noopener noreferrer"&gt;роуминг между крупными операторами&lt;/a&gt; настраивается автоматически в течение нескольких часов после первого исходящего/входящего документа. Это означает, что если ваш провайдер AI-услуг сидит на Диадоке, а вы — на 1С-ЭДО, документы будут проходить через автоматический роуминговый канал без дополнительных настроек.&lt;/p&gt;

&lt;p&gt;Что важно проверить при выборе оператора для работы с AI-провайдерами:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Поддержка формата УПД 5.03.&lt;/strong&gt; Все три крупных оператора поддерживают новый формат, но более мелкие и региональные операторы могут отставать. Уточняйте при подключении.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Тарификация исходящих/входящих.&lt;/strong&gt; Для покупателя AI-услуг входящие документы обычно бесплатны — основная статья расходов лежит на отправителе.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Интеграция с учётной программой.&lt;/strong&gt; Если у вас 1С — 1С-ЭДО будет проще. Если у вас SAP/Oracle или своя учётка — Диадок предлагает наиболее гибкий API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Сертификат электронной подписи.&lt;/strong&gt; Для подписания УПД нужен УКЭП, выданный аккредитованным удостоверяющим центром. Сертификат привязан к конкретному физическому лицу (директор или уполномоченный сотрудник по доверенности).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Типовые ошибки бухгалтерии: 5 кейсов, когда налоговая снимает расход
&lt;/h2&gt;

&lt;p&gt;В реальной практике налоговые проверки IT-компаний в части AI-расходов выявляют пять повторяющихся ошибок. Каждая из них может привести к доначислению налога на прибыль, НДС и штрафов. Разберём по порядку с цитированием &lt;a href="https://www.klerk.ru/blogs/roskom24/683007/" rel="noopener noreferrer"&gt;материалов Клерк.ру&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Кейс 1: Оплата с корпоративной карты или card2card без закрывающих документов
&lt;/h3&gt;

&lt;p&gt;CTO IT-компании оплачивает подписку на Anthropic Claude или OpenAI ChatGPT Plus с корпоративной карты в долларах. Платёж проходит, лимит на API доступен, всё работает. Месяц спустя бухгалтерия пытается принять расход к учёту — и обнаруживает, что в подтверждающих документах есть только: банковская выписка о списании с карты и email-уведомление о платеже от провайдера на английском языке.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что не так.&lt;/strong&gt; Письмо в email не является первичным документом по ст. 9 № 402-ФЗ — оно не содержит обязательных реквизитов (нет печати/подписи, нет номера, нет указания сторон в полном формате с ИНН). Банковская выписка подтверждает движение средств, но не оказание услуги. Налоговая инспекция при проверке снимет такой расход с базы по налогу на прибыль.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что делать.&lt;/strong&gt; Либо оформлять расход через подотчётное лицо с обязательным предоставлением закрывающих документов от иностранного контрагента (что само по себе технически и юридически сложно), либо работать через российского посредника, который выдаёт УПД 5.03 на каждый расчётный период.&lt;/p&gt;

&lt;h3&gt;
  
  
  Кейс 2: Оплата через ИП-посредника без агентского договора
&lt;/h3&gt;

&lt;p&gt;В чате стартап-комьюнити вам предложили: «Я ИП на УСН 6%, могу выставлять счета на доступ к OpenAI, всё подключу — переводите деньги на мой расчётный счёт, я пересылаю провайдеру». Привлекательно: ИП находится в РФ, делает счета в рублях, валютный контроль не возникает.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что не так.&lt;/strong&gt; ИП без агентского договора не может перевыставлять услуги третьей стороны — это противоречит ст. 1005 ГК РФ и налоговому учёту по упрощённой системе. Если ИП формально оказывает «свою» услугу по доступу к нейросети, но фактически прокладывает деньги в OpenAI без специальной лицензии — налоговая может переквалифицировать платежи в дарение (между юр.лицом и ИП — запрещено по ст. 575 ГК РФ) или в незаконную предпринимательскую деятельность.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что делать.&lt;/strong&gt; Работать только с теми посредниками, которые имеют юридически корректную структуру: либо собственный сервис с подписанным с провайдером договором, либо оформленные агентские отношения с указанием в платёжных документах вознаграждения агента отдельно от стоимости основной услуги.&lt;/p&gt;

&lt;h3&gt;
  
  
  Кейс 3: Размытая формулировка предмета услуги в акте
&lt;/h3&gt;

&lt;p&gt;В акте оказанных услуг указано: «Оказаны услуги по договору № 1 от 01.04.2026». Точка. Никакого описания. Бухгалтер расписывается, отправляет в учёт.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что не так.&lt;/strong&gt; При выездной проверке инспектор имеет право запросить расшифровку — какие именно услуги были оказаны, в каком объёме, по какой цене единицы. Без чёткой формулировки невозможно подтвердить экономическую обоснованность расхода (ст. 252 НК РФ) и связь с деятельностью, направленной на получение дохода. Это особенно критично для IT-компаний, где расход на AI должен быть привязан к конкретным продуктам или услугам.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что делать.&lt;/strong&gt; Требовать в акте/УПД развёрнутую формулировку, как минимум содержащую: характер услуги, объект, период, ссылку на договор. Идеальная формулировка для AI-API:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Оказание услуг по предоставлению доступа к API больших языковых моделей (GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro и других) за период с 01.05.2026 по 31.05.2026 по договору-оферте № [номер] от [дата]. Объём: [N] запросов, [M] млн токенов входящих, [K] млн токенов исходящих.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Кейс 4: Счёт-фактура без НДС от резидента — проверка статуса
&lt;/h3&gt;

&lt;p&gt;Российский посредник выставляет счёт на 100 тыс. ₽ без НДС, в счёте-фактуре указано: «НДС не облагается на основании п. 2 ст. 346.11 НК РФ (применяется УСН)». Вы платите, ставите в расход. Через год — выездная проверка, и оказывается, что посредник на самом деле уже два месяца как должен был перейти на ОСНО, потому что превысил порог по выручке.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что не так.&lt;/strong&gt; Если ваш контрагент должен был применять НДС, но не применял, ФНС восстанавливает НДС задним числом — и у вас возникает ситуация, когда вы не приняли к вычету НДС, который должен был быть включён в цену. Восстановить вычет в этом случае почти невозможно.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что делать.&lt;/strong&gt; Перед заключением договора с любым посредником запросите у него: выписку из ЕГРЮЛ, уведомление о применении специального налогового режима (УСН/АУСН/ПСН), декларации за последний период. Минимум — проверьте контрагента через бесплатные сервисы (Контур.Фокус, СБИС, ZACHESTNYIBIZNES) — там видна история смены режимов налогообложения.&lt;/p&gt;

&lt;h3&gt;
  
  
  Кейс 5: Оплата через ЮMoney, QIWI, Яндекс.Деньги или другие электронные деньги физлица
&lt;/h3&gt;

&lt;p&gt;Иногда команды без юр.лица или с минимальным юридическим оформлением пытаются оплатить AI-сервисы через системы электронных денег или с личного счёта физлица.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что не так.&lt;/strong&gt; Платежи с электронных кошельков физических лиц, не привязанных к расчётному счёту юр.лица, не признаются ФНС как корпоративные расходы. Закрывающих документов на физлицо контрагент не выдаст (это требует другого договора и НДФЛ-учёта). В результате — расход на компанию не подтверждён, а средства физлица — потенциально облагаются НДФЛ как невозвратные траты в личных целях.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Что делать.&lt;/strong&gt; Все корпоративные расходы — только с расчётного счёта юр.лица или с корпоративной карты, привязанной к расчётному счёту, и обязательно с предоставлением закрывающих документов от контрагента, оформленных на полное юридическое наименование вашей компании с ИНН/КПП.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwohgd3u4wlqd9kpim9tw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwohgd3u4wlqd9kpim9tw.png" alt="Чек-лист пяти типовых ошибок бухгалтерии при учёте AI-расходов — что налоговая снимает с базы" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Чек-лист для постановки на учёт расхода на LLM API
&lt;/h2&gt;

&lt;p&gt;Соберём всё разобранное в единый чек-лист, который ваша бухгалтерия должна выполнить для каждого периода (месяца, квартала) при учёте расходов на доступ к нейросетям. Распечатайте, повесьте на стену, прикладывайте к каждому AI-расходу.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Договор с провайдером (оферта или индивидуальный).&lt;/strong&gt; Должен содержать:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Полные реквизиты сторон (наименование, ИНН/КПП, адрес, банковские реквизиты, директор/уполномоченное лицо).&lt;/li&gt;
&lt;li&gt;Описание предмета договора в формулировках, понятных налоговой («услуги по предоставлению доступа к API…»).&lt;/li&gt;
&lt;li&gt;Стоимость услуг (тарифы, формула расчёта, условия пополнения баланса).&lt;/li&gt;
&lt;li&gt;Срок действия и порядок продления.&lt;/li&gt;
&lt;li&gt;Порядок обработки персональных данных (с отсылкой к № 152-ФЗ).&lt;/li&gt;
&lt;li&gt;Подписи и печати (либо электронные подписи с указанием квалифицированности).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Счёт на оплату (если оплата не через автосписание).&lt;/strong&gt; Не является первичным документом, но используется для идентификации платежа в банке. Должен содержать:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Реквизиты плательщика и получателя.&lt;/li&gt;
&lt;li&gt;Назначение платежа («Оплата по договору № X от Y. НДС в т. ч. / НДС не облагается на основании…»).&lt;/li&gt;
&lt;li&gt;Сумму и срок оплаты.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Платёжное поручение (банковский документ).&lt;/strong&gt; Подтверждает факт оплаты. Хранится в банковской выписке. Назначение платежа должно совпадать с тем, что указано в счёте — без расхождений.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. УПД 5.03 от провайдера через ЭДО.&lt;/strong&gt; Главный закрывающий документ. Должен содержать:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Корректную функцию («1» с НДС или «2» без НДС в зависимости от системы налогообложения провайдера).&lt;/li&gt;
&lt;li&gt;Развёрнутую формулировку услуги.&lt;/li&gt;
&lt;li&gt;Период оказания.&lt;/li&gt;
&lt;li&gt;Стоимость и НДС.&lt;/li&gt;
&lt;li&gt;Усиленную квалифицированную электронную подпись.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Подтверждение получения УПД в ЭДО.&lt;/strong&gt; Файл «титул покупателя» — ваш контрагент подтверждает приёмку услуг через свою УКЭП. Без этого УПД не считается завершённым документом.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Запись в книге покупок (при работе с НДС).&lt;/strong&gt; Для плательщиков НДС счёт-фактура (или функция «1» в УПД) фиксируется в книге покупок с указанием:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Реквизитов УПД (номер, дата).&lt;/li&gt;
&lt;li&gt;Реквизитов продавца.&lt;/li&gt;
&lt;li&gt;Стоимости услуг с НДС и без НДС.&lt;/li&gt;
&lt;li&gt;Суммы НДС, принимаемого к вычету.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7. Учёт в бухгалтерской программе.&lt;/strong&gt; Финальный шаг — отражение в 1С / SAP / своей учётке. Расход относится на счёт 26 «Общехозяйственные расходы» или 44 «Расходы на продажу» (если AI применяется в продажах) с раскрытием по статье расходов («IT-расходы», «Программное обеспечение и сервисы»).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Связь с экономической обоснованностью.&lt;/strong&gt; Желательно сопроводить расход внутренней служебной запиской или приказом руководителя о необходимости использования AI-инструментов для решения конкретных бизнес-задач (например, «Автоматизация ответов на типовые обращения клиентов», «Анализ резюме при подборе персонала», «Обучение моделей машинного перевода для портала компании»). Это закрывает требование ст. 252 НК РФ об экономической обоснованности.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdwpyl79bmikwjxfp3e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdwpyl79bmikwjxfp3e1.png" alt="Чек-лист закрывающих документов на AI-расход: от договора до записи в книге покупок" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Дополнительные нюансы для разных систем налогообложения
&lt;/h2&gt;

&lt;p&gt;Учётная схема расходов на AI-API зависит от вашей системы налогообложения:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ОСНО (Общая система налогообложения).&lt;/strong&gt; Расходы признаются по методу начисления (ст. 271–272 НК РФ). НДС, выделенный в УПД, принимается к вычету при наличии всех условий: услуга оприходована, есть УПД с функцией «1», услуги используются в деятельности, облагаемой НДС.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;УСН «Доходы минус расходы» (15%).&lt;/strong&gt; Расходы признаются после фактической оплаты (кассовый метод). Перечень расходов закрытый — ст. 346.16 НК РФ. AI-расходы относятся к категории «материальные расходы» или «прочие расходы, связанные с производством и реализацией» — нужно правильно квалифицировать. Желательно сохранять расширенную формулировку услуги, чтобы при проверке доказать соответствие закрытому перечню.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;УСН «Доходы» (6%).&lt;/strong&gt; Расходы не учитываются для целей налогообложения — налог платится только с доходов. Тем не менее закрывающие документы нужны для бухгалтерского учёта и в случае возможной смены режима.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;АУСН (Автоматизированная упрощённая система).&lt;/strong&gt; Новый режим, действующий с 2022 года. Расходы и доходы учитываются автоматически по данным операторов фискальных данных и банков. УПД через ЭДО автоматически попадает в учёт АУСН — это одно из преимуществ режима.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ИП на ПСН (патент).&lt;/strong&gt; Расходы не учитываются — налог фиксированный. УПД нужен для отчётности перед заказчиками (если есть) и для контроля собственных расходов.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что выбрать прямо сейчас: рекомендации для CFO IT-компании
&lt;/h2&gt;

&lt;p&gt;После всего разобранного — практические рекомендации для финансового директора, CFO или главного бухгалтера IT-компании, которая системно тратит на AI-инструменты:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Первое — требуйте УПД 5.03 как стандарт.&lt;/strong&gt; При заключении любого нового договора на AI-API или при пересмотре существующих условий — фиксируйте в договоре обязательство провайдера передавать закрывающие документы по формату УПД 5.03 через ЭДО. Это становится отраслевым стандартом для России, и провайдеры, которые сопротивляются, рано или поздно его внедрят — но если требование зафиксировать сразу, вы избежите промежуточного хаоса.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Второе — централизуйте AI-расходы через единого посредника.&lt;/strong&gt; Если у вас в команде 20 разработчиков, каждый из которых имеет личный аккаунт OpenAI/Anthropic/Google AI Studio и оплачивает с личной карты с компенсацией, — это бухгалтерский ад. Централизованный кабинет с единым биллингом и одним УПД в месяц на всю компанию решает проблему документооборота и одновременно даёт прозрачность по затратам.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Третье — проверяйте посредника на статус оператора ПДн.&lt;/strong&gt; Запросите выписку из Реестра операторов персональных данных Роскомнадзора. Если посредник в реестре отсутствует — работать с ним нельзя.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Четвёртое — настройте процесс обезличивания.&lt;/strong&gt; Внедрите на стороне приложения слой маскирования персональных данных перед отправкой в LLM. Это снизит регуляторные риски и одновременно облегчит работу с моделями (модели не «утекают» в логах с реальными данными ваших клиентов).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Пятое — ведите внутренний реестр AI-сервисов.&lt;/strong&gt; В корпоративной wiki или базе документов держите актуальный список используемых AI-инструментов с указанием: что используется, кем, для каких задач, кто отвечает за договор, какой посредник, каков бюджет. Это критично для № 152-ФЗ и для финансового планирования.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/"&gt;Promptra&lt;/a&gt; включает УПД 5.03 через Диадок и СБИС в стандартный пакет услуг — без дополнительной платы и переговоров. Полные реквизиты российское юр.лицо доступны на странице &lt;a href="https://promptra.ru/legal/requisites/" rel="noopener noreferrer"&gt;/legal/requisites&lt;/a&gt; для проверки контрагента через Контур.Фокус, СБИС или ZACHESTNYIBIZNES. Дополнительное соглашение об обработке персональных данных подписывается на стадии подключения. Регистрация в Реестре операторов персональных данных Роскомнадзора — подтверждается выпиской по запросу.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b54x3ot1icx52m201fo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b54x3ot1icx52m201fo.png" alt="Стандартный пакет закрывающих документов от Promptra: договор, УПД 5.03, доп. соглашение по ПДн — всё через ЭДО" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Заключение: AI-расходы как нормальная статья бюджета
&lt;/h2&gt;

&lt;p&gt;Несколько лет назад расходы на нейросети казались чем-то экспериментальным — пилотами, R&amp;amp;D-затратами, которые проще списать на «прочие расходы» и не заморачиваться с документооборотом. К 2026 году ситуация изменилась радикально: AI-инструменты стали такой же стандартной статьёй IT-бюджета, как облачный хостинг, корпоративная почта и СУБД. И налоговая инспекция воспринимает их именно так — как обычные услуги, требующие обычного документооборота.&lt;/p&gt;

&lt;p&gt;Хорошая новость в том, что инфраструктура для нормального учёта AI-расходов в России уже выстроена. УПД 5.03 — общероссийский стандарт электронного документа. Три крупных оператора ЭДО — Диадок, СБИС, 1С-ЭДО — обеспечивают подключение для бизнеса любого размера. № 152-ФЗ с поправками 2025 года даёт чёткие правила работы с персональными данными в AI-сценариях. Российские посредники AI-API закрывают валютный контроль и предоставляют российскую первичку.&lt;/p&gt;

&lt;p&gt;Плохая новость в том, что если ваша бухгалтерия до сих пор учитывает AI-расходы по схеме «банковская выписка плюс email от провайдера» — вы накапливаете налоговые риски с каждым месяцем. Выездная проверка ФНС за последние три года выявит все card2card-платежи, все переводы на ИП-посредников без агентских договоров, все списания через личные карты сотрудников. Доначисление по налогу на прибыль плюс штрафы по № 152-ФЗ способны превысить весь годовой бюджет на AI-инструменты.&lt;/p&gt;

&lt;p&gt;Регламент закрывающих документов — это страховка. Один договор, один УПД в месяц, одна запись в книге покупок, одна проводка в 1С. Кажется простым — но именно эта простота делает AI-расходы налогово устойчивыми, прозрачными для совета директоров и комфортными для бухгалтерии.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;Главный гайд по теме:&lt;/strong&gt; &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico/" rel="noopener noreferrer"&gt;Легально ли использовать OpenAI и Claude на юрлицо в РФ&lt;/a&gt; — связанные материалы и обзор всей категории.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>152</category>
      <category>llm</category>
    </item>
    <item>
      <title>Webhook'и и async events с LLM в production: best practices 2026 для Python</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Wed, 17 Jun 2026 12:50:02 +0000</pubDate>
      <link>https://dev.to/promptra-team/webhooki-i-async-events-s-llm-v-production-best-practices-2026-dlia-python-3kdo</link>
      <guid>https://dev.to/promptra-team/webhooki-i-async-events-s-llm-v-production-best-practices-2026-dlia-python-3kdo</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp5luxg9vb0y09jbd9x7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp5luxg9vb0y09jbd9x7.png" alt="Инфографика async webhook-архитектуры с LLM: HTTP-вход с подписью HMAC идёт в FastAPI, оттуда задача попадает в Celery-очередь Redis, worker дёргает Promptra API и возвращает результат в callback URL клиента; плоский векторный стиль" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Когда LLM-запрос идёт 12 секунд, а у вас 80 RPS на endpoint — синхронный паттерн «принял HTTP, вызвал OpenAI, ответил» убьёт сервис за 45 секунд. Все воркеры зависнут на ожидании, очередь TCP-коннектов забьётся, балансировщик начнёт отдавать 503. Правильный production-паттерн — &lt;strong&gt;async queue + worker + webhook callback&lt;/strong&gt;. Через единый шлюз &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;Promptra&lt;/a&gt; флагманы (Claude Opus 4.7 — 350/1790 ₽, GPT-5.5 — 350/2150 ₽, Gemini 3.1 Pro — 140/860 ₽, DeepSeek V4 Pro — 30/60 ₽) доступны через OpenAI-совместимый формат, что делает архитектуру переносимой между провайдерами одной заменой &lt;code&gt;base_url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Этот гайд — рабочий код FastAPI + Celery + Redis для production LLM-pipeline: HTTP-вход валидирует и кладёт задачу за 50 мс, worker выполняет долгий вызов, webhook callback возвращает результат с HMAC-подписью. Включены idempotency keys, retry с exponential backoff, dead-letter queue, мониторинг через Flower и точные настройки таймаутов. оплата в рублях по договору, полный пакет закрывающих документов.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR — async pipeline за 5 шагов
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;HTTP-ручка &lt;code&gt;POST /v1/jobs&lt;/code&gt; принимает запрос с &lt;code&gt;Idempotency-Key&lt;/code&gt;, валидирует, кладёт задачу в Redis-очередь, отвечает &lt;code&gt;202 Accepted&lt;/code&gt; с &lt;code&gt;job_id&lt;/code&gt; за 50 мс.&lt;/li&gt;
&lt;li&gt;Celery worker берёт задачу, вызывает LLM через Promptra с timeout 120 сек, сохраняет результат в Redis.&lt;/li&gt;
&lt;li&gt;После успеха worker шлёт POST на &lt;code&gt;callback_url&lt;/code&gt; клиента с результатом и заголовком &lt;code&gt;X-Promptra-Signature&lt;/code&gt; (HMAC-SHA256).&lt;/li&gt;
&lt;li&gt;На сбое callback — retry 5 раз с backoff (1с, 5с, 25с, 2 мин, 10 мин), после — dead-letter queue.&lt;/li&gt;
&lt;li&gt;Клиент проверяет подпись через &lt;code&gt;hmac.compare_digest&lt;/code&gt; и подтверждает приём &lt;code&gt;200 OK&lt;/code&gt;. Эта статья — production-расширение нашего pillar-гида &lt;a href="https://promptra.ru/blog/llm-api-na-python-polnyy-tehnicheskiy-gid-2026/" rel="noopener noreferrer"&gt;полный технический гид по LLM API на Python: токены, function calling, streaming, RAG, async/batch&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Почему синхронный вызов в HTTP-обработчике — это катастрофа
&lt;/h2&gt;

&lt;p&gt;Стандартная FastAPI-ручка с прямым вызовом OpenAI выглядит «нормально» — но в production она ломается линейно с нагрузкой:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# АНТИПАТТЕРН — НЕ ДЕЛАЙТЕ ТАК В PRODUCTION
&lt;/span&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Что произойдёт под нагрузкой 50 RPS если средняя латентность Opus 4.7 — 12 секунд?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Одновременно в обработке: 50 × 12 = &lt;strong&gt;600 запросов&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Воркеров (uvicorn workers) обычно 4–8 — каждый держит async event loop, но всё равно есть лимит на одновременные коннекты к OpenAI клиенту (по умолчанию 100).&lt;/li&gt;
&lt;li&gt;Через минуту коннекты исчерпаны, новые запросы зависают в pool wait, клиенты получают 504 Gateway Timeout.&lt;/li&gt;
&lt;li&gt;Браузер закрывает соединение по своему таймауту 30 сек — LLM продолжает генерить ответ, который никому не нужен, но за токены вы платите.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Правильно — разделить &lt;strong&gt;приём запроса&lt;/strong&gt; (быстрый HTTP) и &lt;strong&gt;выполнение&lt;/strong&gt; (долгий worker). HTTP-ручка работает 50 мс, worker — 12 секунд. Сервер обслуживает тысячи RPS, worker pool масштабируется отдельно. См. также гайд &lt;a href="https://promptra.ru/blog/streaming-sse-llm-api-python-realtime-otvety" rel="noopener noreferrer"&gt;Streaming LLM-ответов через SSE&lt;/a&gt; — это альтернатива для интерактивных чатов, async webhook — для batch и интеграций.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxgq47u80n2tl3ltfc70c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxgq47u80n2tl3ltfc70c.png" alt="Сравнительная схема: слева красный блок «синхронный паттерн» с очередью зависших воркеров и индикатором 504 Gateway Timeout, справа зелёный блок «async pipeline» с быстрым HTTP-ответом 202 и отдельным worker pool; стрелка времени снизу показывает «50 мс» против «12 с»; заголовок «Почему синхронный паттерн ломается»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Архитектура: FastAPI + Celery + Redis
&lt;/h2&gt;

&lt;p&gt;Базовый стек для async LLM-pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; — HTTP-вход, валидация, постановка задач. Документация — &lt;a href="https://fastapi.tiangolo.com" rel="noopener noreferrer"&gt;fastapi.tiangolo.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Celery&lt;/strong&gt; — distributed task queue с retry, scheduling и мониторингом. Альтернативы: RQ (проще), Arq (async-first), Dramatiq.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; — backend для очереди и хранилище job state. Документация — &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;redis.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flower&lt;/strong&gt; — веб-UI для мониторинга Celery, показывает live воркеры, очереди и фейлы.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Минимальная структура проекта:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
├── app/
│   ├── main.py           # FastAPI HTTP-вход
│   ├── tasks.py          # Celery tasks
│   ├── celery_app.py     # Celery конфиг
│   ├── llm_client.py     # обёртка над Promptra
│   ├── webhooks.py       # отправка callback
│   └── models.py         # Pydantic схемы
├── docker-compose.yml    # redis + flower + worker
└── requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;celery_app.py&lt;/code&gt; — конфигурация воркеров с правильными таймаутами:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Celery&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;celery_app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Celery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;promptra_jobs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;REDIS_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis://localhost:6379/0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;backend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;REDIS_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis://localhost:6379/0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;celery_app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;task_serializer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;accept_content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;result_serializer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Europe/Moscow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;enable_utc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;task_acks_late&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;# ack только после успеха
&lt;/span&gt;    &lt;span class="n"&gt;task_reject_on_worker_lost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# вернуть в очередь если worker упал
&lt;/span&gt;    &lt;span class="n"&gt;task_time_limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;              &lt;span class="c1"&gt;# hard kill через 3 минуты
&lt;/span&gt;    &lt;span class="n"&gt;task_soft_time_limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;170&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;# SoftTimeLimitExceeded для cleanup
&lt;/span&gt;    &lt;span class="n"&gt;worker_prefetch_multiplier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# не забирать задачи в pool заранее
&lt;/span&gt;    &lt;span class="n"&gt;worker_max_tasks_per_child&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# рестарт worker'а после 100 задач (борьба с утечками)
&lt;/span&gt;    &lt;span class="n"&gt;broker_connection_retry_on_startup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;result_expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;# результаты живут 24ч
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;celery_app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task_routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tasks.llm_completion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tasks.send_callback&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;callbacks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Две очереди — &lt;code&gt;llm&lt;/code&gt; и &lt;code&gt;callbacks&lt;/code&gt; — позволяют масштабировать воркеры независимо. Если callback зависает, LLM-задачи продолжают идти.&lt;/p&gt;

&lt;h2&gt;
  
  
  HTTP-ручка с idempotency
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;main.py&lt;/code&gt; — приём запроса за 50 мс:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;redis.asyncio&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.tasks&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;llm_completion&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis://localhost:6379/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JobRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;callback_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/jobs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_job&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JobRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;idempotency_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Проверяем дедупликацию
&lt;/span&gt;    &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;idempotency:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idempotency_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duplicate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;job_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Сохраняем привязку idempotency_key → job_id на 24 часа
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;idempotency:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idempotency_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queued&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;callback_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;callback_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c1"&gt;# Постановка задачи (не блокирует HTTP)
&lt;/span&gt;    &lt;span class="n"&gt;llm_completion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queued&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/jobs/{job_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_job&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hgetall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Job not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ключевые моменты:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;status_code=202 Accepted&lt;/strong&gt; — стандарт REST для async. Клиент знает, что запрос принят, но не выполнен.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotency-Key обязателен&lt;/strong&gt; (Header(...)) — клиент генерит UUIDv4 для каждой логической операции. Если он повторит запрос — получит тот же job_id.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL 86400&lt;/strong&gt; (24 часа) — после этого ключ протухает, повторный запрос создаст новую задачу. Подбирайте под ваш use case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET &lt;code&gt;/v1/jobs/{job_id}&lt;/code&gt;&lt;/strong&gt; — клиент может опрашивать статус (long polling fallback если webhook callback не доступен).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Подробнее про idempotency и retry в B2B контексте — &lt;a href="https://promptra.ru/blog/b2b-checklist-12-voprosov-postavshchiku-llm-api" rel="noopener noreferrer"&gt;Чек-лист 12 вопросов поставщику LLM API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz532vy8amsxct3sj1to0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz532vy8amsxct3sj1to0.png" alt="Диаграмма последовательности idempotency-проверки: клиент отправляет POST с Idempotency-Key, FastAPI проверяет Redis-ключ, если есть — возвращает существующий job_id, если нет — создаёт новый и сохраняет привязку на 24 часа; заголовок «Дедупликация через Idempotency-Key»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Celery worker: LLM-вызов с retry
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tasks.py&lt;/code&gt; — основная задача:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;shared_task&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery.exceptions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SoftTimeLimitExceeded&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.webhooks&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;send_callback&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis://localhost:6379/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;llm_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PROMPTRA_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;120.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# ретраи делаем сами через Celery
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@shared_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;autoretry_for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;APIError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;retry_backoff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retry_backoff_max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retry_jitter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;llm_completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="c1"&gt;# Постановка задачи на отправку callback
&lt;/span&gt;        &lt;span class="n"&gt;send_callback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;callback_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;callbacks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Специальная обработка 429 — retry с увеличенным backoff
&lt;/span&gt;        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;countdown&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;SoftTimeLimitExceeded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timeout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Что важно:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;autoretry_for + retry_backoff&lt;/strong&gt; — Celery сам ретраит на API-ошибки. retry_backoff=True даёт 1, 2, 4, 8 секунд; retry_backoff_max=60 ограничивает; retry_jitter=True добавляет случайность ±25% против thundering herd.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;max_retries=3&lt;/strong&gt; — четвёртая попытка не делается, задача уходит в failed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RateLimitError&lt;/strong&gt; обрабатывается отдельно с фиксированным countdown=30 — обычно провайдер даёт retry-after хедер, можно вычитать его и использовать вместо 30.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SoftTimeLimitExceeded&lt;/strong&gt; — за 10 сек до hard kill worker получает это исключение. Можно успеть закрыть HTTP-коннект, записать состояние, дочитать stream.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Про exponential backoff и token bucket подробно — &lt;a href="https://promptra.ru/blog/rate-limiting-i-retry-strategii-llm-api-python" rel="noopener noreferrer"&gt;Rate limiting и retry стратегии для LLM API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Webhook callback с HMAC-подписью
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;webhooks.py&lt;/code&gt; — отправка результата клиенту с подписью:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;shared_task&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery.exceptions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Retry&lt;/span&gt;

&lt;span class="n"&gt;WEBHOOK_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WEBHOOK_SECRET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 32+ байта random
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sign_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Подписываем timestamp.payload — защита от replay.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;
    &lt;span class="n"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;,v1=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@shared_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;autoretry_for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt;
    &lt;span class="n"&gt;retry_backoff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retry_backoff_max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retry_jitter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;callback_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sign_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WEBHOOK_SECRET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;callback_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Promptra-Signature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Promptra-Job-Id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Promptra-Webhook/1.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# 5xx — retry
&lt;/span&gt;            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HTTPStatusError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Server error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# 4xx — не retry, баг клиента
&lt;/span&gt;            &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;callback_status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;client_error_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;job:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;callback_status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delivered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Параметры retry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;max_retries=5 + retry_backoff_max=600 → попытки на 1с, 5с, 25с, 2 мин, 10 мин (с jitter).&lt;/li&gt;
&lt;li&gt;После 5 неудач задача автоматически уходит в Celery dead-letter (если настроен) или просто marks as failed.&lt;/li&gt;
&lt;li&gt;4xx ошибки не retry'им — это значит у клиента баг (например, не проверяет подпись), retry не поможет.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Клиентская проверка подписи:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verify_signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signature_header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Возвращает True если подпись валидна и timestamp в окне 5 минут.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;signature_header&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;received_sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="c1"&gt;# Проверка свежести (защита от replay)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max_age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="c1"&gt;# Считаем ожидаемую подпись
&lt;/span&gt;    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;
    &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;

    &lt;span class="c1"&gt;# Константно-временное сравнение
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare_digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;received_sig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Критически важно — &lt;code&gt;hmac.compare_digest&lt;/code&gt;, а не &lt;code&gt;==&lt;/code&gt;. Обычное сравнение строк может leak'нуть timing attack: первый отличающийся байт прерывает сравнение, и атакующий по разнице во времени может восстановить подпись.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv1wdr0iekyn6ijxxi9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv1wdr0iekyn6ijxxi9v.png" alt="Архитектурная диаграмма webhook callback с HMAC: worker формирует payload, подписывает HMAC-SHA256 с timestamp, отправляет POST с заголовком X-Promptra-Signature; клиент проверяет timestamp в окне 5 минут и константно-временное сравнение через hmac.compare_digest; заголовок «HMAC-подпись webhook»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dead-letter queue и мониторинг
&lt;/h2&gt;

&lt;p&gt;После 5 неудач callback и 3 неудач LLM-вызова задача должна попасть в DLQ для ручного разбора. Celery не имеет встроенной DLQ — реализуем через дополнительную очередь:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery.signals&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;task_failure&lt;/span&gt;

&lt;span class="nd"&gt;@task_failure.connect&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_task_failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;einfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Перехватываем фейлы и кладём в DLQ для ручного разбора.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lpush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dlq&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;args&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kwargs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exception&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;}))&lt;/span&gt;
        &lt;span class="c1"&gt;# Алерт в Slack/Telegram
&lt;/span&gt;        &lt;span class="nf"&gt;notify_oncall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DLQ-задачи хранятся в Redis-list &lt;code&gt;dlq&lt;/code&gt; 72 часа, потом архивируются в S3/Postgres. Раз в день оператор разбирает: чинит баг → переотправляет задачу. Подробнее про мониторинг latency, error rate и cost — в гайде &lt;a href="https://promptra.ru/blog/logirovanie-i-observability-llm-prilozheniy-langfuse-helicone" rel="noopener noreferrer"&gt;Логирование и observability LLM-приложений&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Метрики, которые нужно собирать (Prometheus + Grafana):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Метрика&lt;/th&gt;
&lt;th&gt;Что показывает&lt;/th&gt;
&lt;th&gt;Алерт&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_jobs_queued&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Размер очереди&lt;/td&gt;
&lt;td&gt;&amp;gt;500 — масштабировать воркеры&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_jobs_processing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Активные задачи&lt;/td&gt;
&lt;td&gt;более 100%  worker — bottleneck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_jobs_failed_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Счётчик фейлов&lt;/td&gt;
&lt;td&gt;error rate более 5%  5 мин&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_job_duration_seconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Гистограмма времени&lt;/td&gt;
&lt;td&gt;p99 более 60с — медленный провайдер&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;callback_delivery_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Доставки callback&lt;/td&gt;
&lt;td&gt;success rate менее 95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;callback_retry_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Сумма retry&lt;/td&gt;
&lt;td&gt;внезапный рост → проблема у клиента&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dlq_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Размер DLQ&lt;/td&gt;
&lt;td&gt;&amp;gt;0 — оператор должен разобрать&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flower UI на &lt;code&gt;http://localhost:5555&lt;/code&gt; показывает live состояние воркеров, очередей и недавние фейлы. В production — за nginx с basic auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production-чеклист перед запуском
&lt;/h2&gt;

&lt;p&gt;Минимальный сетап для production async LLM-pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Idempotency-Key обязателен&lt;/strong&gt; на всех мутирующих ручках; TTL 24ч в Redis.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;HMAC-подпись на callback&lt;/strong&gt; с timestamp и проверкой окна 5 минут; secret 32+ байта.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Constant-time сравнение&lt;/strong&gt; подписей через &lt;code&gt;hmac.compare_digest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;timeout на HTTP-клиент&lt;/strong&gt; — connect 5с, read 120с (для reasoning), write 10с, pool 5с.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;task_time_limit 180с + soft_time_limit 170с&lt;/strong&gt; в Celery — против зависших задач.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;task_acks_late + task_reject_on_worker_lost&lt;/strong&gt; — задача не теряется при падении worker'а.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;worker_prefetch_multiplier=1&lt;/strong&gt; — равномерное распределение задач между воркерами.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;worker_max_tasks_per_child=100&lt;/strong&gt; — рестарт против утечек памяти в SDK.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Отдельные очереди&lt;/strong&gt; для &lt;code&gt;llm&lt;/code&gt; и &lt;code&gt;callbacks&lt;/code&gt; — независимое масштабирование.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Retry policy&lt;/strong&gt; — 3 для LLM (autoretry_for APIError), 5 для callback (только 5xx).&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;DLQ через task_failure signal&lt;/strong&gt; + алерт в Slack/Telegram.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Prometheus метрики&lt;/strong&gt;: queued, processing, failed, duration p50/p95/p99, callback success rate.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Flower&lt;/strong&gt; за nginx basic auth для мониторинга.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Health check&lt;/strong&gt; Redis: при недоступности — HTTP /healthz должен вернуть 503.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Webhook secret rotation&lt;/strong&gt; раз в 90 дней (поддержка двух активных secret одновременно).&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Лимит размера body&lt;/strong&gt; на HTTP-ручке (например, 100 KB) — против abuse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Через шлюз Promptra все модели работают через &lt;code&gt;base_url="https://api.promptra.ru/v1"&lt;/code&gt; без переписывания кода — миграция с прямого OpenAI описана в гайде &lt;a href="https://promptra.ru/blog/migraciya-iz-openai-na-promptra-python-sdk-za-10-minut" rel="noopener noreferrer"&gt;Миграция с OpenAI на Promptra за 10 минут&lt;/a&gt;. Цены прозрачны 1-в-1 с провайдером по курсу ЦБ — для batch-сценариев на 1М запросов разница экономии vs российских наценок описана в &lt;a href="https://promptra.ru/blog/sravnenie-cen-llm-2026-tochnye-tarify-v-rublyah" rel="noopener noreferrer"&gt;Сравнении цен LLM 2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw19ndrj71efz5p8nzycj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw19ndrj71efz5p8nzycj.png" alt="Финальная инфографика production pipeline: 5 пронумерованных блоков в ряд — «1. HTTP /jobs» с иконкой запроса, «2. Redis queue» с цилиндром, «3. Celery worker → LLM» с шестерёнкой, «4. Webhook callback HMAC» с замком, «5. DLQ + monitoring» с щитом; под ними подпись «Async LLM-pipeline за день»; терракотовые стрелки между блоками; заголовок «5 шагов до stable production»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Запасные варианты: serverless и managed
&lt;/h2&gt;

&lt;p&gt;Если не хочется поднимать Celery + Redis — есть managed-альтернативы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS SQS + Lambda&lt;/strong&gt; — очередь и worker полностью managed. Минусы: cold start 200–800 мс, vendor lock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yandex Cloud Functions + Message Queue&lt;/strong&gt; — российский вариант, SQS-совместимый API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Batch API&lt;/strong&gt; — для офлайн-обработки &amp;gt;1000 запросов с 50% скидкой. Через Promptra тот же эндпоинт работает для всех провайдеров — см. &lt;a href="https://promptra.ru/blog/async-i-batch-api-llm-50-procentov-skidka-perfomance" rel="noopener noreferrer"&gt;Async и Batch API LLM: 50% скидка&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inngest / Temporal&lt;/strong&gt; — managed durable execution engines с retry, scheduling и UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для русского B2B на собственной VM (Yandex Cloud / VK Cloud) — Redis + Celery остаётся самым простым и контролируемым стеком. Один docker-compose, никаких внешних зависимостей кроме шлюза.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8wdgc8goosseprw6cvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8wdgc8goosseprw6cvh.png" alt="Сравнительная таблица 4 подходов async-обработки: Celery+Redis (self-hosted, контроль), SQS+Lambda (managed, cold start), Inngest (managed, retry+UI), Batch API (офлайн, 50% скидка); каждый столбец с плюсами/минусами и иконкой; заголовок «4 подхода к async LLM-jobs»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webhooks</category>
      <category>async</category>
      <category>fastapi</category>
      <category>celery</category>
    </item>
    <item>
      <title>VseGPT или Promptra: сравнение агрегаторов</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Wed, 17 Jun 2026 10:55:03 +0000</pubDate>
      <link>https://dev.to/promptra-team/vsegpt-ili-promptra-sravnieniie-aghrieghatorov-hcc</link>
      <guid>https://dev.to/promptra-team/vsegpt-ili-promptra-sravnieniie-aghrieghatorov-hcc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frg3ro9on6qwi7e3gj6ji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frg3ro9on6qwi7e3gj6ji.png" alt="Сравнение двух агрегаторов LLM API: слева блок VseGPT с акцентом на широкий каталог и документацию для разработчиков, справа блок Promptra с акцентом на цену по курсу ЦБ и закрывающие документы, между ними вертикальная линия раздела, тёплая палитра" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Коротко для тех, кто пришёл за ответом: &lt;strong&gt;если вы ищете VseGPT альтернативу, выбор упирается не в «у кого endpoint быстрее» — оба дают OpenAI-совместимый API и оба ориентированы на разработчиков, — а в ценовой модели и форме оформления оплаты.&lt;/strong&gt; VseGPT — давно известный в инженерном сообществе агрегатор с широким каталогом (на их сайте заявлено более 120 моделей), развёрнутой документацией и публичной страницей статуса с метриками доступности. Promptra — сервис с оплатой на юр.лицо российское юр.лицо, полным пакетом закрывающих документов через ЭДО и ценой на токены 1-в-1 с провайдером по курсу ЦБ, без наценки. Если вам важна предсказуемая стоимость токенов и B2B-оформление с первичкой под бухгалтерию — об этом большая часть статьи.&lt;/p&gt;

&lt;p&gt;Я работаю в Promptra, поэтому сразу честно: это не «обзор-разоблачение конкурента». VseGPT — крепкий инженерный продукт, и часть вещей он делает лучше многих на рынке: широкий каталог, понятная документация, прозрачность по аптайму. Цель статьи — разложить по полочкам реальные критерии (цена, каталог, документы, юрформа, developer experience), чтобы вы выбрали под свою задачу осознанно. Это материал про «vsegpt аналог» в честном смысле: где сервисы похожи, а где принципиально расходятся.&lt;/p&gt;

&lt;p&gt;Все цены Promptra ниже — на 27.05.2026 при курсе ЦБ РФ 71.668 ₽/USD, прямой пересчёт из официального долларового прайса провайдеров, со ссылками на первоисточники. По VseGPT я &lt;strong&gt;сознательно не привожу рублёвые ценники&lt;/strong&gt;: чужой прайс живёт на чужом сайте и меняется, фиксировать его на один день — значит вводить читателя в заблуждение через неделю. Актуальную цену смотрите на &lt;a href="https://vsegpt.ru" rel="noopener noreferrer"&gt;vsegpt.ru&lt;/a&gt;, а здесь разбираю методологию сравнения.&lt;/p&gt;

&lt;h2&gt;
  
  
  Кто такие VseGPT и Promptra
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;VseGPT&lt;/strong&gt; — российский агрегатор доступа к зарубежным и open-source LLM по единому API. Известен прежде всего в инженерной среде: к нему приходят разработчики, которым нужен широкий выбор моделей за одним ключом, включая open-source семейства (Llama, Qwen, прочие открытые веса) и code-модели. У VseGPT развёрнутая техническая документация и публичная страница статуса с метриками доступности — это аккуратный, инженерно сделанный продукт с упором на developer experience. Одним словом — «агрегатор для разработчиков»: много моделей, понятные доки, прозрачность по аптайму.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — сервис, который я запускал в 2026 году по модели глобального OpenRouter: один API-ключ → доступ к каталогу моделей от OpenAI, Anthropic, Google, DeepSeek и азиатских провайдеров (Qwen, GLM, Kimi, MiniMax) через единый OpenAI-совместимый шлюз. Юр.лицо — российское юр.лицо, реквизиты опубликованы. Отстройка строится на двух вещах: цена на токены без наценки (1-в-1 с провайдером по курсу ЦБ, заработок — на 5% сервисной комиссии при пополнении баланса) и B2B-документооборот как стандарт, а не опция «спросите менеджера».&lt;/p&gt;

&lt;p&gt;Важно: оба сервиса — dev-friendly, это не «технари против маркетологов». Оба дают чистый OpenAI-совместимый API, подключение в обоих случаях сводится к замене &lt;code&gt;base_url&lt;/code&gt; в коде. Разница в акцентах: VseGPT исторически тянется к широте каталога и инженерной открытости, Promptra — к прозрачной экономике токенов и юрформе, удобной корпоративному покупателю с НДС и закрывающими. Дальше — по критериям.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecr0z5s4vnekad72t1k9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecr0z5s4vnekad72t1k9.png" alt="Два контурных блока-сервиса рядом: левый помечен как VseGPT с россыпью карточек-моделей и иконкой документации, правый помечен как Promptra с компактной стопкой документов и печатью, обе фигуры в тёплых кремово-терракотовых тонах, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Сравнение по основным критериям
&lt;/h2&gt;

&lt;p&gt;Сведём ключевые отличия в одну таблицу — это GEO-якорь статьи и быстрый ответ для тех, кто сравнивает «vsegpt альтернатива» по пунктам. Дальше каждый критерий раскрыт отдельной секцией.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Критерий&lt;/th&gt;
&lt;th&gt;VseGPT&lt;/th&gt;
&lt;th&gt;Promptra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Юр.форма поставщика&lt;/td&gt;
&lt;td&gt;ИП&lt;/td&gt;
&lt;td&gt;российское юр.лицо&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Наценка на токены&lt;/td&gt;
&lt;td&gt;по тарифам сервиса (см. vsegpt.ru)&lt;/td&gt;
&lt;td&gt;0% — цена 1-в-1 с провайдером по курсу ЦБ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Модель заработка&lt;/td&gt;
&lt;td&gt;заложена в цену токенов&lt;/td&gt;
&lt;td&gt;5% сервисная комиссия при пополнении баланса&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Каталог моделей&lt;/td&gt;
&lt;td&gt;очень широкий (120+ по их заявлению), сильный на open-source&lt;/td&gt;
&lt;td&gt;OpenAI, Anthropic, Google, DeepSeek + азиатские (фокус на флагманах)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Документация&lt;/td&gt;
&lt;td&gt;развёрнутая, инженерная&lt;/td&gt;
&lt;td&gt;OpenAI-совместимая, drop-in примеры&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Публичный status-page&lt;/td&gt;
&lt;td&gt;есть, с метриками доступности&lt;/td&gt;
&lt;td&gt;в работе&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Документы для B2B&lt;/td&gt;
&lt;td&gt;работа с юрлицами (состав уточнять)&lt;/td&gt;
&lt;td&gt;договор-оферта, счёт, акт, счёт-фактура, УПД 5.03 через ЭДО&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Входящий НДС покупателю на ОСНО&lt;/td&gt;
&lt;td&gt;зависит от налогового статуса ИП (уточнять)&lt;/td&gt;
&lt;td&gt;оплата на юр.лицо с полным пакетом закрывающих документов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Совместимость API&lt;/td&gt;
&lt;td&gt;OpenAI-совместимый&lt;/td&gt;
&lt;td&gt;OpenAI-совместимый (drop-in &lt;code&gt;base_url&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Целевой профиль&lt;/td&gt;
&lt;td&gt;разработчики, любители open-source, эксперименты&lt;/td&gt;
&lt;td&gt;B2B-команды, которым нужна первичка и предсказуемый счёт&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Две оговорки к таблице. Первое: «наценка по тарифам» у VseGPT — это не упрёк, а другая бизнес-модель; конкретные цифры берите на их сайте и сравнивайте по методологии из раздела ниже. Второе: строка про входящий НДС — это не «у них хуже», а «зависит от налогового статуса конкретного ИП, и его нужно прямо спросить у поставщика». Ниже разберём, почему это важно именно для бизнеса на ОСНО.&lt;/p&gt;

&lt;h2&gt;
  
  
  Каталог моделей: где VseGPT силён
&lt;/h2&gt;

&lt;p&gt;Начну с честного преимущества VseGPT — именно в каталоге он традиционно хорош, и это одна из причин, по которым его выбирают.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VseGPT&lt;/strong&gt; делает ставку на широту и open-source. Заявленные более 120 моделей за одним ключом — это про охват: чем больше моделей, тем выше шанс, что найдётся ровно та, что нужна под нишевую задачу. Сильная сторона именно VseGPT — открытые веса: Llama-семейство, Qwen, другие open-source чекпойнты и code-модели. Для разработчика, который любит гонять одну задачу на нескольких open-source моделях и искать оптимум цена/качество, такой каталог экономит время — не нужно интегрировать каждого хостера поодиночке.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; идёт по пути фокуса на флагманах и рабочих лошадках, которые покрывают подавляющее большинство production-задач:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; — GPT-5.5, GPT-5.4, GPT-5.4 Mini, GPT-5.3 Codex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic&lt;/strong&gt; — Claude Opus 4.7, Claude Sonnet 4.6, Claude Haiku 4.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google&lt;/strong&gt; — Gemini 3.1 Pro, Gemini 3.5 Flash, Gemini 3.1 Flash Lite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek&lt;/strong&gt; — V4 Pro (сильна в коде и матлогике за копейки)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Азиатские&lt;/strong&gt; — Qwen 3.6 Plus (Alibaba), GLM 5.1 (Z.ai), Kimi K2.5 (Moonshot), MiniMax M2.7&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Мультимодальные&lt;/strong&gt; — генерация изображений (Nano Banana Pro, GPT Image 2) и видео (Veo 3.1, Seedance 2.0, Kling v3)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Стоит отметить: open-source модели есть и в каталоге Promptra — DeepSeek V4 Pro, Qwen 3.6 Plus, GLM 5.1, MiniMax M2.7 — это всё open-weight семейства. Разница в том, что VseGPT исторически делает на них более широкую ставку, а Promptra отбирает в фокус-набор те, что покрывают типовые задачи.&lt;/p&gt;

&lt;p&gt;Плюс широкого каталога — гибкость и шанс найти нишевый оптимум, особенно по open-source. Минус — за сотней с лишним моделей сложнее уследить, какие реально стабильны; часть «галочек в списке» может оказаться редко используемыми endpoint'ами. У фокусированного каталога наоборот: за каждой моделью понятная роль, но за экзотикой придётся идти в другое место.&lt;/p&gt;

&lt;p&gt;Практический критерий выбора простой: &lt;strong&gt;выпишите модели, которые реально нужны вашему проекту, и проверьте наличие каждой у обоих сервисов.&lt;/strong&gt; Число «120+» само по себе ничего не говорит, если 115 из них вы никогда не вызовете. И наоборот — если ваш кейс построен вокруг конкретного open-source чекпойнта, ширина каталога VseGPT решает.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfdyi7kpak0077t19lrn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfdyi7kpak0077t19lrn.png" alt="Сравнение каталогов двух агрегаторов: слева широкая россыпь из множества карточек-моделей с подписью VseGPT 120+ моделей и пометкой open-source, справа компактная сетка из выделенных карточек GPT-5.5, Claude Opus 4.7, Gemini 3.1 Pro, DeepSeek V4 Pro с подписью Promptra флагманы, числа и русские подписи, кремовый фон, терракотовые акценты" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Цена за токен: методология вместо чужого прайса
&lt;/h2&gt;

&lt;p&gt;Здесь я сознательно не вставляю рублёвые ценники VseGPT — по той же причине, что описана во введении: чужой прайс меняется, и фиксировать его на одну дату некорректно. Поэтому разберём методологию, по которой стоит сравнивать любой сервис, и покажу нашу часть с открытыми цифрами.&lt;/p&gt;

&lt;p&gt;Любой агрегатор зарабатывает одним из двух способов (или их комбинацией):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Наценка на токены&lt;/strong&gt; — продаёт токены дороже, чем платит провайдеру. Тогда «цена за миллион токенов» на сайте уже включает маржу сервиса.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Сервисная комиссия / подписка&lt;/strong&gt; — берёт фиксированный процент или плату за обслуживание, а токены отдаёт близко к себестоимости.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Чтобы честно сравнить два сервиса, нужно привести обе модели к общему знаменателю — &lt;strong&gt;сколько вы реально заплатите за миллион входящих и исходящих токенов конкретной модели, со всеми комиссиями&lt;/strong&gt;. Фраза «у нас 120+ моделей» или «у нас выгодно» без привязки к конкретной модели и итоговой сумме — это лозунг, а не цифра.&lt;/p&gt;

&lt;p&gt;Вот наша сторона, открыто. Promptra держит цену токенов 1-в-1 с провайдером по курсу ЦБ (наценка 0%), а зарабатывает на 5% сервисной комиссии &lt;strong&gt;только при пополнении баланса&lt;/strong&gt;, не от токенов. Пересчёт из официального долларового прайса по курсу ЦБ 71.668 ₽/USD на 27.05.2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;USD input / output (за 1M)&lt;/th&gt;
&lt;th&gt;Promptra input / output (₽ за 1M)&lt;/th&gt;
&lt;th&gt;Источник прайса&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5 / $30&lt;/td&gt;
&lt;td&gt;350 / 2150&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;developers.openai.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;$2.5 / $15&lt;/td&gt;
&lt;td&gt;170 / 1070&lt;/td&gt;
&lt;td&gt;то же&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;$0.75 / $4.5&lt;/td&gt;
&lt;td&gt;50 / 320&lt;/td&gt;
&lt;td&gt;то же&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;$5 / $25&lt;/td&gt;
&lt;td&gt;350 / 1790&lt;/td&gt;
&lt;td&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;platform.claude.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;$3 / $15&lt;/td&gt;
&lt;td&gt;210 / 1070&lt;/td&gt;
&lt;td&gt;то же&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;$2 / $12&lt;/td&gt;
&lt;td&gt;140 / 860&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;ai.google.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;
&lt;td&gt;$0.435 / $0.87&lt;/td&gt;
&lt;td&gt;30 / 60&lt;/td&gt;
&lt;td&gt;&lt;a href="https://api-docs.deepseek.com/quick_start/pricing" rel="noopener noreferrer"&gt;api-docs.deepseek.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.1&lt;/td&gt;
&lt;td&gt;$1.4 / $4.4&lt;/td&gt;
&lt;td&gt;100 / 310&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.z.ai/guides/overview/pricing" rel="noopener noreferrer"&gt;docs.z.ai&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;$0.325 / $1.95&lt;/td&gt;
&lt;td&gt;20 / 130&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.alibabacloud.com/help/en/model-studio/model-pricing" rel="noopener noreferrer"&gt;alibabacloud.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Как пользоваться этой таблицей при сравнении с VseGPT: возьмите ту же модель на &lt;a href="https://vsegpt.ru" rel="noopener noreferrer"&gt;их сайте&lt;/a&gt;, посмотрите цену за миллион токенов и итоговую сумму с учётом всех комиссий — и сопоставьте с цифрой из колонки Promptra. Если их цена выше нашей, разница и есть их наценка на токены. Если ниже — отлично, проверьте, нет ли отдельной комиссии или минимального пополнения, чтобы сравнение было «как есть». Это честный способ, не зависящий от моих слов.&lt;/p&gt;

&lt;h3&gt;
  
  
  Про DeepSeek и промо-цены — отдельная осторожность
&lt;/h3&gt;

&lt;p&gt;Частый источник путаницы при сравнении агрегаторов — &lt;strong&gt;промо-цены провайдеров&lt;/strong&gt;. Например, DeepSeek V4 Pro на 27.05.2026 стоит у провайдера $0.435 / $0.87 за миллион токенов (&lt;strong&gt;30 / 60 ₽&lt;/strong&gt; по курсу ЦБ) — но это &lt;strong&gt;промо со скидкой 75%, которое заканчивается 31.05.2026&lt;/strong&gt;. После окончания базовая цена вернётся к примерно $1.74 / $3.48 (около 120 / 240 ₽). Если один сервис показывает промо, а другой — уже базовую цену, прямое сравнение «у кого дешевле DeepSeek» некорректно. Это особенно актуально для VseGPT, который силён на open-source: всегда уточняйте, акционная цена перед вами или постоянная, и до какой даты.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnpdlqfsmsg8p4wyigwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnpdlqfsmsg8p4wyigwl.png" alt="Две горизонтальные шкалы-полосы одинаковой длины как два прайса, левая полоса разбита на сегмент токенов и хвост-наценку, правая полоса показана как цена по курсу ЦБ плюс отдельный маленький блок 5 процентов комиссии при пополнении, подпись методология сравнения, числа и русские подписи, тёплые тона терракоты и кремового" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ИП vs ООО: как юрформа поставщика влияет на ваш входящий НДС
&lt;/h2&gt;

&lt;p&gt;Это центральная часть статьи для B2B-покупателя, потому что именно здесь проходит реальная линия различия между «vsegpt аналогом» и Promptra. Разберём механику без морализаторства — просто как работает налоговая арифметика.&lt;/p&gt;

&lt;h3&gt;
  
  
  Что такое входящий НДС и вычет
&lt;/h3&gt;

&lt;p&gt;Если ваша компания на &lt;strong&gt;общей системе налогообложения (ОСНО)&lt;/strong&gt;, вы платите НДС с реализации (исходящий) и имеете право уменьшить его на НДС, который вам предъявили поставщики (входящий). Это и есть вычет — механизм главы 21 НК РФ. Чтобы принять входящий НДС к вычету, нужен счёт-фактура (или УПД с функцией «1») от поставщика, который сам является плательщиком НДС. Если поставщик НДС не предъявил, вычитать нечего — вся сумма ложится в расходы, но входящего НДС к вычету у вас нет.&lt;/p&gt;

&lt;h3&gt;
  
  
  Где здесь форма ИП
&lt;/h3&gt;

&lt;p&gt;Сама по себе форма «ИП» &lt;strong&gt;не означает автоматически отсутствие НДС&lt;/strong&gt;: ИП может быть как на ОСНО (плательщик НДС), так и на упрощёнке. Но на практике большинство ИП в IT работают на &lt;strong&gt;УСН&lt;/strong&gt; — и тут с 2025 года произошло важное изменение.&lt;/p&gt;

&lt;p&gt;С 1 января 2025 года в рамках налоговой реформы (Федеральный закон от 12.07.2024 № 176-ФЗ) &lt;a href="https://www.nalog.gov.ru/rn77/news/activities_fts/15169443/" rel="noopener noreferrer"&gt;упрощенцы стали плательщиками НДС&lt;/a&gt;, но с порогом: при доходе &lt;strong&gt;до 60 млн ₽ в год&lt;/strong&gt; ИП/организация на УСН освобождены от НДС автоматически, а при превышении — платят по пониженным ставкам 5% или 7% (без права на вычет входящего) либо по общей ставке 20% (с вычетом). В зависимости от оборота и ставки поставщик-упрощенец может:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;не предъявлять НДС вообще&lt;/strong&gt; (доход до 60 млн ₽) — тогда вычета у вас нет;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;предъявлять НДС 5% или 7%&lt;/strong&gt; — вы получаете счёт-фактуру с этой ставкой и вычет на эту сумму, но это меньше привычных 20%;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;предъявлять НДС 20%&lt;/strong&gt; — полноценный вычет, но это редкий выбор для УСН.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Вывод для покупателя простой и не оценочный: &lt;strong&gt;прежде чем подписывать договор, спросите у любого поставщика — ИП он или ООО, на какой системе налогообложения, и предъявляет ли НДС.&lt;/strong&gt; Это касается и VseGPT, и нас, и любого третьего сервиса. Конкретный налоговый статус VseGPT как ИП я здесь не утверждаю — это вопрос к их договору и счёту-фактуре, и правильный ход бухгалтера — запросить эти документы и проверить контрагента через Контур.Фокус или ZACHESTNYIBIZNES.&lt;/p&gt;

&lt;h3&gt;
  
  
  Почему это критично именно для ОСНО
&lt;/h3&gt;

&lt;p&gt;Для компаний на УСН «Доходы» или на патенте входящий НДС вообще не играет роли — они его не вычитают по определению. Если вы малый бизнес на упрощёнке или разработчик-фрилансер, разница между поставщиком с НДС и без — для вас нулевая, и весь этот раздел можно пропустить: смотрите только на итоговую цену и удобство.&lt;/p&gt;

&lt;p&gt;А вот для &lt;strong&gt;бизнеса на ОСНО&lt;/strong&gt;, который закупает LLM-доступ на серьёзные суммы, потеря входящего НДС — это реальное удорожание услуги на величину ставки. Если поставщик не даёт НДС к вычету, услуга за условные 100 000 ₽ обходится как 100 000 ₽ расходов без уменьшения вашего собственного НДС — тогда как поставщик-плательщик НДС позволил бы вернуть часть через вычет. На годовом бюджете в сотни тысяч или миллионы рублей это ощутимо.&lt;/p&gt;

&lt;p&gt;Promptra оформляет отношения через российское юр.лицо с полным пакетом закрывающих документов через ЭДО. Конкретные ставки и налоговый режим мы не публикуем на сайте — это часть договора, который вы получаете при подключении; правильный путь — запросить образец оферты и счёта-фактуры и показать его своему бухгалтеру до старта. Это ровно то же, что я рекомендую делать с VseGPT и с любым другим сервисом: не верить статье (включая эту), а проверить документы под свою систему налогообложения. Подробный разбор того, легально ли вообще оплачивать зарубежные LLM на российское юрлицо, — в нашем материале &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;легально ли использовать OpenAI/Claude на юрлицо в РФ&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrbc3yncsn7vte495coj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrbc3yncsn7vte495coj.png" alt="Диаграмма потока входящего НДС: справа блок покупатель на ОСНО, к нему ведут две стрелки от двух поставщиков, верхняя стрелка через узел плательщик НДС доходит полной с подписью вычет есть, нижняя стрелка обрывается на узле без НДС с подписью вычета нет, русские подписи, тёплая палитра терракоты и кремового" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Документы для бухгалтерии: что вы получите
&lt;/h2&gt;

&lt;p&gt;Эту часть разработчики обычно пропускают, а бухгалтерия проверяет первой. От пакета документов зависит, сможете ли вы вообще принять расход к учёту без вопросов от ФНС.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VseGPT&lt;/strong&gt; работает с юрлицами — для агрегатора с инженерной аудиторией это ожидаемо, к ним приходят и компании. Конкретный состав пакета (договор, акт, счёт-фактура, УПД, ставка НДС) и формат передачи стоит уточнить напрямую у них перед подключением, особенно если вам нужен входящий НДС к вычету — см. раздел про ИП vs ООО выше. Запросите образец договора и счёта-фактуры, покажите бухгалтеру.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; ориентирован на B2B-сценарий с первого дня: договор-оферта, счёт на оплату, акт оказанных услуг, счёт-фактура и &lt;strong&gt;УПД формата 5.03 через ЭДО&lt;/strong&gt; (Диадок, СБИС, 1С-ЭДО) — это стандартный пакет, а не доплата. С 1 января 2026 года формат &lt;a href="https://tochka.com/knowledge/edo/s-2026-goda-upd-stanovitsya-edinstvennym-elektronnym-dokumentom-fns-otmenyaet-starye-formaty/" rel="noopener noreferrer"&gt;УПД 5.03 стал единственным легитимным электронным форматом&lt;/a&gt; для закрывающих — это требование ФНС, не наша прихоть. Реквизиты российское юр.лицо опубликованы на странице &lt;a href="https://promptra.ru/legal/requisites/" rel="noopener noreferrer"&gt;/legal/requisites&lt;/a&gt; для проверки контрагента.&lt;/p&gt;

&lt;p&gt;Нюанс, который касается обоих сервисов: формулировка предмета услуги в акте/УПД должна быть развёрнутой («предоставление доступа к API больших языковых моделей за период…»), иначе при проверке инспектор вправе усомниться в обоснованности расхода (ст. 252 НК РФ). Подробный разбор, какие документы нужны и какие ошибки бухгалтерии налоговая снимает с базы, — в материале &lt;a href="https://promptra.ru/blog/zakryvayushchie-dokumenty-ai" rel="noopener noreferrer"&gt;про закрывающие документы по нейросетям&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer experience и подключение
&lt;/h2&gt;

&lt;p&gt;Это область, где сервисы ближе всего друг к другу. Оба dev-friendly, оба дают OpenAI-совместимый API — значит, подключение сводится к замене &lt;code&gt;base_url&lt;/code&gt; в существующем коде. Никакого переписывания SDK: меняете адрес и ключ, остальное работает как раньше.&lt;/p&gt;

&lt;p&gt;VseGPT исторически силён в инженерной подаче: развёрнутая документация и публичная страница статуса с метриками доступности. Status-page — объективный плюс: видеть аптайм и доступность моделей до регистрации полезно при выборе инфраструктуры под production. Promptra по части публичного status-page пока в работе — это честный gap, который мы закрываем; зато прямой контакт с командой для нестандартных вопросов работает с первого дня.&lt;/p&gt;

&lt;p&gt;Для Promptra drop-in выглядит так:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ваш-ключ-promptra&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic/claude-sonnet-4.6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PROMPTRA_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai/gpt-5.4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Привет!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;По части поддержки разница в философии. VseGPT делает ставку на самодостаточную документацию — разработчик многое решает сам по докам. Promptra на текущем этапе ставит на прямой контакт: вопросы по подключению идут напрямую в Telegram к команде, без тикет-конвейера. У каждого подхода свои плюсы: сильные доки не требуют ждать ответа, прямой контакт быстрее для нестандартных вопросов и кастомных условий.&lt;/p&gt;

&lt;h2&gt;
  
  
  Когда выбирать VseGPT, когда Promptra
&lt;/h2&gt;

&lt;p&gt;Честный decision tree без перетягивания одеяла. Если вы рассматриваете Promptra как VseGPT альтернативу, вот по каким признакам стоит решать.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Выбирайте VseGPT, если:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;вам нужен максимально широкий каталог с упором на open-source (Llama, Qwen, открытые code-чекпойнты);&lt;/li&gt;
&lt;li&gt;вы разработчик, который любит экспериментировать с десятками моделей за одним ключом;&lt;/li&gt;
&lt;li&gt;для вас важна публичная страница статуса с метриками доступности и развёрнутая инженерная документация;&lt;/li&gt;
&lt;li&gt;вы малый бизнес на УСН/патенте или фрилансер, где входящий НДС не играет роли.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Выбирайте Promptra, если:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;вы B2B-компания на ОСНО, и вам важен входящий НДС к вычету и полный пакет закрывающих документов (УПД 5.03 через ЭДО) с первого пополнения как стандарт;&lt;/li&gt;
&lt;li&gt;для вас принципиальна прозрачная экономика токенов — цена 1-в-1 с провайдером по курсу ЦБ, без наценки, с понятной 5% комиссией только при пополнении;&lt;/li&gt;
&lt;li&gt;вам достаточно фокусированного набора флагманов (GPT, Claude, Gemini, DeepSeek + азиатские) и нужен прямой контакт с командой для подключения на кастомных условиях.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Универсальный совет для любого выбора:&lt;/strong&gt; не верьте ни VseGPT, ни мне на слово. Выпишите нужные именно вам модели и проверьте наличие у обоих; запросите образец договора и счёта-фактуры и покажите бухгалтеру (особенно на ОСНО — проверьте НДС); прогоните реальную тестовую нагрузку на день-два на каждом — это стоит копейки и даёт честный personal benchmark по латентности и качеству. Выбор инфраструктурного поставщика — как выбор любой критической инфраструктуры: с тестами и backup-планом, а не «один навсегда по статье из интернета».&lt;/p&gt;

&lt;p&gt;Хотите сравнить с другими игроками — есть отдельные разборы: &lt;a href="https://promptra.ru/blog/proxyapi-vs-promptra" rel="noopener noreferrer"&gt;ProxyAPI vs Promptra&lt;/a&gt; (премиум-сегмент с высокой наценкой), &lt;a href="https://promptra.ru/blog/aitunnel-vs-promptra" rel="noopener noreferrer"&gt;AITUNNEL vs Promptra&lt;/a&gt; (лидер по объёму, ИП vs ООО) и общий обзор &lt;a href="https://promptra.ru/blog/luchshie-agregatory-llm-api-rossiya-2026" rel="noopener noreferrer"&gt;лучших агрегаторов LLM API в России 2026&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vsegpt</category>
      <category>promptra</category>
      <category>vsegptapi</category>
    </item>
    <item>
      <title>Все нейросети в одном месте: один API вместо десятка</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Wed, 17 Jun 2026 09:05:02 +0000</pubDate>
      <link>https://dev.to/promptra-team/vsie-nieirosieti-v-odnom-miestie-odin-api-vmiesto-diesiatka-1ih0</link>
      <guid>https://dev.to/promptra-team/vsie-nieirosieti-v-odnom-miestie-odin-api-vmiesto-diesiatka-1ih0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lcji9funcwmnqwdmh17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lcji9funcwmnqwdmh17.png" alt="Сравнительная схема «было/стало»: слева беспорядочная россыпь из десяти отдельных карточек-сервисов (ChatGPT, Claude, Gemini, DeepSeek) с собственными иконками карт и счетами, справа один аккуратный терракотовый узел Promptra, от которого ровные линии расходятся ко всем моделям, подпись «один API, один баланс, один пакет документов», тёплый кремовый фон, плоский вектор" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Если коротко: «все нейросети в одном месте» — это не отдельный продукт, а архитектурный приём. Вместо десятка раздельных подписок на ChatGPT, Claude, Gemini и других, с разными кабинетами, картами и счетами, вы подключаетесь к одному OpenAI-совместимому API, который даёт доступ ко всем флагманским LLM сразу. Выбор модели — это одна строка в запросе (поле &lt;code&gt;model&lt;/code&gt;), оплата — один рублёвый баланс на юр.лицо, отчётность — один пакет закрывающих документов на всё.&lt;/strong&gt; Технически вы меняете в коде только адрес сервера (&lt;code&gt;base_url&lt;/code&gt;) и ключ — остальное приложение не трогаете.&lt;/p&gt;

&lt;p&gt;Уточним честно с самого начала: «все нейросети» — это поисковая фраза, а не буквальное обещание. Ни один сервис в мире не даёт «вообще все нейросети, какие существуют». Речь о том, что один агрегатор закрывает практически все модели, которые реально нужны бизнесу: флагманы OpenAI, Anthropic, Google, плюс дешёвые азиатские модели (DeepSeek, Qwen, GLM, Kimi, MiniMax), генерацию изображений и видео. Ниже — почему «зоопарк подписок» дорого обходится, что именно значит «всё в одном API» с технической стороны, какие модели доступны и как это устроено по деньгам и документам.&lt;/p&gt;

&lt;h2&gt;
  
  
  Проблема: зоопарк подписок и почему он дорожает
&lt;/h2&gt;

&lt;p&gt;Сценарий, знакомый любой команде, которая всерьёз работает с ИИ. Сначала подключили ChatGPT — для общих задач. Потом выяснилось, что Claude лучше пишет код, — завели второй аккаунт. Для длинного контекста и работы с документами добавили Gemini. Бэкенд-разработчик нашёл, что фоновую классификацию дешевле гонять через DeepSeek, — третий или четвёртый кабинет. Через полгода у вас не «доступ к нейросетям», а зоопарк из пяти-десяти разрозненных сервисов. И каждый тянет свои издержки.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Издержка первая — деньги размазаны и не видны.&lt;/strong&gt; У каждого провайдера свой баланс, свой способ оплаты, свой минимальный депозит. Никто в компании не может за минуту ответить на вопрос «сколько мы в этом месяце потратили на ИИ» — данные лежат в пяти разных кабинетах в разных валютах. Бюджетирование превращается в археологию.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Издержка вторая — оплата зарубежных сервисов из России.&lt;/strong&gt; Карты российских банков на &lt;code&gt;api.openai.com&lt;/code&gt;, &lt;code&gt;console.anthropic.com&lt;/code&gt; и в Google AI Studio не проходят. Схема «зарубежная виртуальная карта плюс VPN» работает как лотерея: аккаунт живёт от нескольких дней до пары недель, после чего приходит письмо о деактивации и сгорают остатки на балансе. Умножьте этот риск на число сервисов в зоопарке — и получите постоянный фон нестабильности. Подробно про то, почему прямой доступ ненадёжен, мы разбирали в материале &lt;a href="https://promptra.ru/blog/openai-api-rossiya-2026" rel="noopener noreferrer"&gt;OpenAI API в России 2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Издержка третья — бухгалтерия и закрывающие документы.&lt;/strong&gt; Платёж иностранной компании картой сотрудника с последующим возмещением — это серая зона без первички. Нет договора, акта, счёта-фактуры — расход нельзя корректно принять к учёту. С одним сервисом это терпимо. С десятью — это десять источников проблем для бухгалтера, который в конце квартала собирает документы по крупицам. Что именно должно быть в пакете, разбираем в статье &lt;a href="https://promptra.ru/blog/zakryvayushchie-dokumenty-ai" rel="noopener noreferrer"&gt;закрывающие документы для оплаты нейросетей&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Издержка четвёртая — техническая фрагментация.&lt;/strong&gt; API у провайдеров отличаются в деталях: разные SDK, разные форматы ответов, разные имена параметров. Чтобы в коде гибко переключаться между GPT и Claude, приходится писать и поддерживать слой совместимости. Каждый новый провайдер в зоопарке — это ещё одна интеграция, которую кто-то должен сопровождать.&lt;/p&gt;

&lt;p&gt;Сумма этих издержек растёт нелинейно: пятый сервис в зоопарке добавляет больше головной боли, чем второй. Именно отсюда — устойчивый спрос на то, чтобы собрать всё в одной точке. Поисковые запросы «все нейросети в одном месте», «агрегатор нейросетей», «все нейросети в одном» — это люди, которые уже прошли через зоопарк и ищут способ его свернуть.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqa614pgkjty7ey3w15si.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqa614pgkjty7ey3w15si.png" alt="Инфографика «во что обходится зоопарк подписок»: четыре подписанных карточки-издержки в ряд с иконками — «Деньги размазаны по 5+ кабинетам», «Карты РФ не проходят, аккаунты банятся», «Нет закрывающих документов», «Каждый провайдер — отдельная интеграция», под ними итоговая плашка «5–10 сервисов = 5–10 источников проблем», терракотовые акценты, кремовый фон, плоский вектор, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Что значит «все нейросети в одном»: один API, выбор модели параметром
&lt;/h2&gt;

&lt;p&gt;Теперь — что стоит за фразой технически. «Все нейросети в одном месте» сводится к двум вещам: единый адрес и единый протокол.&lt;/p&gt;

&lt;p&gt;Единый адрес означает, что весь трафик идёт на один endpoint — например, &lt;code&gt;https://api.promptra.ru/v1&lt;/code&gt;. Вы не держите пять разных доменов и пять ключей. Один адрес, один ключ.&lt;/p&gt;

&lt;p&gt;Единый протокол означает, что все модели вызываются в одном формате — формате OpenAI Chat Completions, ставшем де-факто стандартом индустрии. Это ключевой момент: какую бы модель вы ни выбрали — GPT-5.5, Claude Opus 4.7, Gemini, DeepSeek, — запрос выглядит одинаково. Меняется только значение одного поля — &lt;code&gt;model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Вот как это выглядит на практике. Один и тот же код, отличается ровно одна строка:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prm-...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# один ключ
&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# один адрес
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# GPT-5.5 — флагман OpenAI
&lt;/span&gt;&lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Claude Opus 4.7 — тот же код, другое значение model
&lt;/span&gt;&lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic/claude-opus-4.7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# DeepSeek V4 Pro — снова та же конструкция
&lt;/span&gt;&lt;span class="n"&gt;r3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek/deepseek-v4-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Из этого следует свойство, которое и делает идею «всё в одном» по-настоящему ценной: &lt;strong&gt;маршрутизация моделей по задаче без переписывания кода&lt;/strong&gt;. У зрелых production-команд в 2026 году нет «одной модели на всё». Есть архитектура, где разные подзадачи внутри одного приложения уходят к разным моделям: дешёвую фоновую классификацию — на DeepSeek или Qwen за копейки, сложный код — на Claude Opus или GPT-5.5, длинные документы — на Gemini. В мире зоопарка это требует пяти интеграций. В мире одного API — это маршрутизатор, который по типу задачи подставляет нужное значение в поле &lt;code&gt;model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;То же касается новых релизов. Когда выходит новая версия модели, она появляется в каталоге без переписывания вашего кода и без нового договора — вы просто начинаете указывать новый идентификатор. Никакого vendor lock-in: архитектура с абстракцией над конкретным провайдером — это и есть способ не привязываться ни к кому.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv6kfiy2r65jkr4fsyg5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv6kfiy2r65jkr4fsyg5.png" alt="Хаб-схема: в центре крупный терракотовый узел «Один endpoint · api.promptra.ru/v1 · поле model», от него лучами расходятся подписанные прямоугольники-модели «GPT-5.5», «Claude Opus 4.7», «Gemini 3.1 Pro», «DeepSeek V4 Pro», «Qwen 3.6 Plus», «Nano Banana Pro», «Veo 3.1», заголовок «Все модели через одну точку входа», подпись «меняется только параметр model», кремовый фон, графит, плоский вектор, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Какие модели доступны: флагманы и не только
&lt;/h2&gt;

&lt;p&gt;«Всё в одном» имеет смысл только если за единым API действительно стоит широкий набор. В каталоге Promptra на конец мая 2026 — 34 модели разных классов и провайдеров. Разберём по группам, с короткими профилями и ценой в рублях по курсу ЦБ (71.668 ₽/$ на 2026-05-27). Цены — verbatim из каталога, ровно те, что вы видите на странице &lt;a href="https://promptra.ru/pricing" rel="noopener noreferrer"&gt;тарифов&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Текстовые флагманы — верхний край качества
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Opus 4.7&lt;/strong&gt; (Anthropic) — флагман для сложного кода, агентных циклов и долгого reasoning. Контекст 1M токенов. &lt;strong&gt;350 / 1790 ₽&lt;/strong&gt; за миллион входных/выходных токенов. Важная деталь: Opus 4.7 использует новый токенайзер и может расходовать до 35% больше токенов на тот же текст — закладывайте это в расчёт по фактическому usage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.5&lt;/strong&gt; (OpenAI) — флагман OpenAI, топ-результаты в reasoning и мультимодальности (image, audio, video в одном тарифе). Контекст 1.05M. &lt;strong&gt;350 / 2150 ₽&lt;/strong&gt;. При входе свыше 272K токенов цена за сессию идёт по повышенной ставке (производная от каталожных USD: ×2 за вход, ×1.5 за выход).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.1 Pro Preview&lt;/strong&gt; (Google) — сильный reasoning и мультимодальность с поддержкой аудио на входе. Контекст 1M. &lt;strong&gt;140 / 860 ₽&lt;/strong&gt; — самый доступный среди премиум-флагманов по входным токенам.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Универсалы и баланс цена/качество
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Sonnet 4.6&lt;/strong&gt; (Anthropic) — баланс качества Opus и цены Haiku, контекст 1M. &lt;strong&gt;210 / 1070 ₽&lt;/strong&gt;. Для большинства production-задач закрывает работу без перехода на флагман.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.4&lt;/strong&gt; (OpenAI) — рабочая лошадка OpenAI для chat и общих задач, контекст 1.05M. &lt;strong&gt;170 / 1070 ₽&lt;/strong&gt; — вдвое дешевле флагмана GPT-5.5 при сохранении большей части способностей.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Дешёвый слой — массовые задачи за копейки
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek V4 Pro&lt;/strong&gt; — open-weight модель, сильная в коде и матлогике, контекст 1M. &lt;strong&gt;30 / 60 ₽&lt;/strong&gt;. Внимание: это промо-цена со скидкой 75%, действует до 2026-05-31; базовая ставка после истечения — примерно вчетверо выше (около $1.74 / $3.48 за миллион). В каталоге также есть более дешёвый V4-Flash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 3.6 Plus&lt;/strong&gt; (Alibaba) — многоязычная open-weight модель, силён в азиатских языках и коде, контекст 1M. &lt;strong&gt;20 / 130 ₽&lt;/strong&gt; — один из самых дешёвых входных тарифов.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GLM 5.1&lt;/strong&gt; (Z.ai) — reasoning-модель с контекстом 202K. &lt;strong&gt;100 / 310 ₽&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kimi K2.5&lt;/strong&gt; (Moonshot) — контекст 262K, хороша для длинных документов. &lt;strong&gt;40 / 170 ₽&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MiniMax M2.7&lt;/strong&gt; — универсальная модель с контекстом 204K. &lt;strong&gt;20 / 80 ₽&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Не только текст: изображения и видео
&lt;/h3&gt;

&lt;p&gt;«Нейросети» — это не только чат. Через тот же единый API доступна генерация изображений и видео:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Изображения:&lt;/strong&gt; Nano Banana Pro и Nano Banana 2 (Google), GPT Image 2 (OpenAI) — генерация и редактирование по тексту. Тарификация у image-моделей токенная и зависит от размера и качества — точную стоимость считайте по фактическому usage, в каталоге она помечена отдельно.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Видео (оплата за секунду):&lt;/strong&gt; Veo 3.1 (Google) — топ-качество text-to-video с генерацией звука, $0.40/с в 720–1080p; Seedance 2.0 (ByteDance) — от $0.05/с в 480p; Kling v3 (Kuaishou) — от $0.063/с. Видео по API — редкость на российском рынке, и тут единая точка доступа особенно ценна.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Сводно по ключевым текстовым моделям — для быстрого сравнения «цена за выход»:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Провайдер&lt;/th&gt;
&lt;th&gt;Вход ₽/1M&lt;/th&gt;
&lt;th&gt;Выход ₽/1M&lt;/th&gt;
&lt;th&gt;Контекст&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;350&lt;/td&gt;
&lt;td&gt;2150&lt;/td&gt;
&lt;td&gt;1.05M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;350&lt;/td&gt;
&lt;td&gt;1790&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;1070&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;1070&lt;/td&gt;
&lt;td&gt;1.05M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;td&gt;860&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.1&lt;/td&gt;
&lt;td&gt;Z.ai&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;310&lt;/td&gt;
&lt;td&gt;202K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K2.5&lt;/td&gt;
&lt;td&gt;Moonshot&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;262K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;Alibaba&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax M2.7&lt;/td&gt;
&lt;td&gt;MiniMax&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;204K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;60*&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;*DeepSeek V4 Pro — промо-цена, действует до 2026-05-31; после истечения базовая ставка примерно вчетверо выше. Все цены — снапшот каталога на 2026-05-27, актуальные значения всегда на странице &lt;a href="https://promptra.ru/pricing" rel="noopener noreferrer"&gt;тарифов&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Бросается в глаза разлёт цен: разница между выходом GPT-5.5 (2150 ₽) и DeepSeek V4 Pro (60 ₽) — почти в 36 раз. Именно поэтому держать всё в одном месте выгодно: вы платите за дорогую модель только там, где она нужна, а массовый поток гоните через дешёвую — переключение задаётся одной строкой. Какую модель под какую задачу — подробный разбор в обзоре &lt;a href="https://promptra.ru/blog/top-5-llm-2026" rel="noopener noreferrer"&gt;топ-5 LLM 2026 года&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5kjplmgdfiz3nzsryb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5kjplmgdfiz3nzsryb5.png" alt="Горизонтальная столбчатая диаграмма «Стоимость 1М выходных токенов, ₽»: столбцы сверху вниз «GPT-5.5 — 2150», «Claude Opus 4.7 — 1790», «Gemini 3.1 Pro — 860», «GLM 5.1 — 310», «Kimi K2.5 — 170», «Qwen 3.6 Plus — 130», «DeepSeek V4 Pro — 60» (самый короткий, терракотовый), выноска «разлёт ≈36×», заголовок и подписи на русском, кремовый фон, графит, плоский вектор" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Как это работает технически: один endpoint вместо пяти
&lt;/h2&gt;

&lt;p&gt;Соберём механику в одну ясную картину. Агрегатор — это тонкий прокси-слой между вашим кодом и провайдерами. Ваше приложение шлёт HTTP-запрос не на пять разных доменов провайдеров, а на один endpoint агрегатора. Сервис определяет по полю &lt;code&gt;model&lt;/code&gt;, к какому провайдеру обратиться, пересылает запрос со своего аккаунта в поддерживаемой стране, получает ответ и возвращает его вам в едином формате.&lt;/p&gt;

&lt;p&gt;Для разработчика это означает три практических следствия.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drop-in замена.&lt;/strong&gt; Если у вас уже есть код на OpenAI SDK, переезд занимает пять минут: меняете &lt;code&gt;base_url&lt;/code&gt; и ключ — больше ничего. Официальный &lt;code&gt;openai&lt;/code&gt; SDK для Python и Node не отличает агрегатор от &lt;code&gt;api.openai.com&lt;/code&gt;: для него это просто другой адрес. Пошагово этот переезд для Python, Node и curl мы разобрали в гайде &lt;a href="https://promptra.ru/blog/migraciya-openai-sdk-base-url" rel="noopener noreferrer"&gt;миграция на Promptra: меняем base_url&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Было — прямой доступ (карты РФ не проходят, нужен VPN, риск бана):&lt;/span&gt;
&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.openai.com/v1
&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-...

&lt;span class="c"&gt;# Стало — единый агрегатор (без VPN, оплата в рублях, все модели):&lt;/span&gt;
&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.promptra.ru/v1
&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prm-...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Доступ из России без VPN.&lt;/strong&gt; Endpoint агрегатора находится в России, поэтому ваш запрос на него идёт по обычному каналу — VPN на вашей стороне не нужен ни для оплаты, ни для работы API. Сервис сам проксирует запрос в зарубежный OpenAI, Anthropic или Google со своего аккаунта в поддерживаемой стране. Это легальный B2B-канал доступа, а не обход чего-либо.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Единый формат ответов.&lt;/strong&gt; Поскольку всё приходит в формате OpenAI Chat Completions, ваш код обработки ответа, streaming через SSE, function calling и structured output работают одинаково для любой модели. Вы пишете слой работы с LLM один раз — и он совместим со всеми 34 моделями.&lt;/p&gt;

&lt;p&gt;Node/TypeScript — та же логика, отличается только адрес:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// prm-...&lt;/span&gt;
 &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// https://api.promptra.ru/v1&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Любая из 34 моделей — меняется только значение model&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anthropic/claude-sonnet-4.6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Привет&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Экономия и удобство: один баланс, один пакет документов
&lt;/h2&gt;

&lt;p&gt;Техническая часть — половина ценности. Вторая половина — деньги и отчётность, и здесь «всё в одном» решает ровно те издержки зоопарка, с которых мы начали.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Один рублёвый баланс на всё.&lt;/strong&gt; Вместо пяти кабинетов с разными депозитами в долларах — один баланс в рублях. Пополнили его — и тратите на любую из 34 моделей. Сколько потратили в этом месяце на ИИ, видно в одном месте, без археологии по чужим дашбордам. Бюджетирование снова становится одной цифрой.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Цена 1-в-1 с провайдером по курсу ЦБ.&lt;/strong&gt; На токены наценки нет — рублёвые цены в каталоге равны долларовым ценам провайдера, умноженным на курс ЦБ. Сервисная комиссия 5% берётся только при пополнении баланса — за работу сервиса, эквайринг и документооборот, а не с каждого запроса. Положили 100 000 ₽ — удержали 5 000 ₽ комиссии при пополнении — на балансе 95 000 ₽, которые тратите по курсу ЦБ. Это принципиально отличается от модели наценки на токены, где переплата растёт вместе с объёмом потребления.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Один пакет закрывающих документов на всё.&lt;/strong&gt; Это, возможно, главный аргумент «всё в одном» для бизнеса. оплата в рублях по договору, полный пакет закрывающих документов: договор-оферта, счёт, акт, счёт-фактура, УПД. Один договор, один контрагент в учётной системе, один комплект первички в месяц — вместо разбирательств с пятью зарубежными платежами без документов. Легальность работы с зарубежными LLM через российское юр.лицо разбираем отдельно: &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;легально ли использовать OpenAI и Claude на юр.лицо в РФ&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Сведём контраст в таблицу — зоопарк против одного места:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Что&lt;/th&gt;
&lt;th&gt;Зоопарк подписок&lt;/th&gt;
&lt;th&gt;Все нейросети в одном месте&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Кабинетов&lt;/td&gt;
&lt;td&gt;5–10&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Балансов&lt;/td&gt;
&lt;td&gt;5–10, разные валюты&lt;/td&gt;
&lt;td&gt;1 рублёвый&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Способ оплаты&lt;/td&gt;
&lt;td&gt;иностранные карты, VPN, риск бана&lt;/td&gt;
&lt;td&gt;банковский платёж в ₽ на юр.лицо&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Закрывающие документы&lt;/td&gt;
&lt;td&gt;нет или вразнобой&lt;/td&gt;
&lt;td&gt;единый пакет через ЭДО&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Интеграций в коде&lt;/td&gt;
&lt;td&gt;по одной на провайдера&lt;/td&gt;
&lt;td&gt;одна (OpenAI-совместимая)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Переключение модели&lt;/td&gt;
&lt;td&gt;новая интеграция&lt;/td&gt;
&lt;td&gt;одна строка (&lt;code&gt;model&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Новый релиз модели&lt;/td&gt;
&lt;td&gt;новый аккаунт и договор&lt;/td&gt;
&lt;td&gt;сразу в каталоге&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0r3gu3626lh3qdjf9c5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0r3gu3626lh3qdjf9c5j.png" alt="Карточка-схема «Одна точка вместо зоопарка»: по центру три плашки преимуществ с иконками и подписями — «Один рублёвый баланс» (кошелёк), «Один пакет закрывающих: договор, счёт, акт, счёт-фактура, УПД через ЭДО» (стопка документов с печатью), «Один endpoint — 34 модели» (узел со стрелками), снизу подпись «оплата на юр.лицо в рублях», терракотовые акценты на кремовом фоне, плоский вектор, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Как начать
&lt;/h2&gt;

&lt;p&gt;Переход с зоопарка на единую точку — это не миграция-проект на недели, а несколько шагов.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Оцените свой профиль нагрузки.&lt;/strong&gt; Прикиньте, какие задачи у вас есть и сколько примерно токенов они потребляют. Это нужно, чтобы выбрать модели под задачи: дорогой флагман — только туда, где он оправдан, массовый поток — на дешёвый слой.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Подключите один ключ.&lt;/strong&gt; Получаете ключ вида &lt;code&gt;prm-...&lt;/code&gt; и адрес &lt;code&gt;https://api.promptra.ru/v1&lt;/code&gt;. Этого достаточно для доступа ко всем моделям каталога.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Поменяйте &lt;code&gt;base_url&lt;/code&gt; и ключ в коде.&lt;/strong&gt; Если приложение уже на OpenAI SDK — это две строки в переменных окружения. Остальной код не трогаете. Проверьте на одном запросе, что ответ приходит.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Настройте выбор модели под задачу.&lt;/strong&gt; Заведите маппинг «тип задачи → значение &lt;code&gt;model&lt;/code&gt;»: например, классификация → &lt;code&gt;qwen/qwen3.6-plus&lt;/code&gt;, код → &lt;code&gt;anthropic/claude-opus-4.7&lt;/code&gt;, длинные документы → &lt;code&gt;google/gemini-3.1-pro-preview&lt;/code&gt;. Переключение — это подстановка строки, а не новая интеграция.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Сверните зоопарк.&lt;/strong&gt; По мере проверки переводите задачи со старых разрозненных аккаунтов на единый баланс. В конце месяца — один пакет документов вместо разбросанной первички.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Лучший способ проверить — не статья, а тест на своей реальной нагрузке за день-два: это стоит несколько сотен рублей и сразу даёт понимание по латентности, качеству и удобству биллинга. Хотите посчитать стоимость под свой профиль или обсудить подключение — напишите команде напрямую в Telegram: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt;. Это CEO напрямую, без отдела продаж: технические вопросы решаются за один разговор. Если хотите сразу посмотреть, как выглядит доступ к конкретной модели, — вот страница &lt;a href="https://promptra.ru/api/chatgpt" rel="noopener noreferrer"&gt;ChatGPT API&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>llm</category>
      <category>openai</category>
      <category>claude</category>
    </item>
    <item>
      <title>Видео по API из России: Veo 3.1, Seedance 2.0 и Kling v3</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Wed, 17 Jun 2026 07:10:05 +0000</pubDate>
      <link>https://dev.to/promptra-team/vidieo-po-api-iz-rossii-veo-31-seedance-20-i-kling-v3-4man</link>
      <guid>https://dev.to/promptra-team/vidieo-po-api-iz-rossii-veo-31-seedance-20-i-kling-v3-4man</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8k3rcnioe69axtb5h9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8k3rcnioe69axtb5h9r.png" alt="Столбчатая диаграмма стоимости одной секунды видео в рублях у трёх моделей: Seedance 2.0, Kling v3 Standard и Veo 3.1, от самой дешёвой к премиальной" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Генерация видео по API доступна из России через три топовые модели на одном OpenAI-совместимом endpoint: &lt;strong&gt;Google Veo 3.1&lt;/strong&gt;, &lt;strong&gt;ByteDance Seedance 2.0&lt;/strong&gt; и &lt;strong&gt;Kling v3 от Kuaishou&lt;/strong&gt;. Все три тарифицируются за секунду готового ролика, оплата идёт в рублях на российское юр.лицо с полным пакетом закрывающих документов через ЭДО. Стартовые ставки через Promptra: Seedance — от &lt;strong&gt;3.58 ₽ за секунду&lt;/strong&gt; (480p), Kling v3 Standard — от &lt;strong&gt;4.52 ₽ за секунду&lt;/strong&gt; (720p), Veo 3.1 — &lt;strong&gt;28.67 ₽ за секунду&lt;/strong&gt; (720p–1080p). Это цены 1-в-1 с прайсом провайдеров по курсу ЦБ РФ, без наценки на секунды.&lt;/p&gt;

&lt;p&gt;Коротко, кому что: &lt;strong&gt;Veo 3.1&lt;/strong&gt; — премиум-качество и единственная из трёх с генерацией звуковой дорожки, берут под рекламу и продакшен, где картинка решает. &lt;strong&gt;Seedance 2.0&lt;/strong&gt; — баланс цены и качества, самый дешёвый вход (от 3.58 ₽/с), мультимодальный приём на входе (текст, изображение, видео, аудио). &lt;strong&gt;Kling v3&lt;/strong&gt; — сильный motion control: явное управление движением камеры и объектов, удобно когда нужна предсказуемая динамика. Ниже — полные таблицы цен из каталога, расчёт стоимости 5-секундного ролика для каждой модели, разбор text-to-video против image-to-video и как подключить видео-API из России без VPN. Все цены — на 2026-05-29.&lt;/p&gt;

&lt;h2&gt;
  
  
  Видео-API: голубой океан для российских команд
&lt;/h2&gt;

&lt;p&gt;Прежде чем сравнивать модели, стоит сказать главное про рынок. Текстовые LLM (GPT, Claude, Gemini) через российские агрегаторы доступны давно и у многих. А вот &lt;strong&gt;видео-генерация по API почти никем в РФ не покрыта&lt;/strong&gt;: конкуренты-агрегаторы либо вообще не дают доступ к Veo/Seedance/Kling по API, либо ограничиваются веб-интерфейсом с ручной выгрузкой роликов. Для команды, которой нужно встроить генерацию видео в продукт или пайплайн — в SaaS, в маркетинговую автоматизацию, в конвейер UGC-контента — это означает выбор из VPN-костылей и зарубежных карт.&lt;/p&gt;

&lt;p&gt;Promptra даёт эти три модели через тот же OpenAI-совместимый шлюз, что и текстовые LLM, с оплатой в рублях и закрывающими документами. То есть видео-генерацию можно подключить так же, как вы подключаете чат-модель: один &lt;code&gt;base_url&lt;/code&gt;, один ключ, оплата на юр.лицо. Отдельный договор, отдельная интеграция, отдельный валютный платёж за рубеж не нужны.&lt;/p&gt;

&lt;p&gt;Это важный нюанс именно для бизнеса: видео-генерация дорогая по сравнению с текстом (секунда 1080p Veo стоит как сотни тысяч токенов GPT-5.4), поэтому расход обязан корректно проходить по бухгалтерии. О документах — в конце статьи.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzkdpss6zgub2q9cz1u9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzkdpss6zgub2q9cz1u9k.png" alt="Горизонтальная сравнительная схема: текстовые LLM покрыты многими российскими агрегаторами, видео-API через Veo, Seedance и Kling — почти никем, блок Promptra подсвечен терракотовым как закрывающий нишу" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Три модели: чем отличаются и кому что
&lt;/h2&gt;

&lt;p&gt;У всех трёх моделей одна выходная модальность — видео, и общий способ тарификации — за секунду готового ролика. Различия — в качестве картинки, наличии звука, способах подачи на вход и в цене. Сведём в таблицу возможностей (данные из нашего каталога).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Параметр&lt;/th&gt;
&lt;th&gt;Veo 3.1&lt;/th&gt;
&lt;th&gt;Seedance 2.0&lt;/th&gt;
&lt;th&gt;Kling v3 Standard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Провайдер&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;ByteDance&lt;/td&gt;
&lt;td&gt;Kuaishou&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Идентификатор&lt;/td&gt;
&lt;td&gt;&lt;code&gt;google/veo-3.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bytedance/seedance-2.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kwaivgi/kling-v3.0-std&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Вход (модальности)&lt;/td&gt;
&lt;td&gt;текст&lt;/td&gt;
&lt;td&gt;текст, изображение, видео, аудио&lt;/td&gt;
&lt;td&gt;текст&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Генерация звука&lt;/td&gt;
&lt;td&gt;да&lt;/td&gt;
&lt;td&gt;нет&lt;/td&gt;
&lt;td&gt;нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Максимальное разрешение&lt;/td&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Старт цены (₽/с)&lt;/td&gt;
&lt;td&gt;28.67 ₽ (720p)&lt;/td&gt;
&lt;td&gt;3.58 ₽ (480p)&lt;/td&gt;
&lt;td&gt;4.52 ₽ (720p)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Позиционирование&lt;/td&gt;
&lt;td&gt;премиум-качество + аудио&lt;/td&gt;
&lt;td&gt;баланс / дёшево&lt;/td&gt;
&lt;td&gt;motion control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Дальше — по каждой модели подробно: что это, в чём сильна, цена в рублях и долларах из каталога.&lt;/p&gt;

&lt;h3&gt;
  
  
  Veo 3.1 — премиум-качество и звук
&lt;/h3&gt;

&lt;p&gt;Veo 3.1 — флагманская модель видео-генерации Google и самая дорогая из трёх. Её отличает топовое качество картинки и единственная среди наших видео-моделей &lt;strong&gt;генерация звуковой дорожки&lt;/strong&gt;: модель умеет синтезировать к ролику звук, а не только немое видео. Это закрывает сценарии, где нужна готовая сцена со звуком за один проход — короткая реклама, презентационные вставки, сцены с речью или фоновым звуком.&lt;/p&gt;

&lt;p&gt;Базовое разрешение — 720p и 1080p по одной ставке, отдельно есть тариф 4K. Вход — текстовый (text-to-video); для image-to-video в каталоге есть отдельный вариант &lt;code&gt;google/veo-3.1-i2v&lt;/code&gt; по той же посекундной ставке. Цены из каталога — это прямой пересчёт официального прайса Google по курсу ЦБ.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Разрешение&lt;/th&gt;
&lt;th&gt;Цена Google (USD/с)&lt;/th&gt;
&lt;th&gt;Цена Promptra (₽/с)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;28.67 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;$0.40&lt;/td&gt;
&lt;td&gt;28.67 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;$0.60&lt;/td&gt;
&lt;td&gt;43.00 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Источник цен — &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;официальный прайс Gemini API / Veo&lt;/a&gt;. У Google есть и более дешёвый Fast-вариант Veo со значительной скидкой, но в нашем каталоге как флагман заведена именно Standard-версия с топовым качеством.&lt;/p&gt;

&lt;p&gt;Берите Veo 3.1, когда картинка и звук решают, а бюджет на секунду вторичен: рекламные ролики, продуктовые тизеры, сцены, которые пойдут на внешнюю аудиторию. Для массового потока дешёвого контента это избыточно дорого — там уместнее Seedance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seedance 2.0 — баланс и самый дешёвый вход
&lt;/h3&gt;

&lt;p&gt;Seedance 2.0 от ByteDance — модель «золотой середины»: качество, достаточное для большинства задач, при самой низкой стартовой цене из трёх. Секунда 480p стоит &lt;strong&gt;3.58 ₽&lt;/strong&gt; — почти в восемь раз дешевле секунды Veo. ByteDance анонсировала Seedance как наступление «эры одного юаня за секунду», и по нашему каталогу это близко к правде на нижних разрешениях.&lt;/p&gt;

&lt;p&gt;Ещё одна сильная сторона — самый богатый вход среди трёх моделей: Seedance принимает текст, изображение, видео и аудио. То есть в одной линейке закрываются и text-to-video, и image-to-video (&lt;code&gt;bytedance/seedance-2.0-i2v&lt;/code&gt;), и редактирование (&lt;code&gt;seedance-2.0-edit&lt;/code&gt;), и расширение существующего ролика (&lt;code&gt;seedance-2.0-extend&lt;/code&gt;) — последние два по сниженной ставке video-input тарифа.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Разрешение&lt;/th&gt;
&lt;th&gt;Цена (USD/с)&lt;/th&gt;
&lt;th&gt;Цена Promptra (₽/с)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;3.58 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;10.03 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;$0.34&lt;/td&gt;
&lt;td&gt;24.37 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Тарификация Volcengine (платформа ByteDance) исходно посчитана по токенам (46 CNY за 1M токенов на чистую генерацию), посекундные ставки по разрешениям выведены из публичного листинга doubao-seedance-2-0. Первоисточник по ценам — &lt;a href="https://www.volcengine.com/docs/82379/1544106" rel="noopener noreferrer"&gt;документация Volcengine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Берите Seedance, когда нужен объём контента при контролируемом бюджете: UGC-конвейеры, превью, A/B-варианты роликов, внутренние демо, прототипы. Заметьте, что 1080p Seedance (24.37 ₽/с) почти догоняет по цене 1080p Veo (28.67 ₽/с) — преимущество Seedance в цене наиболее велико на 480p и 720p.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kling v3 — motion control
&lt;/h3&gt;

&lt;p&gt;Kling v3 Standard от Kuaishou — модель с упором на &lt;strong&gt;управление движением&lt;/strong&gt;. Помимо обычного text-to-video, в линейке есть отдельный режим Motion Control (&lt;code&gt;kwaivgi/kling-v3.0-std-motion-control&lt;/code&gt;), который даёт явный контроль над движением камеры и объектов в кадре. Это решает частую боль видео-генерации — непредсказуемую «болтанку» камеры: когда нужна заданная траектория облёта, плавный наезд или конкретное направление движения, motion control экономит десятки переgenераций.&lt;/p&gt;

&lt;p&gt;Базовый Standard-режим по цене встаёт между Seedance и Veo и дешевле Veo в несколько раз.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Режим / разрешение&lt;/th&gt;
&lt;th&gt;Цена (USD/с)&lt;/th&gt;
&lt;th&gt;Цена Promptra (₽/с)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Standard 720p&lt;/td&gt;
&lt;td&gt;$0.063&lt;/td&gt;
&lt;td&gt;4.52 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard 1080p&lt;/td&gt;
&lt;td&gt;$0.084&lt;/td&gt;
&lt;td&gt;6.02 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motion Control 720p&lt;/td&gt;
&lt;td&gt;$0.084&lt;/td&gt;
&lt;td&gt;6.02 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motion Control 1080p&lt;/td&gt;
&lt;td&gt;$0.1134&lt;/td&gt;
&lt;td&gt;8.13 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Источник — &lt;a href="https://kling.ai/dev/pricing" rel="noopener noreferrer"&gt;официальный прайс Kling&lt;/a&gt;; внутренняя тарификация считается в кредитах (Standard 1080p без звука — 8 кредитов/с), Motion Control добавляет +2 кредита/с поверх базового тарифа. Image-to-video (&lt;code&gt;kwaivgi/kling-v3.0-std-i2v&lt;/code&gt;) идёт по той же посекундной ставке, что и text-to-video Standard.&lt;/p&gt;

&lt;p&gt;Берите Kling, когда важна предсказуемая динамика кадра: облёты товара, заданные движения камеры, анимация с контролируемой траекторией. По цене 1080p (6.02 ₽/с) Kling существенно дешевле 1080p Veo (28.67 ₽/с), хотя и без генерации звука.&lt;/p&gt;

&lt;h2&gt;
  
  
  Сколько стоит ролик: расчёт на 5 секунд
&lt;/h2&gt;

&lt;p&gt;Посекундная ставка превращается в понятную цифру, как только её умножить на длину ролика. Возьмём типовой короткий ролик — &lt;strong&gt;5 секунд&lt;/strong&gt; — и посчитаем стоимость для каждой модели и разрешения. Арифметика прямая: &lt;code&gt;ставка ₽/с × длительность в секундах&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Разрешение&lt;/th&gt;
&lt;th&gt;Ставка (₽/с)&lt;/th&gt;
&lt;th&gt;Ролик 5 секунд&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Seedance 2.0&lt;/td&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;3.58 ₽&lt;/td&gt;
&lt;td&gt;≈ 17.90 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kling v3 Standard&lt;/td&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;4.52 ₽&lt;/td&gt;
&lt;td&gt;≈ 22.60 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kling v3 Standard&lt;/td&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;6.02 ₽&lt;/td&gt;
&lt;td&gt;≈ 30.10 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seedance 2.0&lt;/td&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;10.03 ₽&lt;/td&gt;
&lt;td&gt;≈ 50.15 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seedance 2.0&lt;/td&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;24.37 ₽&lt;/td&gt;
&lt;td&gt;≈ 121.85 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1&lt;/td&gt;
&lt;td&gt;720p–1080p&lt;/td&gt;
&lt;td&gt;28.67 ₽&lt;/td&gt;
&lt;td&gt;≈ 143.35 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veo 3.1&lt;/td&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;43.00 ₽&lt;/td&gt;
&lt;td&gt;≈ 215.00 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Разброс показателен: самый дешёвый 5-секундный ролик (Seedance 480p) стоит около 18 ₽, самый дорогой (Veo 4K) — около 215 ₽, разница примерно в 12 раз. Для прикидки месячного бюджета: тысяча 5-секундных роликов на Seedance 480p — около 18 000 ₽, та же тысяча на Veo 1080p — около 143 000 ₽.&lt;/p&gt;

&lt;p&gt;Отсюда практический вывод по экономике: подбирайте модель и разрешение под назначение ролика. Черновики, превью и массовый внутренний контент — на дешёвых тарифах Seedance/Kling; финальные ролики на внешнюю аудиторию, где важны картинка и звук — на Veo. Многие команды строят двухступенчатую схему: дешёвая модель на этапе перебора идей и раскадровки, премиальная — только на финальный рендер отобранного варианта. Сервисная комиссия Promptra (5%) при этом берётся один раз при пополнении баланса, а не с каждого ролика.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp91ay4jgqak5wu2v7ep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp91ay4jgqak5wu2v7ep.png" alt="Столбчатая диаграмма стоимости ролика 5 секунд в рублях: Seedance 480p 17.9, Kling 720p 22.6, Kling 1080p 30.1, Seedance 1080p 121.9, Veo 1080p 143.4, Veo 4K 215, столбцы от низкого к высокому с подписями" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Text-to-video и image-to-video: в чём разница
&lt;/h2&gt;

&lt;p&gt;У видео-моделей два базовых способа подачи запроса, и важно понимать, чем они отличаются — это влияет и на результат, и на выбор модели.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text-to-video (текст в видео)&lt;/strong&gt; — модель генерирует ролик с нуля по текстовому описанию сцены. Вы пишете промпт («дрон облетает горный хребет на рассвете, тёплый свет»), модель синтезирует кадры целиком. Так работают базовые &lt;code&gt;google/veo-3.1&lt;/code&gt;, &lt;code&gt;bytedance/seedance-2.0&lt;/code&gt; и &lt;code&gt;kwaivgi/kling-v3.0-std&lt;/code&gt;. Это максимальная свобода, но и максимальная непредсказуемость композиции — вы не задаёте исходную картинку.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image-to-video (изображение в видео)&lt;/strong&gt; — на вход подаётся стартовый кадр (картинка), и модель «оживляет» его, достраивая движение. Это удобно, когда есть готовый визуал — фото товара, сгенерированная ранее картинка, кадр из брендбука — и нужно привести его в движение, сохранив композицию. В каталоге для этого есть отдельные варианты: &lt;code&gt;google/veo-3.1-i2v&lt;/code&gt;, &lt;code&gt;bytedance/seedance-2.0-i2v&lt;/code&gt;, &lt;code&gt;kwaivgi/kling-v3.0-std-i2v&lt;/code&gt;. Посекундная ставка у i2v-вариантов та же, что у базовых text-to-video.&lt;/p&gt;

&lt;p&gt;Связка работает особенно хорошо в паре с генерацией изображений: сначала вы получаете идеальный кадр через image-модель, потом анимируете его через i2v. Про генерацию картинок по API — Nano Banana Pro и GPT Image 2 — у нас есть отдельный разбор: &lt;a href="https://promptra.ru/blog/image-api-nano-banana-gpt-image-2-rubli" rel="noopener noreferrer"&gt;генерация изображений по API за рубли&lt;/a&gt;. Seedance вдобавок умеет принимать на вход и видео (режимы edit/extend) — редактировать и продлевать готовые ролики.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupnoy7i2apcqeuz6gecy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupnoy7i2apcqeuz6gecy.png" alt="Схема двух режимов генерации: сверху text-to-video — прямоугольник «текстовый промпт» стрелкой в «модель» и в «видео»; снизу image-to-video — «стартовый кадр» плюс «промпт» стрелками в «модель» и в «видео», подписи на русском" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Как подключить видео-API из России
&lt;/h2&gt;

&lt;p&gt;Технически видео-модели через Promptra подключаются по тому же принципу, что и текстовые: совместимый с OpenAI endpoint, меняется &lt;code&gt;base_url&lt;/code&gt;, ключ OpenAI заменяется ключом Promptra. Разница — в том, что генерация видео &lt;strong&gt;асинхронная&lt;/strong&gt;: ролик рендерится не мгновенно, поэтому работа идёт в два шага — сначала задача отправляется (submit), потом по идентификатору опрашивается её статус (task), пока видео не будет готово. В каталоге у видео-моделей для этого есть endpoints &lt;code&gt;videos_submit&lt;/code&gt; и &lt;code&gt;videos_task&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Базовый запрос на генерацию (отправка задачи):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.promptra.ru/v1/videos/submit &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer prm-xxxxxxxxxxxx"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
 "model": "bytedance/seedance-2.0",
 "prompt": "дрон облетает горный хребет на рассвете, тёплый свет",
 "resolution": "720p",
 "duration": 5
 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В ответ приходит идентификатор задачи. Затем опрашиваем её статус, пока не вернётся ссылка на готовый ролик:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.promptra.ru/v1/videos/task/TASK_ID &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer prm-xxxxxxxxxxxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;То же на Python — с простым ожиданием готовности:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PROMPTRA_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# ключ Promptra
&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Отправляем задачу на генерацию
&lt;/span&gt;&lt;span class="n"&gt;submit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/videos/submit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google/veo-3.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;дрон облетает горный хребет на рассвете, тёплый свет&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resolution&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Ждём готовности и забираем ссылку на ролик
&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/videos/task/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Готово:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
 &lt;span class="k"&gt;break&lt;/span&gt;
 &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Точные имена полей в ответе зависят от конкретной модели — ориентируйтесь на фактический JSON, который вернёт endpoint. Принцип одинаков для всех трёх моделей: меняете &lt;code&gt;model&lt;/code&gt; на нужный идентификатор (&lt;code&gt;google/veo-3.1&lt;/code&gt;, &lt;code&gt;bytedance/seedance-2.0&lt;/code&gt;, &lt;code&gt;kwaivgi/kling-v3.0-std&lt;/code&gt;), а схема submit → poll → download остаётся той же.&lt;/p&gt;

&lt;p&gt;Почему этот путь надёжнее прямого доступа через VPN и зарубежные карты, мы подробно разбирали в гайде про &lt;a href="https://promptra.ru/blog/openai-api-rossiya-2026" rel="noopener noreferrer"&gt;OpenAI API в России&lt;/a&gt;: там и про блокировки аккаунтов, и про риски карт, и про юридическую сторону — те же аргументы целиком применимы к видео-моделям Google, ByteDance и Kuaishou.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6k6epe96dgazx4d6njh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6k6epe96dgazx4d6njh.png" alt="Схема асинхронного потока генерации видео: прямоугольник «отправка задачи (submit)» стрелкой в «рендер на стороне модели», далее «опрос статуса (task)» по кругу до готовности и «скачать ролик», подписи на русском, терракотовый акцент на финальном шаге" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Какую модель выбрать: короткая шпаргалка
&lt;/h2&gt;

&lt;p&gt;Свяжем всё вместе. Выбор сводится к трём вопросам: нужен ли звук, насколько важна предсказуемость движения и каков бюджет на секунду.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Нужен звук в ролике&lt;/strong&gt; → только &lt;strong&gt;Veo 3.1&lt;/strong&gt; (единственная из трёх генерирует звуковую дорожку).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нужно топовое качество картинки на внешнюю аудиторию, бюджет вторичен&lt;/strong&gt; → &lt;strong&gt;Veo 3.1&lt;/strong&gt;, при необходимости 4K.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нужен объём контента при минимальной цене&lt;/strong&gt; → &lt;strong&gt;Seedance 2.0&lt;/strong&gt;, особенно на 480p/720p (от 3.58 ₽/с).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нужен богатый вход (анимировать картинку, редактировать или продлить видео)&lt;/strong&gt; → &lt;strong&gt;Seedance 2.0&lt;/strong&gt; (принимает текст, изображение, видео, аудио).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нужна предсказуемая динамика и управление камерой&lt;/strong&gt; → &lt;strong&gt;Kling v3&lt;/strong&gt; в режиме Motion Control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нужно дешёвое 1080p без звука&lt;/strong&gt; → &lt;strong&gt;Kling v3 Standard&lt;/strong&gt; (6.02 ₽/с против 28.67 ₽/с у Veo).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;На практике многие команды используют не одну модель, а связку: перебирают идеи на дешёвой Seedance, финальный ролик со звуком рендерят на Veo, а сцены с заданным движением камеры — на Kling. Поскольку все три доступны через один endpoint и один баланс, переключение между ними — это смена строки &lt;code&gt;model&lt;/code&gt; в запросе.&lt;/p&gt;

&lt;h2&gt;
  
  
  Оплата и документы для юр.лица
&lt;/h2&gt;

&lt;p&gt;Видео-генерация — заметная статья расходов (тысячи рублей в месяц на активном использовании), поэтому для команды в компании важно, как эти траты проходят по бухгалтерии. Promptra принимает оплату на российское юр.лицо — российское юр.лицо — с полным пакетом закрывающих документов: договор-оферта, счёт, акт, счёт-фактура, УПД. Документооборот идёт через ЭДО (Диадок, СБИС) — документы автоматически проводятся в учётной системе.&lt;/p&gt;

&lt;p&gt;Это принципиальное отличие от прямого доступа к Google, ByteDance или Kuaishou через VPN и зарубежные карты: при таком сценарии у вас на руках нет закрывающих документов российского формата, расход на видео-генерацию сложно корректно учесть, а аккаунт живёт до первого бана. Расходы без правильно оформленной первички не принимаются к учёту бизнеса. Юридическую и бухгалтерскую сторону работы с зарубежными нейросетями мы разобрали в гайде про &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;легальность работы с AI API на юр.лицо&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>veo</category>
      <category>seedance</category>
      <category>kling</category>
      <category>api</category>
    </item>
    <item>
      <title>Syntx или Promptra: что выбрать бизнесу</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Tue, 16 Jun 2026 17:05:06 +0000</pubDate>
      <link>https://dev.to/promptra-team/syntx-ili-promptra-chto-vybrat-bizniesu-406n</link>
      <guid>https://dev.to/promptra-team/syntx-ili-promptra-chto-vybrat-bizniesu-406n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbp96ba4b0tcytv2e94a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbp96ba4b0tcytv2e94a.png" alt="Две колонки-сервиса как архитектурные блоки: слева окно Telegram-бота с пузырями диалога, категориями «текст / фото / видео / аудио» и кнопкой пополнения токенов, справа компактный блок с фрагментом OpenAI-совместимого API-кода и стопкой закрывающих документов с печатью, между ними вертикальная разделительная линия, тёплая кремово-терракотовая палитра, русские подписи" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Коротко для тех, кто пришёл за ответом: &lt;strong&gt;нейросеть Syntx и Promptra решают одну задачу — доступ к зарубежным ИИ из России без VPN, — но это продукты для разных пользователей. Syntx — B2C-агрегатор: Telegram-бот и веб-приложение, где человек руками генерирует тексты, картинки, видео и музыку, оплачивая всё токенами по подписке. Promptra — B2B API-сервис: один OpenAI-совместимый endpoint для интеграции в ваш продукт, оплата на юр.лицо российское юр.лицо с полным пакетом закрывающих документов через ЭДО и ценой на токены 1-в-1 с провайдером по курсу ЦБ.&lt;/strong&gt; Если вы ищете &lt;strong&gt;Syntx альтернативу&lt;/strong&gt; под продуктовую интеграцию и бухгалтерию команды, а не под чат в окне бота, — эта статья разложит различия по полочкам.&lt;/p&gt;

&lt;p&gt;Сразу честно: я работаю в Promptra, и это не «обзор-разоблачение». Syntx — популярный продукт с большим охватом аудитории, и часть задач он закрывает удобнее нас — в первую очередь для нетехнического пользователя, которому нужно «здесь и сейчас сгенерировать картинку в чате». Цель статьи — дать объективные критерии (формат доступа, модель оплаты, документы, каталог, аудитория), чтобы вы выбрали под свою задачу осознанно, а не по громкости рекламы.&lt;/p&gt;

&lt;p&gt;Все цены Promptra ниже — на 27.05.2026 при курсе ЦБ РФ 71.668 ₽/USD, пересчёт из официального долларового прайса провайдеров. Внешние факты — со ссылками на первоисточники. По Syntx я &lt;strong&gt;не привожу конкретные рублёвые тарифы и стоимость токенов&lt;/strong&gt;: они живут на их сайте, зависят от подписки и периодически меняются, поэтому актуальные цифры смотрите на &lt;a href="https://syntx.ai/" rel="noopener noreferrer"&gt;syntx.ai&lt;/a&gt;, а здесь я разбираю формат и методологию, а не пытаюсь зафиксировать чужой прайс на один день.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что такое нейросеть Syntx
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Syntx (Syntx AI)&lt;/strong&gt; — это российский агрегатор нейросетей, который объединяет доступ к десяткам зарубежных и отечественных моделей в одном интерфейсе. Главные точки входа — Telegram-бот (&lt;code&gt;@syntxaibot&lt;/code&gt;) и веб-приложение с синхронизированным балансом. Авторизация через Telegram или Google, дальше — панель с категориями: текст, изображения, видео, аудио, работа с документами. По данным &lt;a href="https://syntx.ai/home" rel="noopener noreferrer"&gt;официального сайта&lt;/a&gt;, платформа даёт доступ к большому набору моделей (заявлено «90+ AI») — от чат-моделей вроде GPT и Claude до генераторов изображений и видео, — работает в России без VPN и принимает карты РФ. Подробнее — &lt;a href="https://promptra.ru/blog/sravnenie-cen-llm-2026-tochnye-tarify-v-rublyah/" rel="noopener noreferrer"&gt;актуальные тарифы LLM в рублях с разбивкой по моделям&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ключевое свойство, которое определяет всё остальное: &lt;strong&gt;Syntx — это интерфейс для человека&lt;/strong&gt;. Вы заходите в бот, выбираете инструмент, пишете запрос, получаете результат в окне диалога. Это удобно для копирайтера, маркетолога, дизайнера, студента — конечного пользователя, который сам нажимает кнопки. Оплата — через подписку и внутренние токены: пополняете баланс, каждый запрос списывает токены, дорогие модели стоят больше за генерацию, лёгкие — меньше. Классическая B2C-механика «заплати за то, что используешь».&lt;/p&gt;

&lt;p&gt;Чего у формата «бот для человека» по природе нет — это программного доступа для встраивания в собственный продукт. Если нужно, чтобы нейросеть отвечала клиентам внутри &lt;em&gt;вашего&lt;/em&gt; приложения, обрабатывала заявки в &lt;em&gt;вашей&lt;/em&gt; CRM или генерировала тексты в &lt;em&gt;вашем&lt;/em&gt; бэкенде по расписанию — чат в боте эту задачу не решает. Здесь начинается территория API, на которой работает Promptra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что такое Promptra
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — это B2B-сервис доступа к зарубежным LLM по API из России, построенный по модели глобального OpenRouter. Один ключ → один OpenAI-совместимый endpoint → доступ ко всему каталогу: GPT-5.5, Claude Opus 4.7, Gemini 3.1 Pro, DeepSeek V4 Pro и десяткам других моделей, включая генерацию изображений и видео. Никакого веб-чата для ручного общения — это инфраструктура, которую разработчик встраивает в свой код.&lt;/p&gt;

&lt;p&gt;Три вещи, которые отличают Promptra и видны прямо на лендинге:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Цена на токены 1-в-1 с провайдером по курсу ЦБ&lt;/strong&gt;, без наценки на токены. Сервисная комиссия 5% — только при пополнении баланса (за эквайринг, документооборот и работу сервиса), а не за каждый токен.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Оплата на юр.лицо&lt;/strong&gt; — российское юр.лицо, (публикуется). Полный пакет первички: договор-оферта, счёт, акт, счёт-фактура, УПД — через ЭДО (Диадок/СБИС/Контур).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Единая точка контакта&lt;/strong&gt; — все вопросы по подключению решаются с командой напрямую в Telegram: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt;. Живой человек, а не тикет-система.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Чем Promptra не является: это не веб-чат и не бот для ручной генерации (нет окна «пиши запрос — получай картинку»), не B2C-подписка для частного пользователя и не «нейросеть всё-в-одном для всех». Мы целимся в команды разработки в компаниях, которым нужен API в коде и нормальные документы для бухгалтерии.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6hvkiukw5e1by1rqmrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6hvkiukw5e1by1rqmrb.png" alt="Дерево решений «чат в боте или API?»: верхний блок-вопрос «Кто будет нажимать кнопки?», две ветви со стрелками — левая «Человек руками в окне» ведёт к блоку «Telegram-бот / веб-чат (Syntx)», правая «Мой код, автоматически» ведёт к блоку «API-сервис (Promptra)»; ниже подписи-уточнения «генерация контента вручную» и «интеграция в продукт, биллинг на юрлицо»; кремовый фон, терракотовые акценты, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Формат — главное различие: бот для человека vs API для кода
&lt;/h2&gt;

&lt;p&gt;Прежде чем сравнивать цены и документы, зафиксируем главное: &lt;strong&gt;Syntx и Promptra находятся в разных слоях стека.&lt;/strong&gt; Это не «два конкурента за один кошелёк», а два инструмента, которые иногда покупает один и тот же человек для разных задач.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Критерий&lt;/th&gt;
&lt;th&gt;Syntx&lt;/th&gt;
&lt;th&gt;Promptra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Основной формат&lt;/td&gt;
&lt;td&gt;Telegram-бот + веб-приложение&lt;/td&gt;
&lt;td&gt;OpenAI-совместимый API (endpoint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Кто пользуется&lt;/td&gt;
&lt;td&gt;Конечный пользователь руками&lt;/td&gt;
&lt;td&gt;Код / приложение разработчика&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Как «общаться» с моделью&lt;/td&gt;
&lt;td&gt;Окно чата, кнопки, выбор инструмента&lt;/td&gt;
&lt;td&gt;HTTP-запрос из вашего бэкенда&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Типичная задача&lt;/td&gt;
&lt;td&gt;Сгенерировать текст/картинку/видео вручную&lt;/td&gt;
&lt;td&gt;Встроить ИИ в свой продукт, автоматизация&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Порог входа&lt;/td&gt;
&lt;td&gt;Нулевой — открыл бот, написал&lt;/td&gt;
&lt;td&gt;Нужен разработчик и интеграция&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Аудитория&lt;/td&gt;
&lt;td&gt;B2C: маркетологи, дизайнеры, студенты&lt;/td&gt;
&lt;td&gt;B2B: продуктовые команды, агентства, интеграторы&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Если нужно один раз написать пост, сделать обложку и озвучку — открывать SDK бессмысленно, бот Syntx справится быстрее. Но если задача — чтобы ассистент &lt;strong&gt;сам&lt;/strong&gt; отвечал тысячам клиентов внутри вашего сервиса, разбирал заявки или генерировал товарные описания пачками по cron — окно бота для этого не предназначено, нужен API. Дальше я разбираю именно сценарий «мне нужен API для продукта» — и в нём Promptra сравнивается с Syntx честно: как альтернатива на уровне доступа к моделям, а не интерфейса.&lt;/p&gt;

&lt;p&gt;Стоит отметить: у Syntx, по информации на сайте, есть Enterprise-направление с индивидуальными условиями (от 15 подписок). Но Enterprise-подписки на бота — это всё ещё про доступ людей к интерфейсу, а не про программную интеграцию. Разные потребности, важно их не путать при выборе.&lt;/p&gt;

&lt;h2&gt;
  
  
  Каталог моделей: широта vs глубина под прод
&lt;/h2&gt;

&lt;p&gt;У двух сервисов разная философия каталога, и она вытекает из формата.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntx&lt;/strong&gt; делает ставку на широту для конечного пользователя: по заявлению на сайте — «90+ AI» в одном окне, причём в максимально разных модальностях. Текстовые чат-модели, генераторы изображений (упоминаются Midjourney, Flux), видео (Veo, Sora-класса), музыка, синтез и клонирование голоса, работа с документами. Логика понятна: человек в боте хочет один интерфейс на все творческие задачи, чтобы не заводить аккаунты на десяти платформах. Это сильная сторона B2C-формата — «всё в одном чате».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; делает ставку на каталог под продакшн-интеграцию: десятки моделей от ключевых провайдеров (OpenAI, Anthropic, Google, DeepSeek, плюс китайские Qwen/GLM/Kimi/MiniMax и видео/изображения), но с единым OpenAI-совместимым контрактом и прозрачной ценой за токен по каждой модели. Смысл не в том, чтобы поразить количеством логотипов, а в том, чтобы вы могли переключать модель в коде одной строкой и точно знать, сколько стоит миллион токенов каждой. Вот реальные цены из нашего каталога (за 1 млн токенов, формат &lt;code&gt;input / output&lt;/code&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;USD за 1M (in / out)&lt;/th&gt;
&lt;th&gt;₽ за 1M (in / out)&lt;/th&gt;
&lt;th&gt;Контекст&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;$5 / $25&lt;/td&gt;
&lt;td&gt;350 / 1790 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;$3 / $15&lt;/td&gt;
&lt;td&gt;210 / 1070 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5 / $30&lt;/td&gt;
&lt;td&gt;350 / 2150 ₽&lt;/td&gt;
&lt;td&gt;1.05M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;$2.5 / $15&lt;/td&gt;
&lt;td&gt;170 / 1070 ₽&lt;/td&gt;
&lt;td&gt;1.05M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro Preview&lt;/td&gt;
&lt;td&gt;$2 / $12&lt;/td&gt;
&lt;td&gt;140 / 860 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;
&lt;td&gt;$0.435 / $0.87&lt;/td&gt;
&lt;td&gt;30 / 60 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;DeepSeek V4 Pro по этой цене включает промо-скидку −75%, действующую до 2026-05-31; базовая ставка после промо — около $1.74 / $3.48 за 1M (то есть ~120 / 240 ₽). Цифры — из официального &lt;a href="https://api-docs.deepseek.com/quick_start/pricing" rel="noopener noreferrer"&gt;прайса DeepSeek&lt;/a&gt;. Цены OpenAI и Anthropic — с их официальных страниц: &lt;a href="https://openai.com/api/pricing/" rel="noopener noreferrer"&gt;openai.com&lt;/a&gt;, &lt;a href="https://www.anthropic.com/pricing" rel="noopener noreferrer"&gt;anthropic.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Разница в подходе: у Syntx цена выражена во внутренних токенах платформы (их курс к запросу задаёт сервис), у Promptra — в долларах провайдера по курсу ЦБ, и вы видите ту же цифру, что на странице &lt;a href="https://promptra.ru/pricing" rel="noopener noreferrer"&gt;тарифов&lt;/a&gt;. Ни один подход не «правильнее»: для B2C-пользователя удобнее единая валюта токенов, для бизнеса, который защищает расходы перед ФНС, важнее привязка к официальному прайсу провайдера и курсу ЦБ.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvew1d63kj7l1lk346u5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvew1d63kj7l1lk346u5a.png" alt="Горизонтальная столбчатая диаграмма «Цена 1М выходных токенов в Promptra, ₽»: столбцы с подписями и числами — «GPT-5.5 — 2150 ₽» (самый длинный), «Claude Opus 4.7 — 1790 ₽», «Claude Sonnet 4.6 — 1070 ₽», «Gemini 3.1 Pro — 860 ₽», «DeepSeek V4 Pro — 60 ₽» (самый короткий, терракотовый), подпись снизу «1-в-1 с провайдером по курсу ЦБ 71,668 ₽/$»; кремовый фон #FAFAF7, акцент терракота #D97757, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Модель оплаты: подписка и токены vs баланс по курсу ЦБ
&lt;/h2&gt;

&lt;p&gt;Здесь различие самое практическое.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntx&lt;/strong&gt; — подписочная B2C-модель с внутренними токенами. Вы оформляете подписку (на сайте упоминаются периоды 1/3/6/12 месяцев), есть бесплатный стартовый лимит, дальше пополняете баланс токенов и тратите их на генерации. Дорогая модель = больше токенов за запрос. Оплата картами РФ. Это понятная и привычная для частного пользователя схема: как подписка на стриминг, только токенами платишь за конкретные генерации. Главный плюс — простота: не надо считать input/output-токены провайдера, всё абстрагировано в «токены платформы».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — баланс с расходом по факту использования модели. Вы пополняете счёт, дальше каждый запрос списывает реальную стоимость токенов конкретной модели по курсу ЦБ — без наценки на токены. Сервисная комиссия 5% берётся &lt;strong&gt;только при пополнении&lt;/strong&gt; (за эквайринг, документооборот, работу сервиса), а не за каждый токен. Положили 100 000 ₽ → 5 000 ₽ комиссия за перевод/документы → на баланс зачислено 95 000 ₽, которые вы тратите по долларовому прайсу провайдера в пересчёте по курсу ЦБ.&lt;/p&gt;

&lt;p&gt;Что это значит на практике. Для человека, который делает 50 картинок и 20 текстов в месяц, подписка Syntx с токенами — ровно та модель, что ему нужна: предсказуемый платёж, ноль возни. Для бизнеса, у которого LLM крутится в проде и расход исчисляется миллионами токенов, важнее другое — отсутствие наценки на сам токен (на объёме разница между «по курсу ЦБ» и «с маркетинговой маржой» превращается в зарплату инженера) и прозрачность, какая модель сколько съела. Вопрос не «кто дешевле в вакууме», а «какая модель оплаты соответствует вашему типу нагрузки».&lt;/p&gt;

&lt;h2&gt;
  
  
  Закрывающие документы: чего у B2C-формата обычно нет
&lt;/h2&gt;

&lt;p&gt;Это часть, которую конечный пользователь часто пропускает, а бухгалтерия компании проверяет в первую очередь. И именно здесь проходит чёткая граница между потребительским сервисом и B2B-инфраструктурой.&lt;/p&gt;

&lt;p&gt;Когда компания платит за инструмент, ей мало списания с карты — нужны документы, чтобы принять расход к налоговому учёту и пройти проверку ФНС. Стандартный B2B-пакет — договор, счёт, акт, счёт-фактура и УПД (универсальный передаточный документ) через оператора ЭДО. Без них расход на нейросеть превращается в головную боль для бухгалтера: «а на основании чего вы это списали?».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntx&lt;/strong&gt; по своей природе B2C-продукт: оплата картой за подписку. Конкретный набор документов для юрлиц уточняйте у них напрямую — формат закупки B2C-сервиса обычно не подразумевает полного пакета первички «из коробки», а для бизнеса это критично. Планируете оформлять как корпоративный расход — это первый вопрос к поддержке Syntx до оплаты.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; изначально построен под B2B-сценарий: полный пакет закрывающих документов — стандарт, не доплата. Оплата на юр.лицо российское юр.лицо ( опубликован), договор-оферта и УПД идут через ЭДО (Диадок, СБИС, Контур). Бухгалтер получает первичку в привычном виде, расход на API списывается как обычная услуга. Подробно про документы для списания расходов на ИИ — в разборе &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;«Легально ли использовать AI API на юрлицо в РФ»&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Частному лицу, которое платит за творческий инструмент из своего кармана, документы, скорее всего, не нужны — и формат Syntx тут не минус. Но если за инструмент платит компания и расход надо проводить официально, полный пакет первички через ЭДО становится решающим фактором — и это сильная сторона B2B-формата Promptra.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2lb6rwb7hamht0eril0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2lb6rwb7hamht0eril0.png" alt="Сравнительная таблица-схема «Что получает бухгалтерия»: две колонки. Левая «B2C-сервис (оплата картой)» с одной строкой «чек / списание с карты» и знаком вопроса напротив строк «договор», «счёт», «акт», «счёт-фактура», «УПД». Правая «Promptra (B2B)» — все пять строк отмечены галочками: «договор-оферта ✓», «счёт ✓», «акт ✓», «счёт-фактура ✓», «УПД через ЭДО ✓». Внизу подпись «оплата на ООО, ». Кремовый фон, терракотовые галочки, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Подключение по API: drop-in за пять минут
&lt;/h2&gt;

&lt;p&gt;Главное практическое преимущество API-формата — встраивание в код любого стека одной заменой &lt;code&gt;base_url&lt;/code&gt;. Promptra совместим с OpenAI SDK, поэтому если у вас уже есть код под OpenAI, миграция — это две строки.&lt;/p&gt;

&lt;p&gt;Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ВАШ_КЛЮЧ_PROMPTRA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic/claude-opus-4.7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Сформулируй УТП для B2B-сервиса в 2 предложениях&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PROMPTRA_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai/gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Привет!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Чтобы сменить модель — меняете строку &lt;code&gt;model&lt;/code&gt;: с &lt;code&gt;anthropic/claude-opus-4.7&lt;/code&gt; на &lt;code&gt;openai/gpt-5.5&lt;/code&gt;, &lt;code&gt;google/gemini-3.1-pro-preview&lt;/code&gt; или &lt;code&gt;deepseek/deepseek-v4-pro&lt;/code&gt;. Endpoint и формат запроса не меняются. Это и есть смысл агрегатора по API: один контракт, любой провайдер. У формата «бот в Telegram» аналога нет — там вы меняете модель кнопкой в интерфейсе для ручной генерации, но встроить это в свой бэкенд нельзя. Для интеграций с инструментами разработки — например, &lt;a href="https://promptra.ru/api/claude" rel="noopener noreferrer"&gt;Claude Code на своём ключе&lt;/a&gt; — нужен именно API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Когда выбирать Syntx, а когда Promptra
&lt;/h2&gt;

&lt;p&gt;Честный decision-tree без перетягивания одеяла.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Выбирайте Syntx, если:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Вы конечный пользователь (маркетолог, дизайнер, SMM, копирайтер, студент), и вам нужно генерировать контент руками в удобном интерфейсе.&lt;/li&gt;
&lt;li&gt;Нужен один чат на все модальности сразу — текст, картинки, видео, музыка, озвучка — без заведения аккаунтов на десяти платформах.&lt;/li&gt;
&lt;li&gt;Удобнее платить подпиской с понятными токенами, чем считать input/output-токены провайдера.&lt;/li&gt;
&lt;li&gt;Вы платите за инструмент из своего кармана, и закрывающие документы для бухгалтерии вам не нужны.&lt;/li&gt;
&lt;li&gt;Порог входа должен быть нулевым: открыл бот в Telegram — и сразу работаешь, без разработчика.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Выбирайте Promptra, если:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Вам нужен API для встраивания ИИ в собственный продукт, бот, CRM или бэкенд — а не интерфейс для ручной генерации.&lt;/li&gt;
&lt;li&gt;За инструмент платит компания, и нужны полные закрывающие документы (договор, счёт, акт, счёт-фактура, УПД через ЭДО) для налогового учёта.&lt;/li&gt;
&lt;li&gt;Расход на LLM — заметная статья бюджета, и важна цена на токены 1-в-1 с провайдером по курсу ЦБ, без наценки на токены.&lt;/li&gt;
&lt;li&gt;Нужна гибкость моделей в коде: A/B-тесты разных провайдеров, переключение модели одной строкой, единый OpenAI-совместимый контракт.&lt;/li&gt;
&lt;li&gt;Вы техническая команда, которая оценивает сервис по совместимости и прозрачности цены, а не по удобству чата.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Можно и вместе.&lt;/strong&gt; Это не взаимоисключающие вещи. Маркетолог в компании может пользоваться Syntx-ботом для черновиков креативов руками, а продуктовая команда той же компании — крутить Promptra по API внутри приложения для автоматических ответов клиентам. Разные слои, разные задачи, оба легальны и работают из России без VPN. Вопрос не «кто победил», а «какой инструмент под какую потребность».&lt;/p&gt;

&lt;p&gt;Если хотите сравнить именно среди API-агрегаторов для бизнеса — посмотрите разборы &lt;a href="https://promptra.ru/blog/proxyapi-vs-promptra" rel="noopener noreferrer"&gt;ProxyAPI vs Promptra&lt;/a&gt; и обзор &lt;a href="https://promptra.ru/blog/luchshie-agregatory-llm-api-rossiya-2026" rel="noopener noreferrer"&gt;лучших агрегаторов LLM API в России 2026&lt;/a&gt;: там сравнение идёт между сервисами одного класса (API-to-API), а не между ботом и API.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>syntx</category>
      <category>promptra</category>
      <category>api</category>
    </item>
    <item>
      <title>Streaming LLM-ответов через SSE: Python-гайд для real-time чатов и UI</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Tue, 16 Jun 2026 14:45:06 +0000</pubDate>
      <link>https://dev.to/promptra-team/streaming-llm-otvietov-chieriez-sse-python-ghaid-dlia-real-time-chatov-i-ui-5f71</link>
      <guid>https://dev.to/promptra-team/streaming-llm-otvietov-chieriez-sse-python-ghaid-dlia-real-time-chatov-i-ui-5f71</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7pttdlbwkg4eztpeobu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7pttdlbwkg4eztpeobu.png" alt="Инфографика SSE-стрима LLM: блок «Python client» с stream=True, поток chunk-ов идёт через SSE-канал, поверх счётчик TTFT мс и индикатор накопления текста в UI окно чата; плоский векторный стиль" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Когда пользователь нажимает «Отправить» в чате — он хочет видеть ответ &lt;strong&gt;сейчас&lt;/strong&gt;, а не через 10 секунд. Streaming через &lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt; решает это: первый токен приходит за 300–800 мс, дальше текст набирается в UI плавно, как живая печать. Через единый шлюз &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;Promptra&lt;/a&gt; все флагманы — Claude Opus 4.7 (350/1790 ₽), GPT-5.5 (350/2150 ₽), Gemini 3.1 Pro (140/860 ₽), DeepSeek V4 Pro (30/60 ₽) — поддерживают streaming через OpenAI-совместимый формат &lt;code&gt;stream=True&lt;/code&gt;, что радикально упрощает архитектуру.&lt;/p&gt;

&lt;p&gt;Этот гайд — рабочий код стриминга на Python для всех трёх семейств моделей, обработка chunks с TTFT-замером, robust error handling с retry, готовый FastAPI proxy для проброса в браузер, и рекомендации по UI integration. Если вы строите чат-интерфейс, агента с интерактивным ответом или CLI-тул с живым выводом — это базовый паттерн. оплата в рублях по договору, полный пакет закрывающих документов, цены в рублях по курсу ЦБ.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR — streaming за 15 строк
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-promptra-...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Расскажи о SSE в 5 предложениях.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Один параметр &lt;code&gt;stream=True&lt;/code&gt; превращает обычный вызов в SSE-поток. Дальше — итерация по chunks, печать &lt;code&gt;delta.content&lt;/code&gt; без переноса строки и &lt;code&gt;flush=True&lt;/code&gt; чтобы видеть в реальном времени.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что такое SSE и почему именно он
&lt;/h2&gt;

&lt;p&gt;Server-Sent Events — простой протокол стриминга от сервера к клиенту поверх обычного HTTP-соединения. Сервер держит TCP-соединение открытым и периодически шлёт куски данных в формате &lt;code&gt;data: &amp;lt;строка&amp;gt;\n\n&lt;/code&gt;. Клиент читает их по мере прихода. Это &lt;strong&gt;однонаправленный&lt;/strong&gt; канал (только сервер → клиент), что делает SSE проще WebSocket: не нужен upgrade-handshake, работает через любой HTTP proxy и CDN, автоматически переподключается при разрыве. Эта статья — часть pillar-гида: &lt;a href="https://promptra.ru/blog/llm-api-na-python-polnyy-tehnicheskiy-gid-2026/" rel="noopener noreferrer"&gt;полный технический гид по LLM API на Python — токены, function calling, streaming, RAG, batch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Для LLM streaming SSE идеален:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Модель генерирует токены последовательно — нужен только канал сервер→клиент.&lt;/li&gt;
&lt;li&gt;Если клиент закроет соединение — сервер может прервать генерацию (экономия токенов).&lt;/li&gt;
&lt;li&gt;SSE поддерживается всеми браузерами через нативный &lt;code&gt;EventSource&lt;/code&gt; API.&lt;/li&gt;
&lt;li&gt;HTTP/1.1 keep-alive держит соединение без накладных расходов.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Все три флагмана — OpenAI, Anthropic, Google — используют SSE для streaming endpoint'а. Через единый шлюз Promptra формат нормализован: даже Claude и Gemini выдают chunks в OpenAI-совместимом виде с &lt;code&gt;delta.content&lt;/code&gt; — что упрощает фронтенд.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde55xy3ksih64ykuiov0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde55xy3ksih64ykuiov0.png" alt="Схема SSE-канала: слева блок «Python/Browser client», справа «LLM API», между ними длинная горизонтальная линия с поочередными метками chunk1, chunk2, chunk3 ... [DONE] идущими слева направо, справа поверх — счётчик «TTFT 470 ms»; заголовок «Server-Sent Events: однонаправленный поток»" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming на OpenAI SDK (GPT-5.5)
&lt;/h2&gt;

&lt;p&gt;Минимальный паттерн с замером TTFT и подсчётом токенов:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-promptra-...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stream_chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perf_counter&lt;/span&gt;
    &lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;accumulated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;stream_options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;include_usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# последний chunk содержит usage
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perf_counter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;   &lt;span class="c1"&gt;# мс
&lt;/span&gt;            &lt;span class="n"&gt;accumulated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;total_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perf_counter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
    &lt;span class="n"&gt;full_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accumulated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;full_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ttft_ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ttft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tokens_per_sec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;total_ms&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ttft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;stream_options={"include_usage": True}&lt;/code&gt; — критичный параметр. Без него usage в стриме не возвращается, и вы не сможете посчитать стоимость. Подробнее про подсчёт токенов и цены — в материале &lt;a href="https://promptra.ru/blog/kak-schitat-tokeny-llm-tokenizer-stoimost-zaprosa" rel="noopener noreferrer"&gt;«Как считать токены в LLM»&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  То же на Claude Opus 4.7 — смена одной строки
&lt;/h2&gt;

&lt;p&gt;Через шлюз Promptra Claude доступен по OpenAI-совместимому формату:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;stream_chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Объясни асинхронность в Python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;TTFT: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ttft_ms&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; мс, всего: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total_ms&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; мс&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Throughput: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tokens_per_sec&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tok/s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В нативном Anthropic SDK chunks имеют другую структуру (event-based: &lt;code&gt;message_start&lt;/code&gt;, &lt;code&gt;content_block_delta&lt;/code&gt;, &lt;code&gt;message_stop&lt;/code&gt;), но через OpenAI-совместимый слой это нормализуется. Это значит &lt;strong&gt;один и тот же код&lt;/strong&gt; работает на всех моделях — вы меняете строку &lt;code&gt;model&lt;/code&gt; и сравниваете результаты. Подробности нативного формата Anthropic — в их &lt;a href="https://docs.anthropic.com/en/api/messages-streaming" rel="noopener noreferrer"&gt;streaming documentation&lt;/a&gt;, параметры streaming для OpenAI описаны в &lt;a href="https://platform.openai.com/docs/api-reference/streaming" rel="noopener noreferrer"&gt;OpenAI API reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Реальные TTFT и throughput (Promptra benchmark 2026-05)
&lt;/h2&gt;

&lt;p&gt;Замеряли через единый шлюз на одинаковом промте «Объясни принцип работы X в 200 словах»:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;TTFT медиана&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;th&gt;TTFT p99&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;510 мс&lt;/td&gt;
&lt;td&gt;78 tok/s&lt;/td&gt;
&lt;td&gt;980 мс&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;320 мс&lt;/td&gt;
&lt;td&gt;105 tok/s&lt;/td&gt;
&lt;td&gt;620 мс&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;680 мс&lt;/td&gt;
&lt;td&gt;65 tok/s&lt;/td&gt;
&lt;td&gt;1280 мс&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;410 мс&lt;/td&gt;
&lt;td&gt;92 tok/s&lt;/td&gt;
&lt;td&gt;780 мс&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;380 мс&lt;/td&gt;
&lt;td&gt;88 tok/s&lt;/td&gt;
&lt;td&gt;720 мс&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.5 Flash&lt;/td&gt;
&lt;td&gt;240 мс&lt;/td&gt;
&lt;td&gt;140 tok/s&lt;/td&gt;
&lt;td&gt;470 мс&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;
&lt;td&gt;290 мс&lt;/td&gt;
&lt;td&gt;110 tok/s&lt;/td&gt;
&lt;td&gt;540 мс&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Для UX чата хорошим считается TTFT под 700 мс — пользователь видит реакцию почти мгновенно. Throughput важен для длинных ответов: 100 tok/s — это ~75 русских слов в секунду, читается комфортно.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyum6isctphfyucqyueaa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyum6isctphfyucqyueaa.png" alt="Горизонтальная столбчатая диаграмма TTFT по 7 моделям: «Gemini 3.5 Flash — 240 мс» самый короткий терракотовый, «GPT-5.4 — 320 мс», «Gemini 3.1 Pro — 380 мс», «Claude Sonnet 4.6 — 410 мс», «GPT-5.5 — 510 мс», «Claude Opus 4.7 — 680 мс»; заголовок «TTFT медиана: время до первого токена»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming function calls
&lt;/h2&gt;

&lt;p&gt;Когда в стриме включён tool calling, chunks отдают &lt;code&gt;delta.tool_calls&lt;/code&gt; с кусочками JSON arguments. Аккумулируете их по индексу и парсите целиком только в конце:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stream_with_tools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;tool_calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;   &lt;span class="c1"&gt;# index → accumulated
&lt;/span&gt;    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;finish_reason&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;
        &lt;span class="n"&gt;finish_reason&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;finish_reason&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;finish_reason&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;

    &lt;span class="c1"&gt;# парсим целиком только после стрима
&lt;/span&gt;    &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;finish_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_calls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_calls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;finish_reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;finish_reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Не пытайтесь делать &lt;code&gt;json.loads&lt;/code&gt; на каждом chunk — он будет невалидным. Подробности про function calling — в материале &lt;a href="https://promptra.ru/blog/function-calling-tool-use-llm-2026-python-praktika" rel="noopener noreferrer"&gt;«Function calling и tool use на Python»&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Robust error handling и retry
&lt;/h2&gt;

&lt;p&gt;Стрим может оборваться в трёх местах: до первого chunk'а (TTFT timeout), в середине (network drop), на финальном chunk'е (content_filter). Стратегия:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIConnectionError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIStatusError&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stream_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;accumulated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
            &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
                &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# глобальный timeout
&lt;/span&gt;            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;continue&lt;/span&gt;
                &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;accumulated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;   &lt;span class="c1"&gt;# отдаём наружу
&lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt;   &lt;span class="c1"&gt;# успешно дошли до конца
&lt;/span&gt;
        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;APIConnectionError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;partial&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accumulated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;partial&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# последняя попытка — возвращаем что есть
&lt;/span&gt;                &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[Прервано после &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;partial&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; символов: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt;
            &lt;span class="c1"&gt;# exponential backoff
&lt;/span&gt;            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;APIStatusError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# 4xx ошибка — retry не поможет
&lt;/span&gt;            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[Ошибка API: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Что важно:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Сохраняйте partial output&lt;/strong&gt; — токены, которые модель уже отдала, оплачены. Их разумно показать пользователю с пометкой «прервано».&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exponential backoff&lt;/strong&gt; — 1с, 2с, 4с между попытками. Без него вы заDDoSите шлюз при массовом сбое сети.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Не retry'те 4xx&lt;/strong&gt; — это ваши ошибки (невалидный запрос, лимит, нет ключа), повторение не поможет.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Глобальный timeout 300 секунд&lt;/strong&gt; — длинные reasoning-ответы (Opus 4.7) могут идти долго, но не бесконечно.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9p50pvj68gshwtn2uw8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9p50pvj68gshwtn2uw8.png" alt="Дерево обработки ошибок: блок «Ошибка в стриме» — три ветки: «TTFT timeout → retry с backoff», «network drop → сохранить partial → retry», «4xx error → не retry, вернуть ошибку»; терракотовые подписи на критичных путях, заголовок «Robust streaming: что делать при сбое»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FastAPI proxy для браузера
&lt;/h2&gt;

&lt;p&gt;Стандартный паттерн: фронтенд не знает ключа LLM, ходит к вашему FastAPI endpoint, тот стримит наружу:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.responses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StreamingResponse&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AsyncOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;async_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AsyncOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-promptra-...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;async_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;stream_options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;include_usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: [DONE]&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/chat/stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;StreamingResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;event_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;media_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cache-Control&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no-cache&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connection&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keep-alive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Accel-Buffering&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# отключить буфер nginx
&lt;/span&gt;        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;X-Accel-Buffering: no&lt;/code&gt; — критичный заголовок для nginx, без него стрим буферизуется. На фронтенде стандартный &lt;code&gt;EventSource&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evtSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/chat/stream&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;withCredentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;evtSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[DONE]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;evtSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Подробнее про архитектуру чат-бота — в материале &lt;a href="https://promptra.ru/blog/chat-bot-na-neyroseti-api" rel="noopener noreferrer"&gt;«Чат-бот на нейросети API»&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63mgmtytsh2c05wct4so.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63mgmtytsh2c05wct4so.png" alt="Архитектурная схема: «Browser (EventSource)» → POST «FastAPI /chat/stream» → стрим к «Promptra api gateway» → «LLM модель», обратный поток chunks через FastAPI к браузеру с надписью «text/event-stream»; заголовок «Proxy архитектура: ключ не в браузере»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  UI integration: что не забыть
&lt;/h2&gt;

&lt;p&gt;Когда стрим работает, надо корректно показать его пользователю. Чек-лист:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Курсор «печатающего»&lt;/strong&gt; — мигающая «|» в конце аккумулированного текста. Уберите после &lt;code&gt;[DONE]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-scroll&lt;/strong&gt; к низу при каждом новом chunk'е, но &lt;strong&gt;отменяйте&lt;/strong&gt; если пользователь сам прокрутил вверх (читает прошлый ответ).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Кнопка «Stop»&lt;/strong&gt; — посылает abort на ваш FastAPI, тот закрывает стрим с LLM. Сэкономит токены пользователя.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Кнопка «Regenerate»&lt;/strong&gt; — повтор запроса с тем же контекстом. Полезно при content_filter или пустом ответе.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indicator расхода&lt;/strong&gt; — после &lt;code&gt;[DONE]&lt;/code&gt; показать «Потрачено: 1240 токенов = 1.85 ₽». Прозрачность повышает доверие.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown rendering&lt;/strong&gt; — стримите plain text в буфер, а &lt;strong&gt;рендерите&lt;/strong&gt; Markdown только по окончании chunk'а или по фразам. Иначе таблицы и code-блоки будут «прыгать».&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code blocks с syntax highlighting&lt;/strong&gt; — рендерите финально, не пытайтесь highlight'ить inline.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Для production-чатов добавьте rate limit на endpoint (запросов на пользователя в минуту), pre-flight бюджет-чек (&lt;a href="https://promptra.ru/blog/kak-schitat-tokeny-llm-tokenizer-stoimost-zaprosa" rel="noopener noreferrer"&gt;«Как считать токены в LLM»&lt;/a&gt;), и логирование всех завершённых стримов с TTFT, throughput, finish_reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Оплата и закрывающие документы
&lt;/h2&gt;

&lt;p&gt;Юрлицо-исполнитель — &lt;strong&gt;российское юр.лицо&lt;/strong&gt; , резидент РФ. Сервисная комиссия 5% берётся только при пополнении баланса, на токены наценки нет. Полный пакет закрывающих документов (договор-оферта, счёт на оплату, акт оказанных услуг, счёт-фактура, УПД) приходит через ЭДО — Диадок, СБИС, Контур. Подробнее — на странице &lt;a href="https://promptra.ru/pricing" rel="noopener noreferrer"&gt;«Тарифы»&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что дальше
&lt;/h2&gt;

&lt;p&gt;Streaming через SSE — это один параметр &lt;code&gt;stream=True&lt;/code&gt; и цикл &lt;code&gt;for chunk in stream&lt;/code&gt;. Дальше — TTFT-замер, обработка ошибок с partial output, FastAPI-proxy для скрытия ключа, и аккуратный UI с auto-scroll и кнопкой Stop. С этим набором ваш чат становится &lt;strong&gt;отзывчивым&lt;/strong&gt; на уровне ChatGPT.app или Claude.ai, а под капотом — один шлюз ко всем флагманам. Полезные следующие шаги: &lt;a href="https://promptra.ru/blog/function-calling-tool-use-llm-2026-python-praktika" rel="noopener noreferrer"&gt;«Function calling на Python»&lt;/a&gt; для streaming tool calls, &lt;a href="https://promptra.ru/blog/embeddings-i-vektornyy-poisk-rag-stek-2026" rel="noopener noreferrer"&gt;«Embeddings и RAG»&lt;/a&gt; для контекстуальных чатов, и &lt;a href="https://promptra.ru/blog/async-i-batch-api-llm-50-procentov-skidka-perfomance" rel="noopener noreferrer"&gt;«Async-вызовы и Batch API»&lt;/a&gt; для batch-сценариев без UI. Если нужно подобрать модель под ваш чат или подключить ключ через юрлицо — &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;напишите команде Promptra в Telegram&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;Главный гайд по теме:&lt;/strong&gt; &lt;a href="https://promptra.ru/blog/luchshaya-neyroset-2026/" rel="noopener noreferrer"&gt;Лучшая нейросеть 2026: какую LLM выбрать под задачу&lt;/a&gt; — связанные материалы и обзор всей категории.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>streaming</category>
      <category>sse</category>
      <category>openai</category>
      <category>claude</category>
    </item>
    <item>
      <title>Rate limiting и retry стратегии для LLM API: exponential backoff, circuit breaker, queue</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Tue, 16 Jun 2026 10:55:00 +0000</pubDate>
      <link>https://dev.to/promptra-team/rate-limiting-i-retry-stratieghii-dlia-llm-api-exponential-backoff-circuit-breaker-queue-26fk</link>
      <guid>https://dev.to/promptra-team/rate-limiting-i-retry-stratieghii-dlia-llm-api-exponential-backoff-circuit-breaker-queue-26fk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe21lx94rodcmgf2gscv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe21lx94rodcmgf2gscv9.png" alt="Инфографика retry-стратегии LLM API: HTTP 429 ответ, экспоненциальный backoff с jitter 1с-2с-4с-8с, circuit breaker открыт/полуоткрыт/закрыт, token bucket с пополнением; плоский векторный стиль" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Под нагрузкой LLM API падает. Не «всегда», а в худший момент — когда пользователей больше, чем обычно. Без правильной стратегии 429 («слишком много запросов») и 503 («провайдер перегружен») превращают временный пик в полный отказ сервиса: клиенты ретраят, нагрузка растёт лавиной, очередь разбухает, всё падает. Через единый шлюз &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;Promptra&lt;/a&gt; (Claude Opus 4.7 — 350/1790 ₽, GPT-5.5 — 350/2150 ₽, DeepSeek V4 Pro — 30/60 ₽) ошибки нормализованы под OpenAI-формат — одна и та же стратегия работает для всех моделей, что упрощает переключение между провайдерами при их деградации.&lt;/p&gt;

&lt;p&gt;Этот гайд — production-стек защиты: &lt;strong&gt;Tenacity для exponential backoff с jitter&lt;/strong&gt;, &lt;strong&gt;circuit breaker&lt;/strong&gt; для быстрого обхода падшего провайдера, &lt;strong&gt;token bucket&lt;/strong&gt; для собственного rate limiting, конкретные коды и таймауты для всех ключевых ошибок. С работающими примерами кода, конфигами retry policy и метриками для мониторинга. оплата в рублях по договору, полный пакет закрывающих документов.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR — три слоя защиты
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Token bucket&lt;/strong&gt; на своей стороне — не отправляем больше N RPS, не дожидаясь 429 от провайдера.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exponential backoff с jitter&lt;/strong&gt; через Tenacity — на редкие 429/503 ждём 1с±50%, 2с±50%, 4с±50%, 8с±50%, до 3 попыток.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker&lt;/strong&gt; — если 5 фейлов подряд за 30 сек, открываем «выключатель» на 60 сек и идём в fallback (другой провайдер или кэш). Эта статья — production-расширение нашего pillar-гида &lt;a href="https://promptra.ru/blog/llm-api-na-python-polnyy-tehnicheskiy-gid-2026/" rel="noopener noreferrer"&gt;полный технический гид по LLM API на Python: токены, function calling, streaming, RAG, async/batch&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  429 и 503: что говорят провайдеры
&lt;/h2&gt;

&lt;p&gt;Реальные сообщения от OpenAI, Anthropic и Google:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OpenAI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rate limit reached for gpt-5-5 in organization org-X on requests per min (RPM): Limit 500, Used 500, Requested 1."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate_limit_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate_limit_exceeded"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Anthropic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(упрощённо)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate_limit_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Number of request tokens has exceeded your per-minute rate limit"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;от&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;любого&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;провайдера&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The engine is currently overloaded, please try again later."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server_error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine_overloaded"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;К обоим прикладывается заголовок &lt;code&gt;retry-after&lt;/code&gt; в секундах (но не всегда — OpenAI ставит, Anthropic иногда нет). Стратегия: &lt;strong&gt;сначала смотрим retry-after, потом считаем свой backoff&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Документация лимитов: &lt;a href="https://platform.openai.com/docs/guides/rate-limits" rel="noopener noreferrer"&gt;OpenAI rate limits&lt;/a&gt;, &lt;a href="https://docs.anthropic.com/en/api/rate-limits" rel="noopener noreferrer"&gt;Anthropic rate limits&lt;/a&gt;. У Promptra лимиты выставляются на уровне шлюза и едины для всех моделей за одним ключом — это упрощает планирование емкости.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbe636x79gxdujkort7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbe636x79gxdujkort7y.png" alt="Схема трёх типов ошибок LLM API: 429 rate limit с заголовком retry-after, 503 engine overloaded, network timeout/ReadError; каждый блок с цветом важности и стрелкой к правильному ответу retry / wait / circuit; заголовок «Какие ошибки требуют retry»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tenacity: exponential backoff с jitter за 10 строк
&lt;/h2&gt;

&lt;p&gt;Установка: &lt;code&gt;pip install tenacity&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Минимальный декоратор для LLM-вызова:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tenacity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;stop_after_attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;wait_random_exponential&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retry_if_exception_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APIError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APITimeoutError&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-promptra-...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# отключаем встроенный retry SDK — делаем сами через tenacity
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;retry_if_exception_type&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APITimeoutError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;wait_random_exponential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;multiplier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;stop_after_attempt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;reraise&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;llm_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Разберём параметры:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;wait_random_exponential(multiplier=1, max=60)&lt;/strong&gt; — exponential backoff с jitter. Реальные задержки: 0.5–1с, 1–2с, 2–4с, 4–8с, 8–16с (но не больше 60).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stop_after_attempt(5)&lt;/strong&gt; — 5 попыток включая первую (то есть 4 retry).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;retry_if_exception_type&lt;/strong&gt; — ретраим только на эти исключения. На 400/401/403 не ретраим (там APIStatusError, не входит в список).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reraise=True&lt;/strong&gt; — после 5 фейлов поднимаем последнее исключение, а не оборачиваем в RetryError.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Альтернатива — exponential без полного jitter (более предсказуемая):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tenacity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wait_exponential_jitter&lt;/span&gt;

&lt;span class="nd"&gt;@retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;wait_exponential_jitter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jitter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;stop_after_attempt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;llm_call_v2&lt;/span&gt;&lt;span class="p"&gt;(...):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Здесь начальная задержка 1с, удваивается до 60, jitter ±2с. Подходит когда вы хотите более предсказуемый минимум.&lt;/p&gt;

&lt;h2&gt;
  
  
  Уважение к retry-after
&lt;/h2&gt;

&lt;p&gt;Если провайдер вернул &lt;code&gt;retry-after&lt;/code&gt;, надо ждать ровно столько, а не своё. Tenacity поддерживает callback на пере-расчёт wait:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tenacity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;retry_if_exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retry_base&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tenacity.wait&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wait_base&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;wait_retry_after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait_base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Если RateLimitError содержит retry-after — используем его, иначе fallback.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wait_base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fallback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fallback&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retry_state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;exc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retry_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;retry_after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;retry-after&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;retry_after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retry_after&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;  &lt;span class="c1"&gt;# +100мс на сетевую задержку
&lt;/span&gt;                &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;pass&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retry_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;retry_if_exception_type&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APITimeoutError&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;wait_retry_after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;wait_random_exponential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;multiplier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;stop_after_attempt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;llm_call_smart&lt;/span&gt;&lt;span class="p"&gt;(...):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Этот паттерн критичен для production: если провайдер сказал «подожди 30 секунд», а вы ретраите через 1с — получите ещё один 429 и быстро попадёте в более строгий лимит.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqu6cfbusa49jhua625k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqu6cfbusa49jhua625k.png" alt="Диаграмма exponential backoff с jitter: горизонтальная ось времени, 5 точек попыток на 0с, 1с, 2с, 4с, 8с, для каждой попытки серый горизонтальный диапазон jitter ±50%; терракотовая выноска «retry-after: 30s» поверх 3-й попытки переопределяет backoff; заголовок «Backoff с уважением к retry-after»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Token bucket: собственный rate limiting
&lt;/h2&gt;

&lt;p&gt;Tenacity лечит редкие 429, но если вы делаете 100 RPS на лимите 50 RPS — будете получать 429 на каждом втором запросе. Правильно — не доводить до 429, ограничивать себя.&lt;/p&gt;

&lt;p&gt;Token bucket алгоритм: ведро на N запросов, пополняется со скоростью R/сек, каждый запрос забирает 1 токен. Простая реализация на asyncio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TokenBucket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        rate: запросов в секунду (пополнение).
        capacity: максимальный burst.
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_refill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monotonic&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lock&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monotonic&lt;/span&gt;
            &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_refill&lt;/span&gt;
            &lt;span class="c1"&gt;# Пополняем ведро
&lt;/span&gt;            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_refill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;
            &lt;span class="c1"&gt;# Если токенов мало — ждём
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;deficit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;
                &lt;span class="n"&gt;wait_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deficit&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TokenBucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 30 RPS, burst до 50
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;safe_llm_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acquire&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Для распределённого приложения (несколько worker'ов) — Redis-based bucket через атомарный Lua-скрипт:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis://localhost:6379/2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Атомарный Lua-скрипт: вычитает 1 токен, пополняет по времени, возвращает успех
&lt;/span&gt;&lt;span class="n"&gt;LUA_TOKEN_BUCKET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
local key = KEYS[1]
local rate = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])

local bucket = redis.call(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HMGET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, key, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tokens&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;last_refill&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)
local tokens = tonumber(bucket[1]) or capacity
local last_refill = tonumber(bucket[2]) or now

local elapsed = now - last_refill
tokens = math.min(capacity, tokens + elapsed * rate)

if tokens &amp;gt;= requested then
    tokens = tokens - requested
    redis.call(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HMSET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, key, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tokens&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, tokens, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;last_refill&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, now)
    redis.call(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;EXPIRE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, key, 60)
    return {1, tokens}
else
    redis.call(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HMSET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, key, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tokens&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, tokens, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;last_refill&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, now)
    redis.call(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;EXPIRE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, key, 60)
    return {0, tokens}
end
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Регистрируем скрипт один раз — Redis считает SHA и потом вызывает по EVALSHA
&lt;/span&gt;&lt;span class="n"&gt;token_bucket_script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_script&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LUA_TOKEN_BUCKET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;try_acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;token_bucket_script&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;try_acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm:opus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lua-скрипт атомарен в Redis — никакого race condition между несколькими worker'ами. Для русского B2B на 10–50 RPS этого хватит с запасом. Подробнее про асинхронные batch-сценарии — &lt;a href="https://promptra.ru/blog/async-i-batch-api-llm-50-procentov-skidka-perfomance" rel="noopener noreferrer"&gt;Async и Batch API LLM: 50% скидка&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Circuit breaker: защита от каскадных фейлов
&lt;/h2&gt;

&lt;p&gt;Сценарий: GPT-5.5 «лёг» на 5 минут. Без circuit breaker каждый запрос ждёт 30 секунд таймаута, ретраит 5 раз, итого 5 × 8 = 40 секунд на один запрос. 50 RPS × 40 сек = &lt;strong&gt;2000 зависших задач&lt;/strong&gt;. Очередь забивается, latency растёт, всё ложится.&lt;/p&gt;

&lt;p&gt;Circuit breaker меняет это: после 5 фейлов подряд он «открывается» и следующие 60 секунд &lt;strong&gt;сразу&lt;/strong&gt; отдаёт ошибку (или вызывает fallback), не пытаясь дозвониться. Состояния:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;closed&lt;/strong&gt; — нормальная работа, запросы идут.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;open&lt;/strong&gt; — фейлов слишком много, все запросы сразу падают/в fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;half_open&lt;/strong&gt; — пробный режим: один запрос идёт, успех → closed, фейл → опять open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Реализация на pure Python (без зависимостей):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Lock&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;CLOSED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;closed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;OPEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;HALF_OPEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;half_open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fail_threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recovery_timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail_threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fail_threshold&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recovery_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recovery_timeout&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_failure_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CLOSED&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Lock&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OPEN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monotonic&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_failure_time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recovery_timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HALF_OPEN&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;CircuitOpenError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Circuit open, retry after &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recovery_timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail_count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_failure_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monotonic&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail_count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail_threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OPEN&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt;

        &lt;span class="c1"&gt;# Успех
&lt;/span&gt;        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HALF_OPEN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CLOSED&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircuitOpenError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# Usage с fallback
&lt;/span&gt;&lt;span class="n"&gt;opus_breaker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fail_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recovery_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sonnet_breaker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fail_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recovery_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;llm_with_fallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;opus_breaker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CircuitOpenError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Fallback на Sonnet 4.6 (210/1070 ₽)
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sonnet_breaker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Для production — библиотеки &lt;code&gt;pybreaker&lt;/code&gt; или &lt;code&gt;circuitbreaker&lt;/code&gt; с готовыми декораторами и метриками. Через Promptra fallback между моделями делается одной заменой &lt;code&gt;model="..."&lt;/code&gt; — это снижает риск зависимости от одного провайдера. См. &lt;a href="https://promptra.ru/blog/sravnenie-cen-llm-2026-tochnye-tarify-v-rublyah" rel="noopener noreferrer"&gt;Сравнение цен LLM 2026&lt;/a&gt; для выбора недорогих fallback-моделей.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0e8f6dtwkeiia711h5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0e8f6dtwkeiia711h5o.png" alt="Диаграмма состояний circuit breaker: три круглых блока closed-open-half_open соединённые стрелками с подписями условий: closed→open «5 фейлов за 30с», open→half_open «через 60с recovery», half_open→closed «успешный пробный запрос», half_open→open «фейл пробного»; заголовок «Состояния circuit breaker»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Полный стек: token bucket + Tenacity + circuit breaker
&lt;/h2&gt;

&lt;p&gt;Соединяем всё вместе — production-grade LLM-клиент:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tenacity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stop_after_attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wait_random_exponential&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retry_if_exception_type&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APITimeoutError&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductionLLMClient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;120.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TokenBucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;breaker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fail_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recovery_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;retry_if_exception_type&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APITimeoutError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;wait_retry_after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;wait_random_exponential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;multiplier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;stop_after_attempt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;reraise&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_raw_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallback_model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acquire&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;breaker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_raw_call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CircuitOpenError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fallback_model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_raw_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fallback_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ProductionLLMClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-promptra-...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# 350/1790 ₽
&lt;/span&gt;    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;fallback_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# 210/1070 ₽
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Что здесь работает:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Token bucket&lt;/strong&gt; не даёт превысить 30 RPS — большая часть 429 не случается.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tenacity&lt;/strong&gt; ретраит редкие 429/timeout с jitter, уважает retry-after.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker&lt;/strong&gt; ловит длительные деградации и быстро уходит в fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback&lt;/strong&gt; на Sonnet (в 1.7 раз дешевле) — деградация качества вместо полного отказа.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Это базовая структура. Для batch-задач добавьте &lt;a href="https://promptra.ru/blog/async-i-batch-api-llm-50-procentov-skidka-perfomance" rel="noopener noreferrer"&gt;Async и Batch API LLM&lt;/a&gt; с 50% скидкой. Для агентов с tool calling — &lt;a href="https://promptra.ru/blog/function-calling-tool-use-llm-2026-python-praktika" rel="noopener noreferrer"&gt;Function calling tool use&lt;/a&gt;. Для отслеживания latency и cost — &lt;a href="https://promptra.ru/blog/logirovanie-i-observability-llm-prilozheniy-langfuse-helicone" rel="noopener noreferrer"&gt;Логирование и observability LLM&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Метрики для мониторинга
&lt;/h2&gt;

&lt;p&gt;Что собирать в Prometheus:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Метрика&lt;/th&gt;
&lt;th&gt;Тип&lt;/th&gt;
&lt;th&gt;Алерт&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_requests_total{model,status}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;error_rate &amp;gt; 5% за 5 мин&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_request_duration_seconds{model}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Histogram&lt;/td&gt;
&lt;td&gt;p99 &amp;gt; 60 сек&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_retries_total{model,attempt}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;retry_rate &amp;gt; 20% — провайдер деградирует&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_token_bucket_wait_seconds{model}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Histogram&lt;/td&gt;
&lt;td&gt;p95 &amp;gt; 2 сек — нужно увеличить лимит&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_circuit_breaker_state{model}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gauge&lt;/td&gt;
&lt;td&gt;state=open &amp;gt; 30 сек — алерт оператору&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_fallback_total{from_model,to_model}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;резкий рост — фейл primary провайдера&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm_429_total{model}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counter&lt;/td&gt;
&lt;td&gt;рост — token bucket не справляется&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Точные пороги зависят от вашей нагрузки. Снимайте baseline в первую неделю, потом настраивайте алерты на отклонения. См. также &lt;a href="https://promptra.ru/blog/b2b-checklist-12-voprosov-postavshchiku-llm-api" rel="noopener noreferrer"&gt;B2B-чеклист 12 вопросов поставщику LLM API&lt;/a&gt; — раздел про SLA и согласованные RPM/TPM лимиты.&lt;/p&gt;

&lt;h2&gt;
  
  
  Антипаттерны: чего не делать
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retry на 4xx ошибках&lt;/strong&gt; (кроме 429). 400/401/403/422 не ретраятся — это баги в коде. Каждая попытка тратит лимит и деньги.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Бесконечный retry без stop_after_attempt&lt;/strong&gt;. Пользователь будет ждать вечность, очередь забьётся.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry без jitter&lt;/strong&gt;. 100 клиентов после 429 ретраят в одну миллисекунду — снова 429. Thundering herd.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Игнорировать retry-after&lt;/strong&gt;. Если провайдер сказал 30с — он знает что говорит. Ретрай через 1с попадёт в более жёсткий лимит.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker без fallback&lt;/strong&gt;. Если просто бросать CircuitOpenError, клиент получит фейл. Имеет смысл только когда есть план B (другая модель, кэш, деградированный режим).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token bucket с capacity=rate&lt;/strong&gt;. Bucket нужен для burst — если capacity = rate, вы не получаете преимущества над fixed-window лимитом.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Один circuit breaker на все модели&lt;/strong&gt;. Если Opus упал, Sonnet ещё работает. Нужен per-model breaker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry на тимауте без сохранения partial state&lt;/strong&gt;. Streaming-ответ уже частично оплачен — сохраняйте и используйте, не теряйте.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4nj9vjcqgdx5aouqits.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4nj9vjcqgdx5aouqits.png" alt="Чек-лист антипаттернов: 8 красных карточек с типичными ошибками — «retry на 4xx», «без jitter», «без stop», «игнор retry-after», «без fallback», «общий breaker», «бесконечные попытки», «потеря partial state»; зелёная строка снизу «правильно: layered defence»; заголовок «8 ошибок retry-стратегии»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Production-чеклист
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Token bucket&lt;/strong&gt; на своей стороне, rate = 80% от лимита провайдера.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Tenacity&lt;/strong&gt; с &lt;code&gt;wait_random_exponential(max=60)&lt;/code&gt; и &lt;code&gt;stop_after_attempt(5)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Кастомный wait&lt;/strong&gt; для уважения retry-after хедера.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;retry_if_exception_type&lt;/strong&gt; только на 429/5xx/network. Никаких 4xx.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Circuit breaker&lt;/strong&gt; per-model с recovery_timeout=60 сек.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Fallback&lt;/strong&gt; на дешёвую модель (Sonnet вместо Opus, GPT-5.4 вместо GPT-5.5).&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;timeout на HTTP-клиент&lt;/strong&gt;: connect 5, read 120, write 10, pool 5.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;max_retries=0 в SDK&lt;/strong&gt; — все ретраи через Tenacity, не дублировать.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Метрики Prometheus&lt;/strong&gt;: requests_total, duration, retries, 429, bucket_wait, breaker_state.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Алерты&lt;/strong&gt;: error_rate &amp;gt; 5%, retry_rate &amp;gt; 20%, breaker_state=open &amp;gt; 30 сек.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Логи retry&lt;/strong&gt; с trace_id для отслеживания флапов.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Распределённый bucket&lt;/strong&gt; через Redis Lua для multi-worker setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Через Promptra fallback между моделями делается одной заменой &lt;code&gt;model="..."&lt;/code&gt;. Цены прозрачны 1-в-1 с провайдером по курсу ЦБ — для дешёвых fallback подходят DeepSeek V4 Pro (30/60 ₽) и Qwen 3.6 Plus (20/130 ₽). Полное руководство по выбору модели для конкретной задачи — в &lt;a href="https://promptra.ru/blog/sravnenie-cen-llm-2026-tochnye-tarify-v-rublyah" rel="noopener noreferrer"&gt;Сравнении цен LLM 2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzhhfujgsj3q5w3sg97z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzhhfujgsj3q5w3sg97z.png" alt="Финальная инфографика production-стека: 3 концентрических круга — внешний «Token bucket (предотвращение 429)», средний «Tenacity retry (лечение редких 429)», внутренний «Circuit breaker (защита от деградации)»; в центре «LLM API»; стрелки fallback ведут к второй модели; заголовок «3 слоя защиты LLM-вызовов»" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ratelimit</category>
      <category>retry</category>
      <category>tenacity</category>
      <category>circuitbreaker</category>
    </item>
    <item>
      <title>Qwen в России: как пользоваться и подключить по API</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Tue, 16 Jun 2026 09:05:00 +0000</pubDate>
      <link>https://dev.to/promptra-team/qwen-v-rossii-kak-polzovatsia-i-podkliuchit-po-api-59l0</link>
      <guid>https://dev.to/promptra-team/qwen-v-rossii-kak-polzovatsia-i-podkliuchit-po-api-59l0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bgk280kdg8czylq2ru8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bgk280kdg8czylq2ru8.png" alt="Два пути доступа к Qwen из России: прямой доступ к Alibaba DashScope с барьерами оплаты и стабильный маршрут через OpenAI-совместимый API с оплатой в рублях" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Коротко: пользоваться Qwen из России в 2026 году можно, и платить за это можно в рублях на юридическое лицо.&lt;/strong&gt; Qwen — это семейство языковых моделей Alibaba (китайское имя — Tongyi Qianwen), и его старшая модель текущего поколения, Qwen 3.6 Plus, доступна из РФ через API-агрегатор с OpenAI-совместимым endpoint. В коде меняется один параметр — &lt;code&gt;base_url&lt;/code&gt; на &lt;code&gt;https://api.promptra.ru/v1&lt;/code&gt; — а оплата идёт рублёвой платёжкой, а не зарубежной картой. Это не обход блокировок и не VPN: запрос уходит на российский endpoint, агрегатор проксирует его в Qwen от своего имени, а вы получаете результат, рублёвый счёт и закрывающие документы. Цена — 1-в-1 с прайсом Alibaba DashScope по курсу ЦБ: 20 ₽ за 1M входных токенов и 130 ₽ за 1M выходных.&lt;/p&gt;

&lt;p&gt;Чем Qwen интересен российскому разработчику в двух словах: это многоязычная open-weight модель (сильная в азиатских языках и коде), с окном контекста на 1 миллион токенов, и при этом одна из самых дешёвых на рынке по входным токенам. Этот материал разбирает обе стороны вопроса: что такое Qwen и какие модели в линейке, в чём его сильные стороны, почему прямой доступ из РФ затруднён, и как именно подключить Qwen по API за пять минут — с рабочим кодом, ценой в рублях из каталога и FAQ. Все цены — на 2026-05-29.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что такое Qwen и какие модели в линейке
&lt;/h2&gt;

&lt;p&gt;Qwen — это семейство больших языковых моделей, которое разрабатывает Alibaba Cloud. В китайском оригинале линейка называется Tongyi Qianwen, в международной версии — просто Qwen. Существует она с 2023 года и за это время выросла в одну из самых заметных open-weight экосистем мира: десятки моделей разного размера — от компактных, помещающихся на ноутбук, до флагманских, — плюс специализированные версии под код, математику и работу с изображениями.&lt;/p&gt;

&lt;p&gt;Для пользователя из России важно различать две вещи под одним именем Qwen, ровно как и у других провайдеров. Есть &lt;strong&gt;потребительский чат&lt;/strong&gt; (веб-приложение и мобильное приложение Qwen, бывший чат Tongyi) — это продукт для конечного пользователя. И есть &lt;strong&gt;API-модели&lt;/strong&gt;, которые разработчик встраивает в свой код или сервис. Доступность у них разная, и в этом материале нас интересует именно API — то, на что можно опереться в работе.&lt;/p&gt;

&lt;p&gt;Старшая модель текущего поколения в нашем каталоге — &lt;strong&gt;Qwen 3.6 Plus&lt;/strong&gt;. Это «плюс»-модель, рассчитанная на широкий спектр задач при низкой цене. Помимо неё, линейка Qwen включает целый спектр вариантов: компактные модели для локального запуска, отдельные ветки под код (Qwen Coder), под рассуждения и под мультимодальность (Qwen-VL для изображений). На рынке Qwen известен прежде всего двумя вещами — открытыми весами и сильной многоязычностью, особенно за пределами английского.&lt;/p&gt;

&lt;p&gt;Ключевые характеристики Qwen 3.6 Plus из нашего каталога:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Параметр&lt;/th&gt;
&lt;th&gt;Значение&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Идентификатор модели&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen/qwen3.6-plus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Провайдер&lt;/td&gt;
&lt;td&gt;Alibaba Qwen (Tongyi Qianwen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Тип весов&lt;/td&gt;
&lt;td&gt;open-weight (открытая лицензия)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Контекстное окно&lt;/td&gt;
&lt;td&gt;1 000 000 токенов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Максимум на выход&lt;/td&gt;
&lt;td&gt;65 536 токенов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Модальности входа&lt;/td&gt;
&lt;td&gt;текст&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Модальности выхода&lt;/td&gt;
&lt;td&gt;текст&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;chat&lt;/code&gt; (OpenAI-совместимый)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Миллион токенов контекста — это ориентировочно 700–750 тысяч слов или порядка 50 000 строк кода. В одно окно влезает кодовая база среднего сервиса, объёмный архив документов или длинная история диалога целиком. Если вам нужен глубокий разбор именно Qwen 3.6 Plus — бенчмарки цены, тарификация по длине контекста, детальное сравнение с DeepSeek и GLM — он в отдельном материале про &lt;a href="https://promptra.ru/blog/qwen-3-6-plus-api-rubli" rel="noopener noreferrer"&gt;Qwen 3.6 Plus API за рубли&lt;/a&gt;. Здесь же фокус на главном вопросе: как получить доступ к Qwen из России.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02wvtrb8ae01lop32bgm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02wvtrb8ae01lop32bgm.png" alt="Линейка Qwen с подписями на русском: семейство моделей Alibaba — Qwen 3.6 Plus, Coder, VL, компактные версии — и карточка Qwen 3.6 Plus с числами: контекст 1 000 000 токенов, выход 65 536, вход 20 рублей за 1М, выход 130 рублей за 1М" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Сильные стороны Qwen: многоязычность, цена и код
&lt;/h2&gt;

&lt;p&gt;Почему вообще стоит присматриваться к Qwen среди десятков моделей? У линейки есть три черты, которые делают её отдельным инструментом, а не «ещё одной большой LLM».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Многоязычность — главная сила.&lt;/strong&gt; Qwen традиционно силён за пределами английского. Китайский, японский, корейский и другие азиатские языки модель обрабатывает заметно лучше, чем большинство западных моделей сопоставимой цены — это прямое следствие того, что её обучала китайская компания на корпусе с большой долей азиатских языков. Русский Qwen тоже поддерживает: для повседневных задач (резюмирование, классификация, извлечение данных, генерация описаний) качества достаточно. Если ваш продукт работает с мультиязычным контентом или ориентирован на азиатские рынки, Qwen — естественный кандидат.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Низкая цена, особенно на входе.&lt;/strong&gt; Qwen 3.6 Plus стоит 20 ₽ за 1M входных токенов — это одна из самых низких ставок входа во всём каталоге, в 17 с лишним раз дешевле флагманов вроде GPT-5.5. Причина в открытых весах: модель отдаёт не только сама Alibaba через DashScope, но и десятки независимых инференс-провайдеров, и конкуренция между ними держит цену низкой. По той же причине дёшев и DeepSeek. Для нагрузок, где много входного контекста и короткий ответ — классификация, извлечение полей, RAG-ответы по большой базе — это почти идеальный профиль: вы платите символически за то, что модель «прочитала» большой контекст.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Код и инструментальные задачи.&lt;/strong&gt; Внутри семейства есть отдельная сильная ветка под программирование (Qwen Coder), и сам Qwen 3.6 Plus неплохо справляется с генерацией и разбором кода. Alibaba позиционирует поколение 3.6 как шаг в сторону «агентных» сценариев — работы с инструментами и многошаговых задач; подробности компания описывает в &lt;a href="https://www.alibabacloud.com/blog" rel="noopener noreferrer"&gt;блоге Alibaba Cloud о Qwen3.6-Plus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Где Qwen не первый выбор — это задачи на предельно сложный reasoning и длинные агентные циклы, где цена ошибки выше цены токенов: в эту нишу чаще берут западные флагманы (Claude, GPT-5.5). Но для массовых задач средней сложности, многоязычной обработки и всего, где важен объём при разумной цене, Qwen — рациональный выбор.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit1yh8x4ft4juxb8n153.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit1yh8x4ft4juxb8n153.png" alt="Карточка сильных сторон Qwen с подписями на русском: три блока — многоязычность (китайский, японский, корейский, русский), низкая цена входа 20 рублей за 1М токенов, код и агентные задачи; терракотовые акценты на бежевом фоне" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Почему прямой доступ к Qwen из России затруднён
&lt;/h2&gt;

&lt;p&gt;«Qwen в России» — это, как и у других зарубежных провайдеров, два разных вопроса с разными ответами. Доступ к потребительскому приложению и доступ к API устроены по-разному и упираются в разные ограничения.&lt;/p&gt;

&lt;h3&gt;
  
  
  Приложение и личный кабинет DashScope
&lt;/h3&gt;

&lt;p&gt;Потребительский чат Qwen и консоль Alibaba Cloud Model Studio (платформа DashScope, через которую Alibaba отдаёт модели) рассчитаны на свои регионы и платёжные системы. Из России регистрация спотыкается о привычные барьеры: верификация аккаунта Alibaba Cloud требует данных и платёжных реквизитов, которые российскому пользователю трудно предоставить, а часть функций завязана на китайскую или международную платёжную инфраструктуру. Сам сайт при этом обычно открывается — проблема не в доступности страницы, а в том, что пройти регистрацию и довести дело до оплаты не получается.&lt;/p&gt;

&lt;h3&gt;
  
  
  Оплата — главный барьер
&lt;/h3&gt;

&lt;p&gt;Ключевая стена — деньги. У Alibaba Cloud собственная платёжная платформа, рассчитанная на международные карты и китайские платёжные системы. Когда российский пользователь доходит до пополнения баланса DashScope, он упирается в типичные барьеры:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Карта не проходит.&lt;/strong&gt; Карты МИР зарубежными эквайрингами не принимаются в принципе, а российские Visa/Mastercard после 2022 года не работают за пределами РФ. Пополнить долларовый или юаневый баланс DashScope такой картой не выйдет.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нет рублёвого счёта и документов.&lt;/strong&gt; Даже если оплата как-то проходит через зарубежную виртуальную карту, вы получаете списание в валюте без российских закрывающих документов. Для компании это означает, что расход нельзя корректно провести в учёте.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Валютный платёж юрлица — отдельная история.&lt;/strong&gt; Прямой платёж российской компании иностранному поставщику требует основания (контракт, инвойс) и проходит через валютный контроль банка. Городить эту схему ради API-подписки на несколько тысяч рублей в месяц экономически бессмысленно.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Дальше обычно идут два народных пути, и у обоих есть честные минусы. &lt;strong&gt;Зарубежная виртуальная карта (VCC):&lt;/strong&gt; вы пополняете её в рублях, она выпускает Visa/Mastercard в долларах, вы привязываете её к DashScope. Минусы — курс конвертации выше биржевого (типичная наценка 4–7%), комиссии за выпуск и пополнение, и главное — никаких закрывающих документов. &lt;strong&gt;Запуск весов у себя:&lt;/strong&gt; Qwen open-weight, теоретически модель можно скачать и хостить локально, но для версии уровня 3.6 Plus нужен серьёзный GPU-кластер, инженер по инференсу и постоянное обслуживание — для команды, которой нужно просто «дёргать модель из кода», это несоразмерные затраты.&lt;/p&gt;

&lt;h3&gt;
  
  
  Важно про формулировки
&lt;/h3&gt;

&lt;p&gt;Речь не про «обход блокировок» и не про серые схемы. API можно легально проксировать через посредника: агрегатор с юр.лицом в поддерживаемом регионе делает запрос к Qwen от своего имени и отдаёт вам результат через российский endpoint с рублёвой оплатой. С точки зрения Alibaba — это его легальный клиент, соблюдающий условия. С точки зрения российского пользователя — это сервис с договором, документами и поддержкой на русском. Никакого VPN, никакой зарубежной карты, никакого аккаунта в DashScope на вашей стороне. Именно поэтому &lt;strong&gt;предсказуемый способ работать с Qwen из России — это API через агрегатор&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffybm4vffnezz1zj58hdw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffybm4vffnezz1zj58hdw.png" alt="Сравнение трёх путей доступа к Qwen из России с подписями на русском: зарубежная карта VCC (наценка 4-7 процентов, нет документов), свой хостинг open-weight (дорого, нужен GPU-кластер), агрегатор (рубли, документы, тот же протокол) — последний блок выделен терракотовым" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Как пользоваться Qwen в России через API: пошагово
&lt;/h2&gt;

&lt;p&gt;Самый практичный способ работать с Qwen из России — не нативный SDK Alibaba, а &lt;strong&gt;OpenAI-совместимый endpoint&lt;/strong&gt;. Это не случайность и не костыль агрегатора: сама Alibaba отдаёт Qwen через OpenAI-совместимый режим DashScope и в своей документации прямо рекомендует мигрировать с OpenAI-кода, поменяв ключ, &lt;code&gt;base_url&lt;/code&gt; и имя модели. Promptra принимает запросы в формате OpenAI Chat Completions и сам транслирует их в Qwen — значит, весь существующий код на &lt;code&gt;openai&lt;/code&gt; SDK работает без переписывания. Разберём по шагам.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 1. Получить ключ.&lt;/strong&gt; Регистрируетесь на стороне агрегатора (на Promptra достаточно телефона — без email и зарубежной верификации) и получаете API-ключ вида &lt;code&gt;prm-...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 2. Пополнить баланс в рублях.&lt;/strong&gt; Оплата идёт рублёвой платёжкой. Цена за токены — один-в-один с прайсом Alibaba по курсу ЦБ, без наценки на токены. Сервисная комиссия 5% берётся только при пополнении баланса, а не от токенов.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 3. Поменять &lt;code&gt;base_url&lt;/code&gt; в коде.&lt;/strong&gt; Это вся «миграция». Вместо адреса DashScope вы указываете российский endpoint и модель &lt;code&gt;qwen/qwen3.6-plus&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Шаг 4. Сделать запрос.&lt;/strong&gt; Дальше код работает как обычно — модель отвечает, вы получаете результат.&lt;/p&gt;

&lt;p&gt;Вот рабочий пример на Python. Клиент — стандартный &lt;code&gt;openai&lt;/code&gt;, меняется только &lt;code&gt;base_url&lt;/code&gt;, ключ и имя модели:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prm-xxxxxxxxxxxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# ключ Promptra
&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# единственное изменение
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen/qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ты — ассистент по извлечению данных. Отвечай строго JSON.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Извлеки ИНН и сумму из текста договора:...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;То же самое на Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PROMPTRA_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// единственное изменение&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;qwen/qwen3.6-plus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Классифицируй обращение по категории:...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Хранить base_url в переменной окружения
&lt;/h3&gt;

&lt;p&gt;Хорошая практика для продакшена — держать &lt;code&gt;base_url&lt;/code&gt; и ключ в &lt;code&gt;.env&lt;/code&gt;, а не зашивать в код. Тогда переключиться между моделями (или на fallback) можно за секунду, без передеплоя:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# В.env:
# OPENAI_API_KEY=prm-xxxxxxxxxxxx
# OPENAI_BASE_URL=https://api.promptra.ru/v1
&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen/qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Проверить, что подключение работает, можно одним curl-запросом без всякого SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.promptra.ru/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer prm-xxxxxxxxxxxx"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
 "model": "qwen/qwen3.6-plus",
 "messages": [{"role": "user", "content": "ping"}]
 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если в ответ пришёл JSON с полем &lt;code&gt;choices&lt;/code&gt; — модель отвечает, можно подключать в продакшен. Если вы раньше ходили в DashScope напрямую, миграция сводится к замене адреса и имени модели на формат каталога — поля запроса остаются прежними. Общий разбор смены &lt;code&gt;base_url&lt;/code&gt; на разных языках — в материале про &lt;a href="https://promptra.ru/blog/migraciya-openai-sdk-base-url" rel="noopener noreferrer"&gt;миграцию с OpenAI SDK&lt;/a&gt;. Удобство OpenAI-совместимого протокола в том, что одну и ту же кодовую базу можно перенаправить с Qwen на DeepSeek или флагман сменой одной строки &lt;code&gt;model&lt;/code&gt; — без переписывания интеграции.&lt;/p&gt;

&lt;h2&gt;
  
  
  Цена Qwen в рублях
&lt;/h2&gt;

&lt;p&gt;Promptra не накручивает наценку на токены. Стоимость модели равна официальному прайсу Alibaba DashScope, пересчитанному в рубли по курсу ЦБ РФ на 2026-05-27: &lt;strong&gt;1 USD = 71.668 ₽&lt;/strong&gt;. Рублёвые значения округлены вниз (правило каталога). Базовый прайс публикуется на &lt;a href="https://www.alibabacloud.com/help/en/model-studio/model-pricing" rel="noopener noreferrer"&gt;странице цен Alibaba Cloud Model Studio&lt;/a&gt;; ставка по конкретной версии 3.6 Plus также сверяется по листингу &lt;a href="https://openrouter.ai/qwen" rel="noopener noreferrer"&gt;openrouter.ai/qwen&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Тип токенов&lt;/th&gt;
&lt;th&gt;Цена DashScope (USD за 1M)&lt;/th&gt;
&lt;th&gt;Цена Promptra (₽ за 1M)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Вход (input)&lt;/td&gt;
&lt;td&gt;$0.325&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Выход (output)&lt;/td&gt;
&lt;td&gt;$1.95&lt;/td&gt;
&lt;td&gt;130 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Точная арифметика: $0.325 × 71.668 ≈ 23.3 ₽, $1.95 × 71.668 ≈ 139.8 ₽. В каталоге значения округлены вниз до 20 и 130 ₽; фактический счёт считается по курсу ЦБ на день пополнения, поэтому в разные дни рублёвая цифра слегка плавает вслед за курсом, а долларовая ставка остаётся фиксированной.&lt;/p&gt;

&lt;p&gt;Чтобы понять масштаб на фоне флагманов: вход Qwen дешевле GPT-5.5 в 17.5 раза (20 ₽ против 350 ₽), а выход — в 16.5 раза (130 ₽ против 2150 ₽). При этом контекст у Qwen такой же — 1M токенов. Сравнение по входу и выходу с другими моделями каталога:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Вход (₽/1M)&lt;/th&gt;
&lt;th&gt;Выход (₽/1M)&lt;/th&gt;
&lt;th&gt;Контекст&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;td&gt;130 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro (промо)&lt;/td&gt;
&lt;td&gt;30 ₽&lt;/td&gt;
&lt;td&gt;60 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.1&lt;/td&gt;
&lt;td&gt;100 ₽&lt;/td&gt;
&lt;td&gt;310 ₽&lt;/td&gt;
&lt;td&gt;около 203K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro Preview&lt;/td&gt;
&lt;td&gt;140 ₽&lt;/td&gt;
&lt;td&gt;860 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;350 ₽&lt;/td&gt;
&lt;td&gt;1790 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;350 ₽&lt;/td&gt;
&lt;td&gt;2150 ₽&lt;/td&gt;
&lt;td&gt;1.05M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Чтобы цена за миллион токенов превратилась в понятный порядок расходов, прикинем типовые сценарии. Считается всё просто: &lt;code&gt;(входные_токены / 1 000 000 × 20) + (выходные_токены / 1 000 000 × 130)&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Сценарий&lt;/th&gt;
&lt;th&gt;Вход&lt;/th&gt;
&lt;th&gt;Выход&lt;/th&gt;
&lt;th&gt;Стоимость&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Короткий чат-запрос&lt;/td&gt;
&lt;td&gt;1K&lt;/td&gt;
&lt;td&gt;0.5K&lt;/td&gt;
&lt;td&gt;около 0.085 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Классификация документа&lt;/td&gt;
&lt;td&gt;20K&lt;/td&gt;
&lt;td&gt;0.3K&lt;/td&gt;
&lt;td&gt;около 0.44 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG-ответ по базе знаний&lt;/td&gt;
&lt;td&gt;80K&lt;/td&gt;
&lt;td&gt;2K&lt;/td&gt;
&lt;td&gt;около 1.86 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Анализ кода на 50K токенов&lt;/td&gt;
&lt;td&gt;50K&lt;/td&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;около 1.52 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Обратите внимание на масштаб: RAG-ответ с контекстом на 80 тысяч токенов обходится менее чем в 2 ₽ — на флагманах такой же запрос стоил бы десятки рублей. Это и есть основной аргумент в пользу Qwen на массовых задачах.&lt;/p&gt;

&lt;p&gt;Отдельный нюанс линейки Qwen: у моделей Alibaba исторически тарификация может зависеть от длины контекста и режима (обычная генерация против «думающего» reasoning-режима). На официальной странице цен старшие Qwen-модели разбиты на тарифные диапазоны. В нашем каталоге для &lt;code&gt;qwen/qwen3.6-plus&lt;/code&gt; зафиксирована единая ставка 20/130 ₽, которая и применяется к запросам через Promptra; если вы строите пайплайн с очень длинным контекстом или reasoning-режимом, имеет смысл свериться с официальным прайсом Alibaba по конкретному сценарию — мы не выдумываем пороги, а отсылаем к первоисточнику.&lt;/p&gt;

&lt;h2&gt;
  
  
  Сценарии: где Qwen раскрывается лучше всего
&lt;/h2&gt;

&lt;p&gt;Qwen — не универсальная замена всему. Он силён в конкретных сценариях и слабее в других. Коротко, чтобы не тратить бюджет зря.&lt;/p&gt;

&lt;h3&gt;
  
  
  Массовый объём: дешёвый вход решает
&lt;/h3&gt;

&lt;p&gt;Главный экономический сюжет Qwen — очень дешёвый вход (20 ₽/1M) при умеренном выходе (130 ₽/1M). Это делает его оптимальным там, где входного контекста много, а выход короткий:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Классификация и маршрутизация.&lt;/strong&gt; На вход — текст обращения, документа, тикета; на выход — короткая метка категории. Вход длинный, выход — несколько токенов.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Извлечение полей (extraction).&lt;/strong&gt; На вход — договор, инвойс, резюме; на выход — структурированный JSON. Выход в разы короче входа.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG-ответы.&lt;/strong&gt; На вход — вопрос плюс извлечённые фрагменты базы знаний (часто десятки тысяч токенов); на выход — короткий ответ по существу.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Модерация и скоринг.&lt;/strong&gt; На вход — контент; на выход — оценка или флаг.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;На потоке в миллионы запросов 17-кратная разница в цене входа против флагманов превращается в принципиально иной порядок расходов. Если же задача генеративная (длинные тексты, развёрнутые отчёты, большой output), асимметрия работает слабее, и стоит присмотреться к &lt;a href="https://promptra.ru/blog/deepseek-v-rossii" rel="noopener noreferrer"&gt;DeepSeek в России&lt;/a&gt; с его более дешёвым выходом — это соседняя дешёвая open-weight модель, доступная через тот же endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Многоязычные задачи
&lt;/h3&gt;

&lt;p&gt;Второй естественный сценарий — всё, что связано с языками за пределами английского и русского. Поддержка клиентов на азиатских рынках, обработка отзывов и контента на китайском, японском, корейском, перевод и локализация — здесь Qwen чувствует себя увереннее западных моделей сопоставимой цены. Если у вашего продукта есть азиатская аудитория или мультиязычный поток данных, Qwen стоит включить в short-list кандидатов и проверить на реальной выборке.&lt;/p&gt;

&lt;h3&gt;
  
  
  Гибридная схема
&lt;/h3&gt;

&lt;p&gt;На практике многие команды строят гибрид: Qwen (или DeepSeek) — на потоке простых и средних задач, где важны объём и цена, а дорогой флагман подключают точечно, только на запросах, где он реально нужен. Поскольку всё работает через один OpenAI-совместимый интерфейс, переключение между моделями — это смена значения поля &lt;code&gt;model&lt;/code&gt;. Развёрнутое сравнение моделей по сценариям мы собрали в обзоре &lt;a href="https://promptra.ru/blog/top-5-llm-2026" rel="noopener noreferrer"&gt;топ-5 LLM 2026&lt;/a&gt;, а если нужен именно GPT с рублёвой оплатой — он подключается так же, см. страницу &lt;a href="https://promptra.ru/api/chatgpt" rel="noopener noreferrer"&gt;доступа к ChatGPT API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Практический совет тот же, что и для флагманов: возьмите репрезентативную выборку ваших реальных запросов, прогоните на двух-трёх кандидатах и сравните не только цену, но и качество ответа на вашем классе задач и языке. OpenAI-совместимый протокол делает такой A/B-тест вопросом смены одной строки.&lt;/p&gt;

&lt;h2&gt;
  
  
  Оплата и документы для юр.лица
&lt;/h2&gt;

&lt;p&gt;Для команд в компаниях важна не только цена токена, но и то, как эти расходы проходят по бухгалтерии. Promptra принимает оплату на юр.лицо российское юр.лицо рублёвой платёжкой с расчётного счёта, с полным пакетом закрывающих документов через ЭДО — договор-оферта, счёт, акт, счёт-фактура, УПД. Документооборот идёт через операторов ЭДО (Диадок, СБИС, Контур), что удобно для корпоративной бухгалтерии: документы автоматически проводятся в учётной системе. Валютный контроль не нужен — это рублёвый договор с резидентом РФ.&lt;/p&gt;

&lt;p&gt;С Qwen этот аргумент особенно практичен. Прямой доступ к DashScope из России — это зарубежная карта, валютный платёж и отсутствие закрывающих документов российского формата: расход сложно корректно учесть. Через Promptra вы получаете ту же модель по той же цене (1-в-1 с прайсом Alibaba по курсу ЦБ), но платите в рублях и с первичкой, которую без вопросов примет ваша бухгалтерия. Любой бухгалтер и налоговый инспектор смотрят в первую очередь на документы — и здесь у вас полный комплект. Что именно принимается к учёту при работе с зарубежными LLM через российское юр.лицо, мы разобрали в гайде &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;легально ли использовать AI API на юр.лицо&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qwen</category>
      <category>alibaba</category>
      <category>api</category>
      <category>llm</category>
    </item>
    <item>
      <title>Qwen 3.6 Plus (Alibaba) API за рубли: многоязычная open-weight модель</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Tue, 16 Jun 2026 07:10:06 +0000</pubDate>
      <link>https://dev.to/promptra-team/qwen-36-plus-alibaba-api-za-rubli-mnoghoiazychnaia-open-weight-modiel-ipi</link>
      <guid>https://dev.to/promptra-team/qwen-36-plus-alibaba-api-za-rubli-mnoghoiazychnaia-open-weight-modiel-ipi</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xjo6nfnp39urvx721fh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xjo6nfnp39urvx721fh.png" alt="Столбчатая диаграмма стоимости 1М входных токенов в рублях по моделям: Qwen 3.6 Plus самый дешёвый вход, столбец выделен терракотовым цветом" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qwen 3.6 Plus — многоязычная open-weight модель от Alibaba (линейка Qwen, она же Tongyi Qianwen). Через Promptra она стоит &lt;strong&gt;20 ₽ за 1M входных токенов и 130 ₽ за 1M выходных&lt;/strong&gt; — это цена 1-в-1 с прайсом DashScope ($0.325 и $1.95 за 1M) по курсу ЦБ РФ на 27.05.2026 (71.668 ₽/$), без наценки на токены. Контекстное окно — 1 000 000 токенов, максимум на выход — 65 536 токенов. Модель сильна в многоязычных задачах (особенно азиатские языки) и в коде, а на входе — одна из самых дешёвых в каталоге. Подключение занимает пять минут: API совместим с OpenAI, в коде меняется один параметр &lt;code&gt;base_url&lt;/code&gt; на &lt;code&gt;https://api.promptra.ru/v1&lt;/code&gt;. Оплата идёт на российское юр.лицо с полным пакетом закрывающих документов через ЭДО.&lt;/p&gt;

&lt;p&gt;Главное, что выделяет Qwen 3.6 Plus среди дешёвых моделей, — это &lt;strong&gt;асимметрия цены&lt;/strong&gt;: вход стоит копейки (20 ₽/1M), а выход дороже входа в 6.5 раза (130 ₽/1M). Для нагрузок, где много контекста на входе и короткий ответ на выходе — классификация, извлечение полей, RAG-ответы по большой базе — это почти идеальный профиль: вы платите символически за то, что модель «прочитала» гигантский контекст, и совсем немного за короткий вывод. Ниже разберём, где Qwen выигрывает по деньгам у DeepSeek, GLM и флагманов, для каких задач его берут, и как подключить из России без VPN. Все цены — на 29.05.2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что такое Qwen 3.6 Plus и для каких задач
&lt;/h2&gt;

&lt;p&gt;Qwen — это семейство языковых моделей, которое разрабатывает Alibaba Cloud. Линейка существует с 2023 года и за это время выросла в одну из самых заметных open-weight экосистем мира: десятки моделей разного размера, от компактных до флагманских, плюс специализированные версии под код, математику и зрение. Qwen 3.6 Plus — старшая «плюс»-модель текущего поколения, рассчитанная на широкий спектр задач при низкой цене.&lt;/p&gt;

&lt;p&gt;Две вещи определяют её характер. Первая — &lt;strong&gt;многоязычность&lt;/strong&gt;. Qwen традиционно силён за пределами английского: китайский, японский, корейский и другие азиатские языки модель обрабатывает заметно лучше, чем большинство западных моделей сопоставимой цены. Русский Qwen тоже поддерживает — для многих повседневных задач (резюмирование, классификация, извлечение данных, генерация описаний) этого достаточно. Если ваш продукт работает с мультиязычным контентом или с азиатскими рынками, Qwen — естественный кандидат.&lt;/p&gt;

&lt;p&gt;Вторая — &lt;strong&gt;open-weight&lt;/strong&gt;. Веса Qwen опубликованы под открытой лицензией: модель можно скачать и запускать на своём железе. Для большинства команд это не означает «будем хоститься сами» — это операционно дорого и сложно, — но означает важную вещь: модель не привязана к единственному вендору. Её отдаёт сама Alibaba через DashScope и десятки независимых инференс-провайдеров, и конкуренция держит цену низкой. Именно поэтому Qwen, как и DeepSeek, стоит в разы дешевле проприетарных флагманов.&lt;/p&gt;

&lt;p&gt;Ключевые технические характеристики из нашего каталога:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Параметр&lt;/th&gt;
&lt;th&gt;Значение&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Идентификатор модели&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen3.6-plus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Провайдер&lt;/td&gt;
&lt;td&gt;Alibaba Qwen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Тип весов&lt;/td&gt;
&lt;td&gt;open-weight (открытая лицензия)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Контекстное окно&lt;/td&gt;
&lt;td&gt;1 000 000 токенов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Максимум на выход&lt;/td&gt;
&lt;td&gt;65 536 токенов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Модальности входа&lt;/td&gt;
&lt;td&gt;текст&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Модальности выхода&lt;/td&gt;
&lt;td&gt;текст&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoints&lt;/td&gt;
&lt;td&gt;&lt;code&gt;chat&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Миллион токенов контекста — это ориентировочно 700–750 тысяч слов или порядка 50 000 строк кода. В одно окно влезает кодовая база среднего сервиса, объёмный архив документов или длинная история диалога целиком. На фоне таких возможностей цена входа в 20 ₽ за 1M делает Qwen 3.6 Plus инструментом, которым можно «скармливать» большие объёмы контекста, почти не глядя на счёт за вход.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86iz556oa0kaprnm4v7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86iz556oa0kaprnm4v7g.png" alt="Карточка модели Qwen 3.6 Plus с подписями на русском: контекст 1 000 000 токенов, выход 65 536, вход 20 рублей за 1М, выход 130 рублей за 1М, тип open-weight, провайдер Alibaba, тёплая бежевая палитра с терракотовым акцентом" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Цена Qwen 3.6 Plus в рублях: полная таблица
&lt;/h2&gt;

&lt;p&gt;Promptra не накручивает наценку на токены. Стоимость модели равна официальному прайсу Alibaba DashScope, пересчитанному в рубли по курсу ЦБ РФ. Сервисная комиссия 5% берётся &lt;strong&gt;только при пополнении баланса&lt;/strong&gt;, а не с каждого запроса, поэтому в расчётах за токены её нет. Базовый прайс публикуется на &lt;a href="https://www.alibabacloud.com/help/en/model-studio/model-pricing" rel="noopener noreferrer"&gt;странице цен Alibaba Cloud Model Studio&lt;/a&gt;; рейт по конкретной версии 3.6 Plus также сверяется по листингу &lt;a href="https://openrouter.ai/qwen/qwen3.6-plus" rel="noopener noreferrer"&gt;openrouter.ai/qwen/qwen3.6-plus&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Тип токенов&lt;/th&gt;
&lt;th&gt;Цена DashScope (USD за 1M)&lt;/th&gt;
&lt;th&gt;Цена Promptra (₽ за 1M)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Вход (input)&lt;/td&gt;
&lt;td&gt;$0.325&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Выход (output)&lt;/td&gt;
&lt;td&gt;$1.95&lt;/td&gt;
&lt;td&gt;130 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Курс пересчёта: 1 USD = 71.668 ₽ (ЦБ РФ на 27.05.2026). Точная арифметика: $0.325 × 71.668 ≈ 23.3 ₽, $1.95 × 71.668 ≈ 139.8 ₽. В каталоге значения округлены вниз до 20 и 130 ₽ — фактический счёт считается по курсу ЦБ на день пополнения, поэтому в разные дни рублёвая цифра слегка плавает вслед за курсом, а долларовая ставка остаётся фиксированной.&lt;/p&gt;

&lt;p&gt;Отдельно отметим важный нюанс линейки Qwen: у моделей Alibaba исторически &lt;strong&gt;тарификация зависит от длины контекста и режима&lt;/strong&gt;. На официальной странице цен старшие Qwen-модели разбиты на тарифные диапазоны (например, до 256K входных токенов — одна ставка, выше — другая), а «думающий» режим (reasoning) тарифицируется по более высокой выходной ставке, чем обычная генерация. В нашем каталоге для &lt;code&gt;qwen3.6-plus&lt;/code&gt; зафиксирована единая ставка 20/130 ₽, которая и применяется к запросам через Promptra; если вы строите пайплайн с очень длинным контекстом или с reasoning-режимом, имеет смысл свериться с официальным прайсом Alibaba по конкретному сценарию.&lt;/p&gt;

&lt;p&gt;Чтобы понимать порядок расходов, прикинем стоимость типовых сценариев. Соотношение вход/выход в реальной нагрузке обычно смещено в сторону входа (длинный промпт + контекст, короткий ответ) — а это ровно тот профиль, на котором дешёвый вход Qwen раскрывается максимально.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Сценарий&lt;/th&gt;
&lt;th&gt;Вход&lt;/th&gt;
&lt;th&gt;Выход&lt;/th&gt;
&lt;th&gt;Стоимость&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Короткий чат-запрос&lt;/td&gt;
&lt;td&gt;1K&lt;/td&gt;
&lt;td&gt;0.5K&lt;/td&gt;
&lt;td&gt;≈ 0.085 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Классификация документа&lt;/td&gt;
&lt;td&gt;20K&lt;/td&gt;
&lt;td&gt;0.3K&lt;/td&gt;
&lt;td&gt;≈ 0.44 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG-ответ по базе знаний&lt;/td&gt;
&lt;td&gt;80K&lt;/td&gt;
&lt;td&gt;2K&lt;/td&gt;
&lt;td&gt;≈ 1.86 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Анализ кода на 50K токенов&lt;/td&gt;
&lt;td&gt;50K&lt;/td&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;≈ 1.52 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Цифры приблизительные и зависят от точного количества токенов в ваших данных. Считаются они просто: &lt;code&gt;(входные_токены / 1 000 000 × 20) + (выходные_токены / 1 000 000 × 130)&lt;/code&gt;. Реальный расход всегда видно в дашборде по факту запроса. Обратите внимание на масштаб: RAG-ответ с контекстом на 80 тысяч токенов обходится менее чем в 2 ₽ — на флагманах такой же запрос стоил бы десятки рублей.&lt;/p&gt;

&lt;h2&gt;
  
  
  Где Qwen дешевле всех: разбор асимметрии вход/выход
&lt;/h2&gt;

&lt;p&gt;Главный экономический сюжет Qwen 3.6 Plus — это разрыв между ценой входа и выхода. Вход стоит 20 ₽/1M, выход — 130 ₽/1M, то есть выход дороже входа в 6.5 раза. Это не дефект, а характеристика, которую можно использовать в свою пользу. Сравним соотношения у нескольких дешёвых и средних моделей каталога:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Вход (₽/1M)&lt;/th&gt;
&lt;th&gt;Выход (₽/1M)&lt;/th&gt;
&lt;th&gt;Выход / вход&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;td&gt;130 ₽&lt;/td&gt;
&lt;td&gt;×6.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax M2.7&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;td&gt;80 ₽&lt;/td&gt;
&lt;td&gt;×4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro (промо)&lt;/td&gt;
&lt;td&gt;30 ₽&lt;/td&gt;
&lt;td&gt;60 ₽&lt;/td&gt;
&lt;td&gt;×2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K2.5&lt;/td&gt;
&lt;td&gt;40 ₽&lt;/td&gt;
&lt;td&gt;170 ₽&lt;/td&gt;
&lt;td&gt;×4.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.1&lt;/td&gt;
&lt;td&gt;100 ₽&lt;/td&gt;
&lt;td&gt;310 ₽&lt;/td&gt;
&lt;td&gt;×3.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Вывод читается прямо из таблицы. &lt;strong&gt;Qwen 3.6 Plus и MiniMax M2.7 делят первое место по дешевизне входа&lt;/strong&gt; (20 ₽/1M), но у Qwen выход дороже. Значит, Qwen оптимален там, где входной контекст большой, а выход короткий: вы платите символическую цену за то, что модель «прочитала» много контекста, и немного — за короткий ответ. И наоборот: если задача генеративная (длинные тексты, развёрнутые ответы, большой output), асимметрия работает против вас, и стоит присмотреться к DeepSeek с его ровным соотношением ×2.&lt;/p&gt;

&lt;p&gt;Разложим это на конкретные классы задач:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Идеальный профиль для Qwen (много входа, мало выхода):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Классификация и маршрутизация.&lt;/strong&gt; На вход — текст обращения, документа, тикета; на выход — короткая метка категории. Вход может быть длинным, выход — несколько токенов.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Извлечение полей (extraction).&lt;/strong&gt; На вход — договор, инвойс, резюме; на выход — структурированный JSON с полями. Выход обычно в разы короче входа.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG-ответы.&lt;/strong&gt; На вход — вопрос плюс извлечённые фрагменты базы знаний (часто десятки тысяч токенов); на выход — короткий ответ по существу.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Модерация и скоринг.&lt;/strong&gt; На вход — контент; на выход — оценка или флаг.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Менее выгодный профиль (много выхода):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Генерация длинных статей, описаний товаров пачками, развёрнутых отчётов — здесь основной счёт формирует выход, и Qwen теряет часть ценового преимущества. Для таких задач сравните его с DeepSeek (выход 60 ₽/1M в промо-период).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkuwnk0cakuk8cr5m95l1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkuwnk0cakuk8cr5m95l1.png" alt="Схема с двумя профилями нагрузки и подписями на русском: слева блок «много входа, короткий выход» со стрелкой к Qwen 3.6 Plus как оптимальному выбору, справа блок «длинный выход» со стрелкой к DeepSeek, стрелки и рамки терракотовые на бежевом фоне" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Как подключить Qwen 3.6 Plus из России: drop-in через OpenAI SDK
&lt;/h2&gt;

&lt;p&gt;Технически Qwen 3.6 Plus подключается так же, как любая модель в каталоге, — потому что API Promptra совместим с OpenAI на уровне протокола. Это не случайность: сама Alibaba отдаёт Qwen через &lt;a href="https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope" rel="noopener noreferrer"&gt;OpenAI-совместимый endpoint DashScope&lt;/a&gt; (&lt;code&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1&lt;/code&gt;) и в своей документации прямо рекомендует мигрировать с OpenAI-кода, поменяв ключ, &lt;code&gt;base_url&lt;/code&gt; и имя модели. Через Promptra логика та же, но &lt;code&gt;base_url&lt;/code&gt; один на все модели каталога, а оплата — в рублях на юр.лицо.&lt;/p&gt;

&lt;p&gt;Меняется ровно один параметр — &lt;code&gt;base_url&lt;/code&gt;. Ключ заменяется на ключ Promptra, имя модели указывается как &lt;code&gt;qwen3.6-plus&lt;/code&gt;, остальной код остаётся прежним.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prm-xxxxxxxxxxxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# ключ Promptra
&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# единственное изменение
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ты — ассистент по извлечению данных. Отвечай строго JSON.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Извлеки ИНН и сумму из текста:...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prm-xxxxxxxxxxxx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// единственное изменение&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;qwen3.6-plus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ты — ассистент по извлечению данных. Отвечай строго JSON.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Извлеки ИНН и сумму из текста:...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Хорошая практика: base_url в переменной окружения
&lt;/h3&gt;

&lt;p&gt;Чтобы не зашивать endpoint в код и иметь возможность переключаться между моделями за секунды, держите &lt;code&gt;base_url&lt;/code&gt; и ключ в &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# В.env:
# OPENAI_API_KEY=prm-xxxxxxxxxxxx
# OPENAI_BASE_URL=https://api.promptra.ru/v1
&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Проверить, что подключение работает, можно одним curl-запросом без всякого SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.promptra.ru/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer prm-xxxxxxxxxxxx"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
 "model": "qwen3.6-plus",
 "messages": [{"role": "user", "content": "ping"}]
 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если в ответ пришёл JSON с полем &lt;code&gt;choices&lt;/code&gt; — модель отвечает, можно подключать в продакшен. Удобство OpenAI-совместимого протокола в том, что одну и ту же кодовую базу можно перенаправить с Qwen на DeepSeek или флагман сменой одной строки &lt;code&gt;model&lt;/code&gt; — без переписывания интеграции.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxt5cjcyui524yolycluw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxt5cjcyui524yolycluw.png" alt="Схема drop-in замены base_url с подписями на русском: блок кода OpenAI SDK, стрелка к параметру base_url со значением api.promptra.ru слэш v1, ниже три модели qwen3.6-plus, deepseek-v4-pro, gpt-5.5 как взаимозаменяемые значения поля model, акцентная терракотовая стрелка на бежевом фоне" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Qwen vs DeepSeek vs GLM: какую дешёвую модель выбрать
&lt;/h2&gt;

&lt;p&gt;В каталоге несколько недорогих open-weight и азиатских моделей, и вопрос «какую взять» сводится не к «какая лучшая», а к «какая дешевле для моего профиля и сильна в нужной мне области». Сведём основных кандидатов в таблицу (цены — из каталога, 1-в-1 с прайсом провайдера по курсу ЦБ).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Вход (₽/1M)&lt;/th&gt;
&lt;th&gt;Выход (₽/1M)&lt;/th&gt;
&lt;th&gt;Контекст&lt;/th&gt;
&lt;th&gt;Сильные стороны&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;td&gt;130 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;Многоязычность (азиатские языки), код, дешёвый вход&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro (промо)&lt;/td&gt;
&lt;td&gt;30 ₽&lt;/td&gt;
&lt;td&gt;60 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;Код и матлогика, дешёвый и ровный выход&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.1&lt;/td&gt;
&lt;td&gt;100 ₽&lt;/td&gt;
&lt;td&gt;310 ₽&lt;/td&gt;
&lt;td&gt;~203K&lt;/td&gt;
&lt;td&gt;Reasoning, сбалансированная универсальная модель&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax M2.7&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;td&gt;80 ₽&lt;/td&gt;
&lt;td&gt;~205K&lt;/td&gt;
&lt;td&gt;Дешёвый вход, универсал, азиатская модель&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kimi K2.5&lt;/td&gt;
&lt;td&gt;40 ₽&lt;/td&gt;
&lt;td&gt;170 ₽&lt;/td&gt;
&lt;td&gt;~262K&lt;/td&gt;
&lt;td&gt;Длинные документы, vision на входе&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;USD-прайс для справки: Qwen 3.6 Plus — $0.325/$1.95, DeepSeek V4 Pro — $0.435/$0.87 (промо до 31.05.2026, базовая ставка после ≈ $1.74/$3.48), GLM 5.1 — $1.4/$4.4, MiniMax M2.7 — $0.3/$1.2, Kimi K2.5 — $0.6/$2.5.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Берите Qwen 3.6 Plus, когда:&lt;/strong&gt; в задаче много входного контекста и короткий выход (классификация, извлечение, RAG, модерация), либо когда важна работа с азиатскими языками. Контекст 1M позволяет загружать огромные объёмы, а вход в 20 ₽/1M делает это почти бесплатным. Это лучший выбор для «прочитать много — ответить коротко».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Берите DeepSeek V4 Pro, когда:&lt;/strong&gt; задача генеративная (длинный выход) или это код и математика. У DeepSeek ровное соотношение вход/выход (×2) и самый дешёвый выход в этой группе (60 ₽/1M в промо). Важная оговорка: промо-скидка −75% действует до 31 мая 2026, после чего базовая ставка вырастет примерно вчетверо. Подробный разбор — в статье про &lt;a href="https://promptra.ru/blog/deepseek-v4-pro-api-rubli" rel="noopener noreferrer"&gt;DeepSeek V4 Pro API за рубли&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Берите GLM 5.1, когда:&lt;/strong&gt; нужен крепкий универсал с акцентом на reasoning и вы готовы платить за качество ответа больше, чем за Qwen или DeepSeek. GLM дороже (100/310 ₽), но это сбалансированная модель под широкий класс задач. Разбор — в статье про &lt;a href="https://promptra.ru/blog/glm-5-1-api-rubli" rel="noopener noreferrer"&gt;GLM 5.1 (Z.ai) API за рубли&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Берите MiniMax M2.7 или Kimi K2.5, когда:&lt;/strong&gt; MiniMax — как дешёвая универсальная альтернатива Qwen с более выгодным выходом, но меньшим контекстом (около 205K против 1M). Kimi — когда нужны очень длинные документы (262K контекст) и приём изображений на входе.&lt;/p&gt;

&lt;p&gt;Практический совет тот же, что и для флагманов: возьмите репрезентативную выборку ваших реальных запросов, прогоните на двух-трёх кандидатах и сравните не только цену, но и качество ответа на вашем классе задач и языке. OpenAI-совместимый протокол делает такой A/B-тест вопросом смены одной строки &lt;code&gt;model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwfmn4hgstg5ufdhdm08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwfmn4hgstg5ufdhdm08.png" alt="Дерево решения выбора дешёвой модели с подписями на русском: корневой вопрос о профиле задачи ветвится на «много входа, короткий выход» к Qwen, «длинный выход, код» к DeepSeek, «нужен reasoning» к GLM, «очень длинные документы» к Kimi, прямоугольники и стрелки в тёплой палитре с терракотовыми акцентами" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Qwen 3.6 Plus против флагманов: когда экономия оправдана
&lt;/h2&gt;

&lt;p&gt;Полезно понять, насколько именно Qwen дешевле топовых моделей — и где эта экономия имеет смысл, а где нет. Сравним вход и выход с флагманами каталога.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Вход (₽/1M)&lt;/th&gt;
&lt;th&gt;Выход (₽/1M)&lt;/th&gt;
&lt;th&gt;Контекст&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;20 ₽&lt;/td&gt;
&lt;td&gt;130 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;140 ₽&lt;/td&gt;
&lt;td&gt;860 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;350 ₽&lt;/td&gt;
&lt;td&gt;1790 ₽&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;350 ₽&lt;/td&gt;
&lt;td&gt;2150 ₽&lt;/td&gt;
&lt;td&gt;1.05M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Цифры показывают разрыв наглядно. Вход Qwen дешевле GPT-5.5 в &lt;strong&gt;17.5 раза&lt;/strong&gt; (20 ₽ против 350 ₽), выход — в &lt;strong&gt;16.5 раза&lt;/strong&gt; (130 ₽ против 2150 ₽). Даже против самого дешёвого из флагманов, Gemini 3.1 Pro, Qwen дешевле в 7 раз по входу и в 6.6 раза по выходу. При этом контекст у Qwen такой же — 1M токенов.&lt;/p&gt;

&lt;p&gt;Значит ли это, что Qwen всегда выгоднее? Нет. Разница в цене отражает разницу в назначении. Флагманы (GPT-5.5, Claude Opus 4.7) берут там, где цена ошибки выше цены токенов: сложный многошаговый reasoning, агентные пайплайны с планированием, код с длинными цепочками зависимостей. На таких задачах дешёвая модель может «срываться» — путать требования, терять нить, выдавать правдоподобный, но неверный ответ, — и тогда экономия на токенах оборачивается потерями на исправлении ошибок.&lt;/p&gt;

&lt;p&gt;Qwen 3.6 Plus раскрывается на &lt;strong&gt;массовых задачах средней сложности&lt;/strong&gt;, где важен объём и цена за единицу, а не предельное качество рассуждения: обработка очередей, классификация потока обращений, извлечение данных из тысяч документов, RAG-ответы. На потоке в миллионы запросов 17-кратная разница в цене входа превращается в принципиально иной порядок расходов. Многие команды строят гибридную схему: Qwen или DeepSeek на потоке простых и средних задач, флагман — точечно, только на запросах, где он реально нужен. Развёрнутое сравнение всех моделей мы собрали в обзоре &lt;a href="https://promptra.ru/blog/top-5-llm-2026" rel="noopener noreferrer"&gt;топ-5 LLM 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Лимиты, контекст и максимальный выход
&lt;/h2&gt;

&lt;p&gt;Помимо цены, у Qwen 3.6 Plus есть архитектурные лимиты, которые важно учитывать при проектировании:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Контекстное окно — 1 000 000 токенов.&lt;/strong&gt; Это суммарный объём «вход + всё, что модель удерживает в рамках запроса». Один из крупнейших контекстов в каталоге наравне с флагманами — позволяет загрузить очень большой объём данных за один вызов.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Максимум на выход — 65 536 токенов.&lt;/strong&gt; Сколько модель может сгенерировать в одном ответе. Это вдвое меньше, чем у флагманов (у GPT-5.5 и Claude — 128K), но 65K токенов — это порядка 45–50 тысяч слов, объём большой статьи или главы. Для подавляющего большинства задач этого достаточно с запасом; для генерации очень длинных документов лимит держите в голове.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Модальности — только текст.&lt;/strong&gt; Qwen 3.6 Plus в нашем каталоге работает с текстом на входе и выходе. Если нужна обработка изображений на входе, смотрите в сторону моделей с vision (например, Kimi K2.5 или флагманы Claude/GPT/Gemini).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint — &lt;code&gt;chat&lt;/code&gt;.&lt;/strong&gt; Модель доступна через стандартный chat-completions API, совместимый с OpenAI SDK, как в примерах выше.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если задача упирается в лимит выхода (нужно сгенерировать документ длиннее 65K токенов), стандартное решение — разбивать генерацию на части с продолжением контекста, а не пытаться выжать всё в один вызов.&lt;/p&gt;

&lt;h2&gt;
  
  
  Сколько стоит Qwen 3.6 Plus в месяц: прикидка для команды
&lt;/h2&gt;

&lt;p&gt;Чтобы цена в ₽ за миллион токенов превратилась в понятную цифру месячного бюджета, прикинем три профиля нагрузки — все смещены в сторону «много входа, короткий выход», где Qwen наиболее выгоден. Допущения указаны рядом — подставьте свои.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Профиль&lt;/th&gt;
&lt;th&gt;Запросов/мес&lt;/th&gt;
&lt;th&gt;Средний вход&lt;/th&gt;
&lt;th&gt;Средний выход&lt;/th&gt;
&lt;th&gt;Токенов вход/мес&lt;/th&gt;
&lt;th&gt;Токенов выход/мес&lt;/th&gt;
&lt;th&gt;Стоимость/мес&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Классификация потока&lt;/td&gt;
&lt;td&gt;1 000 000&lt;/td&gt;
&lt;td&gt;2K&lt;/td&gt;
&lt;td&gt;0.1K&lt;/td&gt;
&lt;td&gt;2B&lt;/td&gt;
&lt;td&gt;100M&lt;/td&gt;
&lt;td&gt;≈ 53 000 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG-ассистент&lt;/td&gt;
&lt;td&gt;200 000&lt;/td&gt;
&lt;td&gt;30K&lt;/td&gt;
&lt;td&gt;1K&lt;/td&gt;
&lt;td&gt;6B&lt;/td&gt;
&lt;td&gt;200M&lt;/td&gt;
&lt;td&gt;≈ 146 000 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Извлечение из документов&lt;/td&gt;
&lt;td&gt;100 000&lt;/td&gt;
&lt;td&gt;15K&lt;/td&gt;
&lt;td&gt;0.5K&lt;/td&gt;
&lt;td&gt;1.5B&lt;/td&gt;
&lt;td&gt;50M&lt;/td&gt;
&lt;td&gt;≈ 36 500 ₽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Расчёт прямой: входные токены за месяц делим на миллион и умножаем на 20 ₽, выходные — на 130 ₽, складываем. Например, для «классификации потока»: 2000 × 20 + 100 × 130 = 40 000 + 13 000 = 53 000 ₽ за миллион запросов в месяц.&lt;/p&gt;

&lt;p&gt;Видно, что даже на миллионе запросов с контекстом по 2 тысячи токенов счёт держится в районе 53 тысяч рублей — за тот же объём на GPT-5.5 он измерялся бы сотнями тысяч. Это и есть основной аргумент в пользу Qwen на массовых задачах:&lt;/p&gt;

&lt;h3&gt;
  
  
  Тот же миллион запросов на разных моделях (2K вход + 0.1K выход)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Стоимость 1М запросов в месяц&lt;/th&gt;
&lt;th&gt;Кратность к Qwen 3.6 Plus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;53 000 ₽&lt;/td&gt;
&lt;td&gt;×1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax M2.7&lt;/td&gt;
&lt;td&gt;48 000 ₽&lt;/td&gt;
&lt;td&gt;×0.9 (ещё дешевле)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4 Pro (промо)&lt;/td&gt;
&lt;td&gt;66 000 ₽&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.1&lt;/td&gt;
&lt;td&gt;231 000 ₽&lt;/td&gt;
&lt;td&gt;×4.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;132 000 ₽&lt;/td&gt;
&lt;td&gt;×2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;447 000 ₽&lt;/td&gt;
&lt;td&gt;×8.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;527 000 ₽&lt;/td&gt;
&lt;td&gt;×9.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;915 000 ₽&lt;/td&gt;
&lt;td&gt;×17.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;На профиле «много входа — короткий выход» (классификация, извлечение, RAG-ответы) Qwen 3.6 Plus и MiniMax M2.7 — самые выгодные модели каталога. Разница против GPT-5.5 — почти в 18 раз.&lt;/p&gt;

&lt;p&gt;при сопоставимом качестве для классификации и извлечения порядок расходов принципиально другой. Сервисная комиссия Promptra (5%) при этом берётся один раз при пополнении баланса, а не с каждого из этих запросов.&lt;/p&gt;

&lt;h2&gt;
  
  
  Оплата и документы для юр.лица
&lt;/h2&gt;

&lt;p&gt;Для команд в компаниях важна не только цена токена, но и то, как эти расходы проходят по бухгалтерии. Promptra принимает оплату на российское юр.лицо — российское юр.лицо — с полным пакетом закрывающих документов: договор-оферта, счёт, акт, счёт-фактура, УПД. Документооборот идёт через ЭДО (Диадок, СБИС), что удобно для корпоративной бухгалтерии — документы автоматически проводятся в учётной системе.&lt;/p&gt;

&lt;p&gt;С Qwen этот аргумент особенно практичен. Прямой доступ к DashScope из России — это зарубежная карта, валютный платёж и отсутствие закрывающих документов российского формата: расход сложно корректно учесть. Через Promptra вы получаете ту же модель по той же цене (1-в-1 с прайсом Alibaba по курсу ЦБ), но платите в рублях и с первичкой, которую без вопросов примет ваша бухгалтерия. Любой бухгалтер и налоговый инспектор смотрят в первую очередь на документы — и здесь у вас полный комплект. Подробно тему закрывающих документов и того, легально ли использовать зарубежные LLM на юрлицо в РФ, мы разобрали в гайде &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;легально ли использовать AI API на юрлицо&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qwen</category>
      <category>qwen36</category>
      <category>alibaba</category>
      <category>api</category>
    </item>
    <item>
      <title>Промпт-инжиниринг: как писать промпты для нейросетей</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Mon, 15 Jun 2026 18:55:05 +0000</pubDate>
      <link>https://dev.to/promptra-team/prompt-inzhiniringh-kak-pisat-prompty-dlia-nieirosietiei-52m5</link>
      <guid>https://dev.to/promptra-team/prompt-inzhiniringh-kak-pisat-prompty-dlia-nieirosietiei-52m5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxcmf37jw4rluof3jd3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxcmf37jw4rluof3jd3a.png" alt="Схема анатомии промпта из пяти блоков — роль, контекст, задача, формат, ограничения — для запроса к нейросети" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Промт — это текстовое задание, которое вы даёте нейросети: инструкция плюс контекст, по которым модель порождает ответ. Промпт-инжиниринг — это навык писать такие задания так, чтобы получать стабильный, точный и пригодный к использованию результат с первого-второго раза, а не вылавливать его из десятка попыток. Хороший промпт почти всегда содержит пять блоков: роль (кем модель должна себя считать), контекст (вводные и данные), задачу (что именно сделать), формат (как оформить ответ) и ограничения (чего избегать, рамки и длину). Чем конкретнее каждый блок, тем меньше правок после.&lt;/strong&gt; Те же приёмы работают одинаково в веб-чате и через API — а в API ими можно управлять программно: системный промпт, температура, примеры в запросе.&lt;/p&gt;

&lt;p&gt;Этот гайд — практический: что такое промт и из чего он состоит, как переписать слабый запрос в сильный (разбор «до/после»), какие приёмы стабильно поднимают качество (few-shot, цепочка рассуждений, системный против пользовательского промпта), какие ошибки встречаются чаще всего и как они выглядят, готовые шаблоны под текст, код и анализ данных, и как всё это применить через OpenAI-совместимый API. Примеры — на русском, под реальные модели из нашего каталога. Тон инженерный, на конкретике, без «раскрытия потенциала ИИ».&lt;/p&gt;

&lt;h2&gt;
  
  
  Что такое промт простыми словами
&lt;/h2&gt;

&lt;p&gt;Промт (от англ. &lt;em&gt;prompt&lt;/em&gt; — «подсказка», «запрос»; в рунете пишут и «промпт», и «промт») — это всё, что вы отправляете нейросети на вход: вопрос, инструкция, текст для обработки, примеры, данные. Модель не «понимает» задачу как человек — она достраивает наиболее вероятное продолжение к вашему тексту на основе того, чему научилась. Поэтому от формулировки промпта результат зависит сильнее, чем кажется: один и тот же запрос, сформулированный по-разному, даёт ответы разного качества. Подробнее — &lt;a href="https://promptra.ru/blog/gpt-5-5-vs-claude-opus-4-7-benchmarki-2026/" rel="noopener noreferrer"&gt;детальный head-to-head флагманов с бенчмарками&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Полезно сразу зафиксировать механику. Большая языковая модель (LLM) генерирует ответ токен за токеном, опираясь на весь предыдущий контекст — то есть на ваш промт. Она не помнит предыдущие беседы (если вы сами не передали историю) и не знает того, чего нет в её обучении или в вашем запросе. Отсюда два следствия, на которых стоит весь промпт-инжиниринг:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Контекст решает.&lt;/strong&gt; Модель отвечает только тем, что у неё «перед глазами». Не передали факты — она их додумает (и может ошибиться). Передали — будет опираться на них. Подробнее про устройство LLM — в материале &lt;a href="https://promptra.ru/blog/chto-takoe-neyroset" rel="noopener noreferrer"&gt;что такое нейросеть простыми словами&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Формулировка задаёт траекторию.&lt;/strong&gt; «Напиши про кофе» и «Ты бариста с 10-летним стажем. Напиши 5 советов по завариванию фильтр-кофе дома для новичка, по 2 предложения на совет, без воды» дадут принципиально разный результат, хотя задача формально одна.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Важно отделять промпт-инжиниринг от «магических заклинаний». Это не про секретные фразы, которые «разблокируют» модель, а про дисциплину постановки задачи: ясно сказать, кто, что, на каких данных и в каком виде должен сделать. Ровно так же, как хорошо поставленное ТЗ исполнителю даёт лучший результат, чем расплывчатая просьба.&lt;/p&gt;

&lt;h2&gt;
  
  
  Анатомия хорошего промпта: пять блоков
&lt;/h2&gt;

&lt;p&gt;За годы практики выкристаллизовалась устойчивая структура. Не каждый промпт обязан содержать все пять блоков, но чем сложнее задача, тем больше из них стоит прописать явно. Вот они, по порядку.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Роль.&lt;/strong&gt; Кем модель должна себя считать. «Ты технический редактор», «Ты senior Python-разработчик», «Ты юрист по договорному праву». Роль настраивает лексику, глубину и тон ответа. Это не украшение: «объясни рекурсию» от лица преподавателя для новичка и от лица интервьюера на собеседовании — разные тексты.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Контекст.&lt;/strong&gt; Все вводные, которые модель не может знать сама: данные, факты, фрагмент кода, предыдущие решения, аудитория, цель. Чем больше релевантного контекста, тем меньше домыслов. Сюда же — справочные материалы, на которые модель должна опираться.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Задача.&lt;/strong&gt; Что именно сделать, одним чётким действием: «напиши», «перепиши короче», «найди ошибку», «извлеки поля», «сравни и порекомендуй». Глагол + объект + критерий успеха. Размытое «помоги с текстом» хуже, чем «сократи этот текст вдвое, сохранив все цифры».&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Формат.&lt;/strong&gt; Как оформить ответ: список из 5 пунктов, таблица с такими-то колонками, JSON по схеме, абзац до 100 слов, маркдаун с подзаголовками. Модель охотнее следует явно заданному формату, чем угадывает его. Для интеграций (когда ответ парсит код) формат критичен.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ограничения.&lt;/strong&gt; Рамки и запреты: длина, тон, чего избегать, на что опираться. «Только на основе переданных данных, не добавляй фактов», «без канцелярита», «не длиннее 150 слов», «если данных не хватает — так и напиши, не выдумывай». Ограничения отсекают типичные провалы заранее.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkx3neri7pbkf392wn351.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkx3neri7pbkf392wn351.png" alt="Пять блоков хорошего промпта — роль, контекст, задача, формат, ограничения — с короткими пояснениями, что писать в каждом" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Разберём на конкретном «до/после». Слабый промпт:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;напиши пост про наш новый тариф
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Что с ним не так: нет роли, нет контекста (что за тариф, для кого, чем хорош), нет формата и длины, нет тона. Модель выдаст обобщённый текст «ни о чём» — и вы пойдёте на второй, третий заход. Сильный промпт по той же задаче:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Роль: ты SMM-редактор IT-продукта, пишешь живо и по делу.

Контекст: мы запускаем тариф «Команда» для LLM API-сервиса.
Что в нём: общий баланс на всю команду, ролевой доступ,
единый счёт и закрывающие документы на юрлицо. Аудитория —
техлиды и CTO небольших компаний.

Задача: напиши пост для Telegram-канала про запуск этого тарифа.

Формат: 100–130 слов, 1 эмодзи максимум, в конце один вопрос
к аудитории. Без хэштегов.

Ограничения: без канцелярита и слов «инновационный»,
«революционный»; не обещай скидок, которых нет; тон спокойный,
экспертный.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Второй промпт длиннее, но он экономит время: модель почти наверняка попадёт в цель с первого раза. Это и есть промпт-инжиниринг в действии — вы вкладываете минуту в постановку задачи и не тратите десять на переделки. На сильных моделях вроде Claude Sonnet 4.6 или GPT-5.5 такой структурированный промпт раскрывается особенно хорошо: они точно держат и формат, и ограничения.&lt;/p&gt;

&lt;h2&gt;
  
  
  Системный и пользовательский промпт: в чём разница
&lt;/h2&gt;

&lt;p&gt;При работе через API (и в продвинутых интерфейсах) промпт делится на два типа сообщений — это важная для практики деталь.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Системный промпт&lt;/strong&gt; (&lt;code&gt;system&lt;/code&gt;) — это инструкция верхнего уровня, которая задаёт поведение модели на весь диалог: роль, тон, правила, формат, ограничения. Его пишут один раз и переиспользуют. Модель относится к системному промпту как к приоритетным правилам игры.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Пользовательский промпт&lt;/strong&gt; (&lt;code&gt;user&lt;/code&gt;) — это конкретный запрос в рамках заданных правил: «вот текст, сократи его», «ответь на этот вопрос». Меняется от запроса к запросу.&lt;/p&gt;

&lt;p&gt;Практический смысл разделения: устойчивые требования (кто ты, как пишешь, чего не делаешь) выносят в системный промпт, а переменную часть — в пользовательский. Так шаблон поведения хранится в коде и не дублируется в каждом запросе. Вот как это выглядит:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ты технический редактор. Пишешь на русском, в деловом &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;тоне без канцелярита. Структурируешь текст подзаголовками. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Опираешься только на переданные данные; если их не хватает &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;для ответа — прямо сообщаешь об этом, не домысливаешь.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
 &lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Сократи этот абзац вдвое, сохрани все цифры:...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В веб-чате системный промпт обычно скрыт (его задаёт сам продукт), но многие чаты дают поле «инструкции» или «персона» — это он и есть. Через API вы управляете им полностью, и это одно из главных преимуществ работы по API: поведение модели становится воспроизводимым.&lt;/p&gt;

&lt;h2&gt;
  
  
  Приёмы, которые поднимают качество
&lt;/h2&gt;

&lt;p&gt;Поверх базовой структуры есть несколько техник, проверенных практикой и исследованиями. Они особенно заметно работают на сложных задачах.&lt;/p&gt;

&lt;h3&gt;
  
  
  Few-shot: учим примерами
&lt;/h3&gt;

&lt;p&gt;Если объяснить задачу словами трудно — покажите примеры. &lt;strong&gt;Few-shot&lt;/strong&gt; (англ. «несколько примеров») — это когда в промпт встраивают 2–5 пар «вход → желаемый выход», а затем дают новый вход. Модель улавливает паттерн (формат, стиль, логику разметки) и продолжает в том же духе. Это резко повышает стабильность формата и тона — незаменимо, когда ответ потом обрабатывает код.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Классифицируй отзыв по тональности: позитив / негатив / нейтрал.

Отзыв: «Доставили быстро, всё работает» → позитив
Отзыв: «Жду заказ вторую неделю, поддержка молчит» → негатив
Отзыв: «Заказал вчера, пока ничего сказать не могу» → нейтрал

Отзыв: «Качество отличное, но дорого» →
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Противоположность — &lt;strong&gt;zero-shot&lt;/strong&gt;, когда примеров нет, только инструкция. Для простых задач zero-shot достаточно; для нетривиального формата или редкой разметки few-shot почти всегда выигрывает. Этот приём подробно изучен в исследовании, которое и ввело термин — &lt;a href="https://arxiv.org/abs/2005.14165" rel="noopener noreferrer"&gt;Brown et al., «Language Models are Few-Shot Learners» (2020)&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Цепочка рассуждений (chain-of-thought)
&lt;/h3&gt;

&lt;p&gt;Для задач, где нужен расчёт или многошаговая логика, помогает попросить модель &lt;strong&gt;рассуждать пошагово&lt;/strong&gt;, прежде чем дать ответ. Приём так и называется — «цепочка рассуждений» (chain-of-thought). Простое добавление «решай шаг за шагом» заметно повышает точность на арифметике, логике и анализе, потому что модель не «прыгает» сразу к выводу, а раскладывает путь.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Задача: в команде 4 разработчика, каждый делает по 6 задач в неделю.
Релиз через 3 недели, в бэклоге 80 задач. Успеют ли закрыть бэклог?

Рассуждай шаг за шагом, в конце дай однозначный ответ «да» или «нет»
с числом.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Здесь модель сначала посчитает пропускную способность (4 × 6 × 3 = 72), сравнит с 80 и сделает корректный вывод. Без просьбы рассуждать она чаще ошибается на таких задачах. Эффективность пошагового рассуждения показана в работе &lt;a href="https://arxiv.org/abs/2201.11903" rel="noopener noreferrer"&gt;Wei et al., «Chain-of-Thought Prompting» (2022)&lt;/a&gt;. Важный нюанс для API: пошаговые рассуждения — это дополнительные выходные токены, то есть они стоят денег; для простых задач они избыточны.&lt;/p&gt;

&lt;h3&gt;
  
  
  Итерация вместо «одного выстрела»
&lt;/h3&gt;

&lt;p&gt;Промпт-инжиниринг — это диалог, а не угадывание идеальной формулировки с первого раза. Часто эффективнее получить черновик, а затем уточнять: «сделай строже», «дай 3 варианта заголовка», «сократи второй абзац», «убери канцелярит». Модель держит контекст диалога и дорабатывает прицельно. Это дешевле и быстрее, чем переписывать промпт с нуля.&lt;/p&gt;

&lt;h3&gt;
  
  
  Управление температурой
&lt;/h3&gt;

&lt;p&gt;Через API доступен параметр &lt;code&gt;temperature&lt;/code&gt; — он регулирует «разброс» ответов. Низкая (0.0–0.3) — модель отвечает предсказуемо, почти детерминированно; нужна для фактологии, извлечения данных, кода, классификации. Высокая (0.7–1.0) — больше разнообразия и креатива; нужна для копирайтинга, идей, вариантов. Это технический рычаг между «скучно, но стабильно» и «ярко, но непредсказуемо». В веб-чате он обычно скрыт, в API — в ваших руках.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvot4h9f8cu9pslfp1utn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvot4h9f8cu9pslfp1utn.png" alt="Схема приёмов промптинга: zero-shot против few-shot с примерами и цепочка рассуждений — когда что применять" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Типичные ошибки в промптах
&lt;/h2&gt;

&lt;p&gt;Большинство неудач с нейросетями — это не «модель плохая», а «промпт плохой». Вот частые ошибки и как их чинить.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Слишком общий запрос.&lt;/strong&gt; «Расскажи про маркетинг» → модель льёт воду. Лечение: сузить — тема, аудитория, угол, объём, формат.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нет контекста, расчёт на телепатию.&lt;/strong&gt; Вы держите в голове детали, которых нет в промпте. Модель их не видит и додумывает. Лечение: вынести все вводные в текст запроса.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Несколько задач в одном промпте.&lt;/strong&gt; «Напиши статью, переведи её на английский, сделай 5 заголовков и посчитай SEO» → модель сделает всё поверхностно. Лечение: разбить на отдельные запросы или явно пронумеровать шаги.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Нет формата ответа.&lt;/strong&gt; Просите данные, а получаете прозу, которую неудобно парсить. Лечение: задать формат явно (список, таблица, JSON по схеме), при интеграции — через few-shot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Отрицания вместо инструкций.&lt;/strong&gt; «Не пиши длинно, не используй сложные слова» работает хуже, чем «пиши до 80 слов, простыми словами». Модели лучше следуют позитивным указаниям, чем запретам.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Игнорирование галлюцинаций.&lt;/strong&gt; Если не ограничить модель данными, она уверенно вставит несуществующий факт или цифру. Лечение: «опирайся только на переданные данные; если информации нет — скажи об этом». Подробнее про природу галлюцинаций — в обзоре &lt;a href="https://promptra.ru/blog/chto-takoe-neyroset" rel="noopener noreferrer"&gt;что такое нейросеть&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Завышенная температура для фактов.&lt;/strong&gt; Высокая &lt;code&gt;temperature&lt;/code&gt; на фактологичной задаче усиливает «отсебятину». Лечение: для точности ставить 0.0–0.3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Общее правило: если ответ не устроил — почти всегда проблема в постановке задачи, а не в модели. Прежде чем менять модель на более дорогую, перепишите промпт по структуре «роль → контекст → задача → формат → ограничения».&lt;/p&gt;

&lt;h2&gt;
  
  
  Готовые промпты под задачи
&lt;/h2&gt;

&lt;p&gt;Соберём рабочие шаблоны под три частых сценария. Их можно брать как основу и адаптировать.&lt;/p&gt;

&lt;h3&gt;
  
  
  Промпт для генерации текста
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Роль: ты копирайтер, пишешь для блога B2B-сервиса.
Контекст: тема — [тема]. Аудитория — [кто]. Цель текста — [зачем].
Ключевые тезисы, которые надо раскрыть: [список].
Задача: напиши [тип текста: пост / вступление / раздел].
Формат: [объём] слов, подзаголовки, короткие абзацы, маркдаун.
Ограничения: деловой тон без канцелярита; не выдумывай фактов
сверх переданных; без клише «в современном мире», «не секрет, что».
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Под текстовые задачи хорошо подходят Claude Sonnet 4.6 (210 / 1070 ₽ за 1М токенов вход/выход) и GPT-5.5 (350 / 2150 ₽) — они дают самые гладкие формулировки на русском. Для массового объёма берут дешёвые модели. Развёрнуто про выбор модели под текст — в гайде &lt;a href="https://promptra.ru/blog/neyroset-dlya-generacii-teksta" rel="noopener noreferrer"&gt;нейросеть для генерации текста&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Промпт для кода
&lt;/h3&gt;

&lt;p&gt;С кодом промпт-инжиниринг особенно важен: модели нужны язык, версии, контекст вокруг и критерий «что значит готово».&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Роль: ты senior Python-разработчик, пишешь чистый типизированный код.
Контекст: Python 3.12, FastAPI. Вот текущий эндпоинт: [код].
Задача: добавь валидацию входных данных через Pydantic и обработку
ошибки 422 с понятным сообщением.
Формат: верни только изменённый файл целиком, без объяснений.
Ограничения: не меняй сигнатуры других функций; следуй PEP 8;
если в задаче есть неоднозначность — отметь её комментарием в коде.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Для кода в нашем каталоге сильнее всего Claude Opus 4.7 (350 / 1790 ₽) и GPT-5.5; для рутины подходит и более дешёвый эшелон. Совет: давайте модели окружающий код как контекст и просите вернуть файл целиком — так меньше ошибок при вставке.&lt;/p&gt;

&lt;h3&gt;
  
  
  Промпт для анализа данных
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Роль: ты аналитик данных.
Контекст: ниже CSV с продажами по месяцам: [данные].
Задача: определи тренд, найди аномальные месяцы и назови
вероятную причину каждого отклонения.
Формат: таблица «месяц | значение | отклонение от среднего | вывод»,
затем абзац с общим трендом.
Ограничения: рассуждай шаг за шагом перед выводами; опирайся только
на переданные числа; если данных мало для вывода — скажи об этом.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Здесь полезно сочетать цепочку рассуждений (для корректных расчётов) с жёстким форматом вывода (для читаемости). Хорошо ложатся модели с длинным контекстом — Gemini 3.1 Pro (140 / 860 ₽, контекст около 1 млн токенов) проглотит большой массив за один запрос.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как применять промпты через API
&lt;/h2&gt;

&lt;p&gt;Главное удобство: всё, что мы разобрали, переносится в код один-в-один. Через OpenAI-совместимый API вы управляете системным промптом, примерами (few-shot прямо в &lt;code&gt;messages&lt;/code&gt;) и температурой. Endpoint Promptra: &lt;code&gt;https://api.promptra.ru/v1&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Базовый вызов с системным промптом (Python)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prm-xxxxxxxxxxxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic/claude-sonnet-4.6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ты редактор. Пишешь на русском, по делу, без воды. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Опираешься только на переданный текст.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
 &lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Сократи вдвое, сохрани цифры:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Чтобы сменить модель — поменяйте одну строку &lt;code&gt;model&lt;/code&gt;. Идентификаторы из каталога: &lt;code&gt;anthropic/claude-opus-4.7&lt;/code&gt;, &lt;code&gt;anthropic/claude-sonnet-4.6&lt;/code&gt;, &lt;code&gt;openai/gpt-5.5&lt;/code&gt;, &lt;code&gt;openai/gpt-5.4&lt;/code&gt;, &lt;code&gt;google/gemini-3.1-pro-preview&lt;/code&gt;, &lt;code&gt;deepseek/deepseek-v4-pro&lt;/code&gt;, &lt;code&gt;z-ai/glm-5.1&lt;/code&gt;, &lt;code&gt;qwen/qwen3.6-plus&lt;/code&gt;. Промпт-структура и &lt;code&gt;temperature&lt;/code&gt; остаются прежними.&lt;/p&gt;

&lt;h3&gt;
  
  
  Few-shot прямо в сообщениях (Node.js)
&lt;/h3&gt;

&lt;p&gt;Примеры удобно передавать как чередование &lt;code&gt;user&lt;/code&gt; / &lt;code&gt;assistant&lt;/code&gt; — модель воспринимает это как образцы диалога:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PROMPTRA_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deepseek/deepseek-v4-pro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Определи тональность: позитив/негатив/нейтрал. Ответ одним словом.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Доставили быстро, всё работает&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;позитив&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Жду заказ вторую неделю&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;негатив&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Качество отличное, но дорого&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
 &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Проверка одним curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.promptra.ru/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer prm-xxxxxxxxxxxx"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
 "model": "openai/gpt-5.5",
 "messages": [
 {"role": "system", "content": "Ты лаконичный ассистент."},
 {"role": "user", "content": "Объясни промпт-инжиниринг в одном предложении"}
 ],
 "temperature": 0.3
 }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если в ответе пришёл JSON с полем &lt;code&gt;content&lt;/code&gt; — endpoint и ключ живые. Подключение к самой популярной линейке разобрано на странице &lt;a href="https://promptra.ru/api/chatgpt" rel="noopener noreferrer"&gt;ChatGPT (GPT) API за рубли&lt;/a&gt;, а сравнение моделей по силе и цене — в обзоре &lt;a href="https://promptra.ru/blog/top-5-llm-2026" rel="noopener noreferrer"&gt;топ-5 LLM 2026&lt;/a&gt;. Цены в Promptra — 1-в-1 с провайдером по курсу ЦБ (71.668 ₽/$ на 2026-05-27), без наценки на токены; сервисная комиссия 5% берётся только при пополнении баланса.&lt;/p&gt;

&lt;h2&gt;
  
  
  Оплата API на юрлицо в рублях
&lt;/h2&gt;

&lt;p&gt;Если нейросеть с продуманными промптами встраивается в продукт или используется командой, важен не только сам API, но и как за него платить. Прямая оплата OpenAI, Anthropic или Google из России для юрлица упирается в две вещи: эти сервисы не принимают российские карты и реквизиты, а платёж за рубеж без правильных документов сложно поставить в учёт.&lt;/p&gt;

&lt;p&gt;Через Promptra API оплачивается на российское юрлицо — оплата в рублях по договору, полный пакет закрывающих документов. На каждое пополнение баланса выдаются договор-оферта, счёт, акт, счёт-фактура и УПД; документооборот идёт через ЭДО (Диадок, СБИС), поэтому документы автоматически попадают в учётную систему. Цены на токены — 1-в-1 с провайдером по курсу ЦБ, без наценки; сервисная комиссия 5% — только при пополнении баланса. VPN не нужен: запросы уходят на endpoint агрегатора, а он сам обращается к провайдеру. Подробно про документы и легальность — в материале &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;легально ли использовать AI API на юрлицо&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1s7d48yfpnyits7uog6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1s7d48yfpnyits7uog6.png" alt="Схема: продуманный промпт через OpenAI-совместимый API уходит в выбранную модель и возвращает стабильный результат, оплата в рублях на юрлицо" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>llm</category>
    </item>
    <item>
      <title>Polza.ai или Promptra: что выбрать бизнесу</title>
      <dc:creator>Promptra Team</dc:creator>
      <pubDate>Mon, 15 Jun 2026 17:05:05 +0000</pubDate>
      <link>https://dev.to/promptra-team/polzaai-ili-promptra-chto-vybrat-bizniesu-51lk</link>
      <guid>https://dev.to/promptra-team/polzaai-ili-promptra-chto-vybrat-bizniesu-51lk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ws24kpw08mg0nur51ev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ws24kpw08mg0nur51ev.png" alt="Сравнительная инфографика двух сервисов: слева блок «Polza.ai — pass-through, 250+ моделей» с плотной сеткой карточек, справа блок «Promptra — ООО, закрывающие документы» с компактной цепочкой первички и печатью, между блоками вертикальная разделительная линия, кремовый фон, терракотовые акценты, русские подписи" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Коротко для тех, кто пришёл за ответом: &lt;strong&gt;Polza.ai и Promptra — это два российских ООО-агрегатора зарубежных LLM по API, и выбор между ними упирается в две оси — каталог против оформления.&lt;/strong&gt; Polza.ai — бюджетный pass-through сервис с очень широким каталогом (на главной заявлено более 250 моделей) и минимальной наценкой, близкой к долларовой цене провайдеров; член АЛРИИ. Promptra — сервис с ценой на токены 1-в-1 с провайдером по курсу ЦБ (наценка 0%), 5% сервисной комиссией только при пополнении баланса и полным пакетом закрывающих документов через ЭДО как стандарт, оплата на юр.лицо российское юр.лицо. Если ваш приоритет — максимально дёшево перепробовать сотни моделей, логичный выбор — Polza.ai. Если приоритет — предсказуемая B2B-инфраструктура с фиксированной экономикой и закрывающими документами как стандарт — это к нам.&lt;/p&gt;

&lt;p&gt;Я работаю в Promptra, поэтому сразу честно: это не «обзор-разоблачение». Polza.ai — крепкий продукт с реальными преимуществами, и по двум параметрам — широте каталога и низкой цене на токены — они объективно сильны. Цель статьи — разложить по полочкам критерии (наценка, каталог, документы, бизнес-модель, поддержка), чтобы вы выбрали под свою задачу осознанно, а не по громкости рекламы.&lt;/p&gt;

&lt;p&gt;Все цены Promptra ниже — на 27.05.2026 при курсе ЦБ РФ 71.668 ₽/USD, пересчёт из официального долларового прайса провайдеров. По Polza.ai я &lt;strong&gt;не привожу конкретные рублёвые ценники&lt;/strong&gt;: их тарифы — на их стороне и могут меняться, актуальные цифры смотрите на &lt;a href="https://polza.ai" rel="noopener noreferrer"&gt;polza.ai&lt;/a&gt;, а здесь я разбираю методологию и структуру, а не пытаюсь зафиксировать чужой прайс на один день.&lt;/p&gt;

&lt;h2&gt;
  
  
  Кто такие Polza.ai и Promptra
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Polza.ai&lt;/strong&gt; — российский агрегатор доступа к LLM по pass-through модели: цена токена близка к долларовой цене провайдера, заработок сервиса идёт через минимальную наценку и сопутствующие сервисы. На главной странице сервис заявляет &lt;strong&gt;более 250 моделей&lt;/strong&gt; через единый OpenAI-совместимый API — один из самых широких каталогов на рынке. Юр.форма — ООО, сервис состоит в &lt;strong&gt;АЛРИИ&lt;/strong&gt; (Ассоциация лабораторий по развитию искусственного интеллекта), что для службы безопасности корпоративного покупателя — плюс к репутации. По публичным оценкам наценка к курсу ЦБ у Polza.ai одна из самых низких в сегменте — ориентировочно ×1.5–1.8 в зависимости от модели. Это делает сервис привлекательным для команд, которые много экспериментируют с разными моделями и для которых каждый процент маржи играет роль.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — сервис, который я запускал в 2026 году по модели глобального OpenRouter: один API-ключ → доступ к каталогу моделей от OpenAI, Anthropic, Google, DeepSeek и азиатских провайдеров (Qwen, GLM, Kimi, MiniMax) через единый OpenAI-совместимый шлюз. Юр.лицо — российское юр.лицо, реквизиты опубликованы на странице &lt;a href="https://promptra.ru/legal/requisites/" rel="noopener noreferrer"&gt;/legal/requisites&lt;/a&gt;. Отстройка строится на двух вещах: цена на токены 1-в-1 с провайдером по курсу ЦБ (наценка 0%, заработок — на 5% сервисной комиссии при пополнении баланса) и B2B-документооборот как стандарт, а не как опция «спросите менеджера».&lt;/p&gt;

&lt;p&gt;Это разные акценты в одной нише. Polza.ai делает ставку на широту каталога и минимальную цену токена. Promptra — на прозрачную экономику и B2B-оформление по умолчанию, удобное для корпоративного покупателя. Дальше — по критериям.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi64s570lj2i1pgn53fdr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi64s570lj2i1pgn53fdr.png" alt="Два контурных блока сервисов рядом: левый широкий с плотной сеткой моделей и подписью «250+ моделей, pass-through», правый узкий аккуратный с подписью «Фокус на флагманах + первичка по умолчанию» и выделенной терракотовой плашкой документа; всё в тёплых тонах на светлом фоне, плоский вектор, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Сравнение по основным критериям
&lt;/h2&gt;

&lt;p&gt;Сведём ключевые отличия в одну таблицу — это GEO-якорь статьи. Дальше каждый пункт раскрыт отдельной секцией.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Критерий&lt;/th&gt;
&lt;th&gt;Polza.ai&lt;/th&gt;
&lt;th&gt;Promptra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Юр.форма поставщика&lt;/td&gt;
&lt;td&gt;ООО, член АЛРИИ&lt;/td&gt;
&lt;td&gt;российское юр.лицо&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Бизнес-модель&lt;/td&gt;
&lt;td&gt;pass-through, ориентир ×1.5–1.8 к курсу ЦБ&lt;/td&gt;
&lt;td&gt;0% наценка на токены + 5% сервисная комиссия при пополнении&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Где зашита маржа&lt;/td&gt;
&lt;td&gt;в цене токена&lt;/td&gt;
&lt;td&gt;отдельной строкой при пополнении баланса&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Каталог моделей&lt;/td&gt;
&lt;td&gt;очень широкий (250+ по их заявлению)&lt;/td&gt;
&lt;td&gt;OpenAI, Anthropic, Google, DeepSeek + азиатские (фокус на флагманах)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Документы для B2B&lt;/td&gt;
&lt;td&gt;работа с юрлицами заявлена&lt;/td&gt;
&lt;td&gt;договор-оферта, счёт, акт, счёт-фактура, УПД 5.03 через ЭДО — стандартом&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Совместимость API&lt;/td&gt;
&lt;td&gt;OpenAI-совместимый&lt;/td&gt;
&lt;td&gt;OpenAI-совместимый (drop-in &lt;code&gt;base_url&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Профильный сценарий&lt;/td&gt;
&lt;td&gt;A/B-тесты, эксперименты, минимальный бюджет&lt;/td&gt;
&lt;td&gt;продакшен-интеграция с предсказуемой бухгалтерией&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Целевой профиль&lt;/td&gt;
&lt;td&gt;команды, которым важна минимальная цена и широта каталога&lt;/td&gt;
&lt;td&gt;B2B-команды, которым нужна первичка и предсказуемый счёт&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Две оговорки к таблице. Первое: «ориентир ×1.5–1.8» — это оценка с открытых источников и наших публичных карточек конкурентов, для конкретной модели точное число берите на сайте Polza.ai и под свой объём. Второе: «работа с юрлицами заявлена» у Polza.ai — это не упрёк; они работают как ООО и оформляют отношения с компаниями. Конкретный состав закрывающих документов (входит ли УПД 5.03 в стандартный пакет, через какого оператора ЭДО) — нормальный вопрос к любому поставщику, его стоит задать напрямую до подключения.&lt;/p&gt;

&lt;h2&gt;
  
  
  Бизнес-модель: pass-through против фиксированной комиссии
&lt;/h2&gt;

&lt;p&gt;Главное различие между Polza.ai и Promptra — &lt;strong&gt;где у сервиса зашита маржа&lt;/strong&gt;. Это не оценочный вопрос «у кого хуже», это просто две разные модели монетизации, и обе имеют право на жизнь — но они подходят разным сценариям.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pass-through (Polza.ai)
&lt;/h3&gt;

&lt;p&gt;Pass-through — значит «провели цену сквозь себя». Сервис покупает токены у провайдера в долларах, конвертирует в рубли с минимальной маржой и продаёт вам. Цена на сайте уже включает наценку — небольшую, но включает. По публичным оценкам у Polza.ai это ориентировочно ×1.5–1.8 к курсу ЦБ в зависимости от модели; конкретное число лучше уточнить под вашу модель на их сайте.&lt;/p&gt;

&lt;p&gt;Плюс этой модели: &lt;strong&gt;простая ментальная картина&lt;/strong&gt;. Видите на сайте 100 ₽ за миллион токенов — платите 100 ₽ за миллион токенов, без отдельной комиссии за пополнение. Удобно для команд, которые мыслят в логике «купил пакет — потратил по факту».&lt;/p&gt;

&lt;p&gt;Минус: маржа размазана по каждому запросу и зависит от модели. Если ваш месячный объём вырос с миллиона токенов до десяти миллионов — и маржа выросла линейно. Кроме того, в низкомаржинальной модели &lt;strong&gt;устойчивость сервиса опирается на объём и/или инвестиции&lt;/strong&gt;: чтобы держать минимальную наценку, нужно либо очень много клиентов, либо внешнее финансирование. Это нормально, но это стоит закладывать в долгосрочные планы инфраструктуры.&lt;/p&gt;

&lt;h3&gt;
  
  
  Фиксированная сервисная комиссия при пополнении (Promptra)
&lt;/h3&gt;

&lt;p&gt;У нас цена токена — &lt;strong&gt;1-в-1 с провайдером по курсу ЦБ&lt;/strong&gt;, наценка ноль. Заработок сервиса — &lt;strong&gt;5% сервисная комиссия&lt;/strong&gt;, которая берётся &lt;strong&gt;только при пополнении баланса&lt;/strong&gt;, один раз, не от токенов. Положили на баланс 100 000 ₽ → списали 5 000 ₽ комиссии (за эквайринг, документооборот и работу сервиса) → на балансе 95 000 ₽, которые тратите по долларовой цене провайдера в пересчёте по курсу ЦБ дня.&lt;/p&gt;

&lt;p&gt;Плюс этой модели: &lt;strong&gt;экономика предсказуема и масштабируется в вашу пользу&lt;/strong&gt;. Прибавили объём в десять раз — комиссия сервиса по-прежнему 5% от пополнения, а цена за токен не меняется. На больших и стабильных объёмах эффективная наценка получается около ×1.05 — это конкурентно с любой pass-through моделью. Кроме того, отдельная комиссия за пополнение прозрачна для бухгалтерии: вы видите конкретную строку «комиссия сервиса 5%» в первичке.&lt;/p&gt;

&lt;p&gt;Минус: на очень маленьких объёмах (тестовые 500 ₽ на пробу) комиссия за пополнение психологически заметнее, чем размазанная по токенам наценка. Для команд, у которых задача — потратить 200 ₽ и закрыть, pass-through ощущается проще.&lt;/p&gt;

&lt;h3&gt;
  
  
  Когда какая модель выгоднее
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Малый и переменный объём, много экспериментов&lt;/strong&gt; → ваша картина мира — «зашёл, потратил, ушёл», и pass-through часто удобнее. Polza.ai в этой логике сильна.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Регулярный продакшен-объём с прогнозируемым бюджетом&lt;/strong&gt; → 0% наценка на токены + 5% при пополнении даёт более низкую эффективную ставку и предсказуемый счёт. Promptra сделан под это.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B2B с бухгалтерией, которой важна структура первички&lt;/strong&gt; → отдельная строка «сервисная комиссия» в документах часто чище, чем размазанная маржа.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Это не про «у кого дешевле» — это про &lt;strong&gt;под какой профиль использования заточена модель монетизации&lt;/strong&gt;. Прежде чем выбирать, прикиньте свой реальный месячный объём и формат расходов.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fav9bp263sr2jwt43e4b4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fav9bp263sr2jwt43e4b4.png" alt="Сравнительная схема двух бизнес-моделей: слева горизонтальная полоса «Pass-through» — длинный сегмент «цена токена + минимальная маржа сервиса» в одной заливке; справа полоса «Promptra» — цельный сегмент «токены по курсу ЦБ, 0% наценка» и отдельный короткий терракотовый хвост «5% при пополнении баланса»; заголовок «Где зашита маржа», подписи на русском, кремовый фон, плоский вектор" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Цена за токен: методология вместо чужого прайса
&lt;/h2&gt;

&lt;p&gt;Здесь я сознательно не вставляю конкретные рублёвые ценники Polza.ai. Причина та же, что и с любым конкурентом: чужой прайс живёт на чужом сайте, меняется, и фиксировать его в статье на одну дату — значит вводить читателя в заблуждение через неделю. Поэтому разберём методологию, по которой стоит сравнивать любой сервис, и покажу нашу часть с открытыми цифрами.&lt;/p&gt;

&lt;p&gt;Чтобы честно сравнить два сервиса, нужно привести обе модели к общему знаменателю — &lt;strong&gt;сколько вы реально заплатите за миллион входящих и исходящих токенов конкретной модели, со всеми комиссиями&lt;/strong&gt;. Маркетинговая фраза «у нас 250+ моделей» или «у нас цена по курсу ЦБ» без привязки к конкретной модели и итоговой сумме — это не цифра, а лозунг. Для pass-through сервиса итог — это цена на сайте за миллион токенов (она уже включает их маржу). Для нашей модели итог — это цена на сайте за миллион токенов плюс 5% сервисной комиссии, заложенной в пополнение.&lt;/p&gt;

&lt;p&gt;Вот наша сторона, открыто. Promptra держит цену токенов 1-в-1 с провайдером по курсу ЦБ (наценка 0%), а зарабатывает на 5% сервисной комиссии при пополнении баланса. Пересчёт из официального долларового прайса провайдеров по курсу ЦБ 71.668 ₽/USD на 27.05.2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;USD input / output (за 1M)&lt;/th&gt;
&lt;th&gt;Promptra input / output (₽ за 1M)&lt;/th&gt;
&lt;th&gt;Источник прайса&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5 / $30&lt;/td&gt;
&lt;td&gt;350 / 2150&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;developers.openai.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;$2.5 / $15&lt;/td&gt;
&lt;td&gt;170 / 1070&lt;/td&gt;
&lt;td&gt;то же&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;$0.75 / $4.5&lt;/td&gt;
&lt;td&gt;50 / 320&lt;/td&gt;
&lt;td&gt;то же&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.7&lt;/td&gt;
&lt;td&gt;$5 / $25&lt;/td&gt;
&lt;td&gt;350 / 1790&lt;/td&gt;
&lt;td&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;platform.claude.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;td&gt;$3 / $15&lt;/td&gt;
&lt;td&gt;210 / 1070&lt;/td&gt;
&lt;td&gt;то же&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;$2 / $12&lt;/td&gt;
&lt;td&gt;140 / 860&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;ai.google.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM 5.1&lt;/td&gt;
&lt;td&gt;$1.4 / $4.4&lt;/td&gt;
&lt;td&gt;100 / 310&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.z.ai/guides/overview/pricing" rel="noopener noreferrer"&gt;docs.z.ai&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Plus&lt;/td&gt;
&lt;td&gt;$0.325 / $1.95&lt;/td&gt;
&lt;td&gt;20 / 130&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.alibabacloud.com/help/en/model-studio/model-pricing" rel="noopener noreferrer"&gt;alibabacloud.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Как пользоваться этой таблицей при сравнении с Polza.ai: возьмите ту же модель на &lt;a href="https://polza.ai" rel="noopener noreferrer"&gt;их сайте&lt;/a&gt;, посмотрите цену за миллион токенов на странице тарифов — это конечная сумма за токен у них, с уже включённой наценкой. Сопоставьте с цифрой из колонки Promptra плюс 5% от вашего пополнения. Если вы планируете тратить 100 000 ₽ в месяц — 5% это 5 000 ₽, и вы сможете прикинуть, перевешивает ли это разница в цене токена под ваш профиль. На малом объёме pass-through часто выходит дешевле, на крупном и регулярном — паритет или преимущество в нашу сторону, плюс более чистая структура для бухгалтерии.&lt;/p&gt;

&lt;h3&gt;
  
  
  Про DeepSeek и промо-цены — отдельная осторожность
&lt;/h3&gt;

&lt;p&gt;Один частый источник путаницы при сравнении агрегаторов — &lt;strong&gt;промо-цены провайдеров&lt;/strong&gt;. Например, DeepSeek V4 Pro на 27.05.2026 стоит у провайдера $0.435 / $0.87 за миллион токенов (это &lt;strong&gt;30 / 60 ₽&lt;/strong&gt; по курсу ЦБ) — но это &lt;strong&gt;промо со скидкой 75%, которое заканчивается 31.05.2026&lt;/strong&gt;. После окончания базовая цена вернётся к примерно $1.74 / $3.48 (около 120 / 240 ₽). Если один сервис показывает промо-цену, а другой — уже базовую, прямое сравнение «у кого дешевле DeepSeek» будет некорректным. Всегда уточняйте, акционная цена перед вами или постоянная, и до какой даты она действует.&lt;/p&gt;

&lt;h2&gt;
  
  
  Каталог моделей: ширина против фокуса
&lt;/h2&gt;

&lt;p&gt;Здесь — честное преимущество Polza.ai. Их позиционирование «250+ моделей» — это про охват, и для ряда сценариев это реально полезно.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polza.ai&lt;/strong&gt; делает ставку на широту: чем больше моделей за одним ключом, тем выше шанс, что найдётся ровно та, что нужна под нишевую задачу — редкий язык, специфический open-weight чекпойнт, экзотический мультимодальный вариант, нестандартный fine-tune. Если ваш кейс — «перепробовать десятки моделей и найти оптимум», или вам нужны модели, которые не входят в стандартную обойму флагманов, широкий каталог экономит время на интеграции разных провайдеров поодиночке. Это объективное преимущество, и в этом сценарии Polza.ai выигрывает.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; идёт по пути фокуса на флагманах и рабочих лошадках, которые покрывают подавляющее большинство production-задач:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; — GPT-5.5, GPT-5.4, GPT-5.4 Mini, GPT-5.3 Codex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic&lt;/strong&gt; — Claude Opus 4.7, Claude Sonnet 4.6, Claude Haiku 4.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google&lt;/strong&gt; — Gemini 3.1 Pro, Gemini 3.5 Flash, Gemini 3.1 Flash Lite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek&lt;/strong&gt; — V4 Pro (сильна в коде и матлогике за копейки)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Азиатские&lt;/strong&gt; — Qwen 3.6 Plus (Alibaba), GLM 5.1 (Z.ai), Kimi K2.5 (Moonshot), MiniMax M2.7&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Мультимодальные&lt;/strong&gt; — генерация изображений (Nano Banana Pro, GPT Image 2) и видео (Veo 3.1, Seedance 2.0, Kling v3)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Плюс широкого каталога — гибкость и шанс найти нишевый оптимум. Минус — за сотнями моделей сложнее уследить, какие из них реально стабильны и активно мониторятся на качество; часть «галочек в списке» может быть редко используемыми endpoint-ами с неопределённым SLA. Плюс фокусированного каталога — за каждой моделью стоит понятная роль и регулярная проверка. Минус — если вам нужна именно экзотика, которой в фокус-наборе нет, придётся искать её в другом месте.&lt;/p&gt;

&lt;p&gt;Практический критерий выбора: &lt;strong&gt;выпишите модели, которые реально нужны вашему проекту, и проверьте наличие каждой у обоих сервисов.&lt;/strong&gt; Число «250+» само по себе ничего не говорит, если 245 из них вы никогда не вызовете. И наоборот — если вам нужна одна редкая модель, которой нет в фокус-наборе Promptra, ширина каталога Polza.ai решает.&lt;/p&gt;

&lt;h2&gt;
  
  
  Документы для бухгалтерии: что вы получите
&lt;/h2&gt;

&lt;p&gt;Эту часть разработчики обычно пропускают, а бухгалтерия проверяет первой. От пакета документов зависит, сможете ли вы вообще принять расход к учёту без вопросов от ФНС.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polza.ai&lt;/strong&gt; — это ООО и член АЛРИИ, работа с юрлицами заявлена, и для серьёзного по обороту B2B это база. Конкретный состав закрывающих документов под российское юр.лицо стоит уточнить напрямую у них до подключения: какой пакет первички вы получаете (договор, акт, счёт-фактура, УПД), через какого оператора ЭДО они работают. Это нормальный вопрос к любому поставщику — просто его стоит задать письменно и сохранить ответ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; ориентирован на B2B-сценарий с первого дня, и пакет фиксирован: договор-оферта, счёт на оплату, акт оказанных услуг, счёт-фактура и &lt;strong&gt;УПД формата 5.03 через ЭДО&lt;/strong&gt; (Диадок, СБИС, 1С-ЭДО) — это стандарт, а не доплата. Оплата идёт на одно российское юр.лицо — российское юр.лицо, реквизиты опубликованы на странице &lt;a href="https://promptra.ru/legal/requisites/" rel="noopener noreferrer"&gt;/legal/requisites&lt;/a&gt; для проверки контрагента. С 1 января 2026 года формат &lt;a href="https://tochka.com/knowledge/edo/s-2026-goda-upd-stanovitsya-edinstvennym-elektronnym-dokumentom-fns-otmenyaet-starye-formaty/" rel="noopener noreferrer"&gt;УПД 5.03 стал единственным легитимным электронным форматом&lt;/a&gt; для закрывающих документов — это не наша прихоть, а требование ФНС.&lt;/p&gt;

&lt;p&gt;Важный нюанс, который касается обоих сервисов: формулировка предмета услуги в акте и УПД должна быть развёрнутой («предоставление доступа к API больших языковых моделей за период…»), иначе при проверке инспектор вправе усомниться в экономической обоснованности расхода (ст. 252 НК РФ). Подробный разбор того, какие документы нужны и какие ошибки бухгалтерии налоговая снимает с базы, — в нашем материале &lt;a href="https://promptra.ru/blog/zakryvayushchie-dokumenty-ai" rel="noopener noreferrer"&gt;про закрывающие документы по нейросетям&lt;/a&gt;. А по вопросу легальности самой схемы оплаты зарубежных LLM на российское юр.лицо — отдельный разбор: &lt;a href="https://promptra.ru/blog/legalno-li-ai-api-yurlico" rel="noopener noreferrer"&gt;легально ли использовать OpenAI/Claude на юрлицо в РФ&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujqbtwdmqx9y0boieahv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujqbtwdmqx9y0boieahv.png" alt="Поток документооборота как горизонтальная цепочка из пяти связанных прямоугольных карточек с подписями «Договор-оферта», «Счёт», «Акт», «Счёт-фактура», «УПД 5.03», идущих слева направо со стрелками между ними, последняя карточка с символом печати и значком ЭДО (Диадок/СБИС), заголовок «Стандартный пакет первички», тёплые кремово-терракотовые тона, плоский вектор, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Где Polza.ai сильнее
&lt;/h2&gt;

&lt;p&gt;Без перетягивания одеяла — две реальные сильные стороны Polza.ai, которые честно стоит признать.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Первое — минимальная цена на токены и широкий каталог.&lt;/strong&gt; Если ваш сценарий — «много экспериментов, минимальный бюджет, переменный объём», pass-through модель с маржой ×1.5–1.8 даёт более низкий чек на коротком горизонте, особенно при малом потреблении. Каталог 250+ моделей — это про шансы найти именно тот чекпойнт или fine-tune, который вам нужен.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Второе — членство в АЛРИИ как репутационный сигнал.&lt;/strong&gt; Для отдела безопасности крупной компании факт, что поставщик состоит в отраслевой ассоциации, — это плюс к оценке устойчивости и зрелости.&lt;/p&gt;

&lt;p&gt;Если эти два фактора для вас приоритетны — Polza.ai объективно сильный кандидат, и в части сценариев он будет лучше нас. Это нормально, у разных продуктов разные ниши.&lt;/p&gt;

&lt;h2&gt;
  
  
  Где Promptra удобнее для B2B
&lt;/h2&gt;

&lt;p&gt;Тоже без перетягивания — три места, где у нас структурное преимущество для команды, которой важна B2B-инфраструктура.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Первое — предсказуемая экономика на масштабе.&lt;/strong&gt; На малом объёме разница в моделях незаметна, но при росте до 100–500 тысяч ₽/мес «0% наценка + 5% при пополнении» даёт более низкую эффективную ставку и более прозрачный счёт, чем размазанная по каждому токену маржа. Эта же структура чище для бухгалтерии: отдельная строка «сервисная комиссия» в первичке вместо «непонятной разницы» между долларовой ценой провайдера и рублёвым счётом.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Второе — закрывающие документы и УПД 5.03 как стандарт.&lt;/strong&gt; Не «уточняйте у менеджера», а зафиксированный пакет на одно ООО с публичными реквизитами. Это закрывает запрос бухгалтерии в первый же день подключения, без переписки и без сюрпризов на этапе акта.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Третье — прямой контакт с командой на подключении.&lt;/strong&gt; У нас весь онбординг идёт через CEO напрямую в Telegram, без многоступенчатого тикет-конвейера. Это не масштабируется на тысячи нетехнических пользователей, но даёт скорость и гибкость для команды, которая подключается на кастомных условиях (особый объём, особый набор моделей, особый формат счёта).&lt;/p&gt;

&lt;p&gt;То есть мы не «лучше во всём» — мы заточены под профиль «B2B-команда, регулярный продакшен-объём, требование чёткой первички», и в этом профиле у нас есть структурное преимущество.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gj0mi6ax4v1zmk21e8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gj0mi6ax4v1zmk21e8t.png" alt="Дерево решений как flowchart: верхний ромб-вопрос «Что важнее для вас?» с тремя выходами вниз — левая ветвь «Минимальная цена + 250+ моделей для экспериментов» ведёт к подписанному прямоугольнику-исходу «Polza.ai», центральная ветвь «Предсказуемая бухгалтерия + первичка стандартом» ведёт к терракотовому прямоугольнику-исходу «Promptra», правая ветвь «И каталог, и документы — нужно сравнить под объём» ведёт к ромбу «Оцените месячный объём» с двумя дочерними исходами; заголовок «Дерево выбора», тёплая палитра, плоский вектор, русские подписи" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Как мигрировать с Polza.ai на Promptra
&lt;/h2&gt;

&lt;p&gt;Оба сервиса дают OpenAI-совместимый API — это значит, что миграция в обе стороны сводится к &lt;strong&gt;замене &lt;code&gt;base_url&lt;/code&gt; и API-ключа в вашем существующем коде&lt;/strong&gt;. Никакого переписывания SDK: меняете адрес и ключ, остальное работает как раньше.&lt;/p&gt;

&lt;p&gt;Для Promptra drop-in выглядит так:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ваш-ключ-promptra&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic/claude-sonnet-4.6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Привет!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PROMPTRA_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.promptra.ru/v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai/gpt-5.4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Привет!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Имена моделей указываются в формате &lt;code&gt;провайдер/модель&lt;/code&gt; (например, &lt;code&gt;openai/gpt-5.4&lt;/code&gt; или &lt;code&gt;anthropic/claude-opus-4.7&lt;/code&gt;). Если вы уже писали код под OpenAI SDK или дёргали любой OpenRouter-подобный сервис, переключение занимает минуты. Подробный разбор миграции (Python/Node/Go) — в нашем гайде &lt;a href="https://promptra.ru/blog/migraciya-openai-sdk-base-url" rel="noopener noreferrer"&gt;миграция с OpenAI SDK: меняем base_url&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Важная оговорка: при миграции &lt;strong&gt;сверьте набор моделей&lt;/strong&gt;. Если у вас в коде Polza.ai использовалась нишевая модель, которой нет в фокус-наборе Promptra, её придётся либо заменить на ближайший флагман, либо оставить за Polza.ai и использовать оба сервиса параллельно — это нормальная стратегия multi-provider routing для продакшена.&lt;/p&gt;

&lt;h2&gt;
  
  
  Поддержка и подключение
&lt;/h2&gt;

&lt;p&gt;Оба сервиса оформляют отношения с юр.лицами, и оба дают OpenAI-совместимый endpoint. Разница — в философии онбординга.&lt;/p&gt;

&lt;p&gt;Polza.ai как сервис с массовым каталогом и self-service моделью выстраивает поддержку под объём: документация, FAQ, тикет-система. Это нормально и масштабируется на большое число клиентов одновременно.&lt;/p&gt;

&lt;p&gt;Promptra на текущем этапе делает ставку на прямой контакт: все вопросы по подключению идут напрямую в Telegram к команде, без многоступенчатого тикет-конвейера. У каждого подхода свои плюсы: массовая поддержка лучше масштабируется на тысячи клиентов, прямой контакт быстрее для нестандартных вопросов, подключения с кастомным объёмом и подбора набора моделей под конкретную задачу.&lt;/p&gt;

&lt;h2&gt;
  
  
  Когда выбирать Polza.ai, а когда Promptra
&lt;/h2&gt;

&lt;p&gt;Честный decision tree без перетягивания одеяла.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Выбирайте Polza.ai, если:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ваш приоритет — &lt;strong&gt;минимальная цена на токены&lt;/strong&gt; на малом и переменном объёме, и каждый процент маржи играет роль;&lt;/li&gt;
&lt;li&gt;вам нужен &lt;strong&gt;максимально широкий каталог моделей&lt;/strong&gt;, включая нишевые, экзотические и open-weight варианты, которых нет в фокус-наборах конкурентов;&lt;/li&gt;
&lt;li&gt;ваша задача — много &lt;strong&gt;экспериментировать&lt;/strong&gt; с разными моделями за одним ключом, искать оптимум методом перебора;&lt;/li&gt;
&lt;li&gt;членство в АЛРИИ — значимый сигнал для вашей службы безопасности.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Выбирайте Promptra, если:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;у вас регулярный &lt;strong&gt;продакшен-объём&lt;/strong&gt; с прогнозируемым бюджетом, и «0% наценка + 5% при пополнении» даёт более низкую эффективную ставку;&lt;/li&gt;
&lt;li&gt;вам нужна &lt;strong&gt;предсказуемая бухгалтерия&lt;/strong&gt;: чёткая структура первички (отдельная строка «сервисная комиссия», полный пакет закрывающих документов через ЭДО) с первого дня;&lt;/li&gt;
&lt;li&gt;вам достаточно &lt;strong&gt;фокусированного каталога флагманов&lt;/strong&gt; (GPT, Claude, Gemini, DeepSeek + азиатские), и вы предпочитаете, чтобы за каждой моделью стояла понятная роль;&lt;/li&gt;
&lt;li&gt;вам нужен &lt;strong&gt;прямой контакт с командой&lt;/strong&gt; для подключения на кастомных условиях (особый объём, особый формат счёта).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Универсальный совет для любого выбора:&lt;/strong&gt; не верьте ни Polza.ai, ни мне на слово. Сделайте три вещи. Первое — выпишите нужные именно вам модели и проверьте их наличие у обоих сервисов. Второе — посчитайте итоговую сумму под ваш реальный месячный объём по обеим моделям монетизации (pass-through цена × объём для Polza.ai vs цена по курсу ЦБ × объём + 5% от пополнений для нас). Третье — запросите образец договора и счёта-фактуры и покажите бухгалтеру. Выбор инфраструктурного поставщика — как выбор любой критической инфраструктуры: с проверкой документов и тестом под свою задачу, а не «по статье из интернета», включая эту.&lt;/p&gt;

&lt;p&gt;Если хотите сравнить Promptra с другими игроками рынка — у нас есть разборы &lt;a href="https://promptra.ru/blog/aitunnel-vs-promptra" rel="noopener noreferrer"&gt;AITUNNEL vs Promptra&lt;/a&gt; (ширина каталога и формат юр.лица поставщика), &lt;a href="https://promptra.ru/blog/bothub-vs-promptra" rel="noopener noreferrer"&gt;BotHub vs Promptra&lt;/a&gt; (веб-чат vs чистый API) и общий обзор &lt;a href="https://promptra.ru/blog/luchshie-agregatory-llm-api-rossiya-2026" rel="noopener noreferrer"&gt;лучших агрегаторов LLM API в России 2026&lt;/a&gt;. Если вы пришли за конкретной моделью — отдельная страница &lt;a href="https://promptra.ru/api/chatgpt" rel="noopener noreferrer"&gt;ChatGPT API через Promptra&lt;/a&gt; показывает, как подключить GPT через нас за пять минут.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Promptra&lt;/strong&gt; — Russian LLM API aggregator. One OpenAI-compatible endpoint to all flagship models: OpenAI (GPT-5.5, GPT-5.4), Anthropic (Claude Opus 4.7, Sonnet 4.6), Google (Gemini 3.1 Pro, 3.5 Flash), DeepSeek V4 Pro, Qwen 3.6 Plus.&lt;/p&gt;

&lt;p&gt;Provider prices 1-to-1 at CBR rate — no markup on tokens. Ruble billing per contract, full closing documents through EDI. No VPN — legal B2B service in Russia.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://promptra.ru" rel="noopener noreferrer"&gt;promptra.ru&lt;/a&gt; · &lt;a href="https://promptra.ru/models" rel="noopener noreferrer"&gt;model catalog&lt;/a&gt; · &lt;a href="https://promptra.ru/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>polza</category>
      <category>polzaai</category>
      <category>promptra</category>
      <category>api</category>
    </item>
  </channel>
</rss>
