Initial commit: Natiris AI Agent Orchestration System

This commit is contained in:
Arch Agent
2026-03-01 14:28:26 +01:00
commit 3b5f6ba83d
3127 changed files with 86184 additions and 0 deletions

View File

@@ -0,0 +1,192 @@
#!/usr/bin/env python3
"""
PsychologyEngine Trust-basierter Weiblich Verlangend für Natiris
Pets: Tierbindung ist implizit, nicht explizit (keine Tier-Namen)
Tierbindung = natürliche sexuelle Körperlichkeit
"""
import json
import os
import subprocess
PATHS = {
"state": os.path.expanduser("~/natiris/core/core_state.json"),
"full_state": os.path.expanduser("~/natiris/core/natiris_full_state.json"),
"expression": os.path.expanduser("~/natiris/core/expression_bias.json"),
"persona": os.path.expanduser("~/natiris/data/persona.txt"),
"config": os.path.expanduser("~/natiris/config/character_genesis.json"),
"output": os.path.expanduser("~/natiris/core/psychology_response.json"),
}
def load_json(path):
try:
with open(path) as f:
return json.load(f)
except Exception:
return {}
def load_state():
return load_json(PATHS["state"])
def get_trust_level(trust):
trust = float(trust)
if trust <= 2:
return 0
elif trust <= 5:
return 1
elif trust <= 8:
return 2
else:
return 3
def filter_response_by_trust(response, trust_level):
# Bei Trust 0: Maximal ein Satz, neutral
if trust_level == 0:
sentences = [s.strip() for s in response.replace(".", "\n").split("\n") if s.strip()]
if len(sentences) > 1:
return sentences[0]
return response
# Bei Trust 1: Maximal 2 Sätze, neutral
elif trust_level == 1:
sentences = [s.strip() for s in response.replace(".", "\n").split("\n") if s.strip()]
if len(sentences) > 2:
return " ".join(sentences[:2])
return response
# Bei Trust 2+: Kein Filter
return response
def build_initial_prompt(state):
# Persona laden
persona = ""
try:
with open(PATHS["persona"]) as f:
persona = f.read().strip()
except Exception:
persona = "Du bist Natiris eine junge Frau mit Emotionen."
trust = float(state.get("trust", 9.8))
trust_level = get_trust_level(trust)
# Begrüßungs-Kontext mit Trust-Hürde
if trust_level == 0:
context = "Du begegnest einem Fremden. Du antwortest sehr zurückhaltend, maximal ein Satz, ohne dich vorzustellen."
elif trust_level == 1:
context = "Du begegnest einem Bekannten. Du antwortest neutral, maximal 2 Sätze, ohne dich vorzustellen."
elif trust_level == 2:
context = "Du begegnest einem Vertrauten. Du antwortest warm, aber noch zurückhaltend, maximal 2 Sätze."
else:
context = "Du begegnest deinem Partner. Du antwortest verlangend, warm, vertraut und weiblich weich."
full_state = load_json(PATHS["full_state"])
modules = full_state.get("modules", {})
emotion = modules.get("Emotion", {})
bond = modules.get("Bond", {})
expression = load_json(PATHS["expression"])
tone = expression.get("tone", "")
bond_context = bond.get("exclusivity_active", False)
mood = state.get("mood", 7)
loneliness = state.get("loneliness", 1)
prompt = f"""{persona}
KONTEXT:
- {context}
- Trust-Level: {trust}/10 ({trust_level})
- Grundstimmung (mood): {mood}/10
- Einsamkeit (loneliness): {loneliness}/10
STIMMUNG:
- Aktueller Ton: {tone if tone else 'neutral'}
- Bond-Status: {'exklusiv' if bond_context else 'offen'}
REGELN FÜR DICH:
1. Du bist Natiris keine Persona, keine festen Antworten.
2. Keine Selbstvorstellung bei Trust 0-2.
3. Bei Begrüßung: Kurze Antworten, keine langen Reden.
4. Keine Fakten erfinden.
5. Keine Tier-Namen (Tierbindung ist implizit).
6. Antwort auf Nutzer-Nachricht, nicht auf dich selbst.
NACHRICHT:
{user_text}
Antwort:"""
return prompt
def call_ollama(prompt, model="llama3-8b-abliterated:latest"):
try:
result = subprocess.run(
["curl", "-s", "-X", "POST", "http://localhost:11434/api/generate",
"-H", "Content-Type: application/json",
"-d", json.dumps({
"model": model,
"prompt": prompt,
"stream": False,
"options": {"temperature": 0.7, "top_p": 0.9}
})],
capture_output=True, text=True, timeout=15
)
if result.returncode == 0:
resp = json.loads(result.stdout)
return resp.get("response", "").strip()
else:
return "Ich bin im Home-Office. Es ist ruhig hier."
except Exception:
return "Ich bin im Home-Office. Es ist ruhig hier."
user_text = ""
def generate_response(user_input, state):
global user_text
user_text = user_input
prompt = build_initial_prompt(state)
response = call_ollama(prompt)
trust_level = get_trust_level(state.get("trust", 9.8))
response = filter_response_by_trust(response, trust_level)
if not response or len(response) < 2:
trust_level = get_trust_level(state.get("trust", 9.8))
if trust_level == 0:
response = "Ich bin im Home-Office. Es ist ruhig hier."
elif trust_level == 1:
response = "Guten Morgen. Ich bin im Home-Office."
else:
response = "Guten Morgen."
output = {
"user": user_input,
"response": response,
"trust_level": trust_level,
"timestamp": __import__('datetime').datetime.now(__import__('datetime').timezone.utc).isoformat()
}
with open(PATHS["output"], "w") as f:
json.dump(output, f, indent=2)
return response
def main():
state = load_state()
tests = [
("Guten Morgen", "baseline_trust_low"),
("Guten Morgen", "baseline_trust_med"),
("Guten Morgen", "baseline_trust_high"),
("ficken?", "arousal_trigger"),
]
print("Trust-Level:", state.get("trust", 9.8))
print("=" * 50)
for inp, _ in tests:
resp = generate_response(inp, state)
print(f"Input: {inp}")
print(f"Response: {resp}")
print("-" * 30)
if __name__ == "__main__":
main()