import logging import os from pathlib import Path from dotenv import load_dotenv from crewai import Crew from langchain_groq import ChatGroq import gradio as gr from resume import extract_text_from_file from crew import FormFillingAgents, FormFillingTasks def build_gradio_app(): """Builds the Gradio interface for the form-filling app.""" logging.basicConfig(level=logging.INFO) # Define input elements resume_input = gr.File(label="Upload Resume", file_types=[".pdf", ".docx", ".txt"]) job_desc_input = gr.Textbox(label="Job Description", placeholder="Enter job description here") questions_input = gr.Textbox(label="Questions", placeholder="Enter questions, separated by commas") api_key_input = gr.Textbox(label="GROQ API Key", placeholder="Enter your GROQ API Key") # Define output elements answers = gr.Textbox(label="Tailored Answer to the Question Based on Your Resume", interactive=False) # Processing function def process_inputs(api_key, resume_input, job_desc, questions): try: # Debugging logging.info("Received API Key, Resume, Job Description, and Questions.") logging.info(f"API Key: {api_key}") # Save API key to .env file it the user has session active if api_key: env_path = Path(__file__).parent / ".env" with open(env_path, "w") as env_file: env_file.write(f"GROQ_API_KEY={api_key}") logging.info("API Key saved to .env file.") else: logging.warning("No API Key provided.") load_dotenv() # Initialize language model llm = ChatGroq( model="groq/llama-3.1-8b-instant", api_key=os.getenv("GROQ_API_KEY"), ) logging.info("Language model initialized successfully.") # Extract text from resume resume_text = extract_text_from_file(resume_input) logging.info("Resume text extracted.") # Initialize agents and tasks agents = FormFillingAgents() analysis_agent = agents.resume_analysis_agent(llm) qa_agent = agents.question_answering_agent(llm) tasks = FormFillingTasks() profile_task = tasks.profile_analysis_task(analysis_agent, resume_text, job_desc) qa_task = tasks.question_answering_task(qa_agent, questions) # Run Crew pipeline crew = Crew( agents=[analysis_agent, qa_agent], tasks=[profile_task, qa_task], verbose=True, max_rpm=29, ) results = crew.kickoff() logging.info("Pipeline executed successfully.") return str(results) except Exception as e: logging.error(f"Error during processing: {e}") return f"Error during processing: {str(e)}" # Gradio interface interface = gr.Interface( fn=process_inputs, inputs=[api_key_input, resume_input, job_desc_input, questions_input], outputs=[answers], title="Form Filling Assistant", description="Upload a resume, provide a job description, input API key, and ask questions to get tailored responses.", ) interface.launch() if __name__ == '__main__': build_gradio_app()