import os import uuid import time import json import base64 import io import warnings from PIL import Image from flask import Flask, request, jsonify, render_template_string, Response import google.generativeai as genai # --- FIX: IGNORE DEPRECATION WARNINGS --- warnings.filterwarnings("ignore") # ========================================== # 👇 API KEYS SETUP 👇 # ========================================== keys_string = os.environ.get("API_KEYS", "") API_KEYS = [k.strip() for k in keys_string.replace(',', ' ').replace('\n', ' ').split() if k.strip()] # --- 💾 DATABASE --- DB_FILE = "chat_db.json" def load_db(): try: if os.path.exists(DB_FILE): with open(DB_FILE, 'r') as f: return json.load(f) except: pass return {} def save_db(db): try: with open(DB_FILE, 'w') as f: json.dump(db, f, indent=2) except: pass user_db = load_db() current_key_index = 0 app = Flask(__name__) # --- 🧠SYSTEM INSTRUCTION --- SYSTEM_INSTRUCTION = """ ROLE: You are "Student's AI", a professional academic tutor. RULES: 1. **MATH:** Use LaTeX for formulas ($$ ... $$). 2. **DIAGRAMS:** Use Mermaid.js (```mermaid ... ```). 3. **LANGUAGE:** English by default. Use Tamil/Tanglish ONLY if requested. 4. **FORMAT:** Markdown. Bold key terms. 5. **CODE:** Use Python/Java/C++ blocks. Explain logic briefly. """ # --- 🧬 MODEL & FILE HANDLING --- def get_working_model(key): try: genai.configure(api_key=key) models = list(genai.list_models()) chat_models = [m for m in models if 'generateContent' in m.supported_generation_methods] for m in chat_models: if "flash" in m.name.lower() and "1.5" in m.name: return m.name for m in chat_models: if "pro" in m.name.lower() and "1.5" in m.name: return m.name if chat_models: return chat_models[0].name except: return None return None def process_image(image_data): try: if "base64," in image_data: image_data = image_data.split("base64,")[1] image_bytes = base64.b64decode(image_data) return Image.open(io.BytesIO(image_bytes)) except: return None def generate_with_retry(prompt, image_data=None, file_text=None, history_messages=[]): global current_key_index if not API_KEYS: return "🚨 API Keys Missing." formatted_history = [] for m in history_messages[-6:]: role = "user" if m["role"] == "user" else "model" formatted_history.append({"role": role, "parts": [m["content"]]}) current_parts = [] if file_text: current_parts.append(f"analyzing file:\n{file_text}\n\n") current_parts.append(prompt) if image_data: img = process_image(image_data) if img: current_parts.append(img) for i in range(len(API_KEYS)): key = API_KEYS[current_key_index] model_name = get_working_model(key) if not model_name: current_key_index = (current_key_index + 1) % len(API_KEYS) continue try: genai.configure(api_key=key) model = genai.GenerativeModel(model_name=model_name, system_instruction=SYSTEM_INSTRUCTION) if image_data or file_text: response = model.generate_content(current_parts) else: chat = model.start_chat(history=formatted_history) response = chat.send_message(prompt) return response.text except Exception as e: current_key_index = (current_key_index + 1) % len(API_KEYS) time.sleep(1) return "âš ï¸ System Busy. Please try again." # --- UI TEMPLATE (Fixed Quotes & Logic) --- HTML_TEMPLATE = """