# modules/llm_handler.py import os import config import regex as re from groq import Groq from modules.web_search import search_for_example_answers # Initialize the Groq client client = Groq(api_key=os.environ.get("GROQ_API_KEY")) MODEL = "llama3-70b-8192" # Use the more powerful 70B model for detailed analysis def generate_question(interview_type, document_text): prompt = f"As an expert {interview_type} interviewer, ask one relevant, open-ended question based on this document:\n\n---\n{document_text}\n---" try: chat_completion = client.chat.completions.create( messages=[{"role": "user", "content": prompt}], model=MODEL ) return chat_completion.choices[0].message.content except Exception as e: return f"Error generating question from API: {e}" def evaluate_answer(question, answer): # This new prompt demands a much higher level of detail prompt = f""" You are a meticulous and insightful interview coach. Your task is to provide a highly detailed evaluation of a candidate's answer. **INTERVIEW QUESTION:** "{question}" --- **CANDIDATE'S ANSWER:** "{answer}" --- **YOUR TASK:** Provide a detailed, multi-part evaluation. You MUST include scores and written analysis for each section. **1. Score Breakdown (Format: `Category: [SCORE]/10`)** You must provide a score for each of the following: - Factual Accuracy: [SCORE]/10 - Relevance & Directness: [SCORE]/10 - Structure & Clarity (STAR Method): [SCORE]/10 **2. Detailed Written Evaluation** - **Strengths:** What did the candidate do well? (e.g., "Good use of a specific example...") - **Areas for Improvement:** What were the key weaknesses? (e.g., "The result of the action was unclear...") **3. Concrete Suggestion** - **Example Rephrasing:** Provide a short example of how they could have phrased a key part of their answer more effectively. """ try: chat_completion = client.chat.completions.create( messages=[{"role": "user", "content": prompt}], model=MODEL ) return chat_completion.choices[0].message.content except Exception as e: return f"An error occurred during evaluation: {e}" def parse_scores_from_evaluation(evaluation_text: str) -> dict: scores = { 'Factual Accuracy': 0, 'Relevance & Directness': 0, 'Structure & Clarity (STAR Method)': 0 } # Updated regex to match the new category name pattern = r"(Factual Accuracy|Relevance & Directness|Structure & Clarity \(STAR Method\)):\s*\[?(\d{1,2})\]?\/10" matches = re.findall(pattern, evaluation_text, re.IGNORECASE) for match in matches: category_name, score_value = match[0].strip(), int(match[1]) # Normalize the key for consistency if "Structure" in category_name: scores['Structure & Clarity (STAR Method)'] = score_value elif category_name in scores: scores[category_name] = score_value print(f"📊 Parsed scores: {scores}") return scores def generate_holistic_feedback(full_interview_log): # This prompt is also enhanced for more detail prompt = f""" You are a senior career strategist reviewing a candidate's full interview performance. Based on the entire Q&A log, provide a detailed "Overall Performance Summary" and an "Actionable Improvement Plan". **FULL INTERVIEW LOG:** --- {full_interview_log} --- **YOUR TASK:** 1. **Overall Performance Summary:** Write a detailed paragraph summarizing the candidate's performance. Analyze their communication style, confidence, and consistency. Identify the most significant recurring strengths and weaknesses across all answers. 2. **Actionable Improvement Plan:** Provide a bulleted list of the top 3 most critical and specific actions the candidate must take. For each action, explain *why* it's important and provide a *concrete example*. (e.g., "- Action: Quantify your achievements. Why: It demonstrates impact. Example: Instead of 'improved the system,' say 'reduced server response time by 15%.'"). """ try: chat_completion = client.chat.completions.create( messages=[{"role": "user", "content": prompt}], model=MODEL ) return chat_completion.choices[0].message.content except Exception as e: return "Could not generate holistic feedback due to an error."