LLM API — это HTTP-эндпоинт, который принимает промпт и возвращает JSON с ответом модели вместо отрендеренной страницы. OpenAI открыл Chat Completions API 11 июня 2020 года, Anthropic запустил публичный Messages API в 2023-м — с тех пор вызов модели из кода стал рутинной задачей. В этом тьюториале — рабочий код на Python и JavaScript для OpenAI, Anthropic и OpenRouter: установка SDK, синхронные и асинхронные запросы, параметры temperature и max_tokens, обработка ошибок 429 и 529, стриминг и JSON mode. GPT-4o mini стоит $0.15 за 1M input-токенов, GPT-4o — $2.50: разберём, как считать бюджет и не сжечь лимиты.

Что такое LLM API и чем он отличается от веб-интерфейса

Источник: https://platform.openai.com/docs/api-reference

Когда ты открываешь ChatGPT или другой чат-интерфейс в браузере, ты работаешь с готовым продуктом: там есть история диалогов, кнопки, ограничения на количество запросов и никакого контроля над тем, что происходит под капотом. LLM API — это другой способ доступа к той же модели, но без интерфейса. Ты отправляешь HTTP-запрос с текстом и параметрами, а в ответ получаешь JSON с результатом генерации.

Ключевые отличия от веб-интерфейса

  • Программный доступ. Запрос идёт из твоего кода на Python, JS или любом другом языке — не из браузера.
  • Контроль параметров. Ты сам задаёшь temperature, max_tokens, system-промпт, формат ответа (JSON, текст) и модель.
  • Интеграция. API можно встроить в сайт, бота, CRM, скрипт автоматизации — куда угодно, где есть сеть.
  • Оплата за токены. Вместо подписки ты платишь за объём входных и выходных токенов, что для многих задач выгоднее.
  • Нет истории по умолчанию. Каждый запрос независим — контекст диалога нужно передавать вручную, включая предыдущие сообщения.

Как выглядит запрос

АПИ обычно работает через REST — ты шлёшь POST-запрос на эндпоинт вроде /v1/chat/completions с JSON-телом:

{
 "model": "gpt-4o-mini",
 "messages": [
 {"role": "user", "content": "Напиши хайку про API"}
 ]
}

В ответ приходит JSON с полем choices, где лежит сгенерированный текст, а также данные о токенах (usage) — это важно для расчёта стоимости запроса.

Зачем это нужно инженеру

Веб-интерфейс подходит для разовых задач: спросить, проверить идею, сгенерировать текст руками. Но если тебе нужно обрабатывать сотни запросов в час, встроить генерацию в продукт или автоматизировать рутину — без API не обойтись. Он даёт воспроизводимость (одинаковый промпт даёт стабильно похожий результат при фиксированной температуре), масштабируемость и возможность комбинировать вызовы модели с другой логикой — базами данных, внешними сервисами, очередями задач.

В следующих разделах разберём, как получить ключ и сделать первый вызов на Python и JS за пару минут.

Как выбрать провайдера: OpenAI, Anthropic, OpenRouter, self-hosted

Провайдер определяет стоимость, лимиты и код интеграции задолго до первого запроса.

OpenAI

OpenAI открыл Chat Completions API 11 июня 2020 года, и запрос возвращает структурированный JSON, а не отрендеренную HTML-страницу. GPT-4o mini стоит $0.15 за 1M input и $0.60 за 1M output токенов, GPT-4o$2.50/$10. Tier-1 лимиты для GPT-4o: 500 RPM и 200 000 TPM. Fine-tuning для gpt-4o на конец 2024 недоступен большинству аккаунтов. Установка: pip install openai>=1.0 (SDK 1.0 вышел в августе 2024) или npm install openai (нужен Node.js 18+ для стриминга).

Anthropic

Anthropic запустил публичный Messages API в 2023 году, контекст Claude 3.5 Sonnet200 000 токенов. С 2024 используется max_tokens вместо max_tokens_to_sample. При ошибке 529 следуй заголовку retry-after. JS-версия — @anthropic-ai/sdk, интерфейс сообщений идентичен Python.

