Spaces:
Sleeping
Sleeping
| import os | |
| import json | |
| from langchain_groq import ChatGroq | |
| from langchain_core.messages import SystemMessage, HumanMessage | |
| from models.schemas import SkillScore | |
| GROQ_MODEL = "llama-3.3-70b-versatile" | |
| ROADMAP_SYSTEM = """You are a senior technical mentor. | |
| Given a list of skills where a candidate has a gap, and their target domain, generate a personalized 3-tier roadmap for EACH skill. | |
| Tier 1: Core concepts and fundamentals | |
| Tier 2: Intermediate integration and application | |
| Tier 3: Advanced / Role-specific scenario | |
| For each tier, provide a highly specific, customized 'mini_project' description (2-3 sentences) that is directly relevant to their domain. DO NOT use generic phrases. | |
| Also provide a 1-sentence 'why' explaining why this step is critical for overcoming their specific gap. | |
| Return valid JSON in this exact format: | |
| { | |
| "skill_id_1": [ | |
| { | |
| "tier": 1, | |
| "mini_project": "Build a simple API using FastAPI and Pydantic to validate user inputs.", | |
| "why": "This establishes the fundamental routing and validation concepts." | |
| }, | |
| { | |
| "tier": 2, | |
| "mini_project": "...", | |
| "why": "..." | |
| }, | |
| { | |
| "tier": 3, | |
| "mini_project": "...", | |
| "why": "..." | |
| } | |
| ] | |
| } | |
| """ | |
| def generate_custom_roadmap_data(skill_scores: list[SkillScore], domain: str) -> dict: | |
| gap_skills = [s for s in skill_scores if s.gap_level in ("high_gap", "medium_gap")] | |
| if not gap_skills: | |
| return {} | |
| prompt = f"Domain: {domain}\nGap Skills to analyze:\n" | |
| for s in gap_skills: | |
| prompt += f"- ID: {s.skill_id} | Label: {s.label} | Gap: {s.gap_level} | Final Score: {s.final_score:.2f}\n" | |
| llm = ChatGroq( | |
| model=GROQ_MODEL, | |
| api_key=os.getenv("GROQ_API_KEY", "dummy"), | |
| temperature=0.4, | |
| ) | |
| messages = [ | |
| SystemMessage(content=ROADMAP_SYSTEM), | |
| HumanMessage(content=prompt) | |
| ] | |
| try: | |
| response = llm.invoke(messages) | |
| content = response.content.strip() | |
| if content.startswith("```json"): | |
| content = content[7:] | |
| if content.endswith("```"): | |
| content = content[:-3] | |
| return json.loads(content) | |
| except Exception as e: | |
| print("Roadmap builder error:", e) | |
| return {} | |