ResumeLens / analyzer.py
simikkk's picture
Update analyzer.py
a27660d verified
Raw
History Blame Contribute Delete
3.28 kB
import os
import json
import requests
# Načtení klíče pro OpenRouter z proměnných prostředí
OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY")
def analyze_cv(cv_text, job_text, language="cs"):
lang_map = {
"cs": "česky (Czech)",
"en": "anglicky (English)",
"de": "německy (German)"
}
target_lang = lang_map.get(language, "česky (Czech)")
prompt = f"""
Jsi expert na nábor a kariérní kouč. Analyzuj CV a porovnej ho s pozicí.
CV: {cv_text}
Pozice: {job_text}
DŮLEŽITÉ: Celá tvá odpověď musí být přeložena do jazyka: {target_lang}.
Kromě analýzy shody přidej sekci 'career_recommendations', kde odpovíš:
- Na jaké typy pozic a role se tento kandidát s ohledem na své CV nejlépe hodí?
- Jakou seniority úroveň (junior/medior/senior) podle tebe momentálně má?
Vrať odpověď POUZE jako validní JSON v tomto formátu (struktura klíčů musí zůstat v angličtině, ale hodnoty budou v jazyce {target_lang}):
{{
"match_score": 0,
"score_explanation": "...",
"career_recommendations": "...",
"top_3_actions": [],
"missing_keywords": [
{{"keyword": "...", "why_it_matters": "..."}}
],
"weak_sections": [
{{"original_phrase": "...", "problem": "...", "what_to_convey_instead": "...", "example_direction": "..."}}
],
"ats_warnings": [],
"linkedin_headline_ideas": []
}}
"""
if not OPENROUTER_API_KEY:
return {"error": "❌ Chybí OPENROUTER_API_KEY. Přidej ho do proměnných prostředí nebo do Secrets v Hugging Face."}
try:
response = requests.post(
url="https://openrouter.ai/api/v1/chat/completions",
headers={
"Authorization": f"Bearer {OPENROUTER_API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "openrouter/free", # Zde je zpět tvůj model!
"messages": [
{"role": "user", "content": prompt}
],
"response_format": {"type": "json_object"}
}
)
# Zkontrolujeme HTTP chyby (např. 401, 500)
response.raise_for_status()
# Vytáhneme textovou odpověď
result_text = response.json()['choices'][0]['message']['content']
# Očištění Markdown bloku (občas ho AI přidá i k JSONu)
result_text = result_text.strip()
if result_text.startswith("```json"):
result_text = result_text[7:]
elif result_text.startswith("```"):
result_text = result_text[3:]
if result_text.endswith("```"):
result_text = result_text[:-3]
# Převod na Python slovník
return json.loads(result_text)
except requests.exceptions.RequestException as e:
return {"error": f"Chyba sítě při volání OpenRouter: {str(e)}"}
except json.JSONDecodeError:
return {"error": "AI nevrátila validní JSON. Zkus to prosím znovu."}
except Exception as e:
return {"error": f"Neočekávaná chyba: {str(e)}"}