mirror of https://github.com/buster-so/buster.git
4.2 KiB
4.2 KiB
Agents Library - Agent Guidance
Purpose & Role
The Agents library provides a framework for creating and using AI agents that can interact with LLMs and execute tools. It serves as the foundation for implementing autonomous agents that can perform complex tasks like data analysis, dashboard creation, and planning.
Key Functionality
- Agent interfaces for standardized LLM interaction
- Tool execution framework for defining and running agent tools
- Specialized agents for data-related tasks
- Tool categorization system for organizing agent capabilities
- Utilities for agent message handling and response processing
Internal Organization
Directory Structure
src/
├── agent.rs - Core agent trait definitions and implementations
├── agents/
│ ├── buster_super_agent.rs - Buster's primary agent implementation
│ └── mod.rs
├── models/
│ ├── types.rs - Agent-related data structures
│ └── mod.rs
├── tools/
│ ├── categories/ - Tool categorization
│ │ ├── agents_as_tools/ - Using agents as tools
│ │ ├── file_tools/ - File manipulation tools
│ │ ├── planning_tools/ - Planning and strategy tools
│ │ └── mod.rs
│ ├── executor.rs - Tool execution machinery
│ └── mod.rs
├── utils/
│ ├── tools.rs - Tool utility functions
│ └── mod.rs
└── lib.rs - Public exports and library documentation
Key Modules
agent
: Defines the coreAgent
trait and related functionality that all agents implementagents
: Contains concrete agent implementations, including the primary BusterSuperAgentmodels
: Data structures and types used throughout the agent systemtools
: The tool execution framework, including theToolExecutor
traitutils
: Utility functions for agent operations and tool management
Usage Patterns
use agents::{Agent, BusterSuperAgent};
use litellm::AgentMessage;
async fn example_agent_use() -> Result<(), anyhow::Error> {
// Create a new agent
let agent = BusterSuperAgent::new(config).await?;
// Send a message to the agent
let messages = vec![
AgentMessage::user("Analyze the sales data for Q1")
];
// Execute the agent and process the response
let response = agent.execute(messages).await?;
// Process agent response...
Ok(())
}
Common Implementation Patterns
- Agents are typically created once and reused for multiple interactions
- Tools are registered with agents at creation time
- Agent responses should be parsed for both content and tool call requests
- Chain agent calls together for multi-step reasoning
- Tool implementations should be focused, performing one specific task
- Error handling flows up from tools to the agent executor
Dependencies
-
Internal Dependencies:
litellm
: Used for LLM provider communicationdatabase
: Used for persisting agent state and accessing dataquery_engine
: Used by data-related tools to execute queriesbraintrust
: Used for agent performance monitoring
-
External Dependencies:
serde_json
: Used for parsing and generating JSON for agent communicationanyhow
andthiserror
: Used for error handlingasync-trait
: Used for async trait implementationstokio
: Used for async runtime
Code Navigation Tips
- Start with
lib.rs
to see what's exported and main entry points - The
Agent
trait inagent.rs
defines the core agent interface BusterSuperAgent
inagents/buster_super_agent.rs
is the main implementation- Tool categories in
tools/categories/
are organized by functional area - The
ToolExecutor
trait intools/mod.rs
is implemented by various tool types - New tools should be added to the appropriate category in
tools/categories/
Testing Guidelines
- Unit tests focus on individual tool functionality
- Mock the LLM responses using test fixtures
- Use in-memory database for integration tests
- Run tests with:
cargo test -p agents
- Test tools individually before testing complete agent flows
- Create mock implementations of
Agent
trait for testing dependent code