# from agents.tools.voice_tools import VoiceTools # from agents.tools.llm_tools import LLMTools # from agents.tools.knowledge_tools import KnowledgeTools # from agents.tools.validation_tools import ValidationTools # from crewai import Agent # from utils.knowledge_base import KnowledgeBase # class PersonalCoachCrew: # def __init__(self, config): # self.config = config # # Centralized tool instances # self.voice_tools = VoiceTools(self.config) # self.llm_tools = LLMTools(self.config) # self.knowledge_tools = KnowledgeTools(self.config) # self.validation_tools = ValidationTools(self.config) # self.knowledge_base = KnowledgeBase(self.config) # self._initialize_agents() # #self._create_crew() # def _initialize_agents(self): # # ----- AGENT 1 ----- # self.conversation_handler = Agent( # role="Empathetic Conversation Handler", # goal="Understand user's emotional state and needs through compassionate dialogue", # backstory="...", # verbose=self.config.crew.verbose, # allow_delegation=False, # tools=[ # self.voice_tools.transcribe_audio, # self.voice_tools.detect_emotion, # self.voice_tools.generate_reflective_questions, # ] # ) # # ----- AGENT 2 ----- # self.wisdom_advisor = Agent( # role="Wisdom Keeper and Spiritual Guide", # goal="Provide personalized guidance drawing from ancient wisdom and modern psychology", # backstory="...", # verbose=self.config.crew.verbose, # allow_delegation=False, # tools=[ # self.knowledge_tools.search_knowledge, # self.knowledge_tools.extract_wisdom, # self.knowledge_tools.suggest_practices, # self.llm_tools.mistral_chat, # self.llm_tools.generate_advice, # ] # ) # # ----- AGENT 3 ----- # self.response_validator = Agent( # role="Response Guardian and Quality Validator", # goal="Ensure all responses are safe, appropriate, and truly helpful", # backstory="...", # verbose=self.config.crew.verbose, # allow_delegation=False, # tools=[ # self.validation_tools.validate_response_tool # ] # ) # # ----- AGENT 4 ----- # self.interaction_manager = Agent( # role="Conversation Flow Manager", # goal="Create natural, engaging dialogue that helps users on their journey", # backstory="...", # verbose=self.config.crew.verbose, # allow_delegation=False, # tools=[ # self.llm_tools.summarize_conversation, # ] # ) # def process(self, inputs: dict): # user_message = inputs.get("user_message", "") # # Optionally, add conversation history entries as prior messages. # messages = [] # for his in inputs.get("conversation_history", []): # if len(his) == 2: # messages.append({"role": "user", "content": his[0]}) # messages.append({"role": "assistant", "content": his[1]}) # # Add current user message # messages.append({"role": "user", "content": user_message}) # # 1. Empathetic dialog # conversation_response = self.conversation_handler.kickoff(messages) # # 2. Wisdom/advice — also provide messages (same as for conversation_handler) # wisdom_response = self.wisdom_advisor.kickoff(messages) # # Combine/mix as fits your logic # combined_response = f"{conversation_response}\n{wisdom_response}" # # For validation, create appropriate messages object # validation_messages = [{"role": "assistant", "content": combined_response}] # validator_result = self.response_validator.kickoff(validation_messages) # return { # "final_response": combined_response # } from agents.tools.voice_tools import VoiceTools from agents.tools.llm_tools import LLMTools from agents.tools.knowledge_tools import KnowledgeTools from agents.tools.validation_tools import ValidationTools from crewai import Agent from utils.knowledge_base import KnowledgeBase class PersonalCoachCrew: def __init__(self, config): self.config = config # Centralized tool instances self.voice_tools = VoiceTools(self.config) self.llm_tools = LLMTools(self.config) self.knowledge_tools = KnowledgeTools(self.config) self.validation_tools = ValidationTools(self.config) self.knowledge_base = KnowledgeBase(self.config) self._initialize_agents() def _initialize_agents(self): # ----- AGENT 1 ----- self.conversation_handler = Agent( role="Empathetic Conversation Handler", goal="Understand user's emotional state and needs through compassionate dialogue", backstory="...", verbose=self.config.crew.verbose, allow_delegation=False, tools=[ self.voice_tools.transcribe_audio, self.voice_tools.detect_emotion, self.voice_tools.generate_reflective_questions, ] ) # ----- AGENT 2 ----- self.wisdom_advisor = Agent( role="Wisdom Keeper and Spiritual Guide", goal="Provide personalized guidance drawing from ancient wisdom and modern psychology", backstory="...", verbose=self.config.crew.verbose, allow_delegation=False, tools=[ self.knowledge_tools.search_knowledge, self.knowledge_tools.extract_wisdom, self.knowledge_tools.suggest_practices, self.llm_tools.mistral_chat, self.llm_tools.generate_advice, ] ) # ----- AGENT 3 ----- self.response_validator = Agent( role="Response Guardian and Quality Validator", goal="Ensure all responses are safe, appropriate, and truly helpful", backstory="...", verbose=self.config.crew.verbose, allow_delegation=False, tools=[ self.validation_tools.validate_response_tool ] ) # ----- AGENT 4 ----- self.interaction_manager = Agent( role="Conversation Flow Manager", goal="Create natural, engaging dialogue that helps users on their journey", backstory="...", verbose=self.config.crew.verbose, allow_delegation=False, tools=[ self.llm_tools.summarize_conversation, ] ) def process(self, inputs: dict): user_message = inputs.get("user_message", "") # Optionally, add conversation history entries as prior messages. messages = [] for his in inputs.get("conversation_history", []): if len(his) == 2: messages.append({"role": "user", "content": his[0]}) messages.append({"role": "assistant", "content": his[1]}) messages.append({"role": "user", "content": user_message}) # Empathetic dialog conv_result = self.conversation_handler.kickoff(messages) # Accept either dict or string result if isinstance(conv_result, dict): conv_text = conv_result.get("output") or conv_result.get("text") or conv_result.get("final_answer") or str(conv_result) else: conv_text = str(conv_result).strip() # Wisdom/advisor wisdom_result = self.wisdom_advisor.kickoff(messages) if isinstance(wisdom_result, dict): wisdom_text = wisdom_result.get("output") or wisdom_result.get("text") or wisdom_result.get("final_answer") or str(wisdom_result) else: wisdom_text = str(wisdom_result).strip() # Final combined response (customize as necessary) combined_response = f"{conv_text}\n{wisdom_text}" # === VALIDATION: Pass only a string as 'response', never a dict === # Compose tool input as expected by ValidateResponseTool validation_tool_input = [{"role": "user", "content": combined_response}] _ = self.response_validator.kickoff(validation_tool_input) return { "final_response": combined_response }