#!/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()