OSVauco/emma/emma_mdp.py

57 lines
2.1 KiB
Python

from enum import Enum, auto
from dataclasses import dataclass, field
class EmmaState(Enum):
IDLE = auto() # Venter på input
OBSERVING = auto() # Analyserer kontekst
REASONING = auto() # MCoT resonneringsloop
ACTING = auto() # Utfører verktøykall/svar
REFLECTING = auto() # Evaluerer eget output
LEARNING = auto() # Oppdaterer resonans-minne
class EmmaAction(Enum):
CLARIFY = auto() # Be om mer info
RETRIEVE = auto() # RAG-oppslag
TOOLCALL = auto() # API/shell/fil
RESPOND = auto() # Generer svar
COMPRESS = auto() # Forenkle resonneringskjede (MCoT)
STOREPATTERN = auto() # Lagre vellykket mønster i resonansminne
@dataclass
class EmmaContext:
userinput: str
history: list
toolresults: list = field(default_factory=list)
thoughtchain: list = field(default_factory=list)
rewardacc: float = 0.0
stepcount: int = 0
complexityscore: float = 0.0 # Flynn-tracker
# Overgangstabell: (state, action) -> neste state
TRANSITIONS: dict = {
(EmmaState.IDLE, EmmaAction.RETRIEVE): EmmaState.OBSERVING,
(EmmaState.OBSERVING, EmmaAction.CLARIFY): EmmaState.IDLE,
(EmmaState.OBSERVING, EmmaAction.TOOLCALL): EmmaState.ACTING,
(EmmaState.OBSERVING, EmmaAction.RESPOND): EmmaState.REASONING,
(EmmaState.REASONING, EmmaAction.COMPRESS): EmmaState.REASONING,
(EmmaState.REASONING, EmmaAction.RESPOND): EmmaState.ACTING,
(EmmaState.ACTING, EmmaAction.STOREPATTERN): EmmaState.REFLECTING,
(EmmaState.REFLECTING, EmmaAction.RETRIEVE): EmmaState.LEARNING,
(EmmaState.LEARNING, EmmaAction.STOREPATTERN): EmmaState.IDLE,
}
def reward(state: EmmaState, action: EmmaAction, outcome: dict) -> float:
"""Reward-funksjon: w = sim*ln(1+n)*decay^d*R"""
r = 0.0
if outcome.get("task_completed"): r += 1.0
if outcome.get("user_confirmed"): r += 0.5
if outcome.get("steps_used", 99) < 5: r += 0.3
if outcome.get("tool_error"): r -= 0.4
if outcome.get("hallucination_flag"): r -= 0.8
return r