Files
service-finder/backend/app/services/ai_service.py

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