Spaces:
Sleeping
Sleeping
File size: 4,367 Bytes
f385f69 b1bd07a 9a55f2c b1bd07a 9a55f2c 3079ffd b1bd07a 9a55f2c b1bd07a 9a55f2c b1bd07a 9a55f2c b1bd07a 9a55f2c b1bd07a 9a55f2c b1bd07a 9a55f2c b1bd07a 9a55f2c 3079ffd b1bd07a 3079ffd b1bd07a f385f69 3079ffd b1bd07a 3079ffd f385f69 3079ffd f385f69 b1bd07a 8eb0bec b1bd07a 8eb0bec b1bd07a 8eb0bec b1bd07a 8eb0bec b1bd07a 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 136 137 |
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", # The one you say works already
"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'
# Minimal inline styling to help match Gradio's background.
dropdown_html = f"""
<style>
.custom-select {{
background-color: var(--background-color, #FFF);
color: var(--text-color, #000);
border: 1px solid var(--border-color, #CCC);
padding: 8px;
border-radius: 4px;
font-size: 1rem;
width: 100%;
box-sizing: border-box;
margin-bottom: 1rem;
}}
</style>
<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):
"""
Builds a chat prompt using a simple template:
- Optionally includes a system message.
- Iterates over conversation history (each exchange as a tuple of (user, assistant)).
- Adds the new user message and appends an empty assistant turn.
Then it streams the response from the model.
"""
# -- 2) Instantiate the InferenceClient using the chosen model --
client = InferenceClient(model_id)
# Build the messages list.
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 = ""
# Stream the response token-by-token.
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 (so we can add custom HTML above the chat) --
with gr.Blocks() as demo:
# Our custom HTML dropdown (shows model + description, supports disabled)
gr.HTML(value=dropdown_html)
# Hidden textbox to store the current model ID (will be read by 'respond').
hidden_model = gr.Textbox(
value=models[0]["id"], # Default to the first model
visible=False,
elem_id="hidden_model"
)
# The ChatInterface is almost the same as your original code.
# We simply add `hidden_model` as one more input argument.
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)"
),
]
)
if __name__ == "__main__":
demo.launch()
|