import streamlit as st from transformers import AutoTokenizer, AutoModelForCausalLM import torch # Load model and tokenizer from Hugging Face Hub @st.cache_resource def load_model(): model_name = "sshleifer/tiny-gpt2" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) model.eval() return tokenizer, model, device tokenizer, model, device = load_model() # Initialize chat history in session if "messages" not in st.session_state: st.session_state.messages = [] # Chat UI st.title("🤖 Tiny GPT-2 Chatbot") st.markdown("Ask me anything! This bot runs locally with no API key.") # Display chat history for msg in st.session_state.messages: role = "🧑‍💻" if msg["role"] == "user" else "🤖" st.markdown(f"**{role}:** {msg['content']}") # Input box user_input = st.text_input("Type your message...", key="user_input") if user_input: # Append user message st.session_state.messages.append({"role": "user", "content": user_input}) # Build prompt prompt = "\n".join([m["content"] for m in st.session_state.messages]) # Tokenize and generate inputs = tokenizer(prompt, return_tensors="pt").to(device) outputs = model.generate( **inputs, max_new_tokens=100, temperature=0.7, top_p=0.95, do_sample=True, pad_token_id=tokenizer.eos_token_id ) output_text = tokenizer.decode(outputs[0], skip_special_tokens=True) reply = output_text[len(prompt):].strip().split("\n")[0] # Append bot reply st.session_state.messages.append({"role": "assistant", "content": reply}) # Refresh the page to show new message st.experimental_rerun()