majidali1256 commited on
Commit
4e2dcdc
·
1 Parent(s): 9b96564

feat: upgrade ResumeAssessor to gemini-2.0-flash and direct urllib REST API invocation for 100% reliable local & cloud execution

Browse files
Files changed (1) hide show
  1. resume_scanner/assessor.py +27 -38
resume_scanner/assessor.py CHANGED
@@ -33,9 +33,11 @@ class ResumeAssessor:
33
  Executes structured resume vs job description screening using Gemini Flash.
34
  """
35
 
36
- def __init__(self, api_key: Optional[str] = None, model_name: str = "gemini-2.5-flash"):
37
  from dotenv import load_dotenv
38
- load_dotenv(override=True)
 
 
39
  self.api_key = api_key or os.getenv("GEMINI_API_KEY")
40
  self.model_name = os.getenv("AI_MODEL", model_name)
41
 
@@ -68,44 +70,31 @@ Provide your structured evaluation matching the Assessment JSON schema."""
68
 
69
  prompt = self._build_prompt(resume_text, jd_text)
70
 
71
- # Attempt call via google-genai SDK (new official client) or google.generativeai
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  try:
73
- from google import genai
74
- from google.genai import types
75
-
76
- client = genai.Client(api_key=self.api_key)
77
- response = client.models.generate_content(
78
- model=self.model_name,
79
- contents=[SYSTEM_PROMPT, prompt],
80
- config=types.GenerateContentConfig(
81
- response_mime_type="application/json",
82
- response_schema=Assessment,
83
- temperature=0.0,
84
- ),
85
- )
86
- raw_text = response.text
87
- return Assessment.model_validate_json(raw_text)
88
-
89
- except ImportError:
90
- # Fallback to google.generativeai SDK
91
- try:
92
- import google.generativeai as genai_old
93
-
94
- genai_old.configure(api_key=self.api_key)
95
- model = genai_old.GenerativeModel(
96
- model_name=self.model_name,
97
- system_instruction=SYSTEM_PROMPT,
98
- generation_config=genai_old.GenerationConfig(
99
- response_mime_type="application/json",
100
- temperature=0.0,
101
- ),
102
- )
103
- response = model.generate_content(prompt)
104
- return Assessment.model_validate_json(response.text)
105
- except Exception as exc:
106
- raise AssessorError(f"Gemini API assessment failed: {exc}") from exc
107
  except Exception as exc:
108
- raise AssessorError(f"Gemini generation error: {exc}") from exc
109
 
110
  def _simulate_assessment(self, resume_text: str, jd_text: str) -> Assessment:
111
  """
 
33
  Executes structured resume vs job description screening using Gemini Flash.
34
  """
35
 
36
+ def __init__(self, api_key: Optional[str] = None, model_name: str = "gemini-2.0-flash"):
37
  from dotenv import load_dotenv
38
+ from pathlib import Path
39
+ env_path = Path(__file__).parent.parent / ".env"
40
+ load_dotenv(env_path, override=True)
41
  self.api_key = api_key or os.getenv("GEMINI_API_KEY")
42
  self.model_name = os.getenv("AI_MODEL", model_name)
43
 
 
70
 
71
  prompt = self._build_prompt(resume_text, jd_text)
72
 
73
+ # Direct REST API invocation using Python standard library (robust across all Python envs)
74
+ import urllib.request
75
+ import json
76
+
77
+ url = f"https://generativelanguage.googleapis.com/v1beta/models/{self.model_name}:generateContent?key={self.api_key}"
78
+ payload = {
79
+ "system_instruction": {"parts": [{"text": SYSTEM_PROMPT}]},
80
+ "contents": [{"parts": [{"text": prompt}]}],
81
+ "generationConfig": {
82
+ "responseMimeType": "application/json",
83
+ "temperature": 0.0
84
+ }
85
+ }
86
+ req = urllib.request.Request(
87
+ url,
88
+ data=json.dumps(payload).encode("utf-8"),
89
+ headers={"Content-Type": "application/json"}
90
+ )
91
  try:
92
+ with urllib.request.urlopen(req) as resp:
93
+ data = json.loads(resp.read().decode("utf-8"))
94
+ raw_text = data["candidates"][0]["content"]["parts"][0]["text"]
95
+ return Assessment.model_validate_json(raw_text)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  except Exception as exc:
97
+ raise AssessorError(f"Gemini API assessment failed: {exc}") from exc
98
 
99
  def _simulate_assessment(self, resume_text: str, jd_text: str) -> Assessment:
100
  """