promptra
← Все статьи
Гайды8 мин чтения

LLM API на Python: полный технический гид 2026 — токены, streaming, function calling, RAG, batch

Полный технический гид по работе с LLM API на Python в 2026: расчёт стоимости через токены, function calling и tool use, streaming через SSE, embeddings для RAG, async и Batch API для скидки 50%. Все шаги с runnable code и cost-формулами в рублях по курсу ЦБ.

Mind map: 5 столпов работы с LLM API на Python — tokenizer, function calling, streaming, RAG embeddings, async batch — соединены центральным узлом OpenAI-compatible endpoint, на тёплом кремовом фоне в editorial vector

LLM API на Python — это не один навык, а пять взаимосвязанных: считать токены и предсказывать стоимость, использовать function calling для агентов и интеграций, стримить ответы через SSE для нормального UX, строить RAG-системы на embeddings и векторных БД, ускорять и удешевлять через async и Batch API. Этот pillar собирает все пять в один гид с runnable Python кодом, реальными цифрами и cross-references на детальные статьи. Если ты Python-разработчик, который запускает свой первый продакшен на LLM или оптимизирует существующий — читай по порядку или прыгай в нужную секцию.

Контекст: все примеры запускаются через OpenAI-совместимый endpoint Promptra. Это значит, что один pip install openai + base_url="https://api.promptra.ru/v1" даёт доступ к Claude Opus 4.7, GPT-5.5, Gemini 3.1 Pro, DeepSeek V4 Pro и десятку других моделей. Платишь в рублях на расчётный счёт российское юр.лицо, получаешь полный пакет закрывающих документов через ЭДО (Диадок, СБИС, Контур). Это не «обход блокировок», а легальный B2B-сервис в России. Курс ЦБ 71.668 ₽/$ на 2026-05-27 — все цены ниже считаны по нему.

1. Токены и расчёт стоимости — фундамент всего

Схема токенизации: русский текст разбит на токены с подсветкой кириллических символов, рядом таблица плотности символ→токен для русского, английского, кода — editorial vector в терракотовой палитре

Прежде чем запускать LLM в продакшен, ты должен уметь считать токены и предсказывать стоимость запроса до отправки. Без этого нельзя нормально планировать бюджет, выставлять usage-based pricing клиентам или решать, какую модель использовать под конкретную задачу.

Базовая механика: токен — это не символ и не слово, а кусок текста (subword), который модель видит как единицу. Английский текст: 1 токен ≈ 4 символа ≈ 0.75 слова. Русский: 1 токен ≈ 1.5-2 символа (кириллица кодируется плотнее — больше токенов на тот же объём). Код: 1 токен ≈ 3-4 символа. Это значит русская страница A4 (~3000 символов) — это 1500-2000 токенов, а английская — 700-900.

import tiktoken
enc = tiktoken.encoding_for_model("gpt-4o")  # совместимо с GPT-5
text = "Промтра — это российский LLM-агрегатор."
print(len(enc.encode(text)))  # 14 токенов

Для расчёта стоимости берёшь output-цену модели (output составляет 60-80% реального счёта), умножаешь на курс ЦБ, делишь на 1 миллион. Пример для Claude Sonnet 4.6: ответ на 800 output-токенов = 800 / 1_000_000 × 1070 ₽ ≈ 0.86 ₽ за один ответ. На 10 000 диалогов в день — 8 600 ₽. На дешёвой DeepSeek V4 Pro (60 ₽ output) — 480 ₽ в день, в 18 раз меньше.

Полный разбор tokenizer'ов для OpenAI/Anthropic/Gemini, формулы для всех 8 флагманских моделей в рублях, оптимизация промптов под плотность токенов — в детальной статье Как считать токены в LLM.

2. Function calling и tool use — основа агентов

Sequence diagram потока tool calling: пользователь → модель → JSON tool_call → выполнение функции → результат → модель → финальный ответ, минималистичный flowchart в графитовых линиях на кремовом фоне

