import os import json from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage # Load environment variables load_dotenv() # File paths PROFESSIONS_FILE = "professions.json" TYPES_FILE = "types.json" OUTPUT_FILE = "all_questions.json" def generate_questions(profession, interview_type, description, max_questions): """ Generates interview questions using the OpenAI API based on profession, type, and description. """ openai_api_key = os.getenv("OPENAI_API_KEY") if not openai_api_key: raise RuntimeError( "OpenAI API key not found. Please add it to your .env file as OPENAI_API_KEY." ) chat = ChatOpenAI( openai_api_key=openai_api_key, model="gpt-4", temperature=0.7, max_tokens=750 ) messages = [ SystemMessage( content="You are an expert interviewer who generates concise technical interview questions for HR interviews. " "Answer only with questions. Do not number the questions. Each question should be a separate string. " "The questions should be appropriate for " f"the {interview_type} stage of the interview process and relevant to the {profession} profession." f" Generate no more than {max_questions} questions." ), HumanMessage( content=f"Generate interview questions for the role of '{profession}'. " f"Interview Type: '{interview_type}'. " f"Description of the role: '{description}'. " ), ] try: print(f"[DEBUG] Sending request to OpenAI for {profession} - {interview_type}") response = chat.invoke(messages) # Directly split the response into individual questions without numbering questions = [q.strip() for q in response.content.split("\n") if q.strip()] except Exception as e: print(f"[ERROR] Failed to generate questions: {e}") questions = ["An error occurred while generating questions."] return questions def load_json_data(filepath): """Loads data from a JSON file.""" with open(filepath, "r") as f: return json.load(f) def save_questions_to_file(output_file, all_questions, overwrite=True): """ Saves the questions to the specified JSON file. Args: output_file: The path to the output JSON file. all_questions: The list of question dictionaries to save. overwrite: If True, overwrites the file if it exists. If False, appends to the file. """ if overwrite: with open(output_file, "w") as outfile: json.dump(all_questions, outfile, indent=4) else: try: existing_questions = load_json_data(output_file) except (FileNotFoundError, json.JSONDecodeError): existing_questions = [] existing_questions.extend(all_questions) with open(output_file, "w") as outfile: json.dump(existing_questions, outfile, indent=4) def main(overwrite_output=True): """ Main function to generate and save interview questions. """ try: professions_data = load_json_data(PROFESSIONS_FILE) types_data = load_json_data(TYPES_FILE) except FileNotFoundError as e: print(f"Error: File not found - {e}") return except json.JSONDecodeError as e: print(f"Error: Invalid JSON format in file - {e}") return all_questions = [] for profession_info in professions_data: profession = profession_info["profession"] description = profession_info["description"] for interview_type_info in types_data: interview_type = interview_type_info["type"] max_questions = interview_type_info.get("max_questions", 5) questions = generate_questions( profession, interview_type, description, max_questions ) all_questions.append( { "profession": profession, "interview_type": interview_type, "description": description, "max_questions": max_questions, "questions": questions, } ) # Save the questions, either overwriting or appending based on the parameter save_questions_to_file(OUTPUT_FILE, all_questions, overwrite=overwrite_output) print(f"[INFO] Questions saved to {OUTPUT_FILE}") if __name__ == "__main__": # Set overwrite_output to True to overwrite the existing file, False to append main(overwrite_output=True)