File size: 7,081 Bytes
37185e0 cdbe688 c400028 37185e0 c400028 052a8fc e3f43f3 c400028 e3f43f3 c400028 37185e0 bc5de14 0724750 bc5de14 0724750 bc5de14 0724750 bc5de14 0724750 87ccea1 bc5de14 0724750 37185e0 0724750 37185e0 3be9484 bc5de14 87ccea1 bc5de14 0724750 bc5de14 0724750 bc5de14 87ccea1 c0d54a6 3be9484 37185e0 3be9484 0724750 37185e0 3be9484 37185e0 c0d54a6 37185e0 2bd7b24 09696f6 c400028 bc5de14 0724750 bc5de14 2bd7b24 0724750 bc5de14 2bd7b24 0724750 c400028 2bd7b24 c3d82ad 12d8a5c 87ccea1 2bd7b24 12d8a5c c400028 12d8a5c 2bd7b24 09696f6 2bd7b24 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
import gradio as gr
import requests
import os
# Load API keys securely from environment variables
proxycurl_api_key = os.getenv("PROXYCURL_API_KEY") # Add your Proxycurl API key to your environment variables
groq_api_key = os.getenv("GROQ_CLOUD_API_KEY")
# Function to use Proxycurl API to get the LinkedIn profile data
def get_linkedin_profile_via_proxycurl(linkedin_profile_url):
headers = {
"Authorization": f"Bearer {proxycurl_api_key}",
}
url = f"https://nubela.co/proxycurl/api/v2/linkedin?url={linkedin_profile_url}"
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
bio = data.get("summary", "No bio available")
return bio
else:
return "Error: Unable to fetch LinkedIn profile"
# Function to get company information via Proxycurl Company API
def get_company_info(company_name):
headers = {
"Authorization": f"Bearer {proxycurl_api_key}",
}
url = f"https://nubela.co/proxycurl/api/v2/linkedin/company?company_name={company_name}"
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
company_info = data.get("description", "No detailed company info available.")
return company_info
else:
return "Error: Unable to fetch company information."
# Placeholder for role description; could be enhanced to scrape or fetch real role data
def get_role_description(role_name, company_name):
return f"The role of {role_name} at {company_name} involves..."
# Helper function to call Groq Cloud LLM API to generate and correct the email
def generate_and_correct_email(bio, company_name, role, company_info, role_description):
url = "https://api.groq.com/openai/v1/chat/completions"
headers = {
"Authorization": f"Bearer {groq_api_key}",
"Content-Type": "application/json",
}
# New, detailed prompt to gather information about the company and role, and generate a compelling email
prompt = f"""
Write a professional and tailored email applying for the {role} position at {company_name}.
The candidate’s bio is: {bio}.
The email should:
- Be professional, engaging, and customized to the company's culture and the role’s requirements.
- Include relevant company details: {company_info}.
- Highlight the candidate’s skills and experience, mapping them directly to the job requirements. The role description is: {role_description}.
- Emphasize how the candidate’s background aligns with the company’s values and mission.
- Attract the company's attention by focusing on how the candidate's background can bring value to the role and the company's future goals.
- Use a tone that is persuasive but not overly promotional.
- End with a strong call to action, encouraging the company to schedule an interview to discuss how the candidate can contribute to their success.
Structure the email as follows:
1. **Introduction**: Briefly introduce the candidate and state the role they are applying for.
2. **Skills & Experience**: Creatively map the candidate’s skills and experience to the job's key requirements and how these will benefit the company.
3. **Alignment with the Company**: Emphasize how the candidate’s background fits with the company's mission, values, and goals.
4. **Call to Action**: Encourage the company to schedule an interview to further discuss the candidate’s fit for the role.
The writing style should be professional, concise, and leave a strong, memorable impression on the company.
"""
# Construct the data payload for the API request
data = {
"messages": [
{
"role": "user",
"content": prompt
}
],
"model": "llama3-8b-8192"
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"].strip()
else:
print(f"Error: {response.status_code}, {response.text}")
return "Error generating email. Please check your API key or try again later."
# Main function to create the email and allow for saving, editing, or copying
def create_email(name, company_name, role, email, phone, linkedin_profile_url):
# Step 1: Fetch LinkedIn profile using Proxycurl API if LinkedIn URL is provided
if linkedin_profile_url:
bio = get_linkedin_profile_via_proxycurl(linkedin_profile_url)
else:
bio = f"{name} is a professional." # Default bio if no LinkedIn URL is provided
# Step 2: Fetch company information and role description
company_info = get_company_info(company_name)
role_description = get_role_description(role, company_name)
# Step 3: Generate the email using Groq Cloud LLM
generated_email = generate_and_correct_email(bio, company_name, role, company_info, role_description)
# Step 4: Add the user's email, phone number, and LinkedIn profile to the signature
signature = f"\n\nBest regards,\n{name}\nEmail: {email}\nPhone: {phone}\nLinkedIn: {linkedin_profile_url if linkedin_profile_url else 'Not provided'}"
# Ensure the body doesn't include any redundant 'Best regards' and just append our signature
if "Best regards" in generated_email:
generated_email = generated_email.split("Best regards")[0].strip()
# Return the final polished email with the signature
return generated_email + signature
# Define interface with Gradio
def gradio_ui():
# Define inputs
name_input = gr.Textbox(label="Name", placeholder="Enter your name")
company_name_input = gr.Textbox(label="Company Name", placeholder="Enter the name of the company you are applying to")
role_input = gr.Textbox(label="Role", placeholder="Enter the role you are applying for")
email_input = gr.Textbox(label="Email Address", placeholder="Enter your email address")
phone_input = gr.Textbox(label="Phone Number", placeholder="Enter your phone number")
linkedin_input = gr.Textbox(label="LinkedIn URL", placeholder="Enter your LinkedIn profile URL") # New field for LinkedIn URL
# Define output for the generated email
email_output = gr.Textbox(label="Generated Email", placeholder="Your generated email will appear here", lines=10)
# Create the Gradio interface
demo = gr.Interface(
fn=create_email, # Function to call when the user submits
inputs=[name_input, company_name_input, role_input, email_input, phone_input, linkedin_input],
outputs=[email_output],
title="Email Writing AI Agent",
description="Generate a professional email for a job application by providing your basic info.",
allow_flagging="never" # Disable flagging
)
# Launch the Gradio app
demo.launch()
# Start the Gradio app when running the script
if __name__ == "__main__":
gradio_ui()
|