Function calling (tool use) — это способ дать модели набор твоих Python-функций, которые она может вызывать структурированно. Поверх него строятся RAG-системы (поиск по корпоративной базе), агенты (модель сама решает какие шаги выполнить), и продуктовые интеграции (модель обновляет CRM, отправляет письма, делает запросы в API).

Базовая схема: определяешь tool как JSON-schema (имя, описание, параметры с типами), отправляешь модели вместе с user-сообщением, получаешь обратно tool_calls со структурированными аргументами, выполняешь функцию у себя, отправляешь результат обратно. Модель генерирует финальный ответ, опираясь на результат.

from openai import OpenAI
client = OpenAI(base_url="https://api.promptra.ru/v1", api_key="...")

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Получить погоду в городе",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"]
        }
    }
}]

response = client.chat.completions.create(
    model="claude-sonnet-4.6",
    messages=[{"role": "user", "content": "Какая погода в Москве?"}],
    tools=tools
)
# response.choices[0].message.tool_calls → [{name: "get_weather", arguments: '{"city": "Москва"}'}]

Важные нюансы — parallel tool calls (модель вызывает несколько функций за один шаг), structured outputs (гарантированный JSON-формат), streaming tool calls, error handling если функция падает. Полный гайд с production-ready code, схемами и обходом типовых граблей — в статье Function calling и tool use на Python.

3. Streaming через SSE — нормальный UX чата

Анимированная развёртка чата: левая колонка — пользователь, правая — модель печатает по символам через SSE, под ней timeline first-token-latency и total-latency, editorial vector в терракотовых акцентах

Streaming — обязательная фича для любого LLM-чата. Без него пользователь смотрит на пустой экран 5-15 секунд (типичное время генерации ответа на 500-1000 токенов) и думает, что у тебя зависло. Streaming решает это через Server-Sent Events: модель отправляет chunk'и по мере генерации, ты их парсишь и показываешь по символу.

Сам OpenAI SDK обрабатывает SSE прозрачно — достаточно передать stream=True:

stream = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "Напиши длинный ответ"}],
    stream=True
)
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

В реальных приложениях критичны три аспекта. Первый — error handling: stream может прерваться на любом chunk'е, и обычный try/except не покроет (исключение прилетает асинхронно). Второй — backpressure: если фронт не успевает рендерить, нужно буферизовать. Третий — measurement: для UX важна не общая latency, а Time To First Token (TTFT) — задержка до первого видимого символа.

Production-ready реализации для FastAPI с async-stream, обработка SSE-ошибок и retry, integration с Anthropic streaming (другой протокол) — в статье Streaming LLM через SSE на Python.

4. Embeddings и RAG — поиск по своим данным

RAG-pipeline: документы → чанкование → embeddings vector → векторная БД ↔ user query → retrieval → top-k chunks → LLM → ответ, поток-схема из прямоугольников в линейном editorial стиле

LLM сама по себе ничего не знает о твоей корпоративной базе, документах или API. Решение — RAG (Retrieval-Augmented Generation): ты заранее векторизуешь свои документы через embeddings-модель, складываешь векторы в специализированную БД, при запросе пользователя находишь топ-N релевантных кусков, и передаёшь их модели как контекст.

Базовый RAG-стек в 2026 году: - Embeddings-модель: OpenAI text-embedding-3-large (3072 dim, $0.13/1M токенов), Voyage AI voyage-3 (1024 dim, для русского отлично), Cohere embed-multilingual-v3 (1024 dim) - Векторная БД: pgvector для маленьких/средних объёмов (до 10M векторов), Qdrant для больших и production-нагрузки, Chroma для прототипов - Chunking стратегия: semantic chunking (по смысловым границам) выигрывает у fixed-size chunking в 1.5-2 раза по recall - Retrieval evaluation: meaure Recall@k и MRR на размеченном датасете перед прод-релизом

