File size: 5,257 Bytes
37185e0
 
 
 
cdbe688
c400028
37185e0
 
c400028
 
 
 
 
 
 
 
052a8fc
e3f43f3
c400028
 
 
e3f43f3
c400028
37185e0
87ccea1
 
3be9484
37185e0
c0d54a6
37185e0
 
3be9484
c3d82ad
87ccea1
c3d82ad
 
 
 
 
 
 
 
 
 
 
87ccea1
c0d54a6
3be9484
37185e0
3be9484
 
 
 
 
 
 
37185e0
 
 
 
 
3be9484
 
37185e0
c0d54a6
 
37185e0
 
2bd7b24
09696f6
c400028
 
 
 
09696f6
2bd7b24
 
87ccea1
2bd7b24
12d8a5c
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
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"

# Helper function to call Groq Cloud LLM API to generate and correct the email
def generate_and_correct_email(bio, company_name, role):
    url = "https://api.groq.com/openai/v1/chat/completions"  # Updated API URL for Groq Cloud
    headers = {
        "Authorization": f"Bearer {groq_api_key}",  # Use the API key securely from environment
        "Content-Type": "application/json",
    }
    
    # Updated prompt to focus on mapping skills to job requirements and suitability
    prompt = f"""
    Write a professional email applying for the {role} position at {company_name}. 
    Use this bio: {bio}.
    
    The email should focus on how the candidate's skills and experience align with the job requirements, 
    highlighting why they are a great fit for the role. 
    Avoid overly bragging about accomplishments and focus more on how the candidate can meet the company's needs.
    Structure the email as follows: 
    - Introduction
    - Skills and experience directly related to the job requirements
    - Why the candidate is the most suitable person for the role
    - Conclusion
    """
    
    # Construct the data payload for the API request
    data = {
        "messages": [
            {
                "role": "user",
                "content": prompt
            }
        ],
        "model": "llama3-8b-8192"  # Use the appropriate model from Groq Cloud
    }
    
    response = requests.post(url, headers=headers, json=data)
    
    if response.status_code == 200:
        # Extract the generated email content from the API response
        return response.json()["choices"][0]["message"]["content"].strip()
    else:
        # Print or log the error for debugging
        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: Generate the email using Groq Cloud LLM
    generated_email = generate_and_correct_email(bio, company_name, role)
    
    # Step 3: 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()