From 3db07240994c8987642e3a7af8d3e2d6a97bbdf1 Mon Sep 17 00:00:00 2001 From: cygaar Date: Wed, 4 Dec 2024 19:51:08 -0500 Subject: [PATCH] fix: plugins docs --- docs/docs/packages/plugins.md | 596 ++++++++++++---------------------- 1 file changed, 210 insertions(+), 386 deletions(-) diff --git a/docs/docs/packages/plugins.md b/docs/docs/packages/plugins.md index dc9215c277b..78326cc35bc 100644 --- a/docs/docs/packages/plugins.md +++ b/docs/docs/packages/plugins.md @@ -12,92 +12,15 @@ Each plugin in Eliza must implement the `Plugin` interface with the following pr ```typescript interface Plugin { - name: string; // Unique identifier for the plugin - description: string; // Brief description of plugin functionality - actions?: Action[]; // Custom actions provided by the plugin - evaluators?: Evaluator[]; // Custom evaluators for behavior assessment - providers?: Provider[]; // Context providers for message generation - services?: Service[]; // Additional services (optional) + name: string; // Unique identifier for the plugin + description: string; // Brief description of plugin functionality + actions?: Action[]; // Custom actions provided by the plugin + evaluators?: Evaluator[]; // Custom evaluators for behavior assessment + providers?: Provider[]; // Context providers for message generation + services?: Service[]; // Additional services (optional) } ``` -### Available Plugins - -#### 1. Bootstrap Plugin (`@eliza/plugin-bootstrap`) - -The bootstrap plugin provides essential baseline functionality: - -**Actions:** - -- `continue` - Continue the current conversation flow -- `followRoom` - Follow a room for updates -- `unfollowRoom` - Unfollow a room -- `ignore` - Ignore specific messages -- `muteRoom` - Mute notifications from a room -- `unmuteRoom` - Unmute notifications from a room - -**Evaluators:** - -- `fact` - Evaluate factual accuracy -- `goal` - Assess goal completion - -**Providers:** - -- `boredom` - Manages engagement levels -- `time` - Provides temporal context -- `facts` - Supplies factual information - -#### 2. Image Generation Plugin (`@eliza/plugin-image-generation`) - -Enables AI image generation capabilities: - -**Actions:** - -- `GENERATE_IMAGE` - Create images based on text descriptions -- Supports multiple image generation services (Anthropic, Together) -- Auto-generates captions for created images - -#### 3. Node Plugin (`@eliza/plugin-node`) - -Provides core Node.js-based services: - -**Services:** - -- `BrowserService` - Web browsing capabilities -- `ImageDescriptionService` - Image analysis -- `LlamaService` - LLM integration -- `PdfService` - PDF processing -- `SpeechService` - Text-to-speech -- `TranscriptionService` - Speech-to-text -- `VideoService` - Video processing - -#### 4. Solana Plugin (`@eliza/plugin-solana`) - -Integrates Solana blockchain functionality: - -**Evaluators:** - -- `trustEvaluator` - Assess transaction trust scores - -**Providers:** - -- `walletProvider` - Wallet management -- `trustScoreProvider` - Transaction trust metrics - -#### 5. Buttplug Plugin (`@eliza/plugin-buttplug`) - -Integrates Buttplug.io for intimate toy control: - -**Services:** - -- `ButtplugService` - Buttplug.io integration itself - -**Actions:** - -- `VIBRATE` - Control vibration intensity and duration of connected devices -- `ROTATE` - Control rotation intensity and duration of connected devices -- `BATTERY` - Get the battery level of connected devices - ## Using Plugins ### Installation @@ -115,36 +38,13 @@ import { bootstrapPlugin } from "@eliza/plugin-bootstrap"; import { imageGenerationPlugin } from "@eliza/plugin-image-generation"; import { buttplugPlugin } from "@eliza/plugin-buttplug"; const character = { - // ... other character config - plugins: [bootstrapPlugin, imageGenerationPlugin, buttplugPlugin], + // ... other character config + plugins: [bootstrapPlugin, imageGenerationPlugin, buttplugPlugin], }; ``` --- -# 🧩 Plugins - -## Overview - -Eliza's plugin system provides a modular way to extend the core functionality with additional features, actions, evaluators, and providers. Plugins are self-contained modules that can be easily added or removed to customize your agent's capabilities. - -## Core Plugin Concepts - -### Plugin Structure - -Each plugin in Eliza must implement the `Plugin` interface with the following properties: - -```typescript -interface Plugin { - name: string; // Unique identifier for the plugin - description: string; // Brief description of plugin functionality - actions?: Action[]; // Custom actions provided by the plugin - evaluators?: Evaluator[]; // Custom evaluators for behavior assessment - providers?: Provider[]; // Context providers for message generation - services?: Service[]; // Additional services (optional) -} -``` - ### Available Plugins #### 1. Bootstrap Plugin (`@eliza/plugin-bootstrap`) @@ -222,7 +122,6 @@ The charity addresses for each network are as follows: In the future, we aim to integrate with The Giving Block API to allow for dynamic and configurable donations, enabling support for a wider range of charitable organizations. - #### 5. Coinbase Commerce Plugin (`@eliza/plugin-coinbase`) Integrates Coinbase Commerce for payment and transaction management: @@ -245,34 +144,15 @@ The plugin automatically handles wallet creation or uses an existing wallet if t 1. **Wallet Generation on First Run** If no wallet information is provided (`COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID`), the plugin will: - - **Generate a new wallet** using the Coinbase SDK. - - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage. - - Log the wallet’s default address for reference. - - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file. - -2. **Using an Existing Wallet** - If wallet information is available during the first run: - - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables. - - The plugin will **import the wallet** and use it for processing mass payouts. - ---- - -### Coinbase Wallet Management - -The plugin automatically handles wallet creation or uses an existing wallet if the required details are provided during the first run. - -1. **Wallet Generation on First Run** - If no wallet information is provided (`COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID`), the plugin will: - - - **Generate a new wallet** using the Coinbase SDK. - - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage. - - Log the wallet’s default address for reference. - - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file. + - **Generate a new wallet** using the Coinbase SDK. + - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage. + - Log the wallet’s default address for reference. + - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file. 2. **Using an Existing Wallet** If wallet information is available during the first run: - - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables. - - The plugin will **import the wallet** and use it for processing mass payouts. + - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables. + - The plugin will **import the wallet** and use it for processing mass payouts. --- @@ -284,35 +164,35 @@ This plugin facilitates the processing of cryptocurrency mass payouts using the - `SEND_MASS_PAYOUT` Sends cryptocurrency mass payouts to multiple wallet addresses. - - **Inputs**: - - `receivingAddresses` (array of strings): Wallet addresses to receive funds. - - `transferAmount` (number): Amount to send to each address (in smallest currency unit, e.g., Wei for ETH). - - `assetId` (string): Cryptocurrency asset ID (e.g., `ETH`, `BTC`). - - `network` (string): Blockchain network (e.g., `base`, `sol`, `eth`, `arb`, `pol`). - - **Outputs**: Logs transaction results (success/failure) in a CSV file. - - **Example**: - ```json - { - "receivingAddresses": [ - "0xA0ba2ACB5846A54834173fB0DD9444F756810f06", - "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF" - ], - "transferAmount": 5000000000000000, - "assetId": "ETH", - "network": "eth" - } - ``` + - **Inputs**: + - `receivingAddresses` (array of strings): Wallet addresses to receive funds. + - `transferAmount` (number): Amount to send to each address (in smallest currency unit, e.g., Wei for ETH). + - `assetId` (string): Cryptocurrency asset ID (e.g., `ETH`, `BTC`). + - `network` (string): Blockchain network (e.g., `base`, `sol`, `eth`, `arb`, `pol`). + - **Outputs**: Logs transaction results (success/failure) in a CSV file. + - **Example**: + ```json + { + "receivingAddresses": [ + "0xA0ba2ACB5846A54834173fB0DD9444F756810f06", + "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF" + ], + "transferAmount": 5000000000000000, + "assetId": "ETH", + "network": "eth" + } + ``` **Providers:** - `massPayoutProvider` Retrieves details of past transactions from the generated CSV file. - - **Outputs**: A list of transaction records including the following fields: - - `address`: Recipient wallet address. - - `amount`: Amount sent. - - `status`: Transaction status (`Success` or `Failed`). - - `errorCode`: Error code (if any). - - `transactionUrl`: URL for transaction details (if available). + - **Outputs**: A list of transaction records including the following fields: + - `address`: Recipient wallet address. + - `amount`: Amount sent. + - `status`: Transaction status (`Success` or `Failed`). + - `errorCode`: Error code (if any). + - `transactionUrl`: URL for transaction details (if available). **Description:** @@ -326,150 +206,91 @@ Supported networks: - `arb` (Arbitrum) - `pol` (Polygon) -**Usage Instructions:** +**Setup and Configuration:** 1. **Configure the Plugin** - Add the plugin to your character’s configuration: + Add the plugin to your character's configuration: - ```typescript - import { coinbaseMassPaymentsPlugin } from "@eliza/plugin-coinbase-masspayments"; + ```typescript + import { coinbaseMassPaymentsPlugin } from "@eliza/plugin-coinbase-masspayments"; - const character = { - plugins: [coinbaseMassPaymentsPlugin], - }; - ``` + const character = { + plugins: [coinbaseMassPaymentsPlugin], + }; + ``` -2. **Ensure Secure Configuration** - Set the following environment variables or runtime settings to ensure the plugin functions securely: +2. **Required Configurations** + Set the following environment variables or runtime settings: - - `COINBASE_API_KEY`: API key for Coinbase SDK. - - `COINBASE_PRIVATE_KEY`: Private key for secure transactions. + - `COINBASE_API_KEY`: API key for Coinbase SDK + - `COINBASE_PRIVATE_KEY`: Private key for secure transactions + - `COINBASE_GENERATED_WALLET_HEX_SEED`: Hexadecimal seed of the wallet (if using existing wallet) + - `COINBASE_GENERATED_WALLET_ID`: Unique wallet ID (if using existing wallet) **Wallet Management:** -The plugin automatically handles wallet creation or uses an existing wallet if the required details are provided during the first run. - -1. **Wallet Generation on First Run** - If no wallet information is provided (`COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID`), the plugin will: - - - **Generate a new wallet** using the Coinbase SDK. - - Automatically **export the wallet details** (`seed` and `walletId`) and securely store them in `runtime.character.settings.secrets` or other configured storage. - - Log the wallet’s default address for reference. - - If the character file does not exist, the wallet details are saved to a characters/charactername-seed.txt file in the characters directory with a note indicating that the user must manually add these details to settings.secrets or the .env file. - -2. **Using an Existing Wallet** - If wallet information is available during the first run: - - Provide `COINBASE_GENERATED_WALLET_HEX_SEED` and `COINBASE_GENERATED_WALLET_ID` via `runtime.character.settings.secrets` or environment variables. - - The plugin will **import the wallet** and use it for processing mass payouts. - -**Required Configurations:** - -The following configurations must be provided for wallet management: - -- **Environment Variables or Secrets**: - - `COINBASE_GENERATED_WALLET_HEX_SEED`: Hexadecimal seed of the wallet. - - `COINBASE_GENERATED_WALLET_ID`: Unique wallet ID. - - These variables must be securely stored in `runtime.character.settings.secrets` or as environment variables. - ---- - -### Wallet Creation Process +The plugin handles wallet creation and management in two ways: 1. **Automatic Wallet Creation** - When no wallet details are available: - - - A new wallet is created using the Coinbase SDK. - - The wallet’s `seed` and `walletId` are retrieved using the following logic: - ```typescript - const walletData: WalletData = wallet.export(); - runtime.character.settings.secrets.COINBASE_GENERATED_WALLET_HEX_SEED = - walletData.seed; - runtime.character.settings.secrets.COINBASE_GENERATED_WALLET_ID = - walletData.walletId; - ``` - - The default wallet address is logged: - ```typescript - const walletAddress = wallet.getDefaultAddress(); - elizaLogger.log("Created and stored new wallet:", walletAddress); - ``` - -2. **Using Existing Wallet Details** - When the wallet details are provided: - - The wallet is imported using the following logic: - ```typescript - wallet = await Wallet.import({ - seed: storedSeed, - walletId: storedWalletId, - }); - elizaLogger.log("Imported existing wallet:", wallet.getDefaultAddress()); - ``` + When no wallet details are provided, the plugin will: -**Example Configuration:** + - Generate a new wallet using the Coinbase SDK + - Export and store the wallet details in `runtime.character.settings.secrets` + - Save details to `characters/charactername-seed.txt` if character file doesn't exist + - Log the wallet's default address -#### Automatic Wallet Generation: +2. **Using Existing Wallet** + When wallet information is available: + - Provide the required wallet details via settings or environment variables + - The plugin will import and use the existing wallet -No existing wallet information is passed. The plugin creates and stores a new wallet: +**Example Configuration:** ```typescript +// For automatic wallet generation runtime.character.settings.secrets = { - // Empty settings for first run + // Empty settings for first run }; -``` -Output Log: - -```plaintext -[INFO] Created and stored new wallet: 0x1234567890abcdef1234567890abcdef12345678 +// For using existing wallet +runtime.character.settings.secrets = { + COINBASE_GENERATED_WALLET_HEX_SEED: + "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + COINBASE_GENERATED_WALLET_ID: "wallet-id-123", +}; ``` -#### Using Existing Wallet Information: - -Existing wallet details are passed into the runtime: +**Example Call** ```typescript -runtime.character.settings.secrets = { - COINBASE_GENERATED_WALLET_HEX_SEED: - "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", - COINBASE_GENERATED_WALLET_ID: "wallet-id-123", -}; +const response = await runtime.triggerAction("SEND_MASS_PAYOUT", { + receivingAddresses: [ + "0xA0ba2ACB5846A54834173fB0DD9444F756810f06", + "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF", + ], + transferAmount: 5000000000000000, // 0.005 ETH + assetId: "ETH", + network: "eth", +}); +console.log("Mass payout response:", response); ``` -Output Log: +**Transaction Logging** + +All transactions (successful and failed) are logged to a `transactions.csv` file in the plugin’s working directory: ```plaintext -[INFO] Imported existing wallet: 0x1234567890abcdef1234567890abcdef12345678 +Address,Amount,Status,Error Code,Transaction URL +0xA0ba2ACB5846A54834173fB0DD9444F756810f06,5000000000000000,Success,,https://etherscan.io/tx/0x... ``` -3. **Example Call** - An example of using the `SEND_MASS_PAYOUT` action: - - ```typescript - const response = await runtime.triggerAction("SEND_MASS_PAYOUT", { - receivingAddresses: [ - "0xA0ba2ACB5846A54834173fB0DD9444F756810f06", - "0xF14F2c49aa90BaFA223EE074C1C33b59891826bF", - ], - transferAmount: 5000000000000000, // 0.005 ETH - assetId: "ETH", - network: "eth", - }); - console.log("Mass payout response:", response); - ``` - -4. **Transaction Logging** - All transactions (successful and failed) are logged to a `transactions.csv` file in the plugin’s working directory: - ```plaintext - Address,Amount,Status,Error Code,Transaction URL - 0xA0ba2ACB5846A54834173fB0DD9444F756810f06,5000000000000000,Success,,https://etherscan.io/tx/0x... - ``` - **Example Output:** When successful, a response similar to the following will be returned: ```json { - "text": "Mass payouts completed successfully.\n- Successful Transactions: 2\n- Failed Transactions: 0\nCheck the CSV file for more details." + "text": "Mass payouts completed successfully.\n- Successful Transactions: 2\n- Failed Transactions: 0\nCheck the CSV file for more details." } ``` @@ -489,47 +310,48 @@ This plugin enables the deployment and interaction with various token contracts 1. `DEPLOY_TOKEN_CONTRACT` Deploys a new token contract (ERC20, ERC721, or ERC1155). - - **Inputs**: - - `contractType` (string): Type of contract to deploy (`ERC20`, `ERC721`, or `ERC1155`) - - `name` (string): Name of the token - - `symbol` (string): Symbol of the token - - `network` (string): Blockchain network to deploy on - - `baseURI` (string, optional): Base URI for token metadata (required for ERC721 and ERC1155) - - `totalSupply` (number, optional): Total supply of tokens (only for ERC20) - - **Example**: - ```json - { - "contractType": "ERC20", - "name": "MyToken", - "symbol": "MTK", - "network": "base", - "totalSupply": 1000000 - } - ``` + + - **Inputs**: + - `contractType` (string): Type of contract to deploy (`ERC20`, `ERC721`, or `ERC1155`) + - `name` (string): Name of the token + - `symbol` (string): Symbol of the token + - `network` (string): Blockchain network to deploy on + - `baseURI` (string, optional): Base URI for token metadata (required for ERC721 and ERC1155) + - `totalSupply` (number, optional): Total supply of tokens (only for ERC20) + - **Example**: + ```json + { + "contractType": "ERC20", + "name": "MyToken", + "symbol": "MTK", + "network": "base", + "totalSupply": 1000000 + } + ``` 2. `INVOKE_CONTRACT` Invokes a method on a deployed smart contract. - - **Inputs**: - - `contractAddress` (string): Address of the contract to invoke - - `method` (string): Method name to invoke - - `abi` (array): Contract ABI - - `args` (object, optional): Arguments for the method - - `amount` (number, optional): Amount of asset to send (for payable methods) - - `assetId` (string, optional): Asset ID to send - - `network` (string): Blockchain network to use - - **Example**: - ```json - { - "contractAddress": "0x123...", - "method": "transfer", - "abi": [...], - "args": { - "to": "0x456...", - "amount": "1000000000000000000" - }, - "network": "base" - } - ``` + - **Inputs**: + - `contractAddress` (string): Address of the contract to invoke + - `method` (string): Method name to invoke + - `abi` (array): Contract ABI + - `args` (object, optional): Arguments for the method + - `amount` (number, optional): Amount of asset to send (for payable methods) + - `assetId` (string, optional): Asset ID to send + - `network` (string): Blockchain network to use + - **Example**: + ```json + { + "contractAddress": "0x123...", + "method": "transfer", + "abi": [...], + "args": { + "to": "0x456...", + "amount": "1000000000000000000" + }, + "network": "base" + } + ``` **Description:** @@ -547,54 +369,56 @@ All contract deployments and interactions are logged to a CSV file for record-ke 1. **Configure the Plugin** Add the plugin to your character's configuration: - ```typescript - import { tokenContractPlugin } from "@eliza/plugin-coinbase"; + ```typescript + import { tokenContractPlugin } from "@eliza/plugin-coinbase"; - const character = { - plugins: [tokenContractPlugin], - }; - ``` + const character = { + plugins: [tokenContractPlugin], + }; + ``` 2. **Required Configurations** Ensure the following environment variables or runtime settings are configured: - - `COINBASE_API_KEY`: API key for Coinbase SDK - - `COINBASE_PRIVATE_KEY`: Private key for secure transactions - - Wallet configuration (same as MassPayments plugin) + - `COINBASE_API_KEY`: API key for Coinbase SDK + - `COINBASE_PRIVATE_KEY`: Private key for secure transactions + - Wallet configuration (same as MassPayments plugin) **Example Deployments:** 1. **ERC20 Token** - ```typescript - const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", { - contractType: "ERC20", - name: "MyToken", - symbol: "MTK", - network: "base", - totalSupply: 1000000 - }); - ``` + + ```typescript + const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", { + contractType: "ERC20", + name: "MyToken", + symbol: "MTK", + network: "base", + totalSupply: 1000000, + }); + ``` 2. **NFT Collection** - ```typescript - const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", { - contractType: "ERC721", - name: "MyNFT", - symbol: "MNFT", - network: "eth", - baseURI: "https://api.mynft.com/metadata/" - }); - ``` + + ```typescript + const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", { + contractType: "ERC721", + name: "MyNFT", + symbol: "MNFT", + network: "eth", + baseURI: "https://api.mynft.com/metadata/", + }); + ``` 3. **Multi-token Collection** - ```typescript - const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", { - contractType: "ERC1155", - name: "MyMultiToken", - symbol: "MMT", - network: "pol", - baseURI: "https://api.mymultitoken.com/metadata/" - }); - ``` + ```typescript + const response = await runtime.triggerAction("DEPLOY_TOKEN_CONTRACT", { + contractType: "ERC1155", + name: "MyMultiToken", + symbol: "MMT", + network: "pol", + baseURI: "https://api.mymultitoken.com/metadata/", + }); + ``` **Contract Interaction Example:** @@ -640,37 +464,37 @@ const provider = new DeriveKeyProvider(); // Derive a raw key try { - const rawKey = await provider.rawDeriveKey( - "/path/to/derive", - "subject-identifier", - ); - // rawKey is a DeriveKeyResponse that can be used for further processing - // to get the uint8Array do the following - const rawKeyArray = rawKey.asUint8Array(); + const rawKey = await provider.rawDeriveKey( + "/path/to/derive", + "subject-identifier", + ); + // rawKey is a DeriveKeyResponse that can be used for further processing + // to get the uint8Array do the following + const rawKeyArray = rawKey.asUint8Array(); } catch (error) { - console.error("Raw key derivation failed:", error); + console.error("Raw key derivation failed:", error); } // Derive a Solana keypair (Ed25519) try { - const solanaKeypair = await provider.deriveEd25519Keypair( - "/path/to/derive", - "subject-identifier", - ); - // solanaKeypair can now be used for Solana operations + const solanaKeypair = await provider.deriveEd25519Keypair( + "/path/to/derive", + "subject-identifier", + ); + // solanaKeypair can now be used for Solana operations } catch (error) { - console.error("Solana key derivation failed:", error); + console.error("Solana key derivation failed:", error); } // Derive an Ethereum keypair (ECDSA) try { - const evmKeypair = await provider.deriveEcdsaKeypair( - "/path/to/derive", - "subject-identifier", - ); - // evmKeypair can now be used for Ethereum operations + const evmKeypair = await provider.deriveEcdsaKeypair( + "/path/to/derive", + "subject-identifier", + ); + // evmKeypair can now be used for Ethereum operations } catch (error) { - console.error("EVM key derivation failed:", error); + console.error("EVM key derivation failed:", error); } ``` @@ -682,10 +506,10 @@ import { RemoteAttestationProvider } from "@ai16z/plugin-tee"; const provider = new RemoteAttestationProvider(); // Generate Remote Attestation try { - const attestation = await provider.generateAttestation("your-report-data"); - console.log("Attestation:", attestation); + const attestation = await provider.generateAttestation("your-report-data"); + console.log("Attestation:", attestation); } catch (error) { - console.error("Failed to generate attestation:", error); + console.error("Failed to generate attestation:", error); } ``` @@ -717,20 +541,20 @@ Create a new plugin by implementing the Plugin interface: import { Plugin, Action, Evaluator, Provider } from "@ai16z/eliza"; const myCustomPlugin: Plugin = { - name: "my-custom-plugin", - description: "Adds custom functionality", - actions: [ - /* custom actions */ - ], - evaluators: [ - /* custom evaluators */ - ], - providers: [ - /* custom providers */ - ], - services: [ - /* custom services */ - ], + name: "my-custom-plugin", + description: "Adds custom functionality", + actions: [ + /* custom actions */ + ], + evaluators: [ + /* custom evaluators */ + ], + providers: [ + /* custom providers */ + ], + services: [ + /* custom services */ + ], }; ``` @@ -772,14 +596,14 @@ const myCustomPlugin: Plugin = { ```typescript // Check if plugins are loaded correctly if (character.plugins) { - console.log("Plugins are: ", character.plugins); - const importedPlugins = await Promise.all( - character.plugins.map(async (plugin) => { - const importedPlugin = await import(plugin); - return importedPlugin; - }), - ); - character.plugins = importedPlugins; + console.log("Plugins are: ", character.plugins); + const importedPlugins = await Promise.all( + character.plugins.map(async (plugin) => { + const importedPlugin = await import(plugin); + return importedPlugin; + }), + ); + character.plugins = importedPlugins; } ```