| import os |
| import tempfile |
| import json |
| import re |
| import gradio as gr |
| import google.generativeai as genai |
| import random |
| from PIL import Image |
|
|
| print("Google Generative AI SDK version:", genai.__version__) |
|
|
| API_KEYS = [ |
| "AIzaSyBAZ1Zm2KCZHlmVKPgVf2Cch0c-0YJfJVg", |
| "AIzaSyCWiMI9o4riw_9ucsSrIyModT3YD3a8BsU", |
| "AIzaSyBJFwj-Wzq-kLOLlsodR5Lwf4qIT6d2dJQ", |
| "AIzaSyAPFCgH8uSjANmPRF9iHYIYcneTOod8Qi0", |
| "AIzaSyBbK-1P3JD6HPyE3QLhkOps6_-Xo3wUFbs" |
| |
| ] |
|
|
| key_index = 0 |
| def get_next_key(): |
| global key_index |
| key = API_KEYS[key_index % len(API_KEYS)] |
| key_index += 1 |
| return key |
|
|
|
|
| |
| def extract_json(text): |
| match = re.search(r"```json\s*(.*?)\s*```", text, re.IGNORECASE | re.DOTALL) |
| if match: |
| json_text = match.group(1).strip() |
| else: |
| json_text = text.strip() |
|
|
| try: |
| return json.loads(json_text) |
| except Exception: |
| first, last = json_text.find("{"), json_text.rfind("}") |
| if first != -1 and last != -1 and last > first: |
| try: |
| return json.loads(json_text[first:last+1]) |
| except Exception: |
| pass |
| return {"raw_response": text} |
|
|
|
|
| |
| def process_image(image, prompt): |
| temp_file = None |
| uploaded_file = None |
|
|
| try: |
| print(f"Received image: {type(image)}") |
| print(f"Received prompt: {prompt}") |
|
|
| api_key = random.choice(API_KEYS) |
| if not api_key: |
| return "ERROR: Missing GOOGLE_API_KEY.", None |
| genai.configure(api_key=api_key) |
| model_name = "gemini-2.5-flash" |
| model = genai.GenerativeModel(model_name=model_name, |
| generation_config={}) |
|
|
| |
| |
| |
| |
| |
| |
|
|
| |
| COMPRESSION_QUALITY = 80 |
|
|
| |
| |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".jpeg") as tmp: |
| |
| |
| if hasattr(image, "save"): |
| |
| img = image |
| elif isinstance(image, str) and os.path.exists(image): |
| |
| img = Image.open(image) |
| else: |
| |
| raise ValueError(f"Unsupported image type: {type(image)}") |
| |
| if img.mode == 'RGBA': |
| |
| background = Image.new('RGB', img.size, (255, 255, 255)) |
| |
| background.paste(img, mask=img.split()[3]) |
| img = background |
| |
| |
| img.save( |
| tmp.name, |
| format='JPEG', |
| optimize=True, |
| quality=COMPRESSION_QUALITY |
| ) |
| |
| temp_file = tmp.name |
| |
| print("Temp file:", temp_file) |
|
|
| |
| |
| uploaded_file = genai.upload_file(path=temp_file, mime_type="image/jpeg") |
| print("Uploaded:", uploaded_file.name) |
| |
|
|
| |
| response = model.generate_content([prompt, uploaded_file]) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| print("Raw response:", response.text[:200], "...") |
|
|
| return extract_json(response.text) |
|
|
| except Exception as e: |
| print("Error:", e) |
| import traceback; traceback.print_exc() |
| return {"error": str(e)} |
|
|
| finally: |
| if temp_file and os.path.exists(temp_file): |
| os.remove(temp_file) |
| if uploaded_file: |
| try: |
| genai.delete_file(uploaded_file.name) |
| except: |
| pass |
|
|
|
|
| |
| demo = gr.Interface( |
| fn=process_image, |
| inputs=[ |
| gr.File(label="Upload Image", file_types=["image"]), |
| gr.Textbox(lines=5, placeholder="Enter your prompt here...", label="Prompt"), |
| ], |
| outputs=gr.JSON(label="Response"), |
| title="OCR & Analyzer (RAG Enhanced)", |
| description="Upload an image + prompt → analyze with RAG store", |
| flagging_mode="never", |
| ) |
|
|
| demo.api_name = "/predict" |
|
|
| if __name__ == "__main__": |
| demo.launch( |
| server_name="0.0.0.0", |
| server_port=int(os.getenv("PORT", "7860")), |
| show_error=True, |
| debug=True, |
| ) |
|
|