from openai import OpenAI
client = OpenAI(base_url="https://api.promptra.ru/v1", api_key="...")
emb = client.embeddings.create(
    model="text-embedding-3-large",
    input="Промтра — российский LLM-агрегатор"
)
vector = emb.data[0].embedding  # 3072-dim float list

Дальше — нормализация, индексация в векторной БД, query-side retrieval с фильтрами по метаданным, reranking через cross-encoder (опционально, даёт +10-20% к качеству). Все детали с runnable code, бенчмарками embeddings-моделей на русском, выбором между pgvector и Qdrant — в статье Embeddings и RAG-стек 2026.

5. Async и Batch API — производительность и -50% на стоимость

Bar chart сравнения latency и cost: sequential vs async vs batch — async на 8× быстрее, batch на 50% дешевле, минималистичный график в графитово-терракотовой палитре на кремовом фоне

Если у тебя 100+ запросов в обработке, sequential API-вызовы — главное узкое место. Решение — два разных подхода под разные сценарии.

Async (asyncio + AsyncOpenAI) — для realtime параллелизма. Пять одновременных запросов летят параллельно вместо очереди. Типовая ускорение: 5-20× относительно sequential.

import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI(base_url="https://api.promptra.ru/v1", api_key="...")

async def query(prompt):
    r = await client.chat.completions.create(
        model="gpt-5.4",
        messages=[{"role": "user", "content": prompt}]
    )
    return r.choices[0].message.content

results = asyncio.run(asyncio.gather(*[query(p) for p in prompts]))

Batch API — для non-realtime пакетной обработки. OpenAI Batch и Anthropic Message Batches дают скидку 50% на токены при SLA 24 часа. Идеально для: классификации лога заявок, генерации описаний для каталога 50 000 SKU, разовой обработки исторических данных, ночных аналитических job'ов.

Считалка экономии: 100 000 GPT-5.4 запросов по ~1500 токенов output = 150M токенов × 1070 ₽/1M = 160 500 ₽. С Batch API — 80 250 ₽. Экономия 80 тысяч на одной job'е.

Когда что использовать, как составлять batch JSONL-файлы, как обрабатывать частичные failures, integration с очередями (Celery, RQ) для гибридных pipeline'ов — в детальном гайде Async и Batch API на Python.

Что читать дальше — путь от MVP к production

Эти 5 концепций покрывают 90% потребностей при работе с LLM API в продакшене. Следующие шаги зависят от того, что строишь:

Если строишь чат-бот: глубже изучи streaming + function calling. После — добавь semantic cache (Redis с embedding-keys) для сокращения счёта на 40-70%.

Если строишь RAG: после embeddings и retrieval разберись с evaluation (Recall@k, MRR на размеченном датасете), reranking через cross-encoder, hybrid search (BM25 + векторный). Это даёт +20-40% к качеству ответов.

Если строишь агент: function calling + async — твоя база. Дальше — orchestration через LangGraph или CrewAI, structured outputs для надёжности, observability через Langfuse.

Если оптимизируешь стоимость: token counting → выбор модели по соотношению цена/качество (см. GPT-5.5 vs Claude Opus 4.7) → semantic cache → Batch API для async workloads.

Если выбираешь поставщика API для бизнеса — пройди B2B чек-лист из 12 вопросов и сверь с публичными данными кандидатов. Для миграции с существующего OpenAI-аккаунта — пошаговый гайд переключения base_url за 10 минут.

Стек Promptra — что под капотом

Promptra даёт один OpenAI-совместимый endpoint ко всем флагманам без наценки на токены — цена 1-в-1 с провайдером по курсу ЦБ. Сервисная комиссия 5% берётся только при пополнении баланса, не при использовании. Это значит, что счёт за API масштабируется линейно с провайдерским, без хитрых множителей.

Технически: HTTP/2 proxy на собственной инфраструктуре в РФ + европейских регионах, OpenAI Chat Completions + Anthropic Messages + Google Generate Content protocols, sub-100ms добавки к latency провайдера, public status-page с p50/p99 метриками. Документация — на docs.promptra.ru, каталог моделей — на /models.

