| # Nano Banana Image Edit API | |
| A FastAPI-based REST API for the Qwen Image Edit model that allows you to upload images, edit them with text prompts, and retrieve results. | |
| ## Features | |
| - **Upload Images**: Upload image files via POST request | |
| - **Edit Images**: Submit image ID and text prompt to edit images | |
| - **Get Results**: Retrieve edited images by task ID | |
| - **Multiple Formats**: Get results as files or base64-encoded strings | |
| ## Installation | |
| 1. Install dependencies: | |
| ```bash | |
| pip install -r requirements_api.txt | |
| ``` | |
| 2. Run the API server: | |
| ```bash | |
| python api.py | |
| ``` | |
| Or using uvicorn directly: | |
| ```bash | |
| uvicorn api:app --reload --host 0.0.0.0 --port 8000 | |
| ``` | |
| ## API Endpoints | |
| ### 1. Upload Image | |
| **POST** `/upload` | |
| Upload an image file. | |
| **Request:** | |
| - Content-Type: `multipart/form-data` | |
| - Body: `file` (image file) | |
| **Response:** | |
| ```json | |
| { | |
| "image_id": "uuid-string", | |
| "message": "Image uploaded successfully", | |
| "timestamp": "2024-01-01T12:00:00" | |
| } | |
| ``` | |
| **Example using curl:** | |
| ```bash | |
| curl -X POST "http://localhost:8000/upload" \ | |
| -F "file=@/path/to/image.jpg" | |
| ``` | |
| ### 2. Edit Image | |
| **POST** `/edit` | |
| Edit an uploaded image using a text prompt. | |
| **Request:** | |
| - Content-Type: `multipart/form-data` | |
| - Body: | |
| - `image_id`: ID of uploaded image | |
| - `prompt`: Text description of desired edit | |
| **Response:** | |
| ```json | |
| { | |
| "task_id": "uuid-string", | |
| "status": "completed", | |
| "message": "Image edited successfully", | |
| "timestamp": "2024-01-01T12:00:00" | |
| } | |
| ``` | |
| **Example using curl:** | |
| ```bash | |
| curl -X POST "http://localhost:8000/edit" \ | |
| -F "image_id=your-image-id" \ | |
| -F "prompt=make the sky more blue" | |
| ``` | |
| ### 3. Get Result | |
| **GET** `/result/{task_id}` | |
| Get the status and result information for an editing task. | |
| **Response:** | |
| ```json | |
| { | |
| "task_id": "uuid-string", | |
| "status": "completed", | |
| "result_image_id": "uuid-string", | |
| "result_image_url": "/result/image/uuid-string", | |
| "timestamp": "2024-01-01T12:00:00" | |
| } | |
| ``` | |
| ### 4. Get Result Image (File) | |
| **GET** `/result/image/{result_image_id}` | |
| Download the edited image as a file. | |
| **Response:** Image file (PNG) | |
| ### 5. Get Result Image (Base64) | |
| **GET** `/result/image/{result_image_id}/base64` | |
| Get the edited image as a base64-encoded string. | |
| **Response:** | |
| ```json | |
| { | |
| "result_image_id": "uuid-string", | |
| "image_base64": "base64-encoded-string", | |
| "format": "png" | |
| } | |
| ``` | |
| ### 6. Health Check | |
| **GET** `/health` | |
| Check API health and model status. | |
| **Response:** | |
| ```json | |
| { | |
| "status": "healthy", | |
| "model_loaded": true, | |
| "model_available": true | |
| } | |
| ``` | |
| ## Usage Example (Python) | |
| ```python | |
| import requests | |
| # Upload image | |
| with open("image.jpg", "rb") as f: | |
| response = requests.post( | |
| "http://localhost:8000/upload", | |
| files={"file": f} | |
| ) | |
| upload_data = response.json() | |
| image_id = upload_data["image_id"] | |
| # Edit image | |
| response = requests.post( | |
| "http://localhost:8000/edit", | |
| data={ | |
| "image_id": image_id, | |
| "prompt": "make the background sunset orange" | |
| } | |
| ) | |
| edit_data = response.json() | |
| task_id = edit_data["task_id"] | |
| # Get result | |
| response = requests.get(f"http://localhost:8000/result/{task_id}") | |
| result_data = response.json() | |
| result_image_id = result_data["result_image_id"] | |
| # Download edited image | |
| response = requests.get(f"http://localhost:8000/result/image/{result_image_id}") | |
| with open("edited_image.png", "wb") as f: | |
| f.write(response.content) | |
| ``` | |
| ## Notes | |
| - The current implementation uses in-memory storage for tasks. For production, consider using: | |
| - Redis or database for task storage | |
| - S3, Azure Blob Storage, or similar for image storage | |
| - Proper authentication and rate limiting | |
| - Async task processing with Celery or similar | |
| - The model loading code is a placeholder. You'll need to adjust it based on the actual Qwen-Image-Edit model interface and requirements. | |
| ## API Documentation | |
| Once the server is running, visit: | |
| - Swagger UI: `http://localhost:8000/docs` | |
| - ReDoc: `http://localhost:8000/redoc` | |