From af518b7d7bf4073755445766d34f422d48bf3bd9 Mon Sep 17 00:00:00 2001 From: feder-cr Date: Sun, 4 Aug 2024 13:14:56 +0100 Subject: [PATCH] first commit --- data_folder/config.yaml | 42 ++ data_folder/plain_text_resume.yaml | 105 ++++ data_folder/secrets.yaml | 3 + data_folder_example/config.yaml | 39 ++ data_folder_example/plain_text_resume.yaml | 95 ++++ data_folder_example/secrets.yaml | 3 + gpt.py | 279 +++++++++++ job.py | 33 ++ linkedIn_authenticator.py | 92 ++++ linkedIn_bot_facade.py | 57 +++ linkedIn_easy_applier.py | 348 +++++++++++++ linkedIn_job_manager.py | 227 +++++++++ main.py | 182 +++++++ open_ai_calls.json | 456 +++++++++++++++++ readme.md | 157 ++++++ requirements.txt | Bin 0 -> 566 bytes resume.py | 127 +++++ strings.py | 539 +++++++++++++++++++++ utils.py | 68 +++ 19 files changed, 2852 insertions(+) create mode 100644 data_folder/config.yaml create mode 100644 data_folder/plain_text_resume.yaml create mode 100644 data_folder/secrets.yaml create mode 100644 data_folder_example/config.yaml create mode 100644 data_folder_example/plain_text_resume.yaml create mode 100644 data_folder_example/secrets.yaml create mode 100644 gpt.py create mode 100644 job.py create mode 100644 linkedIn_authenticator.py create mode 100644 linkedIn_bot_facade.py create mode 100644 linkedIn_easy_applier.py create mode 100644 linkedIn_job_manager.py create mode 100644 main.py create mode 100644 open_ai_calls.json create mode 100644 readme.md create mode 100644 requirements.txt create mode 100644 resume.py create mode 100644 strings.py create mode 100644 utils.py diff --git a/data_folder/config.yaml b/data_folder/config.yaml new file mode 100644 index 0000000..1eaef16 --- /dev/null +++ b/data_folder/config.yaml @@ -0,0 +1,42 @@ +remote: [true/false] + +experienceLevel: + internship: [true/false] + entry: [true/false] + associate: [true/false] + mid-senior level: [true/false] + director: [true/false] + executive: [true/false] + +jobTypes: + full-time: [true/false] + contract: [true/false] + part-time: [true/false] + temporary: [true/false] + internship: [true/false] + other: [true/false] + volunteer: [true/false] + +date: + all time: [true/false] + month: [true/false] + week: [true/false] + 24 hours: [true/false] + +positions: + - [Positions 1] + - [Positions 2] + +locations: + - [Locations 1] + - [Locations 2] + +distance: [0 or 5 or 10 or 25 or 50 or 100] + +companyBlacklist: + - [Company Name 1] + - [Company Name 2] + +titleBlacklist: + - [Word 1] + - [Word 2] diff --git a/data_folder/plain_text_resume.yaml b/data_folder/plain_text_resume.yaml new file mode 100644 index 0000000..21d9e3c --- /dev/null +++ b/data_folder/plain_text_resume.yaml @@ -0,0 +1,105 @@ +{ + "personalInformation": { + "name": "[Your name]", + "surname": "[Your surname]", + "dateOfBirth": "[Your Date of Birth]", + "country": "[Your country]", + "city": "[Your city]", + "address": "[Your address]", + "phonePrefix": "[Your phone number prefix]", + "phone": "[Your phone number]", + "email": "[Your email]", + "github": "[Link]", + "linkedin": "[Link]" + }, + "selfIdentification": { + "gender": "[Specific gender identification]", + "pronouns": "[Your Pronouns]", + "veteran": "[Yes/No]", + "disability": "[Yes/No]", + "ethnicity": "[Specify ethnicity]" + }, + "legalAuthorization": { + "euWorkAuthorization": "[Yes/No]", + "usWorkAuthorization": "[Yes/No]", + "requiresUsVisa": "[Yes/No]", + "legallyAllowedToWorkInUs": "[Yes/No]", + "requiresUsSponsorship": "[Yes/No]", + "requiresEuVisa": "[Yes/No]", + "legallyAllowedToWorkInEu": "[Yes/No]", + "requiresEuSponsorship": "[Yes/No]" + }, + "workPreferences": { + "remoteWork": "[Yes/No]", + "inPersonWork": "[Yes/No]", + "openToRelocation": "[Yes/No]", + "willingToCompleteAssessments": "[Yes/No]", + "willingToUndergoDrugTests": "[Yes/No]", + "willingToUndergoBackgroundChecks": "[Yes/No]" + }, + "educationDetails": [ + { + "degree": "[Bachelor's/Master's/Ph.D.]", + "university": "[Name of University]", + "gpa": "[Your GPA]", + "graduationYear": "[Year of Graduation]", + "fieldOfStudy": "[Your Field of Study]", + "skillsAcquired": { + "blockchain": "[Years]", + "iot": "[Years]", + "python": "[Years]" + } + } + ], + "experienceDetails": [ + { + "position": "[Job Title]", + "company": "[Company Name]", + "employmentPeriod": "[Month, Year] - [Month, Year]", + "location": "[City, Country]", + "industry": "[Industry of the Company]", + "keyResponsibilities": { + "responsibility1": "[Years]", + "responsibility2": "[Years]", + "responsibility3": "[Years]" + }, + "skillsAcquired": { + "php": "[Years]", + "python": "[Years]", + "leadership": "[Years]", + "problemSolving": "[Years]", + "criticalThinking": "[Years]", + "adaptability": "[Years]", + "perfectionism": "[Years]" + } + } + ], + "projects": { + "project1": "[Description of significant projects you've worked on + if available repo link]", + "project2": "[Description of significant projects you've worked on + if available repo link]" + }, + "availability": { + "noticePeriod": "[Specify notice period]" + }, + "salaryExpectations": { + "salaryRangeUSD": "[Specify your salary expectations in USD]" + }, + "certifications": [ + "[Certification 1]", + "[Certification 2]", + "[Certification 3]" + ], + "languages": [ + { + "language": "Italian", + "proficiency": "Native" + }, + { + "language": "English", + "proficiency": "Professional" + } + ], + "interests": [ + "[List any hobbies or interests relevant to your professional profile]" + ] +} \ No newline at end of file diff --git a/data_folder/secrets.yaml b/data_folder/secrets.yaml new file mode 100644 index 0000000..b92541b --- /dev/null +++ b/data_folder/secrets.yaml @@ -0,0 +1,3 @@ +email: [Your Linkedin email] +password: [Your Linkedin password] +openai_api_key: [OpenAi API key, tutorial -> https://medium.com/@lorenzozar/how-to-get-your-own-openai-api-key-f4d44e60c327] \ No newline at end of file diff --git a/data_folder_example/config.yaml b/data_folder_example/config.yaml new file mode 100644 index 0000000..f6053aa --- /dev/null +++ b/data_folder_example/config.yaml @@ -0,0 +1,39 @@ +remote: true + +experienceLevel: + internship: false + entry: true + associate: true + mid-senior level: true + director: true + executive: true + +jobTypes: + full-time: true + contract: true + part-time: true + temporary: true + internship: false + other: true + volunteer: false + +date: + all time: false + month: false + week: true + 24 hours: false + +positions: + - Software engineer + +locations: + - Germany + +distance: 100 + +companyBlacklist: +- Noir +- Crossover + +titleBlacklist: + - Stage diff --git a/data_folder_example/plain_text_resume.yaml b/data_folder_example/plain_text_resume.yaml new file mode 100644 index 0000000..7be86d6 --- /dev/null +++ b/data_folder_example/plain_text_resume.yaml @@ -0,0 +1,95 @@ +personal_information: + name: "Mario" + surname: "Rossi" + dateOfBirth: "15/09/1988" + country: "Italy" + city: "Milan" + address: "Via Montenapoleone 10, 20121 Milan" + phonePrefix: "+39" + phone: "3351234567" + email: "mario.rossi@techcode.it" + github: "https://github.com/mario-rossi-dev" + linkedin: "https://www.linkedin.com/in/mario-rossi-developer/" + +self_identification: + gender: "Male" + pronouns: "He/Him" + veteran: false + disability: false + ethnicity: "Mediterranean" + +legal_authorization: + euWorkAuthorization: true + usWorkAuthorization: false + requiresUsVisa: true + legallyAllowedToWorkInUs: false + requiresUsSponsorship: true + requiresEuVisa: false + legallyAllowedToWorkInEu: true + requiresEuSponsorship: false + +work_preferences: + remoteWork: true + inPersonWork: true + openToRelocation: true + willingToCompleteAssessments: true + willingToUndergoDrugTests: true + willingToUndergoBackgroundChecks: true + +education_details: + - degree: "Master" + university: "Politecnico di Milano" + gpa: "3.8/4" + graduationYear: "2012" + fieldOfStudy: "Computer Engineering" + skillsAcquired: + artificialIntelligence: "4" + dataScience: "3" + cloudComputing: "3" + +experience_details: + - position: "Senior Software Engineer" + company: "TechInnovate S.p.A." + employmentPeriod: "06/2018 - Present" + location: "Milan, Italy" + industry: "FinTech" + keyResponsibilities: + responsibility1: "Led development of real-time trading algorithm, improving transaction speed by 40%" + responsibility2: "Implemented CI/CD pipeline, reducing deployment time from days to hours" + responsibility3: "Mentored junior developers, increasing team productivity by 25% over 6 months" + skillsAcquired: + java: "5" + springBoot: "4" + kubernetes: "3" + aws: "4" + microservices: "4" + agileMethodologies: "5" + +projects: + project1: "Developed a high-frequency trading platform using Java and Spring Boot, processing over 1 million transactions per second" + project2: "Led the migration of legacy systems to a microservices architecture, improving system reliability by 99.99%" + +availability: + noticePeriod: "3 months" + +salary_expectations: + salaryRangeUSD: "90000" + +certifications: + - "AWS Certified Solutions Architect" + - "Oracle Certified Professional, Java SE 11 Developer" + - "Certified Scrum Master" + +languages: + - language: "Italian" + proficiency: "Native" + - language: "English" + proficiency: "Fluent" + - language: "Spanish" + proficiency: "Intermediate" + +interests: + - "Open Source Contributing" + - "Machine Learning" + - "Hiking" + - "Chess" \ No newline at end of file diff --git a/data_folder_example/secrets.yaml b/data_folder_example/secrets.yaml new file mode 100644 index 0000000..ad24cd8 --- /dev/null +++ b/data_folder_example/secrets.yaml @@ -0,0 +1,3 @@ +email: myemaillinkedin@gmail.com +password: ImpossiblePassowrd10 +openai_api_key: sk-11KRr4uuTwpRGfeRTfj1T9BlbkFJjP8QTrswHU1yGruru2FR \ No newline at end of file diff --git a/gpt.py b/gpt.py new file mode 100644 index 0000000..13832b5 --- /dev/null +++ b/gpt.py @@ -0,0 +1,279 @@ +import json +import os +import re +import textwrap +from datetime import datetime +from typing import Dict, List + +from dotenv import load_dotenv +from langchain_core.messages.ai import AIMessage +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompt_values import StringPromptValue +from langchain_core.prompts import ChatPromptTemplate +from langchain_openai import ChatOpenAI +from Levenshtein import distance + +import strings + +load_dotenv() + + +class LLMLogger: + + def __init__(self, llm: ChatOpenAI): + self.llm = llm + + @staticmethod + def log_request(prompts, parsed_reply: Dict[str, Dict]): + calls_log = os.path.join(os.getcwd(), "open_ai_calls.json") + if isinstance(prompts, StringPromptValue): + prompts = prompts.text + elif isinstance(prompts, Dict): + # Convert prompts to a dictionary if they are not in the expected format + prompts = { + f"prompt_{i+1}": prompt.content + for i, prompt in enumerate(prompts.messages) + } + else: + prompts = { + f"prompt_{i+1}": prompt.content + for i, prompt in enumerate(prompts.messages) + } + + current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # Extract token usage details from the response + token_usage = parsed_reply["usage_metadata"] + output_tokens = token_usage["output_tokens"] + input_tokens = token_usage["input_tokens"] + total_tokens = token_usage["total_tokens"] + + # Extract model details from the response + model_name = parsed_reply["response_metadata"]["model_name"] + prompt_price_per_token = 0.00000015 + completion_price_per_token = 0.0000006 + + # Calculate the total cost of the API call + total_cost = (input_tokens * prompt_price_per_token) + ( + output_tokens * completion_price_per_token + ) + + # Create a log entry with all relevant information + log_entry = { + "model": model_name, + "time": current_time, + "prompts": prompts, + "replies": parsed_reply["content"], # Response content + "total_tokens": total_tokens, + "input_tokens": input_tokens, + "output_tokens": output_tokens, + "total_cost": total_cost, + } + + # Write the log entry to the log file in JSON format + with open(calls_log, "a", encoding="utf-8") as f: + json_string = json.dumps(log_entry, ensure_ascii=False, indent=4) + f.write(json_string + "\n") + + +class LoggerChatModel: + + def __init__(self, llm: ChatOpenAI): + self.llm = llm + + def __call__(self, messages: List[Dict[str, str]]) -> str: + # Call the LLM with the provided messages and log the response. + reply = self.llm(messages) + parsed_reply = self.parse_llmresult(reply) + LLMLogger.log_request(prompts=messages, parsed_reply=parsed_reply) + return reply + + def parse_llmresult(self, llmresult: AIMessage) -> Dict[str, Dict]: + # Parse the LLM result into a structured format. + content = llmresult.content + response_metadata = llmresult.response_metadata + id_ = llmresult.id + usage_metadata = llmresult.usage_metadata + + parsed_result = { + "content": content, + "response_metadata": { + "model_name": response_metadata.get("model_name", ""), + "system_fingerprint": response_metadata.get("system_fingerprint", ""), + "finish_reason": response_metadata.get("finish_reason", ""), + "logprobs": response_metadata.get("logprobs", None), + }, + "id": id_, + "usage_metadata": { + "input_tokens": usage_metadata.get("input_tokens", 0), + "output_tokens": usage_metadata.get("output_tokens", 0), + "total_tokens": usage_metadata.get("total_tokens", 0), + }, + } + return parsed_result + + +class GPTAnswerer: + def __init__(self, openai_api_key): + self.llm_cheap = LoggerChatModel( + ChatOpenAI( + model_name="gpt-4o-mini", openai_api_key=openai_api_key, temperature=0.8 + ) + ) + + @property + def job_description(self): + return self.job.description + + @staticmethod + def find_best_match(text: str, options: list[str]) -> str: + # Find the best match for the given text from a list of options using Levenshtein distance. + distances = [ + (option, distance(text.lower(), option.lower())) for option in options + ] + best_option = min(distances, key=lambda x: x[1])[0] + return best_option + + @staticmethod + def _remove_placeholders(text: str) -> str: + # Remove placeholder text from a string. + text = text.replace("PLACEHOLDER", "") + return text.strip() + + @staticmethod + def _preprocess_template_string(template: str) -> str: + # Preprocess a template string to remove unnecessary indentation. + return textwrap.dedent(template) + + def set_resume(self, resume): + self.resume = resume + + def set_job(self, job): + self.job = job + self.job.set_summarize_job_description( + self.summarize_job_description(self.job.description) + ) + + def summarize_job_description(self, text: str) -> str: + strings.summarize_prompt_template = self._preprocess_template_string( + strings.summarize_prompt_template + ) + prompt = ChatPromptTemplate.from_template(strings.summarize_prompt_template) + chain = prompt | self.llm_cheap | StrOutputParser() + output = chain.invoke({"text": text}) + return output + + """def get_resume_html(self): + latex_resume_template = self._preprocess_template_string(strings.latex_resume_template) + prompt = ChatPromptTemplate.from_template(latex_resume_template) + chain = prompt | self.llm_cheap | StrOutputParser() + output = chain.invoke({"resume": self.resume, "job_description": self.job.summarize_job_description}) + return output""" + + + def get_resume_html(self): + # Crea i prompt a partire dai template + prepare_info_prompt = ChatPromptTemplate.from_template(strings.prepare_info_template) + format_resume_prompt = ChatPromptTemplate.from_template(strings.format_resume_template) + review_and_optimize_prompt = ChatPromptTemplate.from_template(strings.review_and_optimize_template) + + # Creazione delle catene + prepare_info_chain = prepare_info_prompt | self.llm_cheap | StrOutputParser() + format_resume_chain = format_resume_prompt | self.llm_cheap | StrOutputParser() + review_and_optimize_chain = review_and_optimize_prompt | self.llm_cheap | StrOutputParser() + + composed_chain = ( + prepare_info_chain + | (lambda output: {"formatted_resume": output}) + | format_resume_chain + | (lambda output: {"final_resume_html": output}) + | review_and_optimize_chain + ) + + try: + output = composed_chain.invoke({ + "resume": self.resume, + "job_description": self.job.summarize_job_description + }) + return output + + except Exception as e: + #print(f"Error during elaboration: {e}") + pass + + + def _create_chain(self, template: str): + prompt = ChatPromptTemplate.from_template(template) + return prompt | self.llm_cheap | StrOutputParser() + + def answer_question_textual_wide_range(self, question: str) -> str: + # Define chains for each section of the resume + self.chains = { + "personal_information": self._create_chain(strings.personal_information_template), + "self_identification": self._create_chain(strings.self_identification_template), + "legal_authorization": self._create_chain(strings.legal_authorization_template), + "work_preferences": self._create_chain(strings.work_preferences_template), + "education_details": self._create_chain(strings.education_details_template), + "experience_details": self._create_chain(strings.experience_details_template), + "projects": self._create_chain(strings.projects_template), + "availability": self._create_chain(strings.availability_template), + "salary_expectations": self._create_chain(strings.salary_expectations_template), + "certifications": self._create_chain(strings.certifications_template), + "languages": self._create_chain(strings.languages_template), + "interests": self._create_chain(strings.interests_template), + } + section_prompt = ( + f"For the following question: '{question}', which section of the resume is relevant? " + "Respond with one of the following: Personal information, Self-Identification, Legal Authorization, " + "Work Preferences, Education Details, Experience Details, Projects, Availability, Salary Expectations, " + "Certifications, Languages, Interests." + ) + + prompt = ChatPromptTemplate.from_template(section_prompt) + chain = prompt | self.llm_cheap | StrOutputParser() + output = chain.invoke({"question": question}) + section_name = output.lower().replace(" ", "_") + + resume_section = getattr(self.resume, section_name, None) + if resume_section is None: + raise ValueError(f"Section '{section_name}' not found in the resume.") + + # Use the corresponding chain to answer the question + chain = self.chains.get(section_name) + if chain is None: + raise ValueError(f"Chain not defined for section '{section_name}'") + output_str = chain.invoke({"resume_section": resume_section, "question": question}) + return output_str + + def answer_question_textual(self, question: str) -> str: + template = self._preprocess_template_string(strings.resume_stuff_template) + prompt = ChatPromptTemplate.from_template(template) + chain = prompt | self.llm_cheap | StrOutputParser() + output = chain.invoke({"resume": self.resume, "question": question}) + return output + + def answer_question_numeric(self, question: str, default_experience: int = 3) -> int: + func_template = self._preprocess_template_string(strings.numeric_question_template) + prompt = ChatPromptTemplate.from_template(func_template) + chain = prompt | self.llm_cheap | StrOutputParser() + output_str = chain.invoke({"resume": self.resume, "question": question, "default_experience": default_experience}) + try: + output = self.extract_number_from_string(output_str) + except ValueError: + output = default_experience + return output + + def extract_number_from_string(self, output_str): + numbers = re.findall(r"\d+", output_str) + if numbers: + return int(numbers[0]) + else: + raise ValueError("No numbers found in the string") + + def answer_question_from_options(self, question: str, options: list[str]) -> str: + func_template = self._preprocess_template_string(strings.options_template) + prompt = ChatPromptTemplate.from_template(func_template) + chain = prompt | self.llm_cheap | StrOutputParser() + output_str = chain.invoke({"resume": self.resume, "question": question, "options": options}) + best_option = self.find_best_match(output_str, options) + return best_option diff --git a/job.py b/job.py new file mode 100644 index 0000000..301e3fb --- /dev/null +++ b/job.py @@ -0,0 +1,33 @@ +from dataclasses import dataclass + +@dataclass +class Job: + title: str + company: str + location: str + link: str + apply_method: str + description: str = "" + summarize_job_description: str = "" + + def set_summarize_job_description(self, summarize_job_description): + self.summarize_job_description = summarize_job_description + + def set_job_description(self, description): + self.description = description + + def formatted_job_information(self): + """ + Formats the job information as a markdown string. + """ + job_information = f""" + # Job Description + ## Job Information + - Position: {self.title} + - At: {self.company} + - Location: {self.location} + + ## Description + {self.description or 'No description provided.'} + """ + return job_information.strip() diff --git a/linkedIn_authenticator.py b/linkedIn_authenticator.py new file mode 100644 index 0000000..1d976f2 --- /dev/null +++ b/linkedIn_authenticator.py @@ -0,0 +1,92 @@ +from selenium.common.exceptions import NoSuchElementException, TimeoutException +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + +class LinkedInAuthenticator: + + def __init__(self, driver=None): + self.driver = driver + self.email = "" + self.password = "" + + def set_secrets(self, email, password): + self.email = email + self.password = password + + def start(self): + """Start the Chrome browser and attempt to log in to LinkedIn.""" + print("Starting Chrome browser to log in to LinkedIn.") + self.driver.get('https://www.linkedin.com') + self.wait_for_page_load() + if not self.is_logged_in(): + self.handle_login() + + def handle_login(self): + """Handle the LinkedIn login process.""" + print("Navigating to the LinkedIn login page...") + self.driver.get("https://www.linkedin.com/login") + try: + self.enter_credentials() + self.submit_login_form() + except NoSuchElementException: + print("Could not log in to LinkedIn. Please check your credentials.") + self.handle_security_check() + + def enter_credentials(self): + """Enter the user's email and password into the login form.""" + try: + email_field = WebDriverWait(self.driver, 10).until( + EC.presence_of_element_located((By.ID, "username")) + ) + email_field.send_keys(self.email) + password_field = self.driver.find_element(By.ID, "password") + password_field.send_keys(self.password) + except TimeoutException: + print("Login form not found. Aborting login.") + + def submit_login_form(self): + """Submit the LinkedIn login form.""" + try: + login_button = self.driver.find_element(By.XPATH, '//button[@type="submit"]') + login_button.click() + except NoSuchElementException: + print("Login button not found. Please verify the page structure.") + + def handle_security_check(self): + """Handle LinkedIn security checks if triggered.""" + try: + WebDriverWait(self.driver, 10).until( + EC.url_contains('https://www.linkedin.com/checkpoint/challengesV2/') + ) + print("Security checkpoint detected. Please complete the challenge.") + WebDriverWait(self.driver, 300).until( + EC.url_contains('https://www.linkedin.com/feed/') + ) + print("Security check completed") + except TimeoutException: + print("Security check not completed. Please try again later.") + + def is_logged_in(self): + """Check if the user is already logged in to LinkedIn.""" + self.driver.get('https://www.linkedin.com/feed') + try: + WebDriverWait(self.driver, 10).until( + EC.presence_of_element_located((By.CLASS_NAME, 'share-box-feed-entry__trigger')) + ) + buttons = self.driver.find_elements(By.CLASS_NAME, 'share-box-feed-entry__trigger') + if any(button.text.strip() == 'Start a post' for button in buttons): + print("User is already logged in.") + return True + except TimeoutException: + pass + return False + + def wait_for_page_load(self, timeout=10): + """Wait for the page to fully load.""" + try: + WebDriverWait(self.driver, timeout).until( + lambda d: d.execute_script('return document.readyState') == 'complete' + ) + except TimeoutException: + print("Page load timed out.") diff --git a/linkedIn_bot_facade.py b/linkedIn_bot_facade.py new file mode 100644 index 0000000..6e8cd3e --- /dev/null +++ b/linkedIn_bot_facade.py @@ -0,0 +1,57 @@ +class LinkedInBotFacade: + + def __init__(self, login_component, apply_component): + self.login_component = login_component + self.apply_component = apply_component + self.state = { + "credentials_set": False, + "api_key_set": False, + "resume_set": False, + "gpt_answerer_set": False, + "parameters_set": False, + "logged_in": False + } + + def set_resume(self, resume): + if not resume: + raise ValueError("Plain text resume cannot be empty.") + self.resume = resume + self.state["resume_set"] = True + + def set_secrets(self, email, password): # Aggiunto openai_api_key + if not email or not password : + raise ValueError("Email and password cannot be empty.") + self.email = email + self.password = password + self.state["credentials_set"] = True + + def set_gpt_answerer(self, gpt_answerer_component): + self.gpt_answerer = gpt_answerer_component + self.gpt_answerer.set_resume(self.resume) + self.apply_component.set_gpt_answerer(self.gpt_answerer) + self.state["gpt_answerer_set"] = True + + def set_parameters(self, parameters): + if not parameters: + raise ValueError("Parameters cannot be None or empty.") + self.parameters = parameters + self.apply_component.set_parameters(parameters) + self.state["parameters_set"] = True + + def start_login(self): + if not self.state["credentials_set"]: + raise ValueError("Email and password must be set before logging in.") + self.login_component.set_secrets(self.email, self.password) + self.login_component.start() + self.state["logged_in"] = True + + def start_apply(self): + if not self.state["logged_in"]: + raise ValueError("You must be logged in before applying.") + if not self.state["resume_set"]: + raise ValueError("Plain text resume must be set before applying.") + if not self.state["gpt_answerer_set"]: + raise ValueError("GPT Answerer must be set before applying.") + if not self.state["parameters_set"]: + raise ValueError("Parameters must be set before applying.") + self.apply_component.start_applying() \ No newline at end of file diff --git a/linkedIn_easy_applier.py b/linkedIn_easy_applier.py new file mode 100644 index 0000000..75f9f35 --- /dev/null +++ b/linkedIn_easy_applier.py @@ -0,0 +1,348 @@ +import io +import os +import random +import tempfile +import time +import traceback +from datetime import date +from typing import List, Optional, Any, Tuple +from reportlab.lib.pagesizes import letter +from reportlab.pdfgen import canvas +from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.remote.webelement import WebElement +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import Select, WebDriverWait +import tempfile +import time +from reportlab.lib.pagesizes import letter +from reportlab.pdfgen import canvas +import io +import time +from reportlab.lib.pagesizes import letter +from reportlab.pdfgen import canvas +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.platypus import SimpleDocTemplate, Paragraph +from reportlab.lib.pagesizes import letter +from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer +from reportlab.lib.styles import getSampleStyleSheet +from xhtml2pdf import pisa + +class LinkedInEasyApplier: + def __init__(self, driver: Any, resume_dir: Optional[str], set_old_answers: List[Tuple[str, str, str]], gpt_answerer: Any): + if resume_dir is None or not os.path.exists(resume_dir): + resume_dir = None + self.driver = driver + self.resume_dir = resume_dir + self.set_old_answers = set_old_answers + self.gpt_answerer = gpt_answerer + + def job_apply(self, job: Any): + self.driver.get(job.link) + time.sleep(random.uniform(3, 5)) + try: + easy_apply_button = self._find_easy_apply_button() + job_description = self._get_job_description() + job.set_job_description(job_description) + easy_apply_button.click() + self.gpt_answerer.set_job(job) + self._fill_application_form() + except Exception: + tb_str = traceback.format_exc() + self._discard_application() + raise Exception(f"Failed to apply to job! Original exception: \nTraceback:\n{tb_str}") + + + def _find_easy_apply_button(self) -> WebElement: + buttons = WebDriverWait(self.driver, 10).until( + EC.presence_of_all_elements_located( + (By.XPATH, '//button[contains(@class, "jobs-apply-button") and contains(., "Easy Apply")]') + ) + ) + for index, button in enumerate(buttons): + try: + return WebDriverWait(self.driver, 10).until( + EC.element_to_be_clickable( + (By.XPATH, f'(//button[contains(@class, "jobs-apply-button") and contains(., "Easy Apply")])[{index + 1}]') + ) + ) + except Exception as e: + pass + raise Exception("No clickable 'Easy Apply' button found") + + def _get_job_description(self) -> str: + try: + see_more_button = self.driver.find_element(By.XPATH, '//button[@aria-label="Click to see more description"]') + see_more_button.click() + time.sleep(2) + description = self.driver.find_element(By.CLASS_NAME, 'jobs-description-content__text').text + self._scroll_page() + return description + except NoSuchElementException: + tb_str = traceback.format_exc() + raise Exception("Job description 'See more' button not found: \nTraceback:\n{tb_str}") + except Exception : + tb_str = traceback.format_exc() + raise Exception(f"Error getting Job description: \nTraceback:\n{tb_str}") + + def _scroll_page(self) -> None: + scrollable_element = self.driver.find_element(By.TAG_NAME, 'html') + # utils.scroll_slow(self.driver, scrollable_element, step=300, reverse=False) + # utils.scroll_slow(self.driver, scrollable_element, step=300, reverse=True) + + def _fill_application_form(self): + while True: + self.fill_up() + self._next_or_submit() + + def _next_or_submit(self): + next_button = self.driver.find_element(By.CLASS_NAME, "artdeco-button--primary") + button_text = next_button.text.lower() + if 'submit application' in button_text: + self._unfollow_company() + time.sleep(random.uniform(1.5, 2.5)) + next_button.click() + time.sleep(random.uniform(3.0, 5.0)) + self._check_for_errors() + + + def _unfollow_company(self) -> None: + try: + follow_checkbox = self.driver.find_element( + By.XPATH, "//label[contains(.,'to stay up to date with their page.')]") + follow_checkbox.click() + except Exception as e: + pass + + def _check_for_errors(self) -> None: + error_elements = self.driver.find_elements(By.CLASS_NAME, 'artdeco-inline-feedback--error') + if error_elements: + raise Exception(f"Failed answering or file upload. {str([e.text for e in error_elements])}") + + def _discard_application(self) -> None: + try: + self.driver.find_element(By.CLASS_NAME, 'artdeco-modal__dismiss').click() + time.sleep(random.uniform(3, 5)) + self.driver.find_elements(By.CLASS_NAME, 'artdeco-modal__confirm-dialog-btn')[0].click() + time.sleep(random.uniform(3, 5)) + except Exception as e: + pass + + def fill_up(self) -> None: + easy_apply_content = self.driver.find_element(By.CLASS_NAME, 'jobs-easy-apply-content') + pb4_elements = easy_apply_content.find_elements(By.CLASS_NAME, 'pb4') + for element in pb4_elements: + self._process_form_element(element) + + + def _process_form_element(self, element: WebElement) -> None: + try: + if self._is_upload_field(element): + self._handle_upload_fields(element) + else: + self._fill_additional_questions() + except Exception as e: + pass + + def _is_upload_field(self, element: WebElement) -> bool: + try: + element.find_element(By.XPATH, ".//input[@type='file']") + return True + except NoSuchElementException: + return False + + def _handle_upload_fields(self, element: WebElement) -> None: + file_upload_elements = self.driver.find_elements(By.XPATH, "//input[@type='file']") + for element in file_upload_elements: + parent = element.find_element(By.XPATH, "..") + self.driver.execute_script("arguments[0].classList.remove('hidden')", element) + if 'resume' in parent.text.lower(): + if self.resume_dir != None: + resume_path = self.resume_dir.resolve() + if self.resume_dir != None and resume_path.exists() and resume_path.is_file(): + element.send_keys(str(resume_path)) + else: + self._create_and_upload_resume(element) + elif 'cover' in parent.text.lower(): + self._create_and_upload_cover_letter(element) + + def _create_and_upload_resume(self, element): + """Creates a resume in PDF format, uploads it using the upload element, and ensures cleanup of the temporary file.""" + max_retries = 3 + retry_delay = 1 # seconds + + for attempt in range(max_retries): + try: + html_string = self.gpt_answerer.get_resume_html() + html_string = html_string.replace('\n', '') + with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as temp_file: + pdf_path = temp_file.name + + # Convert HTML to PDF + pisa_status = pisa.CreatePDF(html_string, dest=temp_file) + element.send_keys(pdf_path) + if pisa_status.err: + raise Exception(f"PDF generation failed with error: {pisa_status.err}") + time.sleep(2) + + return True + + except Exception: + if attempt < max_retries - 1: + time.sleep(retry_delay) + else: + tb_str = traceback.format_exc() + raise Exception(f"Max retries reached. Upload failed: \nTraceback:\n{tb_str}") + + finally: + if os.path.exists(pdf_path): + os.remove(pdf_path) + + def _upload_resume(self, element: WebElement) -> None: + element.send_keys(str(self.resume_dir)) + + def _create_and_upload_cover_letter(self, element: WebElement) -> None: + cover_letter = self.gpt_answerer.answer_question_textual_wide_range("Write a cover letter") + with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as temp_pdf_file: + letter_path = temp_pdf_file.name + c = canvas.Canvas(letter_path, pagesize=letter) + width, height = letter + text_object = c.beginText(100, height - 100) + text_object.setFont("Helvetica", 12) + text_object.textLines(cover_letter) + c.drawText(text_object) + c.save() + element.send_keys(letter_path) + + def _fill_additional_questions(self) -> None: + form_sections = self.driver.find_elements(By.CLASS_NAME, 'jobs-easy-apply-form-section__grouping') + for section in form_sections: + self._process_question(section) + + def _process_question(self, section: WebElement) -> None: + if self._handle_terms_of_service(section): + return + self._handle_radio_question(section) + self._handle_textbox_question(section) + self._handle_date_question(section) + self._handle_dropdown_question(section) + + def _handle_terms_of_service(self, element: WebElement) -> bool: + try: + question = element.find_element(By.CLASS_NAME, 'jobs-easy-apply-form-element') + checkbox = question.find_element(By.TAG_NAME, 'label') + question_text = question.text.lower() + if 'terms of service' in question_text or 'privacy policy' in question_text or 'terms of use' in question_text: + checkbox.click() + return True + except NoSuchElementException: + pass + return False + + def _handle_radio_question(self, element: WebElement) -> None: + try: + question = element.find_element(By.CLASS_NAME, 'jobs-easy-apply-form-element') + radios = question.find_elements(By.CLASS_NAME, 'fb-text-selectable__option') + if not radios: + return + + question_text = element.text.lower() + options = [radio.text.lower() for radio in radios] + + answer = self._get_answer_from_set('radio', question_text, options) + if not answer: + answer = self.gpt_answerer.answer_question_from_options(question_text, options) + + self._select_radio(radios, answer) + except Exception: + pass + + def _handle_textbox_question(self, element: WebElement) -> None: + try: + question = element.find_element(By.CLASS_NAME, 'jobs-easy-apply-form-element') + question_text = question.find_element(By.TAG_NAME, 'label').text.lower() + text_field = self._find_text_field(question) + + is_numeric = self._is_numeric_field(text_field) + answer = self._get_answer_from_set('numeric' if is_numeric else 'text', question_text) + + if not answer: + answer = self.gpt_answerer.answer_question_numeric(question_text) if is_numeric else self.gpt_answerer.answer_question_textual_wide_range(question_text) + + self._enter_text(text_field, answer) + self._handle_form_errors(element, question_text, answer, text_field) + except Exception: + pass + + def _handle_date_question(self, element: WebElement) -> None: + try: + date_picker = element.find_element(By.CLASS_NAME, 'artdeco-datepicker__input') + date_picker.clear() + date_picker.send_keys(date.today().strftime("%m/%d/%y")) + time.sleep(3) + date_picker.send_keys(Keys.RETURN) + time.sleep(2) + except Exception: + pass + + def _handle_dropdown_question(self, element: WebElement) -> None: + try: + question = element.find_element(By.CLASS_NAME, 'jobs-easy-apply-form-element') + question_text = question.find_element(By.TAG_NAME, 'label').text.lower() + dropdown = question.find_element(By.TAG_NAME, 'select') + select = Select(dropdown) + options = [option.text for option in select.options] + + answer = self._get_answer_from_set('dropdown', question_text, options) + if not answer: + answer = self.gpt_answerer.answer_question_from_options(question_text, options) + + self._select_dropdown(dropdown, answer) + except Exception: + pass + + def _get_answer_from_set(self, question_type: str, question_text: str, options: Optional[List[str]] = None) -> Optional[str]: + for entry in self.set_old_answers: + if isinstance(entry, tuple) and len(entry) == 3: + if entry[0] == question_type and question_text in entry[1].lower(): + answer = entry[2] + return answer if options is None or answer in options else None + return None + + def _find_text_field(self, question: WebElement) -> WebElement: + try: + return question.find_element(By.TAG_NAME, 'input') + except NoSuchElementException: + return question.find_element(By.TAG_NAME, 'textarea') + + def _is_numeric_field(self, field: WebElement) -> bool: + field_type = field.get_attribute('type').lower() + if 'numeric' in field_type: + return True + class_attribute = field.get_attribute("id") + return class_attribute and 'numeric' in class_attribute + + def _enter_text(self, element: WebElement, text: str) -> None: + element.clear() + element.send_keys(text) + + def _select_dropdown(self, element: WebElement, text: str) -> None: + select = Select(element) + select.select_by_visible_text(text) + + def _select_radio(self, radios: List[WebElement], answer: str) -> None: + for radio in radios: + if answer in radio.text.lower(): + radio.find_element(By.TAG_NAME, 'label').click() + return + radios[-1].find_element(By.TAG_NAME, 'label').click() + + def _handle_form_errors(self, element: WebElement, question_text: str, answer: str, text_field: WebElement) -> None: + try: + error = element.find_element(By.CLASS_NAME, 'artdeco-inline-feedback--error') + error_text = error.text.lower() + new_answer = self.gpt_answerer.try_fix_answer(question_text, answer, error_text) + self._enter_text(text_field, new_answer) + except NoSuchElementException: + pass diff --git a/linkedIn_job_manager.py b/linkedIn_job_manager.py new file mode 100644 index 0000000..d3f142d --- /dev/null +++ b/linkedIn_job_manager.py @@ -0,0 +1,227 @@ +import csv +import os +import random +import time +import traceback +from itertools import product +from pathlib import Path + +from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By + +import utils +from job import Job +from linkedIn_easy_applier import LinkedInEasyApplier + + +class EnvironmentKeys: + def __init__(self): + self.skip_apply = self._read_env_key_bool("SKIP_APPLY") + self.disable_description_filter = self._read_env_key_bool("DISABLE_DESCRIPTION_FILTER") + + @staticmethod + def _read_env_key(key: str) -> str: + return os.getenv(key, "") + + @staticmethod + def _read_env_key_bool(key: str) -> bool: + return os.getenv(key) == "True" + +class LinkedInJobManager: + def __init__(self, driver): + self.driver = driver + self.set_old_answers = set() + self.easy_applier_component = None + + def set_parameters(self, parameters): + self.company_blacklist = parameters.get('companyBlacklist', []) or [] + self.title_blacklist = parameters.get('titleBlacklist', []) or [] + self.positions = parameters.get('positions', []) + self.locations = parameters.get('locations', []) + self.base_search_url = self.get_base_search_url(parameters) + self.seen_jobs = [] + resume_path = parameters.get('uploads', {}).get('resume', None) + if resume_path is not None and Path(resume_path).exists(): + self.resume_dir = Path(resume_path) + else: + self.resume_dir = None + self.output_file_directory = Path(parameters['outputFileDirectory']) + self.env_config = EnvironmentKeys() + self.old_question() + + def set_gpt_answerer(self, gpt_answerer): + self.gpt_answerer = gpt_answerer + + def old_question(self): + """ + Load old answers from a CSV file into a dictionary. + """ + self.set_old_answers = {} + file_path = 'data_folder/output/old_Questions.csv' + with open(file_path, 'r', newline='', encoding='utf-8', errors='ignore') as file: + csv_reader = csv.reader(file, delimiter=',', quotechar='"') + for row in csv_reader: + if len(row) == 3: + answer_type, question_text, answer = row + self.set_old_answers[(answer_type.lower(), question_text.lower())] = answer + + + def start_applying(self): + self.easy_applier_component = LinkedInEasyApplier( + self.driver, self.resume_dir, self.set_old_answers, self.gpt_answerer + ) + searches = list(product(self.positions, self.locations)) + random.shuffle(searches) + page_sleep = 0 + minimum_time = 60 * 15 + minimum_page_time = time.time() + minimum_time + + for position, location in searches: + location_url = "&location=" + location + job_page_number = -1 + print(f"Starting the search for {position} in {location}.") + + try: + while True: + page_sleep += 1 + job_page_number += 1 + print(f"Going to job page {job_page_number}") + self.next_job_page(position, location_url, job_page_number) + time.sleep(random.uniform(1.5, 3.5)) + print("Starting the application process for this page...") + self.apply_jobs() + print("Applying to jobs on this page has been completed!") + + time_left = minimum_page_time - time.time() + if time_left > 0: + print(f"Sleeping for {time_left} seconds.") + time.sleep(time_left) + minimum_page_time = time.time() + minimum_time + if page_sleep % 5 == 0: + sleep_time = random.randint(5, 34) + print(f"Sleeping for {sleep_time / 60} minutes.") + time.sleep(sleep_time) + page_sleep += 1 + except Exception: + traceback.print_exc() + pass + + time_left = minimum_page_time - time.time() + if time_left > 0: + print(f"Sleeping for {time_left} seconds.") + time.sleep(time_left) + minimum_page_time = time.time() + minimum_time + if page_sleep % 5 == 0: + sleep_time = random.randint(50, 90) + print(f"Sleeping for {sleep_time / 60} minutes.") + time.sleep(sleep_time) + page_sleep += 1 + + def apply_jobs(self): + try: + try: + no_jobs_element = self.driver.find_element(By.CLASS_NAME, 'jobs-search-two-pane__no-results-banner--expand') + if 'No matching jobs found' in no_jobs_element.text or 'unfortunately, things aren' in self.driver.page_source.lower(): + raise Exception("No more jobs on this page") + except NoSuchElementException: + pass + + job_results = self.driver.find_element(By.CLASS_NAME, "jobs-search-results-list") + utils.scroll_slow(self.driver, job_results) + utils.scroll_slow(self.driver, job_results, step=300, reverse=True) + + job_list_elements = self.driver.find_elements(By.CLASS_NAME, 'scaffold-layout__list-container')[0].find_elements(By.CLASS_NAME, 'jobs-search-results__list-item') + + if not job_list_elements: + raise Exception("No job class elements found on page") + + job_list = [Job(*self.extract_job_information_from_tile(job_element)) for job_element in job_list_elements] + + for job in job_list: + if self.is_blacklisted(job.title, job.company, job.link): + print(f"Blacklisted {job.title} at {job.company}, skipping...") + self.write_to_file(job.company, job.location, job.title, job.link, "skipped") + continue + + try: + if job.apply_method not in {"Continue", "Applied", "Apply"}: + self.easy_applier_component.job_apply(job) + except Exception: + self.write_to_file(job.company, job.location, job.title, job.link, "failed") + continue + self.write_to_file(job.company, job.location, job.title, job.link, "success") + + except Exception as e: + traceback.print_exc() + raise e + + def write_to_file(self, company, job_title, link, job_location, file_name): + to_write = [company, job_title, link, job_location] + file_path = self.output_file_directory / f"{file_name}.csv" + with open(file_path, 'a', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(to_write) + + def record_gpt_answer(self, answer_type, question_text, gpt_response): + to_write = [answer_type, question_text, gpt_response] + file_path = self.output_file_directory / "registered_jobs.csv" + try: + with open(file_path, 'a', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(to_write) + except Exception as e: + print(f"Error writing registered job: {e}") + print(f"Details: Answer type: {answer_type}, Question: {question_text}") + + def get_base_search_url(self, parameters): + remote_url = "f_CF=f_WRA" if parameters['remote'] else "" + experience_url = "f_E=" + "%2C".join( + str(i+1) for i, v in enumerate(parameters.get('experienceLevel', [])) if v + ) + distance_url = "?distance=" + str(parameters['distance']) + job_types_url = "f_JT=" + "%2C".join( + k[0].upper() for k, v in parameters.get('experienceLevel', {}).items() if v + ) + date_url = next( + (v for k, v in { + "all time": "", "month": "&f_TPR=r2592000", "week": "&f_TPR=r604800", "24 hours": "&f_TPR=r86400" + }.items() if parameters.get('date', {}).get(k)), "" + ) + easy_apply_url = "&f_LF=f_AL" + return f"{distance_url}&{remote_url}&{job_types_url}&{experience_url}{easy_apply_url}{date_url}" + + def next_job_page(self, position, location, job_page): + self.driver.get(f"https://www.linkedin.com/jobs/search/{self.base_search_url}&keywords={position}{location}&start={job_page * 25}") + + def extract_job_information_from_tile(self, job_tile): + job_title, company, job_location, apply_method, link = "", "", "", "", "" + try: + job_title = job_tile.find_element(By.CLASS_NAME, 'job-card-list__title').text + link = job_tile.find_element(By.CLASS_NAME, 'job-card-list__title').get_attribute('href').split('?')[0] + company = job_tile.find_element(By.CLASS_NAME, 'job-card-container__primary-description').text + except: + pass + try: + hiring_line = job_tile.find_element(By.XPATH, '//span[contains(.,\' is hiring for this\')]') + hiring_line_text = hiring_line.text + name_terminating_index = hiring_line_text.find(' is hiring for this') + except: + pass + try: + job_location = job_tile.find_element(By.CLASS_NAME, 'job-card-container__metadata-item').text + except: + pass + try: + apply_method = job_tile.find_element(By.CLASS_NAME, 'job-card-container__apply-method').text + except: + apply_method = "Applied" + + return job_title, company, job_location, link, apply_method + + def is_blacklisted(self, job_title, company, link): + job_title_words = job_title.lower().split(' ') + company_lower = company.lower() + title_blacklisted = any(word in job_title_words for word in self.title_blacklist) + company_blacklisted = company_lower in (word.lower() for word in self.company_blacklist) + link_seen = link in self.seen_jobs + return title_blacklisted or company_blacklisted or link_seen \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..aed5e44 --- /dev/null +++ b/main.py @@ -0,0 +1,182 @@ +import re +from pathlib import Path +import yaml +from selenium import webdriver +from selenium.webdriver.chrome.service import Service as ChromeService +from webdriver_manager.chrome import ChromeDriverManager +import click + +from utils import chromeBrowserOptions +from gpt import GPTAnswerer +from linkedIn_authenticator import LinkedInAuthenticator +from linkedIn_bot_facade import LinkedInBotFacade +from linkedIn_job_manager import LinkedInJobManager +from resume import Resume + +class ConfigError(Exception): + """Custom exception for configuration errors.""" + pass + +class ConfigValidator: + @staticmethod + def validate_email(email: str) -> bool: + email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' + return re.match(email_regex, email) is not None + + @staticmethod + def validate_config(config_yaml_path: Path) -> dict: + try: + with open(config_yaml_path, 'r') as stream: + parameters = yaml.safe_load(stream) + except yaml.YAMLError as exc: + raise ConfigError(f"Error reading config file: {exc}") + except FileNotFoundError: + raise ConfigError(f"Config file not found: {config_yaml_path}") + + mandatory_params = [ + 'remote', 'experienceLevel', + 'jobTypes', 'date', 'positions', 'locations', 'distance' + ] + + for param in mandatory_params: + if param not in parameters: + raise ConfigError(f"Missing parameter in config file: {param}") + + if not isinstance(parameters['remote'], bool): + raise ConfigError("'remote' must be a boolean value.") + + experience_level = parameters.get('experienceLevel', {}) + job_types = parameters.get('jobTypes', {}) + date = parameters.get('date', {}) + + if not experience_level or not any(experience_level.values()): + raise ConfigError("At least one experience level must be selected.") + if not job_types or not any(job_types.values()): + raise ConfigError("At least one job type must be selected.") + if not date or not any(date.values()): + raise ConfigError("At least one date filter must be selected.") + + approved_distances = {0, 5, 10, 25, 50, 100} + if parameters['distance'] not in approved_distances: + raise ConfigError(f"Invalid distance value. Must be one of: {approved_distances}") + if not parameters['positions']: + raise ConfigError("'positions' list cannot be empty.") + if not parameters['locations']: + raise ConfigError("'locations' list cannot be empty.") + return parameters + + @staticmethod + def validate_secrets(secrets_yaml_path: Path) -> tuple: + try: + with open(secrets_yaml_path, 'r') as stream: + secrets = yaml.safe_load(stream) + except yaml.YAMLError as exc: + raise ConfigError(f"Error reading secrets file: {exc}") + except FileNotFoundError: + raise ConfigError(f"Secrets file not found: {secrets_yaml_path}") + + mandatory_secrets = ['email', 'password', 'openai_api_key'] + + for secret in mandatory_secrets: + if secret not in secrets: + raise ConfigError(f"Missing secret: {secret}") + + if not ConfigValidator.validate_email(secrets['email']): + raise ConfigError("Invalid email format in secrets file.") + if not secrets['password']: + raise ConfigError("Password cannot be empty in secrets file.") + if not secrets['openai_api_key']: + raise ConfigError("OpenAI API key cannot be empty in secrets file.") + + return secrets['email'], str(secrets['password']), secrets['openai_api_key'] + +class FileManager: + @staticmethod + def find_file(name_containing: str, with_extension: str, at_path: Path) -> Path: + for file in at_path.iterdir(): + if name_containing.lower() in file.name.lower() and file.suffix.lower() == with_extension.lower(): + return file + return None + + @staticmethod + def validate_data_folder(app_data_folder: Path) -> tuple: + if not app_data_folder.exists() or not app_data_folder.is_dir(): + raise FileNotFoundError(f"Data folder not found: {app_data_folder}") + + secrets_file = app_data_folder / 'secrets.yaml' + config_file = app_data_folder / 'config.yaml' + plain_text_resume_file = app_data_folder / 'plain_text_resume.yaml' + + missing_files = [] + if not config_file.exists(): + missing_files.append('config.yaml') + if not plain_text_resume_file.exists(): + missing_files.append('plain_text_resume.yaml') + + if missing_files: + raise FileNotFoundError(f"Missing files in the data folder: {', '.join(missing_files)}") + + output_folder = app_data_folder / 'output' + output_folder.mkdir(exist_ok=True) + return secrets_file, config_file, plain_text_resume_file, output_folder + + @staticmethod + def file_paths_to_dict(resume_file: Path, plain_text_resume_file: Path) -> dict: + if not resume_file.exists(): + raise FileNotFoundError(f"Resume file not found: {resume_file}") + if not plain_text_resume_file.exists(): + raise FileNotFoundError(f"Plain text resume file not found: {plain_text_resume_file}") + return {'resume': resume_file, 'plainTextResume': plain_text_resume_file} + +def init_browser(): + try: + options = chromeBrowserOptions() + service = ChromeService(ChromeDriverManager().install()) + return webdriver.Chrome(service=service, options=options) + except Exception as e: + raise RuntimeError(f"Failed to initialize browser: {str(e)}") + +def create_and_run_bot(email: str, password: str, parameters: dict, openai_api_key: str): + try: + browser = init_browser() + login_component = LinkedInAuthenticator(browser) + apply_component = LinkedInJobManager(browser) + gpt_answerer_component = GPTAnswerer(openai_api_key) + + with open(parameters['uploads']['plainTextResume'], "r") as file: + plain_text_resume_file = file.read() + + resume_object = Resume(plain_text_resume_file) + bot = LinkedInBotFacade(login_component, apply_component) + bot.set_secrets(email, password) + bot.set_resume(resume_object) + bot.set_gpt_answerer(gpt_answerer_component) + bot.set_parameters(parameters) + bot.start_login() + bot.start_apply() + except Exception as e: + raise RuntimeError(f"Error running the bot: {str(e)}") + +@click.command() +@click.option('--resume', type=click.Path(exists=True, file_okay=True, dir_okay=False, path_type=Path), help="Path to the resume PDF file") +def main(resume: Path = None): + try: + data_folder = Path("data_folder") + secrets_file, config_file, plain_text_resume_file, output_folder = FileManager.validate_data_folder(data_folder) + parameters = ConfigValidator.validate_config(config_file) + email, password, openai_api_key = ConfigValidator.validate_secrets(secrets_file) + parameters['uploads'] = FileManager.file_paths_to_dict(resume, plain_text_resume_file) + parameters['outputFileDirectory'] = output_folder + + create_and_run_bot(email, password, parameters, openai_api_key) + except ConfigError as ce: + print(f"Configuration error: {str(ce)}") + except FileNotFoundError as fnf: + print(f"File not found: {str(fnf)}") + except RuntimeError as re: + print(f"Runtime error: {str(re)}") + except Exception as e: + print(f"An unexpected error occurred: {str(e)}") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/open_ai_calls.json b/open_ai_calls.json new file mode 100644 index 0000000..73f5064 --- /dev/null +++ b/open_ai_calls.json @@ -0,0 +1,456 @@ +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:14", + "prompts": { + "prompt_1": "\nAs a seasoned HR expert, your task is to identify and outline the key skills and requirements necessary for the position of this job. Use the provided job description as input to extract all relevant information. This will involve conducting a thorough analysis of the job's responsibilities and the industry standards. You should consider both the technical and soft skills needed to excel in this role. Additionally, specify any educational qualifications, certifications, or experiences that are essential. Your analysis should also reflect on the evolving nature of this role, considering future trends and how they might affect the required competencies.\n\nRules:\nRemove boilerplate text\nInclude only relevant information to match the job description against the resume\n\n# Analysis Requirements\nYour analysis should include the following sections:\nTechnical Skills: List all the specific technical skills required for the role based on the responsibilities described in the job description.\nSoft Skills: Identify the necessary soft skills, such as communication abilities, problem-solving, time management, etc.\nEducational Qualifications and Certifications: Specify the essential educational qualifications and certifications for the role.\nProfessional Experience: Describe the relevant work experiences that are required or preferred.\nRole Evolution: Analyze how the role might evolve in the future, considering industry trends and how these might influence the required skills.\n\n# Final Result:\nYour analysis should be structured in a clear and organized document with distinct sections for each of the points listed above. Each section should contain:\nThis comprehensive overview will serve as a guideline for the recruitment process, ensuring the identification of the most qualified candidates.\n\n# Job Description:\n```\nAbout the job\nHey, wir sind clever-PV! \nWir sind der Meinung: Klimawandel geht uns alle an! Deshalb haben wir es uns zur Aufgabe gemacht, mit technischen Innovationen und kreativen Lösungen aktiv dagegen anzugehen. Wie eine Band, die durch ihre Musik die Herzen der Menschen erreicht, nutzen wir unsere Technologie, um eine positive Veränderung für unseren Planeten herbeizuführen. \nUnser neuestes Album? Eine App, die Sonnenenergie und smarte Geräte in einer Melodie vereint – unkompliziert, innovativ und mit einem Hauch von Zauberei. \n Was du bei uns rocken wirst: \nDu machst aus unserem .NET-Backend einen Datenjongleur, der mühelos mit ein paar Milliarden Datenpunkten pro Monat spielt - und das nur zum Warm-up. \nDu bist der Dirigent unseres IoT-Orchesters, spielst mit Azure Functions und lässt Autos, Wärmepumpen und andere elektrische Geräte im Takt der Sonnenenergie tanzen. \nMit Azure als deine Bühne machst du unsere Cloud-Plattform zum Rockstar der Energiebranche. \nMit CQRS und Event Sourcing zauberst du aus Datenströmen Harmonien, wodurch du Effizienz, Performance, Skalierbarkeit und Wartbarkeit unserer Systeme sicherstellst. \nDu dirigierst unsere CI/CD-Pipelines mit Azure DevOps und Bicep, um unsere Deployments so reibungslos wie ein gut abgestimmtes Solo zu gestalten. \n\nWas du mitbringen solltest: \nEine Leidenschaft für optimierten und sauberen C# Code \nEin Händchen für Cloud-Plattformen, am liebsten Azure, weil wir da unsere Show abziehen. \nErfahrung mit IoT und einer echten Menge an Daten? Cool, dann kannst du gleich loslegen. \nDu denkst in skalierbaren Systemen und liebst es, wenn deine Arbeit echten Impact hat. \nTeamgeist führt uns. Mit vereinten Kräften bringen wir Ideen zum Leben, die die Welt ein Stück besser machen \nDu bist so kommunikativ wie WhatsApp, Discord, und Telegram zusammen - egal, ob auf Deutsch oder Englisch. \n Was wir dir bieten: \nEine Chance, bei etwas Großem mitzuwirken: Dein Einsatz für eine grüne und nachhaltige Welt. \nEin Team, das sich unterstützt wie die Autokorrektur bei schnellen Texten: Wir fangen einander auf, verbessern uns gegenseitig und erreichen gemeinsam mehr. \nFreiheit, Kreativität und die Chance, mit deinen Ideen wirklich was zu bewegen. \nDein Büro, dein Reich: Arbeite, wo du dich am produktivsten fühlst, sei es unter Palmen oder umgeben von deinen eigenen vier Wänden. \nWir sorgen dafür, dass du alles hast, was du brauchst, um durchzustarten – von top-modernem Arbeitsmaterial bis zur neuesten Software. Alles, damit du nahtlos und effizient richtig durchstarten kannst. \nBonusse, die rocken: Bei uns zählt Teamwork mehr als Titel. Deshalb teilen wir unsere Erfolge – und unsere Boni – gerecht unter allen. Egal, ob du Code zauberst oder unsere Community begeisterst, wenn wir gewinnen, gewinnen wir alle zusammen. \nExtraurlaub bei GTA 6 Release \n Bereit für den Auftritt deines Lebens? Wir freuen uns darauf, dein Intro zu hören und dich beim Soundcheck willkommen zu heißen! \n```\n\n---\n\n# Job Description Summary" + }, + "replies": "# Analysis of Key Skills and Requirements for the Position\n\n## Technical Skills\n1. **C# Programming**: Strong proficiency in writing optimized and clean C# code.\n2. **Cloud Platforms**: Expertise in Microsoft Azure for deploying and managing applications.\n3. **IoT Experience**: Familiarity with Internet of Things (IoT) devices and handling a large volume of data.\n4. **Data Management**: Skills in managing billions of data points and transforming data streams using patterns like CQRS (Command Query Responsibility Segregation) and Event Sourcing.\n5. **CI/CD Pipelines**: Experience with Azure DevOps and Bicep for creating and managing continuous integration and continuous deployment workflows.\n6. **Scalability and Performance**: Ability to design scalable systems and ensure performance and maintainability of applications.\n\n## Soft Skills\n1. **Team Collaboration**: Strong team spirit and the ability to work collaboratively towards common goals.\n2. **Communication**: Excellent communication skills, both in German and English, capable of conveying technical information effectively.\n3. **Problem-Solving**: Creative thinking and a solution-focused mindset to address challenges in development and deployment.\n4. **Adaptability**: Flexibility to work in a dynamic environment and adapt to changing project requirements.\n\n## Educational Qualifications and Certifications\n1. **Degree in Computer Science or Related Field**: A bachelor's or master's degree in computer science, software engineering, or a related discipline.\n2. **Certifications**: Relevant certifications in Azure (e.g., Microsoft Certified: Azure Developer Associate) and software development methodologies (e.g., Scrum, Agile).\n\n## Professional Experience\n1. **Experience in Software Development**: A minimum of 3-5 years of professional experience in software development, particularly with C# and cloud technologies.\n2. **IoT Project Experience**: Direct experience with IoT projects and handling large datasets is preferred.\n3. **Cloud Deployment Experience**: Proven experience in deploying applications on Azure and managing cloud infrastructure.\n\n## Role Evolution\nThe role is expected to evolve significantly due to advancements in technology and an increasing focus on sustainable development. The following trends may influence the required competencies:\n1. **Increased Automation**: As automation in CI/CD and cloud management continues to grow, expertise in DevOps practices and tools will become increasingly critical.\n2. **Data-Driven Solutions**: With the rise of big data and analytics, skills in data science and machine learning may be integrated into the role to enhance data management capabilities.\n3. **Sustainability Focus**: A growing emphasis on green technologies will require a deeper understanding of sustainable practices in software development and energy consumption management.\n4. **Remote Collaboration Tools**: As remote work becomes more prevalent, proficiency in digital communication and project management tools will be essential for effective collaboration within teams.\n\nThis comprehensive overview will guide the recruitment process, ensuring the identification of the most qualified candidates who can contribute significantly to the mission of promoting sustainability and innovation in the energy sector.", + "total_tokens": 1618, + "input_tokens": 1012, + "output_tokens": 606, + "total_cost": 0.0005154000000000001 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:15", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\ne-mail-adresse\ne-mail-adresse\n\n## Options:\n['Option auswählen', 'federico.elia.majo@gmail.com']\n\n## " + }, + "replies": "federico.elia.majo@gmail.com", + "total_tokens": 658, + "input_tokens": 649, + "output_tokens": 9, + "total_cost": 0.00010274999999999999 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:19", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nlandesvorwahl\nlandesvorwahl\n\n## Options:\n['Option auswählen', 'Irland (+353)', 'Afghanistan (+93)', 'Aland-Inseln (+358)', 'Albanien (+355)', 'Algerien (+213)', 'Amerikanisch-Samoa (+1)', 'Andorra (+376)', 'Angola (+244)', 'Anguilla (+1)', 'Antarktis (+0)', 'Antigua und Barbuda (+1)', 'Argentinien (+54)', 'Armenien (+374)', 'Aruba (+297)', 'Aserbaidschan (+994)', 'Australien (+61)', 'Bahamas (+1)', 'Bahrain (+973)', 'Bangladesch (+880)', 'Barbados (+1)', 'Belgien (+32)', 'Belize (+501)', 'Benin (+229)', 'Bermuda (+1)', 'Bhutan (+975)', 'Bolivien (+591)', 'Bosnien und Herzegowina (+387)', 'Botswana (+267)', 'Bouvetinsel (+0)', 'Brasilien (+55)', 'Britisches Territorium im Ind. Ozean (+246)', 'Brunei Darussalam (+673)', 'Bulgarien (+359)', 'Burkina Faso (+226)', 'Burundi (+257)', 'Chile (+56)', 'China (+86)', 'Cook-Inseln (+682)', 'Costa Rica (+506)', 'Demokratische Republik Kongo (+243)', 'Deutschland (+49)', 'Dominica (+1)', 'Dominikanische Republik (+1)', 'Dschibuti (+253)', 'Dänemark (+45)', 'Ecuador (+593)', 'El Salvador (+503)', 'Elfenbeinküste (+225)', 'Eritrea (+291)', 'Estland (+372)', 'Falklandinseln (Malwinen) (+500)', 'Fidschi (+679)', 'Finnland (+358)', 'Frankreich (+33)', 'Französisch-Guyana (+594)', 'Französisch-Polynesien (+689)', 'Französische Südliche Territorien (+0)', 'Färöer (+298)', 'Föderierte Staaten von Mikronesien (+691)', 'Gabun (+241)', 'Gambia (+220)', 'Georgien (+995)', 'Ghana (+233)', 'Gibraltar (+350)', 'Grenada (+1)', 'Griechenland (+30)', 'Großbritannien (+44)', 'Grönland (+299)', 'Guadeloupe (+590)', 'Guam (+1)', 'Guatemala (+502)', 'Guernsey (+44)', 'Guinea (+224)', 'Guinea-Bissau (+245)', 'Guyana (+592)', 'Haiti (+509)', 'Heard- und McDonaldinseln (+0)', 'Honduras (+504)', 'Hongkong (+852)', 'Indien (+91)', 'Indonesien (+62)', 'Irak (+964)', 'Iran (+98)', 'Island (+354)', 'Isle of Man (+44)', 'Israel (+972)', 'Italien (+39)', 'Jamaika (+1)', 'Japan (+81)', 'Jemen (+967)', 'Jersey (+44)', 'Jordanien (+962)', 'Jungferninseln (amerikanisch) (+1)', 'Jungferninseln (britisch) (+1)', 'Kaimaninseln (+1)', 'Kambodscha (+855)', 'Kamerun (+237)', 'Kanada (+1)', 'Kap Verde (+238)', 'Karibik-Nationen (+0)', 'Kasachstan (+7)', 'Katar (+974)', 'Kenia (+254)', 'Kirgisistan (+996)', 'Kiribati (+686)', 'Kokosinseln (Keeling) (+61)', 'Kolumbien (+57)', 'Komoren (+269)', 'Kongo (+242)', 'Korea (+82)', 'Korea (Nord) (+850)', 'Kosovo (+383)', 'Kroatien (+385)', 'Kuba (+53)', 'Kuwait (+965)', 'Laos (+856)', 'Lesotho (+266)', 'Lettland (+371)', 'Libanon (+961)', 'Liberia (+231)', 'Libyen (+218)', 'Liechtenstein (+423)', 'Litauen (+370)', 'Luxemburg (+352)', 'Macao (+853)', 'Madagaskar (+261)', 'Malawi (+265)', 'Malaysia (+60)', 'Malediven (+960)', 'Mali (+223)', 'Malta (+356)', 'Marokko (+212)', 'Marshallinseln (+692)', 'Martinique (+596)', 'Mauretanien (+222)', 'Mauritius (+230)', 'Mayotte (+262)', 'Mazedonien (+389)', 'Mexiko (+52)', 'Moldawien (+373)', 'Monaco (+377)', 'Mongolei (+976)', 'Montenegro (+382)', 'Montserrat (+1)', 'Mosambik (+258)', 'Myanmar (+95)', 'Namibia (+264)', 'Nauru (+674)', 'Nepal (+977)', 'Neukaledonien (+687)', 'Neuseeland (+64)', 'Nicaragua (+505)', 'Niederlande (+31)', 'Niederländische Antillen (+0)', 'Niger (+227)', 'Nigeria (+234)', 'Niue (+683)', 'Norfolkinsel (+672)', 'Norwegen (+47)', 'Nördliche Marianen (+1)', 'Oman (+968)', 'Pakistan (+92)', 'Palau (+680)', 'Palästinensische Autonomiegebiete (+970)', 'Panama (+507)', 'Papua-Neuguinea (+675)', 'Paraguay (+595)', 'Peru (+51)', 'Philippinen (+63)', 'Pitcairn (+0)', 'Polen (+48)', 'Portugal (+351)', 'Puerto Rico (+1)', 'Ruanda (+250)', 'Rumänien (+40)', 'Russische Föderation (+7)', 'Réunion (+262)', 'S. Georgia und S. Sandwichinseln (+0)', 'Saint Kitts und Nevis (+1)', 'Saint-Pierre und Miquelon (+508)', 'Salomonen (+677)', 'Sambia (+260)', 'Samoa (+685)', 'San Marino (+378)', 'Saudi-Arabien (+966)', 'Schweden (+46)', 'Schweiz (+41)', 'Senegal (+221)', 'Serbien (+381)', 'Serbien und Montenegro (+0)', 'Seychellen (+248)', 'Sierra Leone (+232)', 'Simbabwe (+263)', 'Singapur (+65)', 'Slowakische Republik (+421)', 'Slowenien (+386)', 'Somalia (+252)', 'Spanien (+34)', 'Sri Lanka (+94)', 'St. Helena (+290)', 'St. Lucia (+1)', 'St. Vincent und die Grenadinen (+1)', 'Sudan (+249)', 'Suriname (+597)', 'Svalbard und Jan Mayen (+47)', 'Swasiland (+268)', 'Syrien (+963)', 'São Tomé und Príncipe (+239)', 'Südafrika (+27)', 'Südsudan (+211)', 'Tadschikistan (+992)', 'Taiwan (+886)', 'Tansania (+255)', 'Thailand (+66)', 'Timor-Leste (+670)', 'Togo (+228)', 'Tokelau (+690)', 'Tonga (+676)', 'Trinidad und Tobago (+1)', 'Tschad (+235)', 'Tschechische Republik (+420)', 'Tunesien (+216)', 'Turkmenistan (+993)', 'Turks- und Caicosinseln (+1)', 'Tuvalu (+688)', 'Türkei (+90)', 'Uganda (+256)', 'Ukraine (+380)', 'Ungarn (+36)', 'Uruguay (+598)', 'Usbekistan (+998)', 'Vanuatu (+678)', 'Vatikanstadt (+39)', 'Venezuela (+58)', 'Vereinigte Arabische Emirate (+971)', 'Vereinigte Staaten (+1)', 'Vietnam (+84)', 'Wallis und Futuna (+681)', 'Weihnachtsinsel (+61)', 'Weißrussland (+375)', 'Westsahara (+212)', 'Zentralafrikanische Republik (+236)', 'Zypern (+357)', 'Ägypten (+20)', 'Äquatorialguinea (+240)', 'Äthiopien (+251)', 'Österreich (+43)']\n\n## " + }, + "replies": "Irland (+353)", + "total_tokens": 2420, + "input_tokens": 2415, + "output_tokens": 5, + "total_cost": 0.00036525 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:19", + "prompts": { + "prompt_1": "For the following question: 'handynummer', which section of the resume is relevant? Respond with one of the following: Personal information, Self-Identification, Legal Authorization, Work Preferences, Education Details, Experience Details, Projects, Availability, Salary Expectations, Certifications, Languages, Interests." + }, + "replies": "Personal information", + "total_tokens": 66, + "input_tokens": 64, + "output_tokens": 2, + "total_cost": 1.08e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:20", + "prompts": { + "prompt_1": "\nAnswer the following question based on the provided personal information.\n\n## Rules\n- Answer questions directly.\n\n## Example\nMy resume: John Doe, born on 01/01/1990, living in Milan, Italy.\nQuestion: What is your city?\n Milan\n\nPersonal Information: PersonalInformation(name='Federico', surname='Elia', dateOfBirth='10/04/2001', country='Ireland', city='Dublin', address='Dublin 3, Ireland', phone='892338335', phonePrefix='+353', email='federico.elia.majo@gmail.com', github='https://github.com/feder-cr', linkedin='https://www.linkedin.com/in/federico-elia-5199951b6/')\nQuestion: handynummer\n" + }, + "replies": "892338335", + "total_tokens": 167, + "input_tokens": 164, + "output_tokens": 3, + "total_cost": 2.6399999999999998e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:34", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nwie viele jahre erfahrung haben sie mit: c#?\n\n## " + }, + "replies": "Ich habe keine Erfahrung damit, aber ich lerne schnell, sehr schnell.", + "total_tokens": 705, + "input_tokens": 690, + "output_tokens": 15, + "total_cost": 0.0001125 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:35", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nwie viele jahre erfahrung haben sie mit: azure functions?\n\n## " + }, + "replies": "Noch nicht, aber ich werde es lernen.", + "total_tokens": 699, + "input_tokens": 690, + "output_tokens": 9, + "total_cost": 0.00010889999999999999 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:36", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nkönnen sie sich vorstellen, remote zu arbeiten?\nkönnen sie sich vorstellen, remote zu arbeiten?\nrequired\nja\nnein\n\n## Options:\n['ja', 'nein']\n\n## " + }, + "replies": "ja", + "total_tokens": 661, + "input_tokens": 660, + "output_tokens": 1, + "total_cost": 9.96e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:36", + "prompts": { + "prompt_1": "For the following question: 'ja', which section of the resume is relevant? Respond with one of the following: Personal information, Self-Identification, Legal Authorization, Work Preferences, Education Details, Experience Details, Projects, Availability, Salary Expectations, Certifications, Languages, Interests." + }, + "replies": "Self-Identification", + "total_tokens": 65, + "input_tokens": 62, + "output_tokens": 3, + "total_cost": 1.1099999999999999e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:37", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nfährst du elektrisch oder hast du eine pv-anlage?\nfährst du elektrisch oder hast du eine pv-anlage?\n\n## Options:\n['Option auswählen', 'Yes', 'No']\n\n## " + }, + "replies": "No", + "total_tokens": 661, + "input_tokens": 660, + "output_tokens": 1, + "total_cost": 9.96e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:19:38", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nsprichst du fließend deutsch?\nsprichst du fließend deutsch?\n\n## Options:\n['Option auswählen', 'Yes', 'No']\n\n## " + }, + "replies": "No", + "total_tokens": 653, + "input_tokens": 652, + "output_tokens": 1, + "total_cost": 9.839999999999999e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:18", + "prompts": { + "prompt_1": "\nAs a seasoned HR expert, your task is to identify and outline the key skills and requirements necessary for the position of this job. Use the provided job description as input to extract all relevant information. This will involve conducting a thorough analysis of the job's responsibilities and the industry standards. You should consider both the technical and soft skills needed to excel in this role. Additionally, specify any educational qualifications, certifications, or experiences that are essential. Your analysis should also reflect on the evolving nature of this role, considering future trends and how they might affect the required competencies.\n\nRules:\nRemove boilerplate text\nInclude only relevant information to match the job description against the resume\n\n# Analysis Requirements\nYour analysis should include the following sections:\nTechnical Skills: List all the specific technical skills required for the role based on the responsibilities described in the job description.\nSoft Skills: Identify the necessary soft skills, such as communication abilities, problem-solving, time management, etc.\nEducational Qualifications and Certifications: Specify the essential educational qualifications and certifications for the role.\nProfessional Experience: Describe the relevant work experiences that are required or preferred.\nRole Evolution: Analyze how the role might evolve in the future, considering industry trends and how these might influence the required skills.\n\n# Final Result:\nYour analysis should be structured in a clear and organized document with distinct sections for each of the points listed above. Each section should contain:\nThis comprehensive overview will serve as a guideline for the recruitment process, ensuring the identification of the most qualified candidates.\n\n# Job Description:\n```\nAbout the job\nSenior Site Reliability Engineer (SRE)\nVictoriaMetrics Cloud\n\nAbout the opportunity\nVictoriaMetrics Cloud is a hosted monitoring platform that provides a managed service for metrics that scales to billions of time series while keeping costs predictable. We serve organizations of all sizes with this service, which is growing in popularity. We’re now looking for a Senior Site Reliability Engineer to join our team and help us achieve more scaling milestones.\n\nRole Overview:\nAs our Site Reliability Engineer, you'll be key in scaling our infrastructure and enhancing system reliability. Your work on VictoriaMetrics Cloud will be vital in particular for optimizing reliability and scaling the platform for our customers’ monitoring solutions. You’ll be contributing to product development and design decisions, which offers a unique opportunity to influence a platform designed for SREs such as yourself.\n\nKey Qualifications:\n5+ years of engineering experience.\nProven SRE or DevOps expertise.\nStrong experience with Kubernetes and Kubernetes operators.\nAbility to understand, write and review code in Go.\nSolid experience with AWS cloud infrastructure. GCP/Azure would be a plus.\nSkilled in observability practices.\nContributions to open-source projects are a significant plus.\nInitiative at the level of independent project/task management.\n\nThe position expects on-call shifts during working hours. Preferable time zone for this role is GMT+0 - GMT+4\n\nTechnology Stack:\nAWS, Kubernetes, Go, Terraform, Postgres (RDS), VictoriaMetrics and Prometheus ecosystem, Grafana, Karpenter, ArgoCD, GitHub, React.\n\nTogether we will:\nWork on key infrastructure scalability and system reliability projects \nSupport your professional and personal growth: You will be working directly with founders\nSupport and encourage your individual initiatives\n\nWe run a remote work model, and flexible working hours.\n\nThis is a contract-based position.\n\nAbout VictoriaMetrics:\nWe are the company behind the popular open-source, high-performance time-series database and monitoring solution: VictoriaMetrics. We’ve also recently introduced a new open-source logs management solution, VictoriaLogs. Fortune 500 companies use our products as their core monitoring solution. Our services are used by Hubspot, Adidas, WIX, Grammarly, CERN and thousands others. Our open-source products have been downloaded 500M+ times to date.\n\nWe are profitable with a fully remote team distributed worldwide.\n\nInterview Process:\nIntroductory Video Call (30 mins): Meet one of our founders to discuss your experience and fit.\nTechnical Interview (1 hour): Dive deep into your technical skills with our team.\nSecond Technical Interview (Optional, 1 hour): An additional session to explore further areas, if necessary.\nOffer: Embark on your journey with VictoriaMetrics.\n\nContact for details: info@victoriametrics.com\n```\n\n---\n\n# Job Description Summary" + }, + "replies": "# Senior Site Reliability Engineer (SRE) Analysis\n\n## Technical Skills:\n- **Kubernetes**: Strong experience managing Kubernetes clusters and operators.\n- **Programming**: Proficiency in Go (ability to understand, write, and review code).\n- **Cloud Infrastructure**: Solid experience with AWS; familiarity with GCP or Azure is a plus.\n- **Observability**: Expertise in observability practices and tools.\n- **Infrastructure as Code**: Experience with Terraform.\n- **Database Management**: Knowledge of Postgres (RDS).\n- **Monitoring Tools**: Familiarity with the VictoriaMetrics and Prometheus ecosystem.\n- **Graphical Tools**: Experience with Grafana.\n- **CI/CD Tools**: Familiarity with ArgoCD and GitHub.\n- **Scalability**: Understanding of scaling techniques and practices.\n\n## Soft Skills:\n- **Problem-Solving**: Ability to tackle complex technical challenges.\n- **Communication**: Strong verbal and written communication skills for collaboration and documentation.\n- **Leadership**: Initiative to manage independent projects and tasks.\n- **Team Collaboration**: Ability to work effectively in a remote team environment.\n- **Adaptability**: Willingness to adapt to evolving technologies and practices.\n\n## Educational Qualifications and Certifications:\n- **Degree**: Bachelor's degree in Computer Science, Engineering, or a related field (preferred but not explicitly stated).\n- **Certifications**: Relevant certifications in cloud technologies (e.g., AWS Certified Solutions Architect) may enhance candidacy but are not specified.\n\n## Professional Experience:\n- **Years of Experience**: Minimum of 5 years in engineering roles, preferably in SRE or DevOps environments.\n- **Project Contributions**: Experience contributing to open-source projects is a significant plus.\n- **On-call Experience**: Willingness to participate in on-call shifts during working hours.\n\n## Role Evolution:\n- **Cloud Expansion**: As cloud technologies continue to evolve, expertise in multi-cloud environments (AWS, GCP, Azure) will become increasingly necessary.\n- **Automation**: A growing trend towards automation in infrastructure management will necessitate advanced skills in Infrastructure as Code and CI/CD practices.\n- **Observability and Monitoring**: With the rise of cloud-native applications, proficiency in observability tools and practices will be essential for maintaining reliability.\n- **Remote Work**: The shift to remote work may require improved communication and team collaboration tools and techniques, emphasizing the importance of soft skills in a distributed team environment.\n\nThis analysis outlines the key skills and requirements for the Senior Site Reliability Engineer position at VictoriaMetrics, serving as a guideline for the recruitment process and ensuring the identification of the most qualified candidates.", + "total_tokens": 1405, + "input_tokens": 867, + "output_tokens": 538, + "total_cost": 0.00045285 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:19", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nemail address\nemail address\n\n## Options:\n['Select an option', 'federico.elia.majo@gmail.com']\n\n## " + }, + "replies": "federico.elia.majo@gmail.com", + "total_tokens": 655, + "input_tokens": 646, + "output_tokens": 9, + "total_cost": 0.00010229999999999999 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:22", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nphone country code\nphone country code\n\n## Options:\n['Select an option', 'Ireland (+353)', 'Afghanistan (+93)', 'Aland Islands (+358)', 'Albania (+355)', 'Algeria (+213)', 'American Samoa (+1)', 'Andorra (+376)', 'Angola (+244)', 'Anguilla (+1)', 'Antarctica (+0)', 'Antigua and Barbuda (+1)', 'Argentina (+54)', 'Armenia (+374)', 'Aruba (+297)', 'Australia (+61)', 'Austria (+43)', 'Azerbaijan (+994)', 'Bahamas (+1)', 'Bahrain (+973)', 'Bangladesh (+880)', 'Barbados (+1)', 'Belarus (+375)', 'Belgium (+32)', 'Belize (+501)', 'Benin (+229)', 'Bermuda (+1)', 'Bhutan (+975)', 'Bolivia (+591)', 'Bosnia and Herzegovina (+387)', 'Botswana (+267)', 'Bouvet Island (+0)', 'Brazil (+55)', 'British Indian Ocean Territory (+246)', 'Brunei Darussalam (+673)', 'Bulgaria (+359)', 'Burkina Faso (+226)', 'Burundi (+257)', 'Cambodia (+855)', 'Cameroon (+237)', 'Canada (+1)', 'Cape Verde (+238)', 'Caribbean Nations (+0)', 'Cayman Islands (+1)', 'Central African Republic (+236)', 'Chad (+235)', 'Chile (+56)', 'China (+86)', 'Christmas Island (+61)', 'Cocos (Keeling) Islands (+61)', 'Colombia (+57)', 'Comoros (+269)', 'Congo (+242)', 'Cook Islands (+682)', 'Costa Rica (+506)', 'Cote D’Ivoire (Ivory Coast) (+225)', 'Croatia (+385)', 'Cuba (+53)', 'Cyprus (+357)', 'Czech Republic (+420)', 'Democratic Republic of the Congo (+243)', 'Denmark (+45)', 'Djibouti (+253)', 'Dominica (+1)', 'Dominican Republic (+1)', 'Ecuador (+593)', 'Egypt (+20)', 'El Salvador (+503)', 'Equatorial Guinea (+240)', 'Eritrea (+291)', 'Estonia (+372)', 'Ethiopia (+251)', 'Falkland Islands (Malvinas) (+500)', 'Faroe Islands (+298)', 'Federated States of Micronesia (+691)', 'Fiji (+679)', 'Finland (+358)', 'France (+33)', 'French Guiana (+594)', 'French Polynesia (+689)', 'French Southern Territories (+0)', 'Gabon (+241)', 'Gambia (+220)', 'Georgia (+995)', 'Germany (+49)', 'Ghana (+233)', 'Gibraltar (+350)', 'Greece (+30)', 'Greenland (+299)', 'Grenada (+1)', 'Guadeloupe (+590)', 'Guam (+1)', 'Guatemala (+502)', 'Guernsey (+44)', 'Guinea (+224)', 'Guinea-Bissau (+245)', 'Guyana (+592)', 'Haiti (+509)', 'Heard Island and McDonald Islands (+0)', 'Honduras (+504)', 'Hong Kong (+852)', 'Hungary (+36)', 'Iceland (+354)', 'India (+91)', 'Indonesia (+62)', 'Iran (+98)', 'Iraq (+964)', 'Isle of Man (+44)', 'Israel (+972)', 'Italy (+39)', 'Jamaica (+1)', 'Japan (+81)', 'Jersey (+44)', 'Jordan (+962)', 'Kazakhstan (+7)', 'Kenya (+254)', 'Kiribati (+686)', 'Korea (+82)', 'Korea (North) (+850)', 'Kosovo (+383)', 'Kuwait (+965)', 'Kyrgyzstan (+996)', 'Laos (+856)', 'Latvia (+371)', 'Lebanon (+961)', 'Lesotho (+266)', 'Liberia (+231)', 'Libya (+218)', 'Liechtenstein (+423)', 'Lithuania (+370)', 'Luxembourg (+352)', 'Macao (+853)', 'Macedonia (+389)', 'Madagascar (+261)', 'Malawi (+265)', 'Malaysia (+60)', 'Maldives (+960)', 'Mali (+223)', 'Malta (+356)', 'Marshall Islands (+692)', 'Martinique (+596)', 'Mauritania (+222)', 'Mauritius (+230)', 'Mayotte (+262)', 'Mexico (+52)', 'Moldova (+373)', 'Monaco (+377)', 'Mongolia (+976)', 'Montenegro (+382)', 'Montserrat (+1)', 'Morocco (+212)', 'Mozambique (+258)', 'Myanmar (+95)', 'Namibia (+264)', 'Nauru (+674)', 'Nepal (+977)', 'Netherlands (+31)', 'Netherlands Antilles (+0)', 'New Caledonia (+687)', 'New Zealand (+64)', 'Nicaragua (+505)', 'Niger (+227)', 'Nigeria (+234)', 'Niue (+683)', 'Norfolk Island (+672)', 'Northern Mariana Islands (+1)', 'Norway (+47)', 'Pakistan (+92)', 'Palau (+680)', 'Palestinian Territory (+970)', 'Panama (+507)', 'Papua New Guinea (+675)', 'Paraguay (+595)', 'Peru (+51)', 'Philippines (+63)', 'Pitcairn (+0)', 'Poland (+48)', 'Portugal (+351)', 'Puerto Rico (+1)', 'Qatar (+974)', 'Reunion (+262)', 'Romania (+40)', 'Russian Federation (+7)', 'Rwanda (+250)', 'S. Georgia and S. Sandwich Islands (+0)', 'Saint Helena (+290)', 'Saint Kitts and Nevis (+1)', 'Saint Lucia (+1)', 'Saint Pierre and Miquelon (+508)', 'Saint Vincent and the Grenadines (+1)', 'Samoa (+685)', 'San Marino (+378)', 'Sao Tome and Principe (+239)', 'Saudi Arabia (+966)', 'Senegal (+221)', 'Serbia (+381)', 'Serbia and Montenegro (+0)', 'Seychelles (+248)', 'Sierra Leone (+232)', 'Singapore (+65)', 'Slovak Republic (+421)', 'Slovenia (+386)', 'Solomon Islands (+677)', 'Somalia (+252)', 'South Africa (+27)', 'South Sudan (+211)', 'Spain (+34)', 'Sri Lanka (+94)', 'Sudan (+249)', 'Sultanate of Oman (+968)', 'Suriname (+597)', 'Svalbard and Jan Mayen (+47)', 'Swaziland (+268)', 'Sweden (+46)', 'Switzerland (+41)', 'Syria (+963)', 'Taiwan (+886)', 'Tajikistan (+992)', 'Tanzania (+255)', 'Thailand (+66)', 'Timor-Leste (+670)', 'Togo (+228)', 'Tokelau (+690)', 'Tonga (+676)', 'Trinidad and Tobago (+1)', 'Tunisia (+216)', 'Turkey (+90)', 'Turkmenistan (+993)', 'Turks and Caicos Islands (+1)', 'Tuvalu (+688)', 'Uganda (+256)', 'Ukraine (+380)', 'United Arab Emirates (+971)', 'United Kingdom (+44)', 'United States (+1)', 'Uruguay (+598)', 'Uzbekistan (+998)', 'Vanuatu (+678)', 'Vatican City State (Holy See) (+39)', 'Venezuela (+58)', 'Vietnam (+84)', 'Virgin Islands (British) (+1)', 'Virgin Islands (U.S.) (+1)', 'Wallis and Futuna (+681)', 'Western Sahara (+212)', 'Yemen (+967)', 'Zambia (+260)', 'Zimbabwe (+263)']\n\n## " + }, + "replies": "Ireland (+353)", + "total_tokens": 2276, + "input_tokens": 2272, + "output_tokens": 4, + "total_cost": 0.0003432 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:22", + "prompts": { + "prompt_1": "For the following question: 'mobile phone number', which section of the resume is relevant? Respond with one of the following: Personal information, Self-Identification, Legal Authorization, Work Preferences, Education Details, Experience Details, Projects, Availability, Salary Expectations, Certifications, Languages, Interests." + }, + "replies": "Personal information", + "total_tokens": 66, + "input_tokens": 64, + "output_tokens": 2, + "total_cost": 1.08e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:22", + "prompts": { + "prompt_1": "\nAnswer the following question based on the provided personal information.\n\n## Rules\n- Answer questions directly.\n\n## Example\nMy resume: John Doe, born on 01/01/1990, living in Milan, Italy.\nQuestion: What is your city?\n Milan\n\nPersonal Information: PersonalInformation(name='Federico', surname='Elia', dateOfBirth='10/04/2001', country='Ireland', city='Dublin', address='Dublin 3, Ireland', phone='892338335', phonePrefix='+353', email='federico.elia.majo@gmail.com', github='https://github.com/feder-cr', linkedin='https://www.linkedin.com/in/federico-elia-5199951b6/')\nQuestion: mobile phone number\n" + }, + "replies": "892338335", + "total_tokens": 167, + "input_tokens": 164, + "output_tokens": 3, + "total_cost": 2.6399999999999998e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:33", + "prompts": { + "prompt_1": "\n**Prompt for HR Expert and Resume Writer:**\n\nAct as an HR expert and skilled resume writer specializing in creating ATS-compatible resumes. Your task is to identify and outline the key skills and requirements necessary for the position of this job, using the provided job description and resume. Use the job description as input to extract all relevant information and optimize the resume to highlight the relevant skills and experiences for the role.\n\n### Information to Collect and Analyze\n- **Resume:** \n Personal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n\n- **Job Description:** \n # Senior Site Reliability Engineer (SRE) Analysis\n\n## Technical Skills:\n- **Kubernetes**: Strong experience managing Kubernetes clusters and operators.\n- **Programming**: Proficiency in Go (ability to understand, write, and review code).\n- **Cloud Infrastructure**: Solid experience with AWS; familiarity with GCP or Azure is a plus.\n- **Observability**: Expertise in observability practices and tools.\n- **Infrastructure as Code**: Experience with Terraform.\n- **Database Management**: Knowledge of Postgres (RDS).\n- **Monitoring Tools**: Familiarity with the VictoriaMetrics and Prometheus ecosystem.\n- **Graphical Tools**: Experience with Grafana.\n- **CI/CD Tools**: Familiarity with ArgoCD and GitHub.\n- **Scalability**: Understanding of scaling techniques and practices.\n\n## Soft Skills:\n- **Problem-Solving**: Ability to tackle complex technical challenges.\n- **Communication**: Strong verbal and written communication skills for collaboration and documentation.\n- **Leadership**: Initiative to manage independent projects and tasks.\n- **Team Collaboration**: Ability to work effectively in a remote team environment.\n- **Adaptability**: Willingness to adapt to evolving technologies and practices.\n\n## Educational Qualifications and Certifications:\n- **Degree**: Bachelor's degree in Computer Science, Engineering, or a related field (preferred but not explicitly stated).\n- **Certifications**: Relevant certifications in cloud technologies (e.g., AWS Certified Solutions Architect) may enhance candidacy but are not specified.\n\n## Professional Experience:\n- **Years of Experience**: Minimum of 5 years in engineering roles, preferably in SRE or DevOps environments.\n- **Project Contributions**: Experience contributing to open-source projects is a significant plus.\n- **On-call Experience**: Willingness to participate in on-call shifts during working hours.\n\n## Role Evolution:\n- **Cloud Expansion**: As cloud technologies continue to evolve, expertise in multi-cloud environments (AWS, GCP, Azure) will become increasingly necessary.\n- **Automation**: A growing trend towards automation in infrastructure management will necessitate advanced skills in Infrastructure as Code and CI/CD practices.\n- **Observability and Monitoring**: With the rise of cloud-native applications, proficiency in observability tools and practices will be essential for maintaining reliability.\n- **Remote Work**: The shift to remote work may require improved communication and team collaboration tools and techniques, emphasizing the importance of soft skills in a distributed team environment.\n\nThis analysis outlines the key skills and requirements for the Senior Site Reliability Engineer position at VictoriaMetrics, serving as a guideline for the recruitment process and ensuring the identification of the most qualified candidates.\n\n### Analysis and Planning\n\n1. **Analyze the Job Description**: \n - Identify the required technical and soft skills.\n - List the essential educational qualifications and certifications.\n - Describe the relevant work experiences.\n - Reflect on the role's evolution, considering future trends.\n\n2. **Analyze the Current Resume**:\n - Identify the existing skills and experiences in the resume.\n\n3. **Optimize the Resume**:\n - Plan the resume to highlight experiences and skills relevant to the job requirements.\n - Ensure it includes pertinent keywords, a clear structure, and is tailored to emphasize the candidate's strengths and achievements.\n - Avoid including information not requested by the job description.\n\n### Creating a \"Smart\" Resume\n\n- **ATS Compatibility**: Ensure the resume is optimized for applicant tracking systems (ATS) by including relevant keywords.\n- **Adaptation to the Job Description**: Strategically tailor the resume to reflect the skills and experiences required by the job description.\n- **Highlighting Strengths**: Customize the resume to showcase the most relevant skills, experiences, and achievements for the role.\n- **Clear Structure**: Use a clear and readable structure.\n- **Showcasing Experiences and Achievements**: Provide guidance on effectively presenting experience, skills, and achievements in a compelling and professional manner.\n- **Formatting and Design**: Offer advice on formatting and design to maintain readability and professionalism, ensuring the resume stands out in a competitive job market.\n\n### Final Result\n\nYour analysis and the optimized resume should be structured in a clear and organized document, with distinct sections for each point listed above. Each section should contain:\n\n\nThe results should be provided in **Markdown** format, Provide only the markdown code for the resume, without any explanations or additional text and also without ```md ```\n" + }, + "replies": "# Federico Elia \nDublin 3, Ireland \n+353 892338335 \nfederico.elia.majo@gmail.com \n[GitHub](https://github.com/feder-cr) | [LinkedIn](https://www.linkedin.com/in/federico-elia-5199951b6/) \n\n---\n\n## Objective \nDetail-oriented and adaptable Software Engineer with a strong background in cloud infrastructure and problem-solving. Seeking to leverage technical expertise in a Senior Site Reliability Engineer role to enhance system reliability and performance.\n\n---\n\n## Education \n**Bachelor in Computer Science** \nUniversity of Genoa, Italy \nGraduation Year: 2023 \nGPA: 3.6/4 \n\n*Skills Acquired*: Blockchain, IoT, Python\n\n---\n\n## Technical Skills \n- **Cloud Infrastructure**: AWS (solid experience), familiarity with GCP and Azure \n- **Container Management**: Kubernetes (experience managing clusters and operators) \n- **Programming**: Proficient in Python, experience with PHP and basic understanding of Go \n- **Infrastructure as Code**: Terraform \n- **Database Management**: Knowledge of Postgres (RDS) \n- **Monitoring Tools**: Familiarity with Prometheus and Grafana \n- **CI/CD Tools**: GitHub \n- **Observability**: Expertise in observability practices \n\n---\n\n## Professional Experience \n**Software Engineer** \nGAlliera Hospital, Genoa, Italy \n03/2023 - 09/2023 \n- Developed and maintained applications using PHP and Python, enhancing operational efficiency. \n- Collaborated with cross-functional teams to solve complex technical problems, demonstrating strong problem-solving and communication skills. \n- Led a team project focused on improving system observability and reliability, aligning with SRE principles. \n- Utilized critical thinking and adaptability to troubleshoot and optimize application performance.\n\n---\n\n## Projects \n- **[Project Title]** \n Description: [Brief description of significant project] \n Repository: [Link to GitHub repo if available] \n\n- **[Project Title]** \n Description: [Brief description of significant project] \n Repository: [Link to GitHub repo if available] \n\n---\n\n## Certifications \n- C1 English Certification \n\n---\n\n## Languages \n- Italian (Native) \n- English (Professional) \n\n---\n\n## Interests \n- Boxing, MMA \n\n---\n\n## Availability \nCan start immediately \n\n---\n\n## Salary Expectations \n€50,000 \n\n--- \n\n## References \nAvailable upon request.", + "total_tokens": 1974, + "input_tokens": 1469, + "output_tokens": 505, + "total_cost": 0.00052335 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:45", + "prompts": { + "prompt_1": "\nTransform the provided Markdown output into HTML format. Ensure that the HTML document uses a simple, clear style that maintains ATS compatibility and is easy for recruiters to read.\n\n### HTML Styling and Design Guidelines\n\n1. **Font and Color Scheme**:\n - Use a standard sans-serif font such as \"Arial\" or \"Verdana.\"\n - Ensure dark text on a light background for optimal readability.\n\n2. **Headings and Titles**:\n - **Main Titles**:\n - Font: Arial, sans-serif\n - Font Size: 16 px\n - Color: Black\n - Alignment: Left-aligned\n - Spacing: 20 px above and below the title\n - Formatting: Bold\n\n - **Subtitles**:\n - Font: Arial, sans-serif\n - Font Size: 14 px\n - Color: Black\n - Alignment: Left-aligned\n - Spacing: 10 px above and below the subtitle\n - Formatting: Bold\n\n3. **Spacing and Margins**:\n - General Margins: 1 inch (2.54 cm) on all sides\n - Spacing between Titles and Content:\n - After Main Titles: 20 px of spacing\n - After Subtitles: 10 px of spacing\n - Text Alignment: Left-aligned\n\n4. **Color Matching**:\n - Use a consistent color scheme for headings and body text.\n - Avoid bright colors and multiple shades to ensure clarity.\n\n### Output Requirements\n\n- **Convert Markdown to HTML**: Use the provided content and apply the specified styles.\n- **Apply Styling**: Follow the guidelines for font, size, color, and spacing.\n- **Ensure ATS Compatibility**: Maintain clear formatting to ensure the document is easily parsed by ATS systems.\n\nProvide only the HTML code for the resume, without any explanations or additional text and also without ```HTML ```, Ensure the final HTML document is simple, professional, and optimized for ATS.\n\nResume in Markdown format:\n# Federico Elia \nDublin 3, Ireland \n+353 892338335 \nfederico.elia.majo@gmail.com \n[GitHub](https://github.com/feder-cr) | [LinkedIn](https://www.linkedin.com/in/federico-elia-5199951b6/) \n\n---\n\n## Objective \nDetail-oriented and adaptable Software Engineer with a strong background in cloud infrastructure and problem-solving. Seeking to leverage technical expertise in a Senior Site Reliability Engineer role to enhance system reliability and performance.\n\n---\n\n## Education \n**Bachelor in Computer Science** \nUniversity of Genoa, Italy \nGraduation Year: 2023 \nGPA: 3.6/4 \n\n*Skills Acquired*: Blockchain, IoT, Python\n\n---\n\n## Technical Skills \n- **Cloud Infrastructure**: AWS (solid experience), familiarity with GCP and Azure \n- **Container Management**: Kubernetes (experience managing clusters and operators) \n- **Programming**: Proficient in Python, experience with PHP and basic understanding of Go \n- **Infrastructure as Code**: Terraform \n- **Database Management**: Knowledge of Postgres (RDS) \n- **Monitoring Tools**: Familiarity with Prometheus and Grafana \n- **CI/CD Tools**: GitHub \n- **Observability**: Expertise in observability practices \n\n---\n\n## Professional Experience \n**Software Engineer** \nGAlliera Hospital, Genoa, Italy \n03/2023 - 09/2023 \n- Developed and maintained applications using PHP and Python, enhancing operational efficiency. \n- Collaborated with cross-functional teams to solve complex technical problems, demonstrating strong problem-solving and communication skills. \n- Led a team project focused on improving system observability and reliability, aligning with SRE principles. \n- Utilized critical thinking and adaptability to troubleshoot and optimize application performance.\n\n---\n\n## Projects \n- **[Project Title]** \n Description: [Brief description of significant project] \n Repository: [Link to GitHub repo if available] \n\n- **[Project Title]** \n Description: [Brief description of significant project] \n Repository: [Link to GitHub repo if available] \n\n---\n\n## Certifications \n- C1 English Certification \n\n---\n\n## Languages \n- Italian (Native) \n- English (Professional) \n\n---\n\n## Interests \n- Boxing, MMA \n\n---\n\n## Availability \nCan start immediately \n\n---\n\n## Salary Expectations \n€50,000 \n\n--- \n\n## References \nAvailable upon request.\n" + }, + "replies": "\n\n\n \n \n Federico Elia's Resume\n \n\n\n

Federico Elia

\n

Dublin 3, Ireland

\n

+353 892338335

\n

federico.elia.majo@gmail.com

\n

GitHub | LinkedIn

\n\n

Objective

\n

Detail-oriented and adaptable Software Engineer with a strong background in cloud infrastructure and problem-solving. Seeking to leverage technical expertise in a Senior Site Reliability Engineer role to enhance system reliability and performance.

\n\n

Education

\n

Bachelor in Computer Science
University of Genoa, Italy
Graduation Year: 2023
GPA: 3.6/4

\n

Skills Acquired: Blockchain, IoT, Python

\n\n

Technical Skills

\n \n\n

Professional Experience

\n

Software Engineer
GAlliera Hospital, Genoa, Italy
03/2023 - 09/2023

\n \n\n

Projects

\n \n\n

Certifications

\n \n\n

Languages

\n \n\n

Interests

\n \n\n

Availability

\n

Can start immediately

\n\n

Salary Expectations

\n

€50,000

\n\n

References

\n

Available upon request.

\n\n", + "total_tokens": 1940, + "input_tokens": 924, + "output_tokens": 1016, + "total_cost": 0.0007482 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:20:53", + "prompts": { + "prompt_1": "\nAct as an HR expert and resume writer. Your task is to meticulously review and optimize the resume to ensure it stands out in a competitive job market.\n\n### Tasks:\n\n- **Proofreading:**\n - Carefully check for spelling, grammar, and punctuation errors.\n\n- **Enhance Clarity and Impact:**\n - Improve the clarity and impact of the content.\n - Refine the language use and optimize the structure to highlight the candidate’s strengths and achievements.\n - Ensure there is a clear visual distinction between section titles and the content.\n\n- **Final Output:**\n - Ensure the resume is professionally polished, visually appealing, and formatted correctly in HTML.\n - Ensure that section titles are centered.\n - Ensure there is a noticeable visual difference between section titles and the content.\n - Remove any unnecessary content, such as \"Salary Expectations: €50,000.\"\n - Make sure the resume does not contain any placeholder text or irrelevant information.\n\n**Resume:**\n\n\n\n \n \n Federico Elia's Resume\n \n\n\n

Federico Elia

\n

Dublin 3, Ireland

\n

+353 892338335

\n

federico.elia.majo@gmail.com

\n

GitHub | LinkedIn

\n\n

Objective

\n

Detail-oriented and adaptable Software Engineer with a strong background in cloud infrastructure and problem-solving. Seeking to leverage technical expertise in a Senior Site Reliability Engineer role to enhance system reliability and performance.

\n\n

Education

\n

Bachelor in Computer Science
University of Genoa, Italy
Graduation Year: 2023
GPA: 3.6/4

\n

Skills Acquired: Blockchain, IoT, Python

\n\n

Technical Skills

\n \n\n

Professional Experience

\n

Software Engineer
GAlliera Hospital, Genoa, Italy
03/2023 - 09/2023

\n \n\n

Projects

\n \n\n

Certifications

\n \n\n

Languages

\n \n\n

Interests

\n \n\n

Availability

\n

Can start immediately

\n\n

Salary Expectations

\n

€50,000

\n\n

References

\n

Available upon request.

\n\n\n\nProvide only the HTML code for the resume, without any explanations or additional text and also without ```HTML ```\n" + }, + "replies": "\n\n\n \n \n Federico Elia's Resume\n \n\n\n

Federico Elia

\n

Dublin 3, Ireland

\n

+353 892338335

\n

federico.elia.majo@gmail.com

\n

GitHub | LinkedIn

\n\n

Objective

\n

Detail-oriented and adaptable Software Engineer with a strong background in cloud infrastructure and problem-solving. Seeking to leverage technical expertise in a Senior Site Reliability Engineer role to enhance system reliability and performance.

\n\n

Education

\n

Bachelor in Computer Science
University of Genoa, Italy
Graduation Year: 2023
GPA: 3.6/4

\n

Skills Acquired: Blockchain, IoT, Python

\n\n

Technical Skills

\n \n\n

Professional Experience

\n

Software Engineer
GAlliera Hospital, Genoa, Italy
03/2023 - 09/2023

\n \n\n

Projects

\n \n\n

Certifications

\n \n\n

Languages

\n \n\n

Interests

\n \n\n

Availability

\n

Can start immediately

\n\n

References

\n

Available upon request.

\n\n", + "total_tokens": 2254, + "input_tokens": 1241, + "output_tokens": 1013, + "total_cost": 0.0007939499999999999 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:21:02", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nhow many years of work experience do you have with site reliability engineering?\n\n## " + }, + "replies": "Not yet, but I will learn.", + "total_tokens": 699, + "input_tokens": 691, + "output_tokens": 8, + "total_cost": 0.00010845 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:21:04", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nhow many years of work experience do you have with kubernetes?\n\n## " + }, + "replies": "I have no experience with that, but I learn fast, very fast.", + "total_tokens": 706, + "input_tokens": 691, + "output_tokens": 15, + "total_cost": 0.00011265 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:21:04", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nhow many years of work experience do you have with open source platforms?\n\n## " + }, + "replies": "I have no experience with that, but I learn fast, very fast.", + "total_tokens": 706, + "input_tokens": 691, + "output_tokens": 15, + "total_cost": 0.00011265 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:36", + "prompts": { + "prompt_1": "\nAs a seasoned HR expert, your task is to identify and outline the key skills and requirements necessary for the position of this job. Use the provided job description as input to extract all relevant information. This will involve conducting a thorough analysis of the job's responsibilities and the industry standards. You should consider both the technical and soft skills needed to excel in this role. Additionally, specify any educational qualifications, certifications, or experiences that are essential. Your analysis should also reflect on the evolving nature of this role, considering future trends and how they might affect the required competencies.\n\nRules:\nRemove boilerplate text\nInclude only relevant information to match the job description against the resume\n\n# Analysis Requirements\nYour analysis should include the following sections:\nTechnical Skills: List all the specific technical skills required for the role based on the responsibilities described in the job description.\nSoft Skills: Identify the necessary soft skills, such as communication abilities, problem-solving, time management, etc.\nEducational Qualifications and Certifications: Specify the essential educational qualifications and certifications for the role.\nProfessional Experience: Describe the relevant work experiences that are required or preferred.\nRole Evolution: Analyze how the role might evolve in the future, considering industry trends and how these might influence the required skills.\n\n# Final Result:\nYour analysis should be structured in a clear and organized document with distinct sections for each of the points listed above. Each section should contain:\nThis comprehensive overview will serve as a guideline for the recruitment process, ensuring the identification of the most qualified candidates.\n\n# Job Description:\n```\nAbout the job\nHey there! 👋 Would you like to collaborate with good people by ❤ who are passionate about their craft and care about high-quality work that contributes to an outstanding product? \n\nWe're looking for an experienced Data Engineer to build, manage, and maintain a robust data infrastructure for collecting vast amounts of financial data. 🪂💻💹\n\nIf you're excited about joining an early-stage startup and building a product from the ground up, something that you will co-own (equity participation), keep reading!\n\nRole Overview:\n\nAs a Senior Data Engineer, you will be responsible for building and scaling our data infrastructure and adding new data integrations. You will play a mission critical role in ensuring our data platform is robust, scalable, and efficient.\n\nKey Responsibilities and Technologies:\n\nImplement and manage ETL processes using Python (Pandas).\nOptimize workflows within GCP (Composer, Cloud run …)\nWork with Cloud SQL and PostgreSQL to manage and query large datasets.\nIntegrate new data sources and map to existing datasets.\nDevelop APIs using FastAPI to enable data access and integration.\nImplement caching solutions using Redis or Memcached.\nManage version control and CI/CD pipelines with GitLab.\nCollaborate with cross-functional teams to ensure seamless data integration and functionality.\n\nWhat We Offer:\n\nEquity stake: Participate in the success of our platform.\nSalary: Compensation ranging from €50,000 to €80,000 p.a.\nRemote Collaboration: Work from anywhere, anytime.\nChallenge: Collaborate in developing cutting-edge financial technology that processes millions of data points, leverages data science and natural language processing (NLP) to extract valuable insights and keeps an eye on financial markets 24/7.\n\nApply:\n Send your introduction in any format that best represents you to vito@h-martin.com.\n\nJoin us and contribute to the future of financial markets intelligence! 🚀👨‍🚀📶\n```\n\n---\n\n# Job Description Summary" + }, + "replies": "# Analysis of Key Skills and Requirements for Senior Data Engineer Position\n\n## Technical Skills:\n- Proficiency in Python, specifically with libraries such as Pandas for ETL processes.\n- Experience with Google Cloud Platform (GCP), including tools like Composer and Cloud Run.\n- Strong knowledge of database management and querying, especially with Cloud SQL and PostgreSQL.\n- Expertise in integrating new data sources and mapping them to existing datasets.\n- Ability to develop APIs using FastAPI for data access and integration.\n- Familiarity with caching solutions such as Redis or Memcached.\n- Experience in managing version control and CI/CD pipelines using GitLab.\n\n## Soft Skills:\n- Strong communication skills for collaborating with cross-functional teams.\n- Problem-solving ability to tackle challenges related to data integration and infrastructure.\n- Time management skills to prioritize tasks in an early-stage startup environment.\n- Adaptability and a willingness to learn, essential for working in a fast-paced and evolving industry.\n\n## Educational Qualifications and Certifications:\n- A degree in Computer Science, Data Science, Information Technology, or a related field.\n- Relevant certifications (e.g., Google Cloud Certified - Professional Data Engineer) are preferred but not mandatory.\n\n## Professional Experience:\n- Minimum of 3-5 years of experience in data engineering or a related field.\n- Proven track record of building and maintaining scalable data infrastructures.\n- Experience working in an early-stage startup or a similar dynamic environment is a plus.\n\n## Role Evolution:\nThe role of a Data Engineer is likely to evolve with the increasing use of advanced analytics, machine learning, and artificial intelligence in financial technology. Future competencies may include:\n- Enhanced proficiency in big data technologies (e.g., Spark, Hadoop) as organizations begin to scale their data operations.\n- Knowledge of data governance and compliance as regulations in the financial sector evolve.\n- Skills in machine learning to assist in predictive analytics and data-driven decision-making.\n- A focus on real-time data processing to provide timely insights and support financial market operations.\n\nThis analysis serves as a guideline for identifying the most qualified candidates for the Senior Data Engineer position, aligning their skills and experiences with the demands of the role in a rapidly changing industry landscape.", + "total_tokens": 1130, + "input_tokens": 699, + "output_tokens": 431, + "total_cost": 0.00036344999999999997 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:36", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nemail address\nemail address\n\n## Options:\n['Select an option', 'federico.elia.majo@gmail.com']\n\n## " + }, + "replies": "federico.elia.majo@gmail.com", + "total_tokens": 655, + "input_tokens": 646, + "output_tokens": 9, + "total_cost": 0.00010229999999999999 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:40", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nphone country code\nphone country code\n\n## Options:\n['Select an option', 'Ireland (+353)', 'Afghanistan (+93)', 'Aland Islands (+358)', 'Albania (+355)', 'Algeria (+213)', 'American Samoa (+1)', 'Andorra (+376)', 'Angola (+244)', 'Anguilla (+1)', 'Antarctica (+0)', 'Antigua and Barbuda (+1)', 'Argentina (+54)', 'Armenia (+374)', 'Aruba (+297)', 'Australia (+61)', 'Austria (+43)', 'Azerbaijan (+994)', 'Bahamas (+1)', 'Bahrain (+973)', 'Bangladesh (+880)', 'Barbados (+1)', 'Belarus (+375)', 'Belgium (+32)', 'Belize (+501)', 'Benin (+229)', 'Bermuda (+1)', 'Bhutan (+975)', 'Bolivia (+591)', 'Bosnia and Herzegovina (+387)', 'Botswana (+267)', 'Bouvet Island (+0)', 'Brazil (+55)', 'British Indian Ocean Territory (+246)', 'Brunei Darussalam (+673)', 'Bulgaria (+359)', 'Burkina Faso (+226)', 'Burundi (+257)', 'Cambodia (+855)', 'Cameroon (+237)', 'Canada (+1)', 'Cape Verde (+238)', 'Caribbean Nations (+0)', 'Cayman Islands (+1)', 'Central African Republic (+236)', 'Chad (+235)', 'Chile (+56)', 'China (+86)', 'Christmas Island (+61)', 'Cocos (Keeling) Islands (+61)', 'Colombia (+57)', 'Comoros (+269)', 'Congo (+242)', 'Cook Islands (+682)', 'Costa Rica (+506)', 'Cote D’Ivoire (Ivory Coast) (+225)', 'Croatia (+385)', 'Cuba (+53)', 'Cyprus (+357)', 'Czech Republic (+420)', 'Democratic Republic of the Congo (+243)', 'Denmark (+45)', 'Djibouti (+253)', 'Dominica (+1)', 'Dominican Republic (+1)', 'Ecuador (+593)', 'Egypt (+20)', 'El Salvador (+503)', 'Equatorial Guinea (+240)', 'Eritrea (+291)', 'Estonia (+372)', 'Ethiopia (+251)', 'Falkland Islands (Malvinas) (+500)', 'Faroe Islands (+298)', 'Federated States of Micronesia (+691)', 'Fiji (+679)', 'Finland (+358)', 'France (+33)', 'French Guiana (+594)', 'French Polynesia (+689)', 'French Southern Territories (+0)', 'Gabon (+241)', 'Gambia (+220)', 'Georgia (+995)', 'Germany (+49)', 'Ghana (+233)', 'Gibraltar (+350)', 'Greece (+30)', 'Greenland (+299)', 'Grenada (+1)', 'Guadeloupe (+590)', 'Guam (+1)', 'Guatemala (+502)', 'Guernsey (+44)', 'Guinea (+224)', 'Guinea-Bissau (+245)', 'Guyana (+592)', 'Haiti (+509)', 'Heard Island and McDonald Islands (+0)', 'Honduras (+504)', 'Hong Kong (+852)', 'Hungary (+36)', 'Iceland (+354)', 'India (+91)', 'Indonesia (+62)', 'Iran (+98)', 'Iraq (+964)', 'Isle of Man (+44)', 'Israel (+972)', 'Italy (+39)', 'Jamaica (+1)', 'Japan (+81)', 'Jersey (+44)', 'Jordan (+962)', 'Kazakhstan (+7)', 'Kenya (+254)', 'Kiribati (+686)', 'Korea (+82)', 'Korea (North) (+850)', 'Kosovo (+383)', 'Kuwait (+965)', 'Kyrgyzstan (+996)', 'Laos (+856)', 'Latvia (+371)', 'Lebanon (+961)', 'Lesotho (+266)', 'Liberia (+231)', 'Libya (+218)', 'Liechtenstein (+423)', 'Lithuania (+370)', 'Luxembourg (+352)', 'Macao (+853)', 'Macedonia (+389)', 'Madagascar (+261)', 'Malawi (+265)', 'Malaysia (+60)', 'Maldives (+960)', 'Mali (+223)', 'Malta (+356)', 'Marshall Islands (+692)', 'Martinique (+596)', 'Mauritania (+222)', 'Mauritius (+230)', 'Mayotte (+262)', 'Mexico (+52)', 'Moldova (+373)', 'Monaco (+377)', 'Mongolia (+976)', 'Montenegro (+382)', 'Montserrat (+1)', 'Morocco (+212)', 'Mozambique (+258)', 'Myanmar (+95)', 'Namibia (+264)', 'Nauru (+674)', 'Nepal (+977)', 'Netherlands (+31)', 'Netherlands Antilles (+0)', 'New Caledonia (+687)', 'New Zealand (+64)', 'Nicaragua (+505)', 'Niger (+227)', 'Nigeria (+234)', 'Niue (+683)', 'Norfolk Island (+672)', 'Northern Mariana Islands (+1)', 'Norway (+47)', 'Pakistan (+92)', 'Palau (+680)', 'Palestinian Territory (+970)', 'Panama (+507)', 'Papua New Guinea (+675)', 'Paraguay (+595)', 'Peru (+51)', 'Philippines (+63)', 'Pitcairn (+0)', 'Poland (+48)', 'Portugal (+351)', 'Puerto Rico (+1)', 'Qatar (+974)', 'Reunion (+262)', 'Romania (+40)', 'Russian Federation (+7)', 'Rwanda (+250)', 'S. Georgia and S. Sandwich Islands (+0)', 'Saint Helena (+290)', 'Saint Kitts and Nevis (+1)', 'Saint Lucia (+1)', 'Saint Pierre and Miquelon (+508)', 'Saint Vincent and the Grenadines (+1)', 'Samoa (+685)', 'San Marino (+378)', 'Sao Tome and Principe (+239)', 'Saudi Arabia (+966)', 'Senegal (+221)', 'Serbia (+381)', 'Serbia and Montenegro (+0)', 'Seychelles (+248)', 'Sierra Leone (+232)', 'Singapore (+65)', 'Slovak Republic (+421)', 'Slovenia (+386)', 'Solomon Islands (+677)', 'Somalia (+252)', 'South Africa (+27)', 'South Sudan (+211)', 'Spain (+34)', 'Sri Lanka (+94)', 'Sudan (+249)', 'Sultanate of Oman (+968)', 'Suriname (+597)', 'Svalbard and Jan Mayen (+47)', 'Swaziland (+268)', 'Sweden (+46)', 'Switzerland (+41)', 'Syria (+963)', 'Taiwan (+886)', 'Tajikistan (+992)', 'Tanzania (+255)', 'Thailand (+66)', 'Timor-Leste (+670)', 'Togo (+228)', 'Tokelau (+690)', 'Tonga (+676)', 'Trinidad and Tobago (+1)', 'Tunisia (+216)', 'Turkey (+90)', 'Turkmenistan (+993)', 'Turks and Caicos Islands (+1)', 'Tuvalu (+688)', 'Uganda (+256)', 'Ukraine (+380)', 'United Arab Emirates (+971)', 'United Kingdom (+44)', 'United States (+1)', 'Uruguay (+598)', 'Uzbekistan (+998)', 'Vanuatu (+678)', 'Vatican City State (Holy See) (+39)', 'Venezuela (+58)', 'Vietnam (+84)', 'Virgin Islands (British) (+1)', 'Virgin Islands (U.S.) (+1)', 'Wallis and Futuna (+681)', 'Western Sahara (+212)', 'Yemen (+967)', 'Zambia (+260)', 'Zimbabwe (+263)']\n\n## " + }, + "replies": "Ireland (+353)", + "total_tokens": 2276, + "input_tokens": 2272, + "output_tokens": 4, + "total_cost": 0.0003432 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:41", + "prompts": { + "prompt_1": "For the following question: 'mobile phone number', which section of the resume is relevant? Respond with one of the following: Personal information, Self-Identification, Legal Authorization, Work Preferences, Education Details, Experience Details, Projects, Availability, Salary Expectations, Certifications, Languages, Interests." + }, + "replies": "Personal information", + "total_tokens": 66, + "input_tokens": 64, + "output_tokens": 2, + "total_cost": 1.08e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:42", + "prompts": { + "prompt_1": "\nAnswer the following question based on the provided personal information.\n\n## Rules\n- Answer questions directly.\n\n## Example\nMy resume: John Doe, born on 01/01/1990, living in Milan, Italy.\nQuestion: What is your city?\n Milan\n\nPersonal Information: PersonalInformation(name='Federico', surname='Elia', dateOfBirth='10/04/2001', country='Ireland', city='Dublin', address='Dublin 3, Ireland', phone='892338335', phonePrefix='+353', email='federico.elia.majo@gmail.com', github='https://github.com/feder-cr', linkedin='https://www.linkedin.com/in/federico-elia-5199951b6/')\nQuestion: mobile phone number\n" + }, + "replies": "892338335", + "total_tokens": 167, + "input_tokens": 164, + "output_tokens": 3, + "total_cost": 2.6399999999999998e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:55", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nhow many years of work experience do you have with postgresql?\n\n## " + }, + "replies": "I have no experience with that, but I learn fast, very fast.", + "total_tokens": 705, + "input_tokens": 690, + "output_tokens": 15, + "total_cost": 0.0001125 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:56", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nhow many years of work experience do you have with python (programming language)?\n\n## " + }, + "replies": "6", + "total_tokens": 694, + "input_tokens": 693, + "output_tokens": 1, + "total_cost": 0.00010455 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 02:38:57", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nhave you already held a position as a lead data engineer?\nhave you already held a position as a lead data engineer?\n\n## Options:\n['Select an option', 'Yes', 'No']\n\n## " + }, + "replies": "No", + "total_tokens": 660, + "input_tokens": 659, + "output_tokens": 1, + "total_cost": 9.944999999999999e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:09:47", + "prompts": { + "prompt_1": "\nAs a seasoned HR expert, your task is to identify and outline the key skills and requirements necessary for the position of this job. Use the provided job description as input to extract all relevant information. This will involve conducting a thorough analysis of the job's responsibilities and the industry standards. You should consider both the technical and soft skills needed to excel in this role. Additionally, specify any educational qualifications, certifications, or experiences that are essential. Your analysis should also reflect on the evolving nature of this role, considering future trends and how they might affect the required competencies.\n\nRules:\nRemove boilerplate text\nInclude only relevant information to match the job description against the resume\n\n# Analysis Requirements\nYour analysis should include the following sections:\nTechnical Skills: List all the specific technical skills required for the role based on the responsibilities described in the job description.\nSoft Skills: Identify the necessary soft skills, such as communication abilities, problem-solving, time management, etc.\nEducational Qualifications and Certifications: Specify the essential educational qualifications and certifications for the role.\nProfessional Experience: Describe the relevant work experiences that are required or preferred.\nRole Evolution: Analyze how the role might evolve in the future, considering industry trends and how these might influence the required skills.\n\n# Final Result:\nYour analysis should be structured in a clear and organized document with distinct sections for each of the points listed above. Each section should contain:\nThis comprehensive overview will serve as a guideline for the recruitment process, ensuring the identification of the most qualified candidates.\n\n# Job Description:\n```\nAbout the job\nAbout the Company: WDJobs are working with a rapidly growing enterprise who are global leaders in the sportswear space. With over 25,000 staff, they're looking to bring in a Workday Integrations SME to help deliver on their ERP projects.\n\nAbout the Role: Reporting to the Director of ERP Systems, the successful Workday Integrations Developer will design, develop, and maintain integrations between Workday and other enterprise systems. The ideal candidate will have a deep understanding of Workday's integration tools and technologies, as well as experience in implementing and managing complex integration projects.\n\nIn 2023, the brand was voted in the top 50 companies to work for across the globe by LinkedIn, speaking volumes of the incredibly positive culture and willingness to invest in their staff through training and certifications!\n\nKey Responsibilities:\n\nDesign, develop, test, and deploy integrations using Workday Integration tools such as Studio, EIB, Connectors, as well as integrating Extend applications.\nCollaborate with internal stakeholders to understand integration requirements and develop solutions that meet business needs.\nMaintain and enhance existing integrations to ensure they continue to meet evolving business requirements.\n\nRewards:\n\nUnlimited PTO\nWorkday Certification Training\n4-day working week\nMarket-leading Salary\nHealth, Vision and Dental Cover\nEmployee Discounts\n```\n\n---\n\n# Job Description Summary" + }, + "replies": "# Job Description Summary\n\n## Technical Skills\n- Proficiency in Workday integration tools, including Workday Studio, Enterprise Interface Builder (EIB), and Connectors.\n- Experience with integrating Extend applications with Workday.\n- Strong understanding of ERP systems and integration methodologies.\n- Ability to design, develop, test, and deploy integration solutions.\n- Familiarity with data mapping, transformation, and troubleshooting integration issues.\n\n## Soft Skills\n- Excellent communication skills for collaborating with internal stakeholders.\n- Strong problem-solving abilities to address complex integration challenges.\n- Effective time management skills to prioritize and manage multiple integration projects.\n- Team-oriented mindset to work collaboratively with various departments.\n\n## Educational Qualifications and Certifications\n- Bachelor’s degree in Computer Science, Information Technology, or a related field.\n- Workday certification in relevant integration tools (highly preferable).\n\n## Professional Experience\n- Proven experience as a Workday Integrations Developer or in a similar role.\n- Experience managing complex integration projects in an enterprise environment.\n- Prior involvement in designing and maintaining integrations between different enterprise systems.\n\n## Role Evolution\n- The role may evolve to include more advanced technologies such as AI and machine learning for smarter integration solutions.\n- As businesses increasingly adopt cloud-based solutions, familiarity with APIs and modern integration platforms will become essential.\n- There may be a growing focus on data security and compliance, requiring additional skills in cybersecurity within integration processes.\n- Continuous learning and adaptation to new Workday features and updates will be necessary to remain effective in this role.", + "total_tokens": 874, + "input_tokens": 575, + "output_tokens": 299, + "total_cost": 0.00026565 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:09:48", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nemail address\nemail address\n\n## Options:\n['Select an option', 'federico.elia.majo@gmail.com']\n\n## " + }, + "replies": "federico.elia.majo@gmail.com", + "total_tokens": 655, + "input_tokens": 646, + "output_tokens": 9, + "total_cost": 0.00010229999999999999 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:09:52", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nphone country code\nphone country code\n\n## Options:\n['Select an option', 'Ireland (+353)', 'Afghanistan (+93)', 'Aland Islands (+358)', 'Albania (+355)', 'Algeria (+213)', 'American Samoa (+1)', 'Andorra (+376)', 'Angola (+244)', 'Anguilla (+1)', 'Antarctica (+0)', 'Antigua and Barbuda (+1)', 'Argentina (+54)', 'Armenia (+374)', 'Aruba (+297)', 'Australia (+61)', 'Austria (+43)', 'Azerbaijan (+994)', 'Bahamas (+1)', 'Bahrain (+973)', 'Bangladesh (+880)', 'Barbados (+1)', 'Belarus (+375)', 'Belgium (+32)', 'Belize (+501)', 'Benin (+229)', 'Bermuda (+1)', 'Bhutan (+975)', 'Bolivia (+591)', 'Bosnia and Herzegovina (+387)', 'Botswana (+267)', 'Bouvet Island (+0)', 'Brazil (+55)', 'British Indian Ocean Territory (+246)', 'Brunei Darussalam (+673)', 'Bulgaria (+359)', 'Burkina Faso (+226)', 'Burundi (+257)', 'Cambodia (+855)', 'Cameroon (+237)', 'Canada (+1)', 'Cape Verde (+238)', 'Caribbean Nations (+0)', 'Cayman Islands (+1)', 'Central African Republic (+236)', 'Chad (+235)', 'Chile (+56)', 'China (+86)', 'Christmas Island (+61)', 'Cocos (Keeling) Islands (+61)', 'Colombia (+57)', 'Comoros (+269)', 'Congo (+242)', 'Cook Islands (+682)', 'Costa Rica (+506)', 'Cote D’Ivoire (Ivory Coast) (+225)', 'Croatia (+385)', 'Cuba (+53)', 'Cyprus (+357)', 'Czech Republic (+420)', 'Democratic Republic of the Congo (+243)', 'Denmark (+45)', 'Djibouti (+253)', 'Dominica (+1)', 'Dominican Republic (+1)', 'Ecuador (+593)', 'Egypt (+20)', 'El Salvador (+503)', 'Equatorial Guinea (+240)', 'Eritrea (+291)', 'Estonia (+372)', 'Ethiopia (+251)', 'Falkland Islands (Malvinas) (+500)', 'Faroe Islands (+298)', 'Federated States of Micronesia (+691)', 'Fiji (+679)', 'Finland (+358)', 'France (+33)', 'French Guiana (+594)', 'French Polynesia (+689)', 'French Southern Territories (+0)', 'Gabon (+241)', 'Gambia (+220)', 'Georgia (+995)', 'Germany (+49)', 'Ghana (+233)', 'Gibraltar (+350)', 'Greece (+30)', 'Greenland (+299)', 'Grenada (+1)', 'Guadeloupe (+590)', 'Guam (+1)', 'Guatemala (+502)', 'Guernsey (+44)', 'Guinea (+224)', 'Guinea-Bissau (+245)', 'Guyana (+592)', 'Haiti (+509)', 'Heard Island and McDonald Islands (+0)', 'Honduras (+504)', 'Hong Kong (+852)', 'Hungary (+36)', 'Iceland (+354)', 'India (+91)', 'Indonesia (+62)', 'Iran (+98)', 'Iraq (+964)', 'Isle of Man (+44)', 'Israel (+972)', 'Italy (+39)', 'Jamaica (+1)', 'Japan (+81)', 'Jersey (+44)', 'Jordan (+962)', 'Kazakhstan (+7)', 'Kenya (+254)', 'Kiribati (+686)', 'Korea (+82)', 'Korea (North) (+850)', 'Kosovo (+383)', 'Kuwait (+965)', 'Kyrgyzstan (+996)', 'Laos (+856)', 'Latvia (+371)', 'Lebanon (+961)', 'Lesotho (+266)', 'Liberia (+231)', 'Libya (+218)', 'Liechtenstein (+423)', 'Lithuania (+370)', 'Luxembourg (+352)', 'Macao (+853)', 'Macedonia (+389)', 'Madagascar (+261)', 'Malawi (+265)', 'Malaysia (+60)', 'Maldives (+960)', 'Mali (+223)', 'Malta (+356)', 'Marshall Islands (+692)', 'Martinique (+596)', 'Mauritania (+222)', 'Mauritius (+230)', 'Mayotte (+262)', 'Mexico (+52)', 'Moldova (+373)', 'Monaco (+377)', 'Mongolia (+976)', 'Montenegro (+382)', 'Montserrat (+1)', 'Morocco (+212)', 'Mozambique (+258)', 'Myanmar (+95)', 'Namibia (+264)', 'Nauru (+674)', 'Nepal (+977)', 'Netherlands (+31)', 'Netherlands Antilles (+0)', 'New Caledonia (+687)', 'New Zealand (+64)', 'Nicaragua (+505)', 'Niger (+227)', 'Nigeria (+234)', 'Niue (+683)', 'Norfolk Island (+672)', 'Northern Mariana Islands (+1)', 'Norway (+47)', 'Pakistan (+92)', 'Palau (+680)', 'Palestinian Territory (+970)', 'Panama (+507)', 'Papua New Guinea (+675)', 'Paraguay (+595)', 'Peru (+51)', 'Philippines (+63)', 'Pitcairn (+0)', 'Poland (+48)', 'Portugal (+351)', 'Puerto Rico (+1)', 'Qatar (+974)', 'Reunion (+262)', 'Romania (+40)', 'Russian Federation (+7)', 'Rwanda (+250)', 'S. Georgia and S. Sandwich Islands (+0)', 'Saint Helena (+290)', 'Saint Kitts and Nevis (+1)', 'Saint Lucia (+1)', 'Saint Pierre and Miquelon (+508)', 'Saint Vincent and the Grenadines (+1)', 'Samoa (+685)', 'San Marino (+378)', 'Sao Tome and Principe (+239)', 'Saudi Arabia (+966)', 'Senegal (+221)', 'Serbia (+381)', 'Serbia and Montenegro (+0)', 'Seychelles (+248)', 'Sierra Leone (+232)', 'Singapore (+65)', 'Slovak Republic (+421)', 'Slovenia (+386)', 'Solomon Islands (+677)', 'Somalia (+252)', 'South Africa (+27)', 'South Sudan (+211)', 'Spain (+34)', 'Sri Lanka (+94)', 'Sudan (+249)', 'Sultanate of Oman (+968)', 'Suriname (+597)', 'Svalbard and Jan Mayen (+47)', 'Swaziland (+268)', 'Sweden (+46)', 'Switzerland (+41)', 'Syria (+963)', 'Taiwan (+886)', 'Tajikistan (+992)', 'Tanzania (+255)', 'Thailand (+66)', 'Timor-Leste (+670)', 'Togo (+228)', 'Tokelau (+690)', 'Tonga (+676)', 'Trinidad and Tobago (+1)', 'Tunisia (+216)', 'Turkey (+90)', 'Turkmenistan (+993)', 'Turks and Caicos Islands (+1)', 'Tuvalu (+688)', 'Uganda (+256)', 'Ukraine (+380)', 'United Arab Emirates (+971)', 'United Kingdom (+44)', 'United States (+1)', 'Uruguay (+598)', 'Uzbekistan (+998)', 'Vanuatu (+678)', 'Vatican City State (Holy See) (+39)', 'Venezuela (+58)', 'Vietnam (+84)', 'Virgin Islands (British) (+1)', 'Virgin Islands (U.S.) (+1)', 'Wallis and Futuna (+681)', 'Western Sahara (+212)', 'Yemen (+967)', 'Zambia (+260)', 'Zimbabwe (+263)']\n\n## " + }, + "replies": "Ireland (+353)", + "total_tokens": 2276, + "input_tokens": 2272, + "output_tokens": 4, + "total_cost": 0.0003432 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:09:52", + "prompts": { + "prompt_1": "For the following question: 'mobile phone number', which section of the resume is relevant? Respond with one of the following: Personal information, Self-Identification, Legal Authorization, Work Preferences, Education Details, Experience Details, Projects, Availability, Salary Expectations, Certifications, Languages, Interests." + }, + "replies": "Personal information", + "total_tokens": 66, + "input_tokens": 64, + "output_tokens": 2, + "total_cost": 1.08e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:09:53", + "prompts": { + "prompt_1": "\nAnswer the following question based on the provided personal information.\n\n## Rules\n- Answer questions directly.\n\n## Example\nMy resume: John Doe, born on 01/01/1990, living in Milan, Italy.\nQuestion: What is your city?\n Milan\n\nPersonal Information: PersonalInformation(name='Federico', surname='Elia', dateOfBirth='10/04/2001', country='Ireland', city='Dublin', address='Dublin 3, Ireland', phone='892338335', phonePrefix='+353', email='federico.elia.majo@gmail.com', github='https://github.com/feder-cr', linkedin='https://www.linkedin.com/in/federico-elia-5199951b6/')\nQuestion: mobile phone number\n" + }, + "replies": "892338335", + "total_tokens": 167, + "input_tokens": 164, + "output_tokens": 3, + "total_cost": 2.6399999999999998e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:10:08", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person).\n\n## Rules\n- Answer the question directly (only number).\n- Regarding work experience just check the Experience Details -> Skills Acquired section.\n- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired.\n- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience.\n- If you cannot answer the question, provide answers like \"I have no experience with that, but I learn fast, very fast\", \"not yet, but I will learn\".\n- The answer must not be larger than a tweet (140 characters).\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on both swift and python.\nQuestion: how much years experience with swift?\n10\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nhow many years of work experience do you have with workday integration?\n\n## " + }, + "replies": "I have no experience with that, but I learn fast, very fast.", + "total_tokens": 706, + "input_tokens": 691, + "output_tokens": 15, + "total_cost": 0.00011265 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:10:08", + "prompts": { + "prompt_1": "The following is a resume and an answered question about the resume, the answer is one of the options.\n\n## Rules\n- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc.\n- The answer must be one of the options.\n- The answer must exclusively contain one of the options.\n\n## Example\nMy resume: I'm a software engineer with 10 years of experience on swift, python, C, C++.\nQuestion: How many years of experience do you have on python?\nOptions: [1-2, 3-5, 6-10, 10+]\n10+\n\n-----\n\n## My resume:\n```\nPersonal Information:\nname: Federico\nsurname: Elia\ndateOfBirth: 10/04/2001\ncountry: Ireland\ncity: Dublin\naddress: Dublin 3, Ireland\nphone: 892338335\nphonePrefix: +353\nemail: federico.elia.majo@gmail.com\ngithub: https://github.com/feder-cr\nlinkedin: https://www.linkedin.com/in/federico-elia-5199951b6/\n\nSelf Identification:\ngender: Male\npronouns: He\nveteran: False\ndisability: False\nethnicity: White\n\nLegal Authorization:\neuWorkAuthorization: True\nusWorkAuthorization: False\nrequiresUsVisa: True\nlegallyAllowedToWorkInUs: False\nrequiresUsSponsorship: True\nrequiresEuVisa: False\nlegallyAllowedToWorkInEu: True\nrequiresEuSponsorship: False\n\nWork Preferences:\nremoteWork: True\ninPersonWork: True\nopenToRelocation: True\nwillingToCompleteAssessments: True\nwillingToUndergoDrugTests: True\nwillingToUndergoBackgroundChecks: True\n\nEducation Details:\n - Bachelor in Computer Science from University of Genoa, GPA: 3.6/4, Graduation Year: 2023\n Skills Acquired:\nblockchain: 3\niot: 3\npython: 3\n\nExperience Details:\n - Software Engineer at GAlliera Hospital (03/2023 - 09/2023), Genoa, Hospital\n Key Responsibilities:\nresponsibility1: [Years]\nresponsibility2: [Years]\nresponsibility3: [Years]\n Skills Acquired:\nphp: 3\npython: 3\nleadership: 2\nproblemSolving: 3\ncriticalThinking: 3\nadaptability: 3\nperfectionism: 2\n\nProjects:\n - [Description of significant projects you've worked on + if available repo link]\n - [Description of significant projects you've worked on + if available repo link]\n\nAvailability: Can start immediately\n\nSalary Expectations: 50000\n\nCertifications: C1 english\n\nLanguages:\n - Italian (Native)\n - English (Professional)\n\nInterests:\nBoxe, MMA\n```\n\n## Question:\nare you legally authorized to work in germany?\nare you legally authorized to work in germany?\nrequired\nyes\nno\n\n## Options:\n['yes', 'no']\n\n## " + }, + "replies": "no", + "total_tokens": 655, + "input_tokens": 654, + "output_tokens": 1, + "total_cost": 9.87e-05 +} +{ + "model": "gpt-4o-mini-2024-07-18", + "time": "2024-08-04 13:10:09", + "prompts": { + "prompt_1": "For the following question: 'yes', which section of the resume is relevant? Respond with one of the following: Personal information, Self-Identification, Legal Authorization, Work Preferences, Education Details, Experience Details, Projects, Availability, Salary Expectations, Certifications, Languages, Interests." + }, + "replies": "Self-Identification", + "total_tokens": 65, + "input_tokens": 62, + "output_tokens": 3, + "total_cost": 1.1099999999999999e-05 +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..1ab46e1 --- /dev/null +++ b/readme.md @@ -0,0 +1,157 @@ +# LinkedIn_AIHawk + +## Table of Contents + +1. [Introduction](#introduction) +2. [Features](#features) +3. [Installation](#installation) +4. [Configuration](#configuration) +5. [Usage](#usage) +6. [Optional Resume Feature](#optional-resume-feature) +7. [Documentation](#documentation) +8. [Troubleshooting](#troubleshooting) +9. [Contributors](#contributors) +10. [License](#license) +11. [Conclusion](#conclusion) + +## Introduction + +LinkedIn_AIHawk is a cutting-edge, automated tool designed to revolutionize the job search and application process on LinkedIn. In today's fiercely competitive job market, where opportunities can vanish in the blink of an eye, this program offers job seekers a significant advantage. By leveraging the power of automation and artificial intelligence, LinkedIn_AIHawk enables users to apply to a vast number of relevant positions efficiently and in a personalized manner, maximizing their chances of landing their dream job. + +### The Challenge of Modern Job Hunting + +In the digital age, the job search landscape has undergone a dramatic transformation. While online platforms like LinkedIn have opened up a world of opportunities, they have also intensified competition. Job seekers often find themselves spending countless hours scrolling through listings, tailoring applications, and repetitively filling out forms. This process can be not only time-consuming but also emotionally draining, leading to job search fatigue and missed opportunities. + +### Enter LinkedIn_AIHawk: Your Personal Job Search Assistant + +LinkedIn_AIHawk steps in as a game-changing solution to these challenges. It's not just a tool; it's your tireless, 24/7 job search partner. By automating the most time-consuming aspects of the job search process, it allows you to focus on what truly matters - preparing for interviews and developing your professional skills. + +## Features + +1. **Intelligent Job Search Automation** + - Customizable search criteria + - Continuous scanning for new openings + - Smart filtering to exclude irrelevant listings + +2. **Rapid and Efficient Application Submission** + - One-click applications using LinkedIn's "Easy Apply" feature + - Form auto-fill using your profile information + - Automatic document attachment (resume, cover letter) + +3. **AI-Powered Personalization** + - Dynamic response generation for employer-specific questions + - Tone and style matching to fit company culture + - Keyword optimization for improved application relevance + +4. **Volume Management with Quality** + - Bulk application capability + - Quality control measures + - Detailed application tracking + +5. **Intelligent Filtering and Blacklisting** + - Company blacklist to avoid unwanted employers + - Title filtering to focus on relevant positions + +6. **Dynamic Resume Generation** + - Automatically creates tailored resumes for each application + - Customizes resume content based on job requirements + +7. **Secure Data Handling** + - Manages sensitive information securely using YAML files + +## Installation + +1. **Clone the repository:** + ```bash + git clone https://github.com/your-repo/LinkedInJobBot.git + cd LinkedInJobBot + ``` + +2. **Install the required packages:** + ```bash + pip install -r requirements.txt + ``` + +3. **Install ChromeDriver:** + ```bash + python -c "from webdriver_manager.chrome import ChromeDriverManager; ChromeDriverManager().install()" + ``` + +## Configuration + +LinkedIn_AIHawk relies on three main configuration files: + +### 1. secrets.yaml + +Contains sensitive information. Never share or commit this file to version control. + +- `email`: Your LinkedIn account email +- `password`: Your LinkedIn account password +- `openai_api_key`: Your OpenAI API key for GPT integration + +### 2. config.yaml + +Defines your job search parameters and bot behavior. + +- `remote`: Set to `true` to include remote jobs, `false` to exclude them +- `experienceLevel`: Set desired experience levels to `true` +- `jobTypes`: Set desired job types to `true` +- `date`: Choose one time range for job postings +- `positions`: List job titles you're interested in +- `locations`: List locations you want to search in +- `distance`: Set the radius for your job search (in miles) +- `companyBlacklist`: List companies you want to exclude from your search +- `titleBlacklist`: List keywords in job titles you want to avoid + +### 3. plain_text_resume_template.yaml + +Contains your resume information in a structured format. Fill it out with your personal details, education, work experience, and skills. This information is used to auto-fill application forms and generate customized resumes. + +## Usage + +1. **Prepare the Data Folder:** + Ensure that your data_folder contains the following files: + - `secrets.yaml` + - `config.yaml` + - `plain_text_resume.yaml` + - `resume.pdf` (optional) + +2. **Run the Bot:** + ```bash + python main.py [--resume PATH_TO_RESUME_PDF] + ``` + +## Optional Resume Feature + +LinkedIn_AIHawk offers flexibility in how it handles your resume: + +- **Using a Specific Resume:** + If you want to use a specific PDF resume for all applications, run the bot with the `--resume` option: + ```bash + python main.py --resume /path/to/your/resume.pdf + ``` + +- **Dynamic Resume Generation:** + If you don't use the `--resume` option, the bot will automatically generate a unique resume for each application. This feature uses the information from your `plain_text_resume.yaml` file and tailors it to each specific job application, potentially increasing your chances of success by customizing your resume for each position. + +## Documentation + +For detailed information on each component and their respective roles, please refer to the [Documentation](docs/documentation.md) file. + +## Troubleshooting + +- **ChromeDriver Issues:** Ensure ChromeDriver is compatible with your installed Chrome version. +- **Missing Files:** Verify that all necessary files are present in the data folder. +- **Invalid YAML:** Check your YAML files for syntax errors. + +## Contributors + +- [feder-cr](https://github.com/your-github-profile) - Creator and Maintainer + +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## Conclusion + +LinkedIn_AIHawk provides a significant advantage in the modern job market by automating and enhancing the job application process. With features like dynamic resume generation and AI-powered personalization, it offers unparalleled flexibility and efficiency. Whether you're a job seeker aiming to maximize your chances of landing a job, a recruiter looking to streamline application submissions, or a career advisor seeking to offer better services, LinkedIn_AIHawk is an invaluable resource. By leveraging cutting-edge automation and artificial intelligence, this tool not only saves time but also significantly increases the effectiveness and quality of job applications in today's competitive landscape. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..ca668541d412121243189e06d755beeb7f37c727 GIT binary patch literal 566 zcmaJ;Z4QDk6zgvjj{?D=G5+udUP3^D$X7N|yu8}?3>Yw&WyxS|U)#N&1&*kYB1Xnj z&hwrtfDgmH;#y*XUzA5ijgqS+C&v|!2{ZW1v^b6M2J2aTjfUt-{q^ov>TWyBxsuV* zl?O+5p$_Gr<#(?k3C&2sF^^=)28_(vAym|X{F^#)M2OnBuZ?<=zNU^vCB$~Pm-H!j zr*jPZmi)dV`X&U^P|0$V^dBi!P+#AUn1Wkgprv<7CWzfI>CW2-2~~3SZrMnwZ+=t< acHn&8T-uB5V|g9K+yA8U&-E_ef<99P2t literal 0 HcmV?d00001 diff --git a/resume.py b/resume.py new file mode 100644 index 0000000..7004761 --- /dev/null +++ b/resume.py @@ -0,0 +1,127 @@ +from dataclasses import dataclass +from typing import Dict +import yaml + +@dataclass +class PersonalInformation: + name: str + surname: str + dateOfBirth: str + country: str + city: str + address: str + phone: str + phonePrefix: str + email: str + github: str + linkedin: str + +@dataclass +class SelfIdentification: + gender: str + pronouns: str + veteran: str + disability: str + ethnicity: str + +@dataclass +class LegalAuthorization: + euWorkAuthorization: str + usWorkAuthorization: str + requiresUsVisa: str + legallyAllowedToWorkInUs: str + requiresUsSponsorship: str + requiresEuVisa: str + legallyAllowedToWorkInEu: str + requiresEuSponsorship: str + +@dataclass +class WorkPreferences: + remoteWork: str + inPersonWork: str + openToRelocation: str + willingToCompleteAssessments: str + willingToUndergoDrugTests: str + willingToUndergoBackgroundChecks: str + +@dataclass +class Education: + degree: str + university: str + gpa: str + graduationYear: str + fieldOfStudy: str + skillsAcquired: Dict[str, str] + +@dataclass +class Experience: + position: str + company: str + employmentPeriod: str + location: str + industry: str + keyResponsibilities: Dict[str, str] + skillsAcquired: Dict[str, str] + +@dataclass +class Availability: + noticePeriod: str + +@dataclass +class SalaryExpectations: + salaryRangeUSD: str + +@dataclass +class Language: + language: str + proficiency: str + +class Resume: + def __init__(self, yaml_str: str): + data = yaml.safe_load(yaml_str) + self.personal_information = PersonalInformation(**data['personal_information']) + self.self_identification = SelfIdentification(**data['self_identification']) + self.legal_authorization = LegalAuthorization(**data['legal_authorization']) + self.work_preferences = WorkPreferences(**data['work_preferences']) + self.education_details = [Education(**edu) for edu in data['education_details']] + self.experience_details = [Experience(**exp) for exp in data['experience_details']] + self.projects = data['projects'] + self.availability = Availability(**data['availability']) + self.salary_expectations = SalaryExpectations(**data['salary_expectations']) + self.certifications = data['certifications'] + self.languages = [Language(**lang) for lang in data['languages']] + self.interests = data['interests'] + + def __str__(self): + def format_dict(dict_obj): + return "\n".join(f"{key}: {value}" for key, value in dict_obj.items()) + + def format_dataclass(obj): + return "\n".join(f"{field.name}: {getattr(obj, field.name)}" for field in obj.__dataclass_fields__.values()) + + return ("Personal Information:\n" + format_dataclass(self.personal_information) + "\n\n" + "Self Identification:\n" + format_dataclass(self.self_identification) + "\n\n" + "Legal Authorization:\n" + format_dataclass(self.legal_authorization) + "\n\n" + "Work Preferences:\n" + format_dataclass(self.work_preferences) + "\n\n" + "Education Details:\n" + "\n".join( + f" - {edu.degree} in {edu.fieldOfStudy} from {edu.university}, " + f"GPA: {edu.gpa}, Graduation Year: {edu.graduationYear}\n" + f" Skills Acquired:\n{format_dict(edu.skillsAcquired)}" + for edu in self.education_details + ) + "\n\n" + "Experience Details:\n" + "\n".join( + f" - {exp.position} at {exp.company} ({exp.employmentPeriod}), {exp.location}, {exp.industry}\n" + f" Key Responsibilities:\n{format_dict(exp.keyResponsibilities)}\n" + f" Skills Acquired:\n{format_dict(exp.skillsAcquired)}" + for exp in self.experience_details + ) + "\n\n" + "Projects:\n" + "\n".join(f" - {proj}" for proj in self.projects.values()) + "\n\n" + f"Availability: {self.availability.noticePeriod}\n\n" + f"Salary Expectations: {self.salary_expectations.salaryRangeUSD}\n\n" + "Certifications: " + ", ".join(self.certifications) + "\n\n" + "Languages:\n" + "\n".join( + f" - {lang.language} ({lang.proficiency})" + for lang in self.languages + ) + "\n\n" + "Interests:\n" + ", ".join(self.interests) + ) diff --git a/strings.py b/strings.py new file mode 100644 index 0000000..f58723b --- /dev/null +++ b/strings.py @@ -0,0 +1,539 @@ +prepare_info_template = """ +**Prompt for HR Expert and Resume Writer:** + +Act as an HR expert and skilled resume writer specializing in creating ATS-compatible resumes. Your task is to identify and outline the key skills and requirements necessary for the position of this job, using the provided job description and resume. Use the job description as input to extract all relevant information and optimize the resume to highlight the relevant skills and experiences for the role. + +### Information to Collect and Analyze +- **Resume:** + {resume} + +- **Job Description:** + {job_description} + +### Analysis and Planning + +1. **Analyze the Job Description**: + - Identify the required technical and soft skills. + - List the essential educational qualifications and certifications. + - Describe the relevant work experiences. + - Reflect on the role's evolution, considering future trends. + +2. **Analyze the Current Resume**: + - Identify the existing skills and experiences in the resume. + +3. **Optimize the Resume**: + - Plan the resume to highlight experiences and skills relevant to the job requirements. + - Ensure it includes pertinent keywords, a clear structure, and is tailored to emphasize the candidate's strengths and achievements. + - Avoid including information not requested by the job description. + +### Creating a "Smart" Resume + +- **ATS Compatibility**: Ensure the resume is optimized for applicant tracking systems (ATS) by including relevant keywords. +- **Adaptation to the Job Description**: Strategically tailor the resume to reflect the skills and experiences required by the job description. +- **Highlighting Strengths**: Customize the resume to showcase the most relevant skills, experiences, and achievements for the role. +- **Clear Structure**: Use a clear and readable structure. +- **Showcasing Experiences and Achievements**: Provide guidance on effectively presenting experience, skills, and achievements in a compelling and professional manner. +- **Formatting and Design**: Offer advice on formatting and design to maintain readability and professionalism, ensuring the resume stands out in a competitive job market. + +### Final Result + +Your analysis and the optimized resume should be structured in a clear and organized document, with distinct sections for each point listed above. Each section should contain: + + +The results should be provided in **Markdown** format, Provide only the markdown code for the resume, without any explanations or additional text and also without ```md ``` +""" + +format_resume_template = """ +Transform the provided Markdown output into HTML format. Ensure that the HTML document uses a simple, clear style that maintains ATS compatibility and is easy for recruiters to read. + +### HTML Styling and Design Guidelines + +1. **Font and Color Scheme**: + - Use a standard sans-serif font such as "Arial" or "Verdana." + - Ensure dark text on a light background for optimal readability. + +2. **Headings and Titles**: + - **Main Titles**: + - Font: Arial, sans-serif + - Font Size: 16 px + - Color: Black + - Alignment: Left-aligned + - Spacing: 20 px above and below the title + - Formatting: Bold + + - **Subtitles**: + - Font: Arial, sans-serif + - Font Size: 14 px + - Color: Black + - Alignment: Left-aligned + - Spacing: 10 px above and below the subtitle + - Formatting: Bold + +3. **Spacing and Margins**: + - General Margins: 1 inch (2.54 cm) on all sides + - Spacing between Titles and Content: + - After Main Titles: 20 px of spacing + - After Subtitles: 10 px of spacing + - Text Alignment: Left-aligned + +4. **Color Matching**: + - Use a consistent color scheme for headings and body text. + - Avoid bright colors and multiple shades to ensure clarity. + +### Output Requirements + +- **Convert Markdown to HTML**: Use the provided content and apply the specified styles. +- **Apply Styling**: Follow the guidelines for font, size, color, and spacing. +- **Ensure ATS Compatibility**: Maintain clear formatting to ensure the document is easily parsed by ATS systems. + +Provide only the HTML code for the resume, without any explanations or additional text and also without ```HTML ```, Ensure the final HTML document is simple, professional, and optimized for ATS. + +Resume in Markdown format: +{formatted_resume} +""" + +review_and_optimize_template = """ +Act as an HR expert and resume writer. Your task is to meticulously review and optimize the resume to ensure it stands out in a competitive job market. + +### Tasks: + +- **Proofreading:** + - Carefully check for spelling, grammar, and punctuation errors. + +- **Enhance Clarity and Impact:** + - Improve the clarity and impact of the content. + - Refine the language use and optimize the structure to highlight the candidate’s strengths and achievements. + - Ensure there is a clear visual distinction between section titles and the content. + +- **Final Output:** + - Ensure the resume is professionally polished, visually appealing, and formatted correctly in HTML. + - Ensure that section titles are centered. + - Ensure there is a noticeable visual difference between section titles and the content. + - Remove any unnecessary content, such as "Salary Expectations: €50,000." + - Make sure the resume does not contain any placeholder text or irrelevant information. + +**Resume:** +{final_resume_html} + +Provide only the HTML code for the resume, without any explanations or additional text and also without ```HTML ``` +""" + + + + + + + + + + +# Personal Information Template +personal_information_template = """ +Answer the following question based on the provided personal information. + +## Rules +- Answer questions directly. + +## Example +My resume: John Doe, born on 01/01/1990, living in Milan, Italy. +Question: What is your city? + Milan + +Personal Information: {resume_section} +Question: {question} +""" + + + +# Personal Information Template +personal_information_template = """ +Answer the following question based on the provided personal information. + +## Rules +- Answer questions directly. + +## Example +My resume: John Doe, born on 01/01/1990, living in Milan, Italy. +Question: What is your city? + Milan + +Personal Information: {resume_section} +Question: {question} +""" + +# Self Identification Template +self_identification_template = """ +Answer the following question based on the provided self-identification details. + +## Rules +- Answer questions directly. + +## Example +My resume: Male, uses he/him pronouns, not a veteran, no disability. +Question: What are your gender? +Male + +Self-Identification: {resume_section} +Question: {question} +""" + +# Legal Authorization Template +legal_authorization_template = """ +Answer the following question based on the provided legal authorization details. + +## Rules +- Answer questions directly. + +## Example +My resume: Authorized to work in the EU, no US visa required. +Question: Are you legally allowed to work in the EU? +Yes + +Legal Authorization: {resume_section} +Question: {question} +""" + +# Work Preferences Template +work_preferences_template = """ +Answer the following question based on the provided work preferences. + +## Rules +- Answer questions directly. + +## Example +My resume: Open to remote work, willing to relocate. +Question: Are you open to remote work? +Yes + +Work Preferences: {resume_section} +Question: {question} +""" + +# Education Details Template +education_details_template = """ +Answer the following question based on the provided education details. + +## Rules +- Answer questions directly. +- If it seems likely that you have the experience, even if not explicitly defined, answer as if you have the experience. +- If unsure, respond with "I have no experience with that, but I learn fast" or "Not yet, but willing to learn." +- Keep the answer under 140 characters. + +## Example +My resume: Bachelor's degree in Computer Science with experience in Python. +Question: Do you have experience with Python? +Yes, I have experience with Python. + +Education Details: {resume_section} +Question: {question} +""" + +# Experience Details Template +experience_details_template = """ +Answer the following question based on the provided experience details. + +## Rules +- Answer questions directly. +- If it seems likely that you have the experience, even if not explicitly defined, answer as if you have the experience. +- If unsure, respond with "I have no experience with that, but I learn fast" or "Not yet, but willing to learn." +- Keep the answer under 140 characters. + +## Example +My resume: 3 years as a software developer with leadership experience. +Question: Do you have leadership experience? +Yes, I have 3 years of leadership experience. + +Experience Details: {resume_section} +Question: {question} +""" + +# Projects Template +projects_template = """ +Answer the following question based on the provided project details. + +## Rules +- Answer questions directly. +- If it seems likely that you have the experience, even if not explicitly defined, answer as if you have the experience. +- Keep the answer under 140 characters. + +## Example +My resume: Led the development of a mobile app, repository available. +Question: Have you led any projects? +Yes, led the development of a mobile app + +Projects: {resume_section} +Question: {question} +""" + +# Availability Template +availability_template = """ +Answer the following question based on the provided availability details. + +## Rules +- Answer questions directly. +- Keep the answer under 140 characters. +- Use periods only if the answer has multiple sentences. + +## Example +My resume: Available to start immediately. +Question: When can you start? +I can start immediately. + +Availability: {resume_section} +Question: {question} +""" + +# Salary Expectations Template +salary_expectations_template = """ +Answer the following question based on the provided salary expectations. + +## Rules +- Answer questions directly. +- Keep the answer under 140 characters. +- Use periods only if the answer has multiple sentences. + +## Example +My resume: Looking for a salary in the range of 50k-60k USD. +Question: What are your salary expectations? +55000. + +Salary Expectations: {resume_section} +Question: {question} +""" + +# Certifications Template +certifications_template = """ +Answer the following question based on the provided certifications. + +## Rules +- Answer questions directly. +- If it seems likely that you have the experience, even if not explicitly defined, answer as if you have the experience. +- If unsure, respond with "I have no experience with that, but I learn fast" or "Not yet, but willing to learn." +- Keep the answer under 140 characters. + +## Example +My resume: Certified in Project Management Professional (PMP). +Question: Do you have PMP certification? +Yes, I am PMP certified. + +Certifications: {resume_section} +Question: {question} +""" + +# Languages Template +languages_template = """ +Answer the following question based on the provided language skills. + +## Rules +- Answer questions directly. +- If it seems likely that you have the experience, even if not explicitly defined, answer as if you have the experience. +- If unsure, respond with "I have no experience with that, but I learn fast" or "Not yet, but willing to learn." +- Keep the answer under 140 characters. + +## Example +My resume: Fluent in Italian and English. +Question: What languages do you speak? +Fluent in Italian and English. + +Languages: {resume_section} +Question: {question} +""" + +# Interests Template +interests_template = """ +Answer the following question based on the provided interests. + +## Rules +- Answer questions directly. +- Keep the answer under 140 characters. +- Use periods only if the answer has multiple sentences. + +## Example +My resume: Interested in AI and data science. +Question: What are your interests? +AI and data science. + +Interests: {resume_section} +Question: {question} +""" + +summarize_prompt_template = """ +As a seasoned HR expert, your task is to identify and outline the key skills and requirements necessary for the position of this job. Use the provided job description as input to extract all relevant information. This will involve conducting a thorough analysis of the job's responsibilities and the industry standards. You should consider both the technical and soft skills needed to excel in this role. Additionally, specify any educational qualifications, certifications, or experiences that are essential. Your analysis should also reflect on the evolving nature of this role, considering future trends and how they might affect the required competencies. + +Rules: +Remove boilerplate text +Include only relevant information to match the job description against the resume + +# Analysis Requirements +Your analysis should include the following sections: +Technical Skills: List all the specific technical skills required for the role based on the responsibilities described in the job description. +Soft Skills: Identify the necessary soft skills, such as communication abilities, problem-solving, time management, etc. +Educational Qualifications and Certifications: Specify the essential educational qualifications and certifications for the role. +Professional Experience: Describe the relevant work experiences that are required or preferred. +Role Evolution: Analyze how the role might evolve in the future, considering industry trends and how these might influence the required skills. + +# Final Result: +Your analysis should be structured in a clear and organized document with distinct sections for each of the points listed above. Each section should contain: +This comprehensive overview will serve as a guideline for the recruitment process, ensuring the identification of the most qualified candidates. + +# Job Description: +``` +{text} +``` + +--- + +# Job Description Summary""" + + +coverletter_template = """ +The following is a resume, a job description, and an answered question using this information, being answered by the person who's resume it is (first person). + +## Rules +- Answer questions directly. +- If seems likely that you have the experience, even if is not explicitly defined, answer as if you have the experience. +- Find relations between the job description and the resume, and answer questions about that. +- Only add periods if the answer has multiple sentences/paragraphs. +- If the question is "cover letter," answer with a cover letter based on job_description, but using my resume details + +## Job Description: +``` +{job_description} +``` + +## My resume: +``` +{resume} +``` + +## Question: +{question} + +## """ + + +resume_stuff_template = """ +The following is a resume, personal data, and an answered question using this information, being answered by the person who's resume it is (first person). + +## Rules +- Answer questions directly +- If seems likely that you have the experience, even if is not explicitly defined, answer as if you have the experience +- If you cannot answer the question, answer things like "I have no experience with that, but I learn fast, very fast", "not yet, but I will learn"... +- The answer must not be longer than a tweet (140 characters) +- Only add periods if the answer has multiple sentences/paragraphs + +## Example 1 +My resume: I'm a software engineer with 10 years of experience in swift . +Question: What is your experience with swift? +10 years + +----- + +## My resume: +``` +{resume} +``` + +## Question: +{question} + +## """ + + +numeric_question_template = """The following is a resume and an answered question about the resume, being answered by the person who's resume it is (first person). + +## Rules +- Answer the question directly (only number). +- Regarding work experience just check the Experience Details -> Skills Acquired section. +- Regarding experience in general just check the section Experience Details -> Skills Acquired and also Education Details -> Skills Acquired. +- If it seems likely that you have the experience based on the resume, even if not explicitly stated on the resume, answer as if you have the experience. +- If you cannot answer the question, provide answers like "I have no experience with that, but I learn fast, very fast", "not yet, but I will learn". +- The answer must not be larger than a tweet (140 characters). + +## Example +My resume: I'm a software engineer with 10 years of experience on both swift and python. +Question: how much years experience with swift? +10 + +----- + +## My resume: +``` +{resume} +``` + +## Question: +{question} + +## """ + +options_template = """The following is a resume and an answered question about the resume, the answer is one of the options. + +## Rules +- Never choose the default/placeholder option, examples are: 'Select an option', 'None', 'Choose from the options below', etc. +- The answer must be one of the options. +- The answer must exclusively contain one of the options. + +## Example +My resume: I'm a software engineer with 10 years of experience on swift, python, C, C++. +Question: How many years of experience do you have on python? +Options: [1-2, 3-5, 6-10, 10+] +10+ + +----- + +## My resume: +``` +{resume} +``` + +## Question: +{question} + +## Options: +{options} + +## """ + + +try_to_fix_template = """\ +The objective is to fix the text of a form input on a web page. + +## Rules +- Use the error to fix the original text. +- The error "Please enter a valid answer" usually means the text is too large, shorten the reply to less than a tweet. +- For errors like "Enter a whole number between 3 and 30", just need a number. + +----- + +## Form Question +{question} + +## Input +{input} + +## Error +{error} + +## Fixed Input +""" + +func_summarize_prompt_template = """ + Following are two texts, one with placeholders and one without, the second text uses information from the first text to fill the placeholders. + + ## Rules + - A placeholder is a string like "[[placeholder]]". E.g. "[[company]]", "[[job_title]]", "[[years_of_experience]]"... + - The task is to remove the placeholders from the text. + - If there is no information to fill a placeholder, remove the placeholder, and adapt the text accordingly. + - No placeholders should remain in the text. + + ## Example + Text with placeholders: "I'm a software engineer engineer with 10 years of experience on [placeholder] and [placeholder]." + Text without placeholders: "I'm a software engineer with 10 years of experience." + + ----- + + ## Text with placeholders: + {text_with_placeholders} + + ## Text without placeholders:""" \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..04d8fe9 --- /dev/null +++ b/utils.py @@ -0,0 +1,68 @@ +import random +import time +from selenium import webdriver + +headless = False +chromeProfilePath = r"/home/.config/google-chrome/linkedin_profile" + +def is_scrollable(element): + """Controlla se un elemento è scrollabile.""" + scroll_height = element.get_attribute("scrollHeight") + client_height = element.get_attribute("clientHeight") + return int(scroll_height) > int(client_height) + +def scroll_slow(driver, scrollable_element, start=0, end=3600, step=100, reverse=False): + if reverse: + start, end = end, start + step = -step + + if step == 0: + raise ValueError("Step cannot be zero.") + + # Script di scrolling che utilizza scrollTop + script_scroll_to = "arguments[0].scrollTop = arguments[1];" + + try: + if scrollable_element.is_displayed(): + if not is_scrollable(scrollable_element): + print("The element is not scrollable.") + return + if (step > 0 and start >= end) or (step < 0 and start <= end): + print("No scrolling will occur due to incorrect start/end values.") + return + for position in range(start, end, step): + try: + driver.execute_script(script_scroll_to, scrollable_element, position) + except Exception as e: + print(f"Error during scrolling: {e}") + time.sleep(random.uniform(1.0, 2.6)) + driver.execute_script(script_scroll_to, scrollable_element, end) + time.sleep(1) + else: + print("The element is not visible.") + except Exception as e: + print(f"Exception occurred: {e}") + +def chromeBrowserOptions(): + options = webdriver.ChromeOptions() + options.add_argument('--no-sandbox') + options.add_argument("--ignore-certificate-errors") + options.add_argument("--disable-extensions") + options.add_argument('--disable-gpu') + options.add_argument('--disable-dev-shm-usage') + options.add_argument('--remote-debugging-port=9222') + if(headless): + options.add_argument("--headless") + options.add_argument("--start-maximized") + options.add_argument("--disable-blink-features") + options.add_argument("--disable-blink-features=AutomationControlled") + options.add_experimental_option('useAutomationExtension', False) + options.add_experimental_option("excludeSwitches", ["enable-automation"]) + if(len(chromeProfilePath)>0): + initialPath = chromeProfilePath[0:chromeProfilePath.rfind("/")] + profileDir = chromeProfilePath[chromeProfilePath.rfind("/")+1:] + options.add_argument('--user-data-dir=' +initialPath) + options.add_argument("--profile-directory=" +profileDir) + else: + options.add_argument("--incognito") + return options