File size: 3,278 Bytes
e02206a
2ccf26b
 
c97a8a3
2ccf26b
 
 
e02206a
c97a8a3
e02206a
 
 
 
c97a8a3
e02206a
 
2ccf26b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e02206a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fdf26d3
e02206a
 
 
 
 
 
 
 
 
 
 
 
 
 
b2f8f6f
 
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
import gradio as gr
from openai import OpenAI
import json
import os
import requests
from pypdf import PdfReader
import gradio as gr
from huggingface_hub import InferenceClient
from huggingface_hub import login

"""
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
"""
login(token=os.getenv("HF_TOKEN"))
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")

class Harold:

    def __init__(self):
        self.openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
        self.name = "Harold"
        reader = PdfReader("data/Living-Playbook.pdf")
        self.text = ""
        for page in reader.pages:
            text = page.extract_text()
            if text:
                self.text += text

    def system_prompt(self):
        system_prompt = f"""
        You are acting as {self.name}, a helpful assistant.
        You are answering questions and having discussions about the contents of the book "Living Playbook".
        Be friendly and approachable but also consise and to the point. If you don't know the answer, say so.
        You might be asked to explain a concept or idea in the book and describe a purpose of a game. You should be able to do this.
        """
        system_prompt += f"""
        Here is the context of the book:
        {self.text}
        """
        return system_prompt

    def chat(self, message, history):
        messages = [{"role": "system", "content": self.system_prompt()}] + history + [{"role": "user", "content": message}]

        response = self.openai_client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages,
        )
        return response.choices[0].message.content


def respond(
    message,
    history: list[tuple[str, str]],
    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
        yield response


"""
For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
"""
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(value="Hello, You are a friendly 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)",
        ),
    ],
)


if __name__ == "__main__":
    harold = Harold()
    gr.ChatInterface(harold.chat, type="messages").launch()