Создайте AI-агента для перевода и обмена токенов с помощью ElizaOS

Узнайте, как создать AI-агента для перевода и обмена токенов.

5 мин
Создайте AI-агента для перевода и обмена токенов с помощью ElizaOS

AI-агенты — это автономные программы, предназначенные для восприятия окружающей среды, обработки информации и выполнения действий для достижения конкретных целей. Такие агенты могут варьироваться от простых ботов на основе правил до продвинутых систем машинного обучения, способных адаптироваться и оптимизировать решения со временем.

В блокчейне и DeFi развитие автоматизации на базе ИИ открыло новые возможности для бесшовного и интеллектуального взаимодействия on-chain. От автоматизации задач вроде торговли, оценки рисков и управления ликвидностью до выполнения сложных взаимодействий со смарт-контрактами — AI-агенты меняют подход к разработке dapp, повышая эффективность и снижая потребность в участии человека.

С помощью таких фреймворков, как ElizaOS, разработчики могут создавать AI-агентов, взаимодействующих с блокчейн-протоколами и принимающих решения в реальном времени по свопам токенов, арбитражу и управлению портфелем. В этом руководстве мы рассмотрим проектирование, настройку и реализацию AI-агента, который автономно выполняет транзакции с использованием встроенных функций ElizaOS.

Предварительные требования

Перед началом разработки убедитесь, что у вас настроено следующее:

  • Node.js (v23.3.0 или выше)

  • Менеджер пакетов PNPM

  • EVM-совместимый кошелёк с токенами тестовой сети — необходим для выполнения транзакций (например, Sepolia ETH)

  • URL RPC-провайдера — подключает ваше приложение к блокчейну, например Infura

  • API-ключи для провайдера модели — необходимы для взаимодействия с ИИ (например, OpenAI)

Как только всё будет готово, можно приступать к созданию AI-агента для блокчейна.

Настройка окружения ElizaOS

Клонируйте репозиторий ElizaOS и переключитесь на последний релиз.

git clone https://github.com/elizaOS/eliza.git
cd eliza
git checkout $(git describe --tags --abbrev=0)
Копировать

Если основная версия не работает, можно переключиться на стабильный релиз. На момент написания руководства рекомендовалась версия stable-11-30. Чтобы её использовать, выполните:

git fetch --all 
git checkout stable-11-30
Копировать

Установите зависимости

pnpm install

Настройте переменные окружения

cp .env.example .env

`# EVM EVM_PRIVATE_KEY= EVM_PROVIDER_URL=

OPEN AI

OPENAI_API_KEY=`

Приведённые выше данные необходимы для корректной работы ElizaOS:

  • EVM_PRIVATE_KEY**:** Приватный ключ кошелька для подписи транзакций. Именно с этого кошелька Eliza будет выполнять переводы токенов и свопы, поэтому убедитесь, что на нём есть тестовый ETH сети Sepolia.

  • EVM_PROVIDER_URL**:** RPC-эндпоинт, подключающийся к блокчейн-ноде и позволяющий AI-агенту взаимодействовать с сетью.

  • OPENAI_API_KEY**:** Предоставляет доступ к моделям OpenAI, позволяя AI-агенту принимать интеллектуальные решения.

Примечание: Убедитесь, что ваш приватный ключ надёжно защищён и не попадает в систему контроля версий.

Основные концепции фреймворка Eliza

Фреймворк Eliza состоит из четырёх ключевых компонентов:

  • Characters (Персонажи): JSON-файлы конфигурации, определяющие личность ИИ, его поведение и стиль общения

  • Agents (Агенты): Модули среды выполнения, отвечающие за управление памятью, обработку входных данных и выполнение поведений

  • Providers (Провайдеры): Источники данных, предоставляющие контекст и информацию в реальном времени для улучшения взаимодействий

  • Actions (Действия): Исполняемые функции, позволяющие агентам выполнять задачи и взаимодействовать с внешними системами

Определение персонажа для свопа и перевода токенов

Персонажи определяют стиль общения AI-агента, его тон и последовательность ответов, делая взаимодействие более естественным и увлекательным. Хорошо проработанный персонаж обеспечивает соответствие ИИ его предназначению.

В этом проекте основная функциональность, которую мы хотим реализовать, — это перевод и своп токенов. Поэтому мы определим персонажа Eliza, который управляет тем, как AI-агент взаимодействует с блокчейн-протоколами, выполняет транзакции и предоставляет обратную связь пользователям. Этот персонаж обеспечит чёткую передачу деталей транзакций, соблюдение заранее заданных правил безопасности и бесшовный пользовательский опыт.

Создайте новый файл персонажа.

cd characters
touch degen.character.json
Копировать

Скопируйте следующее содержимое в только что созданный файл:

{
    "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"
    ]
}
Копировать

Приведённый выше файл определяет конфигурацию AI-агента с именем ETHMaxxer, задаёт "modelProvider": "openai" и устанавливает Sepolia в качестве целевой блокчейн-сети.

Агенты

