103 lines
4.1 KiB
Python
103 lines
4.1 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
|
|
company_url: 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 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.
|
|
Füge zum Schluss einen Link zu der Firmenwebsite hinzu.
|
|
|
|
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 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.
|
|
Füge zum Schluss einen Link zu der Stellenausschreibung oder zum Unternehmen hinzu.
|
|
|
|
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()) |