Spaces:
Sleeping
Sleeping
import os | |
import time | |
from langchain_openai import ChatOpenAI | |
from langchain.prompts import PromptTemplate | |
from langchain.agents import initialize_agent, AgentType | |
from langchain.tools import Tool | |
from dotenv import load_dotenv | |
from langchain_core.messages import HumanMessage | |
from prompts.mh_clarification import clarification_prompt | |
# Load environment variables | |
load_dotenv() | |
# Set environment variables for model API key and model type | |
os.environ.setdefault("DSP_CACHEBOOL", "false") | |
# Get API key | |
api_key = os.getenv("OPENAI_API_KEY") | |
if not api_key: | |
raise ValueError("OPENAI_API_KEY environment variable is not set") | |
# Initialize the chat model | |
model = ChatOpenAI( | |
model=os.getenv("MODEL", "gpt-3.5-turbo"), | |
openai_api_key=api_key, | |
temperature=0.0, | |
max_tokens=4000 | |
) | |
# Define a tool to process job descriptions | |
class JobDescriptionProcessor(Tool): | |
def __init__(self, name: str, description: str, func): | |
super().__init__(name=name, func=func, description=description) | |
def _run(self, input: str): | |
try: | |
# Extract key aspects from the job description | |
aspects = self.func(input) | |
return aspects | |
except Exception as e: | |
return f"Error processing job description: {str(e)}" | |
# Define a function to extract key aspects from job description | |
def extract_key_aspects(jd: str) -> str: | |
try: | |
# Create a prompt for extracting key aspects | |
prompt = f"""Extract the key aspects from this job description. Focus on: | |
1. Position title | |
2. Required qualifications | |
3. Experience requirements | |
4. Key skills | |
5. Must-have requirements | |
Job Description: | |
{jd} | |
Format the output as a clear list of key aspects.""" | |
# Get response from the model | |
response = model.invoke([HumanMessage(content=prompt)]) | |
return response.content | |
except Exception as e: | |
return f"Error extracting key aspects: {str(e)}" | |
# Define a tool to process checkpoints and resume | |
class ClarificationProcessor(Tool): | |
def __init__(self, name: str, description: str, func): | |
super().__init__(name=name, func=func, description=description) | |
def _run(self, input: str): | |
# Extract checkpoints and resume from the input string | |
try: | |
# Split by "Resume:" and ensure we have both parts | |
parts = input.split("Resume:") | |
if len(parts) != 2: | |
return "Error: Input must contain both checkpoints and resume sections" | |
# Extract checkpoints and resume, removing any extra whitespace | |
checkpoints = parts[0].replace("Checkpoints:", "").strip() | |
resume = parts[1].strip() | |
if not checkpoints or not resume: | |
return "Error: Both checkpoints and resume sections must not be empty" | |
return self.func(checkpoints, resume) | |
except Exception as e: | |
return f"Error processing input: {str(e)}" | |
# Define a function to generate clarifications based on checkpoints and resume | |
def generate_clarifications(checkpoints: str, resume: str) -> str: | |
try: | |
# Create the prompt | |
prompt_text = clarification_prompt.format(checkpoints=checkpoints, resume=resume) | |
# Get response from the model | |
response = model.invoke([HumanMessage(content=prompt_text)]) | |
return response.content | |
except Exception as e: | |
return f"Error generating clarifications: {str(e)}" | |
# Define the agent tools | |
tools = [ | |
JobDescriptionProcessor( | |
name="JobDescriptionProcessor", | |
description="Extract key aspects from a job description.", | |
func=extract_key_aspects, | |
), | |
ClarificationProcessor( | |
name="ClarificationProcessor", | |
description="Generate clarifications based on the provided checkpoints and resume.", | |
func=generate_clarifications, | |
), | |
] | |
# Initialize the LangChain agent | |
agent = initialize_agent( | |
tools, model, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True | |
) | |