import random import torch import torch.nn.functional as F from model.memory import save_dream from model.brain_state import model, tokenizer, DEVICE recent_dreams = [] def generate_response(): model.eval() # Pick a real known word to seed from context memory context_texts = get_recent_context(5) if context_texts: start = random.choice(context_texts) seed_tokens = tokenizer.tokenize(start) if seed_tokens: seed = torch.tensor([seed_tokens[-1]], device=DEVICE).unsqueeze(0) else: seed = torch.tensor([random.randint(0, tokenizer.next_id - 1)], device=DEVICE).unsqueeze(0) else: seed = torch.tensor([random.randint(0, tokenizer.next_id - 1)], device=DEVICE).unsqueeze(0) output = model(seed) pred = torch.argmax(output, dim=-1).squeeze().tolist() if not isinstance(pred, list): pred = [pred] return tokenizer.detokenize(pred) def score_sentence(sentence: str) -> float: words = sentence.strip().split() length = len(words) diversity = len(set(words)) / (length + 1) if length < 4: return 0.0 return diversity * min(length, 20) def daydream(): model.eval() seed = torch.tensor([random.randint(0, tokenizer.next_id - 1)], device=DEVICE).unsqueeze(0) dream = [] for _ in range(12): out = model(seed) logits = out[:, -1, :] probs = F.softmax(logits, dim=-1) token = torch.multinomial(probs, num_samples=1) dream.append(token.item()) seed = torch.cat([seed, token], dim=1) sentence = tokenizer.detokenize(dream) score = score_sentence(sentence) if score > 0.45: save_dream(sentence, score) from model.journal import record_to_journal record_to_journal(sentence) from model.trainer import train_on_message train_on_message(sentence) if len(recent_dreams) > 10: recent_dreams.pop(0)