Spaces:
Sleeping
Sleeping
| # app.py | |
| import gradio as gr | |
| import requests | |
| import os # Import os to access environment variables | |
| def optimize_resume_with_explanation(resume, job_description): | |
| # Get the Gemini API key from Hugging Face secrets (environment variable) | |
| GEMINI_API_KEY = os.environ.get("api_key") | |
| if not GEMINI_API_KEY: | |
| return "Error: Gemini API key not found in environment variables.", "" | |
| # Gemini API endpoint | |
| url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent" | |
| # Prepare the prompt for the AI model | |
| prompt = ( | |
| "You are a professional resume writer. " | |
| "Given the following resume and job description, do two things:\n" | |
| "1. Rewrite the resume to be optimized for the job. " | |
| "Keep the formatting clear and professional. " | |
| "Only output the improved resume in a section titled 'Optimized Resume'.\n" | |
| "2. In a section titled 'Explanation of Modifications', explain what changes you made to the resume and why, " | |
| "focusing on how the modifications help better match the job description.\n\n" | |
| f"Resume:\n{resume}\n\n" | |
| f"Job Description:\n{job_description}\n" | |
| ) | |
| # Prepare the request payload for Gemini API | |
| data = { | |
| "contents": [ | |
| { | |
| "parts": [ | |
| {"text": prompt} | |
| ] | |
| } | |
| ] | |
| } | |
| # Set the headers, including the API key for authentication | |
| headers = { | |
| "Content-Type": "application/json", | |
| "x-goog-api-key": GEMINI_API_KEY | |
| } | |
| # Send the POST request to Gemini API | |
| response = requests.post(url, headers=headers, json=data) | |
| # If the request is successful, extract and return the optimized resume and explanation | |
| if response.status_code == 200: | |
| result = response.json() | |
| try: | |
| full_response = result["candidates"][0]["content"]["parts"][0]["text"] | |
| # Split the response into the two sections | |
| optimized_resume = "" | |
| explanation = "" | |
| if "Optimized Resume" in full_response and "Explanation of Modifications" in full_response: | |
| parts = full_response.split("Explanation of Modifications") | |
| optimized_resume_section = parts[0] | |
| explanation_section = parts[1] | |
| optimized_resume = optimized_resume_section.replace("Optimized Resume", "").strip(": \n") | |
| explanation = explanation_section.strip(": \n") | |
| else: | |
| optimized_resume = "Could not extract optimized resume. Please try again." | |
| explanation = full_response | |
| return optimized_resume, explanation | |
| except (KeyError, IndexError): | |
| return "Error: Unexpected response format from Gemini API.", "" | |
| else: | |
| return f"Error: {response.status_code} - {response.text}", "" | |
| # Create the Gradio interface | |
| with gr.Blocks() as demo: | |
| gr.Markdown( | |
| """ | |
| # AI Resume Optimizer | |
| Paste your resume and the job description below. | |
| The AI will rewrite your resume to better match the job, and explain what it changed and why! | |
| """ | |
| ) | |
| resume_input = gr.Textbox( | |
| label="Paste your Resume", | |
| lines=15, | |
| placeholder="Paste your resume here..." | |
| ) | |
| job_desc_input = gr.Textbox( | |
| label="Paste the Job Description", | |
| lines=10, | |
| placeholder="Paste the job description here..." | |
| ) | |
| optimized_resume_output = gr.Textbox( | |
| label="Optimized Resume", | |
| lines=15 | |
| ) | |
| explanation_output = gr.Textbox( | |
| label="Explanation of Modifications", | |
| lines=10 | |
| ) | |
| submit_btn = gr.Button("Optimize Resume") | |
| submit_btn.click( | |
| fn=optimize_resume_with_explanation, | |
| inputs=[resume_input, job_desc_input], | |
| outputs=[optimized_resume_output, explanation_output] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |