feat(infra): Stabilized Docker env, fixed circular imports, enabled AI Enricher Robot v1.1
This commit is contained in:
72
backend/app/services/ai_service.py
Normal file
72
backend/app/services/ai_service.py
Normal file
@@ -0,0 +1,72 @@
|
||||
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
|
||||
Reference in New Issue
Block a user