import uuid import json from typing import List from .llm_client import ask_ollama from .prompts import build_review_prompt from ..models.schemas import Finding, ReviewResponse def make_id() -> str: return str(uuid.uuid4())[:8] def review_single_file(path: str, filename: str, code: str, analyzer_evidence: List[dict], persona: str = "general") -> ReviewResponse: prompt = build_review_prompt(filename, code, analyzer_evidence, persona) raw = ask_ollama(prompt) findings = [] try: arr = json.loads(raw) for item in arr: findings.append(Finding( id=item.get("id", make_id()), title=item.get("title", "Untitled"), severity=item.get("severity", "low"), file=filename, line_range=tuple(item.get("line_range")) if item.get("line_range") else None, description=item.get("description", ""), suggested_fix=item.get("suggested_fix"), confidence=int(item.get("confidence", 50)), evidence=item.get("evidence") )) except Exception: findings.append(Finding( id=make_id(), title="Raw Review", severity="low", file=filename, line_range=None, description=(raw or "No response from LLM")[:3000], suggested_fix=None, confidence=50, evidence=None )) summary = f"Found {len(findings)} issues (persona={persona})." return ReviewResponse(summary=summary, findings=findings)