# Tutorial 2: Basic Agents Learn how to register agents and execute tasks. ## Prerequisites - Complete [01-getting-started.md](01-getting-started.md) - VAPORA built: `cargo build` ## Learning Objectives - Register agents in the agent registry - Define agent capabilities and metadata - Execute agent tasks - Query agent status ## Step 1: Create Agent Registry An `AgentRegistry` manages all registered agents. ```rust use vapora_agents::AgentRegistry; let registry = AgentRegistry::new(10); // capacity: 10 agents ``` ## Step 2: Define Agent Metadata Each agent has a role, capabilities, and LLM provider. ```rust use vapora_agents::{AgentMetadata, AgentStatus}; let agent = AgentMetadata::new( "developer".to_string(), // role "Developer Alice".to_string(), // name "claude".to_string(), // provider "claude-opus-4-5".to_string(), // model vec!["coding".to_string(), "testing".to_string()], // capabilities ); ``` ## Step 3: Register Agent Add the agent to the registry. ```rust let agent_id = registry.register_agent(agent)?; println!("Agent registered: {}", agent_id); ``` ## Step 4: Query Registry List all agents or get specific agent. ```rust // Get all agents let all_agents = registry.list_all(); // Get specific agent let agent = registry.get_agent(&agent_id)?; println!("Agent status: {:?}", agent.status); ``` ## Running the Example ```bash cargo run --example 01-simple-agent -p vapora-agents ``` ## Expected Output ``` === Simple Agent Registration Example === Created agent registry with capacity 10 Defined agent: "Developer A" (role: developer) Capabilities: ["coding", "testing"] Agent registered successfully Agent ID: === Registered Agents === Total: 1 agents - Developer A (Role: developer, Status: Ready, Capabilities: coding, testing) Retrieved agent: Developer A (Status: Ready) ``` ## Concepts ### AgentRegistry - Thread-safe registry for managing agents - Capacity-limited (prevents resource exhaustion) - In-memory storage ### AgentMetadata - Unique ID (UUID) - Role: developer, reviewer, architect, etc. - Capabilities: coding, testing, documentation, etc. - LLM Provider: claude, gpt-4, gemini, ollama - Model: specific version (opus, sonnet, etc.) ### AgentStatus - **Ready**: Available for task assignment - **Busy**: Executing tasks - **Offline**: Not available ## Common Patterns ### Register Multiple Agents ```rust let agents = vec![ AgentMetadata::new(...), AgentMetadata::new(...), ]; for agent in agents { registry.register_agent(agent)?; } ``` ### Filter by Capability ```rust let all_agents = registry.list_all(); let developers = all_agents .iter() .filter(|a| a.role == "developer") .collect::>(); ``` ## Troubleshooting **Q: "Agent registry is full"** A: Increase capacity: `AgentRegistry::new(20)` **Q: "Agent ID already registered"** A: Use unique agent names or generate new IDs ## Next Steps - Tutorial 3: [LLM Routing](03-llm-routing.md) - Example: `crates/vapora-agents/examples/03-agent-selection.rs` ## Reference - Source: `crates/vapora-agents/src/registry.rs` - API Docs: `cargo doc --open -p vapora-agents`