# /intergrations/botframework/bot.py """ Simple MBF bot: - 'help' / 'capabilities' shows features - 'reverse ' returns reversed text - otherwise delegates to AgenticCore ChatBot (sentiment) if available """ from typing import List, Optional, Dict, Any from botbuilder.core import ActivityHandler, TurnContext from botbuilder.schema import ChannelAccount, ActivityTypes from skills import normalize, reverse_text, capabilities, is_empty # Try to import AgenticCore; if unavailable, provide a tiny fallback. try: from agenticcore.chatbot.services import ChatBot # real provider-backed bot except Exception: class ChatBot: # fallback shim for offline/dev def reply(self, message: str) -> Dict[str, Any]: return { "reply": "Noted. (local fallback reply)", "sentiment": "neutral", "confidence": 0.5, } def _format_sentiment(res: Dict[str, Any]) -> str: """Compose a user-facing string from ChatBot reply payload.""" reply = (res.get("reply") or "").strip() label: Optional[str] = res.get("sentiment") conf = res.get("confidence") if label is not None and conf is not None: return f"{reply} (sentiment: {label}, confidence: {float(conf):.2f})" return reply or "I'm not sure what to say." def _help_text() -> str: """Single source of truth for the help/capability text.""" feats = "\n".join(f"- {c}" for c in capabilities()) return ( "I can reverse text and provide concise replies with sentiment.\n" "Commands:\n" "- help | capabilities\n" "- reverse \n" "General text will be handled by the ChatBot service.\n\n" f"My capabilities:\n{feats}" ) class SimpleBot(ActivityHandler): """Minimal ActivityHandler with local commands + ChatBot fallback.""" def __init__(self, chatbot: Optional[ChatBot] = None): self._chatbot = chatbot or ChatBot() async def on_members_added_activity( self, members_added: List[ChannelAccount], turn_context: TurnContext ): for member in members_added: if member.id != turn_context.activity.recipient.id: await turn_context.send_activity("Hello! Type 'help' to see what I can do.") async def on_message_activity(self, turn_context: TurnContext): if turn_context.activity.type != ActivityTypes.message: return text = (turn_context.activity.text or "").strip() if is_empty(text): await turn_context.send_activity("Please enter a message (try 'help').") return cmd = normalize(text) if cmd in {"help", "capabilities"}: await turn_context.send_activity(_help_text()) return if cmd.startswith("reverse "): original = text.split(" ", 1)[1] if " " in text else "" await turn_context.send_activity(reverse_text(original)) return # ChatBot fallback (provider-agnostic sentiment/reply) try: result = self._chatbot.reply(text) await turn_context.send_activity(_format_sentiment(result)) except Exception: await turn_context.send_activity(f"You said: {text}")