Create game_config.py
Browse files- game_config.py +106 -0
game_config.py
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# βββββββββββββββββββββββββββββββββββββββββββββ
|
| 2 |
+
# game_config.py β all balance numbers live here
|
| 3 |
+
# βββββββββββββββββββββββββββββββββββββββββββββ
|
| 4 |
+
|
| 5 |
+
STARTING_MONEY: float = 100.0
|
| 6 |
+
|
| 7 |
+
# ββ Upgrades ββββββββββββββββββββββββββββββββ
|
| 8 |
+
# Each upgrade has a list of levels.
|
| 9 |
+
# level 0 = not purchased (baseline)
|
| 10 |
+
# level 1+ = purchased tiers
|
| 11 |
+
#
|
| 12 |
+
# quality_score : additive contribution to total_quality (0β100 scale)
|
| 13 |
+
# cost : price to buy that tier (cumulative spend per tier, not total)
|
| 14 |
+
|
| 15 |
+
UPGRADES: dict = {
|
| 16 |
+
"model_size": {
|
| 17 |
+
"label": "Model Size",
|
| 18 |
+
"icon": "⬑",
|
| 19 |
+
"description": "Number of parameters in your model",
|
| 20 |
+
"levels": [
|
| 21 |
+
{"name": "Nano (7M)", "cost": 0, "quality_score": 0},
|
| 22 |
+
{"name": "Small (70M)", "cost": 20, "quality_score": 8},
|
| 23 |
+
{"name": "Medium (500M)", "cost": 60, "quality_score": 18},
|
| 24 |
+
{"name": "Large (3B)", "cost": 150, "quality_score": 32},
|
| 25 |
+
{"name": "Giant (30B)", "cost": 400, "quality_score": 50},
|
| 26 |
+
],
|
| 27 |
+
},
|
| 28 |
+
"dataset_size": {
|
| 29 |
+
"label": "Dataset Size",
|
| 30 |
+
"icon": "β",
|
| 31 |
+
"description": "Tokens of training data",
|
| 32 |
+
"levels": [
|
| 33 |
+
{"name": "Scraps (1B)", "cost": 0, "quality_score": 0},
|
| 34 |
+
{"name": "Common (10B)", "cost": 15, "quality_score": 6},
|
| 35 |
+
{"name": "Large (100B)", "cost": 45, "quality_score": 14},
|
| 36 |
+
{"name": "Massive (1T)", "cost": 120, "quality_score": 26},
|
| 37 |
+
{"name": "Web-scale (10T)", "cost": 300, "quality_score": 40},
|
| 38 |
+
],
|
| 39 |
+
},
|
| 40 |
+
"dataset_quality": {
|
| 41 |
+
"label": "Data Quality",
|
| 42 |
+
"icon": "β",
|
| 43 |
+
"description": "Curation and filtering pipeline",
|
| 44 |
+
"levels": [
|
| 45 |
+
{"name": "Raw dump", "cost": 0, "quality_score": 0},
|
| 46 |
+
{"name": "Deduplicated", "cost": 10, "quality_score": 5},
|
| 47 |
+
{"name": "Filtered", "cost": 30, "quality_score": 12},
|
| 48 |
+
{"name": "Curated", "cost": 80, "quality_score": 22},
|
| 49 |
+
{"name": "RLHF-aligned", "cost": 200, "quality_score": 35},
|
| 50 |
+
],
|
| 51 |
+
},
|
| 52 |
+
"architecture": {
|
| 53 |
+
"label": "Architecture",
|
| 54 |
+
"icon": "β¬",
|
| 55 |
+
"description": "Model architecture design",
|
| 56 |
+
"levels": [
|
| 57 |
+
{"name": "Vanilla LSTM", "cost": 0, "quality_score": 0},
|
| 58 |
+
{"name": "GPT-style", "cost": 25, "quality_score": 10},
|
| 59 |
+
{"name": "Flash-Attn", "cost": 70, "quality_score": 20},
|
| 60 |
+
{"name": "MoE layers", "cost": 180, "quality_score": 33},
|
| 61 |
+
{"name": "Custom SSM", "cost": 450, "quality_score": 48},
|
| 62 |
+
],
|
| 63 |
+
},
|
| 64 |
+
"hardware": {
|
| 65 |
+
"label": "Hardware",
|
| 66 |
+
"icon": "β£",
|
| 67 |
+
"description": "Training compute",
|
| 68 |
+
"levels": [
|
| 69 |
+
{"name": "CPU cluster", "cost": 0, "quality_score": 0},
|
| 70 |
+
{"name": "GTX 1080 Γ4", "cost": 30, "quality_score": 7},
|
| 71 |
+
{"name": "A100 Γ8", "cost": 90, "quality_score": 17},
|
| 72 |
+
{"name": "H100 pod", "cost": 250, "quality_score": 30},
|
| 73 |
+
{"name": "Custom silicon", "cost": 600, "quality_score": 45},
|
| 74 |
+
],
|
| 75 |
+
},
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
# Max quality score achievable (sum of all top-tier quality_scores)
|
| 79 |
+
# Used to normalise quality to 0β1. Recomputed at runtime, but shown here for reference.
|
| 80 |
+
# = 50 + 40 + 35 + 48 + 45 = 218
|
| 81 |
+
|
| 82 |
+
# ββ Training economics βββββββββββββββββββββββ
|
| 83 |
+
BASE_TRAIN_COST: float = 10.0 # $ cost at level-0 everything
|
| 84 |
+
TRAIN_COST_QUALITY_SCALE: float = 0.15 # extra cost per quality point
|
| 85 |
+
|
| 86 |
+
BASE_REWARD: float = 25.0 # $ reward at level-0 everything
|
| 87 |
+
QUALITY_EXPONENT: float = 2.2 # reward grows super-linearly with quality
|
| 88 |
+
MAX_QUALITY_REWARD_MULT: float = 40.0 # cap multiplier at max quality
|
| 89 |
+
|
| 90 |
+
REWARD_NOISE_PCT: float = 0.12 # Β±12 % random variance per run
|
| 91 |
+
|
| 92 |
+
# ββ Cloud Inference ββββββββββββββββββββββββββ
|
| 93 |
+
CLOUD_UNLOCK_COST: float = 150.0 # one-time cost to unlock
|
| 94 |
+
CLOUD_BASE_REVENUE: float = 8.0 # $ per tick (every 8 s) at quality 0
|
| 95 |
+
CLOUD_QUALITY_MULT: float = 0.06 # additional revenue per quality point
|
| 96 |
+
CLOUD_TICK_SECONDS: int = 8 # JS poll interval hint (stored here for reference)
|
| 97 |
+
|
| 98 |
+
# ββ Chat temperature mapping βββββββββββββββββ
|
| 99 |
+
# quality_ratio = total_quality / max_quality (0.0 β 1.0)
|
| 100 |
+
# temperature = lerp between TEMP_MAX and TEMP_MIN based on quality_ratio
|
| 101 |
+
CHAT_TEMP_MAX: float = 2.0 # chaotic gibberish at quality 0
|
| 102 |
+
CHAT_TEMP_MIN: float = 0.3 # coherent at max quality
|
| 103 |
+
|
| 104 |
+
# ββ HuggingFace model ββββββββββββββββββββββββ
|
| 105 |
+
HF_MODEL_ID: str = "FlameF0X/Qwen3-4B-Distilled-Claude-4.6"
|
| 106 |
+
HF_MAX_NEW_TOKENS: int = 400
|