Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer | |
| from threading import Thread | |
| import torch | |
| # 1. Load the Model and Tokenizer | |
| # We use the specific 'openai-community/gpt2' as requested | |
| model_id = "openai-community/gpt2" | |
| print(f"Loading {model_id}...") | |
| tokenizer = AutoTokenizer.from_pretrained(model_id) | |
| model = AutoModelForCausalLM.from_pretrained(model_id) | |
| # 2. Define the Chat Logic | |
| def chat_response(message, history): | |
| """ | |
| This function handles the logic for generating a response. | |
| It formats the input to look like a conversation to help GPT-2 understand context. | |
| """ | |
| # Construct a prompt based on conversation history | |
| # GPT-2 is a raw completion model, so we format it as a script: | |
| # User: Hello | |
| # AI: Hi there | |
| conversation = "" | |
| for user_msg, ai_msg in history: | |
| conversation += f"User: {user_msg}\nAI: {ai_msg}\n" | |
| # Add the current message | |
| prompt = conversation + f"User: {message}\nAI:" | |
| # Tokenize input | |
| inputs = tokenizer(prompt, return_tensors="pt") | |
| # Setup the streamer (this creates the 'typing' effect) | |
| streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) | |
| # Generation arguments | |
| generation_kwargs = dict( | |
| inputs=inputs.input_ids, | |
| max_new_tokens=100, # Limit response length | |
| temperature=0.7, # Controls randomness (0.7 is a good balance) | |
| top_p=0.9, # Nucleus sampling for better quality | |
| do_sample=True, | |
| pad_token_id=tokenizer.eos_token_id, | |
| streamer=streamer, | |
| no_repeat_ngram_size=2 # Prevents the model from repeating phrases | |
| ) | |
| # Run generation in a separate thread so the GUI doesn't freeze | |
| thread = Thread(target=model.generate, kwargs=generation_kwargs) | |
| thread.start() | |
| # Yield the text chunk by chunk to the Gradio interface | |
| generated_text = "" | |
| for new_text in streamer: | |
| generated_text += new_text | |
| yield generated_text | |
| # 3. Create the GUI | |
| # We use a custom theme to make it look professional | |
| theme = gr.themes.Soft( | |
| primary_hue="purple", | |
| secondary_hue="cyan", | |
| ).set( | |
| body_background_fill="*neutral_50", | |
| ) | |
| with gr.Blocks(theme=theme) as demo: | |
| gr.Markdown( | |
| """ | |
| # 🤖 Classic GPT-2 Chat | |
| ### Powered by `openai-community/gpt2` | |
| Type a message below to start chatting! | |
| *Note: GPT-2 is an older model (2019), so it may be whimsical or repetitive.* | |
| """ | |
| ) | |
| # The Chat Interface | |
| gr.ChatInterface( | |
| fn=chat_response, | |
| retry_btn=None, | |
| undo_btn=None, | |
| clear_btn="Clear Chat", | |
| examples=["Hello, how are you?", "Tell me a story about a dragon.", "What is the capital of France?"], | |
| ) | |
| # 4. Launch the App | |
| if __name__ == "__main__": | |
| demo.launch() |