# ───────────────────────────────────────────── # game_config.py – all balance numbers live here # ───────────────────────────────────────────── STARTING_MONEY: float = 100.0 # ── Upgrades ──────────────────────────────── # Each upgrade has a list of levels. # level 0 = not purchased (baseline) # level 1+ = purchased tiers # # quality_score : additive contribution to total_quality (0–100 scale) # cost : price to buy that tier (cumulative spend per tier, not total) UPGRADES: dict = { "model_size": { "label": "Model Size", "icon": "⬡", "description": "Number of parameters in your model", "levels": [ {"name": "Nano (7M)", "cost": 0, "quality_score": 0}, {"name": "Small (70M)", "cost": 20, "quality_score": 8}, {"name": "Medium (500M)", "cost": 60, "quality_score": 18}, {"name": "Large (3B)", "cost": 150, "quality_score": 32}, {"name": "Giant (30B)", "cost": 400, "quality_score": 50}, ], }, "dataset_size": { "label": "Dataset Size", "icon": "◈", "description": "Tokens of training data", "levels": [ {"name": "Scraps (1B)", "cost": 0, "quality_score": 0}, {"name": "Common (10B)", "cost": 15, "quality_score": 6}, {"name": "Large (100B)", "cost": 45, "quality_score": 14}, {"name": "Massive (1T)", "cost": 120, "quality_score": 26}, {"name": "Web-scale (10T)", "cost": 300, "quality_score": 40}, ], }, "dataset_quality": { "label": "Data Quality", "icon": "◉", "description": "Curation and filtering pipeline", "levels": [ {"name": "Raw dump", "cost": 0, "quality_score": 0}, {"name": "Deduplicated", "cost": 10, "quality_score": 5}, {"name": "Filtered", "cost": 30, "quality_score": 12}, {"name": "Curated", "cost": 80, "quality_score": 22}, {"name": "RLHF-aligned", "cost": 200, "quality_score": 35}, ], }, "architecture": { "label": "Architecture", "icon": "◬", "description": "Model architecture design", "levels": [ {"name": "Vanilla LSTM", "cost": 0, "quality_score": 0}, {"name": "GPT-style", "cost": 25, "quality_score": 10}, {"name": "Flash-Attn", "cost": 70, "quality_score": 20}, {"name": "MoE layers", "cost": 180, "quality_score": 33}, {"name": "Custom SSM", "cost": 450, "quality_score": 48}, ], }, "hardware": { "label": "Hardware", "icon": "▣", "description": "Training compute", "levels": [ {"name": "CPU cluster", "cost": 0, "quality_score": 0}, {"name": "GTX 1080 ×4", "cost": 30, "quality_score": 7}, {"name": "A100 ×8", "cost": 90, "quality_score": 17}, {"name": "H100 pod", "cost": 250, "quality_score": 30}, {"name": "Custom silicon", "cost": 600, "quality_score": 45}, ], }, } # Max quality score achievable (sum of all top-tier quality_scores) # Used to normalise quality to 0–1. Recomputed at runtime, but shown here for reference. # = 50 + 40 + 35 + 48 + 45 = 218 # ── Training economics ─────────────────────── BASE_TRAIN_COST: float = 10.0 # $ cost at level-0 everything TRAIN_COST_QUALITY_SCALE: float = 0.15 # extra cost per quality point BASE_REWARD: float = 25.0 # $ reward at level-0 everything QUALITY_EXPONENT: float = 2.2 # reward grows super-linearly with quality MAX_QUALITY_REWARD_MULT: float = 40.0 # cap multiplier at max quality REWARD_NOISE_PCT: float = 0.12 # ±12 % random variance per run # ── Cloud Inference ────────────────────────── CLOUD_UNLOCK_COST: float = 150.0 # one-time cost to unlock CLOUD_BASE_REVENUE: float = 8.0 # $ per tick (every 8 s) at quality 0 CLOUD_QUALITY_MULT: float = 0.06 # additional revenue per quality point CLOUD_TICK_SECONDS: int = 8 # JS poll interval hint (stored here for reference) # ── Chat temperature mapping ───────────────── # quality_ratio = total_quality / max_quality (0.0 – 1.0) # temperature = lerp between TEMP_MAX and TEMP_MIN based on quality_ratio CHAT_TEMP_MAX: float = 2.0 # chaotic gibberish at quality 0 CHAT_TEMP_MIN: float = 0.3 # coherent at max quality # ── HuggingFace model ──────────────────────── HF_MODEL_ID: str = "FlameF0X/Qwen3-4B-Distilled-Claude-4.6" HF_MAX_NEW_TOKENS: int = 400