глава 04

Общие принципы

Первый запрос вы уже отправили. Чтобы код не разваливался в проде, нужно учесть ещё несколько вещей. Они одинаковы для OpenAI и Anthropic.

Ключ в .env

Ключ держат в файле .env, а в коде читают из окружения. На Python для этого есть пакет python-dotenv - он подгружает .env в переменные окружения.

import os
from dotenv import load_dotenv

load_dotenv()  # читает .env и кладёт значения в окружение

openai_key = os.environ["OPENAI_API_KEY"]
anthropic_key = os.environ["ANTHROPIC_API_KEY"]

Файл .env обязательно добавьте в .gitignore, чтобы он не попал в репозиторий.

Ошибки и лимиты

Сеть нестабильна, а у API есть лимиты на частоту запросов. В коде нужно ловить ошибки и повторять запрос, когда это уместно.

  • 429 (too many requests) - вы упёрлись в лимит запросов в минуту. Подождать и повторить.
  • 5xx (ошибка сервера) - временный сбой на стороне провайдера. Повторить.
  • 4xx, кроме 429 - ошибка в вашем запросе (неверный ключ, плохое тело). Повторять бессмысленно, надо чинить.

Повторяют с нарастающей паузой (экспоненциальный бэкофф): подождать секунду, потом две, потом четыре. Официальные SDK делают часть ретраев сами, но логику под свою задачу всё равно стоит проверить.

import time

def with_retry(call, retries=5):
    for attempt in range(retries):
        try:
            return call()
        except Exception:
            if attempt == retries - 1:
                raise
            time.sleep(2 ** attempt)  # 1с, 2с, 4с, ...

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

По умолчанию вы ждёте ответ целиком. При длинном ответе это долго и выглядит как зависание. Стриминг отдаёт текст по кусочкам, как печатает чат - его выводят сразу, не дожидаясь конца.

stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Расскажи историю."}],
    stream=True,
)

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

У Anthropic стриминг работает так же по смыслу - через stream=True или метод стриминга в SDK.

Выбор модели

У каждого провайдера есть линейка моделей: лёгкие и дешёвые, средние, флагманские. Дорогая модель не всегда нужна.

  • Простая разметка, классификация, короткие ответы - лёгкая модель.
  • Сложные рассуждения, длинный код, тонкие задачи - флагман.

Берите минимально достаточную модель под задачу и бюджет. Как выбирать - в главе про выбор модели.

Не светить ключ на фронте

Самая частая ошибка новичка - вызывать API прямо из браузерного кода. Тогда ключ уезжает на клиент, и любой откроет консоль и заберёт его.

Правило: ключ живёт только на бэкенде. Фронт обращается к вашему серверу, а уже сервер - с ключом - к API нейросети. Подробнее про разделение - в главе про бэкенд и фронтенд.