Кальтер / Блог

API нейросети в приложении: серверный ключ, ошибки и контроль расходов

Разберите серверный вызов API нейросети на примере чернового резюме: хранение ключа, ошибки и повторы, обработка данных и оценка расходов.

Материал подготовлен с помощью ИИ; источники и расчёты проверены редакцией ZASLON.

Сервер связывает запрос приложения с внешним API и обрабатывает сбои; на схеме: Форма приложения, Серверный маршрут, Внешний API.
Редакционная схема ZASLON. Условная иллюстрация механизма; не рыночные данные и не интерфейс сервиса.

В примере редактор заявок предлагает сотруднику сократить длинное сообщение клиента до чернового резюме. Человек проверяет и редактирует результат; модель ничего не публикует и не отправляет клиенту автоматически. Такое ограничение превращает интеграцию в помощника внутри существующего процесса.

Проведи запрос через сервер

Маршрут: браузер отправляет текст вашему backend → backend проверяет пользователя, права и размер входа → сервер вызывает API → ограничивает и проверяет ответ → возвращает черновик сотруднику. Не вызывай провайдера напрямую из браузера: ключ, встроенный в клиентский код, доступен пользователю. OpenAI прямо требует хранить API key в секрете/переменной окружения на сервере и не публиковать в client-side code (API overview).

До разработки определи: какие поля отправляются, могут ли они содержать персональные сведения, какие ответы сохраняются, сколько времени, и кто имеет к ним доступ. Документация OpenAI о данных API описывает настройки хранения/использования для разных функций; проверяй актуальные условия конкретной конечной точки и аккаунта перед включением (Your data).

Ошибки — часть интерфейса

Не превращай любую ошибку в бесконечное «попробуйте снова».

Ситуация Что проверить Поведение приложения
400 формат, обязательные параметры и ограничения входа показать исправимую ошибку, не повторять тот же запрос автоматически
401 серверный ключ/права проекта скрыть секрет и внутренний ответ; сообщить, что функция временно недоступна
429 ограничение частоты или квоты ограниченный backoff; если есть Retry-After, учитывать его; дать повторить позже
временная ошибка 5xx доступность провайдера ограниченное число повторов с задержкой и без двойного сохранения
billing/quota exhausted состояние аккаунта и лимита не делать автоматические повторы, отключить действие/сообщить оператору

Официальный справочник OpenAI перечисляет типы ошибок и предлагает проверять статус и тело ответа (Error codes). Rate limits guide рекомендует экспоненциальную задержку с jitter для повторяемых ограничений и поясняет, что повтор без паузы не ускоряет доступ; платежные/квотные ошибки нужно разбирать отдельно (Rate limits). Повтор должен быть ограничен, иначе интерфейс сам увеличит нагрузку и расход.

Бюджет без выдуманной цены

Сначала поставь пределы на размер входа, число вызовов на пользователя, параллельность и максимальный ответ. Для текстовой модели оцени базовый бюджет так: запросов × [(входные токены на запрос ÷ 1 000 000 × цена входа за 1 млн токенов) + (выходные токены на запрос ÷ 1 000 000 × цена выхода за 1 млн токенов)]. Сверь единицу цены в актуальной карточке выбранной модели на официальной странице цен; формула не включает иные тарифицируемые функции, если они применяются. Добавь отдельно ожидаемые повторы и тестовые запросы. Тариф здесь не фиксируется.

OpenAI Production best practices советует оценивать расходы по предполагаемому трафику и устанавливать spending limits/alerts; фактическая сумма зависит от модели, объёма токенов и сценария (Production best practices). Ограничение расходов и уведомление полезны для контроля, но не заменяют серверное ограничение числа запросов.

Данные и приёмка

Не отправляй запросы, логи и API key в публичный клиент. В серверных логах оставляй request ID, тип ошибки и ограниченные технические метаданные; содержимое сообщения сохраняй только если оно необходимо и пользовательские правила это допускают. Покажи сотруднику источник и статус черновика, оставь возможность отказаться от результата.

Проверь: запрос без входа отклоняется; слишком длинный текст блокируется до вызова; ключ отсутствует в собранном JS; 401 не раскрывает конфигурацию; 429 замедляет повтор; исчерпанная квота не создаёт цикл; ошибка провайдера не стирает исходное сообщение. Для дублей сервер создаёт запись операции с уникальным request_id до вызова модели: повтор клиента с тем же ID получает существующий статус/результат, а не запускает параллельный вызов. Если соединение оборвалось после отправки модели, исход операции может быть неизвестен; не повторяй его автоматически, пока это не выяснено, иначе возможен второй платный вызов. Это критерии проверки, не отчёт о выполненных вызовах API.