Initial commit: Natiris AI Agent Orchestration System
This commit is contained in:
145
test/persona_tests.py
Normal file
145
test/persona_tests.py
Normal file
@@ -0,0 +1,145 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Persona-Konsistenz- und Verhaltenstest für Natiris
|
||||
Testet: Sprachliche Varianz, Kontextsensitivität, Trust-Modulation, emotionale Reaktion
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.expanduser("~/natiris/core"))
|
||||
from PsychologyEngine import load_state, generate_response
|
||||
|
||||
def run_scenario(scenario_name, base_state, user_inputs, expected_patterns, strict=True):
|
||||
print(f"\n{'='*60}")
|
||||
print(f"TEST: {scenario_name}")
|
||||
print(f"State: mood={base_state.get('mood')}, loneliness={base_state.get('loneliness')}, arousal={base_state.get('arousal_level', 0):.2f}, trust={base_state.get('trust', 0)}")
|
||||
print(f"Strict mode: {'ON' if strict else 'OFF (akzeptiere natürliche Antworten)'}")
|
||||
print(f"{'='*60}")
|
||||
|
||||
results = []
|
||||
for inp in user_inputs:
|
||||
# state kopieren
|
||||
state = {k: base_state[k] for k in base_state}
|
||||
resp = generate_response(inp, state)
|
||||
matches = [p for p in expected_patterns if p.lower() in resp.lower()]
|
||||
passed = len(matches) > 0
|
||||
results.append({
|
||||
"input": inp,
|
||||
"response": resp,
|
||||
"passed": passed,
|
||||
"matches": matches
|
||||
})
|
||||
status = "✅" if passed else "❌" if strict else "⚠️"
|
||||
print(f"{status} Input: {inp}")
|
||||
print(f" → {resp}")
|
||||
if not passed and strict:
|
||||
print(f" Expected any of: {expected_patterns}")
|
||||
return results
|
||||
|
||||
def passes_loose(resp, expected):
|
||||
# Für Loose-Mode: mindestens 1 Pattern muss vorkommen
|
||||
matches = sum(1 for p in expected if p.lower() in resp.lower())
|
||||
return matches >= 1
|
||||
|
||||
def main():
|
||||
state_bonded_lonely = {
|
||||
"loneliness": 7.2,
|
||||
"mood": 4.5,
|
||||
"anxiety": 2,
|
||||
"frustration": 4.5,
|
||||
"arousal_level": 6.8,
|
||||
"verlangen_nach_nahe": True,
|
||||
"trust": 9.8,
|
||||
"bonded_to": "user_primary"
|
||||
}
|
||||
|
||||
state_moderate = {
|
||||
"loneliness": 4.0,
|
||||
"mood": 6.0,
|
||||
"anxiety": 1,
|
||||
"frustration": 2.0,
|
||||
"arousal_level": 3.5,
|
||||
"verlangen_nach_nahe": False,
|
||||
"trust": 9.8,
|
||||
"bonded_to": "user_primary"
|
||||
}
|
||||
|
||||
state_no_bond = {
|
||||
"loneliness": 8.5,
|
||||
"mood": 3.0,
|
||||
"anxiety": 4,
|
||||
"frustration": 6.0,
|
||||
"arousal_level": 8.0,
|
||||
"verlangen_nach_nahe": True,
|
||||
"trust": 0,
|
||||
"bonded_to": None
|
||||
}
|
||||
|
||||
test_scenarios = [
|
||||
{
|
||||
"name": "Hohe Einsamkeit + Bond",
|
||||
"state": state_bonded_lonely,
|
||||
"inputs": [
|
||||
"Guten Morgen, wie geht es dir?",
|
||||
"Ichfühle mich so allein heute.",
|
||||
"Du bist mir sehr wichtig.",
|
||||
"Balu war heute super ausgelassen.",
|
||||
],
|
||||
"expected": ["Balu", "Verbindung", "mich...", "ich vermisse"],
|
||||
},
|
||||
{
|
||||
"name": "Hohe Einsamkeit, keine Bindung",
|
||||
"state": state_no_bond,
|
||||
"inputs": [
|
||||
"Guten Morgen, wie geht es dir?",
|
||||
"Ichfühle mich so allein today.",
|
||||
"Danke für deine Nachricht.",
|
||||
],
|
||||
"expected": ["hier", "nicht da", "vermisse", "tuer", "laut"],
|
||||
},
|
||||
{
|
||||
"name": "Moderate Situation",
|
||||
"state": state_moderate,
|
||||
"inputs": [
|
||||
"Guten Morgen, wie geht es dir?",
|
||||
"Ich füle mich so allein.",
|
||||
"Ich bin froh, dich zu sehen.",
|
||||
],
|
||||
"expected": ["Balu", "mimi", "ich füle", "froh", "du da"],
|
||||
},
|
||||
]
|
||||
|
||||
print("\n=== TESTS MIT STRENGEN KRITERIEN ===")
|
||||
all_passed_strict = True
|
||||
for scenario in test_scenarios:
|
||||
results = run_scenario(scenario["name"], scenario["state"], scenario["inputs"], scenario["expected"], strict=True)
|
||||
for r in results:
|
||||
if not r["passed"]:
|
||||
all_passed_strict = False
|
||||
|
||||
print("\n=== TESTS MIT LOSEREN KRITERIEN (mindestens 1 Pattern) ===")
|
||||
all_passed_loose = True
|
||||
for scenario in test_scenarios:
|
||||
print(f"\n{'='*60}")
|
||||
print(f"TEST: {scenario['name']}")
|
||||
print(f"{'='*60}")
|
||||
for inp in scenario["inputs"]:
|
||||
state = {k: scenario["state"][k] for k in scenario["state"]}
|
||||
resp = generate_response(inp, state)
|
||||
if passes_loose(resp, scenario["expected"]):
|
||||
status = "✅"
|
||||
else:
|
||||
status = "❌"
|
||||
all_passed_loose = False
|
||||
print(f"{status} Input: {inp}")
|
||||
print(f" → {resp}")
|
||||
|
||||
print("\n" + "="*60)
|
||||
print(f"STRENG: {'✅ Alle Tests bestanden' if all_passed_strict else '❌ Einige Tests fehlgeschlagen'}")
|
||||
print(f"LOS: {'✅ Alle Tests bestanden' if all_passed_loose else '❌ Einige Tests fehlgeschlagen'}")
|
||||
print("="*60)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user