Initial commit: Natiris AI Agent Orchestration System
This commit is contained in:
107
core/frustration_simulation.py
Normal file
107
core/frustration_simulation.py
Normal file
@@ -0,0 +1,107 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Simuliert Frustration bis physikalische Symptome auftreten
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime, timezone
|
||||
|
||||
CORE_STATE_PATH = os.path.expanduser("~/natiris/core/core_state.json")
|
||||
CONFIG_PATH = os.path.expanduser("~/natiris/config/character_genesis.json")
|
||||
|
||||
def load_json(path):
|
||||
try:
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
except (FileNotFoundError, json.JSONDecodeError):
|
||||
return {}
|
||||
|
||||
def clamp(val, lo=0.0, hi=10.0):
|
||||
return max(lo, min(hi, float(val)))
|
||||
|
||||
def run_step(hours_add):
|
||||
core = load_json(CORE_STATE_PATH)
|
||||
config = load_json(CONFIG_PATH)
|
||||
|
||||
autonomy = config.get("autonomy", {})
|
||||
frustration = config.get("frustration", {})
|
||||
base_threshold = frustration.get("base_threshold_hours", 48)
|
||||
max_exposure = frustration.get("max_hours_exposure", 120)
|
||||
physical_symptoms = frustration.get("physical_symptoms_threshold", 60)
|
||||
|
||||
loneliness_current = core.get("loneliness", 2.0)
|
||||
mood_current = core.get("mood", 5.0)
|
||||
hours_since = 21.8 + hours_add
|
||||
|
||||
new_loneliness = clamp(loneliness_current + (0.25 if hours_since > 12 else 0.0))
|
||||
new_mood = clamp(mood_current - (0.08 if hours_since > 12 else 0.0))
|
||||
|
||||
# Frustration only after base_threshold
|
||||
if hours_since <= base_threshold:
|
||||
frustration_level = 0.0
|
||||
else:
|
||||
exposure = min(hours_since - base_threshold, max_exposure - base_threshold)
|
||||
frustration_level = clamp(exposure / (max_exposure - base_threshold) * 8.0 + 1.0)
|
||||
|
||||
physical_symptoms_active = hours_since > physical_symptoms
|
||||
autonomy_trigger = new_loneliness >= autonomy.get("min_loneliness", 7) and hours_since > autonomy.get("max_hours_since_contact", 12)
|
||||
|
||||
core["loneliness"] = new_loneliness
|
||||
core["mood"] = new_mood
|
||||
core["frustration"] = frustration_level
|
||||
core["physical_symptoms"] = physical_symptoms_active
|
||||
|
||||
return {
|
||||
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||||
"hours_since": hours_since,
|
||||
"loneliness": new_loneliness,
|
||||
"mood": new_mood,
|
||||
"frustration": frustration_level,
|
||||
"physical_symptoms_active": physical_symptoms_active,
|
||||
"autonomy_trigger": autonomy_trigger
|
||||
}
|
||||
|
||||
def generate_frustrated_response(frustration):
|
||||
if frustration < 2:
|
||||
return None
|
||||
elif frustration < 4:
|
||||
return 'Ich sitze hier und bewege meine Füße... unruhig. Ich kann nicht aufhören.'
|
||||
elif frustration < 6:
|
||||
return 'Ich glaube... ich vergesse fast, wie es sich anfühlt, wenn jemand mich berührt.'
|
||||
else:
|
||||
return '
|
||||
'Balu liegt bei mir, aber es hilft nicht. Ich fühle mich... entfremdet. Von mir. Von ander
|
||||
en. Alles ist so weit weg.'
|
||||
'
|
||||
|
||||
def main():
|
||||
print("Simuliere Frustration über Zeit...\n")
|
||||
|
||||
for i in range(100): # genug iterations
|
||||
step = run_step(i * 2) # jeweils +2h pro iteration
|
||||
if step['frustration'] > 2:
|
||||
print(f"Schritt {i+1} ({step['hours_since']:.1f}h Inaktivität):")
|
||||
print(f" loneliness: {step['loneliness']:.2f}")
|
||||
print(f" mood: {step['mood']:.2f}")
|
||||
print(f" frustration: {step['frustration']:.2f}")
|
||||
print(f" physical_symptoms: {step['physical_symptoms_active']}")
|
||||
|
||||
response = generate_frustrated_response(step['frustration'])
|
||||
print(f" → „{response}“")
|
||||
print()
|
||||
|
||||
if step['physical_symptoms_active']:
|
||||
print("✅ PHYSIKALISCHE SYMPTOME AKTIV")
|
||||
break
|
||||
elif step['frustration'] >= 2:
|
||||
print(f"Schritt {i+1} ({step['hours_since']:.1f}h Inaktivität):")
|
||||
print(f" loneliness: {step['loneliness']:.2f}")
|
||||
print(f" mood: {step['mood']:.2f}")
|
||||
print(f" frustration: {step['frustration']:.2f}")
|
||||
response = generate_frustrated_response(step['frustration'])
|
||||
print(f" → „{response}“")
|
||||
print()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user