CV_Process / resume_advance_analysis.py
bsiddhharth
added try except to groq_api_key
45fe6a4
import streamlit as st
from typing import Any,Dict
import json
from groq import Groq
import re
import os
import logging
# logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# logger = logging.getLogger(__name__)
# os.environ['GROQ_API_KEY'] = os.getenv("GROQ_API_KEY")
groq_api_key = os.getenv("GROQ_API_KEY")
if groq_api_key is None:
try:
groq_api_key = st.secrets["GROQ_API_KEY"]
except Exception as e:
st.error("GROQ_API_KEY is not set in the environment variables or Streamlit secrets.")
groq_api_key = None
# groq_api_key = st.secrets["GROQ_API_KEY"]
class ResumeImprovementEngine:
def __init__(self):
# self.llm = ChatGroq(
# groq_api_key = groq_api_key,
# model_name="llama-3.1-70b-versatile",
# temperature=0.7,
# max_tokens=4096
# )
self.client = Groq(api_key=groq_api_key)
# logger.info("ResumeImprovementEngine initialized with Groq API key.")
def generate_resume_improvement_suggestions(self, resume_text: str) -> dict[str, Any]:
"""
Generate comprehensive resume improvement suggestions
Args:
resume_text (str): Full text of the resume
Returns:
Dict containing detailed improvement suggestions
"""
prompt = f"""Perform a comprehensive analysis of the following resume and provide detailed improvement suggestions:
Resume Content:
{resume_text}
(minimum 50 word explanation for each)
Tasks:
1. Provide a structured analysis of resume strengths and weaknesses
2. Offer specific, actionable improvement recommendations
3. Suggest additional sections or content enhancements
4. Provide writing and formatting advice
5. Respond in detailed, structured JSON format
Required JSON Structure:
{{
"overall_assessment": {{
"strengths": ["Key strengths of the resume"],
"weaknesses": ["Areas needing improvement"]
}},
"section_recommendations": {{
"work_experience": {{
"current_status": "Assessment of current work experience section",
"improvement_suggestions": ["Specific improvements"]
}},
"education": {{
"current_status": "Assessment of education section",
"improvement_suggestions": ["Specific improvements"]
}}
}},
"writing_improvements": {{
"language_suggestions": ["Writing style improvements"],
"formatting_advice": ["Formatting and layout suggestions"]
}},
"additional_sections_recommended": ["List of suggested new sections"],
"keyword_optimization": {{
"missing_industry_keywords": ["Keywords to add"],
"ats_compatibility_score": "Numeric score or rating"
}},
"career_positioning": {{
"personal_branding_suggestions": ["Ways to enhance personal brand"],
"skill_highlighting_recommendations": ["How to better showcase skills"]
}}
}}
"""
try:
# logger.info("Sending request to Groq for resume improvement.")
# Make API call to generate improvement suggestions
chat_completion = self.client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You are an expert resume consultant providing detailed, constructive feedback."
},
{
"role": "user",
"content": prompt
}
],
model="llama-3.3-70b-versatile",
temperature=0.7,
max_tokens=2048,
top_p=1,
stream=False
)
# logger.info("Groq API response received.")
# Extract and parse the JSON response
response_text = chat_completion.choices[0].message.content
suggestions = self._extract_json(response_text)
# logger.debug(f"Improvement suggestions received: {suggestions}")
return suggestions
except Exception as e:
st.error(f"Resume Improvement Error: {e}")
# logger.error(f"Resume Improvement Error: {e}")
return {}
def _extract_json(self, text: str) -> dict[str, Any]:
"""
Safely extract JSON from LLM response
Args:
text (str): LLM response text
Returns:
Dict of extracted JSON or empty dict
"""
try:
# logger.debug("Extracting JSON from response text.")
json_match = re.search(r'\{.*\}', text, re.DOTALL | re.MULTILINE)
if json_match:
return json.loads(json_match.group(0))
# logger.warning("No valid JSON found in response text.")
return {}
except Exception as e:
st.error(f"JSON Extraction Error: {e}")
# logger.error(f"JSON Extraction Error: {e}")
return {}