job_suggestor/job_suggestor.py

100 lines
3.9 KiB
Python

from google import genai
from google.genai import types
from datetime import datetime
from pydantic import BaseModel
import smtplib
from email.mime.text import MIMEText
import os
# Load keys from environment variables
api_key = os.environ.get("GEMINI_API_KEY")
gmail_key = os.environ.get("GMAIL_PW")
class JobSuggestion(BaseModel):
company_name: str
company_description: str
job_title: str
application_text: str
# Load CV from file
with open("cv_sebastian_egli.txt", "r", encoding="utf-8") as f:
cv = f.read()
# Load already suggested companies from file (to avoid duplicates)
with open("already_suggested_companies.txt", "r", encoding="utf-8") as f:
already_suggested_companies = f.read()
# Define boolean for even-numbered days (I want to switch un/solicited every day)
today = datetime.today()
unsolicited_application = today.day % 2 == 0
if unsolicited_application:
query = ["""Analysiere meinen Lebenslauf (cv) und die Liste bereits vorgeschlagener Unternehmen (already_suggested_companies).
Schlage mir genau ein Unternehmen in der Nähe von Marburg vor, das noch nicht in already_suggested_companies enthalten ist
und für eine Initiativbewerbung besonders gut zu meinem Profil passt.
Erkläre in maximal 150 Wörtern prägnant, warum dieses Unternehmen eine besonders gute Wahl für mich wäre.
Formuliere die Antwort als kurze, professionelle Email mit dem Titel: 'Neuer Jobvorschlag'.
Begründe die Eignung anhand meiner Qualifikationen und Interessen.
Füge außerdem einen einzelnen Satz hinzu, der direkt in einem Bewerbungsschreiben genutzt werden könnte,
um die Übereinstimmung zwischen mir und dem Unternehmen hervorzuheben.
Liefere nur die Email, keine zusätzliche Erklärung.""",already_suggested_companies,cv]
else:
query = ["""Analysiere meinen Lebenslauf (cv) und die Liste bereits vorgeschlagener Unternehmen (already_suggested_companies).
Schlage mir genau eine aktuell offene Stellenausschreibung in der Nähe von Marburg vor für ein Unternehmen, das noch nicht in already_suggested_companies enthalten ist
und die besonders gut zu meinem Profil passt.
Erkläre in maximal 150 Wörtern prägnant, warum diese Stelle eine besonders gute Wahl für mich wäre.
Formuliere die Antwort als kurze, professionelle Email mit dem Titel: 'Neuer Jobvorschlag'.
Begründe die Eignung anhand meiner Qualifikationen und Interessen.
Füge außerdem einen einzelnen Satz hinzu, der direkt in einem Bewerbungsschreiben genutzt werden könnte,
um die Übereinstimmung zwischen mir und der ausgeschriebenen Stelle hervorzuheben.
Liefere nur die Email, keine zusätzliche Erklärung.""",already_suggested_companies,cv]
# Get response from Gemini
# Initialize Gemini client
client = genai.Client(api_key=api_key)
# Step 1: grounded search (necessary for live web search)
resp_grounded = client.models.generate_content(
model="gemini-2.5-flash",
contents=query,
config=types.GenerateContentConfig(
tools=[types.Tool(google_search=types.GoogleSearch())]
),
)
grounded_answer = resp_grounded.text # freeform answer
# Step 2: convert to JSON
resp_json = client.models.generate_content(
model="gemini-2.5-flash",
contents=f"Turn this answer into JSON: {grounded_answer}",
config=types.GenerateContentConfig(
response_mime_type="application/json",
response_schema=JobSuggestion,
),
)
# Append the response to already_suggested_companies.txt
with open("already_suggested_companies.txt", "a", encoding="utf-8") as f:
f.write("\n" + resp_json.parsed.company_name)
# Send email with the suggestion
# Account details
sender = "seb.egli@gmail.com"
recipient = "seb.egli@gmail.com"
password = gmail_key
# Create email
msg = MIMEText(grounded_answer)
msg["From"] = sender
msg["To"] = recipient
msg["Subject"] = "Neuer Jobvorschlag"
# Send email using Gmail's SMTP
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(sender, password)
server.sendmail(sender, recipient, msg.as_string())