OSVauco/emma/emma_run.py

65 lines
2.0 KiB
Python

"""
Start Emma: python emma_run.py
Statistikk: python emma_run.py --stats
"""
import sys
import argparse
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from emma.emma_backend_ollama import OllamaBackend
from emma.emma_resonance_persistent import PersistentMorphicMemory
from emma.emma_mcot import EmmaMCoTAgent
from emma.emma_guardrails import EmmaGuardrails
from emma.emma_flynn import FlynnTracker
def main():
parser = argparse.ArgumentParser(description="Emma AI Agent REPL")
parser.add_argument("--model", default="llama3.2")
parser.add_argument("--embed", default="nomic-embed-text")
parser.add_argument("--stats", action="store_true")
args = parser.parse_args()
if args.stats:
s = FlynnTracker().summary()
print("📊 Flynn-statistikk:")
for k, v in (s or {}).items():
print(f" {k}: {v:.4f}" if isinstance(v, float) else f" {k}: {v}")
return
llm = OllamaBackend(model=args.model, embed_model=args.embed)
memory = PersistentMorphicMemory()
guardrails = EmmaGuardrails()
agent = EmmaMCoTAgent(llm=llm, memory=memory)
print(f"🤖 Emma klar | Modell: {args.model} | Morfisk minne: {len(memory)} mønstre")
print("exit=avslutt stats=Flynn-statistikk\n")
history = []
while True:
try:
user_input = input("Chris> ").strip()
except (KeyboardInterrupt, EOFError):
break
if user_input.lower() in ("exit", "quit"):
break
if user_input.lower() == "stats":
print(FlynnTracker().summary())
continue
if not user_input:
continue
ok, reason = guardrails.can_execute(user_input)
if not ok:
print(f"🛡️ {reason}")
continue
response = agent.run(user_input, history)
history.append({"role": "user", "content": user_input})
history.append({"role": "assistant", "content": response})
print(f"Emma> {response}\n")
if __name__ == "__main__":
main()