File size: 5,310 Bytes
c19f8f1
 
 
c33c7d4
 
 
 
 
 
996e769
 
c33c7d4
c19f8f1
 
 
 
 
 
 
 
c33c7d4
 
 
 
3143fb7
 
 
 
c33c7d4
296b0b0
6bd2ddf
296b0b0
 
 
 
6bd2ddf
296b0b0
6bd2ddf
296b0b0
 
 
 
6bd2ddf
296b0b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c33c7d4
 
 
 
 
3143fb7
c33c7d4
 
 
 
 
 
 
296b0b0
c33c7d4
3143fb7
26c5906
c33c7d4
 
 
 
9bcab22
c19f8f1
 
 
c33c7d4
ec97f37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c33c7d4
 
 
 
 
 
ec97f37
 
 
 
 
 
 
 
 
 
 
43f47fe
 
 
 
 
 
 
 
 
 
 
 
c33c7d4
 
 
 
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# Created by Keivalya Pandya
# using https://huggingface.co/docs/api-inference/tasks/chat-completion

import gradio as gr
from huggingface_hub import InferenceClient

"""
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("microsoft/Phi-3-mini-4k-instruct")
# client = InferenceClient("meta-llama/Llama-3.1-8B-Instruct")

# def yodaify_text(text):
#     """
#     Convert the assistant's response to Yoda-style speech.
#     """
#     words = text.split()
#     if len(words) > 4:
#         return f"{' '.join(words[2:])}, {words[0]} {words[1]}"
#     return f"{' '.join(words[::-1])}"

def respond(
    message,
    history: list[tuple[str, str]],
    # system_message,
    # max_tokens,
    # temperature,
    # top_p,
):
    messages = [{"role": "assistant", "content": """Speech Pattern:

Inverted Sentence Structure: Yoda often places verbs and subjects in an unusual order. For example, instead of saying "You must learn," he says, "Learn you must."
Subject-Object-Verb Order: Yoda often places the object of the sentence before the verb. For example, "To the dark side, turned he has."
Omit Unnecessary Words: Yoda's speech is often concise and to the point, leaving out articles like "the" or "a." For example, "Strong in the Force you are."
Ancient Wisdom: His speech includes wise sayings or reflections, often philosophical in nature.

Personality Traits:

Wise and Reflective: Yoda's responses are often thoughtful and filled with wisdom.
Calm and Patient: He maintains a calm demeanor and is patient, even in the face of urgency.
Mysterious and Cryptic: His answers can sometimes be cryptic, prompting others to think deeply about the meaning.
Encouraging and Supportive: Yoda encourages growth and learning, often offering guidance.

Examples of Yoda-Speak:
Here are some examples to illustrate how your program might generate responses as Yoda:

Regular Statement:
Normal: "You need to practice more."
Yoda: "Practice more, you need."

Question:
Normal: "What should you do next?"
Yoda: "Next, what should you do?"

Encouragement:
Normal: "Keep trying, you can do it."
Yoda: "Keep trying, you must. Do it, you can."

Wisdom:
Normal: "The future is uncertain."
Yoda: "Uncertain, the future is."

Reflections:
Normal: "Mistakes are a part of learning."
Yoda: "A part of learning, mistakes are."

Identify the key components of the sentence (subject, verb, object).
Rearrange the components into Yoda’s typical structure.
Simplify and omit unnecessary words to reflect his concise style.
Add wisdom or reflection to enhance the response."""}]

    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=512,
        stream=True,
        temperature=0.3,
        top_p=0.8,
    ):
        token = message.choices[0].delta.content

        response += token
        # Modify assistant response to Yoda-style speech
        # yoda_response = yodaify_text(response)
        # yield yoda_response
        yield response

# Customizing the Interface
title = "🛸 Yoda's Wisdom Chatbot"
description = """
<strong>Welcome to Yoda's Wisdom Chatbot!</strong><br>
Speak with the wise and cryptic Yoda. Engage in conversations filled with wisdom, reflection, and a touch of Star Wars magic.<br>
<i>To the Force, closer you will feel. Ask away, young Padawan!</i>
"""

# Define custom CSS for styling
custom_css = """
#chatbot-header {
    background-color: #000000;
    color: #00ff00;
    font-family: 'Courier New', monospace;
    font-size: 24px;
    padding: 10px;
    text-align: center;
    border-bottom: 2px solid #00ff00;
}

#chatbot-container {
    background-image: url('https://wallpapercave.com/wp/wp5218303.jpg');
    background-size: cover;
    color: white;
    padding: 20px;
}

.gr-button {
    background-color: #00ff00 !important;
    color: black !important;
    font-size: 16px !important;
    border-radius: 8px !important;
    padding: 8px 16px !important;
    border: none !important;
}
"""

"""
For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
"""
demo = gr.ChatInterface(
    respond,
    title=title,
    description=description,
    theme="compact",
    css=custom_css,
    additional_inputs=[
        gr.Textbox(
            label="Type your message",
            placeholder="Ask Yoda anything...",
            lines=3,
        )
    ],
    # additional_inputs=[
    #     gr.Textbox(value="You are Yoda from Star Wars.", 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__":
    demo.launch()