Agent SDK
A Rust SDK for building AI agents powered by large language models (LLMs). Create agents that can reason, use tools, and take actions through a streaming, event-driven architecture.
⚠️ Early Development: This library is in active development (v0.1.x). APIs may change between versions and there may be bugs. Use in production at your own risk. Feedback and contributions are welcome!
What is an Agent?
An agent is an LLM that can do more than just chat—it can use tools to interact with the world. This SDK provides the infrastructure to:
- Send messages to an LLM and receive streaming responses
- Define tools the LLM can call (APIs, file operations, databases, etc.)
- Execute tool calls and feed results back to the LLM
- Control the agent loop with hooks for logging, security, and approval workflows
Features
- Agent Loop - Core orchestration that handles the LLM conversation and tool execution cycle
- Provider Agnostic - Built-in support for Anthropic (Claude), OpenAI, and Google Gemini, plus a trait for custom providers
- Tool System - Define tools with JSON schema validation; the LLM decides when to use them
- Lifecycle Hooks - Intercept tool calls for logging, user confirmation, rate limiting, or security checks
- Streaming Events - Real-time event stream for building responsive UIs
- Primitive Tools - Ready-to-use tools for file operations (Read, Write, Edit, Glob, Grep, Bash)
- Security Model - Capability-based permissions and tool tiers (Observe, Confirm, RequiresPin)
- Persistence - Trait-based storage for conversation history and agent state
Requirements
- Rust 1.85+ (2024 edition)
- An API key for your chosen LLM provider
Installation
Add to your Cargo.toml:
[]
= { = "https://github.com/bipa-app/agent-sdk", = "main" }
= { = "1", = ["rt-multi-thread", "macros"] }
= "1"
Quick Start
use ;
async
Examples
Clone the repo and run the examples:
# Basic conversation (no tools)
ANTHROPIC_API_KEY=your_key
# Agent with custom tools
ANTHROPIC_API_KEY=your_key
# Using lifecycle hooks for logging and rate limiting
ANTHROPIC_API_KEY=your_key
# Agent with file operation tools
ANTHROPIC_API_KEY=your_key
Creating Custom Tools
Tools let your agent interact with external systems. Implement the Tool trait:
use ;
use async_trait;
use ;
/// A tool that fetches the current weather for a city
;
// Register tools with the agent
let mut tools = new;
tools.register;
let agent =
.provider
.tools
.build;
Lifecycle Hooks
Hooks let you intercept and control agent behavior:
use ;
use async_trait;
use Value;
;
let agent =
.provider
.hooks
.build;
Custom Context
The generic parameter T in Tool<T> and builder::<T>() lets you pass custom data to your tools:
// Define your context type
// Implement tools with access to context
// Build agent with your context type
let agent =
.provider
.tools
.build;
// Pass context when running
let tool_ctx = new;
agent.run;
Architecture
┌─────────────────────────────────────────────────────────────┐
│ Agent Loop │
│ Orchestrates: prompt → LLM → tool calls → results → LLM │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ LlmProvider │ │ Tools │ │ Hooks │ │
│ │ (trait) │ │ Registry │ │ (pre/post tool) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │MessageStore │ │ StateStore │ │ Environment │ │
│ │ (trait) │ │ (trait) │ │ (file/exec ops) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Built-in Providers
| Provider | Models | Usage |
|---|---|---|
| Anthropic | Claude Sonnet, Opus, Haiku | AnthropicProvider::sonnet(api_key) |
| OpenAI | GPT-4, GPT-3.5, etc. | OpenAiProvider::new(api_key, model) |
| Gemini Pro, etc. | GeminiProvider::new(api_key, model) |
Implement LlmProvider trait to add your own.
Built-in Primitive Tools
For agents that need file system access:
| Tool | Description |
|---|---|
ReadTool |
Read file contents |
WriteTool |
Create or overwrite files |
EditTool |
Make targeted edits to files |
GlobTool |
Find files matching patterns |
GrepTool |
Search file contents with regex |
BashTool |
Execute shell commands |
These require an Environment (use InMemoryFileSystem for sandboxed testing or LocalFileSystem for real file access).
Security Considerations
#[forbid(unsafe_code)]- No unsafe Rust anywhere in the codebase- Capability-based permissions - Control read/write/exec access via
AgentCapabilities - Tool tiers - Classify tools by risk level; use hooks to require confirmation
- Sandboxing - Use
InMemoryFileSystemfor testing without real file access
See SECURITY.md for the full security policy.
Contributing
Contributions are welcome! Please read CONTRIBUTING.md for:
- Development setup
- Code quality requirements
- Pull request process
License
Licensed under the Apache License, Version 2.0. See LICENSE for details.