import os import json import logging import google.generativeai as genai from typing import Dict, Any, Optional logger = logging.getLogger("AI-Service") class AIService: # Konfiguráció a .env-ből api_key = os.getenv("GEMINI_API_KEY") if api_key: genai.configure(api_key=api_key) # 1.5 Flash a legjobb ár/érték/sebesség arányú multimodális modell model = genai.GenerativeModel('gemini-1.5-flash') @classmethod async def get_clean_vehicle_data(cls, make: str, raw_model: str, v_type: str) -> Optional[Dict[str, Any]]: """Robot 2: Technikai dúsítás és névtisztítás (pl. Yamaha 4HN).""" prompt = f""" Rendszer: Technikai gépjárműszakértő vagy. Feladat: Tisztítsd meg a '{make} {raw_model}' ({v_type}) adatot. Kimenet: Kizárólag JSON, magyarázat nélkül. Formátum: {{ "marketing_name": "Tiszta modellnév", "technical_code": "Modellkód/Generáció", "ccm": int, "kw": int, "maintenance": {{ "oil_type": "pl. 10W-40", "oil_qty": float, "spark_plug": "típus", "coolant": "típus" }} }} """ try: response = cls.model.generate_content(prompt) # A Gemini néha ```json ... ``` blokkba teszi, ezt le kell tisztítani json_text = response.text.replace("```json", "").replace("```", "").strip() return json.loads(json_text) except Exception as e: logger.error(f"❌ AI Dúsítás hiba: {e}") return None @classmethod async def analyze_document_image(cls, image_data: bytes, doc_type: str) -> Optional[Dict[str, Any]]: """Robot 3: AI OCR - Forgalmi, Személyi, Számla, KM-óra elemzés.""" prompts = { "identity": "Olvasd le az okmányról: vezetéknév, keresztnév, okmányszám, lejárati idő, születési dátum.", "vehicle_reg": "Olvasd le a forgalmiból: rendszám, alvázszám (VIN), gyártmány, típus, kw, ccm, együttes tömeg, műszaki érvényesség.", "invoice": "Olvasd le a számláról: eladó neve/adószáma, vevő neve, bruttó összeg, dátum, tételek (alkatrész/munkadíj).", "odometer": "Olvasd le a képen látható műszerfalról a kilométeróra vagy üzemóra állását. Csak a számot add vissza." } prompt = f"Rendszer: Profi OCR és dokumentum-elemző vagy. {prompts.get(doc_type, 'Elemezd a képet.')} Válaszolj tiszta JSON formátumban." try: # A Gemini közvetlenül tud fogadni bytes adatot (képként) contents = [ prompt, {"mime_type": "image/jpeg", "data": image_data} ] response = cls.model.generate_content(contents) json_text = response.text.replace("```json", "").replace("```", "").strip() return json.loads(json_text) except Exception as e: logger.error(f"❌ AI OCR hiba ({doc_type}): {e}") return None