Parallel Gemini API calls with MongoDB logging support
Project description
Gemini Parallel
A Python package for running Gemini API calls in parallel with MongoDB logging support. Supports text, multimodal (images), and structured output processing.
Features
- Parallel Processing: Execute multiple Gemini API calls concurrently with configurable limits
- MongoDB Logging: Log each individual API call to MongoDB for tracking and analysis
- Multiple Modes: Support for text, multimodal (with images), and structured output
- Rate Limiting: Built-in rate limiting and retry logic
- Progress Tracking: Visual progress bars with tqdm
- Flexible Content: Support for various image formats and Pydantic models
Installation
pip install -r requirements.txt
Or install in development mode:
pip install -e .
Dependencies
google-genai- Official Google GenAI Python SDKmotor- Async MongoDB driverpydantic- Data validation and parsingtqdm- Progress barspython-dotenv- Environment variable managementpillow- Image processingpymongo- MongoDB driver
Setup
- Environment Variables: Copy
.env.exampleto.envand fill in your credentials:
# Gemini API Key
GEMINI_API_KEY=your_gemini_api_key_here
# MongoDB Connection URI
MONGODB_URI=mongodb://localhost:27017
- MongoDB: Make sure MongoDB is running and accessible via the URI in your
.envfile.
Quick Start
Basic Text Processing
import asyncio
import os
from dotenv import load_dotenv
from gemini_parallel import ParallelExecutor
load_dotenv()
async def main():
executor = ParallelExecutor(
model="gemini-2.0-flash",
max_concurrent=50,
mongodb_uri=os.getenv("MONGODB_URI")
)
prompts = [
"Explain AI in simple terms",
"What is machine learning?",
"Define deep learning"
]
results = await executor.run_parallel(
items=prompts,
mode="text"
)
for result in results:
print(f"Status: {result['status']}")
if result['status'] == 'success':
print(f"Response: {result['response']}")
asyncio.run(main())
Multimodal with Images
from gemini_parallel import ParallelExecutor, ContentBuilder
# Create content with images
contents = [
ContentBuilder.with_image("image1.jpg", "Describe this image"),
ContentBuilder.with_image("image2.jpg", "What's in this photo?"),
ContentBuilder.with_images(["img1.jpg", "img2.jpg"], "Compare these images")
]
executor = ParallelExecutor(mongodb_uri=os.getenv("MONGODB_URI"))
results = await executor.run_parallel(
items=contents,
mode="multimodal"
)
Structured Output with Pydantic
from pydantic import BaseModel
from typing import List
class Analysis(BaseModel):
sentiment: str
confidence: float
keywords: List[str]
executor = ParallelExecutor(mongodb_uri=os.getenv("MONGODB_URI"))
results = await executor.run_parallel(
items=["Great product!", "Terrible service"],
mode="structured",
response_schema=Analysis
)
MongoDB Logging
Each API call is logged to MongoDB with the following structure:
{
"_id": ObjectId,
"session_id": "uuid-string",
"request_id": "req_0",
"status": "success|failed",
"prompt": "...",
"response": "...",
"error": "...",
"duration_ms": 1234.5,
"timestamp": ISODate,
"model": "gemini-2.0-flash",
"mode": "text|multimodal|structured",
"tokens_input": 100,
"tokens_output": 200
}
Querying Logs
# Get session statistics
stats = await executor.get_session_stats()
print(f"Total calls: {stats['total_calls']}")
print(f"Success rate: {stats['successful_calls']/stats['total_calls']*100:.1f}%")
# Get all calls for session
calls = await executor.get_session_calls()
for call in calls:
print(f"{call['request_id']}: {call['status']} - {call['duration_ms']}ms")
Configuration Options
ParallelExecutor Parameters
model: Gemini model to use (default: "gemini-2.0-flash")max_concurrent: Maximum concurrent requests (default: 50)request_delay: Delay between requests in seconds (default: 0.02)max_retries: Maximum retry attempts (default: 3)mongodb_uri: MongoDB connection URI (optional)api_key: Gemini API key (defaults to GEMINI_API_KEY env var)
Rate Limiting Guidelines
For Gemini 2.5 Flash:
- Free Tier:
max_concurrent=2-5,request_delay=1.0 - Paid Tier 1:
max_concurrent=50,request_delay=0.02(targets ~3000 RPM) - Paid Tier 2:
max_concurrent=100,request_delay=0.01
Examples
Run the provided examples:
# Basic text processing
python examples/basic_parallel.py
# Multimodal with images
python examples/with_images.py
# Structured output
python examples/structured_output.py
Error Handling
The package includes robust error handling:
- Automatic retries with exponential backoff
- Rate limiting to avoid API limits
- Individual call logging for debugging
- Graceful failure handling
Session Management
Each executor creates a unique session ID that groups related calls:
executor = ParallelExecutor(mongodb_uri=uri)
print(f"Session ID: {executor.session_id}")
# All calls in this session will be tagged with this ID
results = await executor.run_parallel(items)
# Query MongoDB for this session's calls
db.api_calls.find({"session_id": executor.session_id})
Contributing
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Submit a pull request
License
MIT License - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gemini_parallel_mongodb-0.1.0.tar.gz.
File metadata
- Download URL: gemini_parallel_mongodb-0.1.0.tar.gz
- Upload date:
- Size: 35.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49a5847e7785fd02744500f0b8599a1f83fcbd3afa8d96a5e9a85a06dec0294e
|
|
| MD5 |
10ddbd4924d31f76e7a3597d575dfa4e
|
|
| BLAKE2b-256 |
2a484793996fa37f18728346ceb125476c7f57a3649e2b61fc48e2558fc330d0
|
File details
Details for the file gemini_parallel_mongodb-0.1.0-py3-none-any.whl.
File metadata
- Download URL: gemini_parallel_mongodb-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.20
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da87897d9fa4e8e90683a88e68643228c475d6406b02ecb20492987253a36283
|
|
| MD5 |
4aa67beda363f130d59d75962e35efb4
|
|
| BLAKE2b-256 |
0257a513a895fa8b4dfefad9aebdf03c8fb171b4ddbc380c8d53281dc16b75ab
|