AgentOS-Core-V2 / emotion_core.py
Tpayne101's picture
Create emotion_core.py
32328ca verified
# emotion_core.py
# Lightweight sentiment + arousal + trait inferences (no external deps)
import re
_POS = {
"love","like","enjoy","great","good","amazing","excited","confident","proud","win",
"focus","focused","progress","grow","learning","curious","optimistic","strong","ready",
"grateful","hyped","calm","peace","solid","clear","vision","hungry","ambitious"
}
_NEG = {
"hate","dislike","bad","terrible","awful","sad","angry","upset","lost","stuck",
"tired","worried","anxious","stress","stressed","fail","failure","confused","quit",
"overwhelmed","mad","frustrated"
}
_AROUSAL_UP = {
"hyped","excited","now","today","urgent","fast","go","run","grind","push","shipping",
"launch","win","attack","dominate","scale"
}
_AROUSAL_DOWN = {"calm","slow","reflect","breathe","steady","patient","peace","chill"}
TRAIT_MAP = {
"ambition": {"keywords": {"ambitious","billionaire","build","empire","dominate","scale","win","grind","goal"}, "pos": +2, "neg": -1},
"optimism": {"keywords": {"optimistic","confident","great","good","amazing","believe","can","possible"}, "pos": +2, "neg": -2},
"resilience": {"keywords": {"again","retry","keep","persist","bounce","comeback","despite","even if"}, "pos": +2, "neg": 0},
"focus": {"keywords": {"focus","focused","discipline","plan","system","consistent","daily"}, "pos": +2, "neg": -1},
"curiosity": {"keywords": {"curious","learn","why","how","explore","research","test"}, "pos": +2, "neg": 0},
"calm": {"keywords": {"calm","steady","patient","peace","collected"}, "pos": +2, "neg": -2},
}
def _tokens(text: str):
return set(re.findall(r"[a-zA-Z']+", text.lower()))
class EmotionAnalyzer:
def analyze(self, text: str):
toks = _tokens(text)
pos_hits = len(toks & _POS)
neg_hits = len(toks & _NEG)
raw = pos_hits - neg_hits
# sentiment in [-1,1]
sentiment = 0.0
if raw != 0:
sentiment = max(-1.0, min(1.0, raw / 5.0))
# arousal in [0,1]
arousal = 0.5
up = len(toks & _AROUSAL_UP)
down = len(toks & _AROUSAL_DOWN)
arousal = max(0.0, min(1.0, 0.5 + 0.15 * (up - down)))
# tags
tags = []
if sentiment > 0.25: tags.append("positive")
if sentiment < -0.25: tags.append("negative")
if arousal >= 0.65: tags.append("high-energy")
if arousal <= 0.35: tags.append("low-energy")
# trait deltas
trait_deltas = {}
for trait, spec in TRAIT_MAP.items():
found = any(k in toks for k in spec["keywords"])
if found:
trait_deltas[trait] = spec["pos"]
elif sentiment < -0.4 and trait in ("optimism","calm","focus"):
trait_deltas[trait] = spec["neg"]
return {
"sentiment": sentiment,
"arousal": arousal,
"tags": tags,
"trait_deltas": trait_deltas
}