Spaces:
Running on Zero
Running on Zero
| import gradio as gr | |
| import spaces | |
| from huggingface_hub import InferenceClient | |
| from transformers import pipeline | |
| LOCAL_MODEL = "Qwen/Qwen3-0.6B" | |
| REMOTE_MODEL = "openai/gpt-oss-20b" | |
| pipe = pipeline( | |
| "text-generation", | |
| model=LOCAL_MODEL, | |
| dtype="auto", | |
| device="cuda", | |
| ) | |
| fancy_css = """ | |
| .gradio-container { | |
| width: 96% !important; | |
| max-width: none !important; | |
| } | |
| #app-title { | |
| text-align: center; | |
| margin-bottom: 4px; | |
| } | |
| #app-subtitle { | |
| text-align: center; | |
| color: var(--body-text-color-subdued); | |
| margin-bottom: 24px; | |
| } | |
| #chat-container { | |
| width: 100%; | |
| border: 1px solid var(--border-color-primary); | |
| border-radius: 12px; | |
| padding: 16px; | |
| box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); | |
| } | |
| #model-note { | |
| font-size: 0.9em; | |
| color: var(--body-text-color-subdued); | |
| margin-top: 8px; | |
| } | |
| @media (max-width: 768px) { | |
| .gradio-container { | |
| width: 98% !important; | |
| } | |
| #chat-container { | |
| padding: 8px; | |
| } | |
| } | |
| """ | |
| def local_generate( | |
| messages, | |
| max_tokens, | |
| temperature, | |
| top_p, | |
| ): | |
| outputs = pipe( | |
| messages, | |
| max_new_tokens=max_tokens, | |
| do_sample=True, | |
| temperature=temperature, | |
| top_p=top_p, | |
| ) | |
| return outputs[0]["generated_text"][-1]["content"] | |
| def respond( | |
| message, | |
| history: list[dict[str, str]], | |
| system_message, | |
| max_tokens, | |
| temperature, | |
| top_p, | |
| use_local_model, | |
| hf_token: gr.OAuthToken, | |
| ): | |
| messages = [{"role": "system", "content": system_message}] | |
| messages.extend(history) | |
| messages.append({"role": "user", "content": message}) | |
| if use_local_model: | |
| print("[MODE] local") | |
| response = local_generate( | |
| messages, | |
| max_tokens, | |
| temperature, | |
| top_p, | |
| ) | |
| yield response | |
| return | |
| print("[MODE] api") | |
| if hf_token is None or not getattr(hf_token, "token", None): | |
| yield "⚠️ Please log in with your Hugging Face account first." | |
| return | |
| client = InferenceClient( | |
| token=hf_token.token, | |
| model=REMOTE_MODEL, | |
| ) | |
| response = "" | |
| for chunk in client.chat_completion( | |
| messages, | |
| max_tokens=max_tokens, | |
| stream=True, | |
| temperature=temperature, | |
| top_p=top_p, | |
| ): | |
| choices = chunk.choices | |
| token = "" | |
| if len(choices) and choices[0].delta.content: | |
| token = choices[0].delta.content | |
| response += token | |
| yield response | |
| chatbot = gr.ChatInterface( | |
| fn=respond, | |
| additional_inputs=[ | |
| 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=2.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)", | |
| ), | |
| gr.Checkbox( | |
| label="Use Local Model", | |
| value=False, | |
| ), | |
| ], | |
| ) | |
| with gr.Blocks(css=fancy_css) as demo: | |
| with gr.Sidebar(): | |
| gr.LoginButton() | |
| gr.Markdown( | |
| "# 🌟 Fancy AI Chatbot", | |
| elem_id="app-title", | |
| ) | |
| gr.Markdown( | |
| "A fancier version of the standard Huggging Face chatbot template.", | |
| elem_id="app-subtitle", | |
| ) | |
| with gr.Column(elem_id="chat-container"): | |
| chatbot.render() | |
| gr.Markdown( | |
| "Use **Additional inputs** to switch between the API model and the locally executed model.", | |
| elem_id="model-note", | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |