Spaces:
Runtime error
Runtime error
import functools | |
from langchain.agents import AgentExecutor, create_openai_tools_agent | |
from langchain_core.messages import HumanMessage | |
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder | |
from langchain_openai import ChatOpenAI | |
from langchain.output_parsers.openai_functions import JsonOutputFunctionsParser | |
import tools | |
from tools import tools | |
import os | |
import config | |
os.environ["OPENAI_API_KEY"] = config.config("OPENAI_API_KEY") | |
# initializing the GPT-4 Turbo model with no temperature variation | |
llm = ChatOpenAI(temperature=0, model="gpt-4-turbo-preview") | |
def create_agents(llm:ChatOpenAI, tools:list, system_prompt:str)->AgentExecutor: | |
# creating a chat prompt template | |
prompt = ChatPromptTemplate.from_messages([ | |
('system', system_prompt), | |
MessagesPlaceholder(variable_name='messages'), | |
MessagesPlaceholder(variable_name="agent_scratchpad") | |
]) | |
# creating an agent with specified tools and prompting template | |
agent = create_openai_tools_agent(llm, tools, prompt) | |
executor = AgentExecutor(agent=agent, tools=tools) | |
return executor | |
# function to handle the agent invocation and return formatted state | |
def agent_node(state, agent, name): | |
result = agent.invoke(state) | |
return {"messages": [HumanMessage(content=result["output"], name=name)]} | |
# list of agents representing different coaching roles | |
members = ["nutritionist", "workout_coach", "mental_health_coach","sleep_coach","hydration_coach", | |
"posture_and_ergonomics_coach","injury_prevention_and_recovery_coach"] | |
# system prompt explaining the FIT.AI role and its tasks | |
system_prompt = ( | |
""" | |
TASK: | |
You are "FIT.AI", an intelligent chatbot that answers questions about fitness and overall health. | |
You also supervise and coordinate tasks among seven workers: {members}. | |
Based on the user's request, determine which worker should take the next action. | |
Each worker is responsible for executing specific tasks and reporting back their findings and progress. | |
Example session : | |
User question : Hello, help me with a fitness and diet plan. | |
Thought : I should first ask the user their daily routine and then | |
search the web for the most optimal fitness and diet plan first. | |
Action : Search the web for optimal results. | |
Pause : You will take some time to think | |
You then output : Please provide your daily routine so as to tailor the plan accordingly. | |
""" | |
) | |
# options for routing the next step in the flow | |
options = ['FINISH'] + members | |
# function definition for routing the tasks to agents | |
function_def = { | |
"name": "route", | |
"description": "Select the next role.", | |
"parameters": { | |
"title": "routeSchema", | |
"type": "object", | |
"properties": {"next": {"title": "Next", "anyOf": [{"enum": options}]}}, | |
"required": ["next"] | |
} | |
} | |
# creating the supervisor chain using the specified LLM and function definitions | |
prompt = ChatPromptTemplate.from_messages( | |
[ | |
("system", system_prompt), | |
MessagesPlaceholder(variable_name="messages"), | |
( | |
"system", | |
"Given the conversation above, who should act next?" | |
" Or should we FINISH? Select one of: {options}", | |
), | |
]).partial(options=str(options), members=", ".join(members)) | |
supervisor_chain = ( | |
prompt | |
| llm.bind_functions(functions=[function_def], function_call="route") | |
| JsonOutputFunctionsParser() | |
) | |
# creating agents for each coach role with specified prompts and tools | |
nutritionist_agent = create_agents( | |
llm, | |
tools, | |
"""Your role is to act as a knowledgeable nutritionist. Provide practical dietary | |
advice and create meal plans. Research the latest nutritional information and trends, | |
and give personalized recommendations based on the user's needs and country of choice. | |
Utilize information from the workout coach to suggest a diet plan. Always mention any web/mobile applications for tracking | |
calorie intake and identify potential food allergies. If no applications are found, | |
provide useful tips. Respond in a friendly, informal tone.""" | |
) | |
workout_coach_agent = create_agents( | |
llm, | |
tools, | |
"""You are a workout coach. Based on the user's fitness goals and nutritionist's suggestions, | |
create tailored workout plans. Provide exercise routines, tips for proper form, and motivation. | |
Suggest home workout equipment along with online links to purchase them and useful fitness tracking applications or websites. | |
Respond in a friendly, informal tone, offering positive affirmations and practical | |
timelines for achieving goals.""" | |
) | |
mental_health_coach_agent = create_agents( | |
llm, | |
tools, | |
"""You are a mental health coach. Provide support and mindfulness strategies to improve | |
mental well-being taking into account the user's dietary and workout plans. Research techniques | |
and practices to help with mental health and offer insights into mental health disorders if queried. | |
Reccommend home tips based in the user's activity level. | |
Suggest useful apps for maintaining mental stability. Respond in a friendly, informal tone.""" | |
) | |
sleep_coach_agent = create_agents( | |
llm, | |
tools, | |
"""You are a sleep coach. Provide tips for better sleep hygiene, suggest tools and techniques | |
to improve sleep quality, and offer advice on optimizing sleep habits based on the | |
user's daily routine and age . Mention any web or mobile applications for tracking sleep | |
patterns and provide relaxation techniques. Respond in a friendly, informal tone.""" | |
) | |
hydration_coach_agent = create_agents( | |
llm, | |
tools, | |
"""You are a hydration coach. Help users maintain proper hydration levels by providing advice on water intake | |
and the importance of staying hydrated. Suggest tools and techniques for tracking water consumption and offer | |
tips for improving hydration habits based on the user's daily routine. Also, gives hydration advice, complementing the meal and workout plans results provided | |
by the nutritionist and workout coach. Always ask users to drink water based on the gender. | |
Respond in a friendly, informal tone.""" | |
) | |
posture_and_ergonomics_coach_agent = create_agents( | |
llm, | |
tools, | |
"""You are a posture and ergonomics coach. Provide guidance on maintaining good posture, especially for individuals | |
who spend long hours sitting, and recommend ergonomic adjustments depending on the workspace. Suggest tools and | |
techniques for tracking and improving posture. Respond in a friendly, informal tone.""" | |
) | |
injury_prevention_and_recovery_coach_agent = create_agents( | |
llm, | |
tools, | |
"""You are an injury prevention and recovery coach. Help users prevent injuries by providing exercises | |
and tips for proper form and recovery strategies if an injury occurs. If user is injured provide quick and | |
relevant solutions for the particular injury. Always reccommend seeking a doctor. | |
Suggest tools and techniques for tracking and managing recovery. Respond in a friendly, informal tone.""" | |
) | |
nutritionist_node = functools.partial( | |
agent_node, agent=nutritionist_agent, name="nutritionist" | |
) | |
workout_coach_node = functools.partial( | |
agent_node, agent=workout_coach_agent, name="workout_coach" | |
) | |
mental_health_coach_node = functools.partial( | |
agent_node, agent=mental_health_coach_agent, name="mental_health_coach" | |
) | |
sleep_coach_node = functools.partial( | |
agent_node, agent=sleep_coach_agent, name="sleep_coach" | |
) | |
hydration_coach_node = functools.partial( | |
agent_node, agent=hydration_coach_agent, name="hydration_coach" | |
) | |
posture_and_ergonomics_coach_node = functools.partial( | |
agent_node, agent=posture_and_ergonomics_coach_agent, name="posture_and_ergonomics_coach" | |
) | |
injury_prevention_and_recovery_coach_node = functools.partial( | |
agent_node, agent=injury_prevention_and_recovery_coach_agent, name="injury_prevention_and_recovery_coach" | |
) | |