Create a sophisticated multi-agent system using LangGraph and Solana Agent Kit. This implementation enables specialized agents to handle different aspects of Solana operations through a coordinated workflow.
Architecture Overview
Specialized Agents
-
Manager Agent
- Query routing
- Workflow orchestration
- Response aggregation
- State management
-
Generalist Agent
- Basic queries
- General information
- Tavily search integration
- Context understanding
-
TransferSwap Agent
- Token transfers
- Token swaps
- Transaction management
- Fee handling
-
Read Agent
- Blockchain queries
- Balance checks
- Transaction history
- Account information
Quick Start
1. Setup Project
# Clone repository
npm install -g degit
degit sendaifun/solana-agent-kit/tree/docs/examples/agent-kit-langgraph myproject
cd myproject
# Install dependencies
pnpm install
# Configure environment
cp .env.example .env
2. Environment Configuration
OPENAI_API_KEY=your_openai_key
TAVILY_API_KEY=your_tavily_key
RPC_URL=your_solana_rpc
SOLANA_PRIVATE_KEY=your_wallet_key
3. Project Structure
src/
├── agents/
│ ├── manager.ts
│ ├── general.ts
│ ├── transfer.ts
│ └── read.ts
├── prompts/
│ └── templates/
├── tools/
└── utils/
Implementation
Agent Configuration
// agents/manager.ts
import { StateGraph } from "@langchain/langgraph";
const graph = new StateGraph({
channels: {
query: ChannelType.GENERAL,
blockchain: ChannelType.BLOCKCHAIN,
transaction: ChannelType.TRANSACTION
}
});
// Add nodes
graph.addNode("manager", managerAgent);
graph.addNode("general", generalAgent);
graph.addNode("transfer", transferAgent);
graph.addNode("read", readAgent);
// Define edges
graph.addEdge("manager", "general");
graph.addEdge("manager", "transfer");
graph.addEdge("manager", "read");
Specialized Agent Implementation
// agents/general.ts
class GeneralistAgent extends BaseAgent {
async process(input: AgentInput): Promise<AgentOutput> {
// Implementation using Tavily search
if (this.config.enableSearch) {
const searchResults = await this.tavily.search(input.query);
// Process search results
}
return {
response: await this.generateResponse(input, context)
};
}
}
Usage Examples
Basic Query Flow
const workflow = new SolanaAgentWorkflow();
// General query
const response = await workflow.run({
query: "What is the current SOL price?",
type: QueryType.GENERAL
});
// Transaction query
const transferResponse = await workflow.run({
query: "Send 1 SOL to address...",
type: QueryType.TRANSACTION
});
Custom Agent Integration
// Add custom agent
const customAgent = new CustomAgent({
name: "custom",
description: "Handles custom operations",
tools: [/* custom tools */]
});
workflow.addAgent(customAgent, {
triggers: ["custom", "specific"]
});
State Management
Workflow State
interface WorkflowState {
query: string;
context: any;
history: Message[];
activeAgent: string;
status: WorkflowStatus;
}
// State updates
graph.onStateChange((state: WorkflowState) => {
// Handle state changes
});
Channel Types
enum ChannelType {
GENERAL = "general",
BLOCKCHAIN = "blockchain",
TRANSACTION = "transaction",
CUSTOM = "custom"
}
Best Practices
-
Agent Design
- Clear responsibilities
- Minimal overlap
- Efficient routing
- Error handling
-
State Management
- Immutable updates
- Clear transitions
- State validation
- History tracking
-
Error Handling
- Graceful degradation
- Error recovery
- State rollback
- User feedback
Common Issues
-
Routing Issues
- Ambiguous queries
- Missing context
- Circular routing
- State conflicts
-
Performance
- Response times
- Resource usage
- Memory management
- API limits
-
Integration
- API compatibility
- Version conflicts
- Tool availability
- State synchronization
Testing
Unit Tests
describe('Manager Agent', () => {
it('routes general queries correctly', async () => {
const result = await managerAgent.route({
query: "What is Solana?",
type: QueryType.GENERAL
});
expect(result.agent).toBe("general");
});
});
Integration Tests
describe('Workflow', () => {
it('completes full query cycle', async () => {
const workflow = new SolanaAgentWorkflow();
const response = await workflow.run({
query: "Send 1 SOL",
type: QueryType.TRANSACTION
});
expect(response.status).toBe("completed");
});
});
Development Tips
-
Local Development
- Use mocks
- Test workflows
- Monitor state
- Log transitions
-
Debugging
- State inspection
- Flow tracking
- Error logging
- Performance monitoring
-
Deployment
- Environment setup
- API configuration
- Monitoring
- Scaling
Resources
Support
For assistance:
- GitHub Issues
- Documentation
- Community Forums
- Development Team