OpenRouter

OpenRouter маршрутизирует запросы к OpenAI, Anthropic, Mistral и Meta через единый OpenAI-совместимый эндпоинт — удобно для сравнения моделей без смены кода. Для продакшн-роутинга между провайдерами тоже смотри OpenRouter.

Self-hosted

vLLM входит в топ репозиториев по скорости inference на GPU — вариант, если данные не должны уходить за периметр.

Что важно в API независимо от выбора

temperature — от 0 до 2, seed воспроизводит ответ только при temperature=0. usage.total_tokens — база расчёта стоимости. stream отдаёт server-sent events с чанками delta.content. JSON mode в Chat Completions появился в 2023.

Подробности про параметры запроса — в разделе про первый запрос.

LLM API examples Python: первый запрос за 10 минут

Источник: https://platform.openai.com/docs/api-reference

Разберём минимальный рабочий пример на Python — от установки библиотеки до первого ответа модели. Понадобится Python 3.8+ и API-ключ от провайдера (OpenAI, OpenPromt или другой сервис с совместимым API).

Шаг 1: установка библиотеки

pip install openai

Шаг 2: хранение ключа

Не храни ключ в коде — вынеси в переменную окружения:

export OPENAI_API_KEY="sk-..."

На Windows используй set OPENAI_API_KEY=sk-... в cmd или $env:OPENAI_API_KEY="sk-..." в PowerShell.

Шаг 3: первый запрос

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "Ты — помощник разработчика."},
        {"role": "user", "content": "Объясни, что такое REST API в двух предложениях."}
    ],
    temperature=0.7,
    max_tokens=200
)

print(response.choices[0].message.content)

Клиент автоматически подхватывает ключ из переменной окружения OPENAI_API_KEY. Если хочешь передать его явно, используй OpenAI(api_key="sk-...").

Что означают параметры

  • model — идентификатор модели, от него зависит цена и качество ответа.
  • messages — массив сообщений с ролями system, user, assistant.
  • temperature — степень случайности: 0 для детерминированных ответов, 1+ для творческих.
  • max_tokens — лимит длины ответа, влияет на стоимость запроса.

Обработка ошибок

Добавь try/except, чтобы не терять данные при сбоях сети или лимитах:

from openai import APIError, RateLimitError

try:
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": "Привет!"}]
    )
    print(response.choices[0].message.content)
except RateLimitError:
    print("Превышен лимит запросов, подожди и повтори")
except APIError as e:
    print(f"Ошибка API: {e}")

Проверка токенов и стоимости

Поле response.usage показывает, сколько токенов ушло на запрос и ответ:

print(response.usage.prompt_tokens, response.usage.completion_tokens)

Это полезно для контроля бюджета, особенно если планируешь запускать код в цикле или на продакшене. На этом базовый запрос готов — дальше можно добавлять потоковую генерацию (streaming), function calling или подключать альтернативные провайдеры через совместимый эндпоинт.

LLM API examples JavaScript: тот же flow в Node.js и браузере

Источник: https://platform.openai.com/docs/api-reference

Логика вызова LLM API на JS повторяет Python: собираешь запрос с ключом и промптом, отправляешь POST, парсишь ответ. Разница только в синтаксисе.

Node.js: запрос через fetch

В современных версиях Node (18+) fetch встроен, так что отдельная библиотека не нужна:

const response = await fetch('https://api.openai.com/v1/chat/completions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${process.env.API_KEY}`
  },
  body: JSON.stringify({
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: 'Объясни, что такое REST API' }]
  })
});

const data = await response.json();
console.log(data.choices[0].message.content);

Ключ храни в .env и подключай через dotenv, чтобы не светить его в коде.

Браузер: та же логика, но с CORS-нюансом

