Guide de développement de Solana Agent Kit
Créez des agents IA qui exécutent autonomement 60+ opérations blockchain Solana en utilisant le toolkit open-source de SendAI. Compatible avec LangChain, Vercel AI SDK et Claude via MCP.
Aperçu
Solana Agent Kit permet à n'importe quel modèle IA de :
- Déployer et gérer des tokens (SPL & Token-2022)
- Créer et trader des NFT via Metaplex
- Exécuter des opérations DeFi (Jupiter, Raydium, Orca, Meteora)
- Staker du SOL, bridger des tokens, enregistrer des domaines
- Fonctionner en modes interactif ou entièrement autonome
Fonctionnalités clés
| Fonctionnalité | Description |
|---|---|
| 60+ Actions | Token, NFT, DeFi, staking, bridging |
| Architecture Plugin | Modulaire - utilisez uniquement ce dont vous avez besoin |
| Multi-Framework | LangChain, Vercel AI SDK, MCP, Eliza |
| Agnostique au modèle | Fonctionne avec OpenAI, Claude, Llama, Gemini |
| Mode autonome | Exécution sans intervention avec récupération d'erreurs |
Démarrage rapide
Installation
# Package principal
npm install solana-agent-kit
# Avec plugins (recommandé)
npm install solana-agent-kit \
@solana-agent-kit/plugin-token \
@solana-agent-kit/plugin-nft \
@solana-agent-kit/plugin-defi \
@solana-agent-kit/plugin-misc \
@solana-agent-kit/plugin-blinks
Configuration de l'environnement
# Fichier .env
OPENAI_API_KEY=your_openai_api_key
RPC_URL=https://api.mainnet-beta.solana.com # ou devnet
SOLANA_PRIVATE_KEY=your_base58_private_key
# Clés API optionnelles pour des fonctionnalités améliorées
COINGECKO_API_KEY=your_coingecko_key
HELIUS_API_KEY=your_helius_key
Configuration basique de l'agent
import {
SolanaAgentKit,
createVercelAITools,
KeypairWallet,
} from "solana-agent-kit";
import { Keypair } from "@solana/web3.js";
import bs58 from "bs58";
// Importer les plugins
import TokenPlugin from "@solana-agent-kit/plugin-token";
import NFTPlugin from "@solana-agent-kit/plugin-nft";
import DefiPlugin from "@solana-agent-kit/plugin-defi";
import MiscPlugin from "@solana-agent-kit/plugin-misc";
import BlinksPlugin from "@solana-agent-kit/plugin-blinks";
// Créer un portefeuille à partir de la clé privée
const privateKey = bs58.decode(process.env.SOLANA_PRIVATE_KEY!);
const keypair = Keypair.fromSecretKey(privateKey);
const wallet = new KeypairWallet(keypair);
// Initialiser l'agent avec les plugins
const agent = new SolanaAgentKit(
wallet,
process.env.RPC_URL!,
{
OPENAI_API_KEY: process.env.OPENAI_API_KEY!,
}
)
.use(TokenPlugin)
.use(NFTPlugin)
.use(DefiPlugin)
.use(MiscPlugin)
.use(BlinksPlugin);
// Créer des tools pour le framework IA
const tools = createVercelAITools(agent, agent.actions);
Plugins et actions
Plugin Token (@solana-agent-kit/plugin-token)
| Action | Description |
|---|---|
deployToken |
Déployer un nouveau token SPL ou Token-2022 |
transfer |
Transférer du SOL ou des tokens SPL |
getBalance |
Vérifier les soldes de tokens |
stake |
Staker du SOL via Jupiter/Solayer |
bridge |
Bridger des tokens via Wormhole |
rugCheck |
Analyser la sécurité d'un token |
// Déployer un nouveau token
const result = await agent.methods.deployToken({
name: "My Token",
symbol: "MTK",
decimals: 9,
initialSupply: 1000000,
});
// Transférer des tokens
await agent.methods.transfer({
to: "recipient_address",
amount: 100,
mint: "token_mint_address", // optionnel, par défaut SOL
});
// Vérifier le solde
const balance = await agent.methods.getBalance({
tokenAddress: "token_mint_address", // optionnel
});
Plugin NFT (@solana-agent-kit/plugin-nft)
| Action | Description |
|---|---|
createCollection |
Créer une collection NFT via Metaplex |
mintNFT |
Minter un NFT dans une collection |
listNFT |
Lister un NFT sur les marketplaces |
updateMetadata |
Mettre à jour les métadonnées NFT |
// Créer une collection
const collection = await agent.methods.createCollection({
name: "My Collection",
symbol: "MYCOL",
uri: "https://arweave.net/metadata.json",
});
// Minter un NFT dans la collection
const nft = await agent.methods.mintNFT({
collectionMint: collection.collectionAddress,
name: "NFT #1",
uri: "https://arweave.net/nft1.json",
});
Plugin DeFi (@solana-agent-kit/plugin-defi)
| Action | Description |
|---|---|
trade |
Swapper des tokens via Jupiter |
createRaydiumPool |
Créer un pool Raydium AMM |
createOrcaPool |
Créer un Orca Whirlpool |
createMeteoraPool |
Créer un pool Meteora DLMM |
limitOrder |
Placer un ordre limite via Manifest |
lend |
Prêter des actifs via Lulo |
perpetualTrade |
Trader des perps via Adrena/Drift |
// Swapper des tokens via Jupiter
const swap = await agent.methods.trade({
outputMint: "target_token_mint",
inputAmount: 1.0,
inputMint: "So11111111111111111111111111111111111111112", // SOL
slippageBps: 50, // 0,5%
});
// Créer un pool Raydium CPMM
const pool = await agent.methods.createRaydiumCpmm({
mintA: "token_a_mint",
mintB: "token_b_mint",
configId: "config_id",
mintAAmount: 1000,
mintBAmount: 1000,
});
Plugin Misc (@solana-agent-kit/plugin-misc)
| Action | Description |
|---|---|
airdrop |
Airdrop ZK-compressé via Helius |
getPrice |
Obtenir le prix d'un token via CoinGecko |
registerDomain |
Enregistrer un domaine .sol |
resolveDomain |
Résoudre un domaine en adresse |
getTPS |
Obtenir le TPS du réseau |
// Airdrop compressé (économique)
const airdrop = await agent.methods.sendCompressedAirdrop({
mintAddress: "token_mint",
amount: 100,
recipients: ["addr1", "addr2", "addr3"],
priorityFeeInLamports: 10000,
});
// Obtenir le prix d'un token
const price = await agent.methods.getPrice({
tokenId: "solana", // ID CoinGecko
});
Plugin Blinks (@solana-agent-kit/plugin-blinks)
Exécuter directement Solana Actions/Blinks :
// Exécuter un Blink
const result = await agent.methods.executeBlink({
blinkUrl: "https://example.com/blink",
params: { /* blink-specific params */ },
});
Modèles d'intégration
Intégration LangChain
import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit";
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { MemorySaver } from "@langchain/langgraph";
import { HumanMessage } from "@langchain/core/messages";
async function createLangChainAgent() {
// Initialiser le LLM
const llm = new ChatOpenAI({
modelName: "gpt-4-turbo-preview",
temperature: 0.7,
});
// Initialiser Solana Agent Kit
const solanaKit = new SolanaAgentKit(
wallet,
process.env.RPC_URL!,
{ OPENAI_API_KEY: process.env.OPENAI_API_KEY! }
)
.use(TokenPlugin)
.use(DefiPlugin);
// Créer les tools LangChain
const tools = createSolanaTools(solanaKit);
// Créer l'agent avec la mémoire
const memory = new MemorySaver();
const agent = createReactAgent({
llm,
tools,
checkpointSaver: memory,
});
return agent;
}
// Exécuter l'agent
async function chat(agent: any, message: string) {
const config = { configurable: { thread_id: "solana-agent" } };
const stream = await agent.stream(
{ messages: [new HumanMessage(message)] },
config
);
for await (const chunk of stream) {
if ("agent" in chunk) {
console.log(chunk.agent.messages[0].content);
}
}
}
Intégration Vercel AI SDK
import { SolanaAgentKit, createVercelAITools } from "solana-agent-kit";
import { openai } from "@ai-sdk/openai";
import { generateText } from "ai";
async function runVercelAgent(prompt: string) {
const agent = new SolanaAgentKit(wallet, rpcUrl, options)
.use(TokenPlugin)
.use(DefiPlugin);
const tools = createVercelAITools(agent, agent.actions);
const result = await generateText({
model: openai("gpt-4-turbo"),
tools,
maxSteps: 10,
prompt,
});
return result.text;
}
// Utilisation
const response = await runVercelAgent(
"Swap 0.1 SOL for USDC using the best rate"
);
Serveur MCP pour Claude
Installer et configurer le serveur MCP pour Claude Desktop :
# Installer globalement
npm install -g solana-mcp
# Ou exécuter directement
npx solana-mcp
Ajouter à la config Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json) :
{
"mcpServers": {
"solana": {
"command": "npx",
"args": ["solana-mcp"],
"env": {
"RPC_URL": "https://api.mainnet-beta.solana.com",
"SOLANA_PRIVATE_KEY": "your_base58_private_key",
"OPENAI_API_KEY": "your_openai_key"
}
}
}
}
Tools MCP disponibles :
GET_ASSET- Obtenir les infos token/actifDEPLOY_TOKEN- Créer un nouveau tokenGET_PRICE- Récupérer le prix d'un tokenWALLET_ADDRESS- Obtenir l'adresse du portefeuilleBALANCE- Vérifier le soldeTRANSFER- Envoyer des tokensMINT_NFT- Créer un NFTTRADE- Exécuter un swapREQUEST_FUNDS- Obtenir du SOL devnetRESOLVE_DOMAIN- Chercher un domaine .solGET_TPS- Débit du réseau
Mode autonome
Exécuter l'agent en mode entièrement autonome :
import { SolanaAgentKit } from "solana-agent-kit";
const agent = new SolanaAgentKit(wallet, rpcUrl, options)
.use(TokenPlugin)
.use(DefiPlugin);
// Configurer le comportement autonome
const autonomousConfig = {
intervalMs: 60000, // Vérifier chaque minute
maxActions: 100, // Actions max par session
errorRecovery: true, // Réessai auto sur erreurs
dryRun: false, // Mettre true pour tester
};
// Démarrer la boucle autonome
async function runAutonomous() {
while (true) {
try {
// L'agent décide quoi faire selon les conditions du marché
const decision = await agent.analyze({
context: "Monitor my portfolio and rebalance if needed",
constraints: [
"Keep at least 1 SOL for gas",
"Max 10% allocation per token",
],
});
if (decision.shouldAct) {
await agent.execute(decision.action);
}
await sleep(autonomousConfig.intervalMs);
} catch (error) {
if (autonomousConfig.errorRecovery) {
console.error("Error, recovering:", error);
await sleep(5000);
} else {
throw error;
}
}
}
}
Créer des actions personnalisées
Étendre l'agent avec des actions personnalisées :
import { Action, Tool, SolanaAgentKit } from "solana-agent-kit";
// Définir le Tool (dit au LLM COMMENT l'utiliser)
const myCustomTool: Tool = {
name: "my_custom_action",
description: "Does something custom on Solana",
parameters: {
type: "object",
properties: {
param1: {
type: "string",
description: "First parameter",
},
param2: {
type: "number",
description: "Second parameter",
},
},
required: ["param1"],
},
};
// Définir l'Action (dit à l'agent QUAND et POURQUOI l'utiliser)
const myCustomAction: Action = {
name: "my_custom_action",
description: "Use this when you need to do something custom",
similes: ["custom thing", "special operation"],
examples: [
{
input: "Do the custom thing with value X",
output: "Custom action executed with param1=X",
},
],
handler: async (agent: SolanaAgentKit, params: any) => {
const { param1, param2 } = params;
// Votre logique personnalisée ici
const connection = agent.connection;
const wallet = agent.wallet;
// Exécuter les opérations Solana...
return {
success: true,
result: `Executed with ${param1}`,
};
},
};
// Enregistrer l'action personnalisée
agent.registerAction(myCustomAction);
agent.registerTool(myCustomTool);
Meilleures pratiques
Sécurité
- Ne jamais exposer les clés privées - Utiliser des variables d'environnement
- Utiliser des portefeuilles dédiés - Séparer le portefeuille de l'agent des fonds principaux
- Définir des limites de dépenses - Implémenter les montants maximum de transactions
- Tester sur devnet d'abord - Toujours tester avant mainnet
- Auditer les actions de l'agent - Enregistrer toutes les opérations
Performance
- Utiliser le bon RPC - Helius, Triton pour la production
- Regrouper les opérations - Combiner les transactions connexes
- Gérer les rate limits - Implémenter des stratégies de backoff
- Mettre en cache quand possible - Flux de prix, métadonnées de tokens
Conception de l'agent
- Limiter la portée des plugins - Charger uniquement les plugins nécessaires (réduit les hallucinations)
- Fournir un contexte clair - Les prompts détaillés améliorent la précision
- Ajouter des contraintes - Prévenir les actions non souhaitées
- Surveiller et itérer - Passer en revue les décisions de l'agent
Directives
- Toujours tester sur devnet avant mainnet
- Définir des limites de transaction maximales
- Surveiller les logs d'activité de l'agent
- Utiliser des portefeuilles dédiés pour les agents
- Implémenter une bonne gestion des erreurs
- Sécuriser les clés privées
Fichiers dans cette compétence
solana-agent-kit/
├── SKILL.md # Ce fichier
├── resources/
│ ├── actions-reference.md # Liste complète des actions
│ ├── plugins-guide.md # Guide approfondi des plugins
│ └── security-checklist.md # Meilleures pratiques de sécurité
├── examples/
│ ├── langchain/ # Intégration LangChain
│ ├── vercel-ai/ # Vercel AI SDK
│ ├── mcp-server/ # Configuration Claude MCP
│ └── autonomous-agent/ # Modèles autonomes
├── templates/
│ └── agent-template.ts # Modèle de démarrage
└── docs/
├── custom-actions.md # Créer des actions personnalisées
└── troubleshooting.md # Problèmes courants
Temps forts de la V2
La version 2 représente une évolution complète du toolkit avec des améliorations clés :
Architecture Plugin
La V2 répond directement à deux grands défis de V1 :
- Sécurité : La méthode d'entrée de clé privée n'était pas 100 % sécurisée
- Hallucinations : 100+ outils agrégés causaient de la confusion au LLM
Le système de plugins modulaires vous permet d'installer uniquement ce dont vous avez besoin, réduisant l'encombrement du contexte et les hallucinations.
Support du portefeuille intégré (Nouveau)
V2 s'intègre avec des fournisseurs de portefeuille sécurisés pour une sécurité améliorée :
import { TurnkeyWallet, PrivyWallet } from "solana-agent-kit/wallets";
// Turnkey - règles et politiques granulaires
const turnkeyWallet = new TurnkeyWallet({
organizationId: process.env.TURNKEY_ORG_ID,
privateKeyId: process.env.TURNKEY_PRIVATE_KEY_ID,
});
// Privy - confirmation avec implication humaine
const privyWallet = new PrivyWallet({
appId: process.env.PRIVY_APP_ID,
requireConfirmation: true,
});
// Initialiser l'agent avec un portefeuille sécurisé
const agent = new SolanaAgentKit(turnkeyWallet, rpcUrl, options)
.use(TokenPlugin)
.use(DefiPlugin);
Principaux avantages de V2
| Fonctionnalité | V1 | V2 |
|---|---|---|
| Sécurité du portefeuille | Entrée de clé privée | Portefeuilles intégrés (Turnkey, Privy) |
| Chargement des tools | Tous les 100+ tools | Basé sur plugins, charger ce dont vous avez besoin |
| Contexte LLM | Large, causait hallucinations | Minimal, contexte ciblé |
| Implication humaine | Non supporté | Natif avec Privy |
Vérifier
- Un vrai appel RPC/SDK a été émis (mainnet, devnet, ou validateur local) et le payload de réponse est capturé dans la transcription, pas simplement paraphrasé
- Chaque transaction a été simulée (
simulateTransactionou équivalent) avant toute étape de signature/envoi ; les logs de simulation sont joints - Pour toute transaction signée/envoyée, la signature résultante est enregistrée et confirmée on-chain (statut retourné par
getSignatureStatusesou URL d'explorateur) - Le slippage, les frais prioritaires et les limites de compute unit ont été définis explicitement avec des valeurs numériques concrètes, pas laissés aux défauts de la bibliothèque
- Les adresses de comptes, les mints et les IDs de programme utilisés dans l'exécution correspondent aux adresses documentées de solana-agent-kit pour le cluster ciblé (pas de mélange mainnet/devnet)
- Le chemin d'erreur a été exercé au moins une fois (solde insuffisant, oracle obsolète, blockhash expiré, etc.) et la gestion d'erreur de l'agent a produit un message lisible
Notes
- Solana Agent Kit est activement maintenu (1 400+ commits, 800+ forks)
- V2 a introduit l'architecture plugin (guide de migration disponible)
- Version Python disponible :
solana-agent-kit-py - Le serveur MCP permet l'intégration Claude Desktop
- 100 000+ téléchargements, 1,6k+ stars GitHub
- Sous licence Apache-2.0