RussiaAPI

Техническое руководство

OpenAI-совместимый API: переменные окружения в CI

Переменные окружения для OpenAI-совместимого API в CI нужны только для контролируемой server-side проверки: секрет выдаёт vault на короткий job, лог маскирует его значение, а тест использует синтетический вход и утверждённый model alias. Не добавляйте ключ в YAML, lockfile, artefact или browser build. Совместимый формат не подтверждает конкретный endpoint до проверки текущей документации RussiaAPI.

Опубликовано 23 сентября 2026 · 10 минут чтения · Ключевой запрос: OpenAI compatible API переменные окружения CI

Разделите конфигурацию и секрет

В репозитории допустим только шаблон имён: RUSSIAAPI_API_KEY, RUSSIAAPI_BASE_URL и RUSSIAAPI_TEST_MODEL без значений. Сам ключ хранится в secrets vault выбранной CI-системы, имеет владельца и ограниченный срок использования. Для production и тестов заведите разные значения и не копируйте production секрет в pull request job. Доступ к переменной должен быть у минимального набора защищённых веток и окружений.

Не используйте секрет как аргумент shell-команды и не печатайте environment для отладки. CI masking помогает, но не исправляет утечку в HTTP dump, кэш, скриншот или артефакт. Отфильтруйте Authorization, cookie и тело запроса до записи. Если ключ случайно попал в лог или commit, отзовите и замените его, проверьте scope доступа и не ограничивайтесь удалением строки из интерфейса.

Сделайте тест коротким и наблюдаемым

Smoke test проверяет только то, что действительно нужно перед релизом: секрет доступен в защищённом job, backend способен выполнить документированный запрос, а ответ имеет минимально ожидаемую форму. Используйте короткий нейтральный prompt и лимит времени. Не отправляйте клиентские записи, production документы или полноценные datasets ради зелёной галочки.

У теста должен быть явный режим ошибки: неверный ключ, недоступный alias, timeout и невалидный JSON завершают job понятным кодом, но без секрета в выводе. Это не повод автоматически переключать продукт на другой model ID. Сначала зафиксируйте request ID или внутренний корреляционный идентификатор, проверьте актуальный каталог и примите решение владельцем интеграции.

Защитите pipeline от случайной публикации

Запускайте проверку в отдельном этапе до deploy и храните только краткий результат: ok, HTTP status, длительность и версия скрипта. Не сохраняйте raw response как артефакт, если он не нужен и не прошёл политику данных. Ограничьте использование секретов для fork и непроверенных contribution jobs; их код нельзя считать доверенным только потому, что он находится рядом с workflow.

Периодически проверяйте, кто имеет право менять secret, как отзывается ключ и как команда проводит учебную замену. Перед реальным rollout подтвердите endpoint, alias и условия обработки в текущей документации. RussiaAPI — независимый сторонний сервис; ни пример, ни переменная среды не дают гарантию совместимости, доступности или фиксированной стоимости.

Контрольный список перед релизом

До изменения production сохраните версию адаптера, владельца решения, дату проверки и безопасный способ отключения. Прогоните положительный сценарий на синтетическом входе и отдельные отрицательные случаи: пустое поле, неверный tenant, недоступный alias, timeout и повтор того же запроса. Измеряйте только технические признаки, достаточные для поддержки, а не содержимое пользователя.

После релиза наблюдайте за нормализованными кодами ошибок, длительностью, очередью и долей отменённых операций. Если один из сигналов выходит за заранее согласованный порог, остановите rollout, не расширяйте доступ автоматически и проверьте текущий договорный каталог. Такая дисциплина полезна независимо от выбранной модели и не подменяет требования к данным, авторским правам, согласию или внутреннему контролю.

Server-side пример

Этот минимальный пример рассчитан на Node.js 18+ и защищённый server-side запуск. Он не содержит реального ключа и не утверждает наличие недокументированной функции; перед интеграцией подтвердите текущий маршрут, alias модели и схему payload.

export async function ciSmokeTest(fetchImpl = fetch) {
  const key = process.env.RUSSIAAPI_API_KEY;
  const model = process.env.RUSSIAAPI_TEST_MODEL;
  if (!key || !model) throw new Error('ci_secret_or_model_missing');
  const response = await fetchImpl('https://russiaapi.com/v1/chat/completions', {
    method: 'POST', headers: { authorization: `Bearer ${key}`, 'content-type': 'application/json' },
    body: JSON.stringify({ model, messages: [{ role: 'user', content: 'Ответьте одним словом: ok' }], max_tokens: 4 }),
    signal: AbortSignal.timeout(12_000)
  });
  if (!response.ok) return { ok: false, status: response.status };
  const body = await response.json();
  return { ok: typeof body?.id === 'string', status: response.status };
}
// CI must mask RUSSIAAPI_API_KEY and never print it or raw response bodies.

Проверьте синтаксис командой node --check, добавьте собственную аутентификацию, контролируемые лимиты и тесты отрицательных сценариев. Не добавляйте в журнал тело запроса, ответ целиком или авторизационные заголовки.

Проверьте сценарий в RussiaAPI

Создайте собственный тестовый ключ в консоли, сверьте текущий каталог моделей и выполните обезличенный server-side smoke test. Расширяйте нагрузку только после измеримой проверки.

Открыть консоль RussiaAPI · Документы · Каталог моделей

FAQ

Можно ли хранить ключ в .env.example?

Нет. В шаблоне допустимо только имя переменной без значения. Реальный ключ передаётся защищённым secret store в ограниченный CI job и никогда не коммитится в репозиторий.

Достаточно ли маскировки CI для защиты секрета?

Нет. Маскировка не защищает от записи секрета в артефакт, debug dump, кэш или сторонний инструмент. Не печатайте environment и фильтруйте заголовки и тела запросов до логирования.

Можно ли запускать тест на каждом внешнем pull request?

Не с production либо доверенным секретом. Непроверенный код из fork не должен получать доступ к защищённым переменным. Используйте отдельный безопасный режим или проверяйте после доверенного merge.

Читайте также