File size: 3,820 Bytes
397e766
 
20eae19
397e766
 
 
 
 
 
a08d191
20eae19
 
 
 
 
 
 
 
 
b7bd810
20eae19
 
a08d191
 
397e766
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b7bd810
156f08c
397e766
a08d191
20eae19
 
 
 
 
 
1665597
 
 
20eae19
a08d191
4c6b01f
 
 
a08d191
4c6b01f
 
 
58be8e9
4c6b01f
a08d191
4c6b01f
 
 
 
 
1665597
a08d191
 
 
 
1665597
4c6b01f
a08d191
397e766
 
 
4c6b01f
 
 
 
 
 
 
 
397e766
6d1db57
397e766
75ef3f7
397e766
 
 
 
 
 
 
 
 
 
4c6b01f
 
 
 
 
a08d191
397e766
20eae19
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
import gradio as gr
from huggingface_hub import InferenceClient
import fitz  # PyMuPDF

"""
For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
"""
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")


def extract_text_from_pdf(pdf_path):
    # Open the provided PDF file
    doc = fitz.open(pdf_path)
    text = ""

    # Extract text from each page
    for page in doc:
        text += page.get_text()

    doc.close()  # Ensure the PDF file is closed
    return text


def respond(message, history, system_message, max_tokens, temperature, top_p):
    messages = [{"role": "system", "content": system_message}]

    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})

    messages.append({"role": "user", "content": message})

    response = ""

    for message in client.chat_completion(
        messages,
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    ):
        token = message.choices[0].delta.content
        response += token
        print(f"Token: {token}")  # Debugging statement to trace tokens
        yield response  # Yield the complete response up to this point


def process_resume_and_respond(pdf_file, message, history, system_message, max_tokens, temperature, top_p):
    # Extract text from the PDF file
    resume_text = extract_text_from_pdf(pdf_file.name)
    # Combine the resume text with the user message
    combined_message = f"Resume:\n{resume_text}\n\nUser message:\n{message}"
    # Respond using the combined message
    response_gen = respond(combined_message, history, system_message, max_tokens, temperature, top_p)
    response = "".join([token for token in response_gen])
    return response


# Store the uploaded PDF content globally
uploaded_resume_text = ""


def upload_resume(pdf_file):
    global uploaded_resume_text
    uploaded_resume_text = extract_text_from_pdf(pdf_file.name)
    return "Resume uploaded successfully! now click on chat with job advisor right above this tab to start chatting!"


def respond_with_resume(message, history, system_message, max_tokens, temperature, top_p):
    global uploaded_resume_text
    # Combine the uploaded resume text with the user message
    combined_message = f"Resume:\n{uploaded_resume_text}\n\nUser message:\n{message}"
    # Respond using the combined message
    response_gen = respond(combined_message, history, system_message, max_tokens, temperature, top_p)
    # Collect all tokens generated
    response = ""
    for token in response_gen:
        response = token  # Update the response with the latest token
    return response


"""
For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
"""
upload_interface = gr.Interface(
    upload_resume,
    inputs=gr.File(label="Upload Resume PDF"),
    outputs=gr.Textbox(label="Upload Status"),
)

chat_interface = gr.ChatInterface(
    respond_with_resume,
    additional_inputs=[
        gr.Textbox(value="You are a Job Advisor Chatbot.", label="System message"),
        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)",
        ),
    ],
)

demo = gr.TabbedInterface(
    [upload_interface, chat_interface],
    ["Upload Resume", "Chat with Job Advisor"]
)


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