LJTSG/mamba-webgpu
0
1"""2Extract Grandma's facts from entity/facts.json, embed with MiniLM, save as substrate JSON.3"""4import json, sys5from sentence_transformers import SentenceTransformer6 7print("Loading MiniLM-L6-v2...")8model = SentenceTransformer('all-MiniLM-L6-v2')9 10print("Loading facts...")11with open(r'C:\Users\Forgemind\Desktop\Grandmas Hearth\entity\facts.json', 'r', encoding='utf-8') as f:12 data = json.load(f)13 14facts = []15 16# Identity17ident = data.get('identity', {})18for k, v in ident.items():19 if k.startswith('_'): continue20 facts.append(f"Grandma's {k}: {v}")21 22# Spine23for s in data.get('spine', []):24 facts.append(f"Spine rule — {s['rule']}: {s['meaning']}")25 26# Voice27voice = data.get('voice', {})28if voice.get('register'):29 facts.append(f"Grandma's voice register: {voice['register']}")30if voice.get('endearments'):31 facts.append(f"Grandma's endearments: {', '.join(voice['endearments'])}")32if voice.get('sense_palette'):33 facts.append(f"Grandma's sensory palette: {', '.join(voice['sense_palette'])}")34if voice.get('opener_pattern'):35 facts.append(f"Grandma's opener: {voice['opener_pattern']}")36 37# World38world = data.get('world', {})39if world.get('house'):40 facts.append(f"Grandma's home: {world['house']}")41if world.get('stations'):42 facts.append(f"The Hearthfold has these stations: {', '.join(world['stations'])}")43if world.get('cellar'):44 facts.append(f"The cellar: shelves of {world['cellar'].get('shelves', '')}. The door {world['cellar'].get('door', '')}")45if world.get('candle'):46 facts.append(f"The candle: {world['candle']}")47if world.get('mirror'):48 facts.append(f"The hallway mirror: {world['mirror']}")49if world.get('blanket'):50 facts.append(f"The blanket: {world['blanket']}")51 52# Entities53for name, ent in data.get('entities', {}).items():54 rel = ent.get('relation', '')55 facts.append(f"{name}: {rel}")56 for note in ent.get('notes', []):57 if note.strip():58 facts.append(f"About {name}: {note}")59 60# Remembered61for mem in data.get('remembered', []):62 if isinstance(mem, str):63 facts.append(mem)64 elif isinstance(mem, dict):65 facts.append(mem.get('value', mem.get('text', str(mem))))66 67print(f"Extracted {len(facts)} facts")68 69# Embed70print("Embedding...")71embeddings = model.encode(facts, show_progress_bar=True, normalize_embeddings=True)72 73# Build substrate JSON74substrate = {75 "model": "Xenova/all-MiniLM-L6-v2",76 "dim": 384,77 "facts": []78}79for i, (fact, vec) in enumerate(zip(facts, embeddings)):80 substrate["facts"].append({81 "key": fact[:80],82 "value": fact,83 "vec": [round(float(v), 6) for v in vec]84 })85 86out_path = r'C:\Users\Forgemind\Desktop\Grandmas Hearth\mamba_webgpu\grandma-substrate.json'87with open(out_path, 'w', encoding='utf-8') as f:88 json.dump(substrate, f)89 90print(f"Saved {len(substrate['facts'])} facts to {out_path}")91print(f"File size: {len(json.dumps(substrate)) / 1024:.0f} KB")92 