import json from pathlib import Path from models.schemas import RoadmapWeek, SkillScore from knowledge_graph.graph_engine import get_engine from agents.roadmap_builder import generate_custom_roadmap_data def generate_roadmap( skill_scores: list[SkillScore], graph_paths: dict[str, list[str]], hours_per_day: float = 2.0, domain: str = "general", ) -> list[RoadmapWeek]: engine = get_engine() resources_path = Path("backend/knowledge_graph/resources.json") if resources_path.exists(): with open(resources_path, "r", encoding="utf-8") as f: resources_db = json.load(f) else: resources_db = {} roadmap = [] base_hours_per_week = hours_per_day * 5 week_counter = 1 # 1. Fetch custom LLM analysis custom_data = generate_custom_roadmap_data(skill_scores, domain) # Sort skills: high_gap first, then medium_gap gap_skills = [s for s in skill_scores if s.gap_level in ("high_gap", "medium_gap")] gap_skills.sort(key=lambda s: 0 if s.gap_level == "high_gap" else 1) for skill in gap_skills: skill_id = skill.skill_id path = graph_paths.get(skill_id, []) resources = [] if skill_id in resources_db: resources = resources_db[skill_id].get("courses", []) custom_tiers = custom_data.get(skill_id, []) for tier in [1, 2, 3]: # Default values mini_project = f"Practice and implement {skill.label} concepts." why_msg = f"Essential for mastering {skill.label}." # Use LLM generated data if available for ct in custom_tiers: if ct.get("tier") == tier: mini_project = ct.get("mini_project", mini_project) why_msg = ct.get("why", why_msg) break roadmap.append(RoadmapWeek( week=week_counter, skill_id=skill_id, label=skill.label, tier=tier, resources=resources if tier == 1 else [], # Only show resources in Tier 1 mini_project=mini_project, graph_path=path, why=why_msg )) week_counter += 1 return roadmap