Python + AI API
Нейросети в Python через один base_url
Штатный openai-пакет без самописных клиентов: base_url NormaHub, ключ из окружения, model ID из каталога. Синхронные и потоковые запросы, типизированные ошибки, оплата рублями.
Для кого: python-разработчики, дата-инженеры и авторы ботов, скриптов и агентов
Создать API keyБыстрый старт
От ключа до первого ответа
- 01
Установите openai-пакет, создайте ключ и положите его в переменную окружения.
- 02
Укажите base_url NormaHub и model ID из каталога в первом запросе.
- 03
Включите streaming, timeout и лимиты ключей перед выходом в продакшен.
Рабочий шаблон
Скопируйте основу и замените модель
Используйте только идентификатор из актуального каталога. Ключ храните в переменной окружения.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["NORMAHUB_API_KEY"],
base_url="https://api.normahub.cc/v1",
)
response = client.chat.completions.create(
model="MODEL_ID",
messages=[{"role": "user", "content": "Привет"}],
max_tokens=512,
)
print(response.choices[0].message.content)Детали решения
Как это устроено
Зачем Python-проекту единый API
Клиент OpenAI SDK совместим с NormaHub полностью: меняются только base_url и ключ, остальной код — ваши привычные chat.completions. Модель переключается одним параметром, поэтому эксперименты с GPT, Claude и другими моделями каталога не требуют новых пакетов и переписывания вызовов. Прямые кабинеты провайдеров означают зарубежные карты, региональные блокировки и пятёрку разных биллингов; здесь один ключ покрывает текстовые, кодовые и мультимодальные модели, а endpoint доступен из России напрямую без VPN.
Сколько стоит запрос
Каждый вызов считается как входные токены плюс выходные по тарифу выбранной модели, поэтому главный рычаг экономии — длина контекста и ограничение max_tokens. Длинные истории диалогов пересылаются целиком и стоят как сумма всей переписки: режьте контекст до необходимого, кэшируйте системные инструкции и считайте стоимость полной операции, а не одного вызова. Точные ставки входа и выхода — в каталоге моделей, формула месячного бюджета — в гайде по стоимости токенов, а финальная сумма каждого запроса сохраняется в истории личного кабинета.
Нюансы и лимиты
Храните ключ в переменных окружения процесса, для локальной разработки — файл .env в .gitignore через python-dotenv, и никогда не коммитьте секреты в репозиторий. Streaming поддерживается не каждой моделью и не каждым endpoint — сверяйтесь с каталогом перед включением. Ошибки делите на постоянные, которые повтором не лечатся, и временные вроде 429 и 5xx, которые повторяются с задержкой и лимитом попыток. Каждому запросу задавайте timeout и сохраняйте request ID: по нему поддержка найдёт операцию без вашего ключа и промпта.
Оплата и контроль расходов
Запросы оплачиваются с предварительно пополненного баланса по актуальным ставкам выбранной модели. Минимум и комиссия показываются перед оплатой в кабинете; лимит расходов задаётся для API-ключа.
Ограничения доступности
Возможности зависят от модели и внешнего маршрута. При недоступности provider запрос может завершиться ошибкой; проверяйте каталог, статус и документацию перед production.
Частые вопросы
Какой base_url указывать в Python-клиенте?
https://api.normahub.cc/v1. Заголовок Authorization: Bearer с вашим ключом SDK выставляет сам из параметра api_key — вручную собирать HTTP-запросы не нужно.
Где хранить API-ключ?
В переменной окружения NORMAHUB_API_KEY, которую код читает через os.environ. Не вшивайте ключ в код, notebooks и публичные репозитории; под скрипты и агентов заводите отдельные ключи с лимитом расходов.
Как получать ответ по частям?
Передайте stream=True и читайте chunk.choices[0].delta.content в цикле — пользователь видит первые слова сразу. Учтите: потоковый режим поддерживают не все модели, проверяйте каталог.
Как обрабатывать ошибки запросов?
Постоянные 401, 402 и 403 чините по причине — ключ, баланс, доступ модели; временные 429 и 5xx повторяйте с задержкой и пределом попыток. Полная таблица кодов и retry-политик — в гайде по ошибкам API.