File size: 1,596 Bytes
e1d6e8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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)