Для команд разработчиков — пошаговая настройка ChatGPT для команды в России с 5 разными способами и сравнением. Для интегратора, который хочет понять рынок целиком — обзор всех ключевых LLM-агрегаторов России 2026.

FAQ

С чего начать работать с LLM API на Python если ничего не знаю?

Начни с самого простого: pip install openai, получи API-ключ у Promptra (один OpenAI-совместимый endpoint ко всем флагманам — Claude, GPT, Gemini, DeepSeek), и в 10 строках кода сделай первый запрос. Дальше последовательно изучи 5 концепций: токены (как считается стоимость), function calling (как заставить модель вызывать твои функции), streaming (как получать ответ по частям), embeddings (для поиска по своим данным) и async/batch (для performance и скидки 50%). Каждая концепция — отдельная статья в этом гиде, читать в любом порядке.

Что лучше — OpenAI SDK или прямой HTTP-запрос к API?

Для большинства задач — официальный SDK (openai, anthropic, google-genai). Он закрывает retry, парсинг ошибок, streaming, типизацию tool_calls и обновляется при изменениях API. Прямой HTTP через httpx/requests имеет смысл только если нужна полная контроль над сетевыми параметрами (custom retry policy, специфичные заголовки, проксирование) или если SDK не покрывает редкий endpoint. Promptra полностью совместима с openai SDK — меняешь только base_url, остальной код не трогаешь.

Сколько стоит работать с LLM API в продакшене на Python?

Зависит от модели и объёма. Для прикидки: типовой чат-бот с 1000 диалогов в день на Claude Sonnet 4.6 (210 ₽ за 1М input + 1070 ₽ за 1М output по курсу ЦБ 71.668) обходится примерно в 6 000-15 000 ₽ в месяц. Та же нагрузка на GPT-5.5 (350/2150) — 10 000-25 000 ₽. Дешёвые модели типа DeepSeek V4 Pro (30/60) и Qwen 3.6 Plus (20/130) — десятки рублей в день. С Batch API и semantic cache можно срезать счёт в 2-4 раза. Конкретные тарифы — в сравнении цен LLM 2026.

Что такое function calling и почему все про него говорят?

Function calling (он же tool use) — это способ дать модели набор твоих функций, которые она может вызывать. Модель возвращает не текст, а структурированный JSON с именем функции и аргументами. Ты выполняешь функцию в своём коде, возвращаешь результат модели, она генерирует финальный ответ. Это базовый кирпич для агентов, RAG-систем и продуктовых интеграций — от поиска по корпоративной базе до автоматизации заявок. Поддерживается всеми флагманами: OpenAI, Anthropic, Google. Полный разбор — в статье function calling и tool use на Python.

Зачем нужен streaming и когда он критичен?

Streaming — это получение ответа модели по частям (chunk'ами) через Server-Sent Events, а не одним блоком в конце. Критичен в трёх сценариях: (1) UX чат-ботов — пользователь видит ответ сразу, как будто модель печатает; ожидание 5-15 секунд без визуальной обратной связи воспринимается как зависание; (2) длинные генерации (1000+ токенов) — пользователь успевает прочитать начало пока пишется конец; (3) early-stopping — можно остановить генерацию когда увидел нужную информацию, экономя токены. Подробно — в гайде streaming LLM через SSE.

Что лучше для production — Batch API или обычный API с async?

Это разные задачи. Batch API подходит когда у тебя пакет 100-100000 запросов которые не нужны прямо сейчас — например, ночная обработка лога, классификация исторических данных, генерация описаний для каталога товаров. OpenAI Batch и Anthropic Message Batches дают скидку 50% и SLA 24 часа. Обычный API с async (asyncio + aiohttp) — для realtime сценариев когда нужны параллельные запросы с низкой latency: множественные tool calls, A/B тест разных промптов, параллельный fetch для агента. Подробный разбор — в статье async и Batch API на Python.