Spaces:
Running
Running
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. |