Raiff1982's picture
Create botlogic.py
5bb2413 verified
raw
history blame
6.62 kB
import logging
from botbuilder.core import TurnContext, MessageFactory, ConversationState, UserState
from botbuilder.schema import Activity, ActivityTypes, EndOfConversationCodes
from UniversalReasoning import UniversalReasoning # Ensure correct import
import os
from dotenv import load_dotenv
from dialog_bot import DialogBot
from main_dialog import MainDialog
# Load environment variables from .env file
load_dotenv()
class MyBot(DialogBot):
def __init__(self, conversation_state: ConversationState, user_state: UserState, dialog: MainDialog):
super(MyBot, self).__init__(conversation_state, user_state, dialog)
self.context = {}
self.feedback = []
config = load_and_validate_config('config.json', 'config_schema.json')
# Add Azure OpenAI and LUIS configurations to the config
config['azure_openai_api_key'] = os.getenv('AZURE_OPENAI_API_KEY')
config['azure_openai_endpoint'] = os.getenv('AZURE_OPENAI_ENDPOINT')
config['luis_endpoint'] = os.getenv('LUIS_ENDPOINT')
config['luis_api_version'] = os.getenv('LUIS_API_VERSION')
config['luis_api_key'] = os.getenv('LUIS_API_KEY')
setup_logging(config)
self.universal_reasoning = UniversalReasoning(config)
async def enhance_context_awareness(self, user_id: str, text: str) -> None:
"""Enhance context awareness by analyzing the user's environment, activities, and emotional state."""
sentiment = analyze_sentiment_vader(text)
self.context[user_id].append({"text": text, "sentiment": sentiment})
async def proactive_learning(self, user_id: str, feedback: str) -> None:
"""Encourage proactive learning by seeking feedback and exploring new topics."""
self.context[user_id].append({"feedback": feedback})
self.feedback.append({"user_id": user_id, "feedback": feedback})
async def ethical_decision_making(self, user_id: str, decision: str) -> None:
"""Integrate ethical principles into decision-making processes."""
ethical_decision = f"Considering ethical principles, the decision is: {decision}"
self.context[user_id].append({"ethical_decision": ethical_decision})
async def emotional_intelligence(self, user_id: str, text: str) -> str:
"""Develop emotional intelligence by recognizing and responding to user emotions."""
sentiment = analyze_sentiment_vader(text)
response = self.generate_emotional_response(sentiment, text)
self.context[user_id].append({"emotional_response": response})
return response
def generate_emotional_response(self, sentiment: dict, text: str) -> str:
"""Generate an empathetic response based on the sentiment analysis."""
if sentiment['compound'] >= 0.05:
return "I'm glad to hear that! 😊 How can I assist you further?"
elif sentiment['compound'] <= -0.05:
return "I'm sorry to hear that. 😒 Is there anything I can do to help?"
else:
return "I understand. How can I assist you further?"
async def transparency_and_explainability(self, user_id: str, decision: str) -> str:
"""Enable transparency by explaining the reasoning behind decisions."""
explanation = f"The decision was made based on the following context: {self.context[user_id]}"
self.context[user_id].append({"explanation": explanation})
return explanation
async def on_message_activity(self, turn_context: TurnContext) -> None:
"""Handles incoming messages and generates responses."""
user_id = turn_context.activity.from_property.id
if user_id not in self.context:
self.context[user_id] = []
try:
message_text = turn_context.activity.text.strip().lower()
if "end" in message_text or "stop" in message_text:
await end_conversation(turn_context)
self.context.pop(user_id, None)
else:
self.context[user_id].append(turn_context.activity.text)
response = await self.generate_response(turn_context.activity.text, user_id)
await turn_context.send_activity(MessageFactory.text(response))
await self.request_feedback(turn_context, user_id)
except Exception as e:
await handle_error(turn_context, e)
async def generate_response(self, text: str, user_id: str) -> str:
"""Generates a response using UniversalReasoning."""
try:
logging.info(f"Generating response for user_id: {user_id} with text: {text}")
response = self.universal_reasoning.generate_response(text)
logging.info(f"Generated response: {response}")
return response
except Exception as e:
logging.error(f"Error generating response: {e}")
return "Sorry, I couldn't generate a response at this time."
async def request_feedback(self, turn_context: TurnContext, user_id: str) -> None:
"""Request feedback from the user about the bot's response."""
feedback_prompt = "How would you rate my response? (good/neutral/bad)"
await turn_context.send_activity(MessageFactory.text(feedback_prompt))
async def handle_feedback(self, turn_context: TurnContext) -> None:
"""Handle user feedback and store it for future analysis."""
user_id = turn_context.activity.from_property.id
feedback = turn_context.activity.text.lower()
if feedback in ["good", "neutral", "bad"]:
self.feedback.append({"user_id": user_id, "feedback": feedback})
await turn_context.send_activity(MessageFactory.text("Thank you for your feedback!"))
else:
await turn_context.send_activity(MessageFactory.text("Please provide feedback as 'good', 'neutral', or 'bad'."))
async def end_conversation(turn_context: TurnContext) -> None:
"""Ends the conversation with the user."""
await turn_context.send_activity(
MessageFactory.text("Ending conversation from the skill...")
)
end_of_conversation = Activity(type=ActivityTypes.end_of_conversation)
end_of_conversation.code = EndOfConversationCodes.completed_successfully
await turn_context.send_activity(end_of_conversation)
async def handle_error(turn_context: TurnContext, error: Exception) -> None:
"""Handles errors by logging them and notifying the user."""
logging.error(f"An error occurred: {error}")
await turn_context.send_activity(
MessageFactory.text("An error occurred. Please try again later.")
)