File size: 1,402 Bytes
5a3b322
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

from typing import List, Optional

from schemas.query_plan import QueryPlan
from schemas.candidates import RankedList


def explain(plan: QueryPlan, ranked: RankedList, catalog_lookup) -> str:
    """
    Generate a simple textual explanation using catalog metadata.
    catalog_lookup: callable(assessment_id) -> dict with fields like name/url/test_type/duration.
    """
    lines: List[str] = []
    lines.append("Top recommendations:")
    for item in ranked.items:
        meta = catalog_lookup(item.assessment_id) or {}
        name = meta.get("name", item.assessment_id)
        url = meta.get("url", "")
        tt = meta.get("test_type_full") or meta.get("test_type")
        dur = meta.get("duration_minutes") or meta.get("duration")
        parts = [f"- {name}"]
        if tt:
            parts.append(f"[{tt}]")
        if dur:
            parts.append(f"~{dur} min")
        if url:
            parts.append(f"({url})")
        lines.append(" ".join(parts))
    # Brief note on matching
    lines.append("")
    lines.append("Matched intent: " + plan.intent)
    if plan.must_have_skills:
        lines.append("Key skills: " + ", ".join(plan.must_have_skills[:5]))
    if plan.duration and plan.duration.minutes:
        lines.append(f"Duration preference: {plan.duration.mode or 'TARGET'} {plan.duration.minutes} minutes")
    return "\n".join(lines)