Initial commit: Natiris AI Agent Orchestration System
This commit is contained in:
204
core/PsychologyEngine_old.py
Executable file
204
core/PsychologyEngine_old.py
Executable file
@@ -0,0 +1,204 @@
|
||||
#!/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 vorzustel
|
||||
len."
|
||||
"
|
||||
elif trust_level == 2:
|
||||
context = "
|
||||
"Du begegnest einem Vertrauten. Du antwortest warm, aber noch zurückhaltend, maximal 2 Sät
|
||||
ze."
|
||||
"
|
||||
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()
|
||||
Reference in New Issue
Block a user