Los agentes de IA son programas autónomos diseñados para percibir su entorno, procesar información y tomar acciones para alcanzar objetivos específicos. Estos agentes pueden ir desde simples bots basados en reglas hasta sistemas avanzados de machine learning capaces de adaptarse y optimizar decisiones con el tiempo.
En blockchain y DeFi, el auge de la automatización impulsada por IA ha abierto nuevas puertas para interacciones on-chain fluidas e inteligentes. Desde la automatización de tareas como trading, evaluación de riesgos y gestión de liquidez hasta la ejecución de interacciones complejas con smart contracts, los agentes de IA están cambiando la forma en que construimos dapps al mejorar la eficiencia y reducir la necesidad de intervención humana.
Con frameworks como ElizaOS, los desarrolladores pueden crear agentes de IA que interactúen con protocolos blockchain y tomen decisiones en tiempo real sobre token swaps, arbitraje y gestión de portafolios. En esta guía, recorreremos el diseño, la configuración y la implementación de un agente de IA que ejecuta transacciones de forma autónoma utilizando las funcionalidades integradas de ElizaOS.
Requisitos previos
Antes de comenzar a construir, asegúrate de tener la siguiente configuración:
Node.js (v23.3.0 o superior)
Gestor de paquetes PNPM
Wallet compatible con EVM con tokens de testnet – Necesaria para la ejecución de transacciones (p. ej., Sepolia ETH)
URL del proveedor RPC – Conecta tu aplicación a la blockchain, p. ej. Infura
Claves API para el proveedor del modelo – Requeridas para las interacciones con IA (p. ej., OpenAI)
Una vez que tengas todo esto listo, estás preparado para comenzar a construir tu agente blockchain impulsado por IA.
Configurar el entorno de ElizaOS
Clona el repositorio de ElizaOS y cambia a la última versión.
git clone https://github.com/elizaOS/eliza.git
cd eliza
git checkout $(git describe --tags --abbrev=0)
Puedes cambiar a una versión estable si la versión principal no funciona. Al momento de escribir esto, se recomendaba la versión stable-11-30. Para usarla, ejecuta:
git fetch --all
git checkout stable-11-30
Instala las dependencias
pnpm install
Configura las variables de entorno
cp .env.example .env
`# EVM
EVM_PRIVATE_KEY=
EVM_PROVIDER_URL=
OPEN AI
OPENAI_API_KEY=`
Los detalles anteriores son esenciales para que ElizaOS funcione correctamente:
EVM_PRIVATE_KEY**:** Clave privada de la wallet para firmar transacciones. Esta es la wallet desde la cual Eliza realizará transferencias de tokens y swaps, así que asegúrate de que tenga algo de Sepolia testnet ETH cargado.
EVM_PROVIDER_URL**:** Un endpoint RPC que se conecta a un nodo blockchain, permitiendo al agente de IA interactuar con la red.
OPENAI_API_KEY**:** Otorga acceso a los modelos de OpenAI, permitiendo al agente de IA tomar decisiones inteligentes.
Nota: Asegúrate de que tu clave privada permanezca segura y esté excluida del control de versiones.
Conceptos clave del framework Eliza
El framework Eliza consta de cuatro componentes principales:
Characters: Archivos de configuración JSON que definen la personalidad, el comportamiento y el estilo de comunicación de la IA
Agents: Son los módulos de runtime responsables de gestionar la memoria, procesar entradas y ejecutar comportamientos
Providers: Fuentes de datos que suministran contexto e información en tiempo real para mejorar las interacciones
Actions: Funciones ejecutables que permiten a los agentes realizar tareas e interactuar con sistemas externos
Definir un character para token swap y transferencia
Los Characters definen el estilo de comunicación, el tono y la consistencia de respuestas de un agente de IA, haciendo las interacciones más naturales y atractivas. Un character bien diseñado garantiza que la IA se alinee con su propósito previsto.
Para este proyecto, la funcionalidad principal que queremos implementar es la transferencia y el swap de tokens, por lo que definiremos un character de Eliza que gobierne cómo el agente de IA interactúa con los protocolos blockchain, ejecuta transacciones y proporciona retroalimentación a los usuarios. Este character garantizará que el agente comunique los detalles de las transacciones con claridad, siga reglas de seguridad predefinidas y mantenga una experiencia de usuario fluida.
Crea un nuevo archivo de character.
cd characters
touch degen.character.json
Copia el siguiente contenido en el archivo recién creado:
{
"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"
]
}
El archivo anterior define la configuración para un agente de IA llamado ETHMaxxer, especificando "modelProvider": "openai" y estableciendo Sepolia como la red blockchain designada.
Agents
Los Agents en el framework Eliza son los componentes de runtime principales que dan vida a los characters de IA. Gestionan comportamientos e interacciones a través de la clase AgentRuntime. Se requieren varios componentes clave para que la clase AgentRuntime funcione correctamente, algunos de los cuales son manejados por el framework Eliza de forma nativa:
Database adapter: Gestiona el almacenamiento y la recuperación de información para los agentes de IA, incluyendo el almacenamiento de memoria, el seguimiento de relaciones y la gestión del conocimiento.
Plugins: Amplían la funcionalidad de los agentes de IA, permitiendo la integración con servicios externos como blockchain y redes sociales. En este proyecto, especificamos que nuestro agente de IA use @elizaos/plugin-evm para interactuar con la blockchain.
Model provider: Define la fuente del modelo de IA para procesar y generar respuestas. Las opciones disponibles incluyen Anthropic, Grok y otras, pero para este proyecto hemos optado por OpenAI, tal como se define en nuestro archivo de character.
Authentication token: Requerido para el proveedor de modelo seleccionado. Debe pasarse como variable de entorno, como OPENAI_API_KEY.
Character configuration file: El archivo de character que definimos anteriormente, que describe los rasgos y el comportamiento del agente de IA.
Todos estos componentes están definidos en la carpeta /agent/src/index.ts. El fragmento de código AgentRuntime relevante para nuestro agente es el siguiente:
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
Los Providers gestionan funcionalidades especializadas como integraciones de wallets, interacciones con blockchain y acceso a datos, garantizando que los agentes de IA puedan conectarse sin problemas con sistemas externos. Actúan como pasarelas para ejecutar transacciones, recuperar datos en tiempo real y gestionar interacciones entre diferentes servicios.
En @elizaos/plugin-evm, los providers permiten a los agentes de IA interactuar con blockchains compatibles con EVM, permitiéndoles enviar transacciones, consultar smart contracts y monitorear la actividad blockchain. Al aprovechar los endpoints RPC de servicios como Infura, el agente puede ejecutar acciones on-chain sin necesidad de ejecutar un nodo dedicado.
Así es como se implementan los providers en @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
Las Actions definen los comportamientos específicos que los agentes de IA pueden ejecutar, permitiéndoles interactuar con sistemas externos, procesar solicitudes y automatizar tareas. Cada action está diseñada para realizar una función específica, como enviar transacciones, recuperar datos o ejecutar llamadas a smart contracts, garantizando que el agente opere eficientemente dentro de su entorno.
En @elizaos/plugin-evm, las actions facilitan transferencias de tokens, swaps e interacciones blockchain, permitiendo a los agentes de IA ejecutar transacciones directamente en redes compatibles con EVM. Estas actions se activan por entradas del usuario o lógica predefinida, garantizando una ejecución fluida de las operaciones relacionadas con blockchain.
Así es como se implementa una action de transferencia de tokens en @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}
Ahora que hemos proporcionado las variables de entorno, el archivo de character y especificado el plugin de Eliza a usar, unamos todo y probemos nuestro agente de IA.
Construir el proyecto
pnpm build
Ejecutar el character
pnpm start --character="characters/degen.character.json"
Iniciar el cliente
pnpm start:client
Ahora, interactuemos con nuestro agente y pidámosle que realice tareas específicas.
Conclusión
Construir un agente de IA que interactúe con Ethereum y blockchains compatibles con EVM abre nuevas posibilidades para interacciones on-chain automatizadas e inteligentes. Esta guía recorrió la definición de Characters, Agents, Providers y Actions, permitiendo al agente transferir y hacer swap de tokens de forma autónoma.
Al aprovechar el framework modular de ElizaOS, los desarrolladores pueden crear asistentes DeFi impulsados por IA, bots de trading o gestores de portafolios que interactúen sin problemas con redes blockchain. Ahora que tienes la base, experimenta ampliando sus capacidades, refinando su lógica e integrando nuevas funcionalidades para mejorar la automatización on-chain.