diff --git a/examples/misc/diet_assistant_voice_cartesia.py b/examples/misc/diet_assistant_voice_cartesia.py new file mode 100644 index 00000000..9438b729 --- /dev/null +++ b/examples/misc/diet_assistant_voice_cartesia.py @@ -0,0 +1,124 @@ +"""Simple Voice Agent with Memory: Personal Food Assistant. +A food assistant that remembers your dietary preferences and speaks recommendations +Powered by Agno + Cartesia + Mem0 + +export MEM0_API_KEY=your_mem0_api_key +export OPENAI_API_KEY=your_openai_api_key +export CARTESIA_API_KEY=your_cartesia_api_key +""" + +from textwrap import dedent +from agno.agent import Agent +from agno.models.openai import OpenAIChat +from agno.tools.cartesia import CartesiaTools +from agno.utils.audio import write_audio_to_file +from mem0 import MemoryClient + +memory_client = MemoryClient() +USER_ID = "food_user_01" + +# Agent instructions +agent_instructions = dedent( + """Follow these steps SEQUENTIALLY to provide personalized food recommendations with voice: + 1. Analyze the user's food request and identify what type of recommendation they need. + 2. Consider their dietary preferences, restrictions, and cooking habits from memory context. + 3. Generate a personalized food recommendation based on their stored preferences. + 4. Analyze the appropriate tone for the response (helpful, enthusiastic, cautious for allergies). + 5. Call `list_voices` to retrieve available voices. + 6. Select a voice that matches the helpful, friendly tone. + 7. Call `text_to_speech` to generate the final audio recommendation. + """ +) + +# Simple agent that remembers food preferences +food_agent = Agent( + name="Personal Food Assistant", + description="Provides personalized food recommendations with memory and generates voice responses using Cartesia TTS tools.", + instructions=agent_instructions, + model=OpenAIChat(id="gpt-4o"), + tools=[CartesiaTools(voice_localize_enabled=True)], + show_tool_calls=True, +) + + +def get_food_recommendation(user_query: str, user_id): + """Get food recommendation with memory context""" + + # Search memory for relevant food preferences + memories_result = memory_client.search( + query=user_query, + user_id=user_id, + limit=5 + ) + + # Add memory context to the message + memories = [f"- {result['memory']}" for result in memories_result] + memory_context = "Memories about user that might be relevant:\n" + "\n".join(memories) + + # Combine memory context with user request + full_request = f""" + {memory_context} + + User: {user_query} + + Answer the user query based on provided context and create a voice note. + """ + + # Generate response with voice (same pattern as translator) + food_agent.print_response(full_request) + response = food_agent.run_response + + # Save audio file + if response.audio: + import time + timestamp = int(time.time()) + filename = f"food_recommendation_{timestamp}.mp3" + write_audio_to_file( + response.audio[0].base64_audio, + filename=filename, + ) + print(f"Audio saved as {filename}") + + return response.content + + +def initialize_food_memory(user_id): + """Initialize memory with food preferences""" + messages = [ + { + "role": "user", + "content": "Hi, I'm Sarah. I'm vegetarian and lactose intolerant. I love spicy food, especially Thai and Indian cuisine.", + }, + { + "role": "assistant", + "content": "Hello Sarah! I've noted that you're vegetarian, lactose intolerant, and love spicy Thai and Indian food.", + }, + { + "role": "user", + "content": "I prefer quick breakfasts since I'm always rushing, but I like cooking elaborate dinners. I also meal prep on Sundays.", + }, + { + "role": "assistant", + "content": "Got it! Quick breakfasts, elaborate dinners, and Sunday meal prep. I'll remember this for future recommendations.", + }, + { + "role": "user", + "content": "I'm trying to eat more protein. I like quinoa, lentils, chickpeas, and tofu. I hate mushrooms though.", + }, + { + "role": "assistant", + "content": "Perfect! I'll focus on protein-rich options like quinoa, lentils, chickpeas, and tofu, and avoid mushrooms.", + }, + ] + + memory_client.add(messages, user_id=user_id) + print("Food preferences stored in memory") + + +# Initialize the memory for the user once in order for the agent to learn the user preference +initialize_food_memory(user_id=USER_ID) + +print(get_food_recommendation("Which type of restaurants should I go tonight for dinner and cuisines preferred?", user_id=USER_ID)) +# OUTPUT: 🎵 Audio saved as food_recommendation_1750162610.mp3 +# For dinner tonight, considering your love for healthy spic optionsy, you could try a nice Thai, Indian, or Mexican restaurant. +# You might find dishes with quinoa, chickpeas, tofu, and fresh herbs delightful. Enjoy your dinner!