Aller au contenu

Créez un agent IA capable de transférer et d'échanger des tokens avec ElizaOS

Apprenez à créer un agent IA capable de transférer et d'échanger des tokens.

5 min
Créez un agent IA capable de transférer et d'échanger des tokens avec ElizaOS

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)
Copier

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
Copier

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
Copier

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"
    ]
}
Copier

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
        ]
})
Copier

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 | 
Copier
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);
    }  
}
Copier

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(
           
Copier
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(
Copier
Transfer failed: ${error.message}
);
        }
    }
Copier

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.

Traduit par IA. Peut contenir des erreurs. Veuillez toujours vérifier les informations.

Évaluer la traduction

Cet article a été rédigé par :

  • Kingsley Okonkwo

    Kingsley, développeur blockchain Ethereum certifié, occupe le poste de rédacteur technique chez Consensys, avec une spécialisation dans les outils destinés aux développeurs. Avant de rejoindre Consensys, Kingsley a travaillé en tant que développeur backend freelance sur plusieurs plateformes, dont Gigster et Braintrust. Fort de 5 ans d'expérience en développement logiciel, il maîtrise des outils tels que JavaScript (Node.js & React), GoLang, SQL et Docker. Kingsley excelle dans la création de tutoriels pas à pas et de guides pratiques, en s'appuyant sur les dernières technologies web3 pour aider les développeurs à créer de meilleures dapps. Actuellement basé à Dubaï, Kingsley aime jouer au basketball et au football pendant son temps libre.

    Lire tous les articles