mvi-ai-engine / reasoning /planner.py
Musombi's picture
Update reasoning/planner.py
0aca8ca verified
import time
from typing import List, Dict
from reasoning.sectors import SECTOR_BEHAVIOR
from reasoning.templates import TEMPLATES
class ReasoningPlanner:
def __init__(self, max_loops: int = 3):
self.max_loops = max_loops
def _classify_sector(self, intent: str, context: List[str]) -> str:
"""
Basic sector detection based on intent or keywords in context.
Returns the sector string.
"""
for sector_name, keywords in SECTOR_BEHAVIOR.items():
if any(word.lower() in " ".join(context + [intent]).lower() for word in keywords):
return sector_name
return "general"
def _select_template(self, sector: str, intent: str, emotion: str) -> str:
"""
Choose an appropriate template phrase for the response
based on sector, intent type, and user emotion.
"""
# Default fallbacks
intent_templates = TEMPLATES.get(intent, TEMPLATES.get("statement"))
template_phrase = intent_templates.get(emotion, intent_templates.get("neutral"))
return template_phrase
def _analyze_turn(
self, intent: str, emotion: str, context: List[str], strategy: str, persona: str
) -> Dict:
sector = self._classify_sector(intent, context)
template_phrase = self._select_template(sector, intent, emotion)
return {
"intent": intent,
"emotion": emotion,
"strategy": strategy,
"persona": persona,
"context_summary": context[-3:],
"sector": sector,
"template": template_phrase,
"needs_clarification": intent == "question" and len(context) < 2
}
def _refine_plan(self, plan: Dict, loop_id: int) -> Dict:
plan["confidence"] = min(0.9, 0.4 + 0.2 * (loop_id + 1))
plan["reasoning_depth"] = loop_id + 1
plan["timestamp"] = time.time()
if plan["strategy"] == "cautious":
plan["confidence"] = min(plan["confidence"], 0.7)
elif plan["strategy"] == "bold":
plan["confidence"] = min(1.0, plan["confidence"] + 0.1)
return plan
def plan(
self,
intent: str,
emotion: str,
context: List[str],
strategy: str = "normal",
persona: str = "assistant"
) -> Dict:
plan = self._analyze_turn(intent, emotion, context, strategy, persona)
for i in range(self.max_loops):
plan = self._refine_plan(plan, i)
if plan["confidence"] > 0.85:
break
return plan