Create or Edit Image
+ + + + +Conversation History
+ +Generated Image
+ +Your generated image will appear here
+commit 4deed84ba0bf1654b50b02dba8aac92d962564b1
Author: DJP All session data has been cleared. ERROR: API key not configured in config.php API Key configured: Yes (ending in " . substr(GEMINI_API_KEY, -8) . ") HTTP Status Code: $httpCode cURL Error: $curlError Parts found: " . count($parsed['candidates'][0]['content']['parts']) . " Part $index structure: β Image data found in inline_data format! Data length: " . strlen($part['inline_data']['data']) . " characters β Image data found in inlineData format! Data length: " . strlen($part['inlineData']['data']) . " characters No image data in this part ERROR: No candidates/content/parts found in response API Error: " . htmlspecialchars($parsed['error']['message'] ?? 'Unknown error') . " β No API key configured! β
API Key: " . substr($apiKey, 0, 10) . "..." . substr($apiKey, -6) . " β
API connection successful! Available models with IMAGE generation: β Could not fetch models. Response: Model: $model URL: $url β³ Sending request... HTTP Status Code: ";
+if ($httpCode == 200) {
+ echo "$httpCode β
';
+
+// RIGHT - store and use actual MIME type:
+$_SESSION['current_image'] = $base64;
+$_SESSION['current_image_mime'] = $mimeType; // e.g., "image/jpeg"
+echo '
';
+```
+
+**Why this matters:**
+- Gemini returns `image/jpeg`
+- If you display as `image/png`, browser may fail to render
+- Store BOTH base64 data AND MIME type
+
+---
+
+### 4. BASE64 DATA HANDLING
+
+**β οΈ WATCHOUT #5:** Base64 data must be CLEAN!
+
+```javascript
+// WRONG - includes data URI prefix:
+const base64 = reader.result; // "data:image/jpeg;base64,/9j/4AAQ..."
+
+// RIGHT - strip the prefix:
+const base64 = reader.result.split(',')[1]; // "/9j/4AAQ..."
+```
+
+**Validation:**
+```php
+// Clean whitespace
+$inputImage = preg_replace('/\s+/', '', $inputImage);
+
+// Validate format
+if (!preg_match('/^[A-Za-z0-9+\/]+={0,2}$/', $inputImage)) {
+ throw new Exception("Invalid base64 format");
+}
+```
+
+---
+
+### 5. THE EDITING FLOW
+
+**β οΈ WATCHOUT #6:** Session management is CRITICAL for editing to work!
+
+```php
+// Step 1: Generate first image
+$response = $api->generateImage("cyberpunk city", "16:9", "2K", null);
+$imageData = extractImageData($response);
+$_SESSION['current_image'] = $imageData['base64'];
+$_SESSION['current_image_mime'] = $imageData['mime_type'];
+
+// Step 2: Edit existing image
+$previousImage = $_SESSION['current_image']; // Get from session
+$response = $api->generateImage("add rain", "16:9", "2K", $previousImage);
+$imageData = extractImageData($response);
+$_SESSION['current_image'] = $imageData['base64']; // Update session
+```
+
+**Flow:**
+1. Store generated image in session
+2. On edit request, retrieve from session
+3. Send as `inline_data` in request
+4. Store new result back to session
+5. Repeat for each edit
+
+---
+
+### 6. ERROR HANDLING - THE TRICKY PART
+
+**β οΈ WATCHOUT #7:** Multiple error types, each needs specific handling!
+
+```php
+// Check finishReason FIRST
+if (isset($response['candidates'][0]['finishReason'])) {
+ $reason = $response['candidates'][0]['finishReason'];
+
+ if ($reason === 'IMAGE_RECITATION') {
+ throw new Exception('Blocked by content filter. Use more creative prompts.');
+ }
+
+ if ($reason === 'SAFETY') {
+ throw new Exception('Blocked by safety filters.');
+ }
+
+ // Only proceed if STOP
+ if ($reason !== 'STOP') {
+ throw new Exception('Generation failed: ' . $reason);
+ }
+}
+
+// Then extract image
+foreach ($response['candidates'][0]['content']['parts'] as $part) {
+ if (isset($part['inlineData']['data'])) {
+ return $part['inlineData'];
+ }
+}
+```
+
+**Common Errors:**
+
+| Error | HTTP Code | Cause | Solution |
+|-------|-----------|-------|----------|
+| IMAGE_RECITATION | 200 | Prompt too generic | Use creative, detailed prompts |
+| Internal error | 500 | API temporary issue | Retry with exponential backoff |
+| RESOURCE_EXHAUSTED | 429 | Rate limit | Wait 30s between requests |
+| INVALID_ARGUMENT | 400 | Bad request format | Check base64 encoding |
+
+---
+
+### 7. PROMPT ENGINEERING
+
+**β οΈ WATCHOUT #8:** Simple prompts WILL fail!
+
+```javascript
+// β WILL FAIL (IMAGE_RECITATION):
+"a red circle"
+"a blue square"
+"a tree"
+"a car"
+
+// β
WILL WORK:
+"a vintage red sports car racing through a neon-lit cyberpunk city at night"
+"a magical forest with glowing blue mushrooms and fireflies at twilight"
+"a futuristic cityscape with flying vehicles and holographic billboards"
+```
+
+**Rules:**
+- Minimum 10 words
+- Include adjectives (vintage, glowing, futuristic)
+- Add context (at night, in rain, during sunset)
+- Avoid single objects
+- Be creative and specific
+
+---
+
+### 8. FILE UPLOAD HANDLING
+
+**β οΈ WATCHOUT #9:** File conversion must be done client-side!
+
+```javascript
+// Convert file to base64 (client-side)
+function fileToBase64(file) {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.onload = () => {
+ // CRITICAL: Remove data URI prefix!
+ const base64 = reader.result.split(',')[1];
+ resolve(base64);
+ };
+ reader.onerror = reject;
+ reader.readAsDataURL(file);
+ });
+}
+
+// Usage
+const file = uploadInput.files[0];
+const base64 = await fileToBase64(file);
+formData.append('uploadedImage', base64);
+formData.append('uploadedImageType', file.type);
+```
+
+**Backend handling:**
+```php
+if ($uploadedImage) {
+ // Store uploaded image
+ $_SESSION['current_image'] = $uploadedImage;
+ $_SESSION['current_image_mime'] = $uploadedImageType;
+
+ // If prompt provided, apply it
+ if ($prompt) {
+ $response = $api->generateImage($prompt, $aspectRatio, $imageSize, $uploadedImage);
+ // Update with edited version
+ }
+}
+```
+
+---
+
+### 9. SESSION MANAGEMENT
+
+**β οΈ WATCHOUT #10:** Session structure is critical!
+
+```php
+// Initialize (MUST be done before any output)
+session_start();
+
+// Required session variables
+$_SESSION['current_image'] = null; // Base64 string
+$_SESSION['current_image_mime'] = 'image/png'; // MIME type
+$_SESSION['conversation_history'] = []; // Array of prompts
+$_SESSION['image_history'] = []; // Array of previous images
+
+// Reset (clear everything)
+$_SESSION['conversation_history'] = [];
+$_SESSION['current_image'] = null;
+$_SESSION['current_image_mime'] = 'image/png';
+$_SESSION['image_history'] = [];
+```
+
+---
+
+### 10. API CONFIGURATION
+
+**β οΈ WATCHOUT #11:** Endpoint and model name are specific!
+
+```php
+// CORRECT endpoint:
+$url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent";
+
+// Header format:
+'x-goog-api-key: YOUR_API_KEY' // NOT 'Authorization: Bearer'
+
+// Timeout:
+CURLOPT_TIMEOUT => 120 // 2 minutes - image generation is SLOW
+```
+
+**Model name:** `gemini-3-pro-image-preview`
+- May change in future
+- Check Google's docs if errors persist
+
+---
+
+## π DEBUGGING CHECKLIST
+
+When things don't work, check IN THIS ORDER:
+
+### 1. Is the request format correct?
+```php
+error_log("Request payload: " . json_encode($payload));
+```
+
+### 2. Is the response structure what you expect?
+```php
+error_log("Response structure: " . json_encode($response));
+```
+
+### 3. Check finishReason:
+```php
+$reason = $response['candidates'][0]['finishReason'] ?? 'UNKNOWN';
+error_log("Finish reason: " . $reason);
+```
+
+### 4. Verify base64 data:
+```php
+error_log("Base64 length: " . strlen($base64));
+error_log("First 50 chars: " . substr($base64, 0, 50));
+```
+
+### 5. Check MIME type matching:
+```php
+error_log("Stored MIME: " . $_SESSION['current_image_mime']);
+error_log("Response MIME: " . $response['candidates'][0]['content']['parts'][0]['inlineData']['mimeType']);
+```
+
+---
+
+## π COMMON MISTAKES TO AVOID
+
+### Mistake #1: Wrong request structure
+```json
+// β WRONG - text before image:
+{"parts": [{"text": "..."}, {"inline_data": {...}}]}
+
+// β
RIGHT - image before text:
+{"parts": [{"inline_data": {...}}, {"text": "..."}]}
+```
+
+### Mistake #2: Not checking finishReason
+```php
+// β WRONG - directly accessing parts:
+$image = $response['candidates'][0]['content']['parts'][0]['inlineData']['data'];
+
+// β
RIGHT - check finishReason first:
+if ($response['candidates'][0]['finishReason'] === 'IMAGE_RECITATION') {
+ // Handle blocked content
+}
+```
+
+### Mistake #3: Hardcoded MIME types
+```php
+// β WRONG:
+echo '
'; // Assumes PNG
+
+// β
RIGHT:
+echo '
'; // Uses actual type
+```
+
+### Mistake #4: Not cleaning base64
+```javascript
+// β WRONG:
+const base64 = reader.result; // Includes "data:image/png;base64,"
+
+// β
RIGHT:
+const base64 = reader.result.split(',')[1]; // Only base64 part
+```
+
+### Mistake #5: Missing error handling
+```php
+// β WRONG:
+$response = curl_exec($ch);
+return json_decode($response);
+
+// β
RIGHT:
+$response = curl_exec($ch);
+$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+if ($httpCode !== 200) {
+ // Handle errors
+}
+```
+
+---
+
+## π DATA FLOW DIAGRAM
+
+```
+βββββββββββββββββββ
+β User Action β
+β (Prompt/Upload)β
+ββββββββββ¬βββββββββ
+ β
+ βΌ
+βββββββββββββββββββ
+β JavaScript β
+β - Validate β
+β - Convert file β
+β - Build FormDataβ
+ββββββββββ¬βββββββββ
+ β
+ βΌ
+βββββββββββββββββββ
+β api.php β
+β - Get session β
+β - Build request β
+β - Call Gemini β
+ββββββββββ¬βββββββββ
+ β
+ βΌ
+βββββββββββββββββββ
+β Gemini API β
+β - Process β
+β - Check filters β
+β - Generate β
+ββββββββββ¬βββββββββ
+ β
+ βΌ
+βββββββββββββββββββ
+β Extract Responseβ
+β - Check finish β
+β - Get base64 β
+β - Get MIME type β
+ββββββββββ¬βββββββββ
+ β
+ βΌ
+βββββββββββββββββββ
+β Store Session β
+β - current_image β
+β - image_mime β
+β - history β
+ββββββββββ¬βββββββββ
+ β
+ βΌ
+βββββββββββββββββββ
+β Return to JS β
+β - Success flag β
+β - Reload page β
+ββββββββββ¬βββββββββ
+ β
+ βΌ
+βββββββββββββββββββ
+β Display Image β
+β - Data URI β
+β - Correct MIME β
+βββββββββββββββββββ
+```
+
+---
+
+## π§ TESTING STRATEGY
+
+### Test 1: Basic Generation
+```
+Prompt: "A futuristic motorcycle in a neon-lit city"
+Expected: Image generated successfully
+```
+
+### Test 2: Simple Edit
+```
+1. Generate: "A red sports car"
+2. Edit: "add rain and reflections"
+Expected: Car now has rain
+```
+
+### Test 3: Upload
+```
+1. Upload: photo.jpg
+2. No prompt
+Expected: Photo stored, ready for editing
+```
+
+### Test 4: Upload + Edit
+```
+1. Upload: landscape.jpg
+2. Prompt: "make it look like a watercolor painting"
+Expected: Transformed image
+```
+
+### Test 5: Error Handling
+```
+Prompt: "a blue square"
+Expected: IMAGE_RECITATION error with helpful message
+```
+
+---
+
+## π¨ CRITICAL SUCCESS FACTORS
+
+**You MUST get these right or the system will NOT work:**
+
+1. β
**Request format** - Image before text, correct structure
+2. β
**Response parsing** - Check finishReason first
+3. β
**MIME type handling** - Store and use dynamically
+4. β
**Base64 cleaning** - No whitespace, no prefixes
+5. β
**Session management** - Store both data and MIME type
+6. β
**Error handling** - Different errors need different responses
+7. β
**Prompt quality** - Detailed, creative prompts only
+8. β
**File upload** - Client-side base64 conversion
+9. β
**API timeout** - 120 seconds minimum
+10. β
**Retry logic** - For temporary API failures
+
+---
+
+## π QUICK REFERENCE
+
+### Essential Code Patterns
+
+**Check finishReason:**
+```php
+$reason = $response['candidates'][0]['finishReason'] ?? null;
+if ($reason !== 'STOP') {
+ // Handle error
+}
+```
+
+**Extract image:**
+```php
+foreach ($response['candidates'][0]['content']['parts'] as $part) {
+ if (isset($part['inlineData']['data'])) {
+ return [
+ 'base64' => $part['inlineData']['data'],
+ 'mime_type' => $part['inlineData']['mimeType']
+ ];
+ }
+}
+```
+
+**Store in session:**
+```php
+$_SESSION['current_image'] = $imageData['base64'];
+$_SESSION['current_image_mime'] = $imageData['mime_type'];
+```
+
+**Display image:**
+```php
+
+```
+
+---
+
+## π― IMPLEMENTATION CHECKLIST
+
+Before considering the implementation complete:
+
+- [ ] Image generation works with detailed prompts
+- [ ] Image editing works (sends previous image)
+- [ ] IMAGE_RECITATION errors handled gracefully
+- [ ] MIME type stored and used correctly
+- [ ] File upload converts to base64 properly
+- [ ] Session persists across requests
+- [ ] Error messages are helpful
+- [ ] Debug panel shows request/response
+- [ ] Simple prompts show helpful error
+- [ ] Retry logic works for 500 errors
+- [ ] Rate limiting handled
+- [ ] Base64 data validated
+- [ ] Conversation history tracked
+- [ ] Reset clears session properly
+
+---
+
+## π‘ TIPS FOR AI ASSISTANTS
+
+When helping users implement this:
+
+1. **Show the request JSON first** - Most problems are here
+2. **Emphasize finishReason checking** - Critical for error handling
+3. **Explain MIME type importance** - Common source of display issues
+4. **Warn about simple prompts** - Will trigger IMAGE_RECITATION
+5. **Test with detailed prompts** - "red circle" will fail
+6. **Check session management** - Editing requires proper storage
+7. **Validate base64 format** - Clean data is essential
+8. **Add debug logging** - Makes troubleshooting easier
+9. **Handle all error types** - Different errors need different solutions
+10. **Test the full flow** - Generate β Edit β Edit
+
+---
+
+## π REFERENCES
+
+- **API Endpoint:** `https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent`
+- **Model:** `gemini-3-pro-image-preview`
+- **Auth Header:** `x-goog-api-key: YOUR_KEY`
+- **Response Format:** JSON with base64 in `inlineData`
+- **Request Format:** JSON with `inline_data` for editing
+
+---
+
+## β‘ FINAL NOTES
+
+This implementation is **working and stable** when these rules are followed:
+
+1. Use creative, detailed prompts (10+ words)
+2. Check `finishReason` before extracting image
+3. Store and use correct MIME types
+4. Clean base64 data (no whitespace/prefixes)
+5. Manage session properly for editing
+6. Handle all error types specifically
+7. Implement retry logic for temporary failures
+8. Validate uploaded files before processing
+
+**The system works reliably when these patterns are followed exactly.**
+
+---
+
+*Generated from working implementation - December 2024*
diff --git a/Banana.save b/Banana.save
new file mode 100644
index 0000000..f250dfd
--- /dev/null
+++ b/Banana.save
@@ -0,0 +1,37 @@
+API Key configured: Yes (ending in iuNdhKtM)
+
+Request Details:
+URL: https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent
+Payload: {
+ "contents": [
+ {
+ "parts": [
+ {
+ "text": "A simple red circle on white background"
+ }
+ ]
+ }
+ ],
+ "generationConfig": {
+ "responseModalities": [
+ "IMAGE"
+ ],
+ "imageConfig": {
+ "aspectRatio": "1:1",
+ "imageSize": "1K"
+ }
+ }
+}
+Making API Call...
+HTTP Status Code: 200
+
+Raw Response:
+{
+ "candidates": [
+ {
+ "content": {
+ "parts": [
+ {
+ "inlineData": {
+ "mimeType": "image/jpeg",
+ "data": "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
diff --git a/QUICK_REFERENCE.md b/QUICK_REFERENCE.md
new file mode 100644
index 0000000..fee4783
--- /dev/null
+++ b/QUICK_REFERENCE.md
@@ -0,0 +1,242 @@
+# Nano Banana Pro - Quick Reference Card
+
+## π¨ MOST CRITICAL MISTAKES TO AVOID
+
+### 1. Wrong Request Order
+```json
+β WRONG: {"parts": [{"text": "..."}, {"inline_data": {...}}]}
+β
RIGHT: {"parts": [{"inline_data": {...}}, {"text": "..."}]}
+```
+**Image MUST come before text!**
+
+### 2. Not Checking finishReason
+```php
+β WRONG: $image = $response['candidates'][0]['content']['parts'][0];
+β
RIGHT: if ($reason === 'IMAGE_RECITATION') { /* handle */ }
+```
+**ALWAYS check finishReason first!**
+
+### 3. Hardcoded MIME Type
+```php
+β WRONG:
+β
RIGHT:
+```
+**Store and use dynamic MIME type!**
+
+### 4. Dirty Base64
+```javascript
+β WRONG: const base64 = reader.result;
+β
RIGHT: const base64 = reader.result.split(',')[1];
+```
+**Remove data URI prefix!**
+
+### 5. Simple Prompts
+```
+β WRONG: "a red circle"
+β
RIGHT: "a vintage red sports car in a neon city"
+```
+**10+ words, creative, detailed!**
+
+---
+
+## π ESSENTIAL PATTERNS
+
+### Request Structure (New Image)
+```json
+{
+ "contents": [{
+ "parts": [{"text": "detailed creative prompt"}]
+ }],
+ "generationConfig": {
+ "responseModalities": ["IMAGE"],
+ "imageConfig": {
+ "aspectRatio": "16:9",
+ "imageSize": "2K"
+ }
+ }
+}
+```
+
+### Request Structure (Edit Image)
+```json
+{
+ "contents": [{
+ "parts": [
+ {
+ "inline_data": {
+ "mime_type": "image/jpeg",
+ "data": "base64_here"
+ }
+ },
+ {"text": "edit instruction"}
+ ]
+ }],
+ "generationConfig": {
+ "responseModalities": ["IMAGE"],
+ "imageConfig": {
+ "aspectRatio": "16:9",
+ "imageSize": "2K"
+ }
+ }
+}
+```
+
+### Extract Image from Response
+```php
+// 1. Check finishReason
+$reason = $response['candidates'][0]['finishReason'];
+if ($reason === 'IMAGE_RECITATION') {
+ throw new Exception('Content blocked');
+}
+
+// 2. Extract image
+foreach ($response['candidates'][0]['content']['parts'] as $part) {
+ if (isset($part['inlineData']['data'])) {
+ return [
+ 'base64' => $part['inlineData']['data'],
+ 'mime_type' => $part['inlineData']['mimeType']
+ ];
+ }
+}
+```
+
+### Session Management
+```php
+// Store
+$_SESSION['current_image'] = $base64;
+$_SESSION['current_image_mime'] = $mimeType;
+
+// Retrieve for editing
+$previousImage = $_SESSION['current_image'];
+
+// Reset
+$_SESSION['current_image'] = null;
+$_SESSION['current_image_mime'] = 'image/png';
+```
+
+### File Upload (Client)
+```javascript
+function fileToBase64(file) {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.onload = () => {
+ const base64 = reader.result.split(',')[1]; // Remove prefix!
+ resolve(base64);
+ };
+ reader.readAsDataURL(file);
+ });
+}
+```
+
+---
+
+## π― ERROR HANDLING MAP
+
+| finishReason | Action |
+|--------------|--------|
+| `IMAGE_RECITATION` | Prompt too generic - ask for creative prompt |
+| `SAFETY` | Content filter - different prompt needed |
+| `STOP` | Success - extract image |
+| Empty content | Check for API error in response |
+
+| HTTP Code | Meaning | Solution |
+|-----------|---------|----------|
+| 200 | Success | Extract image |
+| 400 | Bad request | Check base64/format |
+| 429 | Rate limit | Wait 30s |
+| 500 | Internal error | Retry with backoff |
+
+---
+
+## π KEY DIFFERENCES FROM OTHER APIS
+
+| Aspect | Gemini | DALL-E/SD |
+|--------|--------|-----------|
+| Endpoint | generateContent | dedicated image API |
+| Response | base64 in JSON | URL to image |
+| Editing | Send previous base64 | Separate edit endpoint |
+| Filters | Very aggressive | More lenient |
+| MIME handling | Dynamic (jpeg) | Fixed (png) |
+| Auth header | x-goog-api-key | Authorization Bearer |
+
+---
+
+## β‘ DEBUGGING STEPS
+
+1. Log request payload
+2. Log response structure
+3. Check finishReason
+4. Verify base64 length
+5. Check MIME type match
+6. Test with known-good prompt
+7. Clear session and retry
+8. Check server logs
+
+---
+
+## π WORKING PROMPTS
+
+β
**These work:**
+- "A futuristic motorcycle racing through a neon-lit cyberpunk city at night"
+- "A magical forest with glowing blue mushrooms and fireflies at twilight"
+- "A vintage red sports car on a winding mountain road during sunset"
+- "An astronaut floating in deep space with colorful nebulas in background"
+
+β **These fail:**
+- "a motorcycle"
+- "a forest"
+- "a car"
+- "a circle"
+
+**Rule: 10+ words, creative, contextual**
+
+---
+
+## π οΈ API CONFIG
+
+```php
+$url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent";
+
+$headers = [
+ 'Content-Type: application/json',
+ 'x-goog-api-key: ' . $apiKey
+];
+
+$options = [
+ CURLOPT_TIMEOUT => 120 // 2 minutes!
+];
+```
+
+---
+
+## β
IMPLEMENTATION CHECKLIST
+
+- [ ] Image before text in parts array
+- [ ] finishReason checked first
+- [ ] MIME type stored and used
+- [ ] Base64 cleaned (no prefix)
+- [ ] Session manages both data and MIME
+- [ ] Detailed prompts required
+- [ ] Error types handled specifically
+- [ ] Retry logic for 500 errors
+- [ ] File upload converts properly
+- [ ] Display uses correct MIME type
+
+---
+
+## π GOTCHAS
+
+1. Request uses `inline_data`, response uses `inlineData`
+2. Gemini returns `image/jpeg`, not `png`
+3. Simple prompts trigger `IMAGE_RECITATION`
+4. HTTP 200 doesn't mean success (check finishReason)
+5. Base64 in requests must be pristine
+6. Image MUST come before text in parts
+7. Session MUST store MIME type
+8. 120s timeout minimum
+9. Retry on 500 errors
+10. Check content array isn't empty
+
+---
+
+*Keep this card handy when implementing!*
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d8e9e69
--- /dev/null
+++ b/README.md
@@ -0,0 +1,244 @@
+# Nano Banana Pro Image Generator
+
+A sleek HTML/PHP web application for generating and iteratively editing images using Google's Nano Banana Pro (Gemini 3 Pro Image Preview) API.
+
+## Features
+
+- **Text-to-Image Generation**: Create images from text descriptions
+- **Iterative Editing**: Refine images with natural language prompts like "make it red", "add sunset", "remove background"
+- **Multiple Resolutions**: Support for 1K, 2K, and 4K image generation
+- **Multiple Aspect Ratios**: 16:9, 1:1, 9:16, 4:3, 3:4, and more
+- **Conversation History**: Track all your prompts and edits
+- **Quick Edit Buttons**: Pre-configured editing shortcuts
+- **Modern UI**: Clean black and gold design with Montserrat font
+
+## Requirements
+
+- PHP 7.4 or higher
+- cURL extension enabled
+- Google Gemini API key with billing enabled
+
+## Installation
+
+### 1. Get Your API Key
+
+1. Visit [Google AI Studio](https://aistudio.google.com/app/apikey)
+2. Create a new API key
+3. **Important**: Enable billing on your Google Cloud account (Nano Banana Pro requires paid access)
+
+### 2. Configure the Application
+
+1. Open `config.php`
+2. Add your API key:
+
+```php
+define('GEMINI_API_KEY', 'YOUR_API_KEY_HERE');
+```
+
+### 3. Set Up Your Web Server
+
+#### Option A: PHP Built-in Server (Development)
+
+```bash
+php -S localhost:8000
+```
+
+Then visit: `http://localhost:8000`
+
+#### Option B: Apache/NGINX (Production)
+
+1. Point your web server document root to this directory
+2. Ensure PHP is properly configured
+3. Make sure session support is enabled
+
+### 4. Configure Permissions
+
+Ensure PHP can write session files:
+
+```bash
+chmod 755 /path/to/NANO-RESEARCH
+```
+
+## Usage
+
+### Creating Your First Image
+
+1. Open the application in your browser
+2. Enter a detailed prompt in the text area (e.g., "A photorealistic sunset over mountains with dramatic clouds")
+3. Choose your preferred aspect ratio and resolution
+4. Click "Generate Image"
+5. Wait 10-30 seconds for the image to generate
+
+### Iterative Editing
+
+Once you have an image:
+
+1. Enter edit instructions like:
+ - "Make the sky more orange"
+ - "Add a lake in the foreground"
+ - "Remove the clouds"
+ - "Make it look like a painting"
+2. Click "Edit Image"
+3. The AI will modify your existing image based on the instructions
+
+### Quick Edit Buttons
+
+Use the pre-configured buttons for common edits:
+- **Add Lighting**: Enhance dramatic lighting
+- **Add Sunset**: Add sunset background
+- **More Vibrant**: Increase color saturation
+- **Motion Blur**: Add movement effect
+- **Photorealistic**: Enhance realism
+- **Depth of Field**: Add bokeh effect
+
+### Starting Over
+
+Click "Start New Image" to clear your current image and conversation history.
+
+## API Pricing
+
+**Nano Banana Pro Pricing** (as of 2025):
+- 1K/2K images: ~$0.13 per image
+- 4K images: ~$0.24 per image
+
+**Alternative Providers** (20-50% cheaper):
+- [Kie.ai](https://kie.ai/nano-banana-pro): $0.12 per 1K-2K image
+- [fal.ai](https://fal.ai/models/fal-ai/nano-banana-pro): Competitive pricing
+- CometAPI: Various pricing tiers
+
+To use alternative providers, modify the `$baseUrl` in `api.php`.
+
+## File Structure
+
+```
+NANO-RESEARCH/
+βββ index.php # Main application interface
+βββ api.php # Backend API handler
+βββ config.php # Configuration file (add your API key here)
+βββ config.example.php # Configuration template
+βββ README.md # This file
+```
+
+## Troubleshooting
+
+### "API key not configured" Error
+
+- Make sure you've added your API key to `config.php`
+- Check that the API key is between the quotes: `define('GEMINI_API_KEY', 'your-key-here');`
+
+### "API error: 403" or "Permission denied"
+
+- Ensure billing is enabled on your Google Cloud account
+- Nano Banana Pro requires a paid Google Cloud account (no free tier)
+
+### "Connection timeout" Error
+
+- Image generation can take 10-60 seconds
+- For 4K images, it may take longer
+- Check your internet connection
+
+### Images Not Displaying
+
+- Check browser console for errors
+- Ensure PHP sessions are working (`session_start()` errors)
+- Verify file permissions
+
+### "cURL error" Messages
+
+- Ensure PHP cURL extension is installed and enabled
+- Check: `php -m | grep curl`
+- Install if missing: `sudo apt-get install php-curl` (Ubuntu/Debian)
+
+## Security Notes
+
+1. **Never commit `config.php` to version control** - it contains your API key
+2. The API key should be kept secret
+3. Consider adding rate limiting for production use
+4. Add `.htaccess` or nginx rules to prevent direct access to `config.php`
+
+### Recommended .htaccess
+
+```apache
+
β
Session Cleared!
+ Request Details:
";
+echo "URL: $url
";
+echo "Payload: " . json_encode($payload, JSON_PRETTY_PRINT) . "
";
+
+echo "Making API Call...
";
+
+$ch = curl_init($url);
+curl_setopt_array($ch, [
+ CURLOPT_HTTPHEADER => [
+ 'Content-Type: application/json',
+ 'x-goog-api-key: ' . GEMINI_API_KEY
+ ],
+ CURLOPT_POST => true,
+ CURLOPT_POSTFIELDS => json_encode($payload),
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_SSL_VERIFYPEER => true,
+ CURLOPT_TIMEOUT => 120
+]);
+
+$response = curl_exec($ch);
+$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+$curlError = curl_error($ch);
+curl_close($ch);
+
+echo "Raw Response:
";
+echo "";
+echo htmlspecialchars($response);
+echo "
";
+
+echo "Parsed Response:
";
+$parsed = json_decode($response, true);
+echo "";
+print_r($parsed);
+echo "
";
+
+// Check if image exists
+if (isset($parsed['candidates'][0]['content']['parts'])) {
+ echo "Response Analysis:
";
+ echo "" . print_r(array_keys($part), true) . "
";
+
+ if (isset($part['inline_data']['data'])) {
+ echo "";
+ } elseif (isset($part['inlineData']['data'])) {
+ echo "
";
+ } else {
+ echo "
" . print_r($parsed['error'], true) . "
";
+ }
+}
diff --git a/debug_request.php b/debug_request.php
new file mode 100644
index 0000000..a59cf26
--- /dev/null
+++ b/debug_request.php
@@ -0,0 +1,155 @@
+
+body { font-family: monospace; background: #000; color: #0f0; padding: 20px; }
+h2, h3 { color: #0ff; }
+pre { background: #111; padding: 15px; border-left: 3px solid #0f0; overflow-x: auto; }
+.error { color: #f00; }
+.success { color: #0f0; }
+.warning { color: #ff0; }
+img { background: #fff; padding: 10px; }
+";
+
+echo "π Gemini API Diagnostic Tool
";
+
+// Test 1: Check API key
+echo "Test 1: API Key Check
";
+$apiKey = GEMINI_API_KEY;
+if (empty($apiKey)) {
+ echo "Test 2: Check Available Models
";
+$listUrl = 'https://generativelanguage.googleapis.com/v1beta/models';
+$ch = curl_init($listUrl . '?key=' . $apiKey);
+curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+$modelsResponse = curl_exec($ch);
+$modelsData = json_decode($modelsResponse, true);
+curl_close($ch);
+
+if (isset($modelsData['models'])) {
+ echo "";
+ foreach ($modelsData['models'] as $model) {
+ if (isset($model['supportedGenerationMethods']) &&
+ in_array('generateContent', $model['supportedGenerationMethods'])) {
+ $modelName = $model['name'];
+ $displayName = $model['displayName'] ?? $modelName;
+ // Check if model supports image generation
+ if (stripos($modelName, 'imagen') !== false ||
+ stripos($displayName, 'image') !== false ||
+ stripos($modelName, 'gemini') !== false) {
+ echo "
";
+} else {
+ echo "" . json_encode($modelsData, JSON_PRETTY_PRINT) . "
";
+}
+
+// Test 3: Try the image generation with the current model
+echo "Test 3: Image Generation Test
";
+$model = 'gemini-3-pro-image-preview';
+$url = "https://generativelanguage.googleapis.com/v1beta/models/{$model}:generateContent";
+
+$payload = [
+ 'contents' => [
+ [
+ 'parts' => [
+ ['text' => 'A simple red circle on white background']
+ ]
+ ]
+ ],
+ 'generationConfig' => [
+ 'responseModalities' => ['IMAGE'],
+ 'imageConfig' => [
+ 'aspectRatio' => '1:1',
+ 'imageSize' => '1K'
+ ]
+ ]
+];
+
+echo "Request Payload (click to expand)
";
+echo "" . json_encode($payload, JSON_PRETTY_PRINT) . "
";
+echo "
cURL Error: $curlError
"; +} + +$responseData = json_decode($response, true); +echo "" . json_encode($responseData, JSON_PRETTY_PRINT) . ""; +echo "
" . json_encode($responseData['error'], JSON_PRETTY_PRINT) . ""; + + if (isset($responseData['error']['message'])) { + $errorMsg = $responseData['error']['message']; + echo "
Error Message: $errorMsg
"; + + // Provide helpful suggestions + if (stripos($errorMsg, 'not found') !== false || stripos($errorMsg, 'models/') !== false) { + echo "π‘ Suggestion: The model name might be incorrect or deprecated.
"; + } elseif (stripos($errorMsg, 'quota') !== false || stripos($errorMsg, 'limit') !== false) { + echo "π‘ Suggestion: You may have exceeded your API quota.
"; + } elseif (stripos($errorMsg, 'internal') !== false) { + echo "π‘ Suggestion: This might be a temporary API issue or the model is having problems.
"; + } + } +} + +// Check for image in response +if (isset($responseData['candidates'][0]['content']['parts'][0]['inlineData']['data'])) { + echo "MIME Type: $mimeType
"; + echo "Data length: " . strlen($imageData) . " characters
"; + echo "Debug completed at " . date('Y-m-d H:i:s') . "
"; +?> diff --git a/get_logs.php b/get_logs.php new file mode 100644 index 0000000..3e62b77 --- /dev/null +++ b/get_logs.php @@ -0,0 +1,38 @@ + true, + 'logs' => $logs, + 'log_file' => $errorLog +]); diff --git a/index.php b/index.php new file mode 100644 index 0000000..6d8d7b5 --- /dev/null +++ b/index.php @@ -0,0 +1,772 @@ + + + + + + +AI Image Generation & Iterative Editing
+Your generated image will appear here
+