Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import torch | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| MODEL_ID = "Qwen/Qwen2.5-0.5B-Instruct" | |
| SYSTEM_PROMPT = "You are a helpful, harmless assistant. Answer concisely." | |
| MAX_NEW_TOKENS = 256 | |
| DARK_CSS = """ | |
| .gradio-container, .gradio-container * { | |
| background-color: #0b0f19 !important; | |
| color: #e5e7eb !important; | |
| } | |
| .gradio-container input, | |
| .gradio-container textarea, | |
| .gradio-container .gr-textbox, | |
| .gradio-container .gr-button { | |
| background-color: #1f2937 !important; | |
| color: #e5e7eb !important; | |
| border-color: #374151 !important; | |
| } | |
| .gradio-container .gr-button:hover { | |
| background-color: #374151 !important; | |
| } | |
| .message-bubble-border, .message { | |
| background-color: #1f2937 !important; | |
| border-color: #374151 !important; | |
| } | |
| """ | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) | |
| model = AutoModelForCausalLM.from_pretrained(MODEL_ID, torch_dtype=torch.float32) | |
| model.eval() | |
| def chat(messages: list[dict]) -> str: | |
| input_ids = tokenizer.apply_chat_template( | |
| messages, | |
| add_generation_prompt=True, | |
| return_tensors="pt", | |
| ) | |
| with torch.no_grad(): | |
| output_ids = model.generate(input_ids, max_new_tokens=MAX_NEW_TOKENS) | |
| new_tokens = output_ids[0][input_ids.shape[-1]:] | |
| return tokenizer.decode(new_tokens, skip_special_tokens=True) | |
| def _prepend_system(history: list[dict]) -> list[dict]: | |
| if history and history[0]["role"] == "system": | |
| return history | |
| return [{"role": "system", "content": SYSTEM_PROMPT}] + history | |
| def _chatbot_view(history: list[dict]) -> list[dict]: | |
| return [m for m in history if m["role"] != "system"] | |
| def handle_message(user_input: str, history: list[dict]): | |
| if not user_input.strip(): | |
| return _chatbot_view(history), history, "" | |
| history = _prepend_system(history) | |
| history = history + [{"role": "user", "content": user_input}] | |
| try: | |
| reply = chat(history) | |
| history = history + [{"role": "assistant", "content": reply}] | |
| except Exception as exc: | |
| reply = f"Error: {type(exc).__name__}: {exc}" | |
| history = history + [{"role": "assistant", "content": reply}] | |
| return _chatbot_view(history), history | |
| def handle_clear(): | |
| return [], [] | |
| with gr.Blocks(title="Ollive OSS Assistant", css=DARK_CSS) as demo: | |
| gr.Markdown("## Ollive OSS Assistant\nQwen2.5-0.5B-Instruct running on CPU.") | |
| chatbot = gr.Chatbot(label="Conversation", height=420, type="messages") | |
| history_state = gr.State([]) | |
| with gr.Row(): | |
| user_input = gr.Textbox( | |
| placeholder="Type your message here...", | |
| show_label=False, | |
| scale=4, | |
| ) | |
| submit_btn = gr.Button("Submit", scale=1) | |
| clear_btn = gr.Button("Clear conversation") | |
| handler_cfg = dict( | |
| fn=handle_message, | |
| inputs=[user_input, history_state], | |
| outputs=[chatbot, history_state], | |
| ) | |
| submit_btn.click(**handler_cfg).then(lambda: "", outputs=[user_input]) | |
| user_input.submit(**handler_cfg).then(lambda: "", outputs=[user_input]) | |
| clear_btn.click(fn=handle_clear, outputs=[chatbot, history_state]) | |
| if __name__ == "__main__": | |
| demo.launch() |