глава 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 нейросети. Подробнее про разделение - в главе про бэкенд и фронтенд.