В браузере вызов выглядит идентично, но есть ограничение: прямой запрос с фронтенда открывает ключ в devtools любому пользователю. Для прототипа это ок, для продакшена — нет.

async function askLLM(prompt) {
  const res = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${API_KEY}`
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [{ role: 'user', content: prompt }]
    })
  });
  const json = await res.json();
  return json.choices[0].message.content;
}

Если делаешь фронтенд-приложение, вызов лучше проксировать через свой backend или через сервис типа OpenPromt — он берёт на себя хранение ключей и роутинг между моделями, а фронт просто дёргает единый эндпоинт.

Отличия от Python-версии

  • В JS нет отдельного официального SDK от каждого провайдера, часто используется голый fetch или axios.
  • Асинхронность через async/await работает так же, как в Python asyncio, но без блокирующих вызовов по умолчанию — все запросы non-blocking.
  • Обработка ошибок — через try/catch вокруг fetch, плюс проверка response.ok перед парсингом JSON.
try {
  const res = await fetch(url, options);
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const data = await res.json();
} catch (err) {
  console.error('Ошибка вызова LLM API:', err.message);
}

Этого достаточно, чтобы перенести любой Python-пример из статьи на JS без потери функциональности.

Параметры запроса: temperature, max_tokens, top_p, system prompt

Один и тот же вызов на Python и JS отличается только в типах аргументов. Ниже — минимальный пример для OpenAI Python SDK через temperature, max_tokens, seed, top_p и system-сообщение:

response = client.chat.completions.create(
    model="gpt-4o-mini",
    temperature=0,
    seed=42,
    max_tokens=500,
    messages=[
        {"role": "system", "content": "Отвечай кратко, без вступлений."},
        {"role": "user", "content": "Объясни, что такое rate limit"}
    ]
)

Ошибки, ретраи и rate limits: как не сжечь бюджет

Источник: https://platform.openai.com/docs/guides/error-codes — там перечислены все коды ошибок, но на практике тебе важны всего три категории: rate limit (429), временные сбои сервера (500/503) и ошибки на твоей стороне (400/401).

Какие ошибки бывают

  • 429 Too Many Requests — превышен лимит запросов или токенов в минуту.
  • 500/503 — временная проблема на стороне провайдера, повторный запрос обычно помогает.
  • 400 Bad Request — неверный формат запроса, ретраи не помогут.
  • 401/403 — проблема с ключом API, тоже не лечится ретраем.

Первое правило: не ретрай всё подряд. Проверяй код ошибки и решай, стоит ли повторять запрос.

Экспоненциальный backoff

Самый надёжный способ — ждать перед повтором всё дольше, плюс небольшой случайный разброс (jitter), чтобы не отправлять все повторы синхронно.

import time
import random

def call_with_retry(fn, max_retries=5):
 for attempt in range(max_retries):
 try:
 return fn()
 except RateLimitError:
 wait = (2 ** attempt) + random.uniform(0, 1)
 time.sleep(wait)
 raise Exception("Превышено число попыток")

В JS логика та же — оборачиваешь вызов в цикл с setTimeout и растущей задержкой.

Как не сжечь бюджет

  • Ставь лимиты на стороне провайдера — почти у всех есть настройка максимального расхода в месяц или сутки.
  • Логируй usage из ответа — в большинстве API есть поле usage с числом токенов, складывай его и сверяй с бюджетом.
  • Кэшируй одинаковые запросы — если промпт повторяется, не гоняй его в модель повторно.
  • Ограничивай max_tokens — без явного лимита модель может генерировать куда больше, чем нужно, и это прямые расходы.
  • Используй таймауты — зависший запрос без таймаута может держать ресурсы и провоцировать лишние ретраи выше по стеку.

Готовое решение без своей инфраструктуры ретраев

Если не хочешь писать backoff-логику и следить за лимитами каждого провайдера отдельно, можно подключиться через единый шлюз типа openpromt.com — там ретраи, роутинг между моделями при отказе и единый учёт токенов уже встроены, и не нужно держать отдельный SDK под каждого вендора.

Стриминг и JSON mode: ответы по токенам и валидный JSON

Источник: https://platform.openai.com/docs/api-reference/streaming

Два параметра решают разные задачи: stream отвечает за скорость восприятия ответа пользователем, response_format — за структуру данных для дальнейшей обработки кода.

Стриминг ответа

Без стриминга клиент ждёт весь ответ целиком — при длинных генерациях это выглядит как зависание интерфейса. Со стримингом токены прилетают частями по мере генерации, и можно показывать текст постепенно, как в ChatGPT.

from openai import OpenAI

client = OpenAI(api_key="sk-...")

stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Напиши короткое стихотворение"}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

На JS то же самое через async-итератор:

const stream = await client.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [{ role: "user", content: "Напиши короткое стихотворение" }],
  stream: true,
});

for await (const chunk of stream) {
  const delta = chunk.choices[0]?.delta?.content || "";
  process.stdout.write(delta);
}

Важный момент: при стриминге usage-токены и финальный finish_reason приходят только в последнем чанке (или отдельным событием, если явно указать stream_options: { include_usage: true }). Если считаешь стоимость запроса в реальном времени — не забудь это учесть.

JSON mode для структурированного вывода

Когда ответ модели нужно парсить кодом (например, извлечь поля из текста), обычная генерация иногда добавляет пояснения вокруг JSON или ломает синтаксис. Параметр response_format с типом json_object заставляет модель гарантированно вернуть валидный JSON:

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "Отвечай только в формате JSON"},
        {"role": "user", "content": "Извлеки имя и возраст: Ивану 27 лет"},
    ],
    response_format={"type": "json_object"},
)
print(response.choices[0].message.content)

Обязательное условие — упомянуть слово “JSON” в промпте (в system или user), иначе API вернёт ошибку. Для более строгого контроля структуры полезен json_schema со схемой полей — модель тогда не просто отдаёт JSON, а соблюдает конкретную форму ответа, что удобно при интеграции с базами данных или внешними API.

Куда двигаться дальше: агенты, RAG и fine-tuning

Базовые вызовы Chat Completions API — только начало. Дальше три пути.

Агенты — цепочки вызовов с function calling, где модель сама решает, какой инструмент вызвать. Строишь на связке openai>=1.0 + внешние API, добавляешь память между шагами.

RAG — подмешиваешь релевантные документы в промпт перед запросом. Пригодится контекст 200 000 токенов у Claude 3.5 Sonnet — можно закинуть много чанков без обрезки. Векторный поиск + rerank решают точность.

Fine-tuning — дообучение на своих данных. У OpenAI недоступен для gpt-4o в большинстве аккаунтов на конец 2024 года, зато открытые модели через vLLM дообучаются локально.

Если эксперименты идут по разным провайдерам — OpenAI, Anthropic, Mistral, Meta — удобнее гонять всё через единый эндпоинт OpenRouter вместо переписывания клиента под каждый SDK.

Подробнее про инструменты — в разделе (/pillar/agents/).

Сколько стоит GPT-4o mini на практике

GPT-4o mini стоит $0.15 за 1M входных токенов и $0.60 за 1M выходных — это примерно в 16 раз дешевле GPT-4o ($2.50/$10 за 1M). Для типового чат-бота с промптом 500 токенов и ответом 200 токенов запрос обойдётся доли цента. Считать стоимость удобно через usage.total_tokens в ответе API.

Как получить доступ к OpenAI API из России

Прямая регистрация с российской карты и IP заблокирована. Рабочие варианты: OpenRouter (маршрутизирует запросы к OpenAI, Anthropic, Mistral, Meta через единый эндпоинт и принимает оплату иначе), зарубежные виртуальные карты, или self-hosted модели через vLLM на своём GPU без обращения к внешним API вообще.

Какие альтернативы OpenAI API существуют

Anthropic Messages API (Claude 3.5 Sonnet с контекстом 200 000 токенов), OpenRouter как агрегатор нескольких провайдеров под одним OpenAI-совместимым интерфейсом, и self-hosted инференс через vLLM для тех, кто хочет держать модель на своём железе без внешних вызовов.

Почему API возвращает JSON а не HTML

LLM API — это программный интерфейс, а не веб-страница: он отдаёт структурированный JSON с полями choices, usage, model и id, который парсится кодом напрямую. Это отличает его от ChatGPT-интерфейса, который рендерит HTML для человека. JSON удобен для встраивания в pipeline, логирования и автоматической обработки ответа.

Можно ли дообучить gpt-4o под свою задачу

На конец 2024 года fine-tuning для gpt-4o недоступен для большинства аккаунтов OpenAI. Доступны более старые модели линейки для тонкой настройки. Альтернатива — RAG с векторной базой или системный промпт с few-shot примерами, что часто закрывает задачу без дообучения.

Что делать при ошибке 529 у Anthropic

Ошибка 529 означает перегрузку сервера Anthropic. Рекомендация — читать заголовок retry-after в ответе и повторять запрос после указанного времени, а не сразу же ретраить в цикле. Экспоненциальный backoff с джиттером снижает риск повторной перегрузки при массовых ретраях от многих клиентов одновременно.

Заключение

После первых успешных запросов переходите к продакшн-паттернам: логируйте usage.total_tokens в каждом ответе, чтобы видеть реальную стоимость по моделям, настройте retry с exponential backoff под rate limits вашего тира, и попробуйте JSON mode на реальной задаче парсинга данных. Дальше — тестируйте стриминг в UI и сравните задержку GPT-4o mini против GPT-4o на вашей нагрузке, прежде чем закладывать модель в архитектуру агента.

Часто задаваемые вопросы

Сколько стоит GPT-4o mini на практике

GPT-4o mini стоит $0.15 за 1M входных токенов и $0.60 за 1M выходных — это примерно в 16 раз дешевле GPT-4o ($2.50/$10 за 1M). Для типового чат-бота с промптом 500 токенов и ответом 200 токенов запрос обойдётся доли цента. Считать стоимость удобно через usage.total_tokens в ответе API.

Как получить доступ к OpenAI API из России

Прямая регистрация с российской карты и IP заблокирована. Рабочие варианты: OpenRouter (маршрутизирует запросы к OpenAI, Anthropic, Mistral, Meta через единый эндпоинт и принимает оплату иначе), зарубежные виртуальные карты, или self-hosted модели через vLLM на своём GPU без обращения к внешним API вообще.

Какие альтернативы OpenAI API существуют

Anthropic Messages API (Claude 3.5 Sonnet с контекстом 200 000 токенов), OpenRouter как агрегатор нескольких провайдеров под одним OpenAI-совместимым интерфейсом, и self-hosted инференс через vLLM для тех, кто хочет держать модель на своём железе без внешних вызовов.

Почему API возвращает JSON а не HTML

LLM API — это программный интерфейс, а не веб-страница: он отдаёт структурированный JSON с полями choices, usage, model и id, который парсится кодом напрямую. Это отличает его от ChatGPT-интерфейса, который рендерит HTML для человека. JSON удобен для встраивания в pipeline, логирования и автоматической обработки ответа.

Можно ли дообучить gpt-4o под свою задачу

На конец 2024 года fine-tuning для gpt-4o недоступен для большинства аккаунтов OpenAI. Доступны более старые модели линейки для тонкой настройки. Альтернатива — RAG с векторной базой или системный промпт с few-shot примерами, что часто закрывает задачу без дообучения.

Что делать при ошибке 529 у Anthropic

Ошибка 529 означает перегрузку сервера Anthropic. Рекомендация — читать заголовок retry-after в ответе и повторять запрос после указанного времени, а не сразу же ретраить в цикле. Экспоненциальный backoff с джиттером снижает риск повторной перегрузки при массовых ретраях от многих клиентов одновременно.