File size: 4,052 Bytes
f385f69
 
 
b1bd07a
9a55f2c
 
 
 
2471f2f
9a55f2c
 
 
 
 
 
 
 
 
3079ffd
b1bd07a
9a55f2c
 
 
b1bd07a
9a55f2c
b1bd07a
9a55f2c
 
 
2471f2f
 
b1bd07a
2471f2f
 
 
 
 
b1bd07a
 
 
 
 
 
2471f2f
 
 
 
 
b1bd07a
2471f2f
 
 
 
b1bd07a
 
 
 
 
9a55f2c
 
 
b1bd07a
2471f2f
b1bd07a
9a55f2c
 
3079ffd
 
 
 
 
 
f385f69
3079ffd
 
 
f385f69
 
 
 
 
 
3079ffd
 
 
f385f69
2471f2f
8eb0bec
2471f2f
8eb0bec
2471f2f
 
b1bd07a
 
 
 
 
8eb0bec
2471f2f
b1bd07a
 
8eb0bec
 
b1bd07a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2471f2f
 
8eb0bec
f385f69
 
 
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
import gradio as gr
from huggingface_hub import InferenceClient

# -- 1) DEFINE YOUR MODELS HERE --
models = [
    {
        "name": "Tiny Model",
        "description": "A small chat model.",
        "id": "amusktweewt/tiny-model-500M-chat-v2",
        "enabled": True
    },
    {
        "name": "Another Model",
        "description": "A bigger chat model (disabled).",
        "id": "another-model",
        "enabled": False
    }
]

# Build the custom HTML for a disabled-capable <select>.
dropdown_options = ""
for model in models:
    label = f"{model['name']}: {model['description']}"
    disabled_attr = "disabled" if not model["enabled"] else ""
    if not model["enabled"]:
        # Mark label visually so the user sees it's disabled
        label = f"{model['name']} (Disabled): {model['description']}"
    dropdown_options += f'<option value="{model["id"]}" {disabled_attr}>{label}</option>\n'

# Updated CSS to follow system theme and enlarge chat area.
custom_css = """
<style>
  /* Style for the custom dropdown, using inherited colors */
  .custom-select {
    background-color: transparent; /* Inherit system background */
    color: inherit; /* Inherit system text color */
    border: 1px solid var(--border-color, #ccc);
    padding: 8px;
    border-radius: 4px;
    font-size: 1rem;
    width: 100%;
    box-sizing: border-box;
    margin-bottom: 1rem;
  }
  /* Increase the minimum height of the chat area */
  #chat_interface .chatbox {
    min-height: 500px;
  }
</style>
"""

dropdown_html = f"""
{custom_css}
<label for="model_select"><strong>Select Model:</strong></label>
<select id="model_select" class="custom-select" 
        onchange="document.getElementById('hidden_model').value = this.value;">
  {dropdown_options}
</select>
"""

def respond(message, history: list[tuple[str, str]], model_id, system_message, max_tokens, temperature, top_p):
    """
    Build a chat prompt and stream the response token-by-token from the model.
    """
    client = InferenceClient(model_id)
    messages = []
    if system_message:
        messages.append({"role": "system", "content": system_message})
    if history:
        for user_msg, bot_msg in history:
            messages.append({"role": "user", "content": user_msg})
            messages.append({"role": "assistant", "content": bot_msg})
    messages.append({"role": "user", "content": message})
    messages.append({"role": "assistant", "content": ""})
    response_text = ""
    for resp in client.chat_completion(
        messages,
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    ):
        token = resp.choices[0].delta.content
        response_text += token
        yield response_text

# -- 3) BUILD THE UI IN A BLOCKS CONTEXT --
with gr.Blocks() as demo:
    # Custom HTML dropdown for model selection.
    gr.HTML(value=dropdown_html)
    
    # Hidden textbox to store the current model ID.
    hidden_model = gr.Textbox(
        value=models[0]["id"],  # Default to the first model
        visible=False,
        elem_id="hidden_model"
    )
    
    # ChatInterface with an element ID for styling.
    chat = gr.ChatInterface(
        respond,
        additional_inputs=[
            hidden_model,
            gr.Textbox(
                value="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)"
            ),
        ],
        elem_id="chat_interface"
    )

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