Spaces:
Running
Running
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()
|