Skip to content

Latest commit

 

History

History
197 lines (153 loc) · 5.26 KB

File metadata and controls

197 lines (153 loc) · 5.26 KB

🎯 Implémentation de l'Action getBalance


Ce document détaille l'implémentation de l'action getBalance qui est le cœur de notre plugin.


📂 Voir le code source


Importation

import {
    elizaLogger,
    Action,
    ActionExample,
    HandlerCallback,
    IAgentRuntime,
    Memory,
    State,
    ModelClass,
    generateText,
    composeContext,
    stringToUuid
} from "@elizaos/core";

Composants Interconnectés

L'action utilise plusieurs composants qui travaillent ensemble :


Configuration de l'Action

export const getBalance: Action = {
    name: "GET_BALANCE",
    similes: [
        "CHECK_BALANCE",
        "SHOW_BALANCE",
        "BALANCE",
        "SOLDE",
        "VOIR_SOLDE",
        "MONTRER_SOLDE"
    ],
    description: "Récupère et affiche le solde XRP d'une adresse donnée sur le réseau Ripple"
};

Similes

Les similes sont des mots-clés alternatifs qui peuvent déclencher l'action. Ils permettent à l'agent de reconnaître différentes formulations de la même demande.


Validation

Permet de valider que l'action peut être exécutée normalement. Ici on a décidé de mettre un REGEX pour valider l'addr wallet, mais on aurait pu mettre beaucoup plus de choses (Validation de mots clefs, var d'environnement...).

validate: async (runtime: IAgentRuntime, message: Memory) => {
    const text = message.content.text || '';
    const addressMatch = text.match(/r[A-Za-z0-9]{24,34}/i);
    return !!addressMatch;
}

La fonction validate :

  • Vérifie si le message contient une adresse XRP valide
  • Utilise une regex pour valider le format : r[A-Za-z0-9]{24,34}
  • Retourne true uniquement si une adresse valide est trouvée

Handler Principal

handler: async (
    runtime: IAgentRuntime, 
    message: Memory,
    state: State, 
    _options: { [key: string]: unknown },
    callback: HandlerCallback
) => {
    try {
        // Extraction de l'adresse
        const text = message.content.text || '';
        const addressMatch = text.match(/r[A-Za-z0-9]{24,34}/i);
        if (!addressMatch) return false;
        
        const address = addressMatch[0];
        console.log(`Recherche du solde pour l'adresse: ${address}`);

        // Appel au service API
        const xrpBalance = await getBalanceService(address);
        console.log(`Solde récupéré avec succès pour ${address}`);

        // Mise à jour du state
        state.address = address;
        state.balance = xrpBalance;
        state.currency = "XRP";

        // Génération de la réponse
        const context = composeContext({
            state,
            template: formatBalanceTemplate
        });

        const formattedResponse = await generateText({
            runtime,
            context,
            modelClass: ModelClass.SMALL
        });

        // Gestion du contexte de conversation
        await runtime.messageManager.createMemory({
            id: stringToUuid(Date.now().toString()),
            content: { text: formattedResponse },
            userId: runtime.agentId,
            roomId: message.roomId,
            agentId: runtime.agentId
        });

        // Envoi de la réponse
        if (callback) {
            callback({
                text: formattedResponse,
                inReplyTo: message.id
            });
        }

        return true;

    } catch (error: any) {
        elizaLogger.error("Erreur dans le handler du plugin XRP:", error);
        if (callback) {
            callback({
                text: `Une erreur est survenue lors de la récupération du solde. Veuillez réessayer plus tard.`
            });
        }
        return false;
    }
}

📂 Voir le code source

Étapes Détaillées du Handler

  1. Extraction de l'Adresse

    • Utilise la même regex que la validation
    • Extrait l'adresse XRP du message
  2. Appel au Service API

    • Utilise getBalanceService pour récupérer le solde
    • Gère les erreurs potentielles de l'API
  3. Gestion du State

    • Met à jour le state avec :
      • L'adresse du wallet
      • Le solde récupéré
      • La devise (XRP)
    • Le state est utilisé pour le template de réponse
  4. Génération de la Réponse

    • Utilise composeContext pour préparer les données
    • Appelle generateText avec le contexte
    • Utilise ModelClass.SMALL pour une réponse rapide
  5. Gestion du Contexte

    • Crée une mémoire pour maintenir le contexte
    • Permet à l'agent de se souvenir de la conversation
  6. Envoi de la Réponse

    • Utilise le callback pour envoyer la réponse
    • Lie la réponse au message original avec inReplyTo

Liens Connexes