diff --git a/data_folder/config.yaml b/data_folder/config.yaml index 1cbe9ed..2051ec8 100644 --- a/data_folder/config.yaml +++ b/data_folder/config.yaml @@ -1,6 +1,6 @@ remote: [true/false] -experienceLevel: +experience_level: internship: [true/false] entry: [true/false] associate: [true/false] @@ -31,7 +31,7 @@ locations: - Country1 - Country2 -applyOnceAtCompany: [true/false] +apply_once_at_company: [true/false] distance: 100 @@ -39,7 +39,7 @@ company_blacklist: - Company1 - Company2 -titleBlacklist: +title_blacklist: - word1 - word2 diff --git a/data_folder_example/config.yaml b/data_folder_example/config.yaml index b9ccefa..6b2da50 100644 --- a/data_folder_example/config.yaml +++ b/data_folder_example/config.yaml @@ -1,6 +1,6 @@ remote: true -experienceLevel: +experience_level: internship: true entry: true associate: true @@ -29,15 +29,21 @@ positions: locations: - USA -applyOnceAtCompany: [true/false] +apply_once_at_company: [true/false] distance: 100 -companyBlacklist: +company_blacklist: - Noir - Crossover -titleBlacklist: +title_blacklist: + - word1 + - word2 + +job_applicants_threshold: + min_applicants: 0 + max_applicants: 100 llm_model_type: openai llm_model: 'gpt-4o' diff --git a/main.py b/main.py index afa9044..047724b 100644 --- a/main.py +++ b/main.py @@ -9,7 +9,7 @@ from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager from selenium.common.exceptions import WebDriverException, TimeoutException from lib_resume_builder_AIHawk import Resume,StyleManager,FacadeManager,ResumeGenerator -from src.utils import chromeBrowserOptions +from src.utils import chrome_browser_options from src.gpt import GPTAnswerer from src.linkedIn_authenticator import LinkedInAuthenticator from src.linkedIn_bot_facade import LinkedInBotFacade @@ -149,7 +149,7 @@ class FileManager: def init_browser() -> webdriver.Chrome: try: - options = chromeBrowserOptions() + options = chrome_browser_options() service = ChromeService(ChromeDriverManager().install()) return webdriver.Chrome(service=service, options=options) except Exception as e: diff --git a/requirements.txt b/requirements.txt index 03290b7..de21428 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,4 +13,12 @@ webdriver-manager==4.0.2 click git+https://github.com/feder-cr/lib_resume_builder_AIHawk.git linkedin-api -pdfminer.six==20221105 \ No newline at end of file +pdfminer.six==20221105 +inputimeout==1.0.4 +langchain-ollama==0.1.3 +langchain-anthropic==0.1.3 +jsonschema==4.23.0 +jsonschema-specifications==2023.12.1 +httpx~=0.27.2 +python-dotenv~=1.0.1 +PyYAML~=6.0.2 diff --git a/src/gpt.py b/src/gpt.py index 4107797..5871e9e 100644 --- a/src/gpt.py +++ b/src/gpt.py @@ -79,7 +79,7 @@ class AIAdapter: elif llm_model_type == "ollama": return OllamaModel(api_key, llm_model, llm_api_url) else: - raise ValueError(f"Unsupported model type: {model_type}") + raise ValueError(f"Unsupported model type: {llm_model_type}") def invoke(self, prompt: str) -> str: return self.model.invoke(prompt) @@ -204,7 +204,7 @@ class LoggerChatModel: while True: try: logger.debug("Attempting to call the LLM with messages") - reply = self.llm(messages) + reply = self.llm.invoke(messages) logger.debug("LLM response received: %s", reply) parsed_reply = self.parse_llmresult(reply) diff --git a/src/linkedIn_job_manager.py b/src/linkedIn_job_manager.py index 9308708..1e1db0a 100644 --- a/src/linkedIn_job_manager.py +++ b/src/linkedIn_job_manager.py @@ -47,10 +47,10 @@ class LinkedInJobManager: def set_parameters(self, parameters): logger.debug("Setting parameters for LinkedInJobManager") self.company_blacklist = parameters.get('company_blacklist', []) or [] - self.title_blacklist = parameters.get('titleBlacklist', []) or [] + self.title_blacklist = parameters.get('title_blacklist', []) or [] self.positions = parameters.get('positions', []) self.locations = parameters.get('locations', []) - self.apply_once_at_company = parameters.get('applyOnceAtCompany', False) + self.apply_once_at_company = parameters.get('apply_once_at_company', False) self.base_search_url = self.get_base_search_url(parameters) self.seen_jobs = [] @@ -120,8 +120,8 @@ class LinkedInJobManager: if time_left > 0: try: user_input = inputimeout( - prompt=f"Sleeping for {time_left} seconds. Press 'y' to skip waiting. Timeout 10 seconds : ", - timeout=10).strip().lower() + prompt=f"Sleeping for {time_left} seconds. Press 'y' to skip waiting. Timeout 60 seconds : ", + timeout=60).strip().lower() except TimeoutOccurred: user_input = '' # No input after timeout if user_input == 'y': @@ -138,8 +138,8 @@ class LinkedInJobManager: sleep_time = random.randint(5, 34) try: user_input = inputimeout( - prompt=f"Sleeping for {sleep_time / 60} minutes. Press 'y' to skip waiting. Timeout 10 seconds : ", - timeout=10).strip().lower() + prompt=f"Sleeping for {sleep_time / 60} minutes. Press 'y' to skip waiting. Timeout 60 seconds : ", + timeout=60).strip().lower() except TimeoutOccurred: user_input = '' # No input after timeout if user_input == 'y': @@ -160,8 +160,8 @@ class LinkedInJobManager: if time_left > 0: try: user_input = inputimeout( - prompt=f"Sleeping for {time_left} seconds. Press 'y' to skip waiting. Timeout 10 seconds : ", - timeout=10).strip().lower() + prompt=f"Sleeping for {time_left} seconds. Press 'y' to skip waiting. Timeout 60 seconds : ", + timeout=60).strip().lower() except TimeoutOccurred: user_input = '' # No input after timeout if user_input == 'y': @@ -179,7 +179,7 @@ class LinkedInJobManager: try: user_input = inputimeout( prompt=f"Sleeping for {sleep_time / 60} minutes. Press 'y' to skip waiting: ", - timeout=10).strip().lower() + timeout=60).strip().lower() except TimeoutOccurred: user_input = '' # No input after timeout if user_input == 'y': @@ -370,7 +370,7 @@ class LinkedInJobManager: url_parts = [] if parameters['remote']: url_parts.append("f_CF=f_WRA") - experience_levels = [str(i + 1) for i, (level, v) in enumerate(parameters.get('experienceLevel', {}).items()) if + experience_levels = [str(i + 1) for i, (level, v) in enumerate(parameters.get('experience_level', {}).items()) if v] if experience_levels: url_parts.append(f"f_E={','.join(experience_levels)}") @@ -429,7 +429,6 @@ class LinkedInJobManager: link_seen = link in self.seen_jobs is_blacklisted = title_blacklisted or company_blacklisted or link_seen logger.debug("Job blacklisted status: %s", is_blacklisted) - return is_blacklisted return title_blacklisted or company_blacklisted or link_seen diff --git a/src/utils.py b/src/utils.py index f4e4d4a..0cd2c87 100644 --- a/src/utils.py +++ b/src/utils.py @@ -8,7 +8,7 @@ from selenium import webdriver log_file = "app_log.log" logging.basicConfig( - level=logging.DEBUG, + level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler(log_file, mode='a', encoding='utf-8'), @@ -22,7 +22,7 @@ file_handler = logging.FileHandler(log_file, mode='a', encoding='utf-8') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(formatter) logger.addHandler(file_handler) -logger.setLevel(logging.DEBUG) +logger.setLevel(logging.INFO) chromeProfilePath = os.path.join(os.getcwd(), "chrome_profile", "linkedin_profile")