File size: 4,034 Bytes
2a6f904
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe61726
2a6f904
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
from openai import OpenAI

# Initialize OpenAI client
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# Streaming response function
def respond(
    message,
    history: list[tuple[str, str]],
    system_message,
    role,
    ad,
    education,
    experience,
    skills,
    ask_for_skills_suggestions,
    max_tokens,
    temperature,
    top_p,
):
    # Construct the system message
    enhanced_system_message = (
        f"{system_message}\n\n"
        f"Role, Industry and Type of Organization: {role}\n"
        f"Job Ad Responsibilities and Key Requirements: {ad}\n"
        f"Education, Training and Certifications: {education}\n"
        f"Work Experience: {experience}\n"
        f"Skills: {skills}\n"
    )

    if ask_for_skills_suggestions:
        enhanced_system_message += " The user is also asking for suggestions of skills related to this role."

    # Compose the conversation
    messages = [{"role": "system", "content": enhanced_system_message}]
    for user_msg, assistant_msg in history:
        if user_msg:
            messages.append({"role": "user", "content": user_msg})
        if assistant_msg:
            messages.append({"role": "assistant", "content": assistant_msg})
    messages.append({"role": "user", "content": message})

    # Generate and stream response
    response_text = ""
    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",  # use "gpt-4o-mini" when officially available
            messages=messages,
            max_tokens=max_tokens,
            temperature=temperature,
            top_p=top_p,
            stream=True,
        )
        for chunk in response:
            if chunk.choices and chunk.choices[0].delta.content:
                token = chunk.choices[0].delta.content
                response_text += token
                yield response_text
    except Exception as e:
        yield f"❌ An error occurred: {str(e)}"

# Gradio interface
demo = gr.ChatInterface(
    fn=respond,
    additional_inputs=[
        gr.Textbox(
            value="You are a friendly Chatbot, a career coach and a talented copywriter. You are trying to help a user customize their resume according to a specific role, employer organization and job Ad - based on user input. Include tips if some items are missing.",
            label="Instructions to Bot",
        ),
        gr.Textbox(label="Role, Industry and Employer", placeholder="Describe the role, industry and employer you are applying to."),
        gr.Textbox(
            label="Job Ad Responsibilities and Key Requirements",
            placeholder="Describe the Responsibilities and Key Requirements advertised in the job ad",
        ),
        gr.Textbox(
            label="Your Education, certifications, training, etc.",
            placeholder="Describe your education, training, certifications and professional designations",
        ),
        gr.Textbox(
            label="Your Work Experience",
            placeholder="Describe your work experience, previous responsibilities and key career achievements",
        ),
        gr.Textbox(label="Skills", placeholder="List your key skills that match this job or ask for suggestions"),
        gr.Checkbox(label="Ask for Skills Suggestions", value=False),
        gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
    ],
    title="Resumize – Customize your CV!",
    description="This app customizes your resume to best suit a specific role, industry, employer and job ad. Based on your input. Powered by OpenAI GPT-4o, design thinking, and domain expertise. Developed by wn. Disclaimer: AI can make mistakes. Use with caution and at your own risk!",
    type="messages",  # Required for Gradio ChatInterface streaming
)

if __name__ == "__main__":
    demo.launch()