Агенты во фреймворке Eliza — это основные компоненты среды выполнения, которые воплощают AI-персонажей в жизнь. Они управляют поведением и взаимодействиями через класс AgentRuntime. Для корректной работы класса AgentRuntime необходим ряд ключевых компонентов, часть из которых фреймворк Eliza обрабатывает автоматически:

  • Database adapter (Адаптер базы данных): Отвечает за хранение и извлечение информации для AI-агентов, включая хранение памяти, отслеживание связей и управление знаниями.

  • Plugins (Плагины): Расширяют функциональность AI-агентов, обеспечивая интеграцию с внешними сервисами, такими как блокчейн и социальные сети. В этом проекте мы указываем AI-агенту использовать @elizaos/plugin-evm для взаимодействия с блокчейном.

  • Model provider (Провайдер модели): Определяет источник AI-модели для обработки и генерации ответов. Доступные варианты включают Anthropic, Grok и другие, однако в этом проекте мы выбрали OpenAI, как указано в файле персонажа.

  • Authentication token (Токен аутентификации): Необходим для выбранного провайдера модели. Должен передаваться как переменная окружения, например OPENAI_API_KEY.

  • Character configuration file (Файл конфигурации персонажа): Файл персонажа, определённый ранее, который описывает черты и поведение AI-агента.

Все эти компоненты определены в папке /agent/src/index.ts. Соответствующий фрагмент кода AgentRuntime для нашего агента выглядит следующим образом:

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
        ]
})
Копировать

Провайдеры

Провайдеры обеспечивают специализированную функциональность, такую как интеграция кошельков, взаимодействие с блокчейном и доступ к данным, позволяя AI-агентам бесшовно подключаться к внешним системам. Они выступают шлюзами для выполнения транзакций, получения данных в реальном времени и управления взаимодействиями между различными сервисами.

В @elizaos/plugin-evm провайдеры позволяют AI-агентам взаимодействовать с EVM-совместимыми блокчейнами: отправлять транзакции, запрашивать смарт-контракты и отслеживать активность в блокчейне. Используя RPC-эндпоинты таких сервисов, как Infura, агент может выполнять on-chain действия без запуска выделенной ноды.

Вот как провайдеры реализованы в @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);
    }  
}
Копировать

Действия

Действия определяют конкретные поведения, которые могут выполнять AI-агенты, позволяя им взаимодействовать с внешними системами, обрабатывать запросы и автоматизировать задачи. Каждое действие предназначено для выполнения отдельной функции — например, отправки транзакций, получения данных или вызова смарт-контрактов — обеспечивая эффективную работу агента в его среде.

В @elizaos/plugin-evm действия обеспечивают переводы токенов, свопы и взаимодействие с блокчейном, позволяя AI-агентам выполнять транзакции непосредственно в EVM-совместимых сетях. Эти действия инициируются пользовательскими вводами или заранее заданной логикой, обеспечивая бесшовное выполнение операций, связанных с блокчейном.

Вот как реализовано действие перевода токенов в @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}
);
        }
    }
Копировать

Теперь, когда мы задали переменные окружения, файл персонажа и указали плагин Eliza для использования, давайте объединим всё вместе и протестируем нашего AI-агента.

Сборка проекта

pnpm build

Запуск персонажа

pnpm start --character="characters/degen.character.json"

Запуск клиента

pnpm start:client

Теперь давайте взаимодействовать с нашим агентом и попросим его выполнить конкретные задачи.

Заключение

Создание AI-агента, взаимодействующего с Ethereum и EVM-совместимыми блокчейнами, открывает новые возможности для автоматизированного и интеллектуального on-chain взаимодействия. В этом руководстве мы рассмотрели определение Characters, Agents, Providers и Actions, позволяющих агенту автономно переводить и свапать токены.

Используя модульный фреймворк ElizaOS, разработчики могут создавать DeFi-ассистентов на базе ИИ, торговых ботов или менеджеров портфелей, которые бесшовно взаимодействуют с блокчейн-сетями. Теперь, когда у вас есть основа, экспериментируйте с расширением возможностей, совершенствованием логики и интеграцией новых функций для улучшения on-chain автоматизации.

Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.

Оцените перевод
  • Kingsley Okonkwo
    Kingsley Okonkwo

    Кингсли — сертифицированный разработчик блокчейна Ethereum, работающий техническим писателем в Consensys с особым акцентом на инструменты для разработчиков. До прихода в Consensys Кингсли работал фриланс-разработчиком бэкенда на нескольких платформах, включая Gigster и Braintrust. Имея за плечами 5 лет опыта в разработке программного обеспечения, он уверенно владеет такими инструментами, как JavaScript (Node.js и React), GoLang, SQL и Docker. Кингсли мастерски создаёт пошаговые руководства и практические гайды, используя новейшие технологии web3, чтобы помочь коллегам-разработчикам создавать более качественные dapps. В настоящее время проживая в Дубае, Кингсли в свободное время увлекается баскетболом и футболом.

    Читать все статьи