| """ |
| tools/db_tool.py — SQLite Başvuru Yazma Aracı |
| |
| AGENTIC PATTERN: Tool Use — Least-Privilege |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| LLM doğrudan veritabanına erişemez. Orchestrator bu tool'u çağırır. |
| TCKN ve hassas veriler maskelenmiş haliyle yazılır. |
| Sadece submission_agent bu tool'a erişebilir (least-privilege). |
| """ |
| import sqlite3 |
| import uuid |
| from datetime import datetime |
| from langchain_core.tools import tool |
| from config import DB_PATH |
|
|
|
|
| def init_db(): |
| """Uygulama başlarken tabloları oluştur (yoksa).""" |
| conn = sqlite3.connect(DB_PATH) |
| conn.execute(""" |
| CREATE TABLE IF NOT EXISTS applications ( |
| id TEXT PRIMARY KEY, |
| session_id TEXT, |
| vehicle_type TEXT, |
| created_at TEXT, |
| -- Yeni araç alanları |
| invoice_amount REAL, |
| vehicle_model TEXT, |
| requested_amount_new REAL, |
| guarantor_tckn_masked TEXT, |
| -- 2. el alanları |
| kasko_value REAL, |
| vehicle_age INTEGER, |
| requested_amount_used REAL, |
| seller_tckn_masked TEXT, |
| -- Meta |
| status TEXT DEFAULT 'pending' |
| ) |
| """) |
| conn.execute(""" |
| CREATE TABLE IF NOT EXISTS audit_events ( |
| id TEXT PRIMARY KEY, |
| session_id TEXT, |
| timestamp TEXT, |
| event_type TEXT, |
| agent TEXT, |
| details TEXT, |
| masked_input TEXT |
| ) |
| """) |
| conn.execute(""" |
| CREATE TABLE IF NOT EXISTS hgs_registrations ( |
| id TEXT PRIMARY KEY, |
| application_id TEXT, |
| session_id TEXT, |
| created_at TEXT, |
| status TEXT DEFAULT 'active' |
| ) |
| """) |
| conn.commit() |
| conn.close() |
|
|
|
|
| @tool |
| def write_application( |
| session_id: str, |
| vehicle_type: str, |
| invoice_amount: float | None = None, |
| vehicle_model: str | None = None, |
| requested_amount_new: float | None = None, |
| guarantor_tckn_masked: str | None = None, |
| kasko_value: float | None = None, |
| vehicle_age: int | None = None, |
| requested_amount_used: float | None = None, |
| seller_tckn_masked: str | None = None, |
| ) -> dict: |
| """ |
| Onaylanmış başvuruyu veritabanına yazar. |
| |
| Returns: |
| {"success": bool, "application_id": str, "error": str | None} |
| """ |
| app_id = str(uuid.uuid4())[:8].upper() |
|
|
| try: |
| conn = sqlite3.connect(DB_PATH) |
| conn.execute( |
| """INSERT INTO applications VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)""", |
| ( |
| app_id, session_id, vehicle_type, |
| datetime.utcnow().isoformat(), |
| invoice_amount, vehicle_model, requested_amount_new, guarantor_tckn_masked, |
| kasko_value, vehicle_age, requested_amount_used, seller_tckn_masked, |
| "pending", |
| ), |
| ) |
| conn.commit() |
| conn.close() |
| return {"success": True, "application_id": app_id, "error": None} |
| except Exception as e: |
| return {"success": False, "application_id": None, "error": str(e)} |
|
|
|
|
| @tool |
| def get_application_history(session_id: str) -> dict: |
| """Bir oturumun geçmiş başvurularını listeler.""" |
| conn = sqlite3.connect(DB_PATH) |
| rows = conn.execute( |
| "SELECT id, vehicle_type, created_at, status FROM applications WHERE session_id=? ORDER BY created_at DESC", |
| (session_id,), |
| ).fetchall() |
| conn.close() |
| return {"applications": [{"id": r[0], "type": r[1], "date": r[2], "status": r[3]} for r in rows]} |
|
|