Files
recipe/gemini_proxy

Gemini Proxy

Минимальный изолированный HTTP-прокси для вызова Gemini с изображением.

Назначение

Прокси принимает один crop изображения от основного российского сервера, передаёт его в Gemini Developer API и возвращает текст модели вместе с метаданными использования токенов.

В прокси нет бизнес-логики распознавания рецептов, словаря лекарств, нормализации, scoring или хранения результатов. Эти функции находятся на основном сервере.

API

GET /health

Возвращает:

{"status":"ok"}

POST /gemini

Формат: multipart/form-data.

Поле image должно содержать JPEG, PNG или WEBP размером не более 10 MB.

Необязательное поле api_key_override позволяет передать ключ только для текущего запроса. Если оно не задано, используется GEMINI_API_KEY из серверной конфигурации. Передача ключа в запросе менее безопасна и допустима только по защищённому каналу между доверенными серверами; ключ не записывается прокси в логи или на диск.

Ответ:

{
  "text": "{\"date\":null,\"medicines\":[]}",
  "usage": {}
}

Секреты

API-ключ не хранится в коде и не коммитится. Сервис читает:

  • GEMINI_API_KEY — обязательный ключ;
  • GEMINI_MODEL — модель, по умолчанию gemini-3.6-flash.

На сервере секрет хранится отдельно в /etc/gemini-proxy/gemini-proxy.env с правами 600, владельцем root:gemini-proxy и не доступен через HTTP.

Изоляция

  • отдельный пользователь gemini-proxy;
  • отдельный каталог /opt/gemini-proxy;
  • отдельный virtualenv;
  • отдельный systemd-юнит;
  • bind только на 127.0.0.1:8768;
  • изображения обрабатываются в памяти и не сохраняются приложением;
  • существующие сервисы и их virtualenv не используются и не перезапускаются.

Запуск

systemctl status gemini-proxy
systemctl restart gemini-proxy
curl http://127.0.0.1:8768/health

Для внешнего доступа потребуется отдельный reverse-proxy маршрут nginx и аутентификация между российским сервером и этим сервисом. До этого endpoint доступен только локально на немецкой ВМ.