OpenAI-совместимый API прокси для Google Gemini с ротацией ключей, написанный на TypeScript.
- 🔑 Управление API ключами через веб-интерфейс
- 🔄 Автоматическая ротация ключей по кругу
- 🌐 OpenAI-совместимый эндпоинт
/v1/chat/completions - 🤖 Anthropic-совместимый эндпоинт
/v1/messages - 📡 Поддержка стриминговых ответов для обоих API
- 💾 Персистентное хранение ключей в файле
- 🔒 Защита админ-панели паролем
- 📝 Написано на TypeScript с полной типизацией
- Установите зависимости:
npm install- Соберите TypeScript:
npm run build- Запустите сервер:
npm startИли для разработки с автоперезагрузкой:
npm run dev- Соберите и запустите с помощью Docker Compose:
docker-compose up -d- Или соберите Docker образ вручную:
docker build -t gemini-proxy .
docker run -p 3000:3000 -e ADMIN_PASSWORD=your_password gemini-proxyУстановите пароль администратора через переменную окружения:
export ADMIN_PASSWORD=your_secure_passwordПо умолчанию используется пароль: admin123
API ключи сохраняются в файле data/api-keys.json и автоматически загружаются при запуске сервера.
Формат файла:
{
"apiKeys": [
"your-gemini-api-key-1",
"your-gemini-api-key-2"
],
"currentKeyIndex": 0
}Особенности:
- ✅ Ключи сохраняются при каждом добавлении/удалении
- ✅ Индекс текущего ключа обновляется при каждом использовании
- ✅ При запуске в Docker данные сохраняются в volume
- ✅ Автоматическое создание папки
data/если её нет
- Откройте http://localhost:3000
- Введите пароль администратора
- Добавляйте/удаляйте API ключи Gemini
OpenAI-совместимый эндпоинт:
curl -X POST http://localhost:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "user", "content": "Привет, как дела?"}
],
"stream": false
}'Anthropic-совместимый эндпоинт:
curl -X POST http://localhost:3000/v1/messages \
-H "Content-Type: application/json" \
-d '{
"model": "claude-3-sonnet-20240229",
"max_tokens": 1000,
"messages": [
{"role": "user", "content": "Привет, как дела?"}
],
"stream": false
}'Стриминговые запросы:
Добавьте "stream": true в любой из запросов выше для получения стримингового ответа.
Сервис автоматически использует следующий ключ для каждого запроса. Если у вас 10 ключей, первый ключ будет использован снова через 10 запросов.
├── src/
│ ├── server.ts # Основной сервер
│ └── types.ts # TypeScript типы
├── dist/ # Скомпилированный JavaScript
├── data/
│ └── api-keys.json # Файл с сохраненными API ключами
├── public/
│ └── index.html # Веб-интерфейс управления
├── package.json # Зависимости
├── tsconfig.json # Конфигурация TypeScript
├── Dockerfile # Docker конфигурация
├── docker-compose.yml # Docker Compose файл
├── .dockerignore # Исключения для Docker
└── README.md # Документация
GET /- Веб-интерфейс управления ключамиPOST /admin/keys- Получить список ключейPOST /admin/keys/add- Добавить новый ключPOST /admin/keys/delete- Удалить ключ
POST /v1/chat/completions- OpenAI-совместимый чат эндпоинтPOST /v1/messages- Anthropic-совместимый эндпоинт
Оба AI эндпоинта поддерживают:
- ✅ Обычные запросы
- ✅ Стриминговые ответы (
"stream": true) - ✅ Автоматическую ротацию API ключей