aerosphere / engine.py
rAdvirtua's picture
Update engine.py
38464dd verified
Raw
History Blame Contribute Delete
12.9 kB
from pydantic import BaseModel, Field
import json
import re
from enum import Enum
import os
class HabitabilityStatus(str, Enum):
STERILE = "STERILE"
PREBIOTIC = "PREBIOTIC"
HABITABLE = "HABITABLE"
THRIVING = "THRIVING"
class Era(str, Enum):
PRIMORDIAL = "PRIMORDIAL"
PRE_FORMATION = "PRE_FORMATION"
HADEAN = "HADEAN"
ARCHEAN = "ARCHEAN"
PROTEROZOIC = "PROTEROZOIC"
PALEOZOIC = "PALEOZOIC"
MESOZOIC = "MESOZOIC"
CENOZOIC = "CENOZOIC"
ANTHROPOCENE = "ANTHROPOCENE"
MICROBIAL = "MICROBIAL"
COMPLEX_LIFE = "COMPLEX_LIFE"
MEGAFAUNA = "MEGAFAUNA"
PRIMATE = "PRIMATE"
TRIBAL = "TRIBAL"
ANCIENT_MEDIEVAL = "ANCIENT_MEDIEVAL"
INDUSTRIAL = "INDUSTRIAL"
MODERN = "MODERN"
ADVANCED = "ADVANCED"
class PlanetState(BaseModel):
narrative: str = Field(default="The planet holds stable under observation.")
metric_name: str = Field(default="Atmospheric Harmony")
metric_value: float = Field(default=50.0)
button_a_label: str = Field(default="Observe")
button_b_label: str = Field(default="Analyze")
planet_color_hex: str = Field(default="#1e7050")
atmosphere_color_hex: str = Field(default="#40d0a0")
population: int = Field(default=0)
cloud_density: float = Field(default=0.0)
storm_intensity: float = Field(default=0.0)
lava_intensity: float = Field(default=0.0)
ice_coverage: float = Field(default=0.0)
vegetation: float = Field(default=0.0)
ocean_level: float = Field(default=0.0)
land_mass: float = Field(default=0.0)
habitability: "HabitabilityStatus" = Field(default=HabitabilityStatus.STERILE)
evolution_age: int = Field(default=0)
tech_level: float = Field(default=0.0)
civilization_scale: float = Field(default=0.0)
biosphere_richness: float = Field(default=0.0)
current_era: "Era" = Field(default=Era.PRIMORDIAL)
entities: list = Field(default_factory=list)
class PlanetStateDelta(BaseModel):
lava_intensity: float = Field(default=None)
ice_coverage: float = Field(default=None)
planet_color_hex: str = Field(default=None)
atmosphere_color_hex: str = Field(default=None)
vegetation: float = Field(default=None)
ocean_level: float = Field(default=None)
land_mass: float = Field(default=None)
cloud_density: float = Field(default=None)
storm_intensity: float = Field(default=None)
tech_level: float = Field(default=None)
narrative: str = Field(description="Explain what happened. Put this string LAST.")
def compute_era(age: int) -> tuple[str, float]:
if age < 0: return ("PRE_FORMATION", 0.0)
if age < 50_000_000: return ("HADEAN", 0.0)
elif age < 150_000_000: return ("ARCHEAN", 0.0)
elif age < 250_000_000: return ("PROTEROZOIC", 0.1)
elif age < 350_000_000: return ("PALEOZOIC", 0.2)
elif age < 450_000_000: return ("MESOZOIC", 0.3)
elif age < 550_000_000: return ("CENOZOIC", 0.5)
else: return ("ANTHROPOCENE", 1.0)
def tick_planet(state: PlanetState, delta_t: float) -> PlanetState:
return state
def check_habitability(state: PlanetState) -> HabitabilityStatus:
if state.lava_intensity > 0.6 or state.ice_coverage > 0.8: return HabitabilityStatus.STERILE
elif state.ocean_level > 0.3 and state.vegetation < 0.1: return HabitabilityStatus.PREBIOTIC
elif state.vegetation >= 0.1 and state.population < 1000: return HabitabilityStatus.HABITABLE
else: return HabitabilityStatus.THRIVING
# --- ZeroGPU Architecture Hook ---
try:
import spaces
except ImportError:
# Dummy mock for local CPU testing
class spaces:
@staticmethod
def GPU(*args, **kwargs):
if len(args) == 1 and callable(args[0]): return args[0]
return lambda fn: fn
from huggingface_hub import snapshot_download
def init_llm():
"""
Pre-downloads the model weights onto the CPU host's cache to completely
avoid eating into the strict 60s ZeroGPU quota!
"""
print("[AeroSphere] Pre-flight CPU model download initiating...")
snapshot_download("nvidia/Mistral-NeMo-Minitron-8B-Instruct", ignore_patterns=["*.msgpack", "*.h5", "*.ot", "*.safetensors.index.json"])
print("[AeroSphere] Pre-flight CPU model downloaded successfully!")
llm_pipeline = None
@spaces.GPU(duration=60)
def infer_llm(messages: list) -> str:
from transformers import pipeline
import torch
global llm_pipeline
if llm_pipeline is None:
llm_pipeline = pipeline("text-generation", model="nvidia/Mistral-NeMo-Minitron-8B-Instruct", device_map="auto", torch_dtype=torch.bfloat16)
resp = llm_pipeline(messages, max_new_tokens=400, return_full_text=False, temperature=0.7)
return resp[0]["generated_text"].strip()
def get_next_planet_state(user_input: str, history: list, core_state_dict: dict = None) -> PlanetState:
state = core_state_dict or {}
# 0 ms Regex Matching for absolute parametric overrides (Genesis Spark and Buttons)
i_str = user_input.lower()
fast_path_used = False
color_match = re.search(r"planet_color_hex to .+?\((#[0-9a-fA-F]{6})\)", i_str)
if color_match:
state["planet_color_hex"] = color_match.group(1)
fast_path_used = True
atmos_match = re.search(r"atmosphere_color_hex to .+?\((#[0-9a-fA-F]{6})\)", i_str)
if atmos_match: state["atmosphere_color_hex"] = atmos_match.group(1)
veg_match = re.search(r"vegetation to ([0-9]+(?:\.[0-9]+)?)", i_str)
if veg_match: state["vegetation"] = float(veg_match.group(1))
ocean_match = re.search(r"ocean_level to ([0-9]+(?:\.[0-9]+)?)", i_str)
if ocean_match: state["ocean_level"] = float(ocean_match.group(1))
land_match = re.search(r"land_mass to ([0-9]+(?:\.[0-9]+)?)", i_str)
if land_match: state["land_mass"] = float(land_match.group(1))
cloud_match = re.search(r"cloud_density to ([0-9]+(?:\.[0-9]+)?)", i_str)
if cloud_match: state["cloud_density"] = float(cloud_match.group(1))
storm_match = re.search(r"storm_intensity to ([0-9]+(?:\.[0-9]+)?)", i_str)
if storm_match: state["storm_intensity"] = float(storm_match.group(1))
ice_match = re.search(r"ice_coverage and lava_intensity to ([0-9]+(?:\.[0-9]+)?)", i_str)
if ice_match:
state["ice_coverage"] = float(ice_match.group(1))
state["lava_intensity"] = float(ice_match.group(1))
if fast_path_used:
state["narrative"] = f"COMMAND EXECUTED: GENESIS SPARK. Optimal planetary conditions reached. Biological boom imminent."
final_state = PlanetState.model_validate(state)
final_state.habitability = check_habitability(final_state)
return final_state
# LLM Fallback for Natural Generation
SYSTEM = """You are the AeroSphere Tectonic Evolution Engine. Control physical state based on user interventions.
Output MUST be a single JSON block containing EVERY parameter listed in the valid keys.
CRITICAL LOGIC & SEMANTIC GROUNDING:
- "Mars" / "Red Planet": Use deep red/brown/orange colors, extremely dry (ocean_level: 0.0, ice_coverage: 0.0), zero vegetation.
- "Death Star" / "Machine": Dark grey/metallic colors, extremely high tech_level, zero vegetation, barron.
- "Ice Planet" / "Hoth": Bright white/cyan colors, ice_coverage: 1.0.
- "Specific Colors" / "Surreal": If the user requests extreme colors (purple, neon, gold), strongly generate blazing, highly saturated hex codes.
IMPORTANT: NEVER literally copy Hex Codes! Always mathematically synthesize radically UNIQUE and dynamic hex colors for every generation!
Force your physics engine to understand literal, pop-culture, and abstract concepts perfectly!
Valid keys: "lava_intensity", "ice_coverage", "planet_color_hex", "atmosphere_color_hex", "vegetation", "ocean_level", "land_mass", "cloud_density", "storm_intensity", "tech_level", "narrative".
Example Format:
{
"lava_intensity": 0.0,
"ice_coverage": 0.0,
"planet_color_hex": "#113355",
"atmosphere_color_hex": "#446688",
"vegetation": 0.0,
"ocean_level": 0.8,
"land_mass": 0.2,
"cloud_density": 0.5,
"storm_intensity": 0.4,
"tech_level": 0.0,
"narrative": "A massive flood covers the continent."
}"""
history_text = "\n".join([f"User: {t['content']}" if t['role']=='user' else f"Narrative: {t['content']}" for t in history[-6:]]) if history else "No previous interventions."
user_msg = f"Recent History:\n{history_text}\n\nCurrent State:\n{json.dumps(state)}\n\nUser Intervention: {user_input}\n\nEvolve logically! Do NOT add unrequested JSON fields. Output ONLY JSON."
messages = [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": user_msg}
]
try:
raw_output = infer_llm(messages)
except Exception as e:
import traceback
state["narrative"] = f"> CRITICAL ZEROGPU FAILURE: {str(e)} | TRACE: {traceback.format_exc()[-200:]}"
final_state = PlanetState.model_validate(state)
final_state.habitability = check_habitability(final_state)
return final_state
start_idx = raw_output.find('{')
if start_idx != -1:
raw_output = raw_output[start_idx:]
delta = {}
try:
delta, _ = json.JSONDecoder().raw_decode(raw_output)
except Exception as e:
fast_path_used = False # trigger absolute heuristics
# Fallback robust regex extraction from raw unescaped strings!
nar_match = re.search(r'"narrative"\s*:\s*"([^"]*)', raw_output)
if nar_match: delta["narrative"] = nar_match.group(1).rstrip(", \n}")
for k in ["planet_color_hex", "atmosphere_color_hex"]:
m = re.search(fr'"{k}"\s*:\s*"(#[0-9a-fA-F]{{6}})', raw_output)
if m: delta[k] = m.group(1)
for k in ["lava_intensity", "ice_coverage", "vegetation", "ocean_level", "land_mass", "cloud_density", "storm_intensity", "tech_level"]:
m = re.search(fr'"{k}"\s*:\s*([0-9.]+)', raw_output)
if m: delta[k] = max(0.0, min(1.0, float(m.group(1))))
if delta:
valid_keys = PlanetStateDelta.model_fields.keys()
for k, v in delta.items():
if k in valid_keys and v is not None:
state[k] = v
fast_path_used = True
# --- Python Physical Integrity Safeguards for 8B LLM Limitations ---
if "ice_coverage" in delta and delta["ice_coverage"] > 0.1:
state["lava_intensity"] = 0.0
if "planet_color_hex" not in delta: state["planet_color_hex"] = "#5a6b7c"
if "atmosphere_color_hex" not in delta: state["atmosphere_color_hex"] = "#80b0c0"
elif "lava_intensity" in delta and delta["lava_intensity"] > 0.5:
state["ice_coverage"] = 0.0
state["vegetation"] = 0.0
if "planet_color_hex" not in delta: state["planet_color_hex"] = "#151010"
elif "vegetation" in delta and delta["vegetation"] > 0.1:
state["lava_intensity"] = 0.0
if "planet_color_hex" not in delta: state["planet_color_hex"] = "#1e7050"
# Absolute Fallback if LLM generated an empty dict or crashed
if not fast_path_used and state.get("narrative", "") == core_state_dict.get("narrative", ""):
if 'flood' in i_str or 'water' in i_str or 'ocean' in i_str:
state["lava_intensity"] = 0.0
state["ocean_level"] = min(1.0, state.get("ocean_level", 0.0) + 0.6)
state["planet_color_hex"] = "#113355"
state["narrative"] = "> Tectonic flooding initiated. Oceanic levels critical."
elif 'nuke' in i_str or 'fire' in i_str or 'destroy' in i_str or 'core' in i_str:
state["vegetation"] = 0.0
state["lava_intensity"] = min(1.0, state.get("lava_intensity", 0.0) + 0.8)
state["planet_color_hex"] = "#ff3300"
state["narrative"] = "> Core temperatures rising. Exterminatus cascade triggered."
elif 'seed' in i_str or 'life' in i_str or 'plant' in i_str or 'extract' in i_str:
state["vegetation"] = min(1.0, state.get("vegetation", 0.0) + 0.5)
state["planet_color_hex"] = "#1e7050"
state["narrative"] = "> Biosphere seeded. Vegetation rapidly spreading."
else:
state["narrative"] = f"> ZERO-SHOT ABORT: Model output unparseable text instead of JSON: {raw_output[:100]}"
final_state = PlanetState.model_validate(state)
final_state.habitability = check_habitability(final_state)
return final_state