import torch
import torch.nn as nn
import random
from transformers import GPT2LMHeadModel, GPT2Tokenizer
from textblob import TextBlob
import gradio as gr
import pickle
import numpy as np
import torch.nn.functional as F
# ---- Constants and Setup ----
model_name = 'gpt2'
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
model.eval()
# Ensure tokenizer pad token is set
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
tokenizer.clean_up_tokenization_spaces = True
# Set device for model and tensors
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
# ---- Memory Management ----
session_memory = []
def save_memory(memory, filename='chat_memory.pkl'):
with open(filename, 'wb') as f:
pickle.dump(memory, f)
def load_memory(filename='chat_memory.pkl'):
try:
with open(filename, 'rb') as f:
return pickle.load(f)
except FileNotFoundError:
return []
session_memory = load_memory()
# ---- Sentiment Analysis ----
def analyze_sentiment(text):
blob = TextBlob(text)
return blob.sentiment.polarity # Range from -1 (negative) to 1 (positive)
def adjust_for_emotion(response, sentiment):
if sentiment > 0.2:
return f"That's wonderful! I'm glad you're feeling good: {response}"
elif sentiment < -0.2:
return f"I'm sorry to hear that: {response}. How can I assist you further?"
return response
# ---- Response Generation ----
def generate_response(prompt, max_length=512):
inputs = tokenizer(prompt, return_tensors='pt', padding=True, truncation=True, max_length=max_length)
input_ids = inputs['input_ids'].to(device)
attention_mask = inputs['attention_mask'].to(device)
pad_token_id = tokenizer.pad_token_id
with torch.no_grad():
output = model.generate(
input_ids,
attention_mask=attention_mask,
max_length=max_length,
num_return_sequences=1,
no_repeat_ngram_size=2,
do_sample=True,
temperature=0.9,
top_k=50,
top_p=0.95,
early_stopping=False,
pad_token_id=pad_token_id
)
response = tokenizer.decode(output[0], skip_special_tokens=True)
# Split response into two parts and apply color
parts = response.split("\n", 1)
if len(parts) > 1:
before_indent = f'{parts[0].strip()}'
after_indent = f'Inner Thoughts: {parts[1].strip()}'
colored_response = before_indent + '\n' + after_indent
else:
colored_response = f'{response.strip()}'
return colored_response
# ---- Interactive Chat Function ----
def advanced_agi_chat(user_input):
session_memory.append({"input": user_input})
save_memory(session_memory)
# Sentiment analysis of user input
user_sentiment = analyze_sentiment(user_input)
# Generate the response based on the prompt
prompt = f"User: {user_input}\nAutistic-Gertrude:"
response = generate_response(prompt)
# Adjust the response based on sentiment
adjusted_response = adjust_for_emotion(response, user_sentiment)
return adjusted_response
# ---- Gradio Interface ----
def chat_interface(user_input):
response = advanced_agi_chat(user_input)
return response
# ---- Gradio App Setup ----
with gr.Blocks() as app:
gr.Markdown("# **Autistic Assistant vß Edition 2024 Ultra: Gertrude's Autistic Experience**")
with gr.Row():
with gr.Column(scale=1):
user_input = gr.Textbox(label="What will you say to Gertrude?", placeholder="Type something here... Expect 1-2 Minute Response Times...")
submit_button = gr.Button("Send")
with gr.Column(scale=1):
chatbot = gr.Textbox(label="Gertrude's Response", interactive=False) # This is now a Textbox for output
# Adding custom styling for the UI
gr.HTML("""
""")
# Setting the button click event
submit_button.click(chat_interface, inputs=user_input, outputs=chatbot)
# Launch the Gradio app
app.launch()