"""Example 4: Full Agent with All Features This example demonstrates a complete agent setup with: - All basic tools (Read, Write, Edit, Bash) - Session Note tools for memory - MCP tools (Memory, Search, etc.) - Skills integration Based on: tests/test_integration.py """ import asyncio import tempfile from pathlib import Path from mini_agent import LLMClient from mini_agent.agent import Agent from mini_agent.config import Config from mini_agent.tools import BashTool, EditTool, ReadTool, WriteTool from mini_agent.tools.mcp_loader import load_mcp_tools_async from mini_agent.tools.note_tool import RecallNoteTool, SessionNoteTool async def demo_full_agent(): """Demo: Full-featured agent with all capabilities.""" print("\n" + "=" * 60) print("Full Mini Agent - All Features Enabled") print("=" * 60) # Load configuration config_path = Path("mini_agent/config/config.yaml") if not config_path.exists(): print("āŒ config.yaml not found. Please run:") print(" cp mini_agent/config/config-example.yaml mini_agent/config/config.yaml") return config = Config.from_yaml(config_path) # Check API key if not config.llm.api_key or config.llm.api_key.startswith("YOUR_"): print("āŒ API key not configured in config.yaml") return # Create workspace with tempfile.TemporaryDirectory() as workspace_dir: print(f"šŸ“ Workspace: {workspace_dir}") # Load system prompt (Agent will auto-inject workspace info) system_prompt_path = Path("mini_agent/config/system_prompt.md") if system_prompt_path.exists(): system_prompt = system_prompt_path.read_text(encoding="utf-8") else: system_prompt = "You are a helpful AI assistant." # Add Session Note instructions note_instructions = """ IMPORTANT - Session Memory: You have record_note and recall_notes tools. Use them to: - Save important facts, decisions, and context - Recall previous information across conversations """ system_prompt += note_instructions # Initialize LLM llm_client = LLMClient( api_key=config.llm.api_key, api_base=config.llm.api_base, model=config.llm.model, ) # Initialize basic tools tools = [ ReadTool(workspace_dir=workspace_dir), WriteTool(workspace_dir=workspace_dir), EditTool(workspace_dir=workspace_dir), BashTool(), ] print("āœ“ Loaded 4 basic tools") # Add Session Note tools memory_file = Path(workspace_dir) / ".agent_memory.json" tools.extend( [ SessionNoteTool(memory_file=str(memory_file)), RecallNoteTool(memory_file=str(memory_file)), ] ) print("āœ“ Loaded 2 Session Note tools") # Load MCP tools (if configured) try: mcp_tools = await load_mcp_tools_async(config_path="mini_agent/config/mcp.json") if mcp_tools: tools.extend(mcp_tools) print(f"āœ“ Loaded {len(mcp_tools)} MCP tools") else: print("āš ļø No MCP tools configured (mcp.json is empty or disabled)") except Exception as e: print(f"āš ļø MCP tools not loaded: {e}") # Create agent agent = Agent( llm_client=llm_client, system_prompt=system_prompt, tools=tools, max_steps=config.agent.max_steps, workspace_dir=workspace_dir, ) print(f"\nšŸ¤– Agent created with {len(tools)} total tools\n") # Task: Complex task that uses multiple tools task = """ Please help me with the following tasks: 1. Create a Python script called 'calculator.py' that: - Has functions for add, subtract, multiply, divide - Has a main() function that demonstrates usage - Includes proper docstrings and type hints 2. Create a README.md file that: - Describes the calculator script - Shows how to run it - Lists the available functions 3. Test the calculator by running it with bash 4. Remember this project info: - Project: Simple Calculator - Language: Python - Purpose: Demonstration of agent capabilities """ print("=" * 60) print("šŸ“ Task:") print("=" * 60) print(task) print("\n" + "=" * 60) print("šŸ¤– Agent is working...\n") agent.add_user_message(task) try: result = await agent.run() print("\n" + "=" * 60) print("āœ… Agent completed!") print("=" * 60) print(f"\nAgent's final response:\n{result}\n") # Show created files print("=" * 60) print("šŸ“„ Created files in workspace:") print("=" * 60) workspace = Path(workspace_dir) for file in workspace.glob("*"): if file.is_file() and not file.name.startswith("."): print(f"\nšŸ“„ {file.name}:") print("-" * 60) content = file.read_text() # Show first 20 lines lines = content.split("\n")[:20] print("\n".join(lines)) if len(content.split("\n")) > 20: print("... (truncated)") print("-" * 60) # Show memory if memory_file.exists(): import json notes = json.loads(memory_file.read_text()) print(f"\nšŸ’¾ Session notes recorded: {len(notes)}") for note in notes: print(f" - [{note['category']}] {note['content'][:60]}...") except Exception as e: print(f"āŒ Error during agent execution: {e}") import traceback traceback.print_exc() async def demo_interactive_mode(): """Demo: Interactive conversation with agent.""" print("\n" + "=" * 60) print("Interactive Mini Agent") print("=" * 60) print("\nThis demo shows multi-turn conversation.") print("(In production, use `mini-agent` for full interactive mode)") # Load config config_path = Path("mini_agent/config/config.yaml") if not config_path.exists(): print("āŒ config.yaml not found") return config = Config.from_yaml(config_path) if not config.llm.api_key or config.llm.api_key.startswith("YOUR_"): print("āŒ API key not configured") return with tempfile.TemporaryDirectory() as workspace_dir: # Setup system_prompt = "You are a helpful assistant with access to tools." llm_client = LLMClient( api_key=config.llm.api_key, api_base=config.llm.api_base, model=config.llm.model, ) tools = [ WriteTool(workspace_dir=workspace_dir), ReadTool(workspace_dir=workspace_dir), BashTool(), ] agent = Agent( llm_client=llm_client, system_prompt=system_prompt, tools=tools, max_steps=20, workspace_dir=workspace_dir, ) # Conversation turns conversations = [ "Create a file called 'data.txt' with the numbers 1 to 5, one per line.", "Now read the file and tell me what's in it.", "Count how many lines are in the file using bash.", ] for i, message in enumerate(conversations, 1): print(f"\n{'=' * 60}") print(f"Turn {i}:") print(f"{'=' * 60}") print(f"User: {message}\n") agent.add_user_message(message) try: result = await agent.run() print(f"Agent: {result}\n") except Exception as e: print(f"Error: {e}") break async def main(): """Run all demos.""" print("=" * 60) print("Full Agent Examples") print("=" * 60) print("\nThese examples demonstrate the complete agent capabilities:") print("- All basic tools (file operations, bash)") print("- Session memory (persistent notes)") print("- MCP tools (if configured)") print("- Multi-turn conversations\n") # Run demos await demo_full_agent() print("\n" * 2) await demo_interactive_mode() print("\n" + "=" * 60) print("All demos completed! āœ…") print("=" * 60) print("\nšŸ’” Next step: Try the interactive mode with:") print(" mini-agent\n") if __name__ == "__main__": asyncio.run(main())