Spaces:
Configuration error
Configuration error
| # Z-Image-Turbo API Wrapper - Usage Examples | |
| ## Setup | |
| ### 1. Install Dependencies | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| ### 2. Run the Server | |
| ```bash | |
| python app.py | |
| ``` | |
| Or with Gunicorn (production): | |
| ```bash | |
| gunicorn -w 4 -b 0.0.0.0:5000 app:app | |
| ``` | |
| The server will start on `http://localhost:5000` | |
| --- | |
| ## API Endpoints | |
| ### Health Check | |
| ```bash | |
| curl http://localhost:5000/health | |
| ``` | |
| Response: | |
| ```json | |
| {"status": "ok"} | |
| ``` | |
| --- | |
| ### Get API Info | |
| ```bash | |
| curl http://localhost:5000/api/info | |
| ``` | |
| Response: | |
| ```json | |
| { | |
| "api_name": "Z-Image-Turbo API Wrapper", | |
| "version": "1.0.0", | |
| "endpoints": [...] | |
| } | |
| ``` | |
| --- | |
| ## Generate Image | |
| ### Method 1: Curl (Simple) | |
| ```bash | |
| curl -X POST http://localhost:5000/api/generate \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "prompt": "A beautiful sunset over mountains" | |
| }' | |
| ``` | |
| ### Method 2: Curl (With all parameters) | |
| ```bash | |
| curl -X POST http://localhost:5000/api/generate \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "prompt": "A futuristic city with neon lights", | |
| "steps": 30, | |
| "height": 512, | |
| "width": 512 | |
| }' | |
| ``` | |
| ### Method 3: Curl (Save response to file) | |
| ```bash | |
| curl -X POST http://localhost:5000/api/generate \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"prompt": "A cat wearing sunglasses"}' \ | |
| | jq . > response.json | |
| ``` | |
| ### Method 4: Curl (Extract image URL and download) | |
| ```bash | |
| # Generate image and extract URL | |
| RESPONSE=$(curl -s -X POST http://localhost:5000/api/generate \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"prompt": "A dragon flying over a castle"}') | |
| echo "Response: $RESPONSE" | |
| # Extract image URL | |
| IMAGE_URL=$(echo $RESPONSE | jq -r '.image_url') | |
| echo "Image URL: $IMAGE_URL" | |
| # Download the image | |
| if [ ! -z "$IMAGE_URL" ] && [ "$IMAGE_URL" != "null" ]; then | |
| curl -o generated_image.png "$IMAGE_URL" | |
| echo "Image saved to generated_image.png" | |
| else | |
| echo "No image URL found" | |
| fi | |
| ``` | |
| --- | |
| ## Python Examples | |
| ### Method 1: Simple Python Request | |
| ```python | |
| import requests | |
| import json | |
| # API endpoint | |
| url = "http://localhost:5000/api/generate" | |
| # Request payload | |
| payload = { | |
| "prompt": "A beautiful sunset over mountains", | |
| "steps": 20, | |
| "height": 512, | |
| "width": 512 | |
| } | |
| # Make request | |
| response = requests.post(url, json=payload) | |
| result = response.json() | |
| print(json.dumps(result, indent=2)) | |
| # Get the image URL | |
| if result.get("success"): | |
| image_url = result.get("image_url") | |
| print(f"Image URL: {image_url}") | |
| ``` | |
| ### Method 2: Download the Image | |
| ```python | |
| import requests | |
| import json | |
| url = "http://localhost:5000/api/generate" | |
| payload = { | |
| "prompt": "A futuristic city with neon lights", | |
| "steps": 25, | |
| "height": 512, | |
| "width": 512 | |
| } | |
| # Generate image | |
| response = requests.post(url, json=payload) | |
| result = response.json() | |
| print("Generation result:") | |
| print(json.dumps(result, indent=2)) | |
| # Download image if URL is available | |
| if result.get("success") and result.get("image_url"): | |
| image_url = result["image_url"] | |
| print(f"\nDownloading image from: {image_url}") | |
| # Download the image | |
| img_response = requests.get(image_url) | |
| with open("downloaded_image.png", "wb") as f: | |
| f.write(img_response.content) | |
| print("Image saved to downloaded_image.png") | |
| ``` | |
| ### Method 3: Complete Class Wrapper | |
| ```python | |
| import requests | |
| import json | |
| from typing import Optional, Dict | |
| class ZImageTurboClient: | |
| def __init__(self, base_url: str = "http://localhost:5000"): | |
| self.base_url = base_url.rstrip('/') | |
| self.session = requests.Session() | |
| def generate(self, prompt: str, steps: int = 20, | |
| height: int = 512, width: int = 512) -> Optional[Dict]: | |
| """Generate an image""" | |
| url = f"{self.base_url}/api/generate" | |
| payload = { | |
| "prompt": prompt, | |
| "steps": steps, | |
| "height": height, | |
| "width": width | |
| } | |
| try: | |
| response = self.session.post(url, json=payload, timeout=300) | |
| return response.json() | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| return None | |
| def get_image_url(self, result: Dict) -> Optional[str]: | |
| """Extract image URL from result""" | |
| if result and result.get("success"): | |
| return result.get("image_url") | |
| return None | |
| def download_image(self, url: str, filepath: str) -> bool: | |
| """Download image from URL""" | |
| try: | |
| response = requests.get(url) | |
| with open(filepath, "wb") as f: | |
| f.write(response.content) | |
| return True | |
| except Exception as e: | |
| print(f"Download error: {e}") | |
| return False | |
| # Usage | |
| client = ZImageTurboClient() | |
| # Generate image | |
| result = client.generate( | |
| prompt="A peaceful mountain landscape", | |
| steps=20, | |
| height=768, | |
| width=768 | |
| ) | |
| print("Result:") | |
| print(json.dumps(result, indent=2)) | |
| # Get URL | |
| image_url = client.get_image_url(result) | |
| if image_url: | |
| print(f"Image URL: {image_url}") | |
| # Download it | |
| client.download_image(image_url, "my_image.png") | |
| ``` | |
| ### Method 4: Async/Concurrent Requests | |
| ```python | |
| import requests | |
| import json | |
| import asyncio | |
| from concurrent.futures import ThreadPoolExecutor | |
| def generate_image(prompt: str, steps: int = 20) -> Optional[Dict]: | |
| """Generate image (blocking)""" | |
| url = "http://localhost:5000/api/generate" | |
| payload = {"prompt": prompt, "steps": steps} | |
| try: | |
| response = requests.post(url, json=payload, timeout=300) | |
| return response.json() | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| return None | |
| # Generate multiple images in parallel | |
| prompts = [ | |
| "A beautiful sunset", | |
| "A futuristic city", | |
| "A magical forest", | |
| "A serene ocean view" | |
| ] | |
| with ThreadPoolExecutor(max_workers=2) as executor: | |
| results = list(executor.map(generate_image, prompts)) | |
| # Process results | |
| for i, result in enumerate(results): | |
| if result and result.get("success"): | |
| print(f"Image {i+1}: {result.get('image_url')}") | |
| else: | |
| print(f"Image {i+1}: Failed") | |
| ``` | |
| --- | |
| ## Response Format | |
| ### Success Response | |
| ```json | |
| { | |
| "success": true, | |
| "prompt": "A beautiful sunset over mountains", | |
| "steps": 20, | |
| "height": 512, | |
| "width": 512, | |
| "image_url": "https://...", | |
| "image_path": "/path/to/image", | |
| "size": 123456, | |
| "mime_type": "image/png", | |
| "filename": "image.png" | |
| } | |
| ``` | |
| ### Error Response | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Error message here" | |
| } | |
| ``` | |
| --- | |
| ## Common Parameters | |
| | Parameter | Type | Default | Range | Description | | |
| |-----------|------|---------|-------|-------------| | |
| | `prompt` | string | (required) | - | Text description of the image | | |
| | `steps` | integer | 20 | 1-50 | Number of inference steps | | |
| | `height` | integer | 512 | - | Image height in pixels | | |
| | `width` | integer | 512 | - | Image width in pixels | | |
| --- | |
| ## Tips | |
| 1. **First request is slow**: The Gradio API needs time to initialize | |
| 2. **Steps vs Quality**: Higher steps = better quality but slower | |
| - 8-15: Fast, lower quality | |
| - 20-30: Recommended (good balance) | |
| - 40-50: High quality but slower | |
| 3. **Image size**: Larger images take longer to generate | |
| 4. **Timeout**: Default timeout is 300 seconds (5 minutes) | |
| 5. **Prompts**: More detailed prompts = better results | |
| --- | |
| ## Troubleshooting | |
| ### "Connection refused" | |
| - Make sure the Flask server is running: `python app.py` | |
| ### "Failed to get result" | |
| - The Gradio API might be slow or down | |
| - Try again with fewer steps or smaller image size | |
| ### Timeout error | |
| - The image is taking too long to generate | |
| - Try reducing steps or image dimensions | |
| ### Empty image URL | |
| - The API didn't return the image data | |
| - Check the Flask logs for details | |
| --- | |
| ## Deploying to Production | |
| ### Using Gunicorn (Recommended) | |
| ```bash | |
| gunicorn -w 4 -b 0.0.0.0:5000 --timeout 300 app:app | |
| ``` | |
| ### Using Docker | |
| ```dockerfile | |
| FROM python:3.10-slim | |
| WORKDIR /app | |
| COPY requirements.txt . | |
| RUN pip install -r requirements.txt | |
| COPY app.py . | |
| EXPOSE 5000 | |
| CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "--timeout", "300", "app:app"] | |
| ``` | |
| Build and run: | |
| ```bash | |
| docker build -t z-image-api . | |
| docker run -p 5000:5000 z-image-api | |
| ``` | |
| ### Using Environment Variables | |
| Create `.env` file: | |
| ``` | |
| GRADIO_API_URL=https://mohamedislegend4-z-image-turbo-api.hf.space | |
| PORT=5000 | |
| DEBUG=False | |
| ``` | |
| Then modify `app.py` to load them: | |
| ```python | |
| from dotenv import load_dotenv | |
| import os | |
| load_dotenv() | |
| GRADIO_API_URL = os.getenv("GRADIO_API_URL", "https://...") | |
| PORT = int(os.getenv("PORT", 5000)) | |
| ``` | |