File size: 2,113 Bytes
ad12f34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92f63a9
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
import os
from groq import Groq
from typing import Dict
from .schemas import AgentReport, JudgeVerdict

client = Groq(api_key=os.environ.get("GROQ_API_KEY"))

def evaluate_consensus(reports: Dict[str, AgentReport]) -> bool:
    claims = [r.claim for r in reports.values()]
    confidences = [r.confidence for r in reports.values()]
    
    all_same = len(set(claims)) == 1
    high_conf = all(c >= 0.85 for c in confidences)
    
    return all_same and high_conf

def run_judge(reports_summary: str, raw_data: str) -> JudgeVerdict:
    system_prompt = (
        "You are the presiding Judge Magistrate in an Enterprise Cybersecurity Matrix.\n"
        "Your subordinate agents have provided split panel reports.\n"
        "Respond strictly in valid JSON matching this schema:\n"
        "{\"final_verdict\": \"CRITICAL_THREAT\"|\"SAFE\"|\"MANUAL_REVIEW_REQUIRED\", \"risk_score\": float, \"verdict_justification\": string}\n\n"
        "DECISION ARCHITECTURE RULES:\n"
        "1. If ANY analyst engine raises a 'PHISHING' claim with confidence >= 0.85, force 'CRITICAL_THREAT'.\n"
        "2. Avoid label contradictions: Never set final_verdict to SAFE if your textual argument implies a threat pattern.\n"
        "3. SUPREME VETO RULE: If the Target URL belongs to a verified, universally trusted root domain (e.g., 'github.com', 'google.com', 'microsoft.com') and shows no signs of typosquatting, you MUST overrule paranoid sub-agents, ignore Rule 1, and force a 'SAFE' verdict with a low risk score. Standard authentication portals on official domains are inherently safe."
    )
    
    # We leverage the powerful 70B cloud model for premium reasoning accuracy
    response = client.chat.completions.create(
        model="llama-3.3-70b-versatile",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": f"RAW INPUTS:\n{raw_data}\n\nREPORTS SUMMARY:\n{reports_summary}"}
        ],
        response_format={"type": "json_object"},
        temperature=0.0
    )
    return JudgeVerdict.model_validate_json(response.choices[0].message.content)