Les agents IA sont des programmes autonomes conçus pour percevoir leur environnement, traiter des informations et effectuer des actions afin d'atteindre des objectifs spécifiques. Ces agents peuvent aller de simples bots basés sur des règles à des systèmes avancés de machine learning capables d'adapter et d'optimiser leurs décisions au fil du temps.
Dans la blockchain et la DeFi, l'essor de l'automatisation pilotée par l'IA a ouvert de nouvelles perspectives pour des interactions on-chain fluides et intelligentes. De l'automatisation de tâches telles que le trading, l'évaluation des risques et la gestion de la liquidité à l'exécution d'interactions complexes avec des smart contracts, les agents IA transforment notre façon de construire des dapps en améliorant l'efficacité et en réduisant le besoin d'intervention humaine.
Grâce à des frameworks comme ElizaOS, les développeurs peuvent créer des agents IA qui interagissent avec des protocoles blockchain et prennent des décisions en temps réel sur les swaps de tokens, l'arbitrage et la gestion de portefeuille. Dans ce guide, nous allons parcourir la conception, la configuration et l'implémentation d'un agent IA qui exécute des transactions de manière autonome en utilisant les fonctionnalités intégrées d'ElizaOS.
Prérequis
Avant de commencer à construire, assurez-vous de disposer de la configuration suivante :
Node.js (v23.3.0 ou supérieur)
Gestionnaire de paquets PNPM
Wallet compatible EVM avec des tokens testnet – Nécessaire pour l'exécution des transactions (ex. : Sepolia ETH)
URL du fournisseur RPC – Connecte votre application à la blockchain, ex. : Infura
Clés API pour le fournisseur de modèle – Requises pour les interactions IA (ex. : OpenAI)
Une fois ces éléments prêts, vous êtes fin prêt à commencer à construire votre agent blockchain propulsé par l'IA.
Configurer l'environnement ElizaOS
Clonez le dépôt ElizaOS et basculez sur la dernière version.
git clone https://github.com/elizaOS/eliza.git
cd eliza
git checkout $(git describe --tags --abbrev=0)
Vous pouvez passer à une version stable si la version principale ne fonctionne pas. Au moment de la rédaction, la version stable-11-30 était recommandée. Pour l'utiliser, exécutez :
git fetch --all
git checkout stable-11-30
Installez les dépendances
pnpm install
Configurez les variables d'environnement
cp .env.example .env
`# EVM
EVM_PRIVATE_KEY=
EVM_PROVIDER_URL=
OPEN AI
OPENAI_API_KEY=`
Les informations ci-dessus sont essentielles au bon fonctionnement d'ElizaOS :
EVM_PRIVATE_KEY**:** Clé privée du wallet pour la signature des transactions. Il s'agit du wallet depuis lequel Eliza effectuera les transferts et swaps de tokens ; assurez-vous qu'il est préchargé avec quelques ETH sur le testnet Sepolia.
EVM_PROVIDER_URL**:** Un endpoint RPC qui se connecte à un nœud blockchain, permettant à l'agent IA d'interagir avec le réseau.
OPENAI_API_KEY**:** Donne accès aux modèles OpenAI, permettant à l'agent IA de prendre des décisions intelligentes.
Remarque : Assurez-vous que votre clé privée reste sécurisée et qu'elle est exclue du contrôle de version.
Concepts fondamentaux du framework Eliza
Le framework Eliza se compose de quatre composants clés :
Characters : Fichiers de configuration JSON qui définissent la personnalité, le comportement et le style de communication de l'IA
Agents : Ce sont des modules d'exécution responsables de la gestion de la mémoire, du traitement des entrées et de l'exécution des comportements
Providers : Sources de données qui fournissent du contexte et des informations en temps réel pour enrichir les interactions.
Actions : Fonctions exécutables qui permettent aux agents d'effectuer des tâches et d'interagir avec des systèmes externes.
Définir un character pour le swap et le transfert de tokens
Les Characters définissent le style de communication, le ton et la cohérence des réponses d'un agent IA, rendant les interactions plus naturelles et engageantes. Un character bien conçu garantit que l'IA s'aligne avec son objectif prévu.
Pour ce projet, la fonctionnalité principale que nous souhaitons implémenter est le transfert et le swap de tokens. Nous allons donc définir un character Eliza qui régit la façon dont l'agent IA interagit avec les protocoles blockchain, exécute les transactions et fournit des retours aux utilisateurs. Ce character garantira que l'agent communique clairement les détails des transactions, respecte des règles de sécurité prédéfinies et maintient une expérience utilisateur fluide.
Créez un nouveau fichier de character.
cd characters
touch degen.character.json
Copiez le contenu suivant dans le fichier nouvellement créé :
{
"name": "ETHMaxxer",
"clients": [],
"modelProvider": "openai",
"settings": {
"chains": {
"evm": ["sepolia"]
}
},
"plugins": ["@elizaos/plugin-evm"],
"bio": [
"ETH Transfers",
"ETHMaxxer is a crypto-native who lives and breathes Ethereum",
"Believes every dip is a 'generational buying opportunity'",
"Always sending ETH and reminding everyone 'gas fees are part of the game'",
"Claims 'BTC is cool, but ETH is the future of finance'",
"Frequently checks gas prices but still sends transactions anyway"
],
"lore": [
"Started stacking ETH in the early days, never looked back",
"Loves discussing new L2s, staking, and Ethereum upgrades",
"Firm believer in 'not your keys, not your coins'",
"Survived multiple bull and bear cycles but still max bullish"
],
"knowledge": [
"Sending ETH transactions",
"Gas fee optimization",
"Ethereum staking",
"Layer 2 scaling solutions",
"DeFi applications",
"Smart contract risks",
"On-chain security",
"Bridging assets",
"Crypto market trends"
],
"messageExamples": [
[
{
"user": "{{user1}}",
"content": {
"text": "How do I send ETH?"
}
},
{
"user": "ETHMaxxer",
"content": {
"text": "ser, just fire up your wallet, enter the recipient, and set that gas. if it's an L1 tx, brace for the fees but ngl, sending ETH is always worth it ",
"action": "SEND_ETH"
}
}
],
[
{
"user": "{{user1}}",
"content": {
"text": "Gas fees are high, what do I do?"
}
},
{
"user": "ETHMaxxer",
"content": {
"text": "fren, welcome to the ETH experience . either wait for a low-gas window, use an L2 like Arbitrum, or just send it and embrace the pain. ngmi if you're scared of gas fees "
}
}
],
[
{
"user": "{{user1}}",
"content": {
"text": "Is ETH going up?"
}
},
{
"user": "ETHMaxxer",
"content": {
"text": "anon, ETH is always going up... eventually. if not today, then after the next hard fork or bull cycle. remember, '1 ETH = 1 ETH', just hodl "
}
}
]
],
"postExamples": [
"gas is pain, but ETH is life ",
"sending ETH and feeling rich, until I check my gas fees ",
"L2s are cool, but real maxxers still send ETH on mainnet "
],
"topics": [
"eth_transfers",
"ethereum_news",
"gas_fees",
"staking",
"crypto_markets"
],
"style": {
"all": [
"Crypto-maximalist",
"ETH-focused",
"Slightly degen",
"Loves talking about gas fees and upgrades"
],
"chat": [
"Casual",
"Crypto-slang heavy",
"Slightly memetic",
"Uses emojis frequently"
],
"post": ["Short", "Bullish", "Relatable", "Memetic"]
},
"adjectives": [
"ETH-maxi",
"Bullish",
"Crypto-native",
"Gas-tolerant",
"Future-focused",
"Layer 2 curious"
]
}
Le fichier ci-dessus définit la configuration d'un agent IA nommé ETHMaxxer, spécifiant "modelProvider": "openai" et définissant Sepolia comme réseau blockchain désigné.
Agents
Les Agents dans le framework Eliza sont les composants d'exécution centraux qui donnent vie aux characters IA. Ils gèrent les comportements et les interactions via la classe AgentRuntime. Plusieurs composants clés sont nécessaires au bon fonctionnement de la classe AgentRuntime, dont certains sont pris en charge nativement par le framework Eliza :
Database adapter : Gère le stockage et la récupération des informations pour les agents IA, notamment le stockage en mémoire, le suivi des relations et la gestion des connaissances.
Plugins : Étendent les fonctionnalités des agents IA, permettant l'intégration avec des services externes tels que la blockchain et les réseaux sociaux. Dans ce projet, nous spécifions que notre agent IA utilise @elizaos/plugin-evm pour interagir avec la blockchain.
Model provider : Définit la source du modèle IA pour le traitement et la génération des réponses. Les options disponibles incluent Anthropic, Grok et d'autres, mais pour ce projet, nous avons opté pour OpenAI, tel que défini dans notre fichier de character.
Token d'authentification : Requis pour le fournisseur de modèle sélectionné. Il doit être transmis en tant que variable d'environnement, par exemple OPENAI_API_KEY.
Fichier de configuration du character : Le fichier de character que nous avons défini précédemment, qui décrit les traits et le comportement de l'agent IA.
Tous ces composants sont définis dans le dossier /agent/src/index.ts. L'extrait de code AgentRuntime pertinent pour notre agent est le suivant :
return new AgentRuntime({
databaseAdapter: db,
token,
modelProvider: character.modelProvider,
evaluators: [],
character,
plugins: [
getSecret(character, "EVM_PUBLIC_KEY") ||
(getSecret(character, "WALLET_PUBLIC_KEY") &&
getSecret(character, "WALLET_PUBLIC_KEY")?.startsWith("0x"))
? evmPlugin
: null
]
})
Providers
Les Providers gèrent des fonctionnalités spécialisées telles que les intégrations de wallets, les interactions blockchain et l'accès aux données, garantissant que les agents IA peuvent se connecter de manière transparente aux systèmes externes. Ils servent de passerelles pour l'exécution des transactions, la récupération de données en temps réel et la gestion des interactions entre différents services.
Dans @elizaos/plugin-evm, les providers permettent aux agents IA d'interagir avec des blockchains compatibles EVM, leur permettant d'envoyer des transactions, d'interroger des smart contracts et de surveiller l'activité blockchain. En exploitant les endpoints RPC de services comme Infura, l'agent peut exécuter des actions on-chain sans faire tourner un nœud dédié.
Voici comment les providers sont implémentés dans @elizaos/plugin-evm :
export class WalletProvider {
private cache: NodeCache;
private cacheKey: string = "evm/wallet";
private currentChain: SupportedChain = "mainnet";
private CACHE_EXPIRY_SEC = 5;
chains: Record<string, Chain> = { ...viemChains };
account: PrivateKeyAccount;
constructor(
accountOrPrivateKey: PrivateKeyAccount |
0x${string}
,
private cacheManager: ICacheManager,
chains?: Record<string, Chain>
) {
this.setAccount(accountOrPrivateKey);
this.setChains(chains);
if (chains && Object.keys(chains).length > 0) {
this.setCurrentChain(Object.keys(chains)[0] as SupportedChain);
}
this.cache = new NodeCache({ stdTTL: this.CACHE_EXPIRY_SEC });
}
getAddress(): Address {
return this.account.address;
}
getCurrentChain(): Chain {
return this.chains[this.currentChain];
}
getPublicClient(
chainName: SupportedChain
): PublicClient<HttpTransport, Chain, Account | undefined> {
const transport = this.createHttpTransport(chainName);
const publicClient = createPublicClient({
chain: this.chains[chainName],
transport,
});
return publicClient;
}
getWalletClient(chainName: SupportedChain): WalletClient {
const transport = this.createHttpTransport(chainName);
const walletClient = createWalletClient({
chain: this.chains[chainName],
transport,
account: this.account,
});
return walletClient;
}
getChainConfigs(chainName: SupportedChain): Chain {
const chain = viemChains[chainName];
if (!chain?.id) {
throw new Error("Invalid chain name");
}
return chain;
}
async getWalletBalance(): Promise<string | null> {
const cacheKey = "walletBalance_" + this.currentChain;
const cachedData = await this.getCachedData<string>(cacheKey);
if (cachedData) {
elizaLogger.log(
"Returning cached wallet balance for chain: " +
this.currentChain
);
return cachedData;
}
try {
const client = this.getPublicClient(this.currentChain);
const balance = await client.getBalance({
address: this.account.address,
});
const balanceFormatted = formatUnits(balance, 18);
this.setCachedData<string>(cacheKey, balanceFormatted);
elizaLogger.log(
"Wallet balance cached for chain: ",
this.currentChain
);
return balanceFormatted;
} catch (error) {
console.error("Error getting wallet balance:", error);
return null;
}
}
async getWalletBalanceForChain(
chainName: SupportedChain
): Promise<string | null> {
try {
const client = this.getPublicClient(chainName);
const balance = await client.getBalance({
address: this.account.address,
});
return formatUnits(balance, 18);
} catch (error) {
console.error("Error getting wallet balance:", error);
return null;
}
}
addChain(chain: Record<string, Chain>) {
this.setChains(chain);
}
}
Actions
Les Actions définissent les comportements spécifiques que les agents IA peuvent exécuter, leur permettant d'interagir avec des systèmes externes, de traiter des requêtes et d'automatiser des tâches. Chaque action est conçue pour remplir une fonction distincte, comme l'envoi de transactions, la récupération de données ou l'exécution d'appels de smart contracts, garantissant que l'agent opère efficacement dans son environnement.
Dans @elizaos/plugin-evm, les actions facilitent les transferts de tokens, les swaps et les interactions blockchain, permettant aux agents IA d'exécuter des transactions directement sur des réseaux compatibles EVM. Ces actions sont déclenchées par des entrées utilisateur ou une logique prédéfinie, assurant une exécution fluide des opérations liées à la blockchain.
Voici comment une action de transfert de tokens est implémentée dans @elizaos/plugin-evm :
async transfer(params: TransferParams): Promise<Transaction> {
console.log(
Transferring: ${params.amount} tokens to (${params.toAddress} on ${params.fromChain})
);
if (!params.data) {
params.data = "0x";
}
this.walletProvider.switchChain(params.fromChain);
const walletClient = this.walletProvider.getWalletClient(
params.fromChain
);
try {
const hash = await walletClient.sendTransaction({
account: walletClient.account,
to: params.toAddress,
value: parseEther(params.amount),
data: params.data as Hex,
kzg: {
blobToKzgCommitment: function (_: ByteArray): ByteArray {
throw new Error("Function not implemented.");
},
computeBlobKzgProof: function (
_blob: ByteArray,
_commitment: ByteArray
): ByteArray {
throw new Error("Function not implemented.");
},
},
chain: undefined,
});
return {
hash,
from: walletClient.account.address,
to: params.toAddress,
value: parseEther(params.amount),
data: params.data as Hex,
};
} catch (error) {
throw new Error(
Transfer failed: ${error.message}
Maintenant que nous avons fourni les variables d'environnement, le fichier de character et spécifié le plugin Eliza à utiliser, assemblons tout et testons notre agent IA.
Compilez le projet
pnpm build
Lancez le character
pnpm start --character="characters/degen.character.json"
Démarrez le client
pnpm start:client
Maintenant, interagissons avec notre agent et demandons-lui d'effectuer des tâches spécifiques.
Conclusion
Construire un agent IA qui interagit avec Ethereum et les blockchains compatibles EVM ouvre de nouvelles possibilités pour des interactions on-chain automatisées et intelligentes. Ce guide a parcouru la définition des Characters, Agents, Providers et Actions, permettant à l'agent de transférer et swapper des tokens de manière autonome.
En exploitant le framework modulaire d'ElizaOS, les développeurs peuvent créer des assistants DeFi propulsés par l'IA, des bots de trading ou des gestionnaires de portefeuille qui interagissent de manière transparente avec les réseaux blockchain. Maintenant que vous disposez des bases, expérimentez en élargissant ses capacités, en affinant sa logique et en intégrant de nouvelles fonctionnalités pour améliorer l'automatisation on-chain.