|
|
--- |
|
|
title: Gemini CLI to API Proxy |
|
|
emoji: π€ |
|
|
colorFrom: blue |
|
|
colorTo: purple |
|
|
sdk: docker |
|
|
pinned: false |
|
|
license: mit |
|
|
app_port: 7860 |
|
|
--- |
|
|
|
|
|
# Gemini CLI to API Proxy (geminicli2api) |
|
|
|
|
|
A FastAPI-based proxy server that converts the Gemini CLI tool into both OpenAI-compatible and native Gemini API endpoints. This allows you to leverage Google's free Gemini API quota through familiar OpenAI API interfaces or direct Gemini API calls. |
|
|
|
|
|
## π Features |
|
|
|
|
|
- **OpenAI-Compatible API**: Drop-in replacement for OpenAI's chat completions API |
|
|
- **Native Gemini API**: Direct proxy to Google's Gemini API |
|
|
- **Streaming Support**: Real-time streaming responses for both API formats |
|
|
- **Multimodal Support**: Text and image inputs |
|
|
- **Authentication**: Multiple auth methods (Bearer, Basic, API key) |
|
|
- **Google Search Grounding**: Enable Google Search for grounded responses using `-search` models. |
|
|
- **Thinking/Reasoning Control**: Control Gemini's thinking process with `-nothinking` and `-maxthinking` models. |
|
|
- **Docker Ready**: Containerized for easy deployment |
|
|
- **Hugging Face Spaces**: Ready for deployment on Hugging Face |
|
|
|
|
|
## π§ Environment Variables |
|
|
|
|
|
### Required |
|
|
- `GEMINI_AUTH_PASSWORD`: Authentication password for API access |
|
|
|
|
|
### Optional Credential Sources (choose one) |
|
|
- `GEMINI_CREDENTIALS`: JSON string containing Google OAuth credentials |
|
|
- `GOOGLE_APPLICATION_CREDENTIALS`: Path to Google OAuth credentials file |
|
|
- `GOOGLE_CLOUD_PROJECT`: Google Cloud project ID |
|
|
- `GEMINI_PROJECT_ID`: Alternative project ID variable |
|
|
|
|
|
### Example Credentials JSON |
|
|
```json |
|
|
{ |
|
|
"client_id": "your-client-id", |
|
|
"client_secret": "your-client-secret", |
|
|
"token": "your-access-token", |
|
|
"refresh_token": "your-refresh-token", |
|
|
"scopes": ["https://www.googleapis.com/auth/cloud-platform"], |
|
|
"token_uri": "https://oauth2.googleapis.com/token" |
|
|
} |
|
|
``` |
|
|
|
|
|
## π‘ API Endpoints |
|
|
|
|
|
### OpenAI-Compatible Endpoints |
|
|
- `POST /v1/chat/completions` - Chat completions (streaming & non-streaming) |
|
|
- `GET /v1/models` - List available models |
|
|
|
|
|
### Native Gemini Endpoints |
|
|
- `GET /v1beta/models` - List Gemini models |
|
|
- `POST /v1beta/models/{model}:generateContent` - Generate content |
|
|
- `POST /v1beta/models/{model}:streamGenerateContent` - Stream content |
|
|
- All other Gemini API endpoints are proxied through |
|
|
|
|
|
### Utility Endpoints |
|
|
- `GET /health` - Health check for container orchestration |
|
|
|
|
|
## π Authentication |
|
|
|
|
|
The API supports multiple authentication methods: |
|
|
|
|
|
1. **Bearer Token**: `Authorization: Bearer YOUR_PASSWORD` |
|
|
2. **Basic Auth**: `Authorization: Basic base64(username:YOUR_PASSWORD)` |
|
|
3. **Query Parameter**: `?key=YOUR_PASSWORD` |
|
|
4. **Google Header**: `x-goog-api-key: YOUR_PASSWORD` |
|
|
|
|
|
## π³ Docker Usage |
|
|
|
|
|
```bash |
|
|
# Build the image |
|
|
docker build -t geminicli2api . |
|
|
|
|
|
# Run on default port 8888 (compatibility) |
|
|
docker run -p 8888:8888 \ |
|
|
-e GEMINI_AUTH_PASSWORD=your_password \ |
|
|
-e GEMINI_CREDENTIALS='{"client_id":"...","token":"..."}' \ |
|
|
-e PORT=8888 \ |
|
|
geminicli2api |
|
|
|
|
|
# Run on port 7860 (Hugging Face compatible) |
|
|
docker run -p 7860:7860 \ |
|
|
-e GEMINI_AUTH_PASSWORD=your_password \ |
|
|
-e GEMINI_CREDENTIALS='{"client_id":"...","token":"..."}' \ |
|
|
-e PORT=7860 \ |
|
|
geminicli2api |
|
|
``` |
|
|
|
|
|
### Docker Compose |
|
|
|
|
|
```bash |
|
|
# Default setup (port 8888) |
|
|
docker-compose up -d |
|
|
|
|
|
# Hugging Face setup (port 7860) |
|
|
docker-compose --profile hf up -d geminicli2api-hf |
|
|
``` |
|
|
|
|
|
## π€ Hugging Face Spaces |
|
|
|
|
|
This project is configured for Hugging Face Spaces deployment: |
|
|
|
|
|
1. Fork this repository |
|
|
2. Create a new Space on Hugging Face |
|
|
3. Connect your repository |
|
|
4. Set the required environment variables in Space settings: |
|
|
- `GEMINI_AUTH_PASSWORD` |
|
|
- `GEMINI_CREDENTIALS` (or other credential source) |
|
|
|
|
|
The Space will automatically build and deploy using the included Dockerfile. |
|
|
|
|
|
## π OpenAI API Example |
|
|
|
|
|
```python |
|
|
import openai |
|
|
|
|
|
# Configure client to use your proxy |
|
|
client = openai.OpenAI( |
|
|
base_url="http://localhost:8888/v1", # or 7860 for HF |
|
|
api_key="your_password" # Your GEMINI_AUTH_PASSWORD |
|
|
) |
|
|
|
|
|
# Use like normal OpenAI API |
|
|
response = client.chat.completions.create( |
|
|
model="gemini-2.5-pro-maxthinking", |
|
|
messages=[ |
|
|
{"role": "user", "content": "Explain the theory of relativity in simple terms."} |
|
|
], |
|
|
stream=True |
|
|
) |
|
|
|
|
|
# Separate reasoning from the final answer |
|
|
for chunk in response: |
|
|
if chunk.choices[0].delta.reasoning_content: |
|
|
print(f"Thinking: {chunk.choices[0].delta.reasoning_content}") |
|
|
if chunk.choices[0].delta.content: |
|
|
print(chunk.choices[0].delta.content, end="") |
|
|
``` |
|
|
|
|
|
## π§ Native Gemini API Example |
|
|
|
|
|
```python |
|
|
import requests |
|
|
|
|
|
headers = { |
|
|
"Authorization": "Bearer your_password", |
|
|
"Content-Type": "application/json" |
|
|
} |
|
|
|
|
|
data = { |
|
|
"contents": [ |
|
|
{ |
|
|
"role": "user", |
|
|
"parts": [{"text": "Explain the theory of relativity in simple terms."}] |
|
|
} |
|
|
], |
|
|
"thinkingConfig": { |
|
|
"thinkingBudget": 32768, |
|
|
"includeThoughts": True |
|
|
} |
|
|
} |
|
|
|
|
|
response = requests.post( |
|
|
"http://localhost:8888/v1beta/models/gemini-2.5-pro:generateContent", # or 7860 for HF |
|
|
headers=headers, |
|
|
json=data |
|
|
) |
|
|
|
|
|
print(response.json()) |
|
|
``` |
|
|
|
|
|
## π― Supported Models |
|
|
|
|
|
### Base Models |
|
|
- `gemini-2.5-pro` |
|
|
- `gemini-2.5-flash` |
|
|
- `gemini-1.5-pro` |
|
|
- `gemini-1.5-flash` |
|
|
- `gemini-1.0-pro` |
|
|
|
|
|
### Model Variants |
|
|
The proxy automatically creates variants for `gemini-2.5-pro` and `gemini-2.5-flash` models: |
|
|
|
|
|
- **`-search`**: Appends `-search` to a model name to enable Google Search grounding. |
|
|
- Example: `gemini-2.5-pro-search` |
|
|
- **`-nothinking`**: Appends `-nothinking` to minimize reasoning steps. |
|
|
- Example: `gemini-2.5-flash-nothinking` |
|
|
- **`-maxthinking`**: Appends `-maxthinking` to maximize the reasoning budget. |
|
|
- Example: `gemini-2.5-pro-maxthinking` |
|
|
|
|
|
## π License |
|
|
|
|
|
MIT License - see LICENSE file for details. |
|
|
|
|
|
## π€ Contributing |
|
|
|
|
|
Contributions are welcome! Please feel free to submit a Pull Request. |