72 lines
3.1 KiB
Python
72 lines
3.1 KiB
Python
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 |