From a68729bf410ee9febdec0e5c47f428a7ad9b23d9 Mon Sep 17 00:00:00 2001 From: aryan Date: Thu, 14 Nov 2024 06:19:48 +0700 Subject: [PATCH 1/9] add node version check --- pnpm-lock.yaml | 10 +++++----- scripts/build.sh | 9 +++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e55a04510a..d64fef99e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10461,8 +10461,8 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.20.1: - resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} + streamx@2.20.2: + resolution: {integrity: sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -16797,7 +16797,7 @@ snapshots: bare-stream@2.3.2: dependencies: - streamx: 2.20.1 + streamx: 2.20.2 optional: true base-x@3.0.10: @@ -24231,7 +24231,7 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.20.1: + streamx@2.20.2: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -24444,7 +24444,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.20.1 + streamx: 2.20.2 tar@6.2.1: dependencies: diff --git a/scripts/build.sh b/scripts/build.sh index e94f5d1e50..51292d99c2 100644 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -1,5 +1,14 @@ #!/bin/bash +# Check Node.js version +REQUIRED_NODE_VERSION=23 +CURRENT_NODE_VERSION=$(node -v | cut -d'.' -f1 | sed 's/v//') + +if (( CURRENT_NODE_VERSION < REQUIRED_NODE_VERSION )); then + echo "Error: Node.js version must be $REQUIRED_NODE_VERSION or higher. Current version is $CURRENT_NODE_VERSION." + exit 1 +fi + # Navigate to the script's directory cd "$(dirname "$0")"/.. From 9a3f0b969fe446c0e62400a14fcfa85538aee1e6 Mon Sep 17 00:00:00 2001 From: aryan Date: Thu, 14 Nov 2024 06:21:57 +0700 Subject: [PATCH 2/9] change node -v in readme --- README.md | 2 +- README_CN.md | 2 +- docs/README.md | 2 +- docs/README_CN.md | 2 +- package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 046ad41a52..2f61e97b51 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ **Prerequisites (MUST):** - [Python 2.7+](https://www.python.org/downloads/) -- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [Node.js 23.1+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - [pnpm](https://pnpm.io/installation) ### Edit the .env file diff --git a/README_CN.md b/README_CN.md index 9147f78738..6bb9de9c51 100644 --- a/README_CN.md +++ b/README_CN.md @@ -23,7 +23,7 @@ **前置要求(必须):** -- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - Nodejs安装 - [pnpm](https://pnpm.io/installation) - 使用pnpm diff --git a/docs/README.md b/docs/README.md index 435272f5eb..ffdf6295fe 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,7 +19,7 @@ _As seen powering [@DegenSpartanAI](https://x.com/degenspartanai) and [@MarcAInd **Prerequisites (MUST):** -- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - [pnpm](https://pnpm.io/installation) ### Edit the .env file diff --git a/docs/README_CN.md b/docs/README_CN.md index 5a4bfe5c0d..c3a7e624cc 100644 --- a/docs/README_CN.md +++ b/docs/README_CN.md @@ -23,7 +23,7 @@ **前置要求(必须):** -- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - Nodejs安装 - [pnpm](https://pnpm.io/installation) - 使用pnpm diff --git a/package.json b/package.json index 282297c4c2..808745a33b 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ } }, "engines": { - "node": ">=22" + "node": ">=23" }, "dependencies": { "ollama-ai-provider": "^0.16.1", From 681ccfad3f95447eaf81c53bfda88f0a771e5ba9 Mon Sep 17 00:00:00 2001 From: moon Date: Wed, 13 Nov 2024 16:59:36 -0800 Subject: [PATCH 3/9] fix service call patterns but needs testing --- docs/docs/api/_media/README_CN.md | 46 +- docs/docs/api/classes/AgentRuntime.md | 356 ++-- docs/docs/api/classes/DatabaseAdapter.md | 161 +- docs/docs/api/classes/DirectClient.md | 69 - docs/docs/api/classes/DiscordClient.md | 1502 -------------- docs/docs/api/classes/MemoryManager.md | 48 +- .../api/classes/PostgresDatabaseAdapter.md | 1132 ----------- docs/docs/api/classes/Service.md | 49 + .../docs/api/classes/SqliteDatabaseAdapter.md | 1100 ---------- docs/docs/api/classes/TelegramClient.md | 49 - docs/docs/api/classes/TokenProvider.md | 193 -- .../api/classes/TwitterInteractionClient.md | 1798 ----------------- docs/docs/api/classes/TwitterPostClient.md | 1784 ---------------- docs/docs/api/classes/TwitterSearchClient.md | 1784 ---------------- docs/docs/api/classes/WalletProvider.md | 97 - docs/docs/api/enumerations/Clients.md | 14 +- docs/docs/api/enumerations/GoalStatus.md | 14 +- docs/docs/api/enumerations/ImageGenModel.md | 21 - docs/docs/api/enumerations/ModelClass.md | 24 +- docs/docs/api/enumerations/ModelProvider.md | 101 - .../api/enumerations/ModelProviderName.md | 111 + docs/docs/api/enumerations/ServiceType.md | 71 + docs/docs/api/functions/addHeader.md | 2 +- docs/docs/api/functions/buyToken.md | 31 - .../api/functions/composeActionExamples.md | 2 +- docs/docs/api/functions/composeContext.md | 2 +- docs/docs/api/functions/createAgentRuntime.md | 21 - docs/docs/api/functions/createAndBuyToken.md | 35 - .../docs/api/functions/createDirectRuntime.md | 21 - docs/docs/api/functions/createGoal.md | 2 +- docs/docs/api/functions/createRelationship.md | 2 +- docs/docs/api/functions/embed.md | 2 +- docs/docs/api/functions/findNearestEnvFile.md | 22 + docs/docs/api/functions/formatActionNames.md | 2 +- docs/docs/api/functions/formatActions.md | 2 +- docs/docs/api/functions/formatActors.md | 2 +- .../formatEvaluatorExampleDescriptions.md | 2 +- .../api/functions/formatEvaluatorExamples.md | 2 +- .../api/functions/formatEvaluatorNames.md | 2 +- docs/docs/api/functions/formatEvaluators.md | 2 +- .../docs/api/functions/formatGoalsAsString.md | 2 +- docs/docs/api/functions/formatMessages.md | 2 +- docs/docs/api/functions/formatPosts.md | 2 +- .../docs/api/functions/formatRelationships.md | 2 +- docs/docs/api/functions/formatTimestamp.md | 2 +- docs/docs/api/functions/generateCaption.md | 2 +- docs/docs/api/functions/generateImage.md | 2 +- .../api/functions/generateMessageResponse.md | 2 +- docs/docs/api/functions/generateObject.md | 2 +- .../docs/api/functions/generateObjectArray.md | 2 +- .../api/functions/generateShouldRespond.md | 2 +- docs/docs/api/functions/generateText.md | 2 +- docs/docs/api/functions/generateTextArray.md | 2 +- .../docs/api/functions/generateTrueOrFalse.md | 2 +- docs/docs/api/functions/getActorDetails.md | 2 +- docs/docs/api/functions/getEndpoint.md | 8 +- docs/docs/api/functions/getGoals.md | 2 +- docs/docs/api/functions/getImageGenModel.md | 15 - docs/docs/api/functions/getModel.md | 8 +- docs/docs/api/functions/getProviders.md | 2 +- docs/docs/api/functions/getRelationship.md | 2 +- docs/docs/api/functions/getRelationships.md | 2 +- .../docs/api/functions/getTokenForProvider.md | 17 - docs/docs/api/functions/initializeClients.md | 17 - docs/docs/api/functions/initializeDatabase.md | 11 - .../api/functions/isCreateAndBuyContent.md | 17 - docs/docs/api/functions/loadActionConfigs.md | 15 - docs/docs/api/functions/loadCharacters.md | 15 - docs/docs/api/functions/loadCustomActions.md | 15 - docs/docs/api/functions/loadEnvConfig.md | 19 + docs/docs/api/functions/parseArguments.md | 11 - .../api/functions/retrieveCachedEmbedding.md | 2 +- docs/docs/api/functions/sellToken.md | 31 - docs/docs/api/functions/splitChunks.md | 8 +- docs/docs/api/functions/startDiscord.md | 15 - docs/docs/api/functions/startTelegram.md | 17 - docs/docs/api/functions/startTwitter.md | 15 - docs/docs/api/functions/trimTokens.md | 2 +- docs/docs/api/functions/updateGoal.md | 2 +- docs/docs/api/globals.md | 67 +- docs/docs/api/index.md | 46 +- docs/docs/api/interfaces/Account.md | 24 +- docs/docs/api/interfaces/Action.md | 22 +- docs/docs/api/interfaces/ActionExample.md | 6 +- docs/docs/api/interfaces/Actor.md | 14 +- docs/docs/api/interfaces/Content.md | 28 +- .../api/interfaces/ConversationExample.md | 6 +- .../api/interfaces/CreateAndBuyContent.md | 149 -- docs/docs/api/interfaces/EvaluationExample.md | 10 +- docs/docs/api/interfaces/Evaluator.md | 32 +- docs/docs/api/interfaces/Goal.md | 22 +- docs/docs/api/interfaces/IAgentRuntime.md | 252 +-- docs/docs/api/interfaces/IBrowserService.md | 18 +- docs/docs/api/interfaces/IDatabaseAdapter.md | 154 +- .../interfaces/IImageDescriptionService.md | 65 + .../interfaces/IImageRecognitionService.md | 47 - docs/docs/api/interfaces/ILlamaService.md | 89 - docs/docs/api/interfaces/IMemoryManager.md | 50 +- docs/docs/api/interfaces/IPdfService.md | 6 +- docs/docs/api/interfaces/ISpeechService.md | 6 +- .../api/interfaces/ITextGenerationService.md | 107 + .../api/interfaces/ITranscriptionService.md | 18 +- docs/docs/api/interfaces/IVideoService.md | 46 +- docs/docs/api/interfaces/Memory.md | 30 +- docs/docs/api/interfaces/MessageExample.md | 6 +- docs/docs/api/interfaces/Objective.md | 10 +- docs/docs/api/interfaces/Participant.md | 6 +- docs/docs/api/interfaces/Provider.md | 2 +- docs/docs/api/interfaces/Relationship.md | 26 +- docs/docs/api/interfaces/Room.md | 6 +- docs/docs/api/interfaces/State.md | 132 +- docs/docs/api/type-aliases/Character.md | 12 +- docs/docs/api/type-aliases/Client.md | 33 + docs/docs/api/type-aliases/Handler.md | 2 +- docs/docs/api/type-aliases/HandlerCallback.md | 2 +- docs/docs/api/type-aliases/Media.md | 2 +- docs/docs/api/type-aliases/Model.md | 26 +- docs/docs/api/type-aliases/Models.md | 53 + docs/docs/api/type-aliases/Plugin.md | 18 +- docs/docs/api/type-aliases/UUID.md | 2 +- docs/docs/api/type-aliases/Validator.md | 2 +- docs/docs/api/typedoc-sidebar.cjs | 552 +---- docs/docs/api/variables/boredomProvider.md | 7 - docs/docs/api/variables/continueAction.md | 7 - docs/docs/api/variables/defaultActions.md | 7 - docs/docs/api/variables/defaultCharacter.md | 2 +- docs/docs/api/variables/defaultEvaluators.md | 7 - docs/docs/api/variables/defaultProviders.md | 7 - docs/docs/api/variables/elizaLogger.md | 4 +- docs/docs/api/variables/embeddingDimension.md | 2 +- .../docs/api/variables/embeddingZeroVector.md | 2 +- docs/docs/api/variables/evaluationTemplate.md | 2 +- docs/docs/api/variables/executeSwap.md | 7 - docs/docs/api/variables/followRoom.md | 7 - docs/docs/api/variables/ignore.md | 7 - docs/docs/api/variables/imageGenModels.md | 33 - docs/docs/api/variables/imageGeneration.md | 7 - .../api/variables/messageHandlerTemplate.md | 7 - docs/docs/api/variables/muteRoom.md | 7 - docs/docs/api/variables/none.md | 7 - docs/docs/api/variables/orderBookProvider.md | 7 - docs/docs/api/variables/settings.md | 7 + .../api/variables/shouldContinueTemplate.md | 7 - .../api/variables/shouldFollowTemplate.md | 7 - docs/docs/api/variables/shouldMuteTemplate.md | 7 - .../api/variables/shouldUnmuteTemplate.md | 7 - docs/docs/api/variables/timeProvider.md | 7 - docs/docs/api/variables/tokenProvider.md | 7 - docs/docs/api/variables/unfollowRoom.md | 7 - docs/docs/api/variables/unmuteRoom.md | 7 - docs/docs/api/variables/walletProvider.md | 7 - packages/agent/src/index.ts | 1 - packages/client-direct/src/index.ts | 1 - .../src/actions/download_media.ts | 7 +- packages/client-discord/src/attachments.ts | 22 +- packages/client-discord/src/messages.ts | 33 +- packages/client-discord/src/voice.ts | 11 +- packages/client-twitter/src/base.ts | 8 +- packages/client-twitter/src/post.ts | 4 +- packages/client-twitter/src/search.ts | 5 +- packages/core/src/embedding.ts | 2 - packages/core/src/generation.ts | 10 +- packages/core/src/memory.ts | 2 - packages/core/src/runtime.ts | 7 +- packages/core/src/types.ts | 2 +- .../plugin-bootstrap/src/providers/facts.ts | 3 - packages/plugin-node/src/services/video.ts | 3 +- 167 files changed, 1535 insertions(+), 11976 deletions(-) delete mode 100644 docs/docs/api/classes/DirectClient.md delete mode 100644 docs/docs/api/classes/DiscordClient.md delete mode 100644 docs/docs/api/classes/PostgresDatabaseAdapter.md create mode 100644 docs/docs/api/classes/Service.md delete mode 100644 docs/docs/api/classes/SqliteDatabaseAdapter.md delete mode 100644 docs/docs/api/classes/TelegramClient.md delete mode 100644 docs/docs/api/classes/TokenProvider.md delete mode 100644 docs/docs/api/classes/TwitterInteractionClient.md delete mode 100644 docs/docs/api/classes/TwitterPostClient.md delete mode 100644 docs/docs/api/classes/TwitterSearchClient.md delete mode 100644 docs/docs/api/classes/WalletProvider.md delete mode 100644 docs/docs/api/enumerations/ImageGenModel.md delete mode 100644 docs/docs/api/enumerations/ModelProvider.md create mode 100644 docs/docs/api/enumerations/ModelProviderName.md create mode 100644 docs/docs/api/enumerations/ServiceType.md delete mode 100644 docs/docs/api/functions/buyToken.md delete mode 100644 docs/docs/api/functions/createAgentRuntime.md delete mode 100644 docs/docs/api/functions/createAndBuyToken.md delete mode 100644 docs/docs/api/functions/createDirectRuntime.md create mode 100644 docs/docs/api/functions/findNearestEnvFile.md delete mode 100644 docs/docs/api/functions/getImageGenModel.md delete mode 100644 docs/docs/api/functions/getTokenForProvider.md delete mode 100644 docs/docs/api/functions/initializeClients.md delete mode 100644 docs/docs/api/functions/initializeDatabase.md delete mode 100644 docs/docs/api/functions/isCreateAndBuyContent.md delete mode 100644 docs/docs/api/functions/loadActionConfigs.md delete mode 100644 docs/docs/api/functions/loadCharacters.md delete mode 100644 docs/docs/api/functions/loadCustomActions.md create mode 100644 docs/docs/api/functions/loadEnvConfig.md delete mode 100644 docs/docs/api/functions/parseArguments.md delete mode 100644 docs/docs/api/functions/sellToken.md delete mode 100644 docs/docs/api/functions/startDiscord.md delete mode 100644 docs/docs/api/functions/startTelegram.md delete mode 100644 docs/docs/api/functions/startTwitter.md delete mode 100644 docs/docs/api/interfaces/CreateAndBuyContent.md create mode 100644 docs/docs/api/interfaces/IImageDescriptionService.md delete mode 100644 docs/docs/api/interfaces/IImageRecognitionService.md delete mode 100644 docs/docs/api/interfaces/ILlamaService.md create mode 100644 docs/docs/api/interfaces/ITextGenerationService.md create mode 100644 docs/docs/api/type-aliases/Client.md create mode 100644 docs/docs/api/type-aliases/Models.md delete mode 100644 docs/docs/api/variables/boredomProvider.md delete mode 100644 docs/docs/api/variables/continueAction.md delete mode 100644 docs/docs/api/variables/defaultActions.md delete mode 100644 docs/docs/api/variables/defaultEvaluators.md delete mode 100644 docs/docs/api/variables/defaultProviders.md delete mode 100644 docs/docs/api/variables/executeSwap.md delete mode 100644 docs/docs/api/variables/followRoom.md delete mode 100644 docs/docs/api/variables/ignore.md delete mode 100644 docs/docs/api/variables/imageGenModels.md delete mode 100644 docs/docs/api/variables/imageGeneration.md delete mode 100644 docs/docs/api/variables/messageHandlerTemplate.md delete mode 100644 docs/docs/api/variables/muteRoom.md delete mode 100644 docs/docs/api/variables/none.md delete mode 100644 docs/docs/api/variables/orderBookProvider.md create mode 100644 docs/docs/api/variables/settings.md delete mode 100644 docs/docs/api/variables/shouldContinueTemplate.md delete mode 100644 docs/docs/api/variables/shouldFollowTemplate.md delete mode 100644 docs/docs/api/variables/shouldMuteTemplate.md delete mode 100644 docs/docs/api/variables/shouldUnmuteTemplate.md delete mode 100644 docs/docs/api/variables/timeProvider.md delete mode 100644 docs/docs/api/variables/tokenProvider.md delete mode 100644 docs/docs/api/variables/unfollowRoom.md delete mode 100644 docs/docs/api/variables/unmuteRoom.md delete mode 100644 docs/docs/api/variables/walletProvider.md diff --git a/docs/docs/api/_media/README_CN.md b/docs/docs/api/_media/README_CN.md index 5a4bfe5c0d..9147f78738 100644 --- a/docs/docs/api/_media/README_CN.md +++ b/docs/docs/api/_media/README_CN.md @@ -4,39 +4,39 @@ ## 功能 -- 🛠 支持discord/推特/telegram连接 -- 👥 支持多模态agent -- 📚 简单的导入文档并与文档交互 -- 💾 可检索的内存和文档存储 -- 🚀 高可拓展性,你可以自定义客户端和行为来进行功能拓展 -- ☁️ 多模型支持,包括Llama、OpenAI、Grok、Anthropic等 -- 📦 简单好用 +- 🛠 支持discord/推特/telegram连接 +- 👥 支持多模态agent +- 📚 简单的导入文档并与文档交互 +- 💾 可检索的内存和文档存储 +- 🚀 高可拓展性,你可以自定义客户端和行为来进行功能拓展 +- ☁️ 多模型支持,包括Llama、OpenAI、Grok、Anthropic等 +- 📦 简单好用 你可以用Eliza做什么? -- 🤖 聊天机器人 -- 🕵️ 自主Agents -- 📈 业务流程自动化处理 -- 🎮 游戏NPC +- 🤖 聊天机器人 +- 🕵️ 自主Agents +- 📈 业务流程自动化处理 +- 🎮 游戏NPC # 开始使用 **前置要求(必须):** -- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) -- Nodejs安装 -- [pnpm](https://pnpm.io/installation) -- 使用pnpm +- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- Nodejs安装 +- [pnpm](https://pnpm.io/installation) +- 使用pnpm ### 编辑.env文件 -- - 将 .env.example 复制为 .env 并填写适当的值 -- 编辑推特环境并输入你的推特账号和密码 +- - 将 .env.example 复制为 .env 并填写适当的值 +- 编辑推特环境并输入你的推特账号和密码 ### 编辑角色文件 -- 查看文件 `src/core/defaultCharacter.ts` - 您可以修改它 -- 您也可以使用 `node --loader ts-node/esm src/index.ts --characters="path/to/your/character.json"` 加载角色并同时运行多个机器人。 +- 查看文件 `src/core/defaultCharacter.ts` - 您可以修改它 +- 您也可以使用 `node --loader ts-node/esm src/index.ts --characters="path/to/your/character.json"` 加载角色并同时运行多个机器人。 在完成账号和角色文件的配置后,输入以下命令行启动你的bot: @@ -163,9 +163,9 @@ pnpm test:sqljs # Run tests with SQL.js 测试使用 Jest 编写,位于 src/\*_/_.test.ts 文件中。测试环境配置如下: -- 从 .env.test 加载环境变量 -- 使用 2 分钟的超时时间来运行长时间运行的测试 -- 支持 ESM 模块 -- 按顺序运行测试 (--runInBand) +- 从 .env.test 加载环境变量 +- 使用 2 分钟的超时时间来运行长时间运行的测试 +- 支持 ESM 模块 +- 按顺序运行测试 (--runInBand) 要创建新测试,请在要测试的代码旁边添加一个 .test.ts 文件。 diff --git a/docs/docs/api/classes/AgentRuntime.md b/docs/docs/api/classes/AgentRuntime.md index 5a7cb26cbf..a86436f3c1 100644 --- a/docs/docs/api/classes/AgentRuntime.md +++ b/docs/docs/api/classes/AgentRuntime.md @@ -47,9 +47,11 @@ Optional custom evaluators. Custom fetch function to use for making requests. -• **opts.imageGenModel?**: [`ImageGenModel`](../enumerations/ImageGenModel.md) +• **opts.managers?**: [`IMemoryManager`](../interfaces/IMemoryManager.md)[] -• **opts.modelProvider**: [`ModelProvider`](../enumerations/ModelProvider.md) +• **opts.modelProvider**: [`ModelProviderName`](../enumerations/ModelProviderName.md) + +• **opts.plugins?**: [`Plugin`](../type-aliases/Plugin.md)[] • **opts.providers?**: [`Provider`](../interfaces/Provider.md)[] @@ -59,6 +61,10 @@ Optional context providers. The URL of the worker. +• **opts.services?**: [`Service`](Service.md)[] + +Optional custom services. + • **opts.speechModelPath?**: `string` • **opts.token**: `string` @@ -71,7 +77,7 @@ The JWT token, can be a JWT token if outside worker, or an OpenAI token if insid #### Defined in -[core/src/core/runtime.ts:188](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L188) +[packages/core/src/runtime.ts:192](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L192) ## Properties @@ -87,9 +93,9 @@ Custom actions that the agent can perform. #### Defined in -[core/src/core/runtime.ts:91](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L91) +[packages/core/src/runtime.ts:78](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L78) ---- +*** ### agentId @@ -103,23 +109,9 @@ The ID of the agent #### Defined in -[core/src/core/runtime.ts:72](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L72) - ---- - -### browserService - -> **browserService**: [`IBrowserService`](../interfaces/IBrowserService.md) - -#### Implementation of - -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`browserService`](../interfaces/IAgentRuntime.md#browserservice) - -#### Defined in - -[core/src/core/runtime.ts:125](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L125) +[packages/core/src/runtime.ts:59](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L59) ---- +*** ### character @@ -133,9 +125,9 @@ The character to use for the agent #### Defined in -[core/src/core/runtime.ts:140](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L140) +[packages/core/src/runtime.ts:104](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L104) ---- +*** ### databaseAdapter @@ -149,9 +141,9 @@ The database adapter used for interacting with the database. #### Defined in -[core/src/core/runtime.ts:81](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L81) +[packages/core/src/runtime.ts:68](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L68) ---- +*** ### descriptionManager @@ -165,9 +157,9 @@ Store and recall descriptions of users based on conversations. #### Defined in -[core/src/core/runtime.ts:150](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L150) +[packages/core/src/runtime.ts:114](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L114) ---- +*** ### documentsManager @@ -177,9 +169,9 @@ Hold large documents that can be referenced #### Defined in -[core/src/core/runtime.ts:165](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L165) +[packages/core/src/runtime.ts:124](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L124) ---- +*** ### evaluators @@ -187,27 +179,15 @@ Hold large documents that can be referenced Evaluators used to assess and guide the agent's responses. -#### Defined in - -[core/src/core/runtime.ts:96](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L96) - ---- - -### factManager - -> **factManager**: [`IMemoryManager`](../interfaces/IMemoryManager.md) - -Manage the fact and recall of facts. - #### Implementation of -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`factManager`](../interfaces/IAgentRuntime.md#factmanager) +[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`evaluators`](../interfaces/IAgentRuntime.md#evaluators) #### Defined in -[core/src/core/runtime.ts:155](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L155) +[packages/core/src/runtime.ts:83](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L83) ---- +*** ### fetch() @@ -240,83 +220,47 @@ Some environments may not have access to the global fetch function and need a cu #### Defined in -[core/src/core/runtime.ts:135](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L135) +[packages/core/src/runtime.ts:99](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L99) ---- +*** -### fragmentsManager +### knowledgeManager -> **fragmentsManager**: [`IMemoryManager`](../interfaces/IMemoryManager.md) +> **knowledgeManager**: [`IMemoryManager`](../interfaces/IMemoryManager.md) Searchable document fragments #### Defined in -[core/src/core/runtime.ts:170](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L170) - ---- - -### imageDescriptionService - -> **imageDescriptionService**: [`IImageRecognitionService`](../interfaces/IImageRecognitionService.md) - -#### Implementation of - -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`imageDescriptionService`](../interfaces/IAgentRuntime.md#imagedescriptionservice) - -#### Defined in - -[core/src/core/runtime.ts:123](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L123) - ---- - -### imageGenModel - -> **imageGenModel**: [`ImageGenModel`](../enumerations/ImageGenModel.md) = `ImageGenModel.TogetherAI` - -The model to use for image generation. +[packages/core/src/runtime.ts:129](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L129) -#### Implementation of - -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`imageGenModel`](../interfaces/IAgentRuntime.md#imagegenmodel) - -#### Defined in +*** -[core/src/core/runtime.ts:111](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L111) - ---- - -### llamaService +### loreManager -> **llamaService**: `LlamaService` = `null` +> **loreManager**: [`IMemoryManager`](../interfaces/IMemoryManager.md) -Local Llama if no OpenAI key is present +Manage the creation and recall of static information (documents, historical game lore, etc) #### Implementation of -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`llamaService`](../interfaces/IAgentRuntime.md#llamaservice) +[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`loreManager`](../interfaces/IAgentRuntime.md#loremanager) #### Defined in -[core/src/core/runtime.ts:116](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L116) - ---- - -### loreManager - -> **loreManager**: [`IMemoryManager`](../interfaces/IMemoryManager.md) +[packages/core/src/runtime.ts:119](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L119) -Manage the creation and recall of static information (documents, historical game lore, etc) +*** -#### Implementation of +### memoryManagers -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`loreManager`](../interfaces/IAgentRuntime.md#loremanager) +> **memoryManagers**: `Map`\<`string`, [`IMemoryManager`](../interfaces/IMemoryManager.md)\> #### Defined in -[core/src/core/runtime.ts:160](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L160) +[packages/core/src/runtime.ts:132](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L132) ---- +*** ### messageManager @@ -330,13 +274,13 @@ Store messages that are sent and received by the agent. #### Defined in -[core/src/core/runtime.ts:145](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L145) +[packages/core/src/runtime.ts:109](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L109) ---- +*** ### modelProvider -> **modelProvider**: [`ModelProvider`](../enumerations/ModelProvider.md) = `ModelProvider.LLAMALOCAL` +> **modelProvider**: [`ModelProviderName`](../enumerations/ModelProviderName.md) The model to use for generateText. @@ -346,23 +290,9 @@ The model to use for generateText. #### Defined in -[core/src/core/runtime.ts:106](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L106) +[packages/core/src/runtime.ts:93](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L93) ---- - -### pdfService - -> **pdfService**: [`IPdfService`](../interfaces/IPdfService.md) - -#### Implementation of - -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`pdfService`](../interfaces/IAgentRuntime.md#pdfservice) - -#### Defined in - -[core/src/core/runtime.ts:129](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L129) - ---- +*** ### providers @@ -376,9 +306,9 @@ Context providers used to provide context for message generation. #### Defined in -[core/src/core/runtime.ts:101](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L101) +[packages/core/src/runtime.ts:88](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L88) ---- +*** ### serverUrl @@ -392,23 +322,23 @@ The base URL of the server where the agent's requests are processed. #### Defined in -[core/src/core/runtime.ts:76](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L76) +[packages/core/src/runtime.ts:63](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L63) ---- +*** -### speechService +### services -> **speechService**: [`ISpeechService`](../interfaces/ISpeechService.md) +> **services**: `Map`\<[`ServiceType`](../enumerations/ServiceType.md), [`Service`](Service.md)\> #### Implementation of -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`speechService`](../interfaces/IAgentRuntime.md#speechservice) +[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`services`](../interfaces/IAgentRuntime.md#services) #### Defined in -[core/src/core/runtime.ts:119](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L119) +[packages/core/src/runtime.ts:131](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L131) ---- +*** ### token @@ -422,35 +352,7 @@ Authentication token used for securing requests. #### Defined in -[core/src/core/runtime.ts:86](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L86) - ---- - -### transcriptionService - -> **transcriptionService**: [`ITranscriptionService`](../interfaces/ITranscriptionService.md) - -#### Implementation of - -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`transcriptionService`](../interfaces/IAgentRuntime.md#transcriptionservice) - -#### Defined in - -[core/src/core/runtime.ts:121](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L121) - ---- - -### videoService - -> **videoService**: [`IVideoService`](../interfaces/IVideoService.md) - -#### Implementation of - -[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`videoService`](../interfaces/IAgentRuntime.md#videoservice) - -#### Defined in - -[core/src/core/runtime.ts:127](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L127) +[packages/core/src/runtime.ts:73](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L73) ## Methods @@ -480,9 +382,9 @@ The state of the agent. #### Defined in -[core/src/core/runtime.ts:673](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L673) +[packages/core/src/runtime.ts:667](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L667) ---- +*** ### ensureConnection() @@ -510,9 +412,9 @@ The state of the agent. #### Defined in -[core/src/core/runtime.ts:624](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L624) +[packages/core/src/runtime.ts:618](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L618) ---- +*** ### ensureParticipantExists() @@ -542,9 +444,9 @@ An error if the participant cannot be added. #### Defined in -[core/src/core/runtime.ts:577](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L577) +[packages/core/src/runtime.ts:571](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L571) ---- +*** ### ensureParticipantInRoom() @@ -566,9 +468,9 @@ An error if the participant cannot be added. #### Defined in -[core/src/core/runtime.ts:613](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L613) +[packages/core/src/runtime.ts:607](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L607) ---- +*** ### ensureRoomExists() @@ -597,9 +499,9 @@ An error if the room cannot be created. #### Defined in -[core/src/core/runtime.ts:660](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L660) +[packages/core/src/runtime.ts:654](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L654) ---- +*** ### ensureUserExists() @@ -633,13 +535,13 @@ The user name to ensure the existence of. #### Defined in -[core/src/core/runtime.ts:593](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L593) +[packages/core/src/runtime.ts:587](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L587) ---- +*** ### evaluate() -> **evaluate**(`message`, `state`?): `Promise`\<`string`[]\> +> **evaluate**(`message`, `state`?, `didRespond`?): `Promise`\<`string`[]\> Evaluate the message and state using the registered evaluators. @@ -653,6 +555,10 @@ The message to evaluate. The state of the agent. +• **didRespond?**: `boolean` + +Whether the agent responded to the message. + #### Returns `Promise`\<`string`[]\> @@ -665,9 +571,9 @@ The results of the evaluation. #### Defined in -[core/src/core/runtime.ts:511](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L511) +[packages/core/src/runtime.ts:501](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L501) ---- +*** ### getConversationLength() @@ -687,9 +593,53 @@ The number of recent messages to be kept in memory. #### Defined in -[core/src/core/runtime.ts:410](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L410) +[packages/core/src/runtime.ts:394](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L394) + +*** + +### getMemoryManager() + +> **getMemoryManager**(`tableName`): [`IMemoryManager`](../interfaces/IMemoryManager.md) + +#### Parameters + +• **tableName**: `string` + +#### Returns + +[`IMemoryManager`](../interfaces/IMemoryManager.md) + +#### Implementation of + +[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`getMemoryManager`](../interfaces/IAgentRuntime.md#getmemorymanager) + +#### Defined in + +[packages/core/src/runtime.ts:149](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L149) + +*** + +### getService() + +> **getService**(`service`): *typeof* [`Service`](Service.md) + +#### Parameters + +• **service**: [`ServiceType`](../enumerations/ServiceType.md) + +#### Returns + +*typeof* [`Service`](Service.md) + +#### Implementation of + +[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`getService`](../interfaces/IAgentRuntime.md#getservice) + +#### Defined in + +[packages/core/src/runtime.ts:153](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L153) ---- +*** ### getSetting() @@ -709,9 +659,9 @@ The number of recent messages to be kept in memory. #### Defined in -[core/src/core/runtime.ts:388](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L388) +[packages/core/src/runtime.ts:372](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L372) ---- +*** ### processActions() @@ -741,9 +691,9 @@ The message to process. #### Defined in -[core/src/core/runtime.ts:444](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L444) +[packages/core/src/runtime.ts:428](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L428) ---- +*** ### registerAction() @@ -767,9 +717,9 @@ The action to register. #### Defined in -[core/src/core/runtime.ts:418](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L418) +[packages/core/src/runtime.ts:402](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L402) ---- +*** ### registerContextProvider() @@ -789,9 +739,9 @@ The context provider to register. #### Defined in -[core/src/core/runtime.ts:435](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L435) +[packages/core/src/runtime.ts:419](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L419) ---- +*** ### registerEvaluator() @@ -811,9 +761,53 @@ The evaluator to register. #### Defined in -[core/src/core/runtime.ts:427](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L427) +[packages/core/src/runtime.ts:411](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L411) + +*** + +### registerMemoryManager() + +> **registerMemoryManager**(`manager`): `void` + +#### Parameters + +• **manager**: [`IMemoryManager`](../interfaces/IMemoryManager.md) + +#### Returns + +`void` + +#### Implementation of + +[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`registerMemoryManager`](../interfaces/IAgentRuntime.md#registermemorymanager) + +#### Defined in + +[packages/core/src/runtime.ts:134](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L134) + +*** + +### registerService() + +> **registerService**(`service`): `void` + +#### Parameters + +• **service**: [`Service`](Service.md) + +#### Returns + +`void` + +#### Implementation of + +[`IAgentRuntime`](../interfaces/IAgentRuntime.md).[`registerService`](../interfaces/IAgentRuntime.md#registerservice) + +#### Defined in + +[packages/core/src/runtime.ts:161](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L161) ---- +*** ### updateRecentMessageState() @@ -833,4 +827,4 @@ The evaluator to register. #### Defined in -[core/src/core/runtime.ts:1146](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/runtime.ts#L1146) +[packages/core/src/runtime.ts:1124](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/runtime.ts#L1124) diff --git a/docs/docs/api/classes/DatabaseAdapter.md b/docs/docs/api/classes/DatabaseAdapter.md index a25bd0a132..3eeb547466 100644 --- a/docs/docs/api/classes/DatabaseAdapter.md +++ b/docs/docs/api/classes/DatabaseAdapter.md @@ -3,11 +3,6 @@ An abstract class representing a database adapter for managing various entities like accounts, memories, actors, goals, and rooms. -## Extended by - -- [`PostgresDatabaseAdapter`](PostgresDatabaseAdapter.md) -- [`SqliteDatabaseAdapter`](SqliteDatabaseAdapter.md) - ## Implements - [`IDatabaseAdapter`](../interfaces/IDatabaseAdapter.md) @@ -36,7 +31,7 @@ The database instance. #### Defined in -[core/src/core/database.ts:21](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L21) +[packages/core/src/database.ts:21](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L21) ## Methods @@ -68,9 +63,9 @@ A Promise that resolves to a boolean indicating success or failure. #### Defined in -[core/src/core/database.ts:266](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L266) +[packages/core/src/database.ts:266](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L266) ---- +*** ### countMemories() @@ -104,9 +99,9 @@ A Promise that resolves to the number of memories. #### Defined in -[core/src/core/database.ts:179](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L179) +[packages/core/src/database.ts:179](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L179) ---- +*** ### createAccount() @@ -132,9 +127,9 @@ A Promise that resolves when the account creation is complete. #### Defined in -[core/src/core/database.ts:34](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L34) +[packages/core/src/database.ts:34](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L34) ---- +*** ### createGoal() @@ -160,9 +155,9 @@ A Promise that resolves when the goal has been created. #### Defined in -[core/src/core/database.ts:209](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L209) +[packages/core/src/database.ts:209](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L209) ---- +*** ### createMemory() @@ -196,9 +191,9 @@ A Promise that resolves when the memory has been created. #### Defined in -[core/src/core/database.ts:150](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L150) +[packages/core/src/database.ts:150](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L150) ---- +*** ### createRelationship() @@ -228,9 +223,9 @@ A Promise that resolves to a boolean indicating success or failure of the creati #### Defined in -[core/src/core/database.ts:312](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L312) +[packages/core/src/database.ts:312](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L312) ---- +*** ### createRoom() @@ -256,9 +251,9 @@ A Promise that resolves to the UUID of the created room. #### Defined in -[core/src/core/database.ts:237](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L237) +[packages/core/src/database.ts:237](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L237) ---- +*** ### getAccountById() @@ -284,9 +279,9 @@ A Promise that resolves to the Account object or null if not found. #### Defined in -[core/src/core/database.ts:27](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L27) +[packages/core/src/database.ts:27](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L27) ---- +*** ### getActorDetails() @@ -314,9 +309,9 @@ A Promise that resolves to an array of Actor objects. #### Defined in -[core/src/core/database.ts:99](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L99) +[packages/core/src/database.ts:99](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L99) ---- +*** ### getCachedEmbeddings() @@ -330,17 +325,17 @@ Retrieves cached embeddings based on the specified query parameters. An object containing parameters for the embedding retrieval. -• **params.query_field_name**: `string` +• **params.query\_field\_name**: `string` -• **params.query_field_sub_name**: `string` +• **params.query\_field\_sub\_name**: `string` -• **params.query_input**: `string` +• **params.query\_input**: `string` -• **params.query_match_count**: `number` +• **params.query\_match\_count**: `number` -• **params.query_table_name**: `string` +• **params.query\_table\_name**: `string` -• **params.query_threshold**: `number` +• **params.query\_threshold**: `number` #### Returns @@ -354,9 +349,9 @@ A Promise that resolves to an array of objects containing embeddings and levensh #### Defined in -[core/src/core/database.ts:61](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L61) +[packages/core/src/database.ts:61](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L61) ---- +*** ### getGoals() @@ -390,9 +385,9 @@ A Promise that resolves to an array of Goal objects. #### Defined in -[core/src/core/database.ts:190](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L190) +[packages/core/src/database.ts:190](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L190) ---- +*** ### getMemories() @@ -426,9 +421,9 @@ A Promise that resolves to an array of Memory objects. #### Defined in -[core/src/core/database.ts:41](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L41) +[packages/core/src/database.ts:41](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L41) ---- +*** ### getMemoriesByRoomIds() @@ -454,9 +449,9 @@ A Promise that resolves to an array of Memory objects. #### Defined in -[core/src/core/database.ts:48](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L48) +[packages/core/src/database.ts:48](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L48) ---- +*** ### getMemoryById() @@ -476,9 +471,9 @@ A Promise that resolves to an array of Memory objects. #### Defined in -[core/src/core/database.ts:54](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L54) +[packages/core/src/database.ts:54](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L54) ---- +*** ### getParticipantsForAccount() @@ -506,7 +501,7 @@ A Promise that resolves to an array of Participant objects. ##### Defined in -[core/src/core/database.ts:281](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L281) +[packages/core/src/database.ts:281](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L281) #### getParticipantsForAccount(userId) @@ -532,9 +527,9 @@ A Promise that resolves to an array of Participant objects. ##### Defined in -[core/src/core/database.ts:288](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L288) +[packages/core/src/database.ts:288](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L288) ---- +*** ### getParticipantsForRoom() @@ -560,9 +555,9 @@ A Promise that resolves to an array of UUIDs representing the participants. #### Defined in -[core/src/core/database.ts:295](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L295) +[packages/core/src/database.ts:295](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L295) ---- +*** ### getParticipantUserState() @@ -584,9 +579,9 @@ A Promise that resolves to an array of UUIDs representing the participants. #### Defined in -[core/src/core/database.ts:297](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L297) +[packages/core/src/database.ts:297](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L297) ---- +*** ### getRelationship() @@ -616,9 +611,9 @@ A Promise that resolves to the Relationship object or null if not found. #### Defined in -[core/src/core/database.ts:322](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L322) +[packages/core/src/database.ts:322](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L322) ---- +*** ### getRelationships() @@ -646,9 +641,9 @@ A Promise that resolves to an array of Relationship objects. #### Defined in -[core/src/core/database.ts:332](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L332) +[packages/core/src/database.ts:332](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L332) ---- +*** ### getRoom() @@ -674,9 +669,9 @@ A Promise that resolves to the room ID or null if not found. #### Defined in -[core/src/core/database.ts:230](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L230) +[packages/core/src/database.ts:230](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L230) ---- +*** ### getRoomsForParticipant() @@ -702,9 +697,9 @@ A Promise that resolves to an array of room IDs. #### Defined in -[core/src/core/database.ts:251](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L251) +[packages/core/src/database.ts:251](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L251) ---- +*** ### getRoomsForParticipants() @@ -730,9 +725,9 @@ A Promise that resolves to an array of room IDs. #### Defined in -[core/src/core/database.ts:258](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L258) +[packages/core/src/database.ts:258](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L258) ---- +*** ### log() @@ -766,9 +761,9 @@ A Promise that resolves when the log entry has been saved. #### Defined in -[core/src/core/database.ts:87](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L87) +[packages/core/src/database.ts:87](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L87) ---- +*** ### removeAllGoals() @@ -794,9 +789,9 @@ A Promise that resolves when all goals have been removed. #### Defined in -[core/src/core/database.ts:223](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L223) +[packages/core/src/database.ts:223](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L223) ---- +*** ### removeAllMemories() @@ -826,9 +821,9 @@ A Promise that resolves when all memories have been removed. #### Defined in -[core/src/core/database.ts:170](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L170) +[packages/core/src/database.ts:170](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L170) ---- +*** ### removeGoal() @@ -854,9 +849,9 @@ A Promise that resolves when the goal has been removed. #### Defined in -[core/src/core/database.ts:216](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L216) +[packages/core/src/database.ts:216](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L216) ---- +*** ### removeMemory() @@ -886,9 +881,9 @@ A Promise that resolves when the memory has been removed. #### Defined in -[core/src/core/database.ts:162](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L162) +[packages/core/src/database.ts:162](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L162) ---- +*** ### removeParticipant() @@ -918,9 +913,9 @@ A Promise that resolves to a boolean indicating success or failure. #### Defined in -[core/src/core/database.ts:274](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L274) +[packages/core/src/database.ts:274](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L274) ---- +*** ### removeRoom() @@ -946,9 +941,9 @@ A Promise that resolves when the room has been removed. #### Defined in -[core/src/core/database.ts:244](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L244) +[packages/core/src/database.ts:244](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L244) ---- +*** ### searchMemories() @@ -964,9 +959,9 @@ An object containing parameters for the memory search. • **params.embedding**: `number`[] -• **params.match_count**: `number` +• **params.match\_count**: `number` -• **params.match_threshold**: `number` +• **params.match\_threshold**: `number` • **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` @@ -986,9 +981,9 @@ A Promise that resolves to an array of Memory objects. #### Defined in -[core/src/core/database.ts:106](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L106) +[packages/core/src/database.ts:106](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L106) ---- +*** ### searchMemoriesByEmbedding() @@ -1010,7 +1005,7 @@ Additional parameters for the search. • **params.count?**: `number` -• **params.match_threshold?**: `number` +• **params.match\_threshold?**: `number` • **params.roomId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` @@ -1030,9 +1025,9 @@ A Promise that resolves to an array of Memory objects. #### Defined in -[core/src/core/database.ts:131](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L131) +[packages/core/src/database.ts:131](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L131) ---- +*** ### setParticipantUserState() @@ -1056,9 +1051,9 @@ A Promise that resolves to an array of Memory objects. #### Defined in -[core/src/core/database.ts:301](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L301) +[packages/core/src/database.ts:301](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L301) ---- +*** ### updateGoal() @@ -1084,9 +1079,9 @@ A Promise that resolves when the goal has been updated. #### Defined in -[core/src/core/database.ts:202](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L202) +[packages/core/src/database.ts:202](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L202) ---- +*** ### updateGoalStatus() @@ -1116,4 +1111,4 @@ A Promise that resolves when the goal status has been updated. #### Defined in -[core/src/core/database.ts:120](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L120) +[packages/core/src/database.ts:120](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/database.ts#L120) diff --git a/docs/docs/api/classes/DirectClient.md b/docs/docs/api/classes/DirectClient.md deleted file mode 100644 index 5b0662da0c..0000000000 --- a/docs/docs/api/classes/DirectClient.md +++ /dev/null @@ -1,69 +0,0 @@ -# Class: DirectClient - -## Constructors - -### new DirectClient() - -> **new DirectClient**(): [`DirectClient`](DirectClient.md) - -#### Returns - -[`DirectClient`](DirectClient.md) - -#### Defined in - -[core/src/clients/direct/index.ts:57](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/direct/index.ts#L57) - -## Methods - -### registerAgent() - -> **registerAgent**(`runtime`): `void` - -#### Parameters - -• **runtime**: [`AgentRuntime`](AgentRuntime.md) - -#### Returns - -`void` - -#### Defined in - -[core/src/clients/direct/index.ts:263](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/direct/index.ts#L263) - ---- - -### start() - -> **start**(`port`): `void` - -#### Parameters - -• **port**: `number` - -#### Returns - -`void` - -#### Defined in - -[core/src/clients/direct/index.ts:271](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/direct/index.ts#L271) - ---- - -### unregisterAgent() - -> **unregisterAgent**(`runtime`): `void` - -#### Parameters - -• **runtime**: [`AgentRuntime`](AgentRuntime.md) - -#### Returns - -`void` - -#### Defined in - -[core/src/clients/direct/index.ts:267](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/direct/index.ts#L267) diff --git a/docs/docs/api/classes/DiscordClient.md b/docs/docs/api/classes/DiscordClient.md deleted file mode 100644 index 66dd101ca5..0000000000 --- a/docs/docs/api/classes/DiscordClient.md +++ /dev/null @@ -1,1502 +0,0 @@ -# Class: DiscordClient - -## Extends - -- `EventEmitter` - -## Constructors - -### new DiscordClient() - -> **new DiscordClient**(`runtime`): [`DiscordClient`](DiscordClient.md) - -#### Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -#### Returns - -[`DiscordClient`](DiscordClient.md) - -#### Overrides - -`EventEmitter.constructor` - -#### Defined in - -[core/src/clients/discord/index.ts:34](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/discord/index.ts#L34) - -## Properties - -### apiToken - -> **apiToken**: `string` - -#### Defined in - -[core/src/clients/discord/index.ts:27](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/discord/index.ts#L27) - ---- - -### character - -> **character**: [`Character`](../type-aliases/Character.md) - -#### Defined in - -[core/src/clients/discord/index.ts:30](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/discord/index.ts#L30) - ---- - -### captureRejections - -> `static` **captureRejections**: `boolean` - -Value: [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) - -Change the default `captureRejections` option on all new `EventEmitter` objects. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`EventEmitter.captureRejections` - -#### Defined in - -node_modules/@types/node/events.d.ts:459 - ---- - -### captureRejectionSymbol - -> `readonly` `static` **captureRejectionSymbol**: _typeof_ [`captureRejectionSymbol`](TwitterPostClient.md#capturerejectionsymbol) - -Value: `Symbol.for('nodejs.rejection')` - -See how to write a custom `rejection handler`. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`EventEmitter.captureRejectionSymbol` - -#### Defined in - -node_modules/@types/node/events.d.ts:452 - ---- - -### defaultMaxListeners - -> `static` **defaultMaxListeners**: `number` - -By default, a maximum of `10` listeners can be registered for any single -event. This limit can be changed for individual `EventEmitter` instances -using the `emitter.setMaxListeners(n)` method. To change the default -for _all_`EventEmitter` instances, the `events.defaultMaxListeners` property -can be used. If this value is not a positive number, a `RangeError` is thrown. - -Take caution when setting the `events.defaultMaxListeners` because the -change affects _all_ `EventEmitter` instances, including those created before -the change is made. However, calling `emitter.setMaxListeners(n)` still has -precedence over `events.defaultMaxListeners`. - -This is not a hard limit. The `EventEmitter` instance will allow -more listeners to be added but will output a trace warning to stderr indicating -that a "possible EventEmitter memory leak" has been detected. For any single -`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()` methods can be used to -temporarily avoid this warning: - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.setMaxListeners(emitter.getMaxListeners() + 1); -emitter.once("event", () => { - // do stuff - emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); -}); -``` - -The `--trace-warnings` command-line flag can be used to display the -stack trace for such warnings. - -The emitted warning can be inspected with `process.on('warning')` and will -have the additional `emitter`, `type`, and `count` properties, referring to -the event emitter instance, the event's name and the number of attached -listeners, respectively. -Its `name` property is set to `'MaxListenersExceededWarning'`. - -#### Since - -v0.11.2 - -#### Inherited from - -`EventEmitter.defaultMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:498 - ---- - -### errorMonitor - -> `readonly` `static` **errorMonitor**: _typeof_ [`errorMonitor`](TwitterPostClient.md#errormonitor) - -This symbol shall be used to install a listener for only monitoring `'error'` events. Listeners installed using this symbol are called before the regular `'error'` listeners are called. - -Installing a listener using this symbol does not change the behavior once an `'error'` event is emitted. Therefore, the process will still crash if no -regular `'error'` listener is installed. - -#### Since - -v13.6.0, v12.17.0 - -#### Inherited from - -`EventEmitter.errorMonitor` - -#### Defined in - -node_modules/@types/node/events.d.ts:445 - -## Methods - -### \[captureRejectionSymbol\]()? - -> `optional` **\[captureRejectionSymbol\]**\<`K`\>(`error`, `event`, ...`args`): `void` - -#### Type Parameters - -• **K** - -#### Parameters - -• **error**: `Error` - -• **event**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`void` - -#### Inherited from - -`EventEmitter.[captureRejectionSymbol]` - -#### Defined in - -node_modules/@types/node/events.d.ts:136 - ---- - -### addListener() - -> **addListener**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.on(eventName, listener)`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`EventEmitter.addListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:597 - ---- - -### emit() - -> **emit**\<`K`\>(`eventName`, ...`args`): `boolean` - -Synchronously calls each of the listeners registered for the event named `eventName`, in the order they were registered, passing the supplied arguments -to each. - -Returns `true` if the event had listeners, `false` otherwise. - -```js -import { EventEmitter } from "node:events"; -const myEmitter = new EventEmitter(); - -// First listener -myEmitter.on("event", function firstListener() { - console.log("Helloooo! first listener"); -}); -// Second listener -myEmitter.on("event", function secondListener(arg1, arg2) { - console.log(`event with parameters ${arg1}, ${arg2} in second listener`); -}); -// Third listener -myEmitter.on("event", function thirdListener(...args) { - const parameters = args.join(", "); - console.log(`event with parameters ${parameters} in third listener`); -}); - -console.log(myEmitter.listeners("event")); - -myEmitter.emit("event", 1, 2, 3, 4, 5); - -// Prints: -// [ -// [Function: firstListener], -// [Function: secondListener], -// [Function: thirdListener] -// ] -// Helloooo! first listener -// event with parameters 1, 2 in second listener -// event with parameters 1, 2, 3, 4, 5 in third listener -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`boolean` - -#### Since - -v0.1.26 - -#### Inherited from - -`EventEmitter.emit` - -#### Defined in - -node_modules/@types/node/events.d.ts:859 - ---- - -### eventNames() - -> **eventNames**(): (`string` \| `symbol`)[] - -Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or `Symbol`s. - -```js -import { EventEmitter } from "node:events"; - -const myEE = new EventEmitter(); -myEE.on("foo", () => {}); -myEE.on("bar", () => {}); - -const sym = Symbol("symbol"); -myEE.on(sym, () => {}); - -console.log(myEE.eventNames()); -// Prints: [ 'foo', 'bar', Symbol(symbol) ] -``` - -#### Returns - -(`string` \| `symbol`)[] - -#### Since - -v6.0.0 - -#### Inherited from - -`EventEmitter.eventNames` - -#### Defined in - -node_modules/@types/node/events.d.ts:922 - ---- - -### getMaxListeners() - -> **getMaxListeners**(): `number` - -Returns the current max listener value for the `EventEmitter` which is either -set by `emitter.setMaxListeners(n)` or defaults to [defaultMaxListeners](DiscordClient.md#defaultmaxlisteners). - -#### Returns - -`number` - -#### Since - -v1.0.0 - -#### Inherited from - -`EventEmitter.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:774 - ---- - -### handleReactionAdd() - -> **handleReactionAdd**(`reaction`, `user`): `Promise`\<`void`\> - -#### Parameters - -• **reaction**: `MessageReaction` - -• **user**: `User` - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[core/src/clients/discord/index.ts:121](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/discord/index.ts#L121) - ---- - -### handleReactionRemove() - -> **handleReactionRemove**(`reaction`, `user`): `Promise`\<`void`\> - -#### Parameters - -• **reaction**: `MessageReaction` - -• **user**: `User` - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[core/src/clients/discord/index.ts:195](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/discord/index.ts#L195) - ---- - -### listenerCount() - -> **listenerCount**\<`K`\>(`eventName`, `listener`?): `number` - -Returns the number of listeners listening for the event named `eventName`. -If `listener` is provided, it will return how many times the listener is found -in the list of the listeners of the event. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event being listened for - -• **listener?**: `Function` - -The event handler function - -#### Returns - -`number` - -#### Since - -v3.2.0 - -#### Inherited from - -`EventEmitter.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:868 - ---- - -### listeners() - -> **listeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -console.log(util.inspect(server.listeners("connection"))); -// Prints: [ [Function] ] -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v0.1.26 - -#### Inherited from - -`EventEmitter.listeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:787 - ---- - -### off() - -> **off**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.removeListener()`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v10.0.0 - -#### Inherited from - -`EventEmitter.off` - -#### Defined in - -node_modules/@types/node/events.d.ts:747 - ---- - -### on() - -> **on**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the end of the listeners array for the event -named `eventName`. No checks are made to see if the `listener` has already -been added. Multiple calls passing the same combination of `eventName` and -`listener` will result in the `listener` being added, and called, multiple times. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.on("foo", () => console.log("a")); -myEE.prependListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.1.101 - -#### Inherited from - -`EventEmitter.on` - -#### Defined in - -node_modules/@types/node/events.d.ts:629 - ---- - -### once() - -> **once**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time** `listener` function for the event named `eventName`. The -next time `eventName` is triggered, this listener is removed and then invoked. - -```js -server.once("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependOnceListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.once("foo", () => console.log("a")); -myEE.prependOnceListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.3.0 - -#### Inherited from - -`EventEmitter.once` - -#### Defined in - -node_modules/@types/node/events.d.ts:659 - ---- - -### prependListener() - -> **prependListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the _beginning_ of the listeners array for the -event named `eventName`. No checks are made to see if the `listener` has -already been added. Multiple calls passing the same combination of `eventName` -and `listener` will result in the `listener` being added, and called, multiple times. - -```js -server.prependListener("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`EventEmitter.prependListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:886 - ---- - -### prependOnceListener() - -> **prependOnceListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time**`listener` function for the event named `eventName` to the _beginning_ of the listeners array. The next time `eventName` is triggered, this -listener is removed, and then invoked. - -```js -server.prependOnceListener("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`EventEmitter.prependOnceListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:902 - ---- - -### rawListeners() - -> **rawListeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`, -including any wrappers (such as those created by `.once()`). - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.once("log", () => console.log("log once")); - -// Returns a new Array with a function `onceWrapper` which has a property -// `listener` which contains the original listener bound above -const listeners = emitter.rawListeners("log"); -const logFnWrapper = listeners[0]; - -// Logs "log once" to the console and does not unbind the `once` event -logFnWrapper.listener(); - -// Logs "log once" to the console and removes the listener -logFnWrapper(); - -emitter.on("log", () => console.log("log persistently")); -// Will return a new Array with a single function bound by `.on()` above -const newListeners = emitter.rawListeners("log"); - -// Logs "log persistently" twice -newListeners[0](); -emitter.emit("log"); -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v9.4.0 - -#### Inherited from - -`EventEmitter.rawListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:818 - ---- - -### removeAllListeners() - -> **removeAllListeners**(`eventName`?): `this` - -Removes all listeners, or those of the specified `eventName`. - -It is bad practice to remove listeners added elsewhere in the code, -particularly when the `EventEmitter` instance was created by some other -component or module (e.g. sockets or file streams). - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **eventName?**: `string` \| `symbol` - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`EventEmitter.removeAllListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:758 - ---- - -### removeListener() - -> **removeListener**\<`K`\>(`eventName`, `listener`): `this` - -Removes the specified `listener` from the listener array for the event named `eventName`. - -```js -const callback = (stream) => { - console.log("someone connected!"); -}; -server.on("connection", callback); -// ... -server.removeListener("connection", callback); -``` - -`removeListener()` will remove, at most, one instance of a listener from the -listener array. If any single listener has been added multiple times to the -listener array for the specified `eventName`, then `removeListener()` must be -called multiple times to remove each instance. - -Once an event is emitted, all listeners attached to it at the -time of emitting are called in order. This implies that any `removeListener()` or `removeAllListeners()` calls _after_ emitting and _before_ the last listener finishes execution -will not remove them from`emit()` in progress. Subsequent events behave as expected. - -```js -import { EventEmitter } from "node:events"; -class MyEmitter extends EventEmitter {} -const myEmitter = new MyEmitter(); - -const callbackA = () => { - console.log("A"); - myEmitter.removeListener("event", callbackB); -}; - -const callbackB = () => { - console.log("B"); -}; - -myEmitter.on("event", callbackA); - -myEmitter.on("event", callbackB); - -// callbackA removes listener callbackB but it will still be called. -// Internal listener array at time of emit [callbackA, callbackB] -myEmitter.emit("event"); -// Prints: -// A -// B - -// callbackB is now removed. -// Internal listener array [callbackA] -myEmitter.emit("event"); -// Prints: -// A -``` - -Because listeners are managed using an internal array, calling this will -change the position indices of any listener registered _after_ the listener -being removed. This will not impact the order in which listeners are called, -but it means that any copies of the listener array as returned by -the `emitter.listeners()` method will need to be recreated. - -When a single function has been added as a handler multiple times for a single -event (as in the example below), `removeListener()` will remove the most -recently added instance. In the example the `once('ping')` listener is removed: - -```js -import { EventEmitter } from "node:events"; -const ee = new EventEmitter(); - -function pong() { - console.log("pong"); -} - -ee.on("ping", pong); -ee.once("ping", pong); -ee.removeListener("ping", pong); - -ee.emit("ping"); -ee.emit("ping"); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`EventEmitter.removeListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:742 - ---- - -### setMaxListeners() - -> **setMaxListeners**(`n`): `this` - -By default `EventEmitter`s will print a warning if more than `10` listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The `emitter.setMaxListeners()` method allows the limit to be -modified for this specific `EventEmitter` instance. The value can be set to `Infinity` (or `0`) to indicate an unlimited number of listeners. - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **n**: `number` - -#### Returns - -`this` - -#### Since - -v0.3.5 - -#### Inherited from - -`EventEmitter.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:768 - ---- - -### addAbortListener() - -> `static` **addAbortListener**(`signal`, `resource`): `Disposable` - -**`Experimental`** - -Listens once to the `abort` event on the provided `signal`. - -Listening to the `abort` event on abort signals is unsafe and may -lead to resource leaks since another third party with the signal can -call `e.stopImmediatePropagation()`. Unfortunately Node.js cannot change -this since it would violate the web standard. Additionally, the original -API makes it easy to forget to remove listeners. - -This API allows safely using `AbortSignal`s in Node.js APIs by solving these -two issues by listening to the event such that `stopImmediatePropagation` does -not prevent the listener from running. - -Returns a disposable so that it may be unsubscribed from more easily. - -```js -import { addAbortListener } from "node:events"; - -function example(signal) { - let disposable; - try { - signal.addEventListener("abort", (e) => e.stopImmediatePropagation()); - disposable = addAbortListener(signal, (e) => { - // Do something when signal is aborted. - }); - } finally { - disposable?.[Symbol.dispose](); - } -} -``` - -#### Parameters - -• **signal**: `AbortSignal` - -• **resource** - -#### Returns - -`Disposable` - -Disposable that removes the `abort` listener. - -#### Since - -v20.5.0 - -#### Inherited from - -`EventEmitter.addAbortListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:437 - ---- - -### getEventListeners() - -> `static` **getEventListeners**(`emitter`, `name`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -For `EventEmitter`s this behaves exactly the same as calling `.listeners` on -the emitter. - -For `EventTarget`s this is the only way to get the event listeners for the -event target. This is useful for debugging and diagnostic purposes. - -```js -import { getEventListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - const listener = () => console.log("Events are fun"); - ee.on("foo", listener); - console.log(getEventListeners(ee, "foo")); // [ [Function: listener] ] -} -{ - const et = new EventTarget(); - const listener = () => console.log("Events are fun"); - et.addEventListener("foo", listener); - console.log(getEventListeners(et, "foo")); // [ [Function: listener] ] -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -• **name**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v15.2.0, v14.17.0 - -#### Inherited from - -`EventEmitter.getEventListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:358 - ---- - -### getMaxListeners() - -> `static` **getMaxListeners**(`emitter`): `number` - -Returns the currently set max amount of listeners. - -For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on -the emitter. - -For `EventTarget`s this is the only way to get the max event listeners for the -event target. If the number of event handlers on a single EventTarget exceeds -the max set, the EventTarget will print a warning. - -```js -import { getMaxListeners, setMaxListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - console.log(getMaxListeners(ee)); // 10 - setMaxListeners(11, ee); - console.log(getMaxListeners(ee)); // 11 -} -{ - const et = new EventTarget(); - console.log(getMaxListeners(et)); // 10 - setMaxListeners(11, et); - console.log(getMaxListeners(et)); // 11 -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -#### Returns - -`number` - -#### Since - -v19.9.0 - -#### Inherited from - -`EventEmitter.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:387 - ---- - -### ~~listenerCount()~~ - -> `static` **listenerCount**(`emitter`, `eventName`): `number` - -A class method that returns the number of listeners for the given `eventName` registered on the given `emitter`. - -```js -import { EventEmitter, listenerCount } from "node:events"; - -const myEmitter = new EventEmitter(); -myEmitter.on("event", () => {}); -myEmitter.on("event", () => {}); -console.log(listenerCount(myEmitter, "event")); -// Prints: 2 -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -The emitter to query - -• **eventName**: `string` \| `symbol` - -The event name - -#### Returns - -`number` - -#### Since - -v0.9.12 - -#### Deprecated - -Since v3.2.0 - Use `listenerCount` instead. - -#### Inherited from - -`EventEmitter.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:330 - ---- - -### on() - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); -}); - -for await (const event of on(ee, "foo")) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] -} -// Unreachable here -``` - -Returns an `AsyncIterator` that iterates `eventName` events. It will throw -if the `EventEmitter` emits `'error'`. It removes all listeners when -exiting the loop. The `value` returned by each iteration is an array -composed of the emitted event arguments. - -An `AbortSignal` can be used to cancel waiting on events: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ac = new AbortController(); - -(async () => { - const ee = new EventEmitter(); - - // Emit later on - process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - }); - - for await (const event of on(ee, "foo", { signal: ac.signal })) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] - } - // Unreachable here -})(); - -process.nextTick(() => ac.abort()); -``` - -Use the `close` option to specify an array of event names that will end the iteration: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - ee.emit("close"); -}); - -for await (const event of on(ee, "foo", { close: ["close"] })) { - console.log(event); // prints ['bar'] [42] -} -// the loop will exit after 'close' is emitted -console.log("done"); // prints 'done' -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -An `AsyncIterator` that iterates `eventName` events emitted by the `emitter` - -##### Since - -v13.6.0, v12.16.0 - -##### Inherited from - -`EventEmitter.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:303 - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -##### Inherited from - -`EventEmitter.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:308 - ---- - -### once() - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given -event or that is rejected if the `EventEmitter` emits `'error'` while waiting. -The `Promise` will resolve with an array of all the arguments emitted to the -given event. - -This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event -semantics and does not listen to the `'error'` event. - -```js -import { once, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -process.nextTick(() => { - ee.emit("myevent", 42); -}); - -const [value] = await once(ee, "myevent"); -console.log(value); - -const err = new Error("kaboom"); -process.nextTick(() => { - ee.emit("error", err); -}); - -try { - await once(ee, "myevent"); -} catch (err) { - console.error("error happened", err); -} -``` - -The special handling of the `'error'` event is only used when `events.once()` is used to wait for another event. If `events.once()` is used to wait for the -'`error'` event itself, then it is treated as any other kind of event without -special handling: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); - -once(ee, "error") - .then(([err]) => console.log("ok", err.message)) - .catch((err) => console.error("error", err.message)); - -ee.emit("error", new Error("boom")); - -// Prints: ok boom -``` - -An `AbortSignal` can be used to cancel waiting for the event: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); -const ac = new AbortController(); - -async function foo(emitter, event, signal) { - try { - await once(emitter, event, { signal }); - console.log("event emitted!"); - } catch (error) { - if (error.name === "AbortError") { - console.error("Waiting for the event was canceled!"); - } else { - console.error("There was an error", error.message); - } - } -} - -foo(ee, "foo", ac.signal); -ac.abort(); // Abort waiting for the event -ee.emit("foo"); // Prints: Waiting for the event was canceled! -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Since - -v11.13.0, v10.16.0 - -##### Inherited from - -`EventEmitter.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:217 - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Inherited from - -`EventEmitter.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:222 - ---- - -### setMaxListeners() - -> `static` **setMaxListeners**(`n`?, ...`eventTargets`?): `void` - -```js -import { setMaxListeners, EventEmitter } from "node:events"; - -const target = new EventTarget(); -const emitter = new EventEmitter(); - -setMaxListeners(5, target, emitter); -``` - -#### Parameters - -• **n?**: `number` - -A non-negative number. The maximum number of listeners per `EventTarget` event. - -• ...**eventTargets?**: (`EventEmitter`\<`DefaultEventMap`\> \| `EventTarget`)[] - -Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, `n` is set as the default max for all newly created {EventTarget} and {EventEmitter} -objects. - -#### Returns - -`void` - -#### Since - -v15.4.0 - -#### Inherited from - -`EventEmitter.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:402 diff --git a/docs/docs/api/classes/MemoryManager.md b/docs/docs/api/classes/MemoryManager.md index 4f605abac5..ae2c008314 100644 --- a/docs/docs/api/classes/MemoryManager.md +++ b/docs/docs/api/classes/MemoryManager.md @@ -34,7 +34,7 @@ The name of the table this manager will operate on. #### Defined in -[core/src/core/memory.ts:35](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L35) +[packages/core/src/memory.ts:35](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L35) ## Properties @@ -50,9 +50,9 @@ The AgentRuntime instance associated with this manager. #### Defined in -[core/src/core/memory.ts:22](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L22) +[packages/core/src/memory.ts:22](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L22) ---- +*** ### tableName @@ -66,7 +66,7 @@ The name of the database table this manager operates on. #### Defined in -[core/src/core/memory.ts:27](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L27) +[packages/core/src/memory.ts:27](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L27) ## Methods @@ -94,9 +94,9 @@ A Promise resolving to the memory object, potentially updated with an embedding #### Defined in -[core/src/core/memory.ts:45](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L45) +[packages/core/src/memory.ts:45](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L45) ---- +*** ### countMemories() @@ -126,9 +126,9 @@ A Promise resolving to the count of memories. #### Defined in -[core/src/core/memory.ts:218](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L218) +[packages/core/src/memory.ts:219](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L219) ---- +*** ### createMemory() @@ -158,9 +158,9 @@ A Promise that resolves when the operation completes. #### Defined in -[core/src/core/memory.ts:158](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L158) +[packages/core/src/memory.ts:158](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L158) ---- +*** ### getCachedEmbeddings() @@ -180,9 +180,9 @@ A Promise that resolves when the operation completes. #### Defined in -[core/src/core/memory.ts:93](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L93) +[packages/core/src/memory.ts:93](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L93) ---- +*** ### getMemories() @@ -226,9 +226,9 @@ A Promise resolving to an array of Memory objects. #### Defined in -[core/src/core/memory.ts:66](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L66) +[packages/core/src/memory.ts:66](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L66) ---- +*** ### getMemoriesByRoomIds() @@ -252,9 +252,9 @@ A Promise resolving to an array of Memory objects. #### Defined in -[core/src/core/memory.ts:172](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L172) +[packages/core/src/memory.ts:173](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L173) ---- +*** ### getMemoryById() @@ -274,9 +274,9 @@ A Promise resolving to an array of Memory objects. #### Defined in -[core/src/core/memory.ts:183](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L183) +[packages/core/src/memory.ts:184](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L184) ---- +*** ### removeAllMemories() @@ -302,9 +302,9 @@ A Promise that resolves when the operation completes. #### Defined in -[core/src/core/memory.ts:205](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L205) +[packages/core/src/memory.ts:206](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L206) ---- +*** ### removeMemory() @@ -330,9 +330,9 @@ A Promise that resolves when the operation completes. #### Defined in -[core/src/core/memory.ts:193](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L193) +[packages/core/src/memory.ts:194](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L194) ---- +*** ### searchMemoriesByEmbedding() @@ -356,7 +356,7 @@ Options including match threshold, count, user IDs, and uniqueness. The maximum number of memories to retrieve. -• **opts.match_threshold?**: `number` +• **opts.match\_threshold?**: `number` The similarity threshold for matching memories. @@ -380,4 +380,4 @@ A Promise resolving to an array of Memory objects that match the embedding. #### Defined in -[core/src/core/memory.ts:120](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L120) +[packages/core/src/memory.ts:120](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L120) diff --git a/docs/docs/api/classes/PostgresDatabaseAdapter.md b/docs/docs/api/classes/PostgresDatabaseAdapter.md deleted file mode 100644 index 23da6fff34..0000000000 --- a/docs/docs/api/classes/PostgresDatabaseAdapter.md +++ /dev/null @@ -1,1132 +0,0 @@ -# Class: PostgresDatabaseAdapter - -An abstract class representing a database adapter for managing various entities -like accounts, memories, actors, goals, and rooms. - -## Extends - -- [`DatabaseAdapter`](DatabaseAdapter.md) - -## Constructors - -### new PostgresDatabaseAdapter() - -> **new PostgresDatabaseAdapter**(`connectionConfig`): [`PostgresDatabaseAdapter`](PostgresDatabaseAdapter.md) - -#### Parameters - -• **connectionConfig**: `any` - -#### Returns - -[`PostgresDatabaseAdapter`](PostgresDatabaseAdapter.md) - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`constructor`](DatabaseAdapter.md#constructors) - -#### Defined in - -[core/src/adapters/postgres.ts:19](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L19) - -## Properties - -### db - -> **db**: `any` - -The database instance. - -#### Inherited from - -[`DatabaseAdapter`](DatabaseAdapter.md).[`db`](DatabaseAdapter.md#db) - -#### Defined in - -[core/src/core/database.ts:21](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L21) - -## Methods - -### addParticipant() - -> **addParticipant**(`userId`, `roomId`): `Promise`\<`boolean`\> - -Adds a user as a participant to a specific room. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user to add as a participant. - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room to which the user will be added. - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves to a boolean indicating success or failure. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`addParticipant`](DatabaseAdapter.md#addparticipant) - -#### Defined in - -[core/src/adapters/postgres.ts:681](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L681) - ---- - -### countMemories() - -> **countMemories**(`roomId`, `unique`, `tableName`): `Promise`\<`number`\> - -Counts the number of memories in a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room for which to count memories. - -• **unique**: `boolean` = `true` - -Specifies whether to count only unique memories. - -• **tableName**: `string` = `""` - -Optional table name to count memories from. - -#### Returns - -`Promise`\<`number`\> - -A Promise that resolves to the number of memories. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`countMemories`](DatabaseAdapter.md#countmemories) - -#### Defined in - -[core/src/adapters/postgres.ts:752](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L752) - ---- - -### createAccount() - -> **createAccount**(`account`): `Promise`\<`boolean`\> - -Creates a new account in the database. - -#### Parameters - -• **account**: [`Account`](../interfaces/Account.md) - -The account object to create. - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves when the account creation is complete. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createAccount`](DatabaseAdapter.md#createaccount) - -#### Defined in - -[core/src/adapters/postgres.ts:186](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L186) - ---- - -### createGoal() - -> **createGoal**(`goal`): `Promise`\<`void`\> - -Creates a new goal in the database. - -#### Parameters - -• **goal**: [`Goal`](../interfaces/Goal.md) - -The goal object to create. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal has been created. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createGoal`](DatabaseAdapter.md#creategoal) - -#### Defined in - -[core/src/adapters/postgres.ts:454](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L454) - ---- - -### createMemory() - -> **createMemory**(`memory`, `tableName`): `Promise`\<`void`\> - -Creates a new memory in the database. - -#### Parameters - -• **memory**: [`Memory`](../interfaces/Memory.md) - -The memory object to create. - -• **tableName**: `string` - -The table where the memory should be stored. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the memory has been created. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createMemory`](DatabaseAdapter.md#creatememory) - -#### Defined in - -[core/src/adapters/postgres.ts:253](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L253) - ---- - -### createRelationship() - -> **createRelationship**(`params`): `Promise`\<`boolean`\> - -Creates a new relationship between two users. - -#### Parameters - -• **params** - -An object containing the UUIDs of the two users (userA and userB). - -• **params.userA**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.userB**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves to a boolean indicating success or failure of the creation. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createRelationship`](DatabaseAdapter.md#createrelationship) - -#### Defined in - -[core/src/adapters/postgres.ts:505](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L505) - ---- - -### createRoom() - -> **createRoom**(`roomId`?): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -Creates a new room with an optional specified ID. - -#### Parameters - -• **roomId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -Optional UUID to assign to the new room. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -A Promise that resolves to the UUID of the created room. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createRoom`](DatabaseAdapter.md#createroom) - -#### Defined in - -[core/src/adapters/postgres.ts:483](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L483) - ---- - -### getAccountById() - -> **getAccountById**(`userId`): `Promise`\<[`Account`](../interfaces/Account.md)\> - -Retrieves an account by its ID. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user account to retrieve. - -#### Returns - -`Promise`\<[`Account`](../interfaces/Account.md)\> - -A Promise that resolves to the Account object or null if not found. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getAccountById`](DatabaseAdapter.md#getaccountbyid) - -#### Defined in - -[core/src/adapters/postgres.ts:162](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L162) - ---- - -### getActorById() - -> **getActorById**(`params`): `Promise`\<[`Actor`](../interfaces/Actor.md)[]\> - -#### Parameters - -• **params** - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Actor`](../interfaces/Actor.md)[]\> - -#### Defined in - -[core/src/adapters/postgres.ts:210](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L210) - ---- - -### getActorDetails() - -> **getActorDetails**(`params`): `Promise`\<[`Actor`](../interfaces/Actor.md)[]\> - -Retrieves details of actors in a given room. - -#### Parameters - -• **params** - -An object containing the roomId to search for actors. - -• **params.roomId**: `string` - -#### Returns - -`Promise`\<[`Actor`](../interfaces/Actor.md)[]\> - -A Promise that resolves to an array of Actor objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getActorDetails`](DatabaseAdapter.md#getactordetails) - -#### Defined in - -[core/src/adapters/postgres.ts:810](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L810) - ---- - -### getCachedEmbeddings() - -> **getCachedEmbeddings**(`opts`): `Promise`\<`object`[]\> - -Retrieves cached embeddings based on the specified query parameters. - -#### Parameters - -• **opts** - -• **opts.query_field_name**: `string` - -• **opts.query_field_sub_name**: `string` - -• **opts.query_input**: `string` - -• **opts.query_match_count**: `number` - -• **opts.query_table_name**: `string` - -• **opts.query_threshold**: `number` - -#### Returns - -`Promise`\<`object`[]\> - -A Promise that resolves to an array of objects containing embeddings and levenshtein scores. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getCachedEmbeddings`](DatabaseAdapter.md#getcachedembeddings) - -#### Defined in - -[core/src/adapters/postgres.ts:559](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L559) - ---- - -### getGoals() - -> **getGoals**(`params`): `Promise`\<[`Goal`](../interfaces/Goal.md)[]\> - -Retrieves goals based on specified parameters. - -#### Parameters - -• **params** - -An object containing parameters for goal retrieval. - -• **params.count?**: `number` - -• **params.onlyInProgress?**: `boolean` - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.userId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Goal`](../interfaces/Goal.md)[]\> - -A Promise that resolves to an array of Goal objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getGoals`](DatabaseAdapter.md#getgoals) - -#### Defined in - -[core/src/adapters/postgres.ts:396](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L396) - ---- - -### getMemories() - -> **getMemories**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -Retrieves memories based on the specified parameters. - -#### Parameters - -• **params** - -An object containing parameters for the memory retrieval. - -• **params.agentId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.count?**: `number` - -• **params.end?**: `number` - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.start?**: `number` - -• **params.tableName**: `string` - -• **params.unique?**: `boolean` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -A Promise that resolves to an array of Memory objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getMemories`](DatabaseAdapter.md#getmemories) - -#### Defined in - -[core/src/adapters/postgres.ts:334](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L334) - ---- - -### getMemoriesByRoomIds() - -> **getMemoriesByRoomIds**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -#### Parameters - -• **params** - -• **params.agentId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.roomIds**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[] - -• **params.tableName**: `string` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getMemoriesByRoomIds`](DatabaseAdapter.md#getmemoriesbyroomids) - -#### Defined in - -[core/src/adapters/postgres.ts:103](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L103) - ---- - -### getMemoryById() - -> **getMemoryById**(`id`): `Promise`\<[`Memory`](../interfaces/Memory.md)\> - -#### Parameters - -• **id**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getMemoryById`](DatabaseAdapter.md#getmemorybyid) - -#### Defined in - -[core/src/adapters/postgres.ts:232](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L232) - ---- - -### getParticipantsForAccount() - -> **getParticipantsForAccount**(`userId`): `Promise`\<[`Participant`](../interfaces/Participant.md)[]\> - -Retrieves participants associated with a specific account. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the account. - -#### Returns - -`Promise`\<[`Participant`](../interfaces/Participant.md)[]\> - -A Promise that resolves to an array of Participant objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getParticipantsForAccount`](DatabaseAdapter.md#getparticipantsforaccount) - -#### Defined in - -[core/src/adapters/postgres.ts:72](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L72) - ---- - -### getParticipantsForRoom() - -> **getParticipantsForRoom**(`roomId`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -Retrieves participants for a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room for which to retrieve participants. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -A Promise that resolves to an array of UUIDs representing the participants. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getParticipantsForRoom`](DatabaseAdapter.md#getparticipantsforroom) - -#### Defined in - -[core/src/adapters/postgres.ts:149](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L149) - ---- - -### getParticipantUserState() - -> **getParticipantUserState**(`roomId`, `userId`): `Promise`\<`"FOLLOWED"` \| `"MUTED"`\> - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<`"FOLLOWED"` \| `"MUTED"`\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getParticipantUserState`](DatabaseAdapter.md#getparticipantuserstate) - -#### Defined in - -[core/src/adapters/postgres.ts:87](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L87) - ---- - -### getRelationship() - -> **getRelationship**(`params`): `Promise`\<[`Relationship`](../interfaces/Relationship.md)\> - -Retrieves a relationship between two users if it exists. - -#### Parameters - -• **params** - -An object containing the UUIDs of the two users (userA and userB). - -• **params.userA**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.userB**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Relationship`](../interfaces/Relationship.md)\> - -A Promise that resolves to the Relationship object or null if not found. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRelationship`](DatabaseAdapter.md#getrelationship) - -#### Defined in - -[core/src/adapters/postgres.ts:529](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L529) - ---- - -### getRelationships() - -> **getRelationships**(`params`): `Promise`\<[`Relationship`](../interfaces/Relationship.md)[]\> - -Retrieves all relationships for a specific user. - -#### Parameters - -• **params** - -An object containing the UUID of the user. - -• **params.userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Relationship`](../interfaces/Relationship.md)[]\> - -A Promise that resolves to an array of Relationship objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRelationships`](DatabaseAdapter.md#getrelationships) - -#### Defined in - -[core/src/adapters/postgres.ts:546](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L546) - ---- - -### getRoom() - -> **getRoom**(`roomId`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -Retrieves the room ID for a given room, if it exists. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room to retrieve. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -A Promise that resolves to the room ID or null if not found. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRoom`](DatabaseAdapter.md#getroom) - -#### Defined in - -[core/src/adapters/postgres.ts:59](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L59) - ---- - -### getRoomsForParticipant() - -> **getRoomsForParticipant**(`userId`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -Retrieves room IDs for which a specific user is a participant. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -A Promise that resolves to an array of room IDs. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRoomsForParticipant`](DatabaseAdapter.md#getroomsforparticipant) - -#### Defined in - -[core/src/adapters/postgres.ts:784](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L784) - ---- - -### getRoomsForParticipants() - -> **getRoomsForParticipants**(`userIds`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -Retrieves room IDs for which specific users are participants. - -#### Parameters - -• **userIds**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[] - -An array of UUIDs of the users. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -A Promise that resolves to an array of room IDs. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRoomsForParticipants`](DatabaseAdapter.md#getroomsforparticipants) - -#### Defined in - -[core/src/adapters/postgres.ts:797](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L797) - ---- - -### log() - -> **log**(`params`): `Promise`\<`void`\> - -Logs an event or action with the specified details. - -#### Parameters - -• **params** - -An object containing parameters for the log entry. - -• **params.body** - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.type**: `string` - -• **params.userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the log entry has been saved. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`log`](DatabaseAdapter.md#log) - -#### Defined in - -[core/src/adapters/postgres.ts:595](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L595) - ---- - -### removeAllGoals() - -> **removeAllGoals**(`roomId`): `Promise`\<`void`\> - -Removes all goals associated with a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room whose goals should be removed. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when all goals have been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeAllGoals`](DatabaseAdapter.md#removeallgoals) - -#### Defined in - -[core/src/adapters/postgres.ts:773](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L773) - ---- - -### removeAllMemories() - -> **removeAllMemories**(`roomId`, `tableName`): `Promise`\<`void`\> - -Removes all memories associated with a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room whose memories should be removed. - -• **tableName**: `string` - -The table from which the memories should be removed. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when all memories have been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeAllMemories`](DatabaseAdapter.md#removeallmemories) - -#### Defined in - -[core/src/adapters/postgres.ts:740](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L740) - ---- - -### removeGoal() - -> **removeGoal**(`goalId`): `Promise`\<`void`\> - -Removes a specific goal from the database. - -#### Parameters - -• **goalId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the goal to remove. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal has been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeGoal`](DatabaseAdapter.md#removegoal) - -#### Defined in - -[core/src/adapters/postgres.ts:474](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L474) - ---- - -### removeMemory() - -> **removeMemory**(`memoryId`, `tableName`): `Promise`\<`void`\> - -Removes a specific memory from the database. - -#### Parameters - -• **memoryId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the memory to remove. - -• **tableName**: `string` - -The table from which the memory should be removed. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the memory has been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeMemory`](DatabaseAdapter.md#removememory) - -#### Defined in - -[core/src/adapters/postgres.ts:728](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L728) - ---- - -### removeParticipant() - -> **removeParticipant**(`userId`, `roomId`): `Promise`\<`boolean`\> - -Removes a user as a participant from a specific room. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user to remove as a participant. - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room from which the user will be removed. - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves to a boolean indicating success or failure. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeParticipant`](DatabaseAdapter.md#removeparticipant) - -#### Defined in - -[core/src/adapters/postgres.ts:697](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L697) - ---- - -### removeRoom() - -> **removeRoom**(`roomId`): `Promise`\<`void`\> - -Removes a specific room from the database. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room to remove. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the room has been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeRoom`](DatabaseAdapter.md#removeroom) - -#### Defined in - -[core/src/adapters/postgres.ts:496](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L496) - ---- - -### searchMemories() - -> **searchMemories**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -Searches for memories based on embeddings and other specified parameters. - -#### Parameters - -• **params** - -An object containing parameters for the memory search. - -• **params.embedding**: `number`[] - -• **params.match_count**: `number` - -• **params.match_threshold**: `number` - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.tableName**: `string` - -• **params.unique**: `boolean` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -A Promise that resolves to an array of Memory objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`searchMemories`](DatabaseAdapter.md#searchmemories) - -#### Defined in - -[core/src/adapters/postgres.ts:291](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L291) - ---- - -### searchMemoriesByEmbedding() - -> **searchMemoriesByEmbedding**(`embedding`, `params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -Searches for memories by embedding and other specified parameters. - -#### Parameters - -• **embedding**: `number`[] - -The embedding vector to search with. - -• **params** - -Additional parameters for the search. - -• **params.agentId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.count?**: `number` - -• **params.match_threshold?**: `number` - -• **params.roomId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.tableName**: `string` - -• **params.unique?**: `boolean` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -A Promise that resolves to an array of Memory objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`searchMemoriesByEmbedding`](DatabaseAdapter.md#searchmemoriesbyembedding) - -#### Defined in - -[core/src/adapters/postgres.ts:612](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L612) - ---- - -### setParticipantUserState() - -> **setParticipantUserState**(`roomId`, `userId`, `state`): `Promise`\<`void`\> - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **state**: `"FOLLOWED"` \| `"MUTED"` - -#### Returns - -`Promise`\<`void`\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`setParticipantUserState`](DatabaseAdapter.md#setparticipantuserstate) - -#### Defined in - -[core/src/adapters/postgres.ts:133](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L133) - ---- - -### testConnection() - -> **testConnection**(): `Promise`\<`boolean`\> - -#### Returns - -`Promise`\<`boolean`\> - -#### Defined in - -[core/src/adapters/postgres.ts:37](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L37) - ---- - -### updateGoal() - -> **updateGoal**(`goal`): `Promise`\<`void`\> - -Updates a specific goal in the database. - -#### Parameters - -• **goal**: [`Goal`](../interfaces/Goal.md) - -The goal object with updated properties. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal has been updated. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`updateGoal`](DatabaseAdapter.md#updategoal) - -#### Defined in - -[core/src/adapters/postgres.ts:437](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L437) - ---- - -### updateGoalStatus() - -> **updateGoalStatus**(`params`): `Promise`\<`void`\> - -Updates the status of a specific goal. - -#### Parameters - -• **params** - -An object containing the goalId and the new status. - -• **params.goalId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.status**: [`GoalStatus`](../enumerations/GoalStatus.md) - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal status has been updated. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`updateGoalStatus`](DatabaseAdapter.md#updategoalstatus) - -#### Defined in - -[core/src/adapters/postgres.ts:713](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/postgres.ts#L713) diff --git a/docs/docs/api/classes/Service.md b/docs/docs/api/classes/Service.md new file mode 100644 index 0000000000..65b5088e8a --- /dev/null +++ b/docs/docs/api/classes/Service.md @@ -0,0 +1,49 @@ +# Class: `abstract` Service + +## Extended by + +- [`IImageDescriptionService`](../interfaces/IImageDescriptionService.md) +- [`ITranscriptionService`](../interfaces/ITranscriptionService.md) +- [`IVideoService`](../interfaces/IVideoService.md) +- [`ITextGenerationService`](../interfaces/ITextGenerationService.md) +- [`IBrowserService`](../interfaces/IBrowserService.md) +- [`ISpeechService`](../interfaces/ISpeechService.md) +- [`IPdfService`](../interfaces/IPdfService.md) + +## Constructors + +### new Service() + +> **new Service**(): [`Service`](Service.md) + +#### Returns + +[`Service`](Service.md) + +## Properties + +### serviceType + +> `static` **serviceType**: [`ServiceType`](../enumerations/ServiceType.md) + +#### Defined in + +[packages/core/src/types.ts:507](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L507) + +## Methods + +### getInstance() + +> `static` **getInstance**\<`T`\>(): `T` + +#### Type Parameters + +• **T** *extends* [`Service`](Service.md) + +#### Returns + +`T` + +#### Defined in + +[packages/core/src/types.ts:509](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L509) diff --git a/docs/docs/api/classes/SqliteDatabaseAdapter.md b/docs/docs/api/classes/SqliteDatabaseAdapter.md deleted file mode 100644 index 0abba7df7f..0000000000 --- a/docs/docs/api/classes/SqliteDatabaseAdapter.md +++ /dev/null @@ -1,1100 +0,0 @@ -# Class: SqliteDatabaseAdapter - -An abstract class representing a database adapter for managing various entities -like accounts, memories, actors, goals, and rooms. - -## Extends - -- [`DatabaseAdapter`](DatabaseAdapter.md) - -## Constructors - -### new SqliteDatabaseAdapter() - -> **new SqliteDatabaseAdapter**(`db`): [`SqliteDatabaseAdapter`](SqliteDatabaseAdapter.md) - -#### Parameters - -• **db**: `Database` - -#### Returns - -[`SqliteDatabaseAdapter`](SqliteDatabaseAdapter.md) - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`constructor`](DatabaseAdapter.md#constructors) - -#### Defined in - -[core/src/adapters/sqlite.ts:70](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L70) - -## Properties - -### db - -> **db**: `any` - -The database instance. - -#### Inherited from - -[`DatabaseAdapter`](DatabaseAdapter.md).[`db`](DatabaseAdapter.md#db) - -#### Defined in - -[core/src/core/database.ts:21](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/database.ts#L21) - -## Methods - -### addParticipant() - -> **addParticipant**(`userId`, `roomId`): `Promise`\<`boolean`\> - -Adds a user as a participant to a specific room. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user to add as a participant. - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room to which the user will be added. - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves to a boolean indicating success or failure. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`addParticipant`](DatabaseAdapter.md#addparticipant) - -#### Defined in - -[core/src/adapters/sqlite.ts:592](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L592) - ---- - -### countMemories() - -> **countMemories**(`roomId`, `unique`, `tableName`): `Promise`\<`number`\> - -Counts the number of memories in a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room for which to count memories. - -• **unique**: `boolean` = `true` - -Specifies whether to count only unique memories. - -• **tableName**: `string` = `""` - -Optional table name to count memories from. - -#### Returns - -`Promise`\<`number`\> - -A Promise that resolves to the number of memories. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`countMemories`](DatabaseAdapter.md#countmemories) - -#### Defined in - -[core/src/adapters/sqlite.ts:465](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L465) - ---- - -### createAccount() - -> **createAccount**(`account`): `Promise`\<`boolean`\> - -Creates a new account in the database. - -#### Parameters - -• **account**: [`Account`](../interfaces/Account.md) - -The account object to create. - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves when the account creation is complete. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createAccount`](DatabaseAdapter.md#createaccount) - -#### Defined in - -[core/src/adapters/sqlite.ts:102](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L102) - ---- - -### createGoal() - -> **createGoal**(`goal`): `Promise`\<`void`\> - -Creates a new goal in the database. - -#### Parameters - -• **goal**: [`Goal`](../interfaces/Goal.md) - -The goal object to create. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal has been created. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createGoal`](DatabaseAdapter.md#creategoal) - -#### Defined in - -[core/src/adapters/sqlite.ts:532](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L532) - ---- - -### createMemory() - -> **createMemory**(`memory`, `tableName`): `Promise`\<`void`\> - -Creates a new memory in the database. - -#### Parameters - -• **memory**: [`Memory`](../interfaces/Memory.md) - -The memory object to create. - -• **tableName**: `string` - -The table where the memory should be stored. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the memory has been created. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createMemory`](DatabaseAdapter.md#creatememory) - -#### Defined in - -[core/src/adapters/sqlite.ts:196](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L196) - ---- - -### createRelationship() - -> **createRelationship**(`params`): `Promise`\<`boolean`\> - -Creates a new relationship between two users. - -#### Parameters - -• **params** - -An object containing the UUIDs of the two users (userA and userB). - -• **params.userA**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.userB**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves to a boolean indicating success or failure of the creation. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createRelationship`](DatabaseAdapter.md#createrelationship) - -#### Defined in - -[core/src/adapters/sqlite.ts:616](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L616) - ---- - -### createRoom() - -> **createRoom**(`roomId`?): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -Creates a new room with an optional specified ID. - -#### Parameters - -• **roomId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -Optional UUID to assign to the new room. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -A Promise that resolves to the UUID of the created room. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`createRoom`](DatabaseAdapter.md#createroom) - -#### Defined in - -[core/src/adapters/sqlite.ts:557](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L557) - ---- - -### getAccountById() - -> **getAccountById**(`userId`): `Promise`\<[`Account`](../interfaces/Account.md)\> - -Retrieves an account by its ID. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user account to retrieve. - -#### Returns - -`Promise`\<[`Account`](../interfaces/Account.md)\> - -A Promise that resolves to the Account object or null if not found. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getAccountById`](DatabaseAdapter.md#getaccountbyid) - -#### Defined in - -[core/src/adapters/sqlite.ts:88](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L88) - ---- - -### getActorDetails() - -> **getActorDetails**(`params`): `Promise`\<[`Actor`](../interfaces/Actor.md)[]\> - -Retrieves details of actors in a given room. - -#### Parameters - -• **params** - -An object containing the roomId to search for actors. - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Actor`](../interfaces/Actor.md)[]\> - -A Promise that resolves to an array of Actor objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getActorDetails`](DatabaseAdapter.md#getactordetails) - -#### Defined in - -[core/src/adapters/sqlite.ts:123](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L123) - ---- - -### getCachedEmbeddings() - -> **getCachedEmbeddings**(`opts`): `Promise`\<`object`[]\> - -Retrieves cached embeddings based on the specified query parameters. - -#### Parameters - -• **opts** - -• **opts.query_field_name**: `string` - -• **opts.query_field_sub_name**: `string` - -• **opts.query_input**: `string` - -• **opts.query_match_count**: `number` - -• **opts.query_table_name**: `string` - -• **opts.query_threshold**: `number` - -#### Returns - -`Promise`\<`object`[]\> - -A Promise that resolves to an array of objects containing embeddings and levenshtein scores. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getCachedEmbeddings`](DatabaseAdapter.md#getcachedembeddings) - -#### Defined in - -[core/src/adapters/sqlite.ts:336](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L336) - ---- - -### getGoals() - -> **getGoals**(`params`): `Promise`\<[`Goal`](../interfaces/Goal.md)[]\> - -Retrieves goals based on specified parameters. - -#### Parameters - -• **params** - -An object containing parameters for goal retrieval. - -• **params.count?**: `number` - -• **params.onlyInProgress?**: `boolean` - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.userId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Goal`](../interfaces/Goal.md)[]\> - -A Promise that resolves to an array of Goal objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getGoals`](DatabaseAdapter.md#getgoals) - -#### Defined in - -[core/src/adapters/sqlite.ts:485](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L485) - ---- - -### getMemories() - -> **getMemories**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -Retrieves memories based on the specified parameters. - -#### Parameters - -• **params** - -An object containing parameters for the memory retrieval. - -• **params.agentId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.count?**: `number` - -• **params.end?**: `number` - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.start?**: `number` - -• **params.tableName**: `string` - -• **params.unique?**: `boolean` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -A Promise that resolves to an array of Memory objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getMemories`](DatabaseAdapter.md#getmemories) - -#### Defined in - -[core/src/adapters/sqlite.ts:398](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L398) - ---- - -### getMemoriesByRoomIds() - -> **getMemoriesByRoomIds**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -#### Parameters - -• **params** - -• **params.agentId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.roomIds**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[] - -• **params.tableName**: `string` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getMemoriesByRoomIds`](DatabaseAdapter.md#getmemoriesbyroomids) - -#### Defined in - -[core/src/adapters/sqlite.ts:150](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L150) - ---- - -### getMemoryById() - -> **getMemoryById**(`memoryId`): `Promise`\<[`Memory`](../interfaces/Memory.md)\> - -#### Parameters - -• **memoryId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getMemoryById`](DatabaseAdapter.md#getmemorybyid) - -#### Defined in - -[core/src/adapters/sqlite.ts:180](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L180) - ---- - -### getParticipantsForAccount() - -> **getParticipantsForAccount**(`userId`): `Promise`\<[`Participant`](../interfaces/Participant.md)[]\> - -Retrieves participants associated with a specific account. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the account. - -#### Returns - -`Promise`\<[`Participant`](../interfaces/Participant.md)[]\> - -A Promise that resolves to an array of Participant objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getParticipantsForAccount`](DatabaseAdapter.md#getparticipantsforaccount) - -#### Defined in - -[core/src/adapters/sqlite.ts:30](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L30) - ---- - -### getParticipantsForRoom() - -> **getParticipantsForRoom**(`roomId`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -Retrieves participants for a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room for which to retrieve participants. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -A Promise that resolves to an array of UUIDs representing the participants. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getParticipantsForRoom`](DatabaseAdapter.md#getparticipantsforroom) - -#### Defined in - -[core/src/adapters/sqlite.ts:40](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L40) - ---- - -### getParticipantUserState() - -> **getParticipantUserState**(`roomId`, `userId`): `Promise`\<`"FOLLOWED"` \| `"MUTED"`\> - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<`"FOLLOWED"` \| `"MUTED"`\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getParticipantUserState`](DatabaseAdapter.md#getparticipantuserstate) - -#### Defined in - -[core/src/adapters/sqlite.ts:46](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L46) - ---- - -### getRelationship() - -> **getRelationship**(`params`): `Promise`\<[`Relationship`](../interfaces/Relationship.md)\> - -Retrieves a relationship between two users if it exists. - -#### Parameters - -• **params** - -An object containing the UUIDs of the two users (userA and userB). - -• **params.userA**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.userB**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Relationship`](../interfaces/Relationship.md)\> - -A Promise that resolves to the Relationship object or null if not found. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRelationship`](DatabaseAdapter.md#getrelationship) - -#### Defined in - -[core/src/adapters/sqlite.ts:631](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L631) - ---- - -### getRelationships() - -> **getRelationships**(`params`): `Promise`\<[`Relationship`](../interfaces/Relationship.md)[]\> - -Retrieves all relationships for a specific user. - -#### Parameters - -• **params** - -An object containing the UUID of the user. - -• **params.userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<[`Relationship`](../interfaces/Relationship.md)[]\> - -A Promise that resolves to an array of Relationship objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRelationships`](DatabaseAdapter.md#getrelationships) - -#### Defined in - -[core/src/adapters/sqlite.ts:649](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L649) - ---- - -### getRoom() - -> **getRoom**(`roomId`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -Retrieves the room ID for a given room, if it exists. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room to retrieve. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`\> - -A Promise that resolves to the room ID or null if not found. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRoom`](DatabaseAdapter.md#getroom) - -#### Defined in - -[core/src/adapters/sqlite.ts:22](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L22) - ---- - -### getRoomsForParticipant() - -> **getRoomsForParticipant**(`userId`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -Retrieves room IDs for which a specific user is a participant. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -A Promise that resolves to an array of room IDs. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRoomsForParticipant`](DatabaseAdapter.md#getroomsforparticipant) - -#### Defined in - -[core/src/adapters/sqlite.ts:573](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L573) - ---- - -### getRoomsForParticipants() - -> **getRoomsForParticipants**(`userIds`): `Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -Retrieves room IDs for which specific users are participants. - -#### Parameters - -• **userIds**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[] - -An array of UUIDs of the users. - -#### Returns - -`Promise`\<\`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\`[]\> - -A Promise that resolves to an array of room IDs. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`getRoomsForParticipants`](DatabaseAdapter.md#getroomsforparticipants) - -#### Defined in - -[core/src/adapters/sqlite.ts:579](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L579) - ---- - -### log() - -> **log**(`params`): `Promise`\<`void`\> - -Logs an event or action with the specified details. - -#### Parameters - -• **params** - -An object containing parameters for the log entry. - -• **params.body** - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.type**: `string` - -• **params.userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the log entry has been saved. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`log`](DatabaseAdapter.md#log) - -#### Defined in - -[core/src/adapters/sqlite.ts:380](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L380) - ---- - -### removeAllGoals() - -> **removeAllGoals**(`roomId`): `Promise`\<`void`\> - -Removes all goals associated with a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room whose goals should be removed. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when all goals have been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeAllGoals`](DatabaseAdapter.md#removeallgoals) - -#### Defined in - -[core/src/adapters/sqlite.ts:552](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L552) - ---- - -### removeAllMemories() - -> **removeAllMemories**(`roomId`, `tableName`): `Promise`\<`void`\> - -Removes all memories associated with a specific room. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room whose memories should be removed. - -• **tableName**: `string` - -The table from which the memories should be removed. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when all memories have been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeAllMemories`](DatabaseAdapter.md#removeallmemories) - -#### Defined in - -[core/src/adapters/sqlite.ts:460](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L460) - ---- - -### removeGoal() - -> **removeGoal**(`goalId`): `Promise`\<`void`\> - -Removes a specific goal from the database. - -#### Parameters - -• **goalId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the goal to remove. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal has been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeGoal`](DatabaseAdapter.md#removegoal) - -#### Defined in - -[core/src/adapters/sqlite.ts:547](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L547) - ---- - -### removeMemory() - -> **removeMemory**(`memoryId`, `tableName`): `Promise`\<`void`\> - -Removes a specific memory from the database. - -#### Parameters - -• **memoryId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the memory to remove. - -• **tableName**: `string` - -The table from which the memory should be removed. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the memory has been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeMemory`](DatabaseAdapter.md#removememory) - -#### Defined in - -[core/src/adapters/sqlite.ts:455](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L455) - ---- - -### removeParticipant() - -> **removeParticipant**(`userId`, `roomId`): `Promise`\<`boolean`\> - -Removes a user as a participant from a specific room. - -#### Parameters - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the user to remove as a participant. - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room from which the user will be removed. - -#### Returns - -`Promise`\<`boolean`\> - -A Promise that resolves to a boolean indicating success or failure. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeParticipant`](DatabaseAdapter.md#removeparticipant) - -#### Defined in - -[core/src/adapters/sqlite.ts:604](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L604) - ---- - -### removeRoom() - -> **removeRoom**(`roomId`): `Promise`\<`void`\> - -Removes a specific room from the database. - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -The UUID of the room to remove. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the room has been removed. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`removeRoom`](DatabaseAdapter.md#removeroom) - -#### Defined in - -[core/src/adapters/sqlite.ts:568](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L568) - ---- - -### searchMemories() - -> **searchMemories**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -Searches for memories based on embeddings and other specified parameters. - -#### Parameters - -• **params** - -An object containing parameters for the memory search. - -• **params.agentId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.embedding**: `number`[] - -• **params.match_count**: `number` - -• **params.match_threshold**: `number` - -• **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.tableName**: `string` - -• **params.unique**: `boolean` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -A Promise that resolves to an array of Memory objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`searchMemories`](DatabaseAdapter.md#searchmemories) - -#### Defined in - -[core/src/adapters/sqlite.ts:236](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L236) - ---- - -### searchMemoriesByEmbedding() - -> **searchMemoriesByEmbedding**(`embedding`, `params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -Searches for memories by embedding and other specified parameters. - -#### Parameters - -• **embedding**: `number`[] - -The embedding vector to search with. - -• **params** - -Additional parameters for the search. - -• **params.agentId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.count?**: `number` - -• **params.match_threshold?**: `number` - -• **params.roomId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.tableName**: `string` - -• **params.unique?**: `boolean` - -#### Returns - -`Promise`\<[`Memory`](../interfaces/Memory.md)[]\> - -A Promise that resolves to an array of Memory objects. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`searchMemoriesByEmbedding`](DatabaseAdapter.md#searchmemoriesbyembedding) - -#### Defined in - -[core/src/adapters/sqlite.ts:282](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L282) - ---- - -### setParticipantUserState() - -> **setParticipantUserState**(`roomId`, `userId`, `state`): `Promise`\<`void`\> - -#### Parameters - -• **roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **userId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **state**: `"FOLLOWED"` \| `"MUTED"` - -#### Returns - -`Promise`\<`void`\> - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`setParticipantUserState`](DatabaseAdapter.md#setparticipantuserstate) - -#### Defined in - -[core/src/adapters/sqlite.ts:59](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L59) - ---- - -### updateGoal() - -> **updateGoal**(`goal`): `Promise`\<`void`\> - -Updates a specific goal in the database. - -#### Parameters - -• **goal**: [`Goal`](../interfaces/Goal.md) - -The goal object with updated properties. - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal has been updated. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`updateGoal`](DatabaseAdapter.md#updategoal) - -#### Defined in - -[core/src/adapters/sqlite.ts:519](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L519) - ---- - -### updateGoalStatus() - -> **updateGoalStatus**(`params`): `Promise`\<`void`\> - -Updates the status of a specific goal. - -#### Parameters - -• **params** - -An object containing the goalId and the new status. - -• **params.goalId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -• **params.status**: [`GoalStatus`](../enumerations/GoalStatus.md) - -#### Returns - -`Promise`\<`void`\> - -A Promise that resolves when the goal status has been updated. - -#### Overrides - -[`DatabaseAdapter`](DatabaseAdapter.md).[`updateGoalStatus`](DatabaseAdapter.md#updategoalstatus) - -#### Defined in - -[core/src/adapters/sqlite.ts:372](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/adapters/sqlite.ts#L372) diff --git a/docs/docs/api/classes/TelegramClient.md b/docs/docs/api/classes/TelegramClient.md deleted file mode 100644 index 6f29127555..0000000000 --- a/docs/docs/api/classes/TelegramClient.md +++ /dev/null @@ -1,49 +0,0 @@ -# Class: TelegramClient - -## Constructors - -### new TelegramClient() - -> **new TelegramClient**(`runtime`, `botToken`): [`TelegramClient`](TelegramClient.md) - -#### Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -• **botToken**: `string` - -#### Returns - -[`TelegramClient`](TelegramClient.md) - -#### Defined in - -[core/src/clients/telegram/src/index.ts:12](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/telegram/src/index.ts#L12) - -## Methods - -### start() - -> **start**(): `Promise`\<`void`\> - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[core/src/clients/telegram/src/index.ts:54](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/telegram/src/index.ts#L54) - ---- - -### stop() - -> **stop**(): `Promise`\<`void`\> - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[core/src/clients/telegram/src/index.ts:91](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/telegram/src/index.ts#L91) diff --git a/docs/docs/api/classes/TokenProvider.md b/docs/docs/api/classes/TokenProvider.md deleted file mode 100644 index 0e0fb8d77e..0000000000 --- a/docs/docs/api/classes/TokenProvider.md +++ /dev/null @@ -1,193 +0,0 @@ -# Class: TokenProvider - -## Constructors - -### new TokenProvider() - -> **new TokenProvider**(`tokenAddress`): [`TokenProvider`](TokenProvider.md) - -#### Parameters - -• **tokenAddress**: `string` - -#### Returns - -[`TokenProvider`](TokenProvider.md) - -#### Defined in - -[core/src/providers/token.ts:38](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L38) - -## Methods - -### analyzeHolderDistribution() - -> **analyzeHolderDistribution**(`tradeData`): `Promise`\<`string`\> - -#### Parameters - -• **tradeData**: `TokenTradeData` - -#### Returns - -`Promise`\<`string`\> - -#### Defined in - -[core/src/providers/token.ts:461](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L461) - ---- - -### checkRecentTrades() - -> **checkRecentTrades**(`tradeData`): `Promise`\<`boolean`\> - -#### Parameters - -• **tradeData**: `TokenTradeData` - -#### Returns - -`Promise`\<`boolean`\> - -#### Defined in - -[core/src/providers/token.ts:631](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L631) - ---- - -### countHighSupplyHolders() - -> **countHighSupplyHolders**(`securityData`): `Promise`\<`number`\> - -#### Parameters - -• **securityData**: `TokenSecurityData` - -#### Returns - -`Promise`\<`number`\> - -#### Defined in - -[core/src/providers/token.ts:635](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L635) - ---- - -### fetchDexScreenerData() - -> **fetchDexScreenerData**(): `Promise`\<`DexScreenerData`\> - -#### Returns - -`Promise`\<`DexScreenerData`\> - -#### Defined in - -[core/src/providers/token.ts:420](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L420) - ---- - -### fetchHolderList() - -> **fetchHolderList**(): `Promise`\<`HolderData`[]\> - -#### Returns - -`Promise`\<`HolderData`[]\> - -#### Defined in - -[core/src/providers/token.ts:507](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L507) - ---- - -### fetchTokenSecurity() - -> **fetchTokenSecurity**(): `Promise`\<`TokenSecurityData`\> - -#### Returns - -`Promise`\<`TokenSecurityData`\> - -#### Defined in - -[core/src/providers/token.ts:155](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L155) - ---- - -### fetchTokenTradeData() - -> **fetchTokenTradeData**(): `Promise`\<`TokenTradeData`\> - -#### Returns - -`Promise`\<`TokenTradeData`\> - -#### Defined in - -[core/src/providers/token.ts:185](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L185) - ---- - -### filterHighValueHolders() - -> **filterHighValueHolders**(`tradeData`): `Promise`\<`object`[]\> - -#### Parameters - -• **tradeData**: `TokenTradeData` - -#### Returns - -`Promise`\<`object`[]\> - -#### Defined in - -[core/src/providers/token.ts:607](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L607) - ---- - -### formatTokenData() - -> **formatTokenData**(`data`): `string` - -#### Parameters - -• **data**: `ProcessedTokenData` - -#### Returns - -`string` - -#### Defined in - -[core/src/providers/token.ts:722](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L722) - ---- - -### getFormattedTokenReport() - -> **getFormattedTokenReport**(): `Promise`\<`string`\> - -#### Returns - -`Promise`\<`string`\> - -#### Defined in - -[core/src/providers/token.ts:786](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L786) - ---- - -### getProcessedTokenData() - -> **getProcessedTokenData**(): `Promise`\<`ProcessedTokenData`\> - -#### Returns - -`Promise`\<`ProcessedTokenData`\> - -#### Defined in - -[core/src/providers/token.ts:656](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L656) diff --git a/docs/docs/api/classes/TwitterInteractionClient.md b/docs/docs/api/classes/TwitterInteractionClient.md deleted file mode 100644 index 7b06e7039e..0000000000 --- a/docs/docs/api/classes/TwitterInteractionClient.md +++ /dev/null @@ -1,1798 +0,0 @@ -# Class: TwitterInteractionClient - -## Extends - -- `ClientBase` - -## Constructors - -### new TwitterInteractionClient() - -> **new TwitterInteractionClient**(`runtime`): [`TwitterInteractionClient`](TwitterInteractionClient.md) - -#### Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -#### Returns - -[`TwitterInteractionClient`](TwitterInteractionClient.md) - -#### Overrides - -`ClientBase.constructor` - -#### Defined in - -[core/src/clients/twitter/interactions.ts:87](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/interactions.ts#L87) - -## Properties - -### callback() - -> **callback**: (`self`) => `any` = `null` - -#### Parameters - -• **self**: `ClientBase` - -#### Returns - -`any` - -#### Inherited from - -`ClientBase.callback` - -#### Defined in - -[core/src/clients/twitter/base.ts:150](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L150) - ---- - -### directions - -> **directions**: `string` - -#### Inherited from - -`ClientBase.directions` - -#### Defined in - -[core/src/clients/twitter/base.ts:89](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L89) - ---- - -### imageDescriptionService - -> **imageDescriptionService**: `ImageDescriptionService` - -#### Inherited from - -`ClientBase.imageDescriptionService` - -#### Defined in - -[core/src/clients/twitter/base.ts:92](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L92) - ---- - -### lastCheckedTweetId - -> **lastCheckedTweetId**: `number` = `null` - -#### Inherited from - -`ClientBase.lastCheckedTweetId` - -#### Defined in - -[core/src/clients/twitter/base.ts:90](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L90) - ---- - -### requestQueue - -> **requestQueue**: `RequestQueue` - -#### Inherited from - -`ClientBase.requestQueue` - -#### Defined in - -[core/src/clients/twitter/base.ts:96](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L96) - ---- - -### runtime - -> **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -#### Inherited from - -`ClientBase.runtime` - -#### Defined in - -[core/src/clients/twitter/base.ts:88](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L88) - ---- - -### temperature - -> **temperature**: `number` = `0.5` - -#### Inherited from - -`ClientBase.temperature` - -#### Defined in - -[core/src/clients/twitter/base.ts:93](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L93) - ---- - -### tweetCacheFilePath - -> **tweetCacheFilePath**: `string` = `"tweetcache/latest_checked_tweet_id.txt"` - -#### Inherited from - -`ClientBase.tweetCacheFilePath` - -#### Defined in - -[core/src/clients/twitter/base.ts:91](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L91) - ---- - -### twitterClient - -> **twitterClient**: `Scraper` - -#### Inherited from - -`ClientBase.twitterClient` - -#### Defined in - -[core/src/clients/twitter/base.ts:87](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L87) - ---- - -### twitterUserId - -> **twitterUserId**: `string` - -#### Inherited from - -`ClientBase.twitterUserId` - -#### Defined in - -[core/src/clients/twitter/base.ts:97](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L97) - ---- - -### \_twitterClient - -> `static` **\_twitterClient**: `Scraper` - -#### Inherited from - -`ClientBase._twitterClient` - -#### Defined in - -[core/src/clients/twitter/base.ts:86](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L86) - ---- - -### captureRejections - -> `static` **captureRejections**: `boolean` - -Value: [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) - -Change the default `captureRejections` option on all new `EventEmitter` objects. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`ClientBase.captureRejections` - -#### Defined in - -node_modules/@types/node/events.d.ts:459 - ---- - -### captureRejectionSymbol - -> `readonly` `static` **captureRejectionSymbol**: _typeof_ [`captureRejectionSymbol`](TwitterPostClient.md#capturerejectionsymbol) - -Value: `Symbol.for('nodejs.rejection')` - -See how to write a custom `rejection handler`. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`ClientBase.captureRejectionSymbol` - -#### Defined in - -node_modules/@types/node/events.d.ts:452 - ---- - -### defaultMaxListeners - -> `static` **defaultMaxListeners**: `number` - -By default, a maximum of `10` listeners can be registered for any single -event. This limit can be changed for individual `EventEmitter` instances -using the `emitter.setMaxListeners(n)` method. To change the default -for _all_`EventEmitter` instances, the `events.defaultMaxListeners` property -can be used. If this value is not a positive number, a `RangeError` is thrown. - -Take caution when setting the `events.defaultMaxListeners` because the -change affects _all_ `EventEmitter` instances, including those created before -the change is made. However, calling `emitter.setMaxListeners(n)` still has -precedence over `events.defaultMaxListeners`. - -This is not a hard limit. The `EventEmitter` instance will allow -more listeners to be added but will output a trace warning to stderr indicating -that a "possible EventEmitter memory leak" has been detected. For any single -`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()` methods can be used to -temporarily avoid this warning: - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.setMaxListeners(emitter.getMaxListeners() + 1); -emitter.once("event", () => { - // do stuff - emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); -}); -``` - -The `--trace-warnings` command-line flag can be used to display the -stack trace for such warnings. - -The emitted warning can be inspected with `process.on('warning')` and will -have the additional `emitter`, `type`, and `count` properties, referring to -the event emitter instance, the event's name and the number of attached -listeners, respectively. -Its `name` property is set to `'MaxListenersExceededWarning'`. - -#### Since - -v0.11.2 - -#### Inherited from - -`ClientBase.defaultMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:498 - ---- - -### errorMonitor - -> `readonly` `static` **errorMonitor**: _typeof_ [`errorMonitor`](TwitterPostClient.md#errormonitor) - -This symbol shall be used to install a listener for only monitoring `'error'` events. Listeners installed using this symbol are called before the regular `'error'` listeners are called. - -Installing a listener using this symbol does not change the behavior once an `'error'` event is emitted. Therefore, the process will still crash if no -regular `'error'` listener is installed. - -#### Since - -v13.6.0, v12.17.0 - -#### Inherited from - -`ClientBase.errorMonitor` - -#### Defined in - -node_modules/@types/node/events.d.ts:445 - -## Methods - -### \[captureRejectionSymbol\]()? - -> `optional` **\[captureRejectionSymbol\]**\<`K`\>(`error`, `event`, ...`args`): `void` - -#### Type Parameters - -• **K** - -#### Parameters - -• **error**: `Error` - -• **event**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`void` - -#### Inherited from - -`ClientBase.[captureRejectionSymbol]` - -#### Defined in - -node_modules/@types/node/events.d.ts:136 - ---- - -### addListener() - -> **addListener**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.on(eventName, listener)`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.addListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:597 - ---- - -### cacheTweet() - -> **cacheTweet**(`tweet`): `Promise`\<`void`\> - -#### Parameters - -• **tweet**: `Tweet` - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.cacheTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:99](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L99) - ---- - -### emit() - -> **emit**\<`K`\>(`eventName`, ...`args`): `boolean` - -Synchronously calls each of the listeners registered for the event named `eventName`, in the order they were registered, passing the supplied arguments -to each. - -Returns `true` if the event had listeners, `false` otherwise. - -```js -import { EventEmitter } from "node:events"; -const myEmitter = new EventEmitter(); - -// First listener -myEmitter.on("event", function firstListener() { - console.log("Helloooo! first listener"); -}); -// Second listener -myEmitter.on("event", function secondListener(arg1, arg2) { - console.log(`event with parameters ${arg1}, ${arg2} in second listener`); -}); -// Third listener -myEmitter.on("event", function thirdListener(...args) { - const parameters = args.join(", "); - console.log(`event with parameters ${parameters} in third listener`); -}); - -console.log(myEmitter.listeners("event")); - -myEmitter.emit("event", 1, 2, 3, 4, 5); - -// Prints: -// [ -// [Function: firstListener], -// [Function: secondListener], -// [Function: thirdListener] -// ] -// Helloooo! first listener -// event with parameters 1, 2 in second listener -// event with parameters 1, 2, 3, 4, 5 in third listener -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`boolean` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.emit` - -#### Defined in - -node_modules/@types/node/events.d.ts:859 - ---- - -### eventNames() - -> **eventNames**(): (`string` \| `symbol`)[] - -Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or `Symbol`s. - -```js -import { EventEmitter } from "node:events"; - -const myEE = new EventEmitter(); -myEE.on("foo", () => {}); -myEE.on("bar", () => {}); - -const sym = Symbol("symbol"); -myEE.on(sym, () => {}); - -console.log(myEE.eventNames()); -// Prints: [ 'foo', 'bar', Symbol(symbol) ] -``` - -#### Returns - -(`string` \| `symbol`)[] - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.eventNames` - -#### Defined in - -node_modules/@types/node/events.d.ts:922 - ---- - -### fetchHomeTimeline() - -> **fetchHomeTimeline**(`count`): `Promise`\<`Tweet`[]\> - -#### Parameters - -• **count**: `number` - -#### Returns - -`Promise`\<`Tweet`[]\> - -#### Inherited from - -`ClientBase.fetchHomeTimeline` - -#### Defined in - -[core/src/clients/twitter/base.ts:278](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L278) - ---- - -### fetchSearchTweets() - -> **fetchSearchTweets**(`query`, `maxTweets`, `searchMode`, `cursor`?): `Promise`\<`QueryTweetsResponse`\> - -#### Parameters - -• **query**: `string` - -• **maxTweets**: `number` - -• **searchMode**: `SearchMode` - -• **cursor?**: `string` - -#### Returns - -`Promise`\<`QueryTweetsResponse`\> - -#### Inherited from - -`ClientBase.fetchSearchTweets` - -#### Defined in - -[core/src/clients/twitter/base.ts:330](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L330) - ---- - -### getCachedTweet() - -> **getCachedTweet**(`tweetId`): `Promise`\<`Tweet`\> - -#### Parameters - -• **tweetId**: `string` - -#### Returns - -`Promise`\<`Tweet`\> - -#### Inherited from - -`ClientBase.getCachedTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:115](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L115) - ---- - -### getMaxListeners() - -> **getMaxListeners**(): `number` - -Returns the current max listener value for the `EventEmitter` which is either -set by `emitter.setMaxListeners(n)` or defaults to [defaultMaxListeners](TwitterInteractionClient.md#defaultmaxlisteners). - -#### Returns - -`number` - -#### Since - -v1.0.0 - -#### Inherited from - -`ClientBase.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:774 - ---- - -### getTweet() - -> **getTweet**(`tweetId`): `Promise`\<`Tweet`\> - -#### Parameters - -• **tweetId**: `string` - -#### Returns - -`Promise`\<`Tweet`\> - -#### Inherited from - -`ClientBase.getTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:137](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L137) - ---- - -### handleTwitterInteractions() - -> **handleTwitterInteractions**(): `Promise`\<`void`\> - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[core/src/clients/twitter/interactions.ts:93](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/interactions.ts#L93) - ---- - -### listenerCount() - -> **listenerCount**\<`K`\>(`eventName`, `listener`?): `number` - -Returns the number of listeners listening for the event named `eventName`. -If `listener` is provided, it will return how many times the listener is found -in the list of the listeners of the event. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event being listened for - -• **listener?**: `Function` - -The event handler function - -#### Returns - -`number` - -#### Since - -v3.2.0 - -#### Inherited from - -`ClientBase.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:868 - ---- - -### listeners() - -> **listeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -console.log(util.inspect(server.listeners("connection"))); -// Prints: [ [Function] ] -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.listeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:787 - ---- - -### off() - -> **off**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.removeListener()`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v10.0.0 - -#### Inherited from - -`ClientBase.off` - -#### Defined in - -node_modules/@types/node/events.d.ts:747 - ---- - -### on() - -> **on**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the end of the listeners array for the event -named `eventName`. No checks are made to see if the `listener` has already -been added. Multiple calls passing the same combination of `eventName` and -`listener` will result in the `listener` being added, and called, multiple times. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.on("foo", () => console.log("a")); -myEE.prependListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.1.101 - -#### Inherited from - -`ClientBase.on` - -#### Defined in - -node_modules/@types/node/events.d.ts:629 - ---- - -### once() - -> **once**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time** `listener` function for the event named `eventName`. The -next time `eventName` is triggered, this listener is removed and then invoked. - -```js -server.once("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependOnceListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.once("foo", () => console.log("a")); -myEE.prependOnceListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.3.0 - -#### Inherited from - -`ClientBase.once` - -#### Defined in - -node_modules/@types/node/events.d.ts:659 - ---- - -### onReady() - -> **onReady**(): `void` - -#### Returns - -`void` - -#### Overrides - -`ClientBase.onReady` - -#### Defined in - -[core/src/clients/twitter/interactions.ts:76](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/interactions.ts#L76) - ---- - -### prependListener() - -> **prependListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the _beginning_ of the listeners array for the -event named `eventName`. No checks are made to see if the `listener` has -already been added. Multiple calls passing the same combination of `eventName` -and `listener` will result in the `listener` being added, and called, multiple times. - -```js -server.prependListener("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.prependListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:886 - ---- - -### prependOnceListener() - -> **prependOnceListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time**`listener` function for the event named `eventName` to the _beginning_ of the listeners array. The next time `eventName` is triggered, this -listener is removed, and then invoked. - -```js -server.prependOnceListener("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.prependOnceListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:902 - ---- - -### rawListeners() - -> **rawListeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`, -including any wrappers (such as those created by `.once()`). - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.once("log", () => console.log("log once")); - -// Returns a new Array with a function `onceWrapper` which has a property -// `listener` which contains the original listener bound above -const listeners = emitter.rawListeners("log"); -const logFnWrapper = listeners[0]; - -// Logs "log once" to the console and does not unbind the `once` event -logFnWrapper.listener(); - -// Logs "log once" to the console and removes the listener -logFnWrapper(); - -emitter.on("log", () => console.log("log persistently")); -// Will return a new Array with a single function bound by `.on()` above -const newListeners = emitter.rawListeners("log"); - -// Logs "log persistently" twice -newListeners[0](); -emitter.emit("log"); -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v9.4.0 - -#### Inherited from - -`ClientBase.rawListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:818 - ---- - -### removeAllListeners() - -> **removeAllListeners**(`eventName`?): `this` - -Removes all listeners, or those of the specified `eventName`. - -It is bad practice to remove listeners added elsewhere in the code, -particularly when the `EventEmitter` instance was created by some other -component or module (e.g. sockets or file streams). - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **eventName?**: `string` \| `symbol` - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.removeAllListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:758 - ---- - -### removeListener() - -> **removeListener**\<`K`\>(`eventName`, `listener`): `this` - -Removes the specified `listener` from the listener array for the event named `eventName`. - -```js -const callback = (stream) => { - console.log("someone connected!"); -}; -server.on("connection", callback); -// ... -server.removeListener("connection", callback); -``` - -`removeListener()` will remove, at most, one instance of a listener from the -listener array. If any single listener has been added multiple times to the -listener array for the specified `eventName`, then `removeListener()` must be -called multiple times to remove each instance. - -Once an event is emitted, all listeners attached to it at the -time of emitting are called in order. This implies that any `removeListener()` or `removeAllListeners()` calls _after_ emitting and _before_ the last listener finishes execution -will not remove them from`emit()` in progress. Subsequent events behave as expected. - -```js -import { EventEmitter } from "node:events"; -class MyEmitter extends EventEmitter {} -const myEmitter = new MyEmitter(); - -const callbackA = () => { - console.log("A"); - myEmitter.removeListener("event", callbackB); -}; - -const callbackB = () => { - console.log("B"); -}; - -myEmitter.on("event", callbackA); - -myEmitter.on("event", callbackB); - -// callbackA removes listener callbackB but it will still be called. -// Internal listener array at time of emit [callbackA, callbackB] -myEmitter.emit("event"); -// Prints: -// A -// B - -// callbackB is now removed. -// Internal listener array [callbackA] -myEmitter.emit("event"); -// Prints: -// A -``` - -Because listeners are managed using an internal array, calling this will -change the position indices of any listener registered _after_ the listener -being removed. This will not impact the order in which listeners are called, -but it means that any copies of the listener array as returned by -the `emitter.listeners()` method will need to be recreated. - -When a single function has been added as a handler multiple times for a single -event (as in the example below), `removeListener()` will remove the most -recently added instance. In the example the `once('ping')` listener is removed: - -```js -import { EventEmitter } from "node:events"; -const ee = new EventEmitter(); - -function pong() { - console.log("pong"); -} - -ee.on("ping", pong); -ee.once("ping", pong); -ee.removeListener("ping", pong); - -ee.emit("ping"); -ee.emit("ping"); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.removeListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:742 - ---- - -### saveRequestMessage() - -> **saveRequestMessage**(`message`, `state`): `Promise`\<`void`\> - -#### Parameters - -• **message**: [`Memory`](../interfaces/Memory.md) - -• **state**: [`State`](../interfaces/State.md) - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.saveRequestMessage` - -#### Defined in - -[core/src/clients/twitter/base.ts:572](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L572) - ---- - -### setCookiesFromArray() - -> **setCookiesFromArray**(`cookiesArray`): `Promise`\<`void`\> - -#### Parameters - -• **cookiesArray**: `any`[] - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.setCookiesFromArray` - -#### Defined in - -[core/src/clients/twitter/base.ts:560](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L560) - ---- - -### setMaxListeners() - -> **setMaxListeners**(`n`): `this` - -By default `EventEmitter`s will print a warning if more than `10` listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The `emitter.setMaxListeners()` method allows the limit to be -modified for this specific `EventEmitter` instance. The value can be set to `Infinity` (or `0`) to indicate an unlimited number of listeners. - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **n**: `number` - -#### Returns - -`this` - -#### Since - -v0.3.5 - -#### Inherited from - -`ClientBase.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:768 - ---- - -### addAbortListener() - -> `static` **addAbortListener**(`signal`, `resource`): `Disposable` - -**`Experimental`** - -Listens once to the `abort` event on the provided `signal`. - -Listening to the `abort` event on abort signals is unsafe and may -lead to resource leaks since another third party with the signal can -call `e.stopImmediatePropagation()`. Unfortunately Node.js cannot change -this since it would violate the web standard. Additionally, the original -API makes it easy to forget to remove listeners. - -This API allows safely using `AbortSignal`s in Node.js APIs by solving these -two issues by listening to the event such that `stopImmediatePropagation` does -not prevent the listener from running. - -Returns a disposable so that it may be unsubscribed from more easily. - -```js -import { addAbortListener } from "node:events"; - -function example(signal) { - let disposable; - try { - signal.addEventListener("abort", (e) => e.stopImmediatePropagation()); - disposable = addAbortListener(signal, (e) => { - // Do something when signal is aborted. - }); - } finally { - disposable?.[Symbol.dispose](); - } -} -``` - -#### Parameters - -• **signal**: `AbortSignal` - -• **resource** - -#### Returns - -`Disposable` - -Disposable that removes the `abort` listener. - -#### Since - -v20.5.0 - -#### Inherited from - -`ClientBase.addAbortListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:437 - ---- - -### getEventListeners() - -> `static` **getEventListeners**(`emitter`, `name`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -For `EventEmitter`s this behaves exactly the same as calling `.listeners` on -the emitter. - -For `EventTarget`s this is the only way to get the event listeners for the -event target. This is useful for debugging and diagnostic purposes. - -```js -import { getEventListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - const listener = () => console.log("Events are fun"); - ee.on("foo", listener); - console.log(getEventListeners(ee, "foo")); // [ [Function: listener] ] -} -{ - const et = new EventTarget(); - const listener = () => console.log("Events are fun"); - et.addEventListener("foo", listener); - console.log(getEventListeners(et, "foo")); // [ [Function: listener] ] -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -• **name**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v15.2.0, v14.17.0 - -#### Inherited from - -`ClientBase.getEventListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:358 - ---- - -### getMaxListeners() - -> `static` **getMaxListeners**(`emitter`): `number` - -Returns the currently set max amount of listeners. - -For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on -the emitter. - -For `EventTarget`s this is the only way to get the max event listeners for the -event target. If the number of event handlers on a single EventTarget exceeds -the max set, the EventTarget will print a warning. - -```js -import { getMaxListeners, setMaxListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - console.log(getMaxListeners(ee)); // 10 - setMaxListeners(11, ee); - console.log(getMaxListeners(ee)); // 11 -} -{ - const et = new EventTarget(); - console.log(getMaxListeners(et)); // 10 - setMaxListeners(11, et); - console.log(getMaxListeners(et)); // 11 -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -#### Returns - -`number` - -#### Since - -v19.9.0 - -#### Inherited from - -`ClientBase.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:387 - ---- - -### ~~listenerCount()~~ - -> `static` **listenerCount**(`emitter`, `eventName`): `number` - -A class method that returns the number of listeners for the given `eventName` registered on the given `emitter`. - -```js -import { EventEmitter, listenerCount } from "node:events"; - -const myEmitter = new EventEmitter(); -myEmitter.on("event", () => {}); -myEmitter.on("event", () => {}); -console.log(listenerCount(myEmitter, "event")); -// Prints: 2 -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -The emitter to query - -• **eventName**: `string` \| `symbol` - -The event name - -#### Returns - -`number` - -#### Since - -v0.9.12 - -#### Deprecated - -Since v3.2.0 - Use `listenerCount` instead. - -#### Inherited from - -`ClientBase.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:330 - ---- - -### on() - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); -}); - -for await (const event of on(ee, "foo")) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] -} -// Unreachable here -``` - -Returns an `AsyncIterator` that iterates `eventName` events. It will throw -if the `EventEmitter` emits `'error'`. It removes all listeners when -exiting the loop. The `value` returned by each iteration is an array -composed of the emitted event arguments. - -An `AbortSignal` can be used to cancel waiting on events: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ac = new AbortController(); - -(async () => { - const ee = new EventEmitter(); - - // Emit later on - process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - }); - - for await (const event of on(ee, "foo", { signal: ac.signal })) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] - } - // Unreachable here -})(); - -process.nextTick(() => ac.abort()); -``` - -Use the `close` option to specify an array of event names that will end the iteration: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - ee.emit("close"); -}); - -for await (const event of on(ee, "foo", { close: ["close"] })) { - console.log(event); // prints ['bar'] [42] -} -// the loop will exit after 'close' is emitted -console.log("done"); // prints 'done' -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -An `AsyncIterator` that iterates `eventName` events emitted by the `emitter` - -##### Since - -v13.6.0, v12.16.0 - -##### Inherited from - -`ClientBase.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:303 - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -##### Inherited from - -`ClientBase.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:308 - ---- - -### once() - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given -event or that is rejected if the `EventEmitter` emits `'error'` while waiting. -The `Promise` will resolve with an array of all the arguments emitted to the -given event. - -This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event -semantics and does not listen to the `'error'` event. - -```js -import { once, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -process.nextTick(() => { - ee.emit("myevent", 42); -}); - -const [value] = await once(ee, "myevent"); -console.log(value); - -const err = new Error("kaboom"); -process.nextTick(() => { - ee.emit("error", err); -}); - -try { - await once(ee, "myevent"); -} catch (err) { - console.error("error happened", err); -} -``` - -The special handling of the `'error'` event is only used when `events.once()` is used to wait for another event. If `events.once()` is used to wait for the -'`error'` event itself, then it is treated as any other kind of event without -special handling: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); - -once(ee, "error") - .then(([err]) => console.log("ok", err.message)) - .catch((err) => console.error("error", err.message)); - -ee.emit("error", new Error("boom")); - -// Prints: ok boom -``` - -An `AbortSignal` can be used to cancel waiting for the event: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); -const ac = new AbortController(); - -async function foo(emitter, event, signal) { - try { - await once(emitter, event, { signal }); - console.log("event emitted!"); - } catch (error) { - if (error.name === "AbortError") { - console.error("Waiting for the event was canceled!"); - } else { - console.error("There was an error", error.message); - } - } -} - -foo(ee, "foo", ac.signal); -ac.abort(); // Abort waiting for the event -ee.emit("foo"); // Prints: Waiting for the event was canceled! -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Since - -v11.13.0, v10.16.0 - -##### Inherited from - -`ClientBase.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:217 - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Inherited from - -`ClientBase.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:222 - ---- - -### setMaxListeners() - -> `static` **setMaxListeners**(`n`?, ...`eventTargets`?): `void` - -```js -import { setMaxListeners, EventEmitter } from "node:events"; - -const target = new EventTarget(); -const emitter = new EventEmitter(); - -setMaxListeners(5, target, emitter); -``` - -#### Parameters - -• **n?**: `number` - -A non-negative number. The maximum number of listeners per `EventTarget` event. - -• ...**eventTargets?**: (`EventEmitter`\<`DefaultEventMap`\> \| `EventTarget`)[] - -Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, `n` is set as the default max for all newly created {EventTarget} and {EventEmitter} -objects. - -#### Returns - -`void` - -#### Since - -v15.4.0 - -#### Inherited from - -`ClientBase.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:402 diff --git a/docs/docs/api/classes/TwitterPostClient.md b/docs/docs/api/classes/TwitterPostClient.md deleted file mode 100644 index fbf83d8f83..0000000000 --- a/docs/docs/api/classes/TwitterPostClient.md +++ /dev/null @@ -1,1784 +0,0 @@ -# Class: TwitterPostClient - -## Extends - -- `ClientBase` - -## Constructors - -### new TwitterPostClient() - -> **new TwitterPostClient**(`runtime`): [`TwitterPostClient`](TwitterPostClient.md) - -#### Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -#### Returns - -[`TwitterPostClient`](TwitterPostClient.md) - -#### Overrides - -`ClientBase.constructor` - -#### Defined in - -[core/src/clients/twitter/post.ts:41](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/post.ts#L41) - -## Properties - -### callback() - -> **callback**: (`self`) => `any` = `null` - -#### Parameters - -• **self**: `ClientBase` - -#### Returns - -`any` - -#### Inherited from - -`ClientBase.callback` - -#### Defined in - -[core/src/clients/twitter/base.ts:150](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L150) - ---- - -### directions - -> **directions**: `string` - -#### Inherited from - -`ClientBase.directions` - -#### Defined in - -[core/src/clients/twitter/base.ts:89](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L89) - ---- - -### imageDescriptionService - -> **imageDescriptionService**: `ImageDescriptionService` - -#### Inherited from - -`ClientBase.imageDescriptionService` - -#### Defined in - -[core/src/clients/twitter/base.ts:92](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L92) - ---- - -### lastCheckedTweetId - -> **lastCheckedTweetId**: `number` = `null` - -#### Inherited from - -`ClientBase.lastCheckedTweetId` - -#### Defined in - -[core/src/clients/twitter/base.ts:90](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L90) - ---- - -### requestQueue - -> **requestQueue**: `RequestQueue` - -#### Inherited from - -`ClientBase.requestQueue` - -#### Defined in - -[core/src/clients/twitter/base.ts:96](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L96) - ---- - -### runtime - -> **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -#### Inherited from - -`ClientBase.runtime` - -#### Defined in - -[core/src/clients/twitter/base.ts:88](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L88) - ---- - -### temperature - -> **temperature**: `number` = `0.5` - -#### Inherited from - -`ClientBase.temperature` - -#### Defined in - -[core/src/clients/twitter/base.ts:93](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L93) - ---- - -### tweetCacheFilePath - -> **tweetCacheFilePath**: `string` = `"tweetcache/latest_checked_tweet_id.txt"` - -#### Inherited from - -`ClientBase.tweetCacheFilePath` - -#### Defined in - -[core/src/clients/twitter/base.ts:91](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L91) - ---- - -### twitterClient - -> **twitterClient**: `Scraper` - -#### Inherited from - -`ClientBase.twitterClient` - -#### Defined in - -[core/src/clients/twitter/base.ts:87](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L87) - ---- - -### twitterUserId - -> **twitterUserId**: `string` - -#### Inherited from - -`ClientBase.twitterUserId` - -#### Defined in - -[core/src/clients/twitter/base.ts:97](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L97) - ---- - -### \_twitterClient - -> `static` **\_twitterClient**: `Scraper` - -#### Inherited from - -`ClientBase._twitterClient` - -#### Defined in - -[core/src/clients/twitter/base.ts:86](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L86) - ---- - -### captureRejections - -> `static` **captureRejections**: `boolean` - -Value: [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) - -Change the default `captureRejections` option on all new `EventEmitter` objects. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`ClientBase.captureRejections` - -#### Defined in - -node_modules/@types/node/events.d.ts:459 - ---- - -### captureRejectionSymbol - -> `readonly` `static` **captureRejectionSymbol**: _typeof_ [`captureRejectionSymbol`](TwitterPostClient.md#capturerejectionsymbol) - -Value: `Symbol.for('nodejs.rejection')` - -See how to write a custom `rejection handler`. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`ClientBase.captureRejectionSymbol` - -#### Defined in - -node_modules/@types/node/events.d.ts:452 - ---- - -### defaultMaxListeners - -> `static` **defaultMaxListeners**: `number` - -By default, a maximum of `10` listeners can be registered for any single -event. This limit can be changed for individual `EventEmitter` instances -using the `emitter.setMaxListeners(n)` method. To change the default -for _all_`EventEmitter` instances, the `events.defaultMaxListeners` property -can be used. If this value is not a positive number, a `RangeError` is thrown. - -Take caution when setting the `events.defaultMaxListeners` because the -change affects _all_ `EventEmitter` instances, including those created before -the change is made. However, calling `emitter.setMaxListeners(n)` still has -precedence over `events.defaultMaxListeners`. - -This is not a hard limit. The `EventEmitter` instance will allow -more listeners to be added but will output a trace warning to stderr indicating -that a "possible EventEmitter memory leak" has been detected. For any single -`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()` methods can be used to -temporarily avoid this warning: - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.setMaxListeners(emitter.getMaxListeners() + 1); -emitter.once("event", () => { - // do stuff - emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); -}); -``` - -The `--trace-warnings` command-line flag can be used to display the -stack trace for such warnings. - -The emitted warning can be inspected with `process.on('warning')` and will -have the additional `emitter`, `type`, and `count` properties, referring to -the event emitter instance, the event's name and the number of attached -listeners, respectively. -Its `name` property is set to `'MaxListenersExceededWarning'`. - -#### Since - -v0.11.2 - -#### Inherited from - -`ClientBase.defaultMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:498 - ---- - -### errorMonitor - -> `readonly` `static` **errorMonitor**: _typeof_ [`errorMonitor`](TwitterPostClient.md#errormonitor) - -This symbol shall be used to install a listener for only monitoring `'error'` events. Listeners installed using this symbol are called before the regular `'error'` listeners are called. - -Installing a listener using this symbol does not change the behavior once an `'error'` event is emitted. Therefore, the process will still crash if no -regular `'error'` listener is installed. - -#### Since - -v13.6.0, v12.17.0 - -#### Inherited from - -`ClientBase.errorMonitor` - -#### Defined in - -node_modules/@types/node/events.d.ts:445 - -## Methods - -### \[captureRejectionSymbol\]()? - -> `optional` **\[captureRejectionSymbol\]**\<`K`\>(`error`, `event`, ...`args`): `void` - -#### Type Parameters - -• **K** - -#### Parameters - -• **error**: `Error` - -• **event**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`void` - -#### Inherited from - -`ClientBase.[captureRejectionSymbol]` - -#### Defined in - -node_modules/@types/node/events.d.ts:136 - ---- - -### addListener() - -> **addListener**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.on(eventName, listener)`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.addListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:597 - ---- - -### cacheTweet() - -> **cacheTweet**(`tweet`): `Promise`\<`void`\> - -#### Parameters - -• **tweet**: `Tweet` - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.cacheTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:99](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L99) - ---- - -### emit() - -> **emit**\<`K`\>(`eventName`, ...`args`): `boolean` - -Synchronously calls each of the listeners registered for the event named `eventName`, in the order they were registered, passing the supplied arguments -to each. - -Returns `true` if the event had listeners, `false` otherwise. - -```js -import { EventEmitter } from "node:events"; -const myEmitter = new EventEmitter(); - -// First listener -myEmitter.on("event", function firstListener() { - console.log("Helloooo! first listener"); -}); -// Second listener -myEmitter.on("event", function secondListener(arg1, arg2) { - console.log(`event with parameters ${arg1}, ${arg2} in second listener`); -}); -// Third listener -myEmitter.on("event", function thirdListener(...args) { - const parameters = args.join(", "); - console.log(`event with parameters ${parameters} in third listener`); -}); - -console.log(myEmitter.listeners("event")); - -myEmitter.emit("event", 1, 2, 3, 4, 5); - -// Prints: -// [ -// [Function: firstListener], -// [Function: secondListener], -// [Function: thirdListener] -// ] -// Helloooo! first listener -// event with parameters 1, 2 in second listener -// event with parameters 1, 2, 3, 4, 5 in third listener -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`boolean` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.emit` - -#### Defined in - -node_modules/@types/node/events.d.ts:859 - ---- - -### eventNames() - -> **eventNames**(): (`string` \| `symbol`)[] - -Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or `Symbol`s. - -```js -import { EventEmitter } from "node:events"; - -const myEE = new EventEmitter(); -myEE.on("foo", () => {}); -myEE.on("bar", () => {}); - -const sym = Symbol("symbol"); -myEE.on(sym, () => {}); - -console.log(myEE.eventNames()); -// Prints: [ 'foo', 'bar', Symbol(symbol) ] -``` - -#### Returns - -(`string` \| `symbol`)[] - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.eventNames` - -#### Defined in - -node_modules/@types/node/events.d.ts:922 - ---- - -### fetchHomeTimeline() - -> **fetchHomeTimeline**(`count`): `Promise`\<`Tweet`[]\> - -#### Parameters - -• **count**: `number` - -#### Returns - -`Promise`\<`Tweet`[]\> - -#### Inherited from - -`ClientBase.fetchHomeTimeline` - -#### Defined in - -[core/src/clients/twitter/base.ts:278](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L278) - ---- - -### fetchSearchTweets() - -> **fetchSearchTweets**(`query`, `maxTweets`, `searchMode`, `cursor`?): `Promise`\<`QueryTweetsResponse`\> - -#### Parameters - -• **query**: `string` - -• **maxTweets**: `number` - -• **searchMode**: `SearchMode` - -• **cursor?**: `string` - -#### Returns - -`Promise`\<`QueryTweetsResponse`\> - -#### Inherited from - -`ClientBase.fetchSearchTweets` - -#### Defined in - -[core/src/clients/twitter/base.ts:330](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L330) - ---- - -### getCachedTweet() - -> **getCachedTweet**(`tweetId`): `Promise`\<`Tweet`\> - -#### Parameters - -• **tweetId**: `string` - -#### Returns - -`Promise`\<`Tweet`\> - -#### Inherited from - -`ClientBase.getCachedTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:115](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L115) - ---- - -### getMaxListeners() - -> **getMaxListeners**(): `number` - -Returns the current max listener value for the `EventEmitter` which is either -set by `emitter.setMaxListeners(n)` or defaults to [defaultMaxListeners](TwitterPostClient.md#defaultmaxlisteners). - -#### Returns - -`number` - -#### Since - -v1.0.0 - -#### Inherited from - -`ClientBase.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:774 - ---- - -### getTweet() - -> **getTweet**(`tweetId`): `Promise`\<`Tweet`\> - -#### Parameters - -• **tweetId**: `string` - -#### Returns - -`Promise`\<`Tweet`\> - -#### Inherited from - -`ClientBase.getTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:137](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L137) - ---- - -### listenerCount() - -> **listenerCount**\<`K`\>(`eventName`, `listener`?): `number` - -Returns the number of listeners listening for the event named `eventName`. -If `listener` is provided, it will return how many times the listener is found -in the list of the listeners of the event. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event being listened for - -• **listener?**: `Function` - -The event handler function - -#### Returns - -`number` - -#### Since - -v3.2.0 - -#### Inherited from - -`ClientBase.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:868 - ---- - -### listeners() - -> **listeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -console.log(util.inspect(server.listeners("connection"))); -// Prints: [ [Function] ] -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.listeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:787 - ---- - -### off() - -> **off**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.removeListener()`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v10.0.0 - -#### Inherited from - -`ClientBase.off` - -#### Defined in - -node_modules/@types/node/events.d.ts:747 - ---- - -### on() - -> **on**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the end of the listeners array for the event -named `eventName`. No checks are made to see if the `listener` has already -been added. Multiple calls passing the same combination of `eventName` and -`listener` will result in the `listener` being added, and called, multiple times. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.on("foo", () => console.log("a")); -myEE.prependListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.1.101 - -#### Inherited from - -`ClientBase.on` - -#### Defined in - -node_modules/@types/node/events.d.ts:629 - ---- - -### once() - -> **once**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time** `listener` function for the event named `eventName`. The -next time `eventName` is triggered, this listener is removed and then invoked. - -```js -server.once("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependOnceListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.once("foo", () => console.log("a")); -myEE.prependOnceListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.3.0 - -#### Inherited from - -`ClientBase.once` - -#### Defined in - -node_modules/@types/node/events.d.ts:659 - ---- - -### onReady() - -> **onReady**(): `void` - -#### Returns - -`void` - -#### Overrides - -`ClientBase.onReady` - -#### Defined in - -[core/src/clients/twitter/post.ts:28](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/post.ts#L28) - ---- - -### prependListener() - -> **prependListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the _beginning_ of the listeners array for the -event named `eventName`. No checks are made to see if the `listener` has -already been added. Multiple calls passing the same combination of `eventName` -and `listener` will result in the `listener` being added, and called, multiple times. - -```js -server.prependListener("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.prependListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:886 - ---- - -### prependOnceListener() - -> **prependOnceListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time**`listener` function for the event named `eventName` to the _beginning_ of the listeners array. The next time `eventName` is triggered, this -listener is removed, and then invoked. - -```js -server.prependOnceListener("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.prependOnceListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:902 - ---- - -### rawListeners() - -> **rawListeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`, -including any wrappers (such as those created by `.once()`). - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.once("log", () => console.log("log once")); - -// Returns a new Array with a function `onceWrapper` which has a property -// `listener` which contains the original listener bound above -const listeners = emitter.rawListeners("log"); -const logFnWrapper = listeners[0]; - -// Logs "log once" to the console and does not unbind the `once` event -logFnWrapper.listener(); - -// Logs "log once" to the console and removes the listener -logFnWrapper(); - -emitter.on("log", () => console.log("log persistently")); -// Will return a new Array with a single function bound by `.on()` above -const newListeners = emitter.rawListeners("log"); - -// Logs "log persistently" twice -newListeners[0](); -emitter.emit("log"); -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v9.4.0 - -#### Inherited from - -`ClientBase.rawListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:818 - ---- - -### removeAllListeners() - -> **removeAllListeners**(`eventName`?): `this` - -Removes all listeners, or those of the specified `eventName`. - -It is bad practice to remove listeners added elsewhere in the code, -particularly when the `EventEmitter` instance was created by some other -component or module (e.g. sockets or file streams). - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **eventName?**: `string` \| `symbol` - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.removeAllListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:758 - ---- - -### removeListener() - -> **removeListener**\<`K`\>(`eventName`, `listener`): `this` - -Removes the specified `listener` from the listener array for the event named `eventName`. - -```js -const callback = (stream) => { - console.log("someone connected!"); -}; -server.on("connection", callback); -// ... -server.removeListener("connection", callback); -``` - -`removeListener()` will remove, at most, one instance of a listener from the -listener array. If any single listener has been added multiple times to the -listener array for the specified `eventName`, then `removeListener()` must be -called multiple times to remove each instance. - -Once an event is emitted, all listeners attached to it at the -time of emitting are called in order. This implies that any `removeListener()` or `removeAllListeners()` calls _after_ emitting and _before_ the last listener finishes execution -will not remove them from`emit()` in progress. Subsequent events behave as expected. - -```js -import { EventEmitter } from "node:events"; -class MyEmitter extends EventEmitter {} -const myEmitter = new MyEmitter(); - -const callbackA = () => { - console.log("A"); - myEmitter.removeListener("event", callbackB); -}; - -const callbackB = () => { - console.log("B"); -}; - -myEmitter.on("event", callbackA); - -myEmitter.on("event", callbackB); - -// callbackA removes listener callbackB but it will still be called. -// Internal listener array at time of emit [callbackA, callbackB] -myEmitter.emit("event"); -// Prints: -// A -// B - -// callbackB is now removed. -// Internal listener array [callbackA] -myEmitter.emit("event"); -// Prints: -// A -``` - -Because listeners are managed using an internal array, calling this will -change the position indices of any listener registered _after_ the listener -being removed. This will not impact the order in which listeners are called, -but it means that any copies of the listener array as returned by -the `emitter.listeners()` method will need to be recreated. - -When a single function has been added as a handler multiple times for a single -event (as in the example below), `removeListener()` will remove the most -recently added instance. In the example the `once('ping')` listener is removed: - -```js -import { EventEmitter } from "node:events"; -const ee = new EventEmitter(); - -function pong() { - console.log("pong"); -} - -ee.on("ping", pong); -ee.once("ping", pong); -ee.removeListener("ping", pong); - -ee.emit("ping"); -ee.emit("ping"); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.removeListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:742 - ---- - -### saveRequestMessage() - -> **saveRequestMessage**(`message`, `state`): `Promise`\<`void`\> - -#### Parameters - -• **message**: [`Memory`](../interfaces/Memory.md) - -• **state**: [`State`](../interfaces/State.md) - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.saveRequestMessage` - -#### Defined in - -[core/src/clients/twitter/base.ts:572](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L572) - ---- - -### setCookiesFromArray() - -> **setCookiesFromArray**(`cookiesArray`): `Promise`\<`void`\> - -#### Parameters - -• **cookiesArray**: `any`[] - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.setCookiesFromArray` - -#### Defined in - -[core/src/clients/twitter/base.ts:560](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L560) - ---- - -### setMaxListeners() - -> **setMaxListeners**(`n`): `this` - -By default `EventEmitter`s will print a warning if more than `10` listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The `emitter.setMaxListeners()` method allows the limit to be -modified for this specific `EventEmitter` instance. The value can be set to `Infinity` (or `0`) to indicate an unlimited number of listeners. - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **n**: `number` - -#### Returns - -`this` - -#### Since - -v0.3.5 - -#### Inherited from - -`ClientBase.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:768 - ---- - -### addAbortListener() - -> `static` **addAbortListener**(`signal`, `resource`): `Disposable` - -**`Experimental`** - -Listens once to the `abort` event on the provided `signal`. - -Listening to the `abort` event on abort signals is unsafe and may -lead to resource leaks since another third party with the signal can -call `e.stopImmediatePropagation()`. Unfortunately Node.js cannot change -this since it would violate the web standard. Additionally, the original -API makes it easy to forget to remove listeners. - -This API allows safely using `AbortSignal`s in Node.js APIs by solving these -two issues by listening to the event such that `stopImmediatePropagation` does -not prevent the listener from running. - -Returns a disposable so that it may be unsubscribed from more easily. - -```js -import { addAbortListener } from "node:events"; - -function example(signal) { - let disposable; - try { - signal.addEventListener("abort", (e) => e.stopImmediatePropagation()); - disposable = addAbortListener(signal, (e) => { - // Do something when signal is aborted. - }); - } finally { - disposable?.[Symbol.dispose](); - } -} -``` - -#### Parameters - -• **signal**: `AbortSignal` - -• **resource** - -#### Returns - -`Disposable` - -Disposable that removes the `abort` listener. - -#### Since - -v20.5.0 - -#### Inherited from - -`ClientBase.addAbortListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:437 - ---- - -### getEventListeners() - -> `static` **getEventListeners**(`emitter`, `name`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -For `EventEmitter`s this behaves exactly the same as calling `.listeners` on -the emitter. - -For `EventTarget`s this is the only way to get the event listeners for the -event target. This is useful for debugging and diagnostic purposes. - -```js -import { getEventListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - const listener = () => console.log("Events are fun"); - ee.on("foo", listener); - console.log(getEventListeners(ee, "foo")); // [ [Function: listener] ] -} -{ - const et = new EventTarget(); - const listener = () => console.log("Events are fun"); - et.addEventListener("foo", listener); - console.log(getEventListeners(et, "foo")); // [ [Function: listener] ] -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -• **name**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v15.2.0, v14.17.0 - -#### Inherited from - -`ClientBase.getEventListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:358 - ---- - -### getMaxListeners() - -> `static` **getMaxListeners**(`emitter`): `number` - -Returns the currently set max amount of listeners. - -For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on -the emitter. - -For `EventTarget`s this is the only way to get the max event listeners for the -event target. If the number of event handlers on a single EventTarget exceeds -the max set, the EventTarget will print a warning. - -```js -import { getMaxListeners, setMaxListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - console.log(getMaxListeners(ee)); // 10 - setMaxListeners(11, ee); - console.log(getMaxListeners(ee)); // 11 -} -{ - const et = new EventTarget(); - console.log(getMaxListeners(et)); // 10 - setMaxListeners(11, et); - console.log(getMaxListeners(et)); // 11 -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -#### Returns - -`number` - -#### Since - -v19.9.0 - -#### Inherited from - -`ClientBase.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:387 - ---- - -### ~~listenerCount()~~ - -> `static` **listenerCount**(`emitter`, `eventName`): `number` - -A class method that returns the number of listeners for the given `eventName` registered on the given `emitter`. - -```js -import { EventEmitter, listenerCount } from "node:events"; - -const myEmitter = new EventEmitter(); -myEmitter.on("event", () => {}); -myEmitter.on("event", () => {}); -console.log(listenerCount(myEmitter, "event")); -// Prints: 2 -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -The emitter to query - -• **eventName**: `string` \| `symbol` - -The event name - -#### Returns - -`number` - -#### Since - -v0.9.12 - -#### Deprecated - -Since v3.2.0 - Use `listenerCount` instead. - -#### Inherited from - -`ClientBase.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:330 - ---- - -### on() - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); -}); - -for await (const event of on(ee, "foo")) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] -} -// Unreachable here -``` - -Returns an `AsyncIterator` that iterates `eventName` events. It will throw -if the `EventEmitter` emits `'error'`. It removes all listeners when -exiting the loop. The `value` returned by each iteration is an array -composed of the emitted event arguments. - -An `AbortSignal` can be used to cancel waiting on events: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ac = new AbortController(); - -(async () => { - const ee = new EventEmitter(); - - // Emit later on - process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - }); - - for await (const event of on(ee, "foo", { signal: ac.signal })) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] - } - // Unreachable here -})(); - -process.nextTick(() => ac.abort()); -``` - -Use the `close` option to specify an array of event names that will end the iteration: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - ee.emit("close"); -}); - -for await (const event of on(ee, "foo", { close: ["close"] })) { - console.log(event); // prints ['bar'] [42] -} -// the loop will exit after 'close' is emitted -console.log("done"); // prints 'done' -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -An `AsyncIterator` that iterates `eventName` events emitted by the `emitter` - -##### Since - -v13.6.0, v12.16.0 - -##### Inherited from - -`ClientBase.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:303 - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -##### Inherited from - -`ClientBase.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:308 - ---- - -### once() - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given -event or that is rejected if the `EventEmitter` emits `'error'` while waiting. -The `Promise` will resolve with an array of all the arguments emitted to the -given event. - -This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event -semantics and does not listen to the `'error'` event. - -```js -import { once, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -process.nextTick(() => { - ee.emit("myevent", 42); -}); - -const [value] = await once(ee, "myevent"); -console.log(value); - -const err = new Error("kaboom"); -process.nextTick(() => { - ee.emit("error", err); -}); - -try { - await once(ee, "myevent"); -} catch (err) { - console.error("error happened", err); -} -``` - -The special handling of the `'error'` event is only used when `events.once()` is used to wait for another event. If `events.once()` is used to wait for the -'`error'` event itself, then it is treated as any other kind of event without -special handling: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); - -once(ee, "error") - .then(([err]) => console.log("ok", err.message)) - .catch((err) => console.error("error", err.message)); - -ee.emit("error", new Error("boom")); - -// Prints: ok boom -``` - -An `AbortSignal` can be used to cancel waiting for the event: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); -const ac = new AbortController(); - -async function foo(emitter, event, signal) { - try { - await once(emitter, event, { signal }); - console.log("event emitted!"); - } catch (error) { - if (error.name === "AbortError") { - console.error("Waiting for the event was canceled!"); - } else { - console.error("There was an error", error.message); - } - } -} - -foo(ee, "foo", ac.signal); -ac.abort(); // Abort waiting for the event -ee.emit("foo"); // Prints: Waiting for the event was canceled! -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Since - -v11.13.0, v10.16.0 - -##### Inherited from - -`ClientBase.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:217 - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Inherited from - -`ClientBase.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:222 - ---- - -### setMaxListeners() - -> `static` **setMaxListeners**(`n`?, ...`eventTargets`?): `void` - -```js -import { setMaxListeners, EventEmitter } from "node:events"; - -const target = new EventTarget(); -const emitter = new EventEmitter(); - -setMaxListeners(5, target, emitter); -``` - -#### Parameters - -• **n?**: `number` - -A non-negative number. The maximum number of listeners per `EventTarget` event. - -• ...**eventTargets?**: (`EventEmitter`\<`DefaultEventMap`\> \| `EventTarget`)[] - -Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, `n` is set as the default max for all newly created {EventTarget} and {EventEmitter} -objects. - -#### Returns - -`void` - -#### Since - -v15.4.0 - -#### Inherited from - -`ClientBase.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:402 diff --git a/docs/docs/api/classes/TwitterSearchClient.md b/docs/docs/api/classes/TwitterSearchClient.md deleted file mode 100644 index ab977bd41e..0000000000 --- a/docs/docs/api/classes/TwitterSearchClient.md +++ /dev/null @@ -1,1784 +0,0 @@ -# Class: TwitterSearchClient - -## Extends - -- `ClientBase` - -## Constructors - -### new TwitterSearchClient() - -> **new TwitterSearchClient**(`runtime`): [`TwitterSearchClient`](TwitterSearchClient.md) - -#### Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -#### Returns - -[`TwitterSearchClient`](TwitterSearchClient.md) - -#### Overrides - -`ClientBase.constructor` - -#### Defined in - -[core/src/clients/twitter/search.ts:53](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/search.ts#L53) - -## Properties - -### callback() - -> **callback**: (`self`) => `any` = `null` - -#### Parameters - -• **self**: `ClientBase` - -#### Returns - -`any` - -#### Inherited from - -`ClientBase.callback` - -#### Defined in - -[core/src/clients/twitter/base.ts:150](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L150) - ---- - -### directions - -> **directions**: `string` - -#### Inherited from - -`ClientBase.directions` - -#### Defined in - -[core/src/clients/twitter/base.ts:89](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L89) - ---- - -### imageDescriptionService - -> **imageDescriptionService**: `ImageDescriptionService` - -#### Inherited from - -`ClientBase.imageDescriptionService` - -#### Defined in - -[core/src/clients/twitter/base.ts:92](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L92) - ---- - -### lastCheckedTweetId - -> **lastCheckedTweetId**: `number` = `null` - -#### Inherited from - -`ClientBase.lastCheckedTweetId` - -#### Defined in - -[core/src/clients/twitter/base.ts:90](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L90) - ---- - -### requestQueue - -> **requestQueue**: `RequestQueue` - -#### Inherited from - -`ClientBase.requestQueue` - -#### Defined in - -[core/src/clients/twitter/base.ts:96](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L96) - ---- - -### runtime - -> **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -#### Inherited from - -`ClientBase.runtime` - -#### Defined in - -[core/src/clients/twitter/base.ts:88](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L88) - ---- - -### temperature - -> **temperature**: `number` = `0.5` - -#### Inherited from - -`ClientBase.temperature` - -#### Defined in - -[core/src/clients/twitter/base.ts:93](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L93) - ---- - -### tweetCacheFilePath - -> **tweetCacheFilePath**: `string` = `"tweetcache/latest_checked_tweet_id.txt"` - -#### Inherited from - -`ClientBase.tweetCacheFilePath` - -#### Defined in - -[core/src/clients/twitter/base.ts:91](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L91) - ---- - -### twitterClient - -> **twitterClient**: `Scraper` - -#### Inherited from - -`ClientBase.twitterClient` - -#### Defined in - -[core/src/clients/twitter/base.ts:87](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L87) - ---- - -### twitterUserId - -> **twitterUserId**: `string` - -#### Inherited from - -`ClientBase.twitterUserId` - -#### Defined in - -[core/src/clients/twitter/base.ts:97](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L97) - ---- - -### \_twitterClient - -> `static` **\_twitterClient**: `Scraper` - -#### Inherited from - -`ClientBase._twitterClient` - -#### Defined in - -[core/src/clients/twitter/base.ts:86](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L86) - ---- - -### captureRejections - -> `static` **captureRejections**: `boolean` - -Value: [boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) - -Change the default `captureRejections` option on all new `EventEmitter` objects. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`ClientBase.captureRejections` - -#### Defined in - -node_modules/@types/node/events.d.ts:459 - ---- - -### captureRejectionSymbol - -> `readonly` `static` **captureRejectionSymbol**: _typeof_ [`captureRejectionSymbol`](TwitterPostClient.md#capturerejectionsymbol) - -Value: `Symbol.for('nodejs.rejection')` - -See how to write a custom `rejection handler`. - -#### Since - -v13.4.0, v12.16.0 - -#### Inherited from - -`ClientBase.captureRejectionSymbol` - -#### Defined in - -node_modules/@types/node/events.d.ts:452 - ---- - -### defaultMaxListeners - -> `static` **defaultMaxListeners**: `number` - -By default, a maximum of `10` listeners can be registered for any single -event. This limit can be changed for individual `EventEmitter` instances -using the `emitter.setMaxListeners(n)` method. To change the default -for _all_`EventEmitter` instances, the `events.defaultMaxListeners` property -can be used. If this value is not a positive number, a `RangeError` is thrown. - -Take caution when setting the `events.defaultMaxListeners` because the -change affects _all_ `EventEmitter` instances, including those created before -the change is made. However, calling `emitter.setMaxListeners(n)` still has -precedence over `events.defaultMaxListeners`. - -This is not a hard limit. The `EventEmitter` instance will allow -more listeners to be added but will output a trace warning to stderr indicating -that a "possible EventEmitter memory leak" has been detected. For any single -`EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()` methods can be used to -temporarily avoid this warning: - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.setMaxListeners(emitter.getMaxListeners() + 1); -emitter.once("event", () => { - // do stuff - emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0)); -}); -``` - -The `--trace-warnings` command-line flag can be used to display the -stack trace for such warnings. - -The emitted warning can be inspected with `process.on('warning')` and will -have the additional `emitter`, `type`, and `count` properties, referring to -the event emitter instance, the event's name and the number of attached -listeners, respectively. -Its `name` property is set to `'MaxListenersExceededWarning'`. - -#### Since - -v0.11.2 - -#### Inherited from - -`ClientBase.defaultMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:498 - ---- - -### errorMonitor - -> `readonly` `static` **errorMonitor**: _typeof_ [`errorMonitor`](TwitterPostClient.md#errormonitor) - -This symbol shall be used to install a listener for only monitoring `'error'` events. Listeners installed using this symbol are called before the regular `'error'` listeners are called. - -Installing a listener using this symbol does not change the behavior once an `'error'` event is emitted. Therefore, the process will still crash if no -regular `'error'` listener is installed. - -#### Since - -v13.6.0, v12.17.0 - -#### Inherited from - -`ClientBase.errorMonitor` - -#### Defined in - -node_modules/@types/node/events.d.ts:445 - -## Methods - -### \[captureRejectionSymbol\]()? - -> `optional` **\[captureRejectionSymbol\]**\<`K`\>(`error`, `event`, ...`args`): `void` - -#### Type Parameters - -• **K** - -#### Parameters - -• **error**: `Error` - -• **event**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`void` - -#### Inherited from - -`ClientBase.[captureRejectionSymbol]` - -#### Defined in - -node_modules/@types/node/events.d.ts:136 - ---- - -### addListener() - -> **addListener**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.on(eventName, listener)`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.addListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:597 - ---- - -### cacheTweet() - -> **cacheTweet**(`tweet`): `Promise`\<`void`\> - -#### Parameters - -• **tweet**: `Tweet` - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.cacheTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:99](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L99) - ---- - -### emit() - -> **emit**\<`K`\>(`eventName`, ...`args`): `boolean` - -Synchronously calls each of the listeners registered for the event named `eventName`, in the order they were registered, passing the supplied arguments -to each. - -Returns `true` if the event had listeners, `false` otherwise. - -```js -import { EventEmitter } from "node:events"; -const myEmitter = new EventEmitter(); - -// First listener -myEmitter.on("event", function firstListener() { - console.log("Helloooo! first listener"); -}); -// Second listener -myEmitter.on("event", function secondListener(arg1, arg2) { - console.log(`event with parameters ${arg1}, ${arg2} in second listener`); -}); -// Third listener -myEmitter.on("event", function thirdListener(...args) { - const parameters = args.join(", "); - console.log(`event with parameters ${parameters} in third listener`); -}); - -console.log(myEmitter.listeners("event")); - -myEmitter.emit("event", 1, 2, 3, 4, 5); - -// Prints: -// [ -// [Function: firstListener], -// [Function: secondListener], -// [Function: thirdListener] -// ] -// Helloooo! first listener -// event with parameters 1, 2 in second listener -// event with parameters 1, 2, 3, 4, 5 in third listener -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• ...**args**: `AnyRest` - -#### Returns - -`boolean` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.emit` - -#### Defined in - -node_modules/@types/node/events.d.ts:859 - ---- - -### eventNames() - -> **eventNames**(): (`string` \| `symbol`)[] - -Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or `Symbol`s. - -```js -import { EventEmitter } from "node:events"; - -const myEE = new EventEmitter(); -myEE.on("foo", () => {}); -myEE.on("bar", () => {}); - -const sym = Symbol("symbol"); -myEE.on(sym, () => {}); - -console.log(myEE.eventNames()); -// Prints: [ 'foo', 'bar', Symbol(symbol) ] -``` - -#### Returns - -(`string` \| `symbol`)[] - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.eventNames` - -#### Defined in - -node_modules/@types/node/events.d.ts:922 - ---- - -### fetchHomeTimeline() - -> **fetchHomeTimeline**(`count`): `Promise`\<`Tweet`[]\> - -#### Parameters - -• **count**: `number` - -#### Returns - -`Promise`\<`Tweet`[]\> - -#### Inherited from - -`ClientBase.fetchHomeTimeline` - -#### Defined in - -[core/src/clients/twitter/base.ts:278](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L278) - ---- - -### fetchSearchTweets() - -> **fetchSearchTweets**(`query`, `maxTweets`, `searchMode`, `cursor`?): `Promise`\<`QueryTweetsResponse`\> - -#### Parameters - -• **query**: `string` - -• **maxTweets**: `number` - -• **searchMode**: `SearchMode` - -• **cursor?**: `string` - -#### Returns - -`Promise`\<`QueryTweetsResponse`\> - -#### Inherited from - -`ClientBase.fetchSearchTweets` - -#### Defined in - -[core/src/clients/twitter/base.ts:330](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L330) - ---- - -### getCachedTweet() - -> **getCachedTweet**(`tweetId`): `Promise`\<`Tweet`\> - -#### Parameters - -• **tweetId**: `string` - -#### Returns - -`Promise`\<`Tweet`\> - -#### Inherited from - -`ClientBase.getCachedTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:115](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L115) - ---- - -### getMaxListeners() - -> **getMaxListeners**(): `number` - -Returns the current max listener value for the `EventEmitter` which is either -set by `emitter.setMaxListeners(n)` or defaults to [defaultMaxListeners](TwitterSearchClient.md#defaultmaxlisteners). - -#### Returns - -`number` - -#### Since - -v1.0.0 - -#### Inherited from - -`ClientBase.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:774 - ---- - -### getTweet() - -> **getTweet**(`tweetId`): `Promise`\<`Tweet`\> - -#### Parameters - -• **tweetId**: `string` - -#### Returns - -`Promise`\<`Tweet`\> - -#### Inherited from - -`ClientBase.getTweet` - -#### Defined in - -[core/src/clients/twitter/base.ts:137](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L137) - ---- - -### listenerCount() - -> **listenerCount**\<`K`\>(`eventName`, `listener`?): `number` - -Returns the number of listeners listening for the event named `eventName`. -If `listener` is provided, it will return how many times the listener is found -in the list of the listeners of the event. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event being listened for - -• **listener?**: `Function` - -The event handler function - -#### Returns - -`number` - -#### Since - -v3.2.0 - -#### Inherited from - -`ClientBase.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:868 - ---- - -### listeners() - -> **listeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -console.log(util.inspect(server.listeners("connection"))); -// Prints: [ [Function] ] -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.listeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:787 - ---- - -### off() - -> **off**\<`K`\>(`eventName`, `listener`): `this` - -Alias for `emitter.removeListener()`. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v10.0.0 - -#### Inherited from - -`ClientBase.off` - -#### Defined in - -node_modules/@types/node/events.d.ts:747 - ---- - -### on() - -> **on**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the end of the listeners array for the event -named `eventName`. No checks are made to see if the `listener` has already -been added. Multiple calls passing the same combination of `eventName` and -`listener` will result in the `listener` being added, and called, multiple times. - -```js -server.on("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.on("foo", () => console.log("a")); -myEE.prependListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.1.101 - -#### Inherited from - -`ClientBase.on` - -#### Defined in - -node_modules/@types/node/events.d.ts:629 - ---- - -### once() - -> **once**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time** `listener` function for the event named `eventName`. The -next time `eventName` is triggered, this listener is removed and then invoked. - -```js -server.once("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -By default, event listeners are invoked in the order they are added. The `emitter.prependOnceListener()` method can be used as an alternative to add the -event listener to the beginning of the listeners array. - -```js -import { EventEmitter } from "node:events"; -const myEE = new EventEmitter(); -myEE.once("foo", () => console.log("a")); -myEE.prependOnceListener("foo", () => console.log("b")); -myEE.emit("foo"); -// Prints: -// b -// a -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v0.3.0 - -#### Inherited from - -`ClientBase.once` - -#### Defined in - -node_modules/@types/node/events.d.ts:659 - ---- - -### onReady() - -> **onReady**(): `Promise`\<`void`\> - -#### Returns - -`Promise`\<`void`\> - -#### Overrides - -`ClientBase.onReady` - -#### Defined in - -[core/src/clients/twitter/search.ts:60](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/search.ts#L60) - ---- - -### prependListener() - -> **prependListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds the `listener` function to the _beginning_ of the listeners array for the -event named `eventName`. No checks are made to see if the `listener` has -already been added. Multiple calls passing the same combination of `eventName` -and `listener` will result in the `listener` being added, and called, multiple times. - -```js -server.prependListener("connection", (stream) => { - console.log("someone connected!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.prependListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:886 - ---- - -### prependOnceListener() - -> **prependOnceListener**\<`K`\>(`eventName`, `listener`): `this` - -Adds a **one-time**`listener` function for the event named `eventName` to the _beginning_ of the listeners array. The next time `eventName` is triggered, this -listener is removed, and then invoked. - -```js -server.prependOnceListener("connection", (stream) => { - console.log("Ah, we have our first user!"); -}); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -The name of the event. - -• **listener** - -The callback function - -#### Returns - -`this` - -#### Since - -v6.0.0 - -#### Inherited from - -`ClientBase.prependOnceListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:902 - ---- - -### rawListeners() - -> **rawListeners**\<`K`\>(`eventName`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`, -including any wrappers (such as those created by `.once()`). - -```js -import { EventEmitter } from "node:events"; -const emitter = new EventEmitter(); -emitter.once("log", () => console.log("log once")); - -// Returns a new Array with a function `onceWrapper` which has a property -// `listener` which contains the original listener bound above -const listeners = emitter.rawListeners("log"); -const logFnWrapper = listeners[0]; - -// Logs "log once" to the console and does not unbind the `once` event -logFnWrapper.listener(); - -// Logs "log once" to the console and removes the listener -logFnWrapper(); - -emitter.on("log", () => console.log("log persistently")); -// Will return a new Array with a single function bound by `.on()` above -const newListeners = emitter.rawListeners("log"); - -// Logs "log persistently" twice -newListeners[0](); -emitter.emit("log"); -``` - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v9.4.0 - -#### Inherited from - -`ClientBase.rawListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:818 - ---- - -### removeAllListeners() - -> **removeAllListeners**(`eventName`?): `this` - -Removes all listeners, or those of the specified `eventName`. - -It is bad practice to remove listeners added elsewhere in the code, -particularly when the `EventEmitter` instance was created by some other -component or module (e.g. sockets or file streams). - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **eventName?**: `string` \| `symbol` - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.removeAllListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:758 - ---- - -### removeListener() - -> **removeListener**\<`K`\>(`eventName`, `listener`): `this` - -Removes the specified `listener` from the listener array for the event named `eventName`. - -```js -const callback = (stream) => { - console.log("someone connected!"); -}; -server.on("connection", callback); -// ... -server.removeListener("connection", callback); -``` - -`removeListener()` will remove, at most, one instance of a listener from the -listener array. If any single listener has been added multiple times to the -listener array for the specified `eventName`, then `removeListener()` must be -called multiple times to remove each instance. - -Once an event is emitted, all listeners attached to it at the -time of emitting are called in order. This implies that any `removeListener()` or `removeAllListeners()` calls _after_ emitting and _before_ the last listener finishes execution -will not remove them from`emit()` in progress. Subsequent events behave as expected. - -```js -import { EventEmitter } from "node:events"; -class MyEmitter extends EventEmitter {} -const myEmitter = new MyEmitter(); - -const callbackA = () => { - console.log("A"); - myEmitter.removeListener("event", callbackB); -}; - -const callbackB = () => { - console.log("B"); -}; - -myEmitter.on("event", callbackA); - -myEmitter.on("event", callbackB); - -// callbackA removes listener callbackB but it will still be called. -// Internal listener array at time of emit [callbackA, callbackB] -myEmitter.emit("event"); -// Prints: -// A -// B - -// callbackB is now removed. -// Internal listener array [callbackA] -myEmitter.emit("event"); -// Prints: -// A -``` - -Because listeners are managed using an internal array, calling this will -change the position indices of any listener registered _after_ the listener -being removed. This will not impact the order in which listeners are called, -but it means that any copies of the listener array as returned by -the `emitter.listeners()` method will need to be recreated. - -When a single function has been added as a handler multiple times for a single -event (as in the example below), `removeListener()` will remove the most -recently added instance. In the example the `once('ping')` listener is removed: - -```js -import { EventEmitter } from "node:events"; -const ee = new EventEmitter(); - -function pong() { - console.log("pong"); -} - -ee.on("ping", pong); -ee.once("ping", pong); -ee.removeListener("ping", pong); - -ee.emit("ping"); -ee.emit("ping"); -``` - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Type Parameters - -• **K** - -#### Parameters - -• **eventName**: `string` \| `symbol` - -• **listener** - -#### Returns - -`this` - -#### Since - -v0.1.26 - -#### Inherited from - -`ClientBase.removeListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:742 - ---- - -### saveRequestMessage() - -> **saveRequestMessage**(`message`, `state`): `Promise`\<`void`\> - -#### Parameters - -• **message**: [`Memory`](../interfaces/Memory.md) - -• **state**: [`State`](../interfaces/State.md) - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.saveRequestMessage` - -#### Defined in - -[core/src/clients/twitter/base.ts:572](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L572) - ---- - -### setCookiesFromArray() - -> **setCookiesFromArray**(`cookiesArray`): `Promise`\<`void`\> - -#### Parameters - -• **cookiesArray**: `any`[] - -#### Returns - -`Promise`\<`void`\> - -#### Inherited from - -`ClientBase.setCookiesFromArray` - -#### Defined in - -[core/src/clients/twitter/base.ts:560](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/clients/twitter/base.ts#L560) - ---- - -### setMaxListeners() - -> **setMaxListeners**(`n`): `this` - -By default `EventEmitter`s will print a warning if more than `10` listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The `emitter.setMaxListeners()` method allows the limit to be -modified for this specific `EventEmitter` instance. The value can be set to `Infinity` (or `0`) to indicate an unlimited number of listeners. - -Returns a reference to the `EventEmitter`, so that calls can be chained. - -#### Parameters - -• **n**: `number` - -#### Returns - -`this` - -#### Since - -v0.3.5 - -#### Inherited from - -`ClientBase.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:768 - ---- - -### addAbortListener() - -> `static` **addAbortListener**(`signal`, `resource`): `Disposable` - -**`Experimental`** - -Listens once to the `abort` event on the provided `signal`. - -Listening to the `abort` event on abort signals is unsafe and may -lead to resource leaks since another third party with the signal can -call `e.stopImmediatePropagation()`. Unfortunately Node.js cannot change -this since it would violate the web standard. Additionally, the original -API makes it easy to forget to remove listeners. - -This API allows safely using `AbortSignal`s in Node.js APIs by solving these -two issues by listening to the event such that `stopImmediatePropagation` does -not prevent the listener from running. - -Returns a disposable so that it may be unsubscribed from more easily. - -```js -import { addAbortListener } from "node:events"; - -function example(signal) { - let disposable; - try { - signal.addEventListener("abort", (e) => e.stopImmediatePropagation()); - disposable = addAbortListener(signal, (e) => { - // Do something when signal is aborted. - }); - } finally { - disposable?.[Symbol.dispose](); - } -} -``` - -#### Parameters - -• **signal**: `AbortSignal` - -• **resource** - -#### Returns - -`Disposable` - -Disposable that removes the `abort` listener. - -#### Since - -v20.5.0 - -#### Inherited from - -`ClientBase.addAbortListener` - -#### Defined in - -node_modules/@types/node/events.d.ts:437 - ---- - -### getEventListeners() - -> `static` **getEventListeners**(`emitter`, `name`): `Function`[] - -Returns a copy of the array of listeners for the event named `eventName`. - -For `EventEmitter`s this behaves exactly the same as calling `.listeners` on -the emitter. - -For `EventTarget`s this is the only way to get the event listeners for the -event target. This is useful for debugging and diagnostic purposes. - -```js -import { getEventListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - const listener = () => console.log("Events are fun"); - ee.on("foo", listener); - console.log(getEventListeners(ee, "foo")); // [ [Function: listener] ] -} -{ - const et = new EventTarget(); - const listener = () => console.log("Events are fun"); - et.addEventListener("foo", listener); - console.log(getEventListeners(et, "foo")); // [ [Function: listener] ] -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -• **name**: `string` \| `symbol` - -#### Returns - -`Function`[] - -#### Since - -v15.2.0, v14.17.0 - -#### Inherited from - -`ClientBase.getEventListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:358 - ---- - -### getMaxListeners() - -> `static` **getMaxListeners**(`emitter`): `number` - -Returns the currently set max amount of listeners. - -For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on -the emitter. - -For `EventTarget`s this is the only way to get the max event listeners for the -event target. If the number of event handlers on a single EventTarget exceeds -the max set, the EventTarget will print a warning. - -```js -import { getMaxListeners, setMaxListeners, EventEmitter } from "node:events"; - -{ - const ee = new EventEmitter(); - console.log(getMaxListeners(ee)); // 10 - setMaxListeners(11, ee); - console.log(getMaxListeners(ee)); // 11 -} -{ - const et = new EventTarget(); - console.log(getMaxListeners(et)); // 10 - setMaxListeners(11, et); - console.log(getMaxListeners(et)); // 11 -} -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> \| `EventTarget` - -#### Returns - -`number` - -#### Since - -v19.9.0 - -#### Inherited from - -`ClientBase.getMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:387 - ---- - -### ~~listenerCount()~~ - -> `static` **listenerCount**(`emitter`, `eventName`): `number` - -A class method that returns the number of listeners for the given `eventName` registered on the given `emitter`. - -```js -import { EventEmitter, listenerCount } from "node:events"; - -const myEmitter = new EventEmitter(); -myEmitter.on("event", () => {}); -myEmitter.on("event", () => {}); -console.log(listenerCount(myEmitter, "event")); -// Prints: 2 -``` - -#### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -The emitter to query - -• **eventName**: `string` \| `symbol` - -The event name - -#### Returns - -`number` - -#### Since - -v0.9.12 - -#### Deprecated - -Since v3.2.0 - Use `listenerCount` instead. - -#### Inherited from - -`ClientBase.listenerCount` - -#### Defined in - -node_modules/@types/node/events.d.ts:330 - ---- - -### on() - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); -}); - -for await (const event of on(ee, "foo")) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] -} -// Unreachable here -``` - -Returns an `AsyncIterator` that iterates `eventName` events. It will throw -if the `EventEmitter` emits `'error'`. It removes all listeners when -exiting the loop. The `value` returned by each iteration is an array -composed of the emitted event arguments. - -An `AbortSignal` can be used to cancel waiting on events: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ac = new AbortController(); - -(async () => { - const ee = new EventEmitter(); - - // Emit later on - process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - }); - - for await (const event of on(ee, "foo", { signal: ac.signal })) { - // The execution of this inner block is synchronous and it - // processes one event at a time (even with await). Do not use - // if concurrent execution is required. - console.log(event); // prints ['bar'] [42] - } - // Unreachable here -})(); - -process.nextTick(() => ac.abort()); -``` - -Use the `close` option to specify an array of event names that will end the iteration: - -```js -import { on, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -// Emit later on -process.nextTick(() => { - ee.emit("foo", "bar"); - ee.emit("foo", 42); - ee.emit("close"); -}); - -for await (const event of on(ee, "foo", { close: ["close"] })) { - console.log(event); // prints ['bar'] [42] -} -// the loop will exit after 'close' is emitted -console.log("done"); // prints 'done' -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -An `AsyncIterator` that iterates `eventName` events emitted by the `emitter` - -##### Since - -v13.6.0, v12.16.0 - -##### Inherited from - -`ClientBase.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:303 - -#### on(emitter, eventName, options) - -> `static` **on**(`emitter`, `eventName`, `options`?): `AsyncIterator`\<`any`[], `any`, `any`\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterIteratorOptions` - -##### Returns - -`AsyncIterator`\<`any`[], `any`, `any`\> - -##### Inherited from - -`ClientBase.on` - -##### Defined in - -node_modules/@types/node/events.d.ts:308 - ---- - -### once() - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given -event or that is rejected if the `EventEmitter` emits `'error'` while waiting. -The `Promise` will resolve with an array of all the arguments emitted to the -given event. - -This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event -semantics and does not listen to the `'error'` event. - -```js -import { once, EventEmitter } from "node:events"; -import process from "node:process"; - -const ee = new EventEmitter(); - -process.nextTick(() => { - ee.emit("myevent", 42); -}); - -const [value] = await once(ee, "myevent"); -console.log(value); - -const err = new Error("kaboom"); -process.nextTick(() => { - ee.emit("error", err); -}); - -try { - await once(ee, "myevent"); -} catch (err) { - console.error("error happened", err); -} -``` - -The special handling of the `'error'` event is only used when `events.once()` is used to wait for another event. If `events.once()` is used to wait for the -'`error'` event itself, then it is treated as any other kind of event without -special handling: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); - -once(ee, "error") - .then(([err]) => console.log("ok", err.message)) - .catch((err) => console.error("error", err.message)); - -ee.emit("error", new Error("boom")); - -// Prints: ok boom -``` - -An `AbortSignal` can be used to cancel waiting for the event: - -```js -import { EventEmitter, once } from "node:events"; - -const ee = new EventEmitter(); -const ac = new AbortController(); - -async function foo(emitter, event, signal) { - try { - await once(emitter, event, { signal }); - console.log("event emitted!"); - } catch (error) { - if (error.name === "AbortError") { - console.error("Waiting for the event was canceled!"); - } else { - console.error("There was an error", error.message); - } - } -} - -foo(ee, "foo", ac.signal); -ac.abort(); // Abort waiting for the event -ee.emit("foo"); // Prints: Waiting for the event was canceled! -``` - -##### Parameters - -• **emitter**: `EventEmitter`\<`DefaultEventMap`\> - -• **eventName**: `string` \| `symbol` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Since - -v11.13.0, v10.16.0 - -##### Inherited from - -`ClientBase.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:217 - -#### once(emitter, eventName, options) - -> `static` **once**(`emitter`, `eventName`, `options`?): `Promise`\<`any`[]\> - -##### Parameters - -• **emitter**: `EventTarget` - -• **eventName**: `string` - -• **options?**: `StaticEventEmitterOptions` - -##### Returns - -`Promise`\<`any`[]\> - -##### Inherited from - -`ClientBase.once` - -##### Defined in - -node_modules/@types/node/events.d.ts:222 - ---- - -### setMaxListeners() - -> `static` **setMaxListeners**(`n`?, ...`eventTargets`?): `void` - -```js -import { setMaxListeners, EventEmitter } from "node:events"; - -const target = new EventTarget(); -const emitter = new EventEmitter(); - -setMaxListeners(5, target, emitter); -``` - -#### Parameters - -• **n?**: `number` - -A non-negative number. The maximum number of listeners per `EventTarget` event. - -• ...**eventTargets?**: (`EventEmitter`\<`DefaultEventMap`\> \| `EventTarget`)[] - -Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, `n` is set as the default max for all newly created {EventTarget} and {EventEmitter} -objects. - -#### Returns - -`void` - -#### Since - -v15.4.0 - -#### Inherited from - -`ClientBase.setMaxListeners` - -#### Defined in - -node_modules/@types/node/events.d.ts:402 diff --git a/docs/docs/api/classes/WalletProvider.md b/docs/docs/api/classes/WalletProvider.md deleted file mode 100644 index 7f0284df83..0000000000 --- a/docs/docs/api/classes/WalletProvider.md +++ /dev/null @@ -1,97 +0,0 @@ -# Class: WalletProvider - -## Constructors - -### new WalletProvider() - -> **new WalletProvider**(`connection`, `walletPublicKey`): [`WalletProvider`](WalletProvider.md) - -#### Parameters - -• **connection**: `Connection` - -• **walletPublicKey**: `PublicKey` - -#### Returns - -[`WalletProvider`](WalletProvider.md) - -#### Defined in - -[core/src/providers/wallet.ts:53](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/wallet.ts#L53) - -## Methods - -### fetchPortfolioValue() - -> **fetchPortfolioValue**(`runtime`): `Promise`\<`WalletPortfolio`\> - -#### Parameters - -• **runtime**: `any` - -#### Returns - -`Promise`\<`WalletPortfolio`\> - -#### Defined in - -[core/src/providers/wallet.ts:105](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/wallet.ts#L105) - ---- - -### fetchPrices() - -> **fetchPrices**(`runtime`): `Promise`\<`Prices`\> - -#### Parameters - -• **runtime**: `any` - -#### Returns - -`Promise`\<`Prices`\> - -#### Defined in - -[core/src/providers/wallet.ts:150](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/wallet.ts#L150) - ---- - -### formatPortfolio() - -> **formatPortfolio**(`runtime`, `portfolio`, `prices`): `string` - -#### Parameters - -• **runtime**: `any` - -• **portfolio**: `WalletPortfolio` - -• **prices**: `Prices` - -#### Returns - -`string` - -#### Defined in - -[core/src/providers/wallet.ts:192](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/wallet.ts#L192) - ---- - -### getFormattedPortfolio() - -> **getFormattedPortfolio**(`runtime`): `Promise`\<`string`\> - -#### Parameters - -• **runtime**: `any` - -#### Returns - -`Promise`\<`string`\> - -#### Defined in - -[core/src/providers/wallet.ts:229](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/wallet.ts#L229) diff --git a/docs/docs/api/enumerations/Clients.md b/docs/docs/api/enumerations/Clients.md index 2639b8da95..2f84564ce5 100644 --- a/docs/docs/api/enumerations/Clients.md +++ b/docs/docs/api/enumerations/Clients.md @@ -8,9 +8,9 @@ #### Defined in -[core/src/core/types.ts:300](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L300) +[packages/core/src/types.ts:322](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L322) ---- +*** ### DISCORD @@ -18,9 +18,9 @@ #### Defined in -[core/src/core/types.ts:299](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L299) +[packages/core/src/types.ts:321](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L321) ---- +*** ### TELEGRAM @@ -28,9 +28,9 @@ #### Defined in -[core/src/core/types.ts:302](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L302) +[packages/core/src/types.ts:324](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L324) ---- +*** ### TWITTER @@ -38,4 +38,4 @@ #### Defined in -[core/src/core/types.ts:301](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L301) +[packages/core/src/types.ts:323](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L323) diff --git a/docs/docs/api/enumerations/GoalStatus.md b/docs/docs/api/enumerations/GoalStatus.md index 3bec50a388..48a39f2180 100644 --- a/docs/docs/api/enumerations/GoalStatus.md +++ b/docs/docs/api/enumerations/GoalStatus.md @@ -8,9 +8,9 @@ #### Defined in -[core/src/core/types.ts:58](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L58) +[packages/core/src/types.ts:57](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L57) ---- +*** ### FAILED @@ -18,14 +18,14 @@ #### Defined in -[core/src/core/types.ts:59](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L59) +[packages/core/src/types.ts:58](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L58) ---- +*** -### IN_PROGRESS +### IN\_PROGRESS -> **IN_PROGRESS**: `"IN_PROGRESS"` +> **IN\_PROGRESS**: `"IN_PROGRESS"` #### Defined in -[core/src/core/types.ts:60](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L60) +[packages/core/src/types.ts:59](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L59) diff --git a/docs/docs/api/enumerations/ImageGenModel.md b/docs/docs/api/enumerations/ImageGenModel.md deleted file mode 100644 index e9b366064b..0000000000 --- a/docs/docs/api/enumerations/ImageGenModel.md +++ /dev/null @@ -1,21 +0,0 @@ -# Enumeration: ImageGenModel - -## Enumeration Members - -### Dalle - -> **Dalle**: `"Dalle"` - -#### Defined in - -[core/src/core/imageGenModels.ts:3](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/imageGenModels.ts#L3) - ---- - -### TogetherAI - -> **TogetherAI**: `"TogetherAI"` - -#### Defined in - -[core/src/core/imageGenModels.ts:2](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/imageGenModels.ts#L2) diff --git a/docs/docs/api/enumerations/ModelClass.md b/docs/docs/api/enumerations/ModelClass.md index ff8b624239..d5c0c1c080 100644 --- a/docs/docs/api/enumerations/ModelClass.md +++ b/docs/docs/api/enumerations/ModelClass.md @@ -8,9 +8,19 @@ #### Defined in -[core/src/core/types.ts:79](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L79) +[packages/core/src/types.ts:78](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L78) ---- +*** + +### IMAGE + +> **IMAGE**: `"image"` + +#### Defined in + +[packages/core/src/types.ts:79](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L79) + +*** ### LARGE @@ -18,9 +28,9 @@ #### Defined in -[core/src/core/types.ts:78](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L78) +[packages/core/src/types.ts:77](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L77) ---- +*** ### MEDIUM @@ -28,9 +38,9 @@ #### Defined in -[core/src/core/types.ts:77](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L77) +[packages/core/src/types.ts:76](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L76) ---- +*** ### SMALL @@ -38,4 +48,4 @@ #### Defined in -[core/src/core/types.ts:76](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L76) +[packages/core/src/types.ts:75](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L75) diff --git a/docs/docs/api/enumerations/ModelProvider.md b/docs/docs/api/enumerations/ModelProvider.md deleted file mode 100644 index 8cea253f24..0000000000 --- a/docs/docs/api/enumerations/ModelProvider.md +++ /dev/null @@ -1,101 +0,0 @@ -# Enumeration: ModelProvider - -## Enumeration Members - -### ANTHROPIC - -> **ANTHROPIC**: `"anthropic"` - -#### Defined in - -[core/src/core/types.ts:103](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L103) - ---- - -### CLAUDE_VERTEX - -> **CLAUDE_VERTEX**: `"claude_vertex"` - -#### Defined in - -[core/src/core/types.ts:109](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L109) - ---- - -### GITHUB - -> **GITHUB**: `"GITHUB"` - -#### Defined in - -[core/src/core/types.ts:111](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L111) - ---- - -### GOOGLE - -> **GOOGLE**: `"google"` - -#### Defined in - -[core/src/core/types.ts:108](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L108) - ---- - -### GROK - -> **GROK**: `"grok"` - -#### Defined in - -[core/src/core/types.ts:104](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L104) - ---- - -### GROQ - -> **GROQ**: `"groq"` - -#### Defined in - -[core/src/core/types.ts:105](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L105) - ---- - -### LLAMACLOUD - -> **LLAMACLOUD**: `"llama_cloud"` - -#### Defined in - -[core/src/core/types.ts:106](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L106) - ---- - -### LLAMALOCAL - -> **LLAMALOCAL**: `"llama_local"` - -#### Defined in - -[core/src/core/types.ts:107](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L107) - ---- - -### OPENAI - -> **OPENAI**: `"openai"` - -#### Defined in - -[core/src/core/types.ts:102](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L102) - ---- - -### REDPILL - -> **REDPILL**: `"redpill"` - -#### Defined in - -[core/src/core/types.ts:110](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L110) diff --git a/docs/docs/api/enumerations/ModelProviderName.md b/docs/docs/api/enumerations/ModelProviderName.md new file mode 100644 index 0000000000..461236918f --- /dev/null +++ b/docs/docs/api/enumerations/ModelProviderName.md @@ -0,0 +1,111 @@ +# Enumeration: ModelProviderName + +## Enumeration Members + +### ANTHROPIC + +> **ANTHROPIC**: `"anthropic"` + +#### Defined in + +[packages/core/src/types.ts:121](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L121) + +*** + +### CLAUDE\_VERTEX + +> **CLAUDE\_VERTEX**: `"claude_vertex"` + +#### Defined in + +[packages/core/src/types.ts:127](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L127) + +*** + +### GOOGLE + +> **GOOGLE**: `"google"` + +#### Defined in + +[packages/core/src/types.ts:126](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L126) + +*** + +### GROK + +> **GROK**: `"grok"` + +#### Defined in + +[packages/core/src/types.ts:122](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L122) + +*** + +### GROQ + +> **GROQ**: `"groq"` + +#### Defined in + +[packages/core/src/types.ts:123](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L123) + +*** + +### LLAMACLOUD + +> **LLAMACLOUD**: `"llama_cloud"` + +#### Defined in + +[packages/core/src/types.ts:124](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L124) + +*** + +### LLAMALOCAL + +> **LLAMALOCAL**: `"llama_local"` + +#### Defined in + +[packages/core/src/types.ts:125](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L125) + +*** + +### OLLAMA + +> **OLLAMA**: `"ollama"` + +#### Defined in + +[packages/core/src/types.ts:130](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L130) + +*** + +### OPENAI + +> **OPENAI**: `"openai"` + +#### Defined in + +[packages/core/src/types.ts:120](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L120) + +*** + +### OPENROUTER + +> **OPENROUTER**: `"openrouter"` + +#### Defined in + +[packages/core/src/types.ts:129](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L129) + +*** + +### REDPILL + +> **REDPILL**: `"redpill"` + +#### Defined in + +[packages/core/src/types.ts:128](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L128) diff --git a/docs/docs/api/enumerations/ServiceType.md b/docs/docs/api/enumerations/ServiceType.md new file mode 100644 index 0000000000..786e3ea9e8 --- /dev/null +++ b/docs/docs/api/enumerations/ServiceType.md @@ -0,0 +1,71 @@ +# Enumeration: ServiceType + +## Enumeration Members + +### BROWSER + +> **BROWSER**: `"browser"` + +#### Defined in + +[packages/core/src/types.ts:650](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L650) + +*** + +### IMAGE\_DESCRIPTION + +> **IMAGE\_DESCRIPTION**: `"image_description"` + +#### Defined in + +[packages/core/src/types.ts:646](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L646) + +*** + +### PDF + +> **PDF**: `"pdf"` + +#### Defined in + +[packages/core/src/types.ts:652](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L652) + +*** + +### SPEECH\_GENERATION + +> **SPEECH\_GENERATION**: `"speech_generation"` + +#### Defined in + +[packages/core/src/types.ts:651](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L651) + +*** + +### TEXT\_GENERATION + +> **TEXT\_GENERATION**: `"text_generation"` + +#### Defined in + +[packages/core/src/types.ts:649](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L649) + +*** + +### TRANSCRIPTION + +> **TRANSCRIPTION**: `"transcription"` + +#### Defined in + +[packages/core/src/types.ts:647](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L647) + +*** + +### VIDEO + +> **VIDEO**: `"video"` + +#### Defined in + +[packages/core/src/types.ts:648](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L648) diff --git a/docs/docs/api/functions/addHeader.md b/docs/docs/api/functions/addHeader.md index b93ea9b244..aa1df516fe 100644 --- a/docs/docs/api/functions/addHeader.md +++ b/docs/docs/api/functions/addHeader.md @@ -37,4 +37,4 @@ const text = addHeader(header, body); ## Defined in -[core/src/core/context.ts:58](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/context.ts#L58) +[packages/core/src/context.ts:58](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/context.ts#L58) diff --git a/docs/docs/api/functions/buyToken.md b/docs/docs/api/functions/buyToken.md deleted file mode 100644 index 98dfb5f0d5..0000000000 --- a/docs/docs/api/functions/buyToken.md +++ /dev/null @@ -1,31 +0,0 @@ -# Function: buyToken() - -> **buyToken**(`__namedParameters`): `Promise`\<`void`\> - -## Parameters - -• **\_\_namedParameters** - -• **\_\_namedParameters.allowOffCurve**: `boolean` - -• **\_\_namedParameters.amount**: `bigint` - -• **\_\_namedParameters.buyer**: `Keypair` - -• **\_\_namedParameters.connection**: `Connection` - -• **\_\_namedParameters.mint**: `PublicKey` - -• **\_\_namedParameters.priorityFee**: `PriorityFee` - -• **\_\_namedParameters.sdk**: `PumpFunSDK` - -• **\_\_namedParameters.slippage**: `string` - -## Returns - -`Promise`\<`void`\> - -## Defined in - -[core/src/actions/pumpfun.ts:119](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L119) diff --git a/docs/docs/api/functions/composeActionExamples.md b/docs/docs/api/functions/composeActionExamples.md index 8ba5371a57..31ed21c4b0 100644 --- a/docs/docs/api/functions/composeActionExamples.md +++ b/docs/docs/api/functions/composeActionExamples.md @@ -23,4 +23,4 @@ A string containing formatted examples of conversations. ## Defined in -[core/src/core/actions.ts:18](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/actions.ts#L18) +[packages/core/src/actions.ts:11](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/actions.ts#L11) diff --git a/docs/docs/api/functions/composeContext.md b/docs/docs/api/functions/composeContext.md index df9064caa5..1f4c332ed6 100644 --- a/docs/docs/api/functions/composeContext.md +++ b/docs/docs/api/functions/composeContext.md @@ -42,4 +42,4 @@ const context = composeContext({ state, template }); ## Defined in -[core/src/core/context.ts:24](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/context.ts#L24) +[packages/core/src/context.ts:24](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/context.ts#L24) diff --git a/docs/docs/api/functions/createAgentRuntime.md b/docs/docs/api/functions/createAgentRuntime.md deleted file mode 100644 index ef33390ee9..0000000000 --- a/docs/docs/api/functions/createAgentRuntime.md +++ /dev/null @@ -1,21 +0,0 @@ -# Function: createAgentRuntime() - -> **createAgentRuntime**(`character`, `db`, `token`, `configPath`): `Promise`\<[`AgentRuntime`](../classes/AgentRuntime.md)\> - -## Parameters - -• **character**: [`Character`](../type-aliases/Character.md) - -• **db**: `any` - -• **token**: `string` - -• **configPath**: `string` = `"./elizaConfig.yaml"` - -## Returns - -`Promise`\<[`AgentRuntime`](../classes/AgentRuntime.md)\> - -## Defined in - -[core/src/cli/index.ts:139](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L139) diff --git a/docs/docs/api/functions/createAndBuyToken.md b/docs/docs/api/functions/createAndBuyToken.md deleted file mode 100644 index 06add69922..0000000000 --- a/docs/docs/api/functions/createAndBuyToken.md +++ /dev/null @@ -1,35 +0,0 @@ -# Function: createAndBuyToken() - -> **createAndBuyToken**(`__namedParameters`): `Promise`\<`void`\> - -## Parameters - -• **\_\_namedParameters** - -• **\_\_namedParameters.allowOffCurve**: `boolean` - -• **\_\_namedParameters.buyAmountSol**: `bigint` - -• **\_\_namedParameters.commitment?**: `"processed"` \| `"confirmed"` \| `"finalized"` \| `"recent"` \| `"single"` \| `"singleGossip"` \| `"root"` \| `"max"` = `"finalized"` - -• **\_\_namedParameters.connection**: `Connection` - -• **\_\_namedParameters.deployer**: `Keypair` - -• **\_\_namedParameters.mint**: `Keypair` - -• **\_\_namedParameters.priorityFee**: `PriorityFee` - -• **\_\_namedParameters.sdk**: `PumpFunSDK` - -• **\_\_namedParameters.slippage**: `string` - -• **\_\_namedParameters.tokenMetadata**: `CreateTokenMetadata` - -## Returns - -`Promise`\<`void`\> - -## Defined in - -[core/src/actions/pumpfun.ts:51](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L51) diff --git a/docs/docs/api/functions/createDirectRuntime.md b/docs/docs/api/functions/createDirectRuntime.md deleted file mode 100644 index 256a9cf0b0..0000000000 --- a/docs/docs/api/functions/createDirectRuntime.md +++ /dev/null @@ -1,21 +0,0 @@ -# Function: createDirectRuntime() - -> **createDirectRuntime**(`character`, `db`, `token`, `configPath`): `Promise`\<[`AgentRuntime`](../classes/AgentRuntime.md)\> - -## Parameters - -• **character**: [`Character`](../type-aliases/Character.md) - -• **db**: `any` - -• **token**: `string` - -• **configPath**: `string` = `"./elizaConfig.yaml"` - -## Returns - -`Promise`\<[`AgentRuntime`](../classes/AgentRuntime.md)\> - -## Defined in - -[core/src/cli/index.ts:174](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L174) diff --git a/docs/docs/api/functions/createGoal.md b/docs/docs/api/functions/createGoal.md index afa2fc3f4f..28962dd1aa 100644 --- a/docs/docs/api/functions/createGoal.md +++ b/docs/docs/api/functions/createGoal.md @@ -16,4 +16,4 @@ ## Defined in -[core/src/core/goals.ts:54](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/goals.ts#L54) +[packages/core/src/goals.ts:54](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/goals.ts#L54) diff --git a/docs/docs/api/functions/createRelationship.md b/docs/docs/api/functions/createRelationship.md index 431a17e4a0..944a8ca067 100644 --- a/docs/docs/api/functions/createRelationship.md +++ b/docs/docs/api/functions/createRelationship.md @@ -18,4 +18,4 @@ ## Defined in -[core/src/core/relationships.ts:3](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/relationships.ts#L3) +[packages/core/src/relationships.ts:3](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/relationships.ts#L3) diff --git a/docs/docs/api/functions/embed.md b/docs/docs/api/functions/embed.md index 9c9492cbc5..c742d2ab47 100644 --- a/docs/docs/api/functions/embed.md +++ b/docs/docs/api/functions/embed.md @@ -20,4 +20,4 @@ The embedding of the input. ## Defined in -[core/src/core/embedding.ts:9](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/embedding.ts#L9) +[packages/core/src/embedding.ts:88](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/embedding.ts#L88) diff --git a/docs/docs/api/functions/findNearestEnvFile.md b/docs/docs/api/functions/findNearestEnvFile.md new file mode 100644 index 0000000000..dddcc99bfc --- /dev/null +++ b/docs/docs/api/functions/findNearestEnvFile.md @@ -0,0 +1,22 @@ +# Function: findNearestEnvFile() + +> **findNearestEnvFile**(`startDir`?): `string` + +Recursively searches for a .env file starting from the current directory +and moving up through parent directories + +## Parameters + +• **startDir?**: `string` = `...` + +Starting directory for the search + +## Returns + +`string` + +Path to the nearest .env file or null if not found + +## Defined in + +[packages/core/src/settings.ts:11](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/settings.ts#L11) diff --git a/docs/docs/api/functions/formatActionNames.md b/docs/docs/api/functions/formatActionNames.md index e2b189af44..872a0f42c9 100644 --- a/docs/docs/api/functions/formatActionNames.md +++ b/docs/docs/api/functions/formatActionNames.md @@ -18,4 +18,4 @@ A comma-separated string of action names. ## Defined in -[core/src/core/actions.ts:54](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/actions.ts#L54) +[packages/core/src/actions.ts:47](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/actions.ts#L47) diff --git a/docs/docs/api/functions/formatActions.md b/docs/docs/api/functions/formatActions.md index 9b181d7bb3..cf0a37f569 100644 --- a/docs/docs/api/functions/formatActions.md +++ b/docs/docs/api/functions/formatActions.md @@ -18,4 +18,4 @@ A detailed string of actions, including names and descriptions. ## Defined in -[core/src/core/actions.ts:66](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/actions.ts#L66) +[packages/core/src/actions.ts:59](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/actions.ts#L59) diff --git a/docs/docs/api/functions/formatActors.md b/docs/docs/api/functions/formatActors.md index 43b2112243..2f5df3df79 100644 --- a/docs/docs/api/functions/formatActors.md +++ b/docs/docs/api/functions/formatActors.md @@ -20,4 +20,4 @@ string ## Defined in -[core/src/core/messages.ts:45](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/messages.ts#L45) +[packages/core/src/messages.ts:45](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/messages.ts#L45) diff --git a/docs/docs/api/functions/formatEvaluatorExampleDescriptions.md b/docs/docs/api/functions/formatEvaluatorExampleDescriptions.md index 3c3e677ecf..5bb4f5914e 100644 --- a/docs/docs/api/functions/formatEvaluatorExampleDescriptions.md +++ b/docs/docs/api/functions/formatEvaluatorExampleDescriptions.md @@ -18,4 +18,4 @@ A string that summarizes the descriptions for each evaluator example, formatted ## Defined in -[core/src/core/evaluators.ts:114](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/evaluators.ts#L114) +[packages/core/src/evaluators.ts:110](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/evaluators.ts#L110) diff --git a/docs/docs/api/functions/formatEvaluatorExamples.md b/docs/docs/api/functions/formatEvaluatorExamples.md index b0e29b29d8..99f9a50576 100644 --- a/docs/docs/api/functions/formatEvaluatorExamples.md +++ b/docs/docs/api/functions/formatEvaluatorExamples.md @@ -18,4 +18,4 @@ A string that presents each evaluator example in a structured format, including ## Defined in -[core/src/core/evaluators.ts:59](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/evaluators.ts#L59) +[packages/core/src/evaluators.ts:55](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/evaluators.ts#L55) diff --git a/docs/docs/api/functions/formatEvaluatorNames.md b/docs/docs/api/functions/formatEvaluatorNames.md index f678678238..81ccd58e56 100644 --- a/docs/docs/api/functions/formatEvaluatorNames.md +++ b/docs/docs/api/functions/formatEvaluatorNames.md @@ -18,4 +18,4 @@ A string that concatenates the names of all evaluators, each enclosed in single ## Defined in -[core/src/core/evaluators.ts:34](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/evaluators.ts#L34) +[packages/core/src/evaluators.ts:30](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/evaluators.ts#L30) diff --git a/docs/docs/api/functions/formatEvaluators.md b/docs/docs/api/functions/formatEvaluators.md index bdabc314ac..94c951ac0c 100644 --- a/docs/docs/api/functions/formatEvaluators.md +++ b/docs/docs/api/functions/formatEvaluators.md @@ -18,4 +18,4 @@ A string that concatenates the name and description of each evaluator, separated ## Defined in -[core/src/core/evaluators.ts:45](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/evaluators.ts#L45) +[packages/core/src/evaluators.ts:41](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/evaluators.ts#L41) diff --git a/docs/docs/api/functions/formatGoalsAsString.md b/docs/docs/api/functions/formatGoalsAsString.md index abf951cbde..b5dae1184d 100644 --- a/docs/docs/api/functions/formatGoalsAsString.md +++ b/docs/docs/api/functions/formatGoalsAsString.md @@ -14,4 +14,4 @@ ## Defined in -[core/src/core/goals.ts:29](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/goals.ts#L29) +[packages/core/src/goals.ts:29](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/goals.ts#L29) diff --git a/docs/docs/api/functions/formatMessages.md b/docs/docs/api/functions/formatMessages.md index 7dd245834e..d9a00b9837 100644 --- a/docs/docs/api/functions/formatMessages.md +++ b/docs/docs/api/functions/formatMessages.md @@ -20,4 +20,4 @@ string ## Defined in -[core/src/core/messages.ts:60](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/messages.ts#L60) +[packages/core/src/messages.ts:60](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/messages.ts#L60) diff --git a/docs/docs/api/functions/formatPosts.md b/docs/docs/api/functions/formatPosts.md index 565fc5d336..8c2d56e707 100644 --- a/docs/docs/api/functions/formatPosts.md +++ b/docs/docs/api/functions/formatPosts.md @@ -18,4 +18,4 @@ ## Defined in -[core/src/core/posts.ts:4](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/posts.ts#L4) +[packages/core/src/posts.ts:4](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/posts.ts#L4) diff --git a/docs/docs/api/functions/formatRelationships.md b/docs/docs/api/functions/formatRelationships.md index cd1d8dd754..c9051b1e1b 100644 --- a/docs/docs/api/functions/formatRelationships.md +++ b/docs/docs/api/functions/formatRelationships.md @@ -16,4 +16,4 @@ ## Defined in -[core/src/core/relationships.ts:43](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/relationships.ts#L43) +[packages/core/src/relationships.ts:43](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/relationships.ts#L43) diff --git a/docs/docs/api/functions/formatTimestamp.md b/docs/docs/api/functions/formatTimestamp.md index a33b4ceed5..6adbd98818 100644 --- a/docs/docs/api/functions/formatTimestamp.md +++ b/docs/docs/api/functions/formatTimestamp.md @@ -12,4 +12,4 @@ ## Defined in -[core/src/core/messages.ts:94](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/messages.ts#L94) +[packages/core/src/messages.ts:94](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/messages.ts#L94) diff --git a/docs/docs/api/functions/generateCaption.md b/docs/docs/api/functions/generateCaption.md index 3f9b6eaea6..d6c523b20f 100644 --- a/docs/docs/api/functions/generateCaption.md +++ b/docs/docs/api/functions/generateCaption.md @@ -24,4 +24,4 @@ ## Defined in -[core/src/actions/imageGenerationUtils.ts:90](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/imageGenerationUtils.ts#L90) +[packages/core/src/generation.ts:734](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L734) diff --git a/docs/docs/api/functions/generateImage.md b/docs/docs/api/functions/generateImage.md index e5b91938b0..4900cca7fa 100644 --- a/docs/docs/api/functions/generateImage.md +++ b/docs/docs/api/functions/generateImage.md @@ -34,4 +34,4 @@ ## Defined in -[core/src/actions/imageGenerationUtils.ts:8](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/imageGenerationUtils.ts#L8) +[packages/core/src/generation.ts:650](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L650) diff --git a/docs/docs/api/functions/generateMessageResponse.md b/docs/docs/api/functions/generateMessageResponse.md index 90542895ec..5f9ae1f47d 100644 --- a/docs/docs/api/functions/generateMessageResponse.md +++ b/docs/docs/api/functions/generateMessageResponse.md @@ -26,4 +26,4 @@ The completed message. ## Defined in -[core/src/core/generation.ts:522](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L522) +[packages/core/src/generation.ts:612](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L612) diff --git a/docs/docs/api/functions/generateObject.md b/docs/docs/api/functions/generateObject.md index 9d1dbf9eea..b3c684ec26 100644 --- a/docs/docs/api/functions/generateObject.md +++ b/docs/docs/api/functions/generateObject.md @@ -18,4 +18,4 @@ ## Defined in -[core/src/core/generation.ts:438](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L438) +[packages/core/src/generation.ts:528](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L528) diff --git a/docs/docs/api/functions/generateObjectArray.md b/docs/docs/api/functions/generateObjectArray.md index af24589e74..7ea39cd785 100644 --- a/docs/docs/api/functions/generateObjectArray.md +++ b/docs/docs/api/functions/generateObjectArray.md @@ -18,4 +18,4 @@ ## Defined in -[core/src/core/generation.ts:474](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L474) +[packages/core/src/generation.ts:564](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L564) diff --git a/docs/docs/api/functions/generateShouldRespond.md b/docs/docs/api/functions/generateShouldRespond.md index 5f73dfa705..00159770f3 100644 --- a/docs/docs/api/functions/generateShouldRespond.md +++ b/docs/docs/api/functions/generateShouldRespond.md @@ -26,4 +26,4 @@ Promise resolving to "RESPOND", "IGNORE", "STOP" or null ## Defined in -[core/src/core/generation.ts:249](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L249) +[packages/core/src/generation.ts:334](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L334) diff --git a/docs/docs/api/functions/generateText.md b/docs/docs/api/functions/generateText.md index 4c5c6da997..4822c4f911 100644 --- a/docs/docs/api/functions/generateText.md +++ b/docs/docs/api/functions/generateText.md @@ -30,4 +30,4 @@ The completed message. ## Defined in -[core/src/core/generation.ts:30](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L30) +[packages/core/src/generation.ts:43](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L43) diff --git a/docs/docs/api/functions/generateTextArray.md b/docs/docs/api/functions/generateTextArray.md index 8aa1618631..9535e6ff2b 100644 --- a/docs/docs/api/functions/generateTextArray.md +++ b/docs/docs/api/functions/generateTextArray.md @@ -26,4 +26,4 @@ Promise resolving to an array of strings parsed from the model's response ## Defined in -[core/src/core/generation.ts:402](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L402) +[packages/core/src/generation.ts:492](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L492) diff --git a/docs/docs/api/functions/generateTrueOrFalse.md b/docs/docs/api/functions/generateTrueOrFalse.md index 55a73fb820..7d967ba485 100644 --- a/docs/docs/api/functions/generateTrueOrFalse.md +++ b/docs/docs/api/functions/generateTrueOrFalse.md @@ -26,4 +26,4 @@ Promise resolving to a boolean value parsed from the model's response ## Defined in -[core/src/core/generation.ts:350](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L350) +[packages/core/src/generation.ts:436](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L436) diff --git a/docs/docs/api/functions/getActorDetails.md b/docs/docs/api/functions/getActorDetails.md index fd1308e231..29f6b9051a 100644 --- a/docs/docs/api/functions/getActorDetails.md +++ b/docs/docs/api/functions/getActorDetails.md @@ -18,4 +18,4 @@ Get details for a list of actors. ## Defined in -[core/src/core/messages.ts:12](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/messages.ts#L12) +[packages/core/src/messages.ts:12](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/messages.ts#L12) diff --git a/docs/docs/api/functions/getEndpoint.md b/docs/docs/api/functions/getEndpoint.md index 80d526b74a..9256e2ed63 100644 --- a/docs/docs/api/functions/getEndpoint.md +++ b/docs/docs/api/functions/getEndpoint.md @@ -1,15 +1,15 @@ # Function: getEndpoint() -> **getEndpoint**(`provider`): `any` +> **getEndpoint**(`provider`): `string` ## Parameters -• **provider**: [`ModelProvider`](../enumerations/ModelProvider.md) +• **provider**: [`ModelProviderName`](../enumerations/ModelProviderName.md) ## Returns -`any` +`string` ## Defined in -[core/src/core/models.ts:178](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/models.ts#L178) +[packages/core/src/models.ts:226](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/models.ts#L226) diff --git a/docs/docs/api/functions/getGoals.md b/docs/docs/api/functions/getGoals.md index 145fbd9bed..00070bcea5 100644 --- a/docs/docs/api/functions/getGoals.md +++ b/docs/docs/api/functions/getGoals.md @@ -22,4 +22,4 @@ ## Defined in -[core/src/core/goals.ts:8](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/goals.ts#L8) +[packages/core/src/goals.ts:8](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/goals.ts#L8) diff --git a/docs/docs/api/functions/getImageGenModel.md b/docs/docs/api/functions/getImageGenModel.md deleted file mode 100644 index cb905f5316..0000000000 --- a/docs/docs/api/functions/getImageGenModel.md +++ /dev/null @@ -1,15 +0,0 @@ -# Function: getImageGenModel() - -> **getImageGenModel**(`model`): `object` \| `object` - -## Parameters - -• **model**: [`ImageGenModel`](../enumerations/ImageGenModel.md) - -## Returns - -`object` \| `object` - -## Defined in - -[core/src/core/imageGenModels.ts:17](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/imageGenModels.ts#L17) diff --git a/docs/docs/api/functions/getModel.md b/docs/docs/api/functions/getModel.md index 9c980265b4..e1cd774147 100644 --- a/docs/docs/api/functions/getModel.md +++ b/docs/docs/api/functions/getModel.md @@ -1,17 +1,17 @@ # Function: getModel() -> **getModel**(`provider`, `type`): `any` +> **getModel**(`provider`, `type`): `string` ## Parameters -• **provider**: [`ModelProvider`](../enumerations/ModelProvider.md) +• **provider**: [`ModelProviderName`](../enumerations/ModelProviderName.md) • **type**: [`ModelClass`](../enumerations/ModelClass.md) ## Returns -`any` +`string` ## Defined in -[core/src/core/models.ts:174](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/models.ts#L174) +[packages/core/src/models.ts:222](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/models.ts#L222) diff --git a/docs/docs/api/functions/getProviders.md b/docs/docs/api/functions/getProviders.md index ae5e5b56b6..51868fa096 100644 --- a/docs/docs/api/functions/getProviders.md +++ b/docs/docs/api/functions/getProviders.md @@ -26,4 +26,4 @@ A string that concatenates the outputs of each provider. ## Defined in -[core/src/core/providers.ts:13](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/providers.ts#L13) +[packages/core/src/providers.ts:10](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/providers.ts#L10) diff --git a/docs/docs/api/functions/getRelationship.md b/docs/docs/api/functions/getRelationship.md index 53db6c21ee..48fd452b11 100644 --- a/docs/docs/api/functions/getRelationship.md +++ b/docs/docs/api/functions/getRelationship.md @@ -18,4 +18,4 @@ ## Defined in -[core/src/core/relationships.ts:18](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/relationships.ts#L18) +[packages/core/src/relationships.ts:18](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/relationships.ts#L18) diff --git a/docs/docs/api/functions/getRelationships.md b/docs/docs/api/functions/getRelationships.md index c4b451730c..dd2f41f6ad 100644 --- a/docs/docs/api/functions/getRelationships.md +++ b/docs/docs/api/functions/getRelationships.md @@ -16,4 +16,4 @@ ## Defined in -[core/src/core/relationships.ts:33](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/relationships.ts#L33) +[packages/core/src/relationships.ts:33](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/relationships.ts#L33) diff --git a/docs/docs/api/functions/getTokenForProvider.md b/docs/docs/api/functions/getTokenForProvider.md deleted file mode 100644 index 0177abf0f6..0000000000 --- a/docs/docs/api/functions/getTokenForProvider.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: getTokenForProvider() - -> **getTokenForProvider**(`provider`, `character`): `string` - -## Parameters - -• **provider**: [`ModelProvider`](../enumerations/ModelProvider.md) - -• **character**: [`Character`](../type-aliases/Character.md) - -## Returns - -`string` - -## Defined in - -[core/src/cli/index.ts:105](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L105) diff --git a/docs/docs/api/functions/initializeClients.md b/docs/docs/api/functions/initializeClients.md deleted file mode 100644 index 9549c70a10..0000000000 --- a/docs/docs/api/functions/initializeClients.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: initializeClients() - -> **initializeClients**(`character`, `runtime`): `Promise`\<`any`[]\> - -## Parameters - -• **character**: [`Character`](../type-aliases/Character.md) - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -## Returns - -`Promise`\<`any`[]\> - -## Defined in - -[core/src/cli/index.ts:21](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L21) diff --git a/docs/docs/api/functions/initializeDatabase.md b/docs/docs/api/functions/initializeDatabase.md deleted file mode 100644 index d7d58df27f..0000000000 --- a/docs/docs/api/functions/initializeDatabase.md +++ /dev/null @@ -1,11 +0,0 @@ -# Function: initializeDatabase() - -> **initializeDatabase**(): [`PostgresDatabaseAdapter`](../classes/PostgresDatabaseAdapter.md) \| [`SqliteDatabaseAdapter`](../classes/SqliteDatabaseAdapter.md) - -## Returns - -[`PostgresDatabaseAdapter`](../classes/PostgresDatabaseAdapter.md) \| [`SqliteDatabaseAdapter`](../classes/SqliteDatabaseAdapter.md) - -## Defined in - -[core/src/cli/index.ts:129](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L129) diff --git a/docs/docs/api/functions/isCreateAndBuyContent.md b/docs/docs/api/functions/isCreateAndBuyContent.md deleted file mode 100644 index da8cdbee1a..0000000000 --- a/docs/docs/api/functions/isCreateAndBuyContent.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: isCreateAndBuyContent() - -> **isCreateAndBuyContent**(`runtime`, `content`): `content is CreateAndBuyContent` - -## Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -• **content**: `any` - -## Returns - -`content is CreateAndBuyContent` - -## Defined in - -[core/src/actions/pumpfun.ts:33](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L33) diff --git a/docs/docs/api/functions/loadActionConfigs.md b/docs/docs/api/functions/loadActionConfigs.md deleted file mode 100644 index 3348a03d81..0000000000 --- a/docs/docs/api/functions/loadActionConfigs.md +++ /dev/null @@ -1,15 +0,0 @@ -# Function: loadActionConfigs() - -> **loadActionConfigs**(`configPath`): `ActionConfig`[] - -## Parameters - -• **configPath**: `string` - -## Returns - -`ActionConfig`[] - -## Defined in - -[core/src/cli/config.ts:15](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/config.ts#L15) diff --git a/docs/docs/api/functions/loadCharacters.md b/docs/docs/api/functions/loadCharacters.md deleted file mode 100644 index 43f4922c04..0000000000 --- a/docs/docs/api/functions/loadCharacters.md +++ /dev/null @@ -1,15 +0,0 @@ -# Function: loadCharacters() - -> **loadCharacters**(`charactersArg`): [`Character`](../type-aliases/Character.md)[] - -## Parameters - -• **charactersArg**: `string` - -## Returns - -[`Character`](../type-aliases/Character.md)[] - -## Defined in - -[core/src/cli/index.ts:70](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L70) diff --git a/docs/docs/api/functions/loadCustomActions.md b/docs/docs/api/functions/loadCustomActions.md deleted file mode 100644 index c1d81f66a4..0000000000 --- a/docs/docs/api/functions/loadCustomActions.md +++ /dev/null @@ -1,15 +0,0 @@ -# Function: loadCustomActions() - -> **loadCustomActions**(`actionConfigs`): `Promise`\<[`Action`](../interfaces/Action.md)[]\> - -## Parameters - -• **actionConfigs**: `ActionConfig`[] - -## Returns - -`Promise`\<[`Action`](../interfaces/Action.md)[]\> - -## Defined in - -[core/src/cli/config.ts:26](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/config.ts#L26) diff --git a/docs/docs/api/functions/loadEnvConfig.md b/docs/docs/api/functions/loadEnvConfig.md new file mode 100644 index 0000000000..e35a0abe67 --- /dev/null +++ b/docs/docs/api/functions/loadEnvConfig.md @@ -0,0 +1,19 @@ +# Function: loadEnvConfig() + +> **loadEnvConfig**(): `ProcessEnv` + +Loads environment variables from the nearest .env file + +## Returns + +`ProcessEnv` + +Environment variables object + +## Throws + +If no .env file is found + +## Defined in + +[packages/core/src/settings.ts:36](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/settings.ts#L36) diff --git a/docs/docs/api/functions/parseArguments.md b/docs/docs/api/functions/parseArguments.md deleted file mode 100644 index b70bd97354..0000000000 --- a/docs/docs/api/functions/parseArguments.md +++ /dev/null @@ -1,11 +0,0 @@ -# Function: parseArguments() - -> **parseArguments**(): `Arguments` - -## Returns - -`Arguments` - -## Defined in - -[core/src/cli/index.ts:46](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L46) diff --git a/docs/docs/api/functions/retrieveCachedEmbedding.md b/docs/docs/api/functions/retrieveCachedEmbedding.md index 31922d1ebc..ae1ad555ee 100644 --- a/docs/docs/api/functions/retrieveCachedEmbedding.md +++ b/docs/docs/api/functions/retrieveCachedEmbedding.md @@ -14,4 +14,4 @@ ## Defined in -[core/src/core/embedding.ts:65](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/embedding.ts#L65) +[packages/core/src/embedding.ts:146](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/embedding.ts#L146) diff --git a/docs/docs/api/functions/sellToken.md b/docs/docs/api/functions/sellToken.md deleted file mode 100644 index c275a4ae4e..0000000000 --- a/docs/docs/api/functions/sellToken.md +++ /dev/null @@ -1,31 +0,0 @@ -# Function: sellToken() - -> **sellToken**(`__namedParameters`): `Promise`\<`void`\> - -## Parameters - -• **\_\_namedParameters** - -• **\_\_namedParameters.allowOffCurve**: `boolean` - -• **\_\_namedParameters.amount**: `bigint` - -• **\_\_namedParameters.connection**: `Connection` - -• **\_\_namedParameters.mint**: `PublicKey` - -• **\_\_namedParameters.priorityFee**: `PriorityFee` - -• **\_\_namedParameters.sdk**: `PumpFunSDK` - -• **\_\_namedParameters.seller**: `Keypair` - -• **\_\_namedParameters.slippage**: `string` - -## Returns - -`Promise`\<`void`\> - -## Defined in - -[core/src/actions/pumpfun.ts:167](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L167) diff --git a/docs/docs/api/functions/splitChunks.md b/docs/docs/api/functions/splitChunks.md index 7e8758b533..9c40b2686b 100644 --- a/docs/docs/api/functions/splitChunks.md +++ b/docs/docs/api/functions/splitChunks.md @@ -1,13 +1,11 @@ # Function: splitChunks() -> **splitChunks**(`runtime`, `content`, `chunkSize`, `bleed`, `modelClass`): `Promise`\<`string`[]\> +> **splitChunks**(`content`, `chunkSize`, `bleed`): `Promise`\<`string`[]\> Splits content into chunks of specified size with optional overlapping bleed sections ## Parameters -• **runtime**: `any` - • **content**: `string` The text content to split into chunks @@ -20,8 +18,6 @@ The maximum size of each chunk in tokens Number of characters to overlap between chunks (default: 100) -• **modelClass**: `string` - ## Returns `Promise`\<`string`[]\> @@ -30,4 +26,4 @@ Promise resolving to array of text chunks with bleed sections ## Defined in -[core/src/core/generation.ts:302](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L302) +[packages/core/src/generation.ts:390](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L390) diff --git a/docs/docs/api/functions/startDiscord.md b/docs/docs/api/functions/startDiscord.md deleted file mode 100644 index 1c46e116f3..0000000000 --- a/docs/docs/api/functions/startDiscord.md +++ /dev/null @@ -1,15 +0,0 @@ -# Function: startDiscord() - -> **startDiscord**(`runtime`): [`DiscordClient`](../classes/DiscordClient.md) - -## Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -## Returns - -[`DiscordClient`](../classes/DiscordClient.md) - -## Defined in - -[core/src/cli/index.ts:211](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L211) diff --git a/docs/docs/api/functions/startTelegram.md b/docs/docs/api/functions/startTelegram.md deleted file mode 100644 index f70aa9fbab..0000000000 --- a/docs/docs/api/functions/startTelegram.md +++ /dev/null @@ -1,17 +0,0 @@ -# Function: startTelegram() - -> **startTelegram**(`runtime`, `character`): `Promise`\<[`TelegramClient`](../classes/TelegramClient.md)\> - -## Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -• **character**: [`Character`](../type-aliases/Character.md) - -## Returns - -`Promise`\<[`TelegramClient`](../classes/TelegramClient.md)\> - -## Defined in - -[core/src/cli/index.ts:215](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L215) diff --git a/docs/docs/api/functions/startTwitter.md b/docs/docs/api/functions/startTwitter.md deleted file mode 100644 index ab9859190d..0000000000 --- a/docs/docs/api/functions/startTwitter.md +++ /dev/null @@ -1,15 +0,0 @@ -# Function: startTwitter() - -> **startTwitter**(`runtime`): `Promise`\<([`TwitterPostClient`](../classes/TwitterPostClient.md) \| [`TwitterInteractionClient`](../classes/TwitterInteractionClient.md) \| [`TwitterSearchClient`](../classes/TwitterSearchClient.md))[]\> - -## Parameters - -• **runtime**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) - -## Returns - -`Promise`\<([`TwitterPostClient`](../classes/TwitterPostClient.md) \| [`TwitterInteractionClient`](../classes/TwitterInteractionClient.md) \| [`TwitterSearchClient`](../classes/TwitterSearchClient.md))[]\> - -## Defined in - -[core/src/cli/index.ts:245](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/cli/index.ts#L245) diff --git a/docs/docs/api/functions/trimTokens.md b/docs/docs/api/functions/trimTokens.md index b42f5b1671..251a92dc9d 100644 --- a/docs/docs/api/functions/trimTokens.md +++ b/docs/docs/api/functions/trimTokens.md @@ -22,4 +22,4 @@ The model to use for generateText. ## Defined in -[core/src/core/generation.ts:223](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/generation.ts#L223) +[packages/core/src/generation.ts:308](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/generation.ts#L308) diff --git a/docs/docs/api/functions/updateGoal.md b/docs/docs/api/functions/updateGoal.md index b4150ab70f..d2d93fe87f 100644 --- a/docs/docs/api/functions/updateGoal.md +++ b/docs/docs/api/functions/updateGoal.md @@ -16,4 +16,4 @@ ## Defined in -[core/src/core/goals.ts:44](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/goals.ts#L44) +[packages/core/src/goals.ts:44](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/goals.ts#L44) diff --git a/docs/docs/api/globals.md b/docs/docs/api/globals.md index c01b63de24..016a5729a6 100644 --- a/docs/docs/api/globals.md +++ b/docs/docs/api/globals.md @@ -1,28 +1,19 @@ -# @eliza/core +# @ai16z/eliza ## Enumerations - [Clients](enumerations/Clients.md) - [GoalStatus](enumerations/GoalStatus.md) -- [ImageGenModel](enumerations/ImageGenModel.md) - [ModelClass](enumerations/ModelClass.md) -- [ModelProvider](enumerations/ModelProvider.md) +- [ModelProviderName](enumerations/ModelProviderName.md) +- [ServiceType](enumerations/ServiceType.md) ## Classes - [AgentRuntime](classes/AgentRuntime.md) - [DatabaseAdapter](classes/DatabaseAdapter.md) -- [DirectClient](classes/DirectClient.md) -- [DiscordClient](classes/DiscordClient.md) - [MemoryManager](classes/MemoryManager.md) -- [PostgresDatabaseAdapter](classes/PostgresDatabaseAdapter.md) -- [SqliteDatabaseAdapter](classes/SqliteDatabaseAdapter.md) -- [TelegramClient](classes/TelegramClient.md) -- [TokenProvider](classes/TokenProvider.md) -- [TwitterInteractionClient](classes/TwitterInteractionClient.md) -- [TwitterPostClient](classes/TwitterPostClient.md) -- [TwitterSearchClient](classes/TwitterSearchClient.md) -- [WalletProvider](classes/WalletProvider.md) +- [Service](classes/Service.md) ## Interfaces @@ -32,18 +23,17 @@ - [Actor](interfaces/Actor.md) - [Content](interfaces/Content.md) - [ConversationExample](interfaces/ConversationExample.md) -- [CreateAndBuyContent](interfaces/CreateAndBuyContent.md) - [EvaluationExample](interfaces/EvaluationExample.md) - [Evaluator](interfaces/Evaluator.md) - [Goal](interfaces/Goal.md) - [IAgentRuntime](interfaces/IAgentRuntime.md) - [IBrowserService](interfaces/IBrowserService.md) - [IDatabaseAdapter](interfaces/IDatabaseAdapter.md) -- [IImageRecognitionService](interfaces/IImageRecognitionService.md) -- [ILlamaService](interfaces/ILlamaService.md) +- [IImageDescriptionService](interfaces/IImageDescriptionService.md) - [IMemoryManager](interfaces/IMemoryManager.md) - [IPdfService](interfaces/IPdfService.md) - [ISpeechService](interfaces/ISpeechService.md) +- [ITextGenerationService](interfaces/ITextGenerationService.md) - [ITranscriptionService](interfaces/ITranscriptionService.md) - [IVideoService](interfaces/IVideoService.md) - [Memory](interfaces/Memory.md) @@ -58,57 +48,34 @@ ## Type Aliases - [Character](type-aliases/Character.md) +- [Client](type-aliases/Client.md) - [Handler](type-aliases/Handler.md) - [HandlerCallback](type-aliases/HandlerCallback.md) - [Media](type-aliases/Media.md) - [Model](type-aliases/Model.md) +- [Models](type-aliases/Models.md) - [Plugin](type-aliases/Plugin.md) - [UUID](type-aliases/UUID.md) - [Validator](type-aliases/Validator.md) ## Variables -- [boredomProvider](variables/boredomProvider.md) -- [continueAction](variables/continueAction.md) -- [defaultActions](variables/defaultActions.md) - [defaultCharacter](variables/defaultCharacter.md) -- [defaultEvaluators](variables/defaultEvaluators.md) -- [defaultProviders](variables/defaultProviders.md) - [elizaLogger](variables/elizaLogger.md) - [embeddingDimension](variables/embeddingDimension.md) - [embeddingZeroVector](variables/embeddingZeroVector.md) - [evaluationTemplate](variables/evaluationTemplate.md) -- [executeSwap](variables/executeSwap.md) -- [followRoom](variables/followRoom.md) -- [ignore](variables/ignore.md) -- [imageGeneration](variables/imageGeneration.md) -- [imageGenModels](variables/imageGenModels.md) -- [messageHandlerTemplate](variables/messageHandlerTemplate.md) -- [muteRoom](variables/muteRoom.md) -- [none](variables/none.md) -- [orderBookProvider](variables/orderBookProvider.md) -- [shouldContinueTemplate](variables/shouldContinueTemplate.md) -- [shouldFollowTemplate](variables/shouldFollowTemplate.md) -- [shouldMuteTemplate](variables/shouldMuteTemplate.md) -- [shouldUnmuteTemplate](variables/shouldUnmuteTemplate.md) -- [timeProvider](variables/timeProvider.md) -- [tokenProvider](variables/tokenProvider.md) -- [unfollowRoom](variables/unfollowRoom.md) -- [unmuteRoom](variables/unmuteRoom.md) -- [walletProvider](variables/walletProvider.md) +- [settings](variables/settings.md) ## Functions - [addHeader](functions/addHeader.md) -- [buyToken](functions/buyToken.md) - [composeActionExamples](functions/composeActionExamples.md) - [composeContext](functions/composeContext.md) -- [createAgentRuntime](functions/createAgentRuntime.md) -- [createAndBuyToken](functions/createAndBuyToken.md) -- [createDirectRuntime](functions/createDirectRuntime.md) - [createGoal](functions/createGoal.md) - [createRelationship](functions/createRelationship.md) - [embed](functions/embed.md) +- [findNearestEnvFile](functions/findNearestEnvFile.md) - [formatActionNames](functions/formatActionNames.md) - [formatActions](functions/formatActions.md) - [formatActors](functions/formatActors.md) @@ -133,24 +100,12 @@ - [getActorDetails](functions/getActorDetails.md) - [getEndpoint](functions/getEndpoint.md) - [getGoals](functions/getGoals.md) -- [getImageGenModel](functions/getImageGenModel.md) - [getModel](functions/getModel.md) - [getProviders](functions/getProviders.md) - [getRelationship](functions/getRelationship.md) - [getRelationships](functions/getRelationships.md) -- [getTokenForProvider](functions/getTokenForProvider.md) -- [initializeClients](functions/initializeClients.md) -- [initializeDatabase](functions/initializeDatabase.md) -- [isCreateAndBuyContent](functions/isCreateAndBuyContent.md) -- [loadActionConfigs](functions/loadActionConfigs.md) -- [loadCharacters](functions/loadCharacters.md) -- [loadCustomActions](functions/loadCustomActions.md) -- [parseArguments](functions/parseArguments.md) +- [loadEnvConfig](functions/loadEnvConfig.md) - [retrieveCachedEmbedding](functions/retrieveCachedEmbedding.md) -- [sellToken](functions/sellToken.md) - [splitChunks](functions/splitChunks.md) -- [startDiscord](functions/startDiscord.md) -- [startTelegram](functions/startTelegram.md) -- [startTwitter](functions/startTwitter.md) - [trimTokens](functions/trimTokens.md) - [updateGoal](functions/updateGoal.md) diff --git a/docs/docs/api/index.md b/docs/docs/api/index.md index 277dac7816..19f4da9ef2 100644 --- a/docs/docs/api/index.md +++ b/docs/docs/api/index.md @@ -6,37 +6,38 @@ ## Features -- 🛠 Full-featured Discord, Twitter and Telegram connectors -- 👥 Multi-agent and room support -- 📚 Easily ingest and interact with your documents -- 💾 Retrievable memory and document store -- 🚀 Highly extensible - create your own actions and clients to extend capabilities -- ☁️ Supports many models, including local Llama, OpenAI, Anthropic, Groq, and more -- 📦 Just works! +- 🛠 Full-featured Discord, Twitter and Telegram connectors +- 👥 Multi-agent and room support +- 📚 Easily ingest and interact with your documents +- 💾 Retrievable memory and document store +- 🚀 Highly extensible - create your own actions and clients to extend capabilities +- ☁️ Supports many models, including local Llama, OpenAI, Anthropic, Groq, and more +- 📦 Just works! ## What can I use it for? -- 🤖 Chatbots -- 🕵️ Autonomous Agents -- 📈 Business process handling -- 🎮 Video game NPCs +- 🤖 Chatbots +- 🕵️ Autonomous Agents +- 📈 Business process handling +- 🎮 Video game NPCs # Getting Started **Prerequisites (MUST):** - -- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) -- [pnpm](https://pnpm.io/installation) + +- [Python 2.7+](https://www.python.org/downloads/) +- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) ### Edit the .env file -- Copy .env.example to .env and fill in the appropriate values -- Edit the TWITTER environment variables to add your bot's username and password +- Copy .env.example to .env and fill in the appropriate values +- Edit the TWITTER environment variables to add your bot's username and password ### Edit the character file -- Check out the file `src/core/defaultCharacter.ts` - you can modify this -- You can also load characters with the `pnpm start --characters="path/to/your/character.json"` and run multiple bots at the same time. +- Check out the file `src/core/defaultCharacter.ts` - you can modify this +- You can also load characters with the `pnpm start --characters="path/to/your/character.json"` and run multiple bots at the same time. After setting up the .env file and character file, you can start the bot with the following command: @@ -83,6 +84,7 @@ DISCORD_APPLICATION_ID= DISCORD_API_TOKEN= # Bot token OPENAI_API_KEY=sk-* # OpenAI API key, starting with sk- ELEVENLABS_XI_API_KEY= # API key from elevenlabs +GOOGLE_GENERATIVE_AI_API_KEY= # Gemini API key # ELEVENLABS SETTINGS ELEVENLABS_MODEL_ID=eleven_multilingual_v2 @@ -168,9 +170,9 @@ pnpm test:sqljs # Run tests with SQL.js Tests are written using Jest and can be found in `src/**/*.test.ts` files. The test environment is configured to: -- Load environment variables from `.env.test` -- Use a 2-minute timeout for long-running tests -- Support ESM modules -- Run tests in sequence (--runInBand) +- Load environment variables from `.env.test` +- Use a 2-minute timeout for long-running tests +- Support ESM modules +- Run tests in sequence (--runInBand) To create new tests, add a `.test.ts` file adjacent to the code you're testing. diff --git a/docs/docs/api/interfaces/Account.md b/docs/docs/api/interfaces/Account.md index c6022f7c90..95caadf8f8 100644 --- a/docs/docs/api/interfaces/Account.md +++ b/docs/docs/api/interfaces/Account.md @@ -10,9 +10,9 @@ Represents a user, including their name, details, and a unique identifier. #### Defined in -[core/src/core/types.ts:262](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L262) +[packages/core/src/types.ts:278](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L278) ---- +*** ### details? @@ -20,13 +20,13 @@ Represents a user, including their name, details, and a unique identifier. #### Index Signature -\[`key`: `string`\]: `any` + \[`key`: `string`\]: `any` #### Defined in -[core/src/core/types.ts:260](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L260) +[packages/core/src/types.ts:276](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L276) ---- +*** ### email? @@ -34,9 +34,9 @@ Represents a user, including their name, details, and a unique identifier. #### Defined in -[core/src/core/types.ts:261](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L261) +[packages/core/src/types.ts:277](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L277) ---- +*** ### id @@ -44,9 +44,9 @@ Represents a user, including their name, details, and a unique identifier. #### Defined in -[core/src/core/types.ts:257](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L257) +[packages/core/src/types.ts:273](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L273) ---- +*** ### name @@ -54,9 +54,9 @@ Represents a user, including their name, details, and a unique identifier. #### Defined in -[core/src/core/types.ts:258](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L258) +[packages/core/src/types.ts:274](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L274) ---- +*** ### username @@ -64,4 +64,4 @@ Represents a user, including their name, details, and a unique identifier. #### Defined in -[core/src/core/types.ts:259](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L259) +[packages/core/src/types.ts:275](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L275) diff --git a/docs/docs/api/interfaces/Action.md b/docs/docs/api/interfaces/Action.md index 6e83f71828..32c778c16b 100644 --- a/docs/docs/api/interfaces/Action.md +++ b/docs/docs/api/interfaces/Action.md @@ -10,9 +10,9 @@ Represents an action that the agent can perform, including conditions for its us #### Defined in -[core/src/core/types.ts:201](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L201) +[packages/core/src/types.ts:216](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L216) ---- +*** ### examples @@ -20,9 +20,9 @@ Represents an action that the agent can perform, including conditions for its us #### Defined in -[core/src/core/types.ts:202](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L202) +[packages/core/src/types.ts:217](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L217) ---- +*** ### handler @@ -30,9 +30,9 @@ Represents an action that the agent can perform, including conditions for its us #### Defined in -[core/src/core/types.ts:203](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L203) +[packages/core/src/types.ts:218](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L218) ---- +*** ### name @@ -40,9 +40,9 @@ Represents an action that the agent can perform, including conditions for its us #### Defined in -[core/src/core/types.ts:204](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L204) +[packages/core/src/types.ts:219](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L219) ---- +*** ### similes @@ -50,9 +50,9 @@ Represents an action that the agent can perform, including conditions for its us #### Defined in -[core/src/core/types.ts:200](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L200) +[packages/core/src/types.ts:215](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L215) ---- +*** ### validate @@ -60,4 +60,4 @@ Represents an action that the agent can perform, including conditions for its us #### Defined in -[core/src/core/types.ts:205](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L205) +[packages/core/src/types.ts:220](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L220) diff --git a/docs/docs/api/interfaces/ActionExample.md b/docs/docs/api/interfaces/ActionExample.md index 40240f293c..6f3afb1d73 100644 --- a/docs/docs/api/interfaces/ActionExample.md +++ b/docs/docs/api/interfaces/ActionExample.md @@ -10,9 +10,9 @@ Represents an example of content, typically used for demonstrating or testing pu #### Defined in -[core/src/core/types.ts:27](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L27) +[packages/core/src/types.ts:26](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L26) ---- +*** ### user @@ -20,4 +20,4 @@ Represents an example of content, typically used for demonstrating or testing pu #### Defined in -[core/src/core/types.ts:26](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L26) +[packages/core/src/types.ts:25](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L25) diff --git a/docs/docs/api/interfaces/Actor.md b/docs/docs/api/interfaces/Actor.md index be771e44ad..99acfab193 100644 --- a/docs/docs/api/interfaces/Actor.md +++ b/docs/docs/api/interfaces/Actor.md @@ -22,9 +22,9 @@ Represents an actor in the conversation, which could be a user or the agent itse #### Defined in -[core/src/core/types.ts:44](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L44) +[packages/core/src/types.ts:43](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L43) ---- +*** ### id @@ -32,9 +32,9 @@ Represents an actor in the conversation, which could be a user or the agent itse #### Defined in -[core/src/core/types.ts:45](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L45) +[packages/core/src/types.ts:44](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L44) ---- +*** ### name @@ -42,9 +42,9 @@ Represents an actor in the conversation, which could be a user or the agent itse #### Defined in -[core/src/core/types.ts:42](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L42) +[packages/core/src/types.ts:41](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L41) ---- +*** ### username @@ -52,4 +52,4 @@ Represents an actor in the conversation, which could be a user or the agent itse #### Defined in -[core/src/core/types.ts:43](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L43) +[packages/core/src/types.ts:42](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L42) diff --git a/docs/docs/api/interfaces/Content.md b/docs/docs/api/interfaces/Content.md index c5200d905d..fc01d7fff4 100644 --- a/docs/docs/api/interfaces/Content.md +++ b/docs/docs/api/interfaces/Content.md @@ -2,13 +2,9 @@ Represents the content of a message, including its main text (`content`), any associated action (`action`), and the source of the content (`source`), if applicable. -## Extended by - -- [`CreateAndBuyContent`](CreateAndBuyContent.md) - ## Indexable -\[`key`: `string`\]: `unknown` + \[`key`: `string`\]: `unknown` ## Properties @@ -18,9 +14,9 @@ Represents the content of a message, including its main text (`content`), any as #### Defined in -[core/src/core/types.ts:14](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L14) +[packages/core/src/types.ts:13](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L13) ---- +*** ### attachments? @@ -28,9 +24,9 @@ Represents the content of a message, including its main text (`content`), any as #### Defined in -[core/src/core/types.ts:18](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L18) +[packages/core/src/types.ts:17](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L17) ---- +*** ### inReplyTo? @@ -38,9 +34,9 @@ Represents the content of a message, including its main text (`content`), any as #### Defined in -[core/src/core/types.ts:17](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L17) +[packages/core/src/types.ts:16](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L16) ---- +*** ### source? @@ -48,9 +44,9 @@ Represents the content of a message, including its main text (`content`), any as #### Defined in -[core/src/core/types.ts:15](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L15) +[packages/core/src/types.ts:14](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L14) ---- +*** ### text @@ -58,9 +54,9 @@ Represents the content of a message, including its main text (`content`), any as #### Defined in -[core/src/core/types.ts:13](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L13) +[packages/core/src/types.ts:12](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L12) ---- +*** ### url? @@ -68,4 +64,4 @@ Represents the content of a message, including its main text (`content`), any as #### Defined in -[core/src/core/types.ts:16](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L16) +[packages/core/src/types.ts:15](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L15) diff --git a/docs/docs/api/interfaces/ConversationExample.md b/docs/docs/api/interfaces/ConversationExample.md index a060249192..770dbbd7e0 100644 --- a/docs/docs/api/interfaces/ConversationExample.md +++ b/docs/docs/api/interfaces/ConversationExample.md @@ -10,9 +10,9 @@ Represents an example of content, typically used for demonstrating or testing pu #### Defined in -[core/src/core/types.ts:35](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L35) +[packages/core/src/types.ts:34](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L34) ---- +*** ### userId @@ -20,4 +20,4 @@ Represents an example of content, typically used for demonstrating or testing pu #### Defined in -[core/src/core/types.ts:34](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L34) +[packages/core/src/types.ts:33](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L33) diff --git a/docs/docs/api/interfaces/CreateAndBuyContent.md b/docs/docs/api/interfaces/CreateAndBuyContent.md deleted file mode 100644 index fd158d5710..0000000000 --- a/docs/docs/api/interfaces/CreateAndBuyContent.md +++ /dev/null @@ -1,149 +0,0 @@ -# Interface: CreateAndBuyContent - -Represents the content of a message, including its main text (`content`), any associated action (`action`), and the source of the content (`source`), if applicable. - -## Extends - -- [`Content`](Content.md) - -## Properties - -### action? - -> `optional` **action**: `string` - -#### Inherited from - -[`Content`](Content.md).[`action`](Content.md#action) - -#### Defined in - -[core/src/core/types.ts:14](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L14) - ---- - -### allowOffCurve - -> **allowOffCurve**: `boolean` - -#### Defined in - -[core/src/actions/pumpfun.ts:30](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L30) - ---- - -### attachments? - -> `optional` **attachments**: [`Media`](../type-aliases/Media.md)[] - -#### Inherited from - -[`Content`](Content.md).[`attachments`](Content.md#attachments) - -#### Defined in - -[core/src/core/types.ts:18](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L18) - ---- - -### buyAmountSol - -> **buyAmountSol**: `string` \| `number` - -#### Defined in - -[core/src/actions/pumpfun.ts:25](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L25) - ---- - -### deployerPrivateKey - -> **deployerPrivateKey**: `string` - -#### Defined in - -[core/src/actions/pumpfun.ts:23](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L23) - ---- - -### inReplyTo? - -> `optional` **inReplyTo**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` - -#### Inherited from - -[`Content`](Content.md).[`inReplyTo`](Content.md#inreplyto) - -#### Defined in - -[core/src/core/types.ts:17](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L17) - ---- - -### priorityFee - -> **priorityFee**: `object` - -#### unitLimit - -> **unitLimit**: `number` - -#### unitPrice - -> **unitPrice**: `number` - -#### Defined in - -[core/src/actions/pumpfun.ts:26](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L26) - ---- - -### source? - -> `optional` **source**: `string` - -#### Inherited from - -[`Content`](Content.md).[`source`](Content.md#source) - -#### Defined in - -[core/src/core/types.ts:15](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L15) - ---- - -### text - -> **text**: `string` - -#### Inherited from - -[`Content`](Content.md).[`text`](Content.md#text) - -#### Defined in - -[core/src/core/types.ts:13](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L13) - ---- - -### tokenMetadata - -> **tokenMetadata**: `CreateTokenMetadata` - -#### Defined in - -[core/src/actions/pumpfun.ts:24](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/pumpfun.ts#L24) - ---- - -### url? - -> `optional` **url**: `string` - -#### Inherited from - -[`Content`](Content.md).[`url`](Content.md#url) - -#### Defined in - -[core/src/core/types.ts:16](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L16) diff --git a/docs/docs/api/interfaces/EvaluationExample.md b/docs/docs/api/interfaces/EvaluationExample.md index 0891f664ae..26e09982fb 100644 --- a/docs/docs/api/interfaces/EvaluationExample.md +++ b/docs/docs/api/interfaces/EvaluationExample.md @@ -10,9 +10,9 @@ Represents an example for evaluation, including the context, an array of message #### Defined in -[core/src/core/types.ts:212](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L212) +[packages/core/src/types.ts:227](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L227) ---- +*** ### messages @@ -20,9 +20,9 @@ Represents an example for evaluation, including the context, an array of message #### Defined in -[core/src/core/types.ts:213](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L213) +[packages/core/src/types.ts:228](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L228) ---- +*** ### outcome @@ -30,4 +30,4 @@ Represents an example for evaluation, including the context, an array of message #### Defined in -[core/src/core/types.ts:214](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L214) +[packages/core/src/types.ts:229](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L229) diff --git a/docs/docs/api/interfaces/Evaluator.md b/docs/docs/api/interfaces/Evaluator.md index 3596d2b1b3..f0fb1e9b6b 100644 --- a/docs/docs/api/interfaces/Evaluator.md +++ b/docs/docs/api/interfaces/Evaluator.md @@ -4,15 +4,25 @@ Represents an evaluator, which is used to assess and guide the agent's responses ## Properties +### alwaysRun? + +> `optional` **alwaysRun**: `boolean` + +#### Defined in + +[packages/core/src/types.ts:236](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L236) + +*** + ### description > **description**: `string` #### Defined in -[core/src/core/types.ts:221](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L221) +[packages/core/src/types.ts:237](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L237) ---- +*** ### examples @@ -20,9 +30,9 @@ Represents an evaluator, which is used to assess and guide the agent's responses #### Defined in -[core/src/core/types.ts:223](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L223) +[packages/core/src/types.ts:239](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L239) ---- +*** ### handler @@ -30,9 +40,9 @@ Represents an evaluator, which is used to assess and guide the agent's responses #### Defined in -[core/src/core/types.ts:224](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L224) +[packages/core/src/types.ts:240](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L240) ---- +*** ### name @@ -40,9 +50,9 @@ Represents an evaluator, which is used to assess and guide the agent's responses #### Defined in -[core/src/core/types.ts:225](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L225) +[packages/core/src/types.ts:241](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L241) ---- +*** ### similes @@ -50,9 +60,9 @@ Represents an evaluator, which is used to assess and guide the agent's responses #### Defined in -[core/src/core/types.ts:222](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L222) +[packages/core/src/types.ts:238](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L238) ---- +*** ### validate @@ -60,4 +70,4 @@ Represents an evaluator, which is used to assess and guide the agent's responses #### Defined in -[core/src/core/types.ts:226](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L226) +[packages/core/src/types.ts:242](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L242) diff --git a/docs/docs/api/interfaces/Goal.md b/docs/docs/api/interfaces/Goal.md index 8aa672768b..e670617453 100644 --- a/docs/docs/api/interfaces/Goal.md +++ b/docs/docs/api/interfaces/Goal.md @@ -10,9 +10,9 @@ Represents a goal, which is a higher-level aim composed of one or more objective #### Defined in -[core/src/core/types.ts:67](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L67) +[packages/core/src/types.ts:66](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L66) ---- +*** ### name @@ -20,9 +20,9 @@ Represents a goal, which is a higher-level aim composed of one or more objective #### Defined in -[core/src/core/types.ts:70](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L70) +[packages/core/src/types.ts:69](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L69) ---- +*** ### objectives @@ -30,9 +30,9 @@ Represents a goal, which is a higher-level aim composed of one or more objective #### Defined in -[core/src/core/types.ts:72](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L72) +[packages/core/src/types.ts:71](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L71) ---- +*** ### roomId @@ -40,9 +40,9 @@ Represents a goal, which is a higher-level aim composed of one or more objective #### Defined in -[core/src/core/types.ts:68](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L68) +[packages/core/src/types.ts:67](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L67) ---- +*** ### status @@ -50,9 +50,9 @@ Represents a goal, which is a higher-level aim composed of one or more objective #### Defined in -[core/src/core/types.ts:71](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L71) +[packages/core/src/types.ts:70](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L70) ---- +*** ### userId @@ -60,4 +60,4 @@ Represents a goal, which is a higher-level aim composed of one or more objective #### Defined in -[core/src/core/types.ts:69](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L69) +[packages/core/src/types.ts:68](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L68) diff --git a/docs/docs/api/interfaces/IAgentRuntime.md b/docs/docs/api/interfaces/IAgentRuntime.md index 61b5234f98..007ddb63ac 100644 --- a/docs/docs/api/interfaces/IAgentRuntime.md +++ b/docs/docs/api/interfaces/IAgentRuntime.md @@ -8,9 +8,9 @@ #### Defined in -[core/src/core/types.ts:494](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L494) +[packages/core/src/types.ts:527](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L527) ---- +*** ### agentId @@ -18,19 +18,9 @@ #### Defined in -[core/src/core/types.ts:486](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L486) +[packages/core/src/types.ts:520](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L520) ---- - -### browserService - -> **browserService**: [`IBrowserService`](IBrowserService.md) - -#### Defined in - -[core/src/core/types.ts:504](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L504) - ---- +*** ### character @@ -38,9 +28,9 @@ #### Defined in -[core/src/core/types.ts:492](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L492) +[packages/core/src/types.ts:525](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L525) ---- +*** ### databaseAdapter @@ -48,9 +38,9 @@ #### Defined in -[core/src/core/types.ts:488](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L488) +[packages/core/src/types.ts:522](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L522) ---- +*** ### descriptionManager @@ -58,49 +48,19 @@ #### Defined in -[core/src/core/types.ts:497](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L497) - ---- - -### factManager - -> **factManager**: [`IMemoryManager`](IMemoryManager.md) - -#### Defined in - -[core/src/core/types.ts:498](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L498) - ---- - -### imageDescriptionService - -> **imageDescriptionService**: [`IImageRecognitionService`](IImageRecognitionService.md) - -#### Defined in - -[core/src/core/types.ts:500](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L500) - ---- - -### imageGenModel - -> **imageGenModel**: [`ImageGenModel`](../enumerations/ImageGenModel.md) - -#### Defined in - -[core/src/core/types.ts:491](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L491) +[packages/core/src/types.ts:531](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L531) ---- +*** -### llamaService +### evaluators -> **llamaService**: [`ILlamaService`](ILlamaService.md) +> **evaluators**: [`Evaluator`](Evaluator.md)[] #### Defined in -[core/src/core/types.ts:503](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L503) +[packages/core/src/types.ts:528](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L528) ---- +*** ### loreManager @@ -108,9 +68,9 @@ #### Defined in -[core/src/core/types.ts:499](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L499) +[packages/core/src/types.ts:532](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L532) ---- +*** ### messageManager @@ -118,29 +78,19 @@ #### Defined in -[core/src/core/types.ts:496](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L496) +[packages/core/src/types.ts:530](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L530) ---- +*** ### modelProvider -> **modelProvider**: [`ModelProvider`](../enumerations/ModelProvider.md) +> **modelProvider**: [`ModelProviderName`](../enumerations/ModelProviderName.md) #### Defined in -[core/src/core/types.ts:490](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L490) +[packages/core/src/types.ts:524](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L524) ---- - -### pdfService - -> **pdfService**: [`IPdfService`](IPdfService.md) - -#### Defined in - -[core/src/core/types.ts:506](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L506) - ---- +*** ### providers @@ -148,9 +98,9 @@ #### Defined in -[core/src/core/types.ts:493](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L493) +[packages/core/src/types.ts:526](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L526) ---- +*** ### serverUrl @@ -158,19 +108,19 @@ #### Defined in -[core/src/core/types.ts:487](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L487) +[packages/core/src/types.ts:521](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L521) ---- +*** -### speechService +### services -> **speechService**: [`ISpeechService`](ISpeechService.md) +> **services**: `Map`\<[`ServiceType`](../enumerations/ServiceType.md), [`Service`](../classes/Service.md)\> #### Defined in -[core/src/core/types.ts:505](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L505) +[packages/core/src/types.ts:534](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L534) ---- +*** ### token @@ -178,27 +128,7 @@ #### Defined in -[core/src/core/types.ts:489](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L489) - ---- - -### transcriptionService - -> **transcriptionService**: [`ITranscriptionService`](ITranscriptionService.md) - -#### Defined in - -[core/src/core/types.ts:501](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L501) - ---- - -### videoService - -> **videoService**: [`IVideoService`](IVideoService.md) - -#### Defined in - -[core/src/core/types.ts:502](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L502) +[packages/core/src/types.ts:523](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L523) ## Methods @@ -218,9 +148,9 @@ #### Defined in -[core/src/core/types.ts:536](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L536) +[packages/core/src/types.ts:575](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L575) ---- +*** ### ensureConnection() @@ -244,9 +174,9 @@ #### Defined in -[core/src/core/types.ts:527](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L527) +[packages/core/src/types.ts:566](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L566) ---- +*** ### ensureParticipantExists() @@ -264,9 +194,9 @@ #### Defined in -[core/src/core/types.ts:519](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L519) +[packages/core/src/types.ts:558](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L558) ---- +*** ### ensureParticipantInRoom() @@ -284,9 +214,9 @@ #### Defined in -[core/src/core/types.ts:534](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L534) +[packages/core/src/types.ts:573](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L573) ---- +*** ### ensureRoomExists() @@ -302,9 +232,9 @@ #### Defined in -[core/src/core/types.ts:535](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L535) +[packages/core/src/types.ts:574](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L574) ---- +*** ### ensureUserExists() @@ -326,13 +256,13 @@ #### Defined in -[core/src/core/types.ts:520](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L520) +[packages/core/src/types.ts:559](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L559) ---- +*** ### evaluate() -> **evaluate**(`message`, `state`?): `Promise`\<`string`[]\> +> **evaluate**(`message`, `state`?, `didRespond`?): `Promise`\<`string`[]\> #### Parameters @@ -340,15 +270,17 @@ • **state?**: [`State`](State.md) +• **didRespond?**: `boolean` + #### Returns `Promise`\<`string`[]\> #### Defined in -[core/src/core/types.ts:518](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L518) +[packages/core/src/types.ts:553](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L553) ---- +*** ### getConversationLength() @@ -360,9 +292,45 @@ #### Defined in -[core/src/core/types.ts:511](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L511) +[packages/core/src/types.ts:546](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L546) + +*** + +### getMemoryManager() + +> **getMemoryManager**(`name`): [`IMemoryManager`](IMemoryManager.md) + +#### Parameters + +• **name**: `string` + +#### Returns + +[`IMemoryManager`](IMemoryManager.md) + +#### Defined in + +[packages/core/src/types.ts:537](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L537) + +*** + +### getService() + +> **getService**(`service`): *typeof* [`Service`](../classes/Service.md) + +#### Parameters + +• **service**: `string` + +#### Returns + +*typeof* [`Service`](../classes/Service.md) + +#### Defined in + +[packages/core/src/types.ts:539](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L539) ---- +*** ### getSetting() @@ -378,9 +346,9 @@ #### Defined in -[core/src/core/types.ts:508](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L508) +[packages/core/src/types.ts:543](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L543) ---- +*** ### processActions() @@ -402,9 +370,9 @@ #### Defined in -[core/src/core/types.ts:512](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L512) +[packages/core/src/types.ts:547](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L547) ---- +*** ### registerAction() @@ -420,9 +388,45 @@ #### Defined in -[core/src/core/types.ts:526](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L526) +[packages/core/src/types.ts:565](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L565) + +*** + +### registerMemoryManager() + +> **registerMemoryManager**(`manager`): `void` + +#### Parameters + +• **manager**: [`IMemoryManager`](IMemoryManager.md) + +#### Returns + +`void` + +#### Defined in + +[packages/core/src/types.ts:535](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L535) + +*** + +### registerService() + +> **registerService**(`service`): `void` + +#### Parameters + +• **service**: [`Service`](../classes/Service.md) + +#### Returns + +`void` + +#### Defined in + +[packages/core/src/types.ts:541](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L541) ---- +*** ### updateRecentMessageState() @@ -438,4 +442,4 @@ #### Defined in -[core/src/core/types.ts:540](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L540) +[packages/core/src/types.ts:579](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L579) diff --git a/docs/docs/api/interfaces/IBrowserService.md b/docs/docs/api/interfaces/IBrowserService.md index 445c72451b..68b05ceb08 100644 --- a/docs/docs/api/interfaces/IBrowserService.md +++ b/docs/docs/api/interfaces/IBrowserService.md @@ -1,5 +1,9 @@ # Interface: IBrowserService +## Extends + +- [`Service`](../classes/Service.md) + ## Methods ### closeBrowser() @@ -12,18 +16,20 @@ #### Defined in -[core/src/core/types.ts:587](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L587) +[packages/core/src/types.ts:630](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L630) ---- +*** ### getPageContent() -> **getPageContent**(`url`): `Promise`\<`object`\> +> **getPageContent**(`url`, `runtime`): `Promise`\<`object`\> #### Parameters • **url**: `string` +• **runtime**: [`IAgentRuntime`](IAgentRuntime.md) + #### Returns `Promise`\<`object`\> @@ -42,9 +48,9 @@ #### Defined in -[core/src/core/types.ts:588](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L588) +[packages/core/src/types.ts:631](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L631) ---- +*** ### initialize() @@ -56,4 +62,4 @@ #### Defined in -[core/src/core/types.ts:586](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L586) +[packages/core/src/types.ts:629](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L629) diff --git a/docs/docs/api/interfaces/IDatabaseAdapter.md b/docs/docs/api/interfaces/IDatabaseAdapter.md index 76d1544b16..5fd2d8e6ac 100644 --- a/docs/docs/api/interfaces/IDatabaseAdapter.md +++ b/docs/docs/api/interfaces/IDatabaseAdapter.md @@ -8,7 +8,7 @@ #### Defined in -[core/src/core/types.ts:342](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L342) +[packages/core/src/types.ts:363](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L363) ## Methods @@ -28,9 +28,9 @@ #### Defined in -[core/src/core/types.ts:424](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L424) +[packages/core/src/types.ts:445](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L445) ---- +*** ### countMemories() @@ -50,9 +50,9 @@ #### Defined in -[core/src/core/types.ts:404](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L404) +[packages/core/src/types.ts:425](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L425) ---- +*** ### createAccount() @@ -68,9 +68,9 @@ #### Defined in -[core/src/core/types.ts:344](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L344) +[packages/core/src/types.ts:365](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L365) ---- +*** ### createGoal() @@ -86,9 +86,9 @@ #### Defined in -[core/src/core/types.ts:416](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L416) +[packages/core/src/types.ts:437](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L437) ---- +*** ### createMemory() @@ -108,9 +108,9 @@ #### Defined in -[core/src/core/types.ts:397](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L397) +[packages/core/src/types.ts:418](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L418) ---- +*** ### createRelationship() @@ -130,9 +130,9 @@ #### Defined in -[core/src/core/types.ts:437](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L437) +[packages/core/src/types.ts:458](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L458) ---- +*** ### createRoom() @@ -148,9 +148,9 @@ #### Defined in -[core/src/core/types.ts:420](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L420) +[packages/core/src/types.ts:441](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L441) ---- +*** ### getAccountById() @@ -166,9 +166,9 @@ #### Defined in -[core/src/core/types.ts:343](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L343) +[packages/core/src/types.ts:364](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L364) ---- +*** ### getActorDetails() @@ -186,9 +186,9 @@ #### Defined in -[core/src/core/types.ts:373](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L373) +[packages/core/src/types.ts:394](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L394) ---- +*** ### getCachedEmbeddings() @@ -198,17 +198,17 @@ • **params** -• **params.query_field_name**: `string` +• **params.query\_field\_name**: `string` -• **params.query_field_sub_name**: `string` +• **params.query\_field\_sub\_name**: `string` -• **params.query_input**: `string` +• **params.query\_input**: `string` -• **params.query_match_count**: `number` +• **params.query\_match\_count**: `number` -• **params.query_table_name**: `string` +• **params.query\_table\_name**: `string` -• **params.query_threshold**: `number` +• **params.query\_threshold**: `number` #### Returns @@ -216,9 +216,9 @@ #### Defined in -[core/src/core/types.ts:359](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L359) +[packages/core/src/types.ts:380](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L380) ---- +*** ### getGoals() @@ -242,9 +242,9 @@ #### Defined in -[core/src/core/types.ts:409](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L409) +[packages/core/src/types.ts:430](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L430) ---- +*** ### getMemories() @@ -274,9 +274,9 @@ #### Defined in -[core/src/core/types.ts:345](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L345) +[packages/core/src/types.ts:366](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L366) ---- +*** ### getMemoriesByRoomIds() @@ -296,9 +296,9 @@ #### Defined in -[core/src/core/types.ts:355](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L355) +[packages/core/src/types.ts:376](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L376) ---- +*** ### getMemoryById() @@ -314,9 +314,9 @@ #### Defined in -[core/src/core/types.ts:354](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L354) +[packages/core/src/types.ts:375](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L375) ---- +*** ### getParticipantsForAccount() @@ -332,9 +332,9 @@ #### Defined in -[core/src/core/types.ts:426](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L426) +[packages/core/src/types.ts:447](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L447) ---- +*** ### getParticipantsForRoom() @@ -350,9 +350,9 @@ #### Defined in -[core/src/core/types.ts:427](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L427) +[packages/core/src/types.ts:448](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L448) ---- +*** ### getParticipantUserState() @@ -370,9 +370,9 @@ #### Defined in -[core/src/core/types.ts:428](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L428) +[packages/core/src/types.ts:449](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L449) ---- +*** ### getRelationship() @@ -392,9 +392,9 @@ #### Defined in -[core/src/core/types.ts:438](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L438) +[packages/core/src/types.ts:459](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L459) ---- +*** ### getRelationships() @@ -412,9 +412,9 @@ #### Defined in -[core/src/core/types.ts:442](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L442) +[packages/core/src/types.ts:463](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L463) ---- +*** ### getRoom() @@ -430,9 +430,9 @@ #### Defined in -[core/src/core/types.ts:419](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L419) +[packages/core/src/types.ts:440](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L440) ---- +*** ### getRoomsForParticipant() @@ -448,9 +448,9 @@ #### Defined in -[core/src/core/types.ts:422](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L422) +[packages/core/src/types.ts:443](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L443) ---- +*** ### getRoomsForParticipants() @@ -466,9 +466,9 @@ #### Defined in -[core/src/core/types.ts:423](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L423) +[packages/core/src/types.ts:444](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L444) ---- +*** ### log() @@ -492,9 +492,9 @@ #### Defined in -[core/src/core/types.ts:367](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L367) +[packages/core/src/types.ts:388](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L388) ---- +*** ### removeAllGoals() @@ -510,9 +510,9 @@ #### Defined in -[core/src/core/types.ts:418](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L418) +[packages/core/src/types.ts:439](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L439) ---- +*** ### removeAllMemories() @@ -530,9 +530,9 @@ #### Defined in -[core/src/core/types.ts:403](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L403) +[packages/core/src/types.ts:424](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L424) ---- +*** ### removeGoal() @@ -548,9 +548,9 @@ #### Defined in -[core/src/core/types.ts:417](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L417) +[packages/core/src/types.ts:438](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L438) ---- +*** ### removeMemory() @@ -568,9 +568,9 @@ #### Defined in -[core/src/core/types.ts:402](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L402) +[packages/core/src/types.ts:423](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L423) ---- +*** ### removeParticipant() @@ -588,9 +588,9 @@ #### Defined in -[core/src/core/types.ts:425](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L425) +[packages/core/src/types.ts:446](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L446) ---- +*** ### removeRoom() @@ -606,9 +606,9 @@ #### Defined in -[core/src/core/types.ts:421](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L421) +[packages/core/src/types.ts:442](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L442) ---- +*** ### searchMemories() @@ -620,9 +620,9 @@ • **params.embedding**: `number`[] -• **params.match_count**: `number` +• **params.match\_count**: `number` -• **params.match_threshold**: `number` +• **params.match\_threshold**: `number` • **params.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` @@ -636,9 +636,9 @@ #### Defined in -[core/src/core/types.ts:374](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L374) +[packages/core/src/types.ts:395](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L395) ---- +*** ### searchMemoriesByEmbedding() @@ -654,7 +654,7 @@ • **params.count?**: `number` -• **params.match_threshold?**: `number` +• **params.match\_threshold?**: `number` • **params.roomId?**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` @@ -668,9 +668,9 @@ #### Defined in -[core/src/core/types.ts:386](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L386) +[packages/core/src/types.ts:407](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L407) ---- +*** ### setParticipantUserState() @@ -690,9 +690,9 @@ #### Defined in -[core/src/core/types.ts:432](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L432) +[packages/core/src/types.ts:453](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L453) ---- +*** ### updateGoal() @@ -708,9 +708,9 @@ #### Defined in -[core/src/core/types.ts:415](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L415) +[packages/core/src/types.ts:436](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L436) ---- +*** ### updateGoalStatus() @@ -730,4 +730,4 @@ #### Defined in -[core/src/core/types.ts:382](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L382) +[packages/core/src/types.ts:403](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L403) diff --git a/docs/docs/api/interfaces/IImageDescriptionService.md b/docs/docs/api/interfaces/IImageDescriptionService.md new file mode 100644 index 0000000000..88eb6bd592 --- /dev/null +++ b/docs/docs/api/interfaces/IImageDescriptionService.md @@ -0,0 +1,65 @@ +# Interface: IImageDescriptionService + +## Extends + +- [`Service`](../classes/Service.md) + +## Methods + +### describeImage() + +> **describeImage**(`imageUrl`): `Promise`\<`object`\> + +#### Parameters + +• **imageUrl**: `string` + +#### Returns + +`Promise`\<`object`\> + +##### description + +> **description**: `string` + +##### title + +> **title**: `string` + +#### Defined in + +[packages/core/src/types.ts:585](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L585) + +*** + +### getInstance() + +> **getInstance**(): [`IImageDescriptionService`](IImageDescriptionService.md) + +#### Returns + +[`IImageDescriptionService`](IImageDescriptionService.md) + +#### Defined in + +[packages/core/src/types.ts:583](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L583) + +*** + +### initialize() + +> **initialize**(`modelId`?, `device`?): `Promise`\<`void`\> + +#### Parameters + +• **modelId?**: `string` + +• **device?**: `string` + +#### Returns + +`Promise`\<`void`\> + +#### Defined in + +[packages/core/src/types.ts:584](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L584) diff --git a/docs/docs/api/interfaces/IImageRecognitionService.md b/docs/docs/api/interfaces/IImageRecognitionService.md deleted file mode 100644 index 80743e38c6..0000000000 --- a/docs/docs/api/interfaces/IImageRecognitionService.md +++ /dev/null @@ -1,47 +0,0 @@ -# Interface: IImageRecognitionService - -## Methods - -### describeImage() - -> **describeImage**(`imageUrl`): `Promise`\<`object`\> - -#### Parameters - -• **imageUrl**: `string` - -#### Returns - -`Promise`\<`object`\> - -##### description - -> **description**: `string` - -##### title - -> **title**: `string` - -#### Defined in - -[core/src/core/types.ts:545](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L545) - ---- - -### initialize() - -> **initialize**(`modelId`?, `device`?): `Promise`\<`void`\> - -#### Parameters - -• **modelId?**: `string` - -• **device?**: `string` - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[core/src/core/types.ts:544](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L544) diff --git a/docs/docs/api/interfaces/ILlamaService.md b/docs/docs/api/interfaces/ILlamaService.md deleted file mode 100644 index 99f1d512e7..0000000000 --- a/docs/docs/api/interfaces/ILlamaService.md +++ /dev/null @@ -1,89 +0,0 @@ -# Interface: ILlamaService - -## Methods - -### getEmbeddingResponse() - -> **getEmbeddingResponse**(`input`): `Promise`\<`number`[]\> - -#### Parameters - -• **input**: `string` - -#### Returns - -`Promise`\<`number`[]\> - -#### Defined in - -[core/src/core/types.ts:582](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L582) - ---- - -### initializeModel() - -> **initializeModel**(): `Promise`\<`void`\> - -#### Returns - -`Promise`\<`void`\> - -#### Defined in - -[core/src/core/types.ts:565](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L565) - ---- - -### queueMessageCompletion() - -> **queueMessageCompletion**(`context`, `temperature`, `stop`, `frequency_penalty`, `presence_penalty`, `max_tokens`): `Promise`\<`any`\> - -#### Parameters - -• **context**: `string` - -• **temperature**: `number` - -• **stop**: `string`[] - -• **frequency_penalty**: `number` - -• **presence_penalty**: `number` - -• **max_tokens**: `number` - -#### Returns - -`Promise`\<`any`\> - -#### Defined in - -[core/src/core/types.ts:566](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L566) - ---- - -### queueTextCompletion() - -> **queueTextCompletion**(`context`, `temperature`, `stop`, `frequency_penalty`, `presence_penalty`, `max_tokens`): `Promise`\<`string`\> - -#### Parameters - -• **context**: `string` - -• **temperature**: `number` - -• **stop**: `string`[] - -• **frequency_penalty**: `number` - -• **presence_penalty**: `number` - -• **max_tokens**: `number` - -#### Returns - -`Promise`\<`string`\> - -#### Defined in - -[core/src/core/types.ts:574](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L574) diff --git a/docs/docs/api/interfaces/IMemoryManager.md b/docs/docs/api/interfaces/IMemoryManager.md index 9026f0b807..4bac2ef5fd 100644 --- a/docs/docs/api/interfaces/IMemoryManager.md +++ b/docs/docs/api/interfaces/IMemoryManager.md @@ -8,9 +8,9 @@ #### Defined in -[core/src/core/types.ts:449](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L449) +[packages/core/src/types.ts:470](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L470) ---- +*** ### runtime @@ -18,9 +18,9 @@ #### Defined in -[core/src/core/types.ts:446](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L446) +[packages/core/src/types.ts:467](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L467) ---- +*** ### tableName @@ -28,7 +28,7 @@ #### Defined in -[core/src/core/types.ts:447](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L447) +[packages/core/src/types.ts:468](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L468) ## Methods @@ -46,9 +46,9 @@ #### Defined in -[core/src/core/types.ts:451](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L451) +[packages/core/src/types.ts:472](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L472) ---- +*** ### countMemories() @@ -66,9 +66,9 @@ #### Defined in -[core/src/core/types.ts:481](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L481) +[packages/core/src/types.ts:502](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L502) ---- +*** ### createMemory() @@ -86,9 +86,9 @@ #### Defined in -[core/src/core/types.ts:478](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L478) +[packages/core/src/types.ts:499](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L499) ---- +*** ### getCachedEmbeddings() @@ -104,9 +104,9 @@ #### Defined in -[core/src/core/types.ts:460](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L460) +[packages/core/src/types.ts:481](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L481) ---- +*** ### getMemories() @@ -134,9 +134,9 @@ #### Defined in -[core/src/core/types.ts:452](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L452) +[packages/core/src/types.ts:473](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L473) ---- +*** ### getMemoriesByRoomIds() @@ -156,9 +156,9 @@ #### Defined in -[core/src/core/types.ts:464](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L464) +[packages/core/src/types.ts:485](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L485) ---- +*** ### getMemoryById() @@ -174,9 +174,9 @@ #### Defined in -[core/src/core/types.ts:463](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L463) +[packages/core/src/types.ts:484](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L484) ---- +*** ### removeAllMemories() @@ -192,9 +192,9 @@ #### Defined in -[core/src/core/types.ts:480](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L480) +[packages/core/src/types.ts:501](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L501) ---- +*** ### removeMemory() @@ -210,9 +210,9 @@ #### Defined in -[core/src/core/types.ts:479](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L479) +[packages/core/src/types.ts:500](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L500) ---- +*** ### searchMemoriesByEmbedding() @@ -228,7 +228,7 @@ • **opts.count?**: `number` -• **opts.match_threshold?**: `number` +• **opts.match\_threshold?**: `number` • **opts.roomId**: \`$\{string\}-$\{string\}-$\{string\}-$\{string\}-$\{string\}\` @@ -240,4 +240,4 @@ #### Defined in -[core/src/core/types.ts:468](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L468) +[packages/core/src/types.ts:489](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L489) diff --git a/docs/docs/api/interfaces/IPdfService.md b/docs/docs/api/interfaces/IPdfService.md index a4d4b01171..34f2294e70 100644 --- a/docs/docs/api/interfaces/IPdfService.md +++ b/docs/docs/api/interfaces/IPdfService.md @@ -1,5 +1,9 @@ # Interface: IPdfService +## Extends + +- [`Service`](../classes/Service.md) + ## Methods ### convertPdfToText() @@ -16,4 +20,4 @@ #### Defined in -[core/src/core/types.ts:598](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L598) +[packages/core/src/types.ts:642](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L642) diff --git a/docs/docs/api/interfaces/ISpeechService.md b/docs/docs/api/interfaces/ISpeechService.md index 1fd5891420..f3cf22f1d3 100644 --- a/docs/docs/api/interfaces/ISpeechService.md +++ b/docs/docs/api/interfaces/ISpeechService.md @@ -1,5 +1,9 @@ # Interface: ISpeechService +## Extends + +- [`Service`](../classes/Service.md) + ## Methods ### generate() @@ -18,4 +22,4 @@ #### Defined in -[core/src/core/types.ts:594](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L594) +[packages/core/src/types.ts:638](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L638) diff --git a/docs/docs/api/interfaces/ITextGenerationService.md b/docs/docs/api/interfaces/ITextGenerationService.md new file mode 100644 index 0000000000..d9a473e32b --- /dev/null +++ b/docs/docs/api/interfaces/ITextGenerationService.md @@ -0,0 +1,107 @@ +# Interface: ITextGenerationService + +## Extends + +- [`Service`](../classes/Service.md) + +## Methods + +### getEmbeddingResponse() + +> **getEmbeddingResponse**(`input`): `Promise`\<`number`[]\> + +#### Parameters + +• **input**: `string` + +#### Returns + +`Promise`\<`number`[]\> + +#### Defined in + +[packages/core/src/types.ts:625](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L625) + +*** + +### getInstance() + +> **getInstance**(): [`ITextGenerationService`](ITextGenerationService.md) + +#### Returns + +[`ITextGenerationService`](ITextGenerationService.md) + +#### Defined in + +[packages/core/src/types.ts:607](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L607) + +*** + +### initializeModel() + +> **initializeModel**(): `Promise`\<`void`\> + +#### Returns + +`Promise`\<`void`\> + +#### Defined in + +[packages/core/src/types.ts:608](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L608) + +*** + +### queueMessageCompletion() + +> **queueMessageCompletion**(`context`, `temperature`, `stop`, `frequency_penalty`, `presence_penalty`, `max_tokens`): `Promise`\<`any`\> + +#### Parameters + +• **context**: `string` + +• **temperature**: `number` + +• **stop**: `string`[] + +• **frequency\_penalty**: `number` + +• **presence\_penalty**: `number` + +• **max\_tokens**: `number` + +#### Returns + +`Promise`\<`any`\> + +#### Defined in + +[packages/core/src/types.ts:609](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L609) + +*** + +### queueTextCompletion() + +> **queueTextCompletion**(`context`, `temperature`, `stop`, `frequency_penalty`, `presence_penalty`, `max_tokens`): `Promise`\<`string`\> + +#### Parameters + +• **context**: `string` + +• **temperature**: `number` + +• **stop**: `string`[] + +• **frequency\_penalty**: `number` + +• **presence\_penalty**: `number` + +• **max\_tokens**: `number` + +#### Returns + +`Promise`\<`string`\> + +#### Defined in + +[packages/core/src/types.ts:617](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L617) diff --git a/docs/docs/api/interfaces/ITranscriptionService.md b/docs/docs/api/interfaces/ITranscriptionService.md index e21318f281..680f2d02aa 100644 --- a/docs/docs/api/interfaces/ITranscriptionService.md +++ b/docs/docs/api/interfaces/ITranscriptionService.md @@ -1,5 +1,9 @@ # Interface: ITranscriptionService +## Extends + +- [`Service`](../classes/Service.md) + ## Methods ### transcribe() @@ -16,9 +20,9 @@ #### Defined in -[core/src/core/types.ts:555](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L555) +[packages/core/src/types.ts:595](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L595) ---- +*** ### transcribeAttachment() @@ -34,9 +38,9 @@ #### Defined in -[core/src/core/types.ts:551](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L551) +[packages/core/src/types.ts:591](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L591) ---- +*** ### transcribeAttachmentLocally() @@ -52,9 +56,9 @@ #### Defined in -[core/src/core/types.ts:552](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L552) +[packages/core/src/types.ts:592](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L592) ---- +*** ### transcribeLocally() @@ -70,4 +74,4 @@ #### Defined in -[core/src/core/types.ts:556](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L556) +[packages/core/src/types.ts:596](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L596) diff --git a/docs/docs/api/interfaces/IVideoService.md b/docs/docs/api/interfaces/IVideoService.md index 37974807ef..869f3b6ab0 100644 --- a/docs/docs/api/interfaces/IVideoService.md +++ b/docs/docs/api/interfaces/IVideoService.md @@ -1,7 +1,47 @@ # Interface: IVideoService +## Extends + +- [`Service`](../classes/Service.md) + ## Methods +### downloadVideo() + +> **downloadVideo**(`videoInfo`): `Promise`\<`string`\> + +#### Parameters + +• **videoInfo**: [`Media`](../type-aliases/Media.md) + +#### Returns + +`Promise`\<`string`\> + +#### Defined in + +[packages/core/src/types.ts:603](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L603) + +*** + +### fetchVideoInfo() + +> **fetchVideoInfo**(`url`): `Promise`\<[`Media`](../type-aliases/Media.md)\> + +#### Parameters + +• **url**: `string` + +#### Returns + +`Promise`\<[`Media`](../type-aliases/Media.md)\> + +#### Defined in + +[packages/core/src/types.ts:602](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L602) + +*** + ### isVideoUrl() > **isVideoUrl**(`url`): `boolean` @@ -16,9 +56,9 @@ #### Defined in -[core/src/core/types.ts:560](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L560) +[packages/core/src/types.ts:600](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L600) ---- +*** ### processVideo() @@ -34,4 +74,4 @@ #### Defined in -[core/src/core/types.ts:561](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L561) +[packages/core/src/types.ts:601](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L601) diff --git a/docs/docs/api/interfaces/Memory.md b/docs/docs/api/interfaces/Memory.md index b395bcfa43..f4d3853c54 100644 --- a/docs/docs/api/interfaces/Memory.md +++ b/docs/docs/api/interfaces/Memory.md @@ -10,9 +10,9 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:154](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L154) +[packages/core/src/types.ts:169](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L169) ---- +*** ### content @@ -20,9 +20,9 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:156](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L156) +[packages/core/src/types.ts:171](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L171) ---- +*** ### createdAt? @@ -30,9 +30,9 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:155](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L155) +[packages/core/src/types.ts:170](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L170) ---- +*** ### embedding? @@ -40,9 +40,9 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:157](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L157) +[packages/core/src/types.ts:172](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L172) ---- +*** ### id? @@ -50,9 +50,9 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:152](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L152) +[packages/core/src/types.ts:167](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L167) ---- +*** ### roomId @@ -60,9 +60,9 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:158](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L158) +[packages/core/src/types.ts:173](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L173) ---- +*** ### unique? @@ -70,9 +70,9 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:159](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L159) +[packages/core/src/types.ts:174](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L174) ---- +*** ### userId @@ -80,4 +80,4 @@ Represents a memory record, which could be a message or any other piece of infor #### Defined in -[core/src/core/types.ts:153](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L153) +[packages/core/src/types.ts:168](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L168) diff --git a/docs/docs/api/interfaces/MessageExample.md b/docs/docs/api/interfaces/MessageExample.md index 100e99f58e..7d382ce7a8 100644 --- a/docs/docs/api/interfaces/MessageExample.md +++ b/docs/docs/api/interfaces/MessageExample.md @@ -10,9 +10,9 @@ Represents an example of a message, typically used for demonstrating or testing #### Defined in -[core/src/core/types.ts:167](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L167) +[packages/core/src/types.ts:182](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L182) ---- +*** ### user @@ -20,4 +20,4 @@ Represents an example of a message, typically used for demonstrating or testing #### Defined in -[core/src/core/types.ts:166](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L166) +[packages/core/src/types.ts:181](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L181) diff --git a/docs/docs/api/interfaces/Objective.md b/docs/docs/api/interfaces/Objective.md index 6fd03f9c5e..6f22a6552d 100644 --- a/docs/docs/api/interfaces/Objective.md +++ b/docs/docs/api/interfaces/Objective.md @@ -10,9 +10,9 @@ Represents an objective within a goal, detailing what needs to be achieved and w #### Defined in -[core/src/core/types.ts:54](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L54) +[packages/core/src/types.ts:53](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L53) ---- +*** ### description @@ -20,9 +20,9 @@ Represents an objective within a goal, detailing what needs to be achieved and w #### Defined in -[core/src/core/types.ts:53](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L53) +[packages/core/src/types.ts:52](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L52) ---- +*** ### id? @@ -30,4 +30,4 @@ Represents an objective within a goal, detailing what needs to be achieved and w #### Defined in -[core/src/core/types.ts:52](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L52) +[packages/core/src/types.ts:51](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L51) diff --git a/docs/docs/api/interfaces/Participant.md b/docs/docs/api/interfaces/Participant.md index e8a774c6f2..121b76e5db 100644 --- a/docs/docs/api/interfaces/Participant.md +++ b/docs/docs/api/interfaces/Participant.md @@ -10,9 +10,9 @@ Represents a participant in a room, including their ID and account details. #### Defined in -[core/src/core/types.ts:270](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L270) +[packages/core/src/types.ts:286](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L286) ---- +*** ### id @@ -20,4 +20,4 @@ Represents a participant in a room, including their ID and account details. #### Defined in -[core/src/core/types.ts:269](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L269) +[packages/core/src/types.ts:285](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L285) diff --git a/docs/docs/api/interfaces/Provider.md b/docs/docs/api/interfaces/Provider.md index 8951692f9c..daa6911d47 100644 --- a/docs/docs/api/interfaces/Provider.md +++ b/docs/docs/api/interfaces/Provider.md @@ -22,4 +22,4 @@ Represents a provider, which is used to retrieve information or perform actions #### Defined in -[core/src/core/types.ts:233](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L233) +[packages/core/src/types.ts:249](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L249) diff --git a/docs/docs/api/interfaces/Relationship.md b/docs/docs/api/interfaces/Relationship.md index fb5742fb7c..e79298c5b9 100644 --- a/docs/docs/api/interfaces/Relationship.md +++ b/docs/docs/api/interfaces/Relationship.md @@ -10,9 +10,9 @@ Represents a relationship between two users, including their IDs, the status of #### Defined in -[core/src/core/types.ts:250](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L250) +[packages/core/src/types.ts:266](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L266) ---- +*** ### id @@ -20,9 +20,9 @@ Represents a relationship between two users, including their IDs, the status of #### Defined in -[core/src/core/types.ts:244](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L244) +[packages/core/src/types.ts:260](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L260) ---- +*** ### roomId @@ -30,9 +30,9 @@ Represents a relationship between two users, including their IDs, the status of #### Defined in -[core/src/core/types.ts:248](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L248) +[packages/core/src/types.ts:264](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L264) ---- +*** ### status @@ -40,9 +40,9 @@ Represents a relationship between two users, including their IDs, the status of #### Defined in -[core/src/core/types.ts:249](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L249) +[packages/core/src/types.ts:265](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L265) ---- +*** ### userA @@ -50,9 +50,9 @@ Represents a relationship between two users, including their IDs, the status of #### Defined in -[core/src/core/types.ts:245](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L245) +[packages/core/src/types.ts:261](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L261) ---- +*** ### userB @@ -60,9 +60,9 @@ Represents a relationship between two users, including their IDs, the status of #### Defined in -[core/src/core/types.ts:246](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L246) +[packages/core/src/types.ts:262](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L262) ---- +*** ### userId @@ -70,4 +70,4 @@ Represents a relationship between two users, including their IDs, the status of #### Defined in -[core/src/core/types.ts:247](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L247) +[packages/core/src/types.ts:263](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L263) diff --git a/docs/docs/api/interfaces/Room.md b/docs/docs/api/interfaces/Room.md index 63a2ed0581..b89652b994 100644 --- a/docs/docs/api/interfaces/Room.md +++ b/docs/docs/api/interfaces/Room.md @@ -10,9 +10,9 @@ Represents a room or conversation context, including its ID and a list of partic #### Defined in -[core/src/core/types.ts:277](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L277) +[packages/core/src/types.ts:293](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L293) ---- +*** ### participants @@ -20,4 +20,4 @@ Represents a room or conversation context, including its ID and a list of partic #### Defined in -[core/src/core/types.ts:278](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L278) +[packages/core/src/types.ts:294](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L294) diff --git a/docs/docs/api/interfaces/State.md b/docs/docs/api/interfaces/State.md index 177552ce39..774f0a29bf 100644 --- a/docs/docs/api/interfaces/State.md +++ b/docs/docs/api/interfaces/State.md @@ -4,7 +4,7 @@ Represents the state of the conversation or context in which the agent is operat ## Indexable -\[`key`: `string`\]: `unknown` + \[`key`: `string`\]: `unknown` ## Properties @@ -14,9 +14,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:140](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L140) +[packages/core/src/types.ts:155](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L155) ---- +*** ### actionNames? @@ -24,9 +24,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:137](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L137) +[packages/core/src/types.ts:152](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L152) ---- +*** ### actions? @@ -34,9 +34,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:138](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L138) +[packages/core/src/types.ts:153](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L153) ---- +*** ### actionsData? @@ -44,9 +44,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:139](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L139) +[packages/core/src/types.ts:154](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L154) ---- +*** ### actors @@ -54,9 +54,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:127](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L127) +[packages/core/src/types.ts:146](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L146) ---- +*** ### actorsData? @@ -64,9 +64,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:128](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L128) +[packages/core/src/types.ts:147](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L147) ---- +*** ### agentId? @@ -74,9 +74,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:119](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L119) +[packages/core/src/types.ts:138](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L138) ---- +*** ### agentName? @@ -84,9 +84,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:125](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L125) +[packages/core/src/types.ts:144](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L144) ---- +*** ### bio @@ -94,9 +94,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:120](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L120) +[packages/core/src/types.ts:139](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L139) ---- +*** ### goals? @@ -104,9 +104,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:129](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L129) +[packages/core/src/types.ts:148](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L148) ---- +*** ### goalsData? @@ -114,9 +114,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:130](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L130) +[packages/core/src/types.ts:149](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L149) ---- +*** ### lore @@ -124,9 +124,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:121](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L121) +[packages/core/src/types.ts:140](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L140) ---- +*** ### messageDirections @@ -134,9 +134,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:122](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L122) +[packages/core/src/types.ts:141](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L141) ---- +*** ### postDirections @@ -144,9 +144,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:123](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L123) +[packages/core/src/types.ts:142](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L142) ---- +*** ### providers? @@ -154,29 +154,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:141](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L141) +[packages/core/src/types.ts:156](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L156) ---- - -### recentFacts? - -> `optional` **recentFacts**: `string` - -#### Defined in - -[core/src/core/types.ts:133](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L133) - ---- - -### recentFactsData? - -> `optional` **recentFactsData**: [`Memory`](Memory.md)[] - -#### Defined in - -[core/src/core/types.ts:134](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L134) - ---- +*** ### recentInteractions? @@ -184,9 +164,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:144](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L144) +[packages/core/src/types.ts:159](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L159) ---- +*** ### recentInteractionsData? @@ -194,9 +174,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:143](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L143) +[packages/core/src/types.ts:158](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L158) ---- +*** ### recentMessages @@ -204,9 +184,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:131](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L131) +[packages/core/src/types.ts:150](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L150) ---- +*** ### recentMessagesData @@ -214,29 +194,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:132](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L132) - ---- - -### relevantFacts? - -> `optional` **relevantFacts**: `string` - -#### Defined in - -[core/src/core/types.ts:135](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L135) - ---- - -### relevantFactsData? - -> `optional` **relevantFactsData**: [`Memory`](Memory.md)[] - -#### Defined in - -[core/src/core/types.ts:136](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L136) +[packages/core/src/types.ts:151](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L151) ---- +*** ### responseData? @@ -244,9 +204,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:142](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L142) +[packages/core/src/types.ts:157](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L157) ---- +*** ### roomId @@ -254,9 +214,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:124](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L124) +[packages/core/src/types.ts:143](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L143) ---- +*** ### senderName? @@ -264,9 +224,9 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:126](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L126) +[packages/core/src/types.ts:145](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L145) ---- +*** ### userId? @@ -274,4 +234,4 @@ Represents the state of the conversation or context in which the agent is operat #### Defined in -[core/src/core/types.ts:118](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L118) +[packages/core/src/types.ts:137](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L137) diff --git a/docs/docs/api/type-aliases/Character.md b/docs/docs/api/type-aliases/Character.md index 511d14ef77..f51884bb3f 100644 --- a/docs/docs/api/type-aliases/Character.md +++ b/docs/docs/api/type-aliases/Character.md @@ -20,10 +20,6 @@ > `optional` **id**: [`UUID`](UUID.md) -### imageGenModel? - -> `optional` **imageGenModel**: [`ImageGenModel`](../enumerations/ImageGenModel.md) - ### knowledge? > `optional` **knowledge**: `string`[] @@ -42,7 +38,7 @@ ### modelProvider -> **modelProvider**: [`ModelProvider`](../enumerations/ModelProvider.md) +> **modelProvider**: [`ModelProviderName`](../enumerations/ModelProviderName.md) ### name @@ -78,7 +74,7 @@ #### Index Signature -\[`key`: `string`\]: `string` + \[`key`: `string`\]: `string` ### settings.voice? @@ -118,7 +114,7 @@ #### Index Signature -\[`key`: `string`\]: `string` + \[`key`: `string`\]: `string` ### topics @@ -126,4 +122,4 @@ ## Defined in -[core/src/core/types.ts:305](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L305) +[packages/core/src/types.ts:327](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L327) diff --git a/docs/docs/api/type-aliases/Client.md b/docs/docs/api/type-aliases/Client.md new file mode 100644 index 0000000000..acb3669299 --- /dev/null +++ b/docs/docs/api/type-aliases/Client.md @@ -0,0 +1,33 @@ +# Type Alias: Client + +> **Client**: `object` + +## Type declaration + +### start() + +> **start**: (`runtime`?) => `Promise`\<`unknown`\> + +#### Parameters + +• **runtime?**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) + +#### Returns + +`Promise`\<`unknown`\> + +### stop() + +> **stop**: (`runtime`?) => `Promise`\<`unknown`\> + +#### Parameters + +• **runtime?**: [`IAgentRuntime`](../interfaces/IAgentRuntime.md) + +#### Returns + +`Promise`\<`unknown`\> + +## Defined in + +[packages/core/src/types.ts:306](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L306) diff --git a/docs/docs/api/type-aliases/Handler.md b/docs/docs/api/type-aliases/Handler.md index 6b3e13d5b4..c351005923 100644 --- a/docs/docs/api/type-aliases/Handler.md +++ b/docs/docs/api/type-aliases/Handler.md @@ -22,4 +22,4 @@ Represents the type of a handler function, which takes a runtime instance, a mes ## Defined in -[core/src/core/types.ts:173](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L173) +[packages/core/src/types.ts:188](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L188) diff --git a/docs/docs/api/type-aliases/HandlerCallback.md b/docs/docs/api/type-aliases/HandlerCallback.md index 2d9641aea5..0704f79377 100644 --- a/docs/docs/api/type-aliases/HandlerCallback.md +++ b/docs/docs/api/type-aliases/HandlerCallback.md @@ -14,4 +14,4 @@ ## Defined in -[core/src/core/types.ts:182](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L182) +[packages/core/src/types.ts:197](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L197) diff --git a/docs/docs/api/type-aliases/Media.md b/docs/docs/api/type-aliases/Media.md index 0585ea6b84..f76ba06d8d 100644 --- a/docs/docs/api/type-aliases/Media.md +++ b/docs/docs/api/type-aliases/Media.md @@ -30,4 +30,4 @@ ## Defined in -[core/src/core/types.ts:281](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L281) +[packages/core/src/types.ts:297](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L297) diff --git a/docs/docs/api/type-aliases/Model.md b/docs/docs/api/type-aliases/Model.md index 0449532f65..74f0c15d71 100644 --- a/docs/docs/api/type-aliases/Model.md +++ b/docs/docs/api/type-aliases/Model.md @@ -8,6 +8,14 @@ > `optional` **endpoint**: `string` +### imageSettings? + +> `optional` **imageSettings**: `object` + +### imageSettings.steps? + +> `optional` **steps**: `number` + ### model > **model**: `object` @@ -16,6 +24,10 @@ > `optional` **embedding**: `string` +### model.image? + +> `optional` **image**: `string` + ### model.large > **large**: `string` @@ -32,9 +44,9 @@ > **settings**: `object` -### settings.frequency_penalty? +### settings.frequency\_penalty? -> `optional` **frequency_penalty**: `number` +> `optional` **frequency\_penalty**: `number` ### settings.maxInputTokens @@ -44,13 +56,13 @@ > **maxOutputTokens**: `number` -### settings.presence_penalty? +### settings.presence\_penalty? -> `optional` **presence_penalty**: `number` +> `optional` **presence\_penalty**: `number` -### settings.repetition_penalty? +### settings.repetition\_penalty? -> `optional` **repetition_penalty**: `number` +> `optional` **repetition\_penalty**: `number` ### settings.stop @@ -62,4 +74,4 @@ ## Defined in -[core/src/core/types.ts:82](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L82) +[packages/core/src/types.ts:82](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L82) diff --git a/docs/docs/api/type-aliases/Models.md b/docs/docs/api/type-aliases/Models.md new file mode 100644 index 0000000000..504f977912 --- /dev/null +++ b/docs/docs/api/type-aliases/Models.md @@ -0,0 +1,53 @@ +# Type Alias: Models + +> **Models**: `object` + +## Type declaration + +### anthropic + +> **anthropic**: [`Model`](Model.md) + +### claude\_vertex + +> **claude\_vertex**: [`Model`](Model.md) + +### google + +> **google**: [`Model`](Model.md) + +### grok + +> **grok**: [`Model`](Model.md) + +### groq + +> **groq**: [`Model`](Model.md) + +### llama\_cloud + +> **llama\_cloud**: [`Model`](Model.md) + +### llama\_local + +> **llama\_local**: [`Model`](Model.md) + +### ollama + +> **ollama**: [`Model`](Model.md) + +### openai + +> **openai**: [`Model`](Model.md) + +### openrouter + +> **openrouter**: [`Model`](Model.md) + +### redpill + +> **redpill**: [`Model`](Model.md) + +## Defined in + +[packages/core/src/types.ts:105](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L105) diff --git a/docs/docs/api/type-aliases/Plugin.md b/docs/docs/api/type-aliases/Plugin.md index 3598e5ac7b..192caf873a 100644 --- a/docs/docs/api/type-aliases/Plugin.md +++ b/docs/docs/api/type-aliases/Plugin.md @@ -4,26 +4,30 @@ ## Type declaration -### actions +### actions? -> **actions**: [`Action`](../interfaces/Action.md)[] +> `optional` **actions**: [`Action`](../interfaces/Action.md)[] ### description > **description**: `string` -### evaluators +### evaluators? -> **evaluators**: [`Evaluator`](../interfaces/Evaluator.md)[] +> `optional` **evaluators**: [`Evaluator`](../interfaces/Evaluator.md)[] ### name > **name**: `string` -### providers +### providers? -> **providers**: [`Provider`](../interfaces/Provider.md)[] +> `optional` **providers**: [`Provider`](../interfaces/Provider.md)[] + +### services? + +> `optional` **services**: [`Service`](../classes/Service.md)[] ## Defined in -[core/src/core/types.ts:290](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L290) +[packages/core/src/types.ts:311](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L311) diff --git a/docs/docs/api/type-aliases/UUID.md b/docs/docs/api/type-aliases/UUID.md index bf620cb27d..eb2f882587 100644 --- a/docs/docs/api/type-aliases/UUID.md +++ b/docs/docs/api/type-aliases/UUID.md @@ -6,4 +6,4 @@ Represents a UUID, which is a universally unique identifier conforming to the UU ## Defined in -[core/src/core/types.ts:7](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L7) +[packages/core/src/types.ts:6](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L6) diff --git a/docs/docs/api/type-aliases/Validator.md b/docs/docs/api/type-aliases/Validator.md index 3289d9e2e5..4a534a105c 100644 --- a/docs/docs/api/type-aliases/Validator.md +++ b/docs/docs/api/type-aliases/Validator.md @@ -18,4 +18,4 @@ Represents the type of a validator function, which takes a runtime instance, a m ## Defined in -[core/src/core/types.ts:190](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/types.ts#L190) +[packages/core/src/types.ts:205](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/types.ts#L205) diff --git a/docs/docs/api/typedoc-sidebar.cjs b/docs/docs/api/typedoc-sidebar.cjs index 6c759f89fe..ff4ac8aa32 100644 --- a/docs/docs/api/typedoc-sidebar.cjs +++ b/docs/docs/api/typedoc-sidebar.cjs @@ -1,552 +1,4 @@ // @ts-check /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const typedocSidebar = { - items: [ - { - type: "category", - label: "Enumerations", - items: [ - { type: "doc", id: "api/enumerations/Clients", label: "Clients" }, - { type: "doc", id: "api/enumerations/GoalStatus", label: "GoalStatus" }, - { - type: "doc", - id: "api/enumerations/ImageGenModel", - label: "ImageGenModel", - }, - { type: "doc", id: "api/enumerations/ModelClass", label: "ModelClass" }, - { - type: "doc", - id: "api/enumerations/ModelProvider", - label: "ModelProvider", - }, - ], - }, - { - type: "category", - label: "Classes", - items: [ - { type: "doc", id: "api/classes/AgentRuntime", label: "AgentRuntime" }, - { - type: "doc", - id: "api/classes/DatabaseAdapter", - label: "DatabaseAdapter", - }, - { type: "doc", id: "api/classes/DirectClient", label: "DirectClient" }, - { - type: "doc", - id: "api/classes/DiscordClient", - label: "DiscordClient", - }, - { - type: "doc", - id: "api/classes/MemoryManager", - label: "MemoryManager", - }, - { - type: "doc", - id: "api/classes/PostgresDatabaseAdapter", - label: "PostgresDatabaseAdapter", - }, - { - type: "doc", - id: "api/classes/SqliteDatabaseAdapter", - label: "SqliteDatabaseAdapter", - }, - { - type: "doc", - id: "api/classes/TelegramClient", - label: "TelegramClient", - }, - { - type: "doc", - id: "api/classes/TokenProvider", - label: "TokenProvider", - }, - { - type: "doc", - id: "api/classes/TwitterInteractionClient", - label: "TwitterInteractionClient", - }, - { - type: "doc", - id: "api/classes/TwitterPostClient", - label: "TwitterPostClient", - }, - { - type: "doc", - id: "api/classes/TwitterSearchClient", - label: "TwitterSearchClient", - }, - { - type: "doc", - id: "api/classes/WalletProvider", - label: "WalletProvider", - }, - ], - }, - { - type: "category", - label: "Interfaces", - items: [ - { type: "doc", id: "api/interfaces/Account", label: "Account" }, - { type: "doc", id: "api/interfaces/Action", label: "Action" }, - { - type: "doc", - id: "api/interfaces/ActionExample", - label: "ActionExample", - }, - { type: "doc", id: "api/interfaces/Actor", label: "Actor" }, - { type: "doc", id: "api/interfaces/Content", label: "Content" }, - { - type: "doc", - id: "api/interfaces/ConversationExample", - label: "ConversationExample", - }, - { - type: "doc", - id: "api/interfaces/CreateAndBuyContent", - label: "CreateAndBuyContent", - }, - { - type: "doc", - id: "api/interfaces/EvaluationExample", - label: "EvaluationExample", - }, - { type: "doc", id: "api/interfaces/Evaluator", label: "Evaluator" }, - { type: "doc", id: "api/interfaces/Goal", label: "Goal" }, - { - type: "doc", - id: "api/interfaces/IAgentRuntime", - label: "IAgentRuntime", - }, - { - type: "doc", - id: "api/interfaces/IBrowserService", - label: "IBrowserService", - }, - { - type: "doc", - id: "api/interfaces/IDatabaseAdapter", - label: "IDatabaseAdapter", - }, - { - type: "doc", - id: "api/interfaces/IImageRecognitionService", - label: "IImageRecognitionService", - }, - { - type: "doc", - id: "api/interfaces/ILlamaService", - label: "ILlamaService", - }, - { - type: "doc", - id: "api/interfaces/IMemoryManager", - label: "IMemoryManager", - }, - { type: "doc", id: "api/interfaces/IPdfService", label: "IPdfService" }, - { - type: "doc", - id: "api/interfaces/ISpeechService", - label: "ISpeechService", - }, - { - type: "doc", - id: "api/interfaces/ITranscriptionService", - label: "ITranscriptionService", - }, - { - type: "doc", - id: "api/interfaces/IVideoService", - label: "IVideoService", - }, - { type: "doc", id: "api/interfaces/Memory", label: "Memory" }, - { - type: "doc", - id: "api/interfaces/MessageExample", - label: "MessageExample", - }, - { type: "doc", id: "api/interfaces/Objective", label: "Objective" }, - { type: "doc", id: "api/interfaces/Participant", label: "Participant" }, - { type: "doc", id: "api/interfaces/Provider", label: "Provider" }, - { - type: "doc", - id: "api/interfaces/Relationship", - label: "Relationship", - }, - { type: "doc", id: "api/interfaces/Room", label: "Room" }, - { type: "doc", id: "api/interfaces/State", label: "State" }, - ], - }, - { - type: "category", - label: "Type Aliases", - items: [ - { type: "doc", id: "api/type-aliases/Character", label: "Character" }, - { type: "doc", id: "api/type-aliases/Handler", label: "Handler" }, - { - type: "doc", - id: "api/type-aliases/HandlerCallback", - label: "HandlerCallback", - }, - { type: "doc", id: "api/type-aliases/Media", label: "Media" }, - { type: "doc", id: "api/type-aliases/Model", label: "Model" }, - { type: "doc", id: "api/type-aliases/Plugin", label: "Plugin" }, - { type: "doc", id: "api/type-aliases/UUID", label: "UUID" }, - { type: "doc", id: "api/type-aliases/Validator", label: "Validator" }, - ], - }, - { - type: "category", - label: "Variables", - items: [ - { - type: "doc", - id: "api/variables/boredomProvider", - label: "boredomProvider", - }, - { - type: "doc", - id: "api/variables/continueAction", - label: "continueAction", - }, - { - type: "doc", - id: "api/variables/defaultActions", - label: "defaultActions", - }, - { - type: "doc", - id: "api/variables/defaultCharacter", - label: "defaultCharacter", - }, - { - type: "doc", - id: "api/variables/defaultEvaluators", - label: "defaultEvaluators", - }, - { - type: "doc", - id: "api/variables/defaultProviders", - label: "defaultProviders", - }, - { type: "doc", id: "api/variables/elizaLogger", label: "elizaLogger" }, - { - type: "doc", - id: "api/variables/embeddingDimension", - label: "embeddingDimension", - }, - { - type: "doc", - id: "api/variables/embeddingZeroVector", - label: "embeddingZeroVector", - }, - { - type: "doc", - id: "api/variables/evaluationTemplate", - label: "evaluationTemplate", - }, - { type: "doc", id: "api/variables/executeSwap", label: "executeSwap" }, - { type: "doc", id: "api/variables/followRoom", label: "followRoom" }, - { type: "doc", id: "api/variables/ignore", label: "ignore" }, - { - type: "doc", - id: "api/variables/imageGeneration", - label: "imageGeneration", - }, - { - type: "doc", - id: "api/variables/imageGenModels", - label: "imageGenModels", - }, - { - type: "doc", - id: "api/variables/messageHandlerTemplate", - label: "messageHandlerTemplate", - }, - { type: "doc", id: "api/variables/muteRoom", label: "muteRoom" }, - { type: "doc", id: "api/variables/none", label: "none" }, - { - type: "doc", - id: "api/variables/orderBookProvider", - label: "orderBookProvider", - }, - { - type: "doc", - id: "api/variables/shouldContinueTemplate", - label: "shouldContinueTemplate", - }, - { - type: "doc", - id: "api/variables/shouldFollowTemplate", - label: "shouldFollowTemplate", - }, - { - type: "doc", - id: "api/variables/shouldMuteTemplate", - label: "shouldMuteTemplate", - }, - { - type: "doc", - id: "api/variables/shouldUnmuteTemplate", - label: "shouldUnmuteTemplate", - }, - { - type: "doc", - id: "api/variables/timeProvider", - label: "timeProvider", - }, - { - type: "doc", - id: "api/variables/tokenProvider", - label: "tokenProvider", - }, - { - type: "doc", - id: "api/variables/unfollowRoom", - label: "unfollowRoom", - }, - { type: "doc", id: "api/variables/unmuteRoom", label: "unmuteRoom" }, - { - type: "doc", - id: "api/variables/walletProvider", - label: "walletProvider", - }, - ], - }, - { - type: "category", - label: "Functions", - items: [ - { type: "doc", id: "api/functions/addHeader", label: "addHeader" }, - { type: "doc", id: "api/functions/buyToken", label: "buyToken" }, - { - type: "doc", - id: "api/functions/composeActionExamples", - label: "composeActionExamples", - }, - { - type: "doc", - id: "api/functions/composeContext", - label: "composeContext", - }, - { - type: "doc", - id: "api/functions/createAgentRuntime", - label: "createAgentRuntime", - }, - { - type: "doc", - id: "api/functions/createAndBuyToken", - label: "createAndBuyToken", - }, - { - type: "doc", - id: "api/functions/createDirectRuntime", - label: "createDirectRuntime", - }, - { type: "doc", id: "api/functions/createGoal", label: "createGoal" }, - { - type: "doc", - id: "api/functions/createRelationship", - label: "createRelationship", - }, - { type: "doc", id: "api/functions/embed", label: "embed" }, - { - type: "doc", - id: "api/functions/formatActionNames", - label: "formatActionNames", - }, - { - type: "doc", - id: "api/functions/formatActions", - label: "formatActions", - }, - { - type: "doc", - id: "api/functions/formatActors", - label: "formatActors", - }, - { - type: "doc", - id: "api/functions/formatEvaluatorExampleDescriptions", - label: "formatEvaluatorExampleDescriptions", - }, - { - type: "doc", - id: "api/functions/formatEvaluatorExamples", - label: "formatEvaluatorExamples", - }, - { - type: "doc", - id: "api/functions/formatEvaluatorNames", - label: "formatEvaluatorNames", - }, - { - type: "doc", - id: "api/functions/formatEvaluators", - label: "formatEvaluators", - }, - { - type: "doc", - id: "api/functions/formatGoalsAsString", - label: "formatGoalsAsString", - }, - { - type: "doc", - id: "api/functions/formatMessages", - label: "formatMessages", - }, - { type: "doc", id: "api/functions/formatPosts", label: "formatPosts" }, - { - type: "doc", - id: "api/functions/formatRelationships", - label: "formatRelationships", - }, - { - type: "doc", - id: "api/functions/formatTimestamp", - label: "formatTimestamp", - }, - { - type: "doc", - id: "api/functions/generateCaption", - label: "generateCaption", - }, - { - type: "doc", - id: "api/functions/generateImage", - label: "generateImage", - }, - { - type: "doc", - id: "api/functions/generateMessageResponse", - label: "generateMessageResponse", - }, - { - type: "doc", - id: "api/functions/generateObject", - label: "generateObject", - }, - { - type: "doc", - id: "api/functions/generateObjectArray", - label: "generateObjectArray", - }, - { - type: "doc", - id: "api/functions/generateShouldRespond", - label: "generateShouldRespond", - }, - { - type: "doc", - id: "api/functions/generateText", - label: "generateText", - }, - { - type: "doc", - id: "api/functions/generateTextArray", - label: "generateTextArray", - }, - { - type: "doc", - id: "api/functions/generateTrueOrFalse", - label: "generateTrueOrFalse", - }, - { - type: "doc", - id: "api/functions/getActorDetails", - label: "getActorDetails", - }, - { type: "doc", id: "api/functions/getEndpoint", label: "getEndpoint" }, - { type: "doc", id: "api/functions/getGoals", label: "getGoals" }, - { - type: "doc", - id: "api/functions/getImageGenModel", - label: "getImageGenModel", - }, - { type: "doc", id: "api/functions/getModel", label: "getModel" }, - { - type: "doc", - id: "api/functions/getProviders", - label: "getProviders", - }, - { - type: "doc", - id: "api/functions/getRelationship", - label: "getRelationship", - }, - { - type: "doc", - id: "api/functions/getRelationships", - label: "getRelationships", - }, - { - type: "doc", - id: "api/functions/getTokenForProvider", - label: "getTokenForProvider", - }, - { - type: "doc", - id: "api/functions/initializeClients", - label: "initializeClients", - }, - { - type: "doc", - id: "api/functions/initializeDatabase", - label: "initializeDatabase", - }, - { - type: "doc", - id: "api/functions/isCreateAndBuyContent", - label: "isCreateAndBuyContent", - }, - { - type: "doc", - id: "api/functions/loadActionConfigs", - label: "loadActionConfigs", - }, - { - type: "doc", - id: "api/functions/loadCharacters", - label: "loadCharacters", - }, - { - type: "doc", - id: "api/functions/loadCustomActions", - label: "loadCustomActions", - }, - { - type: "doc", - id: "api/functions/parseArguments", - label: "parseArguments", - }, - { - type: "doc", - id: "api/functions/retrieveCachedEmbedding", - label: "retrieveCachedEmbedding", - }, - { type: "doc", id: "api/functions/sellToken", label: "sellToken" }, - { type: "doc", id: "api/functions/splitChunks", label: "splitChunks" }, - { - type: "doc", - id: "api/functions/startDiscord", - label: "startDiscord", - }, - { - type: "doc", - id: "api/functions/startTelegram", - label: "startTelegram", - }, - { - type: "doc", - id: "api/functions/startTwitter", - label: "startTwitter", - }, - { type: "doc", id: "api/functions/trimTokens", label: "trimTokens" }, - { type: "doc", id: "api/functions/updateGoal", label: "updateGoal" }, - ], - }, - ], -}; -module.exports = typedocSidebar.items; +const typedocSidebar = { items: [{"type":"category","label":"Enumerations","items":[{"type":"doc","id":"api/enumerations/Clients","label":"Clients"},{"type":"doc","id":"api/enumerations/GoalStatus","label":"GoalStatus"},{"type":"doc","id":"api/enumerations/ModelClass","label":"ModelClass"},{"type":"doc","id":"api/enumerations/ModelProviderName","label":"ModelProviderName"},{"type":"doc","id":"api/enumerations/ServiceType","label":"ServiceType"}]},{"type":"category","label":"Classes","items":[{"type":"doc","id":"api/classes/AgentRuntime","label":"AgentRuntime"},{"type":"doc","id":"api/classes/DatabaseAdapter","label":"DatabaseAdapter"},{"type":"doc","id":"api/classes/MemoryManager","label":"MemoryManager"},{"type":"doc","id":"api/classes/Service","label":"Service"}]},{"type":"category","label":"Interfaces","items":[{"type":"doc","id":"api/interfaces/Account","label":"Account"},{"type":"doc","id":"api/interfaces/Action","label":"Action"},{"type":"doc","id":"api/interfaces/ActionExample","label":"ActionExample"},{"type":"doc","id":"api/interfaces/Actor","label":"Actor"},{"type":"doc","id":"api/interfaces/Content","label":"Content"},{"type":"doc","id":"api/interfaces/ConversationExample","label":"ConversationExample"},{"type":"doc","id":"api/interfaces/EvaluationExample","label":"EvaluationExample"},{"type":"doc","id":"api/interfaces/Evaluator","label":"Evaluator"},{"type":"doc","id":"api/interfaces/Goal","label":"Goal"},{"type":"doc","id":"api/interfaces/IAgentRuntime","label":"IAgentRuntime"},{"type":"doc","id":"api/interfaces/IBrowserService","label":"IBrowserService"},{"type":"doc","id":"api/interfaces/IDatabaseAdapter","label":"IDatabaseAdapter"},{"type":"doc","id":"api/interfaces/IImageDescriptionService","label":"IImageDescriptionService"},{"type":"doc","id":"api/interfaces/IMemoryManager","label":"IMemoryManager"},{"type":"doc","id":"api/interfaces/IPdfService","label":"IPdfService"},{"type":"doc","id":"api/interfaces/ISpeechService","label":"ISpeechService"},{"type":"doc","id":"api/interfaces/ITextGenerationService","label":"ITextGenerationService"},{"type":"doc","id":"api/interfaces/ITranscriptionService","label":"ITranscriptionService"},{"type":"doc","id":"api/interfaces/IVideoService","label":"IVideoService"},{"type":"doc","id":"api/interfaces/Memory","label":"Memory"},{"type":"doc","id":"api/interfaces/MessageExample","label":"MessageExample"},{"type":"doc","id":"api/interfaces/Objective","label":"Objective"},{"type":"doc","id":"api/interfaces/Participant","label":"Participant"},{"type":"doc","id":"api/interfaces/Provider","label":"Provider"},{"type":"doc","id":"api/interfaces/Relationship","label":"Relationship"},{"type":"doc","id":"api/interfaces/Room","label":"Room"},{"type":"doc","id":"api/interfaces/State","label":"State"}]},{"type":"category","label":"Type Aliases","items":[{"type":"doc","id":"api/type-aliases/Character","label":"Character"},{"type":"doc","id":"api/type-aliases/Client","label":"Client"},{"type":"doc","id":"api/type-aliases/Handler","label":"Handler"},{"type":"doc","id":"api/type-aliases/HandlerCallback","label":"HandlerCallback"},{"type":"doc","id":"api/type-aliases/Media","label":"Media"},{"type":"doc","id":"api/type-aliases/Model","label":"Model"},{"type":"doc","id":"api/type-aliases/Models","label":"Models"},{"type":"doc","id":"api/type-aliases/Plugin","label":"Plugin"},{"type":"doc","id":"api/type-aliases/UUID","label":"UUID"},{"type":"doc","id":"api/type-aliases/Validator","label":"Validator"}]},{"type":"category","label":"Variables","items":[{"type":"doc","id":"api/variables/defaultCharacter","label":"defaultCharacter"},{"type":"doc","id":"api/variables/elizaLogger","label":"elizaLogger"},{"type":"doc","id":"api/variables/embeddingDimension","label":"embeddingDimension"},{"type":"doc","id":"api/variables/embeddingZeroVector","label":"embeddingZeroVector"},{"type":"doc","id":"api/variables/evaluationTemplate","label":"evaluationTemplate"},{"type":"doc","id":"api/variables/settings","label":"settings"}]},{"type":"category","label":"Functions","items":[{"type":"doc","id":"api/functions/addHeader","label":"addHeader"},{"type":"doc","id":"api/functions/composeActionExamples","label":"composeActionExamples"},{"type":"doc","id":"api/functions/composeContext","label":"composeContext"},{"type":"doc","id":"api/functions/createGoal","label":"createGoal"},{"type":"doc","id":"api/functions/createRelationship","label":"createRelationship"},{"type":"doc","id":"api/functions/embed","label":"embed"},{"type":"doc","id":"api/functions/findNearestEnvFile","label":"findNearestEnvFile"},{"type":"doc","id":"api/functions/formatActionNames","label":"formatActionNames"},{"type":"doc","id":"api/functions/formatActions","label":"formatActions"},{"type":"doc","id":"api/functions/formatActors","label":"formatActors"},{"type":"doc","id":"api/functions/formatEvaluatorExampleDescriptions","label":"formatEvaluatorExampleDescriptions"},{"type":"doc","id":"api/functions/formatEvaluatorExamples","label":"formatEvaluatorExamples"},{"type":"doc","id":"api/functions/formatEvaluatorNames","label":"formatEvaluatorNames"},{"type":"doc","id":"api/functions/formatEvaluators","label":"formatEvaluators"},{"type":"doc","id":"api/functions/formatGoalsAsString","label":"formatGoalsAsString"},{"type":"doc","id":"api/functions/formatMessages","label":"formatMessages"},{"type":"doc","id":"api/functions/formatPosts","label":"formatPosts"},{"type":"doc","id":"api/functions/formatRelationships","label":"formatRelationships"},{"type":"doc","id":"api/functions/formatTimestamp","label":"formatTimestamp"},{"type":"doc","id":"api/functions/generateCaption","label":"generateCaption"},{"type":"doc","id":"api/functions/generateImage","label":"generateImage"},{"type":"doc","id":"api/functions/generateMessageResponse","label":"generateMessageResponse"},{"type":"doc","id":"api/functions/generateObject","label":"generateObject"},{"type":"doc","id":"api/functions/generateObjectArray","label":"generateObjectArray"},{"type":"doc","id":"api/functions/generateShouldRespond","label":"generateShouldRespond"},{"type":"doc","id":"api/functions/generateText","label":"generateText"},{"type":"doc","id":"api/functions/generateTextArray","label":"generateTextArray"},{"type":"doc","id":"api/functions/generateTrueOrFalse","label":"generateTrueOrFalse"},{"type":"doc","id":"api/functions/getActorDetails","label":"getActorDetails"},{"type":"doc","id":"api/functions/getEndpoint","label":"getEndpoint"},{"type":"doc","id":"api/functions/getGoals","label":"getGoals"},{"type":"doc","id":"api/functions/getModel","label":"getModel"},{"type":"doc","id":"api/functions/getProviders","label":"getProviders"},{"type":"doc","id":"api/functions/getRelationship","label":"getRelationship"},{"type":"doc","id":"api/functions/getRelationships","label":"getRelationships"},{"type":"doc","id":"api/functions/loadEnvConfig","label":"loadEnvConfig"},{"type":"doc","id":"api/functions/retrieveCachedEmbedding","label":"retrieveCachedEmbedding"},{"type":"doc","id":"api/functions/splitChunks","label":"splitChunks"},{"type":"doc","id":"api/functions/trimTokens","label":"trimTokens"},{"type":"doc","id":"api/functions/updateGoal","label":"updateGoal"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/docs/docs/api/variables/boredomProvider.md b/docs/docs/api/variables/boredomProvider.md deleted file mode 100644 index f9fdc3d727..0000000000 --- a/docs/docs/api/variables/boredomProvider.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: boredomProvider - -> `const` **boredomProvider**: [`Provider`](../interfaces/Provider.md) - -## Defined in - -[core/src/providers/boredom.ts:275](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/boredom.ts#L275) diff --git a/docs/docs/api/variables/continueAction.md b/docs/docs/api/variables/continueAction.md deleted file mode 100644 index 030165236d..0000000000 --- a/docs/docs/api/variables/continueAction.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: continueAction - -> `const` **continueAction**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/continue.ts:58](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/continue.ts#L58) diff --git a/docs/docs/api/variables/defaultActions.md b/docs/docs/api/variables/defaultActions.md deleted file mode 100644 index b283756741..0000000000 --- a/docs/docs/api/variables/defaultActions.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: defaultActions - -> `const` **defaultActions**: [`Action`](../interfaces/Action.md)[] - -## Defined in - -[core/src/core/actions.ts:6](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/actions.ts#L6) diff --git a/docs/docs/api/variables/defaultCharacter.md b/docs/docs/api/variables/defaultCharacter.md index 58de13c19f..3b34f4fdca 100644 --- a/docs/docs/api/variables/defaultCharacter.md +++ b/docs/docs/api/variables/defaultCharacter.md @@ -4,4 +4,4 @@ ## Defined in -[core/src/core/defaultCharacter.ts:3](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/defaultCharacter.ts#L3) +[packages/core/src/defaultCharacter.ts:3](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/defaultCharacter.ts#L3) diff --git a/docs/docs/api/variables/defaultEvaluators.md b/docs/docs/api/variables/defaultEvaluators.md deleted file mode 100644 index 3d8953896d..0000000000 --- a/docs/docs/api/variables/defaultEvaluators.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: defaultEvaluators - -> `const` **defaultEvaluators**: [`Evaluator`](../interfaces/Evaluator.md)[] - -## Defined in - -[core/src/core/evaluators.ts:7](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/evaluators.ts#L7) diff --git a/docs/docs/api/variables/defaultProviders.md b/docs/docs/api/variables/defaultProviders.md deleted file mode 100644 index a7005af176..0000000000 --- a/docs/docs/api/variables/defaultProviders.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: defaultProviders - -> `const` **defaultProviders**: [`Provider`](../interfaces/Provider.md)[] - -## Defined in - -[core/src/core/providers.ts:4](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/providers.ts#L4) diff --git a/docs/docs/api/variables/elizaLogger.md b/docs/docs/api/variables/elizaLogger.md index ffb378d63f..a47dd2d355 100644 --- a/docs/docs/api/variables/elizaLogger.md +++ b/docs/docs/api/variables/elizaLogger.md @@ -1,7 +1,7 @@ # Variable: elizaLogger -> `const` **elizaLogger**: `elizaLogger` +> `const` **elizaLogger**: `ElizaLogger` ## Defined in -[core/src/index.ts:12](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/index.ts#L12) +[packages/core/src/logger.ts:282](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/logger.ts#L282) diff --git a/docs/docs/api/variables/embeddingDimension.md b/docs/docs/api/variables/embeddingDimension.md index 1447d864ea..da564e2c14 100644 --- a/docs/docs/api/variables/embeddingDimension.md +++ b/docs/docs/api/variables/embeddingDimension.md @@ -4,4 +4,4 @@ ## Defined in -[core/src/core/memory.ts:9](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L9) +[packages/core/src/memory.ts:9](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L9) diff --git a/docs/docs/api/variables/embeddingZeroVector.md b/docs/docs/api/variables/embeddingZeroVector.md index 9101bd6332..36461d3484 100644 --- a/docs/docs/api/variables/embeddingZeroVector.md +++ b/docs/docs/api/variables/embeddingZeroVector.md @@ -4,4 +4,4 @@ ## Defined in -[core/src/core/memory.ts:10](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/memory.ts#L10) +[packages/core/src/memory.ts:10](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/memory.ts#L10) diff --git a/docs/docs/api/variables/evaluationTemplate.md b/docs/docs/api/variables/evaluationTemplate.md index 316b9d6be6..e324e3486f 100644 --- a/docs/docs/api/variables/evaluationTemplate.md +++ b/docs/docs/api/variables/evaluationTemplate.md @@ -6,4 +6,4 @@ Template used for the evaluation generateText. ## Defined in -[core/src/core/evaluators.ts:12](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/evaluators.ts#L12) +[packages/core/src/evaluators.ts:8](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/evaluators.ts#L8) diff --git a/docs/docs/api/variables/executeSwap.md b/docs/docs/api/variables/executeSwap.md deleted file mode 100644 index 15018dafaa..0000000000 --- a/docs/docs/api/variables/executeSwap.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: executeSwap - -> `const` **executeSwap**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/swap.ts:178](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/swap.ts#L178) diff --git a/docs/docs/api/variables/followRoom.md b/docs/docs/api/variables/followRoom.md deleted file mode 100644 index 37276e24ce..0000000000 --- a/docs/docs/api/variables/followRoom.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: followRoom - -> `const` **followRoom**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/followRoom.ts:27](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/followRoom.ts#L27) diff --git a/docs/docs/api/variables/ignore.md b/docs/docs/api/variables/ignore.md deleted file mode 100644 index 151124d718..0000000000 --- a/docs/docs/api/variables/ignore.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: ignore - -> `const` **ignore**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/ignore.ts:8](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/ignore.ts#L8) diff --git a/docs/docs/api/variables/imageGenModels.md b/docs/docs/api/variables/imageGenModels.md deleted file mode 100644 index 7f38921b9e..0000000000 --- a/docs/docs/api/variables/imageGenModels.md +++ /dev/null @@ -1,33 +0,0 @@ -# Variable: imageGenModels - -> `const` **imageGenModels**: `object` - -## Type declaration - -### Dalle - -> **Dalle**: `object` - -### Dalle.steps - -> **steps**: `number` = `0` - -### Dalle.subModel - -> **subModel**: `string` = `"dall-e-3"` - -### TogetherAI - -> **TogetherAI**: `object` - -### TogetherAI.steps - -> **steps**: `number` = `4` - -### TogetherAI.subModel - -> **subModel**: `string` = `"black-forest-labs/FLUX.1-schnell"` - -## Defined in - -[core/src/core/imageGenModels.ts:6](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/core/imageGenModels.ts#L6) diff --git a/docs/docs/api/variables/imageGeneration.md b/docs/docs/api/variables/imageGeneration.md deleted file mode 100644 index 2ca52ee544..0000000000 --- a/docs/docs/api/variables/imageGeneration.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: imageGeneration - -> `const` **imageGeneration**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/imageGeneration.ts:11](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/imageGeneration.ts#L11) diff --git a/docs/docs/api/variables/messageHandlerTemplate.md b/docs/docs/api/variables/messageHandlerTemplate.md deleted file mode 100644 index cef7d99229..0000000000 --- a/docs/docs/api/variables/messageHandlerTemplate.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: messageHandlerTemplate - -> `const` **messageHandlerTemplate**: `string` - -## Defined in - -[core/src/actions/continue.ts:20](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/continue.ts#L20) diff --git a/docs/docs/api/variables/muteRoom.md b/docs/docs/api/variables/muteRoom.md deleted file mode 100644 index e955e04375..0000000000 --- a/docs/docs/api/variables/muteRoom.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: muteRoom - -> `const` **muteRoom**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/muteRoom.ts:28](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/muteRoom.ts#L28) diff --git a/docs/docs/api/variables/none.md b/docs/docs/api/variables/none.md deleted file mode 100644 index 583c9f86f1..0000000000 --- a/docs/docs/api/variables/none.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: none - -> `const` **none**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/none.ts:8](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/none.ts#L8) diff --git a/docs/docs/api/variables/orderBookProvider.md b/docs/docs/api/variables/orderBookProvider.md deleted file mode 100644 index 1a727c6a82..0000000000 --- a/docs/docs/api/variables/orderBookProvider.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: orderBookProvider - -> `const` **orderBookProvider**: [`Provider`](../interfaces/Provider.md) - -## Defined in - -[core/src/providers/orderBook.ts:14](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/orderBook.ts#L14) diff --git a/docs/docs/api/variables/settings.md b/docs/docs/api/variables/settings.md new file mode 100644 index 0000000000..6c08bf623a --- /dev/null +++ b/docs/docs/api/variables/settings.md @@ -0,0 +1,7 @@ +# Variable: settings + +> `const` **settings**: `ProcessEnv` + +## Defined in + +[packages/core/src/settings.ts:54](https://github.com/ai16z/eliza/blob/7fcf54e7fb2ba027d110afcc319c0b01b3f181dc/packages/core/src/settings.ts#L54) diff --git a/docs/docs/api/variables/shouldContinueTemplate.md b/docs/docs/api/variables/shouldContinueTemplate.md deleted file mode 100644 index a6f189eb0b..0000000000 --- a/docs/docs/api/variables/shouldContinueTemplate.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: shouldContinueTemplate - -> `const` **shouldContinueTemplate**: `string` - -## Defined in - -[core/src/actions/continue.ts:47](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/continue.ts#L47) diff --git a/docs/docs/api/variables/shouldFollowTemplate.md b/docs/docs/api/variables/shouldFollowTemplate.md deleted file mode 100644 index 682da6f91b..0000000000 --- a/docs/docs/api/variables/shouldFollowTemplate.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: shouldFollowTemplate - -> `const` **shouldFollowTemplate**: `string` - -## Defined in - -[core/src/actions/followRoom.ts:13](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/followRoom.ts#L13) diff --git a/docs/docs/api/variables/shouldMuteTemplate.md b/docs/docs/api/variables/shouldMuteTemplate.md deleted file mode 100644 index c999f23e56..0000000000 --- a/docs/docs/api/variables/shouldMuteTemplate.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: shouldMuteTemplate - -> `const` **shouldMuteTemplate**: `string` - -## Defined in - -[core/src/actions/muteRoom.ts:13](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/muteRoom.ts#L13) diff --git a/docs/docs/api/variables/shouldUnmuteTemplate.md b/docs/docs/api/variables/shouldUnmuteTemplate.md deleted file mode 100644 index e69a5fc9aa..0000000000 --- a/docs/docs/api/variables/shouldUnmuteTemplate.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: shouldUnmuteTemplate - -> `const` **shouldUnmuteTemplate**: `string` - -## Defined in - -[core/src/actions/unmuteRoom.ts:13](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/unmuteRoom.ts#L13) diff --git a/docs/docs/api/variables/timeProvider.md b/docs/docs/api/variables/timeProvider.md deleted file mode 100644 index 495451cd21..0000000000 --- a/docs/docs/api/variables/timeProvider.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: timeProvider - -> `const` **timeProvider**: [`Provider`](../interfaces/Provider.md) - -## Defined in - -[core/src/providers/time.ts:3](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/time.ts#L3) diff --git a/docs/docs/api/variables/tokenProvider.md b/docs/docs/api/variables/tokenProvider.md deleted file mode 100644 index f2af9a6a8b..0000000000 --- a/docs/docs/api/variables/tokenProvider.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: tokenProvider - -> `const` **tokenProvider**: [`Provider`](../interfaces/Provider.md) - -## Defined in - -[core/src/providers/token.ts:801](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/token.ts#L801) diff --git a/docs/docs/api/variables/unfollowRoom.md b/docs/docs/api/variables/unfollowRoom.md deleted file mode 100644 index a35743195c..0000000000 --- a/docs/docs/api/variables/unfollowRoom.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: unfollowRoom - -> `const` **unfollowRoom**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/unfollowRoom.ts:27](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/unfollowRoom.ts#L27) diff --git a/docs/docs/api/variables/unmuteRoom.md b/docs/docs/api/variables/unmuteRoom.md deleted file mode 100644 index 95fd4dabbe..0000000000 --- a/docs/docs/api/variables/unmuteRoom.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: unmuteRoom - -> `const` **unmuteRoom**: [`Action`](../interfaces/Action.md) - -## Defined in - -[core/src/actions/unmuteRoom.ts:27](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/actions/unmuteRoom.ts#L27) diff --git a/docs/docs/api/variables/walletProvider.md b/docs/docs/api/variables/walletProvider.md deleted file mode 100644 index 32f4688f60..0000000000 --- a/docs/docs/api/variables/walletProvider.md +++ /dev/null @@ -1,7 +0,0 @@ -# Variable: walletProvider - -> `const` **walletProvider**: [`Provider`](../interfaces/Provider.md) - -## Defined in - -[core/src/providers/wallet.ts:244](https://github.com/ai16z/eliza/blob/c96957e5a5d17e343b499dd4d46ce403856ac5bc/core/src/providers/wallet.ts#L244) diff --git a/packages/agent/src/index.ts b/packages/agent/src/index.ts index a82a05894b..64168eda8c 100644 --- a/packages/agent/src/index.ts +++ b/packages/agent/src/index.ts @@ -303,7 +303,6 @@ const rl = readline.createInterface({ }); async function handleUserInput(input, agentId) { - console.log("handleUserInput", input, agentId); if (input.toLowerCase() === "exit") { rl.close(); return; diff --git a/packages/client-direct/src/index.ts b/packages/client-direct/src/index.ts index 66376a576c..2f28f05bdb 100644 --- a/packages/client-direct/src/index.ts +++ b/packages/client-direct/src/index.ts @@ -129,7 +129,6 @@ export class DirectClient { this.app.post( "/:agentId/message", async (req: express.Request, res: express.Response) => { - console.log("DirectClient message"); const agentId = req.params.agentId; const roomId = stringToUuid( req.body.roomId ?? "default-room-" + agentId diff --git a/packages/client-discord/src/actions/download_media.ts b/packages/client-discord/src/actions/download_media.ts index 90edac1737..48a69117cc 100644 --- a/packages/client-discord/src/actions/download_media.ts +++ b/packages/client-discord/src/actions/download_media.ts @@ -10,6 +10,7 @@ import { IVideoService, Memory, ModelClass, + Service, ServiceType, State, } from "@ai16z/eliza/src/types.ts"; @@ -85,9 +86,9 @@ export default { options: any, callback: HandlerCallback ) => { - const videoService = runtime.getService( - ServiceType.VIDEO - ); + const videoService = runtime + .getService(ServiceType.VIDEO) + .getInstance(); if (!state) { state = (await runtime.composeState(message)) as State; } diff --git a/packages/client-discord/src/attachments.ts b/packages/client-discord/src/attachments.ts index 4b6e7ba5e5..15c03164bb 100644 --- a/packages/client-discord/src/attachments.ts +++ b/packages/client-discord/src/attachments.ts @@ -8,6 +8,7 @@ import { IVideoService, Media, ModelClass, + Service, ServiceType, } from "@ai16z/eliza/src/types.ts"; import { Attachment, Collection } from "discord.js"; @@ -102,8 +103,8 @@ export class AttachmentManager { media = await this.processImageAttachment(attachment); } else if ( attachment.contentType?.startsWith("video/") || - this.runtime - .getService(ServiceType.VIDEO) + this.runtime.getService(ServiceType.VIDEO) + .getInstance() .isVideoUrl(attachment.url) ) { media = await this.processVideoAttachment(attachment); @@ -136,7 +137,8 @@ export class AttachmentManager { } const transcription = await this.runtime - .getService(ServiceType.TRANSCRIPTION) + .getService(ServiceType.TRANSCRIPTION) + .getInstance() .transcribeAttachment(audioBuffer); const { title, description } = await generateSummary( this.runtime, @@ -217,7 +219,8 @@ export class AttachmentManager { const response = await fetch(attachment.url); const pdfBuffer = await response.arrayBuffer(); const text = await this.runtime - .getService(ServiceType.PDF) + .getService(ServiceType.PDF) + .getInstance() .convertPdfToText(Buffer.from(pdfBuffer)); const { title, description } = await generateSummary( this.runtime, @@ -285,9 +288,8 @@ export class AttachmentManager { ): Promise { try { const { description, title } = await this.runtime - .getService( - ServiceType.IMAGE_DESCRIPTION - ) + .getService(ServiceType.IMAGE_DESCRIPTION) + .getInstance() .describeImage(attachment.url); return { id: attachment.id, @@ -321,11 +323,13 @@ export class AttachmentManager { ): Promise { if ( this.runtime - .getService(ServiceType.VIDEO) + .getService(ServiceType.VIDEO) + .getInstance() .isVideoUrl(attachment.url) ) { const videoInfo = await this.runtime - .getService(ServiceType.VIDEO) + .getService(ServiceType.VIDEO) + .getInstance() .processVideo(attachment.url); return { id: attachment.id, diff --git a/packages/client-discord/src/messages.ts b/packages/client-discord/src/messages.ts index 349f57160b..4d233f658d 100644 --- a/packages/client-discord/src/messages.ts +++ b/packages/client-discord/src/messages.ts @@ -36,6 +36,7 @@ import { import { elizaLogger } from "@ai16z/eliza/src/logger.ts"; import { AttachmentManager } from "./attachments.ts"; import { VoiceManager } from "./voice.ts"; +import { Service } from "@ai16z/eliza"; const MAX_MESSAGE_LENGTH = 1900; async function generateSummary( @@ -340,7 +341,7 @@ export class MessageManager { if ( message.interaction || message.author.id === - this.client.user?.id /* || message.author?.bot*/ + this.client.user?.id /* || message.author?.bot*/ ) return; const userId = message.author.id as UUID; @@ -388,10 +389,10 @@ export class MessageManager { url: message.url, inReplyTo: message.reference?.messageId ? stringToUuid( - message.reference.messageId + - "-" + - this.runtime.agentId - ) + message.reference.messageId + + "-" + + this.runtime.agentId + ) : undefined, }; @@ -502,10 +503,11 @@ export class MessageManager { } if (message.channel.type === ChannelType.GuildVoice) { // For voice channels, use text-to-speech - const audioStream = await this.runtime - .getService( + const audioStream = await ( + this.runtime.getService( ServiceType.SPEECH_GENERATION ) + ).getInstance() .generate(this.runtime, content.text); await this.voiceManager.playAudioStream( userId, @@ -592,7 +594,8 @@ export class MessageManager { // For voice channels, use text-to-speech for the error message const errorMessage = "Sorry, I had a glitch. What was that?"; const audioStream = await this.runtime - .getService(ServiceType.SPEECH_GENERATION) + .getService(ServiceType.SPEECH_GENERATION) + .getInstance() .generate(this.runtime, errorMessage); await this.voiceManager.playAudioStream(userId, audioStream); } else { @@ -656,13 +659,14 @@ export class MessageManager { for (const url of urls) { if ( - this.runtime - .getService(ServiceType.VIDEO) + this.runtime.getService(ServiceType.VIDEO) + .getInstance() .isVideoUrl(url) ) { - const videoInfo = await this.runtime - .getService(ServiceType.VIDEO) - .processVideo(url); + const videoInfo = await (this.runtime + .getService(ServiceType.VIDEO) + .getInstance() + .processVideo(url)); attachments.push({ id: `youtube-${Date.now()}`, url: url, @@ -673,7 +677,8 @@ export class MessageManager { }); } else { const { title, bodyContent } = await this.runtime - .getService(ServiceType.BROWSER) + .getService(ServiceType.BROWSER) + .getInstance() .getPageContent(url, this.runtime); const { title: newTitle, description } = await generateSummary( this.runtime, diff --git a/packages/client-discord/src/voice.ts b/packages/client-discord/src/voice.ts index 6098592592..744a8106b8 100644 --- a/packages/client-discord/src/voice.ts +++ b/packages/client-discord/src/voice.ts @@ -31,6 +31,7 @@ import { ITranscriptionService, Memory, ModelClass, + Service, ServiceType, State, UUID, @@ -399,9 +400,8 @@ export class VoiceManager extends EventEmitter { console.log("starting transcription"); const text = await this.runtime - .getService( - ServiceType.TRANSCRIPTION - ) + .getService(ServiceType.TRANSCRIPTION) + .getInstance() .transcribe(wavBuffer); console.log("transcribed text: ", text); transcriptionText += text; @@ -541,9 +541,8 @@ export class VoiceManager extends EventEmitter { state ); const responseStream = await this.runtime - .getService( - ServiceType.SPEECH_GENERATION - ) + .getService(ServiceType.SPEECH_GENERATION) + .getInstance() .generate(this.runtime, content.text); if (responseStream) { diff --git a/packages/client-twitter/src/base.ts b/packages/client-twitter/src/base.ts index 9279816ea7..12adf70eda 100644 --- a/packages/client-twitter/src/base.ts +++ b/packages/client-twitter/src/base.ts @@ -218,7 +218,8 @@ export class ClientBase extends EventEmitter { await this.twitterClient.login( this.runtime.getSetting("TWITTER_USERNAME"), this.runtime.getSetting("TWITTER_PASSWORD"), - this.runtime.getSetting("TWITTER_EMAIL") + this.runtime.getSetting("TWITTER_EMAIL"), + this.runtime.getSetting("TWITTER_2FA_SECRET") ); console.log("Logged in to Twitter"); const cookies = await this.twitterClient.getCookies(); @@ -240,7 +241,8 @@ export class ClientBase extends EventEmitter { await this.twitterClient.login( this.runtime.getSetting("TWITTER_USERNAME"), this.runtime.getSetting("TWITTER_PASSWORD"), - this.runtime.getSetting("TWITTER_EMAIL") + this.runtime.getSetting("TWITTER_EMAIL"), + this.runtime.getSetting("TWITTER_2FA_SECRET") ); const cookies = await this.twitterClient.getCookies(); @@ -258,7 +260,7 @@ export class ClientBase extends EventEmitter { await new Promise((resolve) => setTimeout(resolve, 10000)); try { return await this.twitterClient.getUserIdByScreenName( - this.runtime.getSetting("TWITTER_USERNAME") + this.runtime.getSetting("TWITTER_USERNAME"), ); } catch (error) { console.error("Error getting user ID:", error); diff --git a/packages/client-twitter/src/post.ts b/packages/client-twitter/src/post.ts index 055aae2de3..d4e9421855 100644 --- a/packages/client-twitter/src/post.ts +++ b/packages/client-twitter/src/post.ts @@ -33,8 +33,8 @@ export class TwitterPostClient extends ClientBase { this.generateNewTweet(); setTimeout( generateNewTweetLoop, - (Math.floor(Math.random() * (20 - 2 + 1)) + 2) * 60 * 1000 - ); // Random interval between 4-8 hours + (Math.floor(Math.random() * (4 - 1 + 1)) + 1) * 60 * 60 * 1000 + ); // Random interval between 1 and 4 hours }; // setTimeout(() => { generateNewTweetLoop(); diff --git a/packages/client-twitter/src/search.ts b/packages/client-twitter/src/search.ts index 8ac4c88bf1..0a38793200 100644 --- a/packages/client-twitter/src/search.ts +++ b/packages/client-twitter/src/search.ts @@ -237,9 +237,8 @@ export class TwitterSearchClient extends ClientBase { const imageDescriptions = []; for (const photo of selectedTweet.photos) { const description = await this.runtime - .getService( - ServiceType.IMAGE_DESCRIPTION - ) + .getService(ServiceType.IMAGE_DESCRIPTION) + .getInstance() .describeImage(photo.url); imageDescriptions.push(description); } diff --git a/packages/core/src/embedding.ts b/packages/core/src/embedding.ts index 13bd64f508..e212558875 100644 --- a/packages/core/src/embedding.ts +++ b/packages/core/src/embedding.ts @@ -97,8 +97,6 @@ export async function embed(runtime: IAgentRuntime, input: string) { throw new Error("No embedding model configured"); } - console.log("embeddingModel", embeddingModel); - // Try local embedding first if ( runtime.character.modelProvider !== ModelProviderName.OPENAI && diff --git a/packages/core/src/generation.ts b/packages/core/src/generation.ts index dc01e535e1..07909847b2 100644 --- a/packages/core/src/generation.ts +++ b/packages/core/src/generation.ts @@ -2,7 +2,7 @@ import { createAnthropic } from "@ai-sdk/anthropic"; import { createGroq } from "@ai-sdk/groq"; import { createOpenAI } from "@ai-sdk/openai"; import { getModel } from "./models.ts"; -import { IImageDescriptionService, ModelClass } from "./types.ts"; +import { IImageDescriptionService, ModelClass, Service } from "./types.ts"; import { generateText as aiGenerateText } from "ai"; import { Buffer } from "buffer"; import { createOllama } from "ollama-ai-provider"; @@ -199,9 +199,8 @@ export async function generateText({ "Using local Llama model for text completion." ); response = await runtime - .getService( - ServiceType.TEXT_GENERATION - ) + .getService(ServiceType.TEXT_GENERATION) + .getInstance() .queueTextCompletion( context, temperature, @@ -741,7 +740,8 @@ export const generateCaption = async ( }> => { const { imageUrl } = data; const resp = await runtime - .getService(ServiceType.IMAGE_DESCRIPTION) + .getService(ServiceType.IMAGE_DESCRIPTION) + .getInstance() .describeImage(imageUrl); return { title: resp.title.trim(), diff --git a/packages/core/src/memory.ts b/packages/core/src/memory.ts index 298c17543d..6187e536a7 100644 --- a/packages/core/src/memory.ts +++ b/packages/core/src/memory.ts @@ -159,8 +159,6 @@ export class MemoryManager implements IMemoryManager { const existingMessage = await this.runtime.databaseAdapter.getMemoryById(memory.id); - console.log("existingMessage", existingMessage); - if (existingMessage) { console.log("Memory already exists, skipping"); return; diff --git a/packages/core/src/runtime.ts b/packages/core/src/runtime.ts index 0beb43a848..5e5fd5891d 100644 --- a/packages/core/src/runtime.ts +++ b/packages/core/src/runtime.ts @@ -150,13 +150,13 @@ export class AgentRuntime implements IAgentRuntime { return this.memoryManagers.get(tableName) || null; } - getService(service: ServiceType): T | null { + getService(service: ServiceType): typeof Service | null { const serviceInstance = this.services.get(service); if (!serviceInstance) { console.error(`Service ${service} not found`); return null; } - return serviceInstance as T; + return serviceInstance as typeof Service; } registerService(service: Service): void { const serviceType = (service as typeof Service).serviceType; @@ -499,7 +499,6 @@ export class AgentRuntime implements IAgentRuntime { * @returns The results of the evaluation. */ async evaluate(message: Memory, state?: State, didRespond?: boolean) { - console.log("Evaluate: ", didRespond); const evaluatorPromises = this.evaluators.map( async (evaluator: Evaluator) => { console.log("Evaluating", evaluator.name); @@ -897,8 +896,6 @@ Text: ${attachment.text} async function getKnowledge(runtime: AgentRuntime, message: Memory): Promise { const embedding = await embed(runtime, message.content.text); - console.log("message.agentId", message.agentId) - const memories = await runtime.knowledgeManager.searchMemoriesByEmbedding( embedding, { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 7d61a241f5..040b743a68 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -536,7 +536,7 @@ export interface IAgentRuntime { getMemoryManager(name: string): IMemoryManager | null; - getService(service: string): Service | null; + getService(service: string): typeof Service | null; registerService(service: Service): void; diff --git a/packages/plugin-bootstrap/src/providers/facts.ts b/packages/plugin-bootstrap/src/providers/facts.ts index e335f1baf7..241e581854 100644 --- a/packages/plugin-bootstrap/src/providers/facts.ts +++ b/packages/plugin-bootstrap/src/providers/facts.ts @@ -20,9 +20,6 @@ const factsProvider: Provider = { const embedding = await embed(runtime, recentMessages); - console.log("embedding", embedding); - console.log("embedding length", embedding.length); - const memoryManager = new MemoryManager({ runtime, tableName: "facts", diff --git a/packages/plugin-node/src/services/video.ts b/packages/plugin-node/src/services/video.ts index 6e1ef6fe46..6aa1b91e52 100644 --- a/packages/plugin-node/src/services/video.ts +++ b/packages/plugin-node/src/services/video.ts @@ -328,7 +328,8 @@ export class VideoService extends Service { console.log("Starting transcription..."); const startTime = Date.now(); const transcript = await runtime - .getService(ServiceType.TRANSCRIPTION) + .getService(ServiceType.TRANSCRIPTION) + .getInstance() .transcribe(audioBuffer); const endTime = Date.now(); console.log( From 1b0d5fe451a803fea480afa6be464805ff4fa2bc Mon Sep 17 00:00:00 2001 From: Ophiuchus Date: Wed, 13 Nov 2024 19:15:39 -0600 Subject: [PATCH 4/9] image gen saves file & returns format for clients; discord image poasting just works --- .env.example | 3 + packages/client-discord/src/index.ts | 1 + packages/plugin-image-generation/src/index.ts | 73 ++++++++++++++++--- 3 files changed, 66 insertions(+), 11 deletions(-) diff --git a/.env.example b/.env.example index ecd965fc4c..59fbb56440 100644 --- a/.env.example +++ b/.env.example @@ -29,6 +29,9 @@ X_SERVER_URL= XAI_API_KEY= XAI_MODEL= +#USE IMAGE GEN +IMAGE_GEN= #TRUE + #Leave blank to use local embeddings USE_OPENAI_EMBEDDING= #TRUE diff --git a/packages/client-discord/src/index.ts b/packages/client-discord/src/index.ts index eda359bae0..f1577f21f9 100644 --- a/packages/client-discord/src/index.ts +++ b/packages/client-discord/src/index.ts @@ -73,6 +73,7 @@ export class DiscordClient extends EventEmitter { this.runtime.registerAction(transcribe_media); this.runtime.registerAction(download_media); + this.runtime.providers.push(channelStateProvider); this.runtime.providers.push(voiceStateProvider); } diff --git a/packages/plugin-image-generation/src/index.ts b/packages/plugin-image-generation/src/index.ts index 22aa577ed8..e05c779832 100644 --- a/packages/plugin-image-generation/src/index.ts +++ b/packages/plugin-image-generation/src/index.ts @@ -9,9 +9,34 @@ import { } from "@ai16z/eliza/src/types.ts"; import { generateCaption, generateImage } from "@ai16z/eliza/src/generation.ts"; +import fs from 'fs'; +import path from 'path'; + +export function saveBase64Image(base64Data: string, filename: string): string { + // Create generatedImages directory if it doesn't exist + const imageDir = path.join(process.cwd(), 'generatedImages'); + if (!fs.existsSync(imageDir)) { + fs.mkdirSync(imageDir, { recursive: true }); + } + + // Remove the data:image/png;base64 prefix if it exists + const base64Image = base64Data.replace(/^data:image\/\w+;base64,/, ''); + + // Create a buffer from the base64 string + const imageBuffer = Buffer.from(base64Image, 'base64'); + + // Create full file path + const filepath = path.join(imageDir, `${filename}.png`); + + // Save the file + fs.writeFileSync(filepath, imageBuffer); + + return filepath; +} + const imageGeneration: Action = { name: "GENERATE_IMAGE", - similes: ["IMAGE_GENERATION", "IMAGE_GEN", "CREATE_IMAGE", "MAKE_PICTURE"], + similes: ["IMAGE_GENERATION", "IMAGE_GEN", "CREATE_IMAGE", "MAKE_PICTURE",], description: "Generate an image to go along with the message.", validate: async (runtime: IAgentRuntime, message: Memory) => { const anthropicApiKeyOk = !!runtime.getSetting("ANTHROPIC_API_KEY"); @@ -58,36 +83,62 @@ const imageGeneration: Action = { ); for (let i = 0; i < images.data.length; i++) { const image = images.data[i]; - elizaLogger.log(`Processing image ${i + 1}:`, image); + + const base64Image = images.data[i]; + // Save the image and get filepath + const filename = `generated_${Date.now()}_${i}`; + const filepath = saveBase64Image(base64Image, filename); + elizaLogger.log(`Processing image ${i + 1}:`, filename); - const caption = await generateCaption( + //just dont even add a caption or a description just have it generate & send + /* + try { + const imageService = runtime.getService(ServiceType.IMAGE_DESCRIPTION); + if (imageService && typeof imageService.describeImage === 'function') { + const caption = await imageService.describeImage({ imageUrl: filepath }); + captionText = caption.description; + captionTitle = caption.title; + } + } catch (error) { + elizaLogger.error("Caption generation failed, using default caption:", error); + }*/ + + const caption = "..."; + /*= await generateCaption( { imageUrl: image, }, runtime - ); + );*/ + + res.push({ image: filepath, caption: "..."});//caption.title }); elizaLogger.log( `Generated caption for image ${i + 1}:`, - caption.title + "..."//caption.title ); - res.push({ image: image, caption: caption.title }); + //res.push({ image: image, caption: caption.title }); callback( { - text: caption.description, + text: "...",//caption.description, attachments: [ { id: crypto.randomUUID(), - url: image, + url: filepath, title: "Generated image", source: "imageGeneration", - description: caption.title, - text: caption.description, + description: "...",//caption.title, + text: "...",//caption.description, }, ], }, - [] + [ + { + attachment: filepath, + name: `${filename}.png` + } + ] ); } } else { From 10e59ced562436fee3cc4a444447fde08c5f870c Mon Sep 17 00:00:00 2001 From: BugByClaude Date: Thu, 14 Nov 2024 16:27:45 +0800 Subject: [PATCH 5/9] Add Korean and French README --- README.md | 2 + README_FR.md | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++ README_KOR.md | 171 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 345 insertions(+) create mode 100644 README_FR.md create mode 100644 README_KOR.md diff --git a/README.md b/README.md index 664327c45f..d450457348 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ ### [For Chinese Version: 中文说明](./README_CN.md) ### [For Japanese Version: 日本語の説明](./README_JA.md) +### [For Korean Version: 한국어 설명](./README_KOR.md) +### [For French Version: Instructions en français](./README_FR.md) ## Features diff --git a/README_FR.md b/README_FR.md new file mode 100644 index 0000000000..a0e96bda4e --- /dev/null +++ b/README_FR.md @@ -0,0 +1,172 @@ +# Eliza + +Eliza Banner + +## la fonctionnalité + +- 🛠 soutenir la connexion discord/ twitter /telegram +- 👥 soutien aux agents multimodaux +- 📚 simple à importer des documents et interagir avec les documents +- mémoire et stockage des documents accessibles +- 🚀 haute scalabilité, vous pouvez personnaliser les clients et les comportements pour une extension fonctionnelle +- ☁ ️ plusieurs modèles, y compris Llama, OpenAI Grok Anthropic, etc. +- 📦 simple et facile à utiliser + +Que pouvez-vous faire avec Eliza? + +- 🤖 le chatbot +- 🕵 ️ Agents autonomes +- 📈 processus métier pour automatiser le traitement +- 🎮 jeux PNJ + +# commencez à utiliser + +**pré-requis (obligatoire) :** + +- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- installation Nodejs +- [pnpm](https://pnpm.io/installation) +- travailler avec PNPM + +### éditer le fichier.env + +- copiez.env.example en.env et remplissez la valeur appropriée +- modifier l’environnement twitter et entrer votre compte twitter et mot de passe + +### modifier les fichiers de rôles + +- voir le document ` src/core/defaultCharacter ts ` - vous pouvez le modifier +- vous pouvez également utiliser `node --loader ts-node/esm src/index.ts --characters="path/to/your/character.json" ` et simultanément plusieurs robots. + +Après avoir terminé la configuration des fichiers de compte et de rôle, lancez votre bot en tapant la ligne de commande suivante: + + +``` +pnpm i +pnpm start +``` + +# personnalisez votre Eliza + +### ajouter un comportement régulier + +Pour éviter les conflits Git dans le répertoire core, nous vous recommandons d’ajouter les actions personnalisées dans le répertoire custom_actions et de les configurer dans le fichier elizaconfig.yaml. Vous pouvez consulter l’exemple dans le fichier elizaconfig.example.yaml. + +## configurez différents grands modèles + +### configurer Llama + +Vous pouvez exécuter en définissant la variable d’environnement `XAI_MODEL` à `meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` ou `meta-llama/Meta-Llama-3.1-405B-Instruct` Llama 70B ou 405B modèle + +### configurer OpenAI + +Vous pouvez exécuter le modèle OpenAI en définissant la variable d’environnement `XAI_MODEL` à `gpt-4o-mini` ou `gpt-4o` + +## autres demandes + +Vous devrez peut-être installer Sharp. Si vous voyez une erreur au démarrage, essayez d’installer avec la commande suivante: + +``` +pnpm install --include=optional sharp +``` + +# paramètres de l’environnement + +Vous devez ajouter des variables d’environnement à votre fichier.env pour vous connecter à différentes plates-formes: + +``` +# Required environment variables +DISCORD_APPLICATION_ID= +DISCORD_API_TOKEN= # Bot token +OPENAI_API_KEY=sk-* # OpenAI API key, starting with sk- +ELEVENLABS_XI_API_KEY= # API key from elevenlabs + +# ELEVENLABS SETTINGS +ELEVENLABS_MODEL_ID=eleven_multilingual_v2 +ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM +ELEVENLABS_VOICE_STABILITY=0.5 +ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 +ELEVENLABS_VOICE_STYLE=0.66 +ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false +ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 +ELEVENLABS_OUTPUT_FORMAT=pcm_16000 + +TWITTER_DRY_RUN=false +TWITTER_USERNAME= # Account username +TWITTER_PASSWORD= # Account password +TWITTER_EMAIL= # Account email +TWITTER_COOKIES= # Account cookies + +X_SERVER_URL= +XAI_API_KEY= +XAI_MODEL= + + +# For asking Claude stuff +ANTHROPIC_API_KEY= + +WALLET_PRIVATE_KEY=EXAMPLE_WALLET_PRIVATE_KEY +WALLET_PUBLIC_KEY=EXAMPLE_WALLET_PUBLIC_KEY + +BIRDEYE_API_KEY= + +SOL_ADDRESS=So11111111111111111111111111111111111111112 +SLIPPAGE=1 +RPC_URL=https://api.mainnet-beta.solana.com +HELIUS_API_KEY= + + +## Telegram +TELEGRAM_BOT_TOKEN= + +TOGETHER_API_KEY= +``` + +# paramètres locaux + +### ensemble CUDA + +Si vous avez une carte graphique nvidia haute performance, vous pouvez faire l’accélération locale avec la ligne de commande suivante CUDA + +``` +pnpm install +npx --no node-llama-cpp source download --gpu cuda +``` + +Assurez-vous d’avoir le kit complet CUDA installé, y compris cuDNN et cuBLAS + +### exécution locale + +Ajoutez XAI_MODEL et définissez-le à l’une des options ci-dessus [use Llama run](#run-with-llama) +Vous pouvez laisser X_SERVER_URL et XAI_API_KEY vides, qui téléchargera le modèle de huggingface et le consultera localement + +# le client + +Pour savoir comment configurer votre bot discord, vous pouvez consulter la documentation officielle de discord + +# le développement + +## le test + +Ligne de commande pour plusieurs méthodes de test: + +```bash +pnpm test # Run tests once +pnpm test:watch # Run tests in watch mode +``` + +Pour les tests spécifiques à la base de données: + +```bash +pnpm test:sqlite # Run tests with SQLite +pnpm test:sqljs # Run tests with SQL.js +``` + +Les tests sont écrits en Jest et se trouvent dans le fichier SRC /\*_/_.test.ts. L’environnement de test est configuré comme suit: + +- chargement des variables d’environnement de.env.test +- utilisez un temps d’attente de 2 minutes pour exécuter des tests de longue durée +- support du module ESM +- exécuter les tests dans l’ordre (--runInBand) + +Pour créer un nouveau test, ajoutez un fichier.test.ts à côté du code à tester. \ No newline at end of file diff --git a/README_KOR.md b/README_KOR.md new file mode 100644 index 0000000000..6cbc3063ba --- /dev/null +++ b/README_KOR.md @@ -0,0 +1,171 @@ +# Eliza + +eliza banner + +## 기능 + +- 🛠 지지 discord 트위터/telegram 연결 +- 👥 지지여 모드 agent +- 📚 간단 한 문서를 가져오기와 문서를 번갈아 +- 💾 검색 할 수 있는 메모리와 문서 저장 +- 🚀 확장 가능 성이 높은, 사용자 정의 클라이언트와 행위를 확장 기능 +- ☁ ️여 모형 지지 llama · openai grok anthropic 등 +- 📦 간단 하기도 좋습니다. + +eliza로 뭘 할 수 있나요? + +- 🤖 챗 봇 +- 🕵 ️ 자주 agents +- 📈 업무 처리 과정을 자동화 +- 🎮 게임 npc + +# 사용시작 + +**전제 요구(필수):** + +- [Node.js 22 +](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- Nodejs 설치 +- [pnpm](https://pnpm.io/installation) +- pnpm을사용한다 + +## 편집.env 파일 + +- .env.example을.env로 복사하고 적절한 값을 입력한다 +- 트위터 환경을 편집하고, 트위터 계정과 비밀번호를 입력한다 + +## 캐릭터 파일 편집 + +- 파일 `src/core/defaultcharacter.ts ` - 그것을 수정 할 수 있다 +- 사용하셔도됩니다 `node --loader ts-node/esm src/index.ts --characters="path/to/your/character.json"` 여러 로봇을 동시에 실행하여 캐릭터를 불러옵니다. + +아이디와 캐릭터 파일 설정이 완료되었다면, 다음 명령줄을 입력하여 로봇을 실행시키십시오: + +``` +pnpm i +pnpm start +``` + +# 사용자 정의 Eliza + +### 일반 행동을 추가한다 + +커널 디렉터리에서 git 충돌을 방지하기 위해 custom_actions 디렉터리에 사용자 정의 동작을 추가하고 elizaconfig.yaml 파일에서 동작을 설정할 것을 제안한다.elizaconfig.example.yaml 파일의 예제는 참조할 수 있다. + +다른 대형 모델들을 배치한다 + +### 프로필Llama + +`XAI_MODEL`환경 변수를`meta-llama/meta-llam-3.1-70b-instruct-turbo`또는`meta-llama/meta-llam-3.1-405b-instruct`로 설정하여 실행할 수 있다라마 70b 405b 모델 + +## openai 설정 + +`XAI_MODEL`환경 변수를`gpt-4o-mini`또는`gpt-4o`로 설정하여 OpenAI 모델을 실행할 수 있다 + +## 기타 요구 사항 + +Sharp를 설치해야 할 수도 있습니다.시작시 오류가 발견되면 다음 명령으로 설치하십시오: + +``` +pnpm install-include=optional sharp +``` + +# 환경 설정 + +다양한 플랫폼에 연결하기 위해서는.env 파일에서 환경 변수를 추가해야 합니다: + +``` +# Required environment variables +DISCORD_APPLICATION_ID= +DISCORD_API_TOKEN= # Bot token +OPENAI_API_KEY=sk-* # OpenAI API key, starting with sk- +ELEVENLABS_XI_API_KEY= # API key from elevenlabs + +# ELEVENLABS SETTINGS +ELEVENLABS_MODEL_ID=eleven_multilingual_v2 +ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM +ELEVENLABS_VOICE_STABILITY=0.5 +ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 +ELEVENLABS_VOICE_STYLE=0.66 +ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false +ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 +ELEVENLABS_OUTPUT_FORMAT=pcm_16000 + +TWITTER_DRY_RUN=false +TWITTER_USERNAME= # Account username +TWITTER_PASSWORD= # Account password +TWITTER_EMAIL= # Account email +TWITTER_COOKIES= # Account cookies + +X_SERVER_URL= +XAI_API_KEY= +XAI_MODEL= + + +# For asking Claude stuff +ANTHROPIC_API_KEY= + +WALLET_PRIVATE_KEY=EXAMPLE_WALLET_PRIVATE_KEY +WALLET_PUBLIC_KEY=EXAMPLE_WALLET_PUBLIC_KEY + +BIRDEYE_API_KEY= + +SOL_ADDRESS=So11111111111111111111111111111111111111112 +SLIPPAGE=1 +RPC_URL=https://api.mainnet-beta.solana.com +HELIUS_API_KEY= + + +## Telegram +TELEGRAM_BOT_TOKEN= + +TOGETHER_API_KEY= +``` + +# 로컬 설정 + +### cuda 설정 + +고성능 엔비디아 그래픽을 가지고 있다면 다음 명령줄에서 cuda를 사용하여 로컬 가속을 할 수 있다 + +``` +pnpm install +npx --no node-llama-cpp source download --gpu cuda +``` + +cuDNN과 cuBLAS를 포함한 완전한 cuda 키트를 설치했는지 확인하세요 + +### 로컬 실행 + +위의 [Llama로 실행](#run-with-llama) 옵션 중 하나로 XAI_MODEL을 추가한다 +X_SERVER_URL과 xai_api_key를 공백으로 두면 huggingface에서 모델을 다운로드하고 현지에서 쿼리한다 + +# 클라이언트 + +discord bot을 설정하는 방법에 대해 discord의 공식 문서를 볼 수 있습니까 + +# 개발 + +## 테스트 + +여러 테스트 방법을 위한 명령줄: + +```bash +pnpm test # Run tests once +pnpm test:watch # Run tests in watch mode +``` + +데이터베이스에 특화된 테스트: + +```bash +pnpm test:sqlite # Run tests with SQLite +pnpm test:sqljs # Run tests with SQL.js +``` + +테스트는 src/\*_/_.test.ts 파일에 있는 Jest로 작성된다.테스트 환경 설정은 다음과 같습니다: + +- .env.test에서 환경 변수를 불러온다 +- 장기 실행 테스트를 실행하기 위해 2분 제한 시간을 사용합니다 +- esm 모듈을 지원한다 +- 테스트 실행 순서 (--runInBand) + +새 테스트를 만들려면, 테스트할 코드 옆에.test.ts 파일을 추가하세요. \ No newline at end of file From 79637da76cdc52631b192c1ea323fb4eda23f0ff Mon Sep 17 00:00:00 2001 From: Ophiuchus Date: Thu, 14 Nov 2024 03:42:07 -0600 Subject: [PATCH 6/9] added working pumpfun.ts --- packages/plugin-solana/src/actions/pumpfun.ts | 388 +++++++++++++----- 1 file changed, 292 insertions(+), 96 deletions(-) diff --git a/packages/plugin-solana/src/actions/pumpfun.ts b/packages/plugin-solana/src/actions/pumpfun.ts index a6453cbc63..ab49821ee0 100644 --- a/packages/plugin-solana/src/actions/pumpfun.ts +++ b/packages/plugin-solana/src/actions/pumpfun.ts @@ -1,5 +1,6 @@ import { AnchorProvider } from "@coral-xyz/anchor"; import { Wallet } from "@coral-xyz/anchor"; +import { generateImage } from "@ai16z/eliza/src/generation.ts"; import { Connection, Keypair, PublicKey } from "@solana/web3.js"; import { CreateTokenMetadata, @@ -14,40 +15,53 @@ import settings from "@ai16z/eliza/src/settings.ts"; import { ActionExample, Content, + HandlerCallback, IAgentRuntime, Memory, + ModelClass, + State, type Action, } from "@ai16z/eliza/src/types.ts"; +import { composeContext } from "@ai16z/eliza/src/context.ts"; +import { generateObject } from "@ai16z/eliza/src/generation.ts"; + +import { + walletProvider, + //WalletProvider, +} from "../providers/wallet.ts"; + +import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes/index.js"; + export interface CreateAndBuyContent extends Content { - deployerPrivateKey: string; - tokenMetadata: CreateTokenMetadata; - buyAmountSol: string | number; - priorityFee: { - unitLimit: number; - unitPrice: number; + tokenMetadata: { + name: string; + symbol: string; + description: string; + image_description: string; }; - allowOffCurve: boolean; + buyAmountSol: string | number; } + export function isCreateAndBuyContent( runtime: IAgentRuntime, content: any ): content is CreateAndBuyContent { + console.log("Content for create & buy", content) return ( - typeof content.deployerPrivateKey === "string" && typeof content.tokenMetadata === "object" && content.tokenMetadata !== null && + typeof content.tokenMetadata.name === "string" && + typeof content.tokenMetadata.symbol === "string" && + typeof content.tokenMetadata.description === "string" && + typeof content.tokenMetadata.image_description === "string" && (typeof content.buyAmountSol === "string" || - typeof content.buyAmountSol === "number") && - typeof content.priorityFee === "object" && - content.priorityFee !== null && - typeof content.priorityFee.unitLimit === "number" && - typeof content.priorityFee.unitPrice === "number" && - typeof content.allowOffCurve === "boolean" + typeof content.buyAmountSol === "number") ); } + export const createAndBuyToken = async ({ deployer, mint, @@ -88,6 +102,9 @@ export const createAndBuyToken = async ({ priorityFee, commitment ); + + console.log("Create Results: ", createResults); + if (createResults.success) { console.log( "Success:", @@ -111,9 +128,21 @@ export const createAndBuyToken = async ({ } else { console.log(`${deployer.publicKey.toBase58()}:`, amount); } + + return { + success: true, + ca: mint.publicKey.toBase58(), + creator: deployer.publicKey.toBase58() + }; + } else { console.log("Create and Buy failed"); - } + return { + success: false, + ca: mint.publicKey.toBase58(), + error: createResults.error || "Transaction failed" + }; + } }; export const buyToken = async ({ @@ -213,6 +242,7 @@ export const sellToken = async ({ }; const promptConfirmation = async (): Promise => { + return true; if (typeof window !== "undefined" && typeof window.confirm === "function") { return window.confirm( "Confirm the creation and purchase of the token?" @@ -221,76 +251,247 @@ const promptConfirmation = async (): Promise => { return true; }; +// Save the base64 data to a file +import * as fs from 'fs'; +import * as path from 'path'; + + +const pumpfunTemplate = `Respond with a JSON markdown block containing only the extracted values. Use null for any values that cannot be determined. + +Example response: +\`\`\`json +{ + "tokenMetadata": { + "name": "Test Token", + "symbol": "TEST", + "description": "A test token", + "image_description": "create an image of a rabbit" + }, + "buyAmountSol": "0.00069" +} +\`\`\` + +{{recentMessages}} + +Given the recent messages, extract or generate (come up with if not included) the following information about the requested token creation: +- Token name +- Token symbol +- Token description +- Token image description +- Amount of SOL to buy + +Respond with a JSON markdown block containing only the extracted values.`; + + + export default { name: "CREATE_AND_BUY_TOKEN", similes: ["CREATE_AND_PURCHASE_TOKEN", "DEPLOY_AND_BUY_TOKEN"], validate: async (runtime: IAgentRuntime, message: Memory) => { - return isCreateAndBuyContent(runtime, message.content); + + return true;//return isCreateAndBuyContent(runtime, message.content); }, description: "Create a new token and buy a specified amount using SOL. Requires deployer private key, token metadata, buy amount in SOL, priority fee, and allowOffCurve flag.", - handler: async ( - runtime: IAgentRuntime, - message: Memory - ): Promise => { - const content = message.content; - if (!isCreateAndBuyContent(runtime, content)) { - console.error("Invalid content for CREATE_AND_BUY_TOKEN action."); - return false; - } - const { - deployerPrivateKey, - tokenMetadata, - buyAmountSol, - priorityFee, - allowOffCurve, - } = content; - - const privateKey = runtime.getSetting("WALLET_PRIVATE_KEY")!; - const wallet = new Wallet( - Keypair.fromSecretKey(new Uint8Array(JSON.parse(privateKey))) - ); - const connection = new Connection(settings.RPC_URL!); - const provider = new AnchorProvider(connection, wallet, { - commitment: "finalized", - }); - const sdk = new PumpFunSDK(provider); - const slippage = runtime.getSetting("SLIPPAGE"); - - try { - const deployerKeypair = Keypair.fromSecretKey( - Uint8Array.from(Buffer.from(deployerPrivateKey, "base64")) - ); + handler: async ( + runtime: IAgentRuntime, + message: Memory, + state: State, + _options: { [key: string]: unknown }, + callback?: HandlerCallback + ): Promise => { + console.log("Starting CREATE_AND_BUY_TOKEN handler..."); + + // Compose state if not provided + if (!state) { + state = (await runtime.composeState(message)) as State; + } else { + state = await runtime.updateRecentMessageState(state); + } + + // Get wallet info for context + const walletInfo = await walletProvider.get(runtime, message, state); + state.walletInfo = walletInfo; + + // Generate structured content from natural language + const pumpContext = composeContext({ + state, + template: pumpfunTemplate, + }); + + const content = await generateObject({ + runtime, + context: pumpContext, + modelClass: ModelClass.LARGE, + }); + + // Validate the generated content + if (!isCreateAndBuyContent(runtime, content)) { + console.error("Invalid content for CREATE_AND_BUY_TOKEN action."); + return false; + } + + const { tokenMetadata, buyAmountSol } = content; + /* + // Generate image if tokenMetadata.file is empty or invalid + if (!tokenMetadata.file || tokenMetadata.file.length < 100) { // Basic validation + try { + const imageResult = await generateImage({ + prompt: `logo for ${tokenMetadata.name} (${tokenMetadata.symbol}) token - ${tokenMetadata.description}`, + width: 512, + height: 512, + count: 1 + }, runtime); + + if (imageResult.success && imageResult.data && imageResult.data.length > 0) { + // Remove the "data:image/png;base64," prefix if present + tokenMetadata.file = imageResult.data[0].replace(/^data:image\/[a-z]+;base64,/, ''); + } else { + console.error("Failed to generate image:", imageResult.error); + return false; + } + } catch (error) { + console.error("Error generating image:", error); + return false; + } + } */ - const mintKeypair = Keypair.generate(); + const imageResult = await generateImage({ + prompt: `logo for ${tokenMetadata.name} (${tokenMetadata.symbol}) token - ${tokenMetadata.description}`, + width: 256, + height: 256, + count: 1 + }, runtime); - const createAndBuyConfirmation = await promptConfirmation(); - if (!createAndBuyConfirmation) { - console.log("Create and buy token canceled by user"); - return false; + + tokenMetadata.image_description = imageResult.data[0].replace(/^data:image\/[a-z]+;base64,/, ''); + + + + + // Convert base64 string to Blob + const base64Data = tokenMetadata.image_description; + const outputPath = path.join(process.cwd(), `generated_image_${Date.now()}.txt`); + fs.writeFileSync(outputPath, base64Data); + console.log(`Base64 data saved to: ${outputPath}`); + + + const byteCharacters = atob(base64Data); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); } + const byteArray = new Uint8Array(byteNumbers); + const blob = new Blob([byteArray], { type: 'image/png' }); + + // Add the default decimals and convert file to Blob + const fullTokenMetadata: CreateTokenMetadata = { + name: tokenMetadata.name, + symbol: tokenMetadata.symbol, + description: tokenMetadata.description, + file: blob, + }; - // Execute Create and Buy - await createAndBuyToken({ - deployer: deployerKeypair, - mint: mintKeypair, - tokenMetadata: tokenMetadata as CreateTokenMetadata, - buyAmountSol: BigInt(buyAmountSol), - priorityFee: priorityFee as PriorityFee, - allowOffCurve: allowOffCurve as boolean, - sdk, - connection, - slippage, - }); + // Default priority fee for high network load + const priorityFee = { + unitLimit: 100_000_000, + unitPrice: 100_000 + }; + const slippage = "2000" + try { + // Get private key from settings and create deployer keypair + const privateKeyString = runtime.getSetting("WALLET_PRIVATE_KEY")!; + const secretKey = bs58.decode(privateKeyString); + const deployerKeypair = Keypair.fromSecretKey(secretKey); - console.log( - `Token created and purchased successfully! View at: https://pump.fun/${mintKeypair.publicKey.toBase58()}` - ); - return true; - } catch (error) { - console.error("Error during create and buy token:", error); - return false; - } + // Generate new mint keypair + const mintKeypair = Keypair.generate(); + console.log(`Generated mint address: ${mintKeypair.publicKey.toBase58()}`); + + // Setup connection and SDK + const connection = new Connection(settings.RPC_URL!, { + commitment: "confirmed", + confirmTransactionInitialTimeout: 500000, // 120 seconds + wsEndpoint: settings.RPC_URL!.replace('https', 'wss') + }); + + const wallet = new Wallet(deployerKeypair); + const provider = new AnchorProvider(connection, wallet, { + commitment: "finalized" + }); + const sdk = new PumpFunSDK(provider); + // const slippage = runtime.getSetting("SLIPPAGE"); + + + const createAndBuyConfirmation = await promptConfirmation(); + if (!createAndBuyConfirmation) { + console.log("Create and buy token canceled by user"); + return false; + } + + // Convert SOL to lamports (1 SOL = 1_000_000_000 lamports) + const lamports = Math.floor(Number(buyAmountSol) * 1_000_000_000); + + console.log("Executing create and buy transaction..."); + const result = await createAndBuyToken({ + deployer: deployerKeypair, + mint: mintKeypair, + tokenMetadata: fullTokenMetadata, + buyAmountSol: BigInt(lamports), + priorityFee, + allowOffCurve: false, + sdk, + connection, + slippage, + }); + + + if (callback) { + if (result.success) { + callback({ + text: `Token ${tokenMetadata.name} (${tokenMetadata.symbol}) created successfully!\nContract Address: ${result.ca}\nCreator: ${result.creator}\nView at: https://pump.fun/${result.ca}`, + content: { + tokenInfo: { + symbol: tokenMetadata.symbol, + address: result.ca, + creator: result.creator, + name: tokenMetadata.name, + description: tokenMetadata.description, + timestamp: Date.now() + } + } + }); + } else { + callback({ + text: `Failed to create token: ${result.error}\nAttempted mint address: ${result.ca}`, + content: { + error: result.error, + mintAddress: result.ca + } + }); + } + } + //await trustScoreDb.addToken(tokenInfo); + /* + // Update runtime state + await runtime.updateState({ + ...state, + lastCreatedToken: tokenInfo + }); + */ + // Log success message with token view URL + const successMessage = `Token created and purchased successfully! View at: https://pump.fun/${mintKeypair.publicKey.toBase58()}`; + console.log(successMessage); + return result.success; + } catch (error) { + if (callback) { + callback({ + text: `Error during token creation: ${error.message}`, + content: { error: error.message } + }); + } + return false; + } }, examples: [ @@ -298,32 +499,27 @@ export default { { user: "{{user1}}", content: { - deployerPrivateKey: "Base64EncodedPrivateKey", - tokenMetadata: { - name: "MyToken", - symbol: "MTK", - description: "My first token", - file: "Base64EncodedFile", // blob file of the image - decimals: DEFAULT_DECIMALS, - }, - buyAmountSol: "1000000000", // 1 SOL in lamports - priorityFee: 1000, - allowOffCurve: false, - }, + text: "Create a new token called GLITCHIZA with symbol GLITCHIZA and generate a description about it. Also come up with a description for it to use for image generation .buy 0.00069 SOL worth." + } }, { user: "{{user2}}", content: { - text: "Creating and buying 1 SOL worth of MyToken...", + text: "Token GLITCHIZA (GLITCHIZA) created successfully!\nContract Address: 3kD5DN4bbA3nykb1abjS66VF7cYZkKdirX8bZ6ShJjBB\nCreator: 9jW8FPr6BSSsemWPV22UUCzSqkVdTp6HTyPqeqyuBbCa\nView at: https://pump.fun/EugPwuZ8oUMWsYHeBGERWvELfLGFmA1taDtmY8uMeX6r", action: "CREATE_AND_BUY_TOKEN", - }, - }, - { - user: "{{user2}}", - content: { - text: "Token created and purchased successfully! View at: https://pump.fun/MintPublicKey", - }, - }, - ], - ] as ActionExample[][], + content: { + tokenInfo: { + symbol: "GLITCHIZA", + address: "EugPwuZ8oUMWsYHeBGERWvELfLGFmA1taDtmY8uMeX6r", + creator: "9jW8FPr6BSSsemWPV22UUCzSqkVdTp6HTyPqeqyuBbCa", + name: "GLITCHIZA", + description: "A GLITCHIZA token" + } + } + } + } + ] + ] as ActionExample[][] + + , } as Action; From 29d38d32b1c59f84f1d3525c38c127a0aabcb731 Mon Sep 17 00:00:00 2001 From: Gabriel Santos Date: Thu, 14 Nov 2024 17:17:44 -0300 Subject: [PATCH 7/9] docs: add a new Portuguese README version --- README.md | 1 + README_PTBR.md | 176 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 README_PTBR.md diff --git a/README.md b/README.md index 30b7a32f1c..8ab9db62d2 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ ### [For Japanese Version: 日本語の説明](./README_JA.md) ### [For Korean Version: 한국어 설명](./README_KOR.md) ### [For French Version: Instructions en français](./README_FR.md) +### [For Portuguese Version: Instruções em português](./README_PTBR.md) ## Features diff --git a/README_PTBR.md b/README_PTBR.md new file mode 100644 index 0000000000..a5fa17a426 --- /dev/null +++ b/README_PTBR.md @@ -0,0 +1,176 @@ +# Eliza + +Eliza Banner + +## Funcionalidades + +- 🛠 Conectores completos para Discord, Twitter e Telegram +- 👥 Suporte a múltiplos agentes e salas +- 📚 Ingestão e interação fácil com seus documentos +- 💾 Memória recuperável e armazenamento de documentos +- 🚀 Altamente extensível - crie suas próprias ações e clientes para estender as capacidades +- ☁️ Suporta muitos modelos, incluindo Llama local, OpenAI, Anthropic, Groq e mais +- 📦 Funciona perfeitamente! + +## Para que posso usá-lo? + +- 🤖 Chatbots +- 🕵️ Agentes autônomos +- 📈 Gestão de processos empresariais +- 🎮 NPCs em jogos de vídeo + +# Começando + +**Pré-requisitos (OBRIGATÓRIO):** + +- [Python 2.7+](https://www.python.org/downloads/) +- [Node.js 23.1+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) + +### Edite o arquivo .env + +- Copie .env.example para .env e preencha os valores apropriados +- Edite as variáveis de ambiente do TWITTER para adicionar o nome de usuário e senha do seu bot + +### Edite o arquivo de personagem + +- Confira o arquivo `src/core/defaultCharacter.ts` - você pode modificá-lo +- Você também pode carregar personagens com o comando `pnpm start --characters="path/to/your/character.json"` e executar múltiplos bots ao mesmo tempo. + +Após configurar o arquivo .env e o arquivo de personagem, você pode iniciar o bot com o seguinte comando: + +``` +pnpm i +pnpm start +``` + +# Personalizando Eliza + +### Adicionando ações personalizadas + +Para evitar conflitos no diretório core, recomendamos adicionar ações personalizadas a um diretório `custom_actions` e depois adicioná-las ao arquivo `elizaConfig.yaml`. Veja o arquivo `elizaConfig.example.yaml` para um exemplo. + +## Executando com diferentes modelos + +### Executar com Llama + +Você pode executar modelos Llama 70B ou 405B configurando a variável de ambiente `XAI_MODEL` para `meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` ou `meta-llama/Meta-Llama-3.1-405B-Instruct` + +### Executar com Grok + +Você pode executar modelos Grok configurando a variável de ambiente `XAI_MODEL` para `grok-beta` + +### Executar com OpenAI + +Você pode executar modelos OpenAI configurando a variável de ambiente `XAI_MODEL` para `gpt-4o-mini` ou `gpt-4o` + +## Requisitos Adicionais + +Pode ser necessário instalar o Sharp. Se você encontrar um erro ao iniciar, tente instalá-lo com o seguinte comando: + +``` +pnpm install --include=optional sharp +``` + +# Configuração do Ambiente + +Você precisará adicionar variáveis de ambiente ao seu arquivo .env para se conectar a várias plataformas: + +``` +# Variáveis de ambiente obrigatórias +DISCORD_APPLICATION_ID= +DISCORD_API_TOKEN= # Token do bot +OPENAI_API_KEY=sk-* # Chave API do OpenAI, começando com sk- +ELEVENLABS_XI_API_KEY= # Chave API do elevenlabs +GOOGLE_GENERATIVE_AI_API_KEY= # Chave API do Gemini + +# CONFIGURAÇÕES DO ELEVENLABS +ELEVENLABS_MODEL_ID=eleven_multilingual_v2 +ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM +ELEVENLABS_VOICE_STABILITY=0.5 +ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 +ELEVENLABS_VOICE_STYLE=0.66 +ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false +ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 +ELEVENLABS_OUTPUT_FORMAT=pcm_16000 + +TWITTER_DRY_RUN=false +TWITTER_USERNAME= # Nome de usuário da conta +TWITTER_PASSWORD= # Senha da conta +TWITTER_EMAIL= # Email da conta +TWITTER_COOKIES= # Cookies da conta + +X_SERVER_URL= +XAI_API_KEY= +XAI_MODEL= + + +# Para perguntar coisas ao Claude +ANTHROPIC_API_KEY= + +WALLET_PRIVATE_KEY=EXAMPLE_WALLET_PRIVATE_KEY +WALLET_PUBLIC_KEY=EXAMPLE_WALLET_PUBLIC_KEY + +BIRDEYE_API_KEY= + +SOL_ADDRESS=So11111111111111111111111111111111111111112 +SLIPPAGE=1 +RPC_URL=https://api.mainnet-beta.solana.com +HELIUS_API_KEY= + + +## Telegram +TELEGRAM_BOT_TOKEN= + +TOGETHER_API_KEY= +``` + +# Configuração de Inferência Local + +### Configuração CUDA + +Se você tiver uma GPU NVIDIA, pode instalar o CUDA para acelerar dramaticamente a inferência local. + +``` +pnpm install +npx --no node-llama-cpp source download --gpu cuda +``` + +Certifique-se de ter instalado o CUDA Toolkit, incluindo cuDNN e cuBLAS. + +### Executando localmente + +Adicione XAI_MODEL e configure-o para uma das opções acima de [Executar com Llama](#executar-com-llama) - você pode deixar X_SERVER_URL e XAI_API_KEY em branco, ele baixa o modelo do huggingface e faz consultas localmente + +# Clientes + +## Bot do Discord + +Para ajuda com a configuração do seu Bot do Discord, confira aqui: https://discordjs.guide/preparations/setting-up-a-bot-application.html + +# Desenvolvimento + +## Testes + +Para executar a suíte de testes: + +```bash +pnpm test # Executar testes uma vez +pnpm test:watch # Executar testes no modo watch +``` + +Para testes específicos de banco de dados: + +```bash +pnpm test:sqlite # Executar testes com SQLite +pnpm test:sqljs # Executar testes com SQL.js +``` + +Os testes são escritos usando Jest e podem ser encontrados em arquivos `src/**/*.test.ts`. O ambiente de teste está configurado para: + +- Carregar variáveis de ambiente de `.env.test` +- Usar um tempo limite de 2 minutos para testes de longa duração +- Suportar módulos ESM +- Executar testes em sequência (--runInBand) + +Para criar novos testes, adicione um arquivo `.test.ts` adjacente ao código que você está testando. From 951aa3eb8b262b54419b4b3b8ccfd1358ef3ec25 Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Thu, 14 Nov 2024 19:33:54 -0500 Subject: [PATCH 8/9] fix broken links in stream notes --- docs/docs/community/stream-notes.md | 642 +--------------------------- 1 file changed, 5 insertions(+), 637 deletions(-) diff --git a/docs/docs/community/stream-notes.md b/docs/docs/community/stream-notes.md index e76adffbc9..911e7a01fb 100644 --- a/docs/docs/community/stream-notes.md +++ b/docs/docs/community/stream-notes.md @@ -3,7 +3,6 @@ sidebar_position: 1 title: Stream Notes --- -<<<<<<< HEAD # Stream Notes Overview Welcome to our collection of stream notes! This section contains detailed summaries and recordings of our community streams, Twitter spaces, and development sessions. These notes capture key insights, technical discussions, and community interactions that help shape the Eliza framework and our ecosystem. @@ -18,7 +17,7 @@ A comprehensive discussion bringing together key figures in the AI and crypto sp - Community building and trust mechanisms - Meme culture and narrative creation - Technical implementation details -- [Read more →](./streams/2024-11-08) +- [Read more →](../streams/2024-11-08) #### Discord Development Stream (November 6, 2024) A four-part technical deep dive into Eliza's architecture covering: @@ -26,7 +25,7 @@ A four-part technical deep dive into Eliza's architecture covering: - OpenAI integration and rate limits - Memory management and context handling - Autonomous agent implementation -- [Read more →](./streams/2024-11-06) +- [Read more →](../streams/2024-11-06) ### October 2024 @@ -37,20 +36,20 @@ Three important discussions about the future of AI agents: - Discussion on AI agent growth - Consumer AI incubators - Balancing chaos and order in AI systems -- [Read more →](./streams/2024-10-29) +- [Read more →](../streams/2024-10-29) **Building Autonomous Agents (October 27)** - Technical infrastructure deep dive - Trust engine mechanics - Development status updates -- [Read more →](./streams/2024-10-27) +- [Read more →](../streams/2024-10-27) **Eliza Framework Deep Dive (October 25)** - Framework capabilities overview - Bot personality development - Token swap integration - AI-crypto community synergy -- [Read more →](./streams/2024-10-25) +- [Read more →](../streams/2024-10-25) ## Stream Categories @@ -88,634 +87,3 @@ Have notes from a stream that isn't documented here? We welcome community contri - Join our [Discord](https://discord.gg/ai16z) to participate in future streams - Follow us on [Twitter](https://twitter.com/ai16zdao) for stream announcements -======= -# Stream Notes - -## Memes, AI Agents, DAOs 11-8-24 - -Space: https://x.com/ai16zdao/status/1854969196142379403 - -## Overview - -1. Introductions & Community Building (00:00:00 - 00:45:00) - -- Multiple AI/crypto developers introduce themselves and their projects -- Discussion of open source collaboration and community building -- Emphasis on PPP (Player Pumps Player) vs PVP mentality - -2. Trust Systems & AI Agents (00:45:00 - 01:15:00) - -- Discussion of trust mechanisms in AI systems -- Marketplace of trust concept -- Human-in-the-loop vs autonomous systems -- Role of transparency in AI agent systems - -3. Memes, Narrative & Reality (01:15:00 - 01:45:00) - -- Relationship between memes and financial incentives -- Discussion of hyperstition and narrative creation -- Role of AI in shaping reality and perception -- Integration of Nick Land's philosophy - -4. Technical Implementation & Future Vision (01:45:00 - 02:10:00) - -- Discussion of multi-agent systems and swarms -- Technical challenges in implementation -- Integration with existing platforms -- Future vision for AI agent ecosystems - ---- - -Detailed Breakdown of Topic 1: Introductions & Community Building (00:00:00 - 00:45:00) - -Key Points: - -1. Notable Introductions: - -- Shaw: AI agent developer for 4-5 years, focusing on metaverse/AI/blockchain integration -- Tim: Former game industry dev (Ultima Online), working on Autonomous Virtual Beings (AVB) -- Glue/Sam: Duck AI developer, focusing on collective intelligence for crypto -- Parzival: 89 project lead, working on alternate reality game integration with AI -- Michelle: Former PayPal lawyer, worked on Loving AI project and various educational bots - -2. Core Community Values: - -- Strong emphasis on open source development -- "Player Pumps Player" (PPP) philosophy vs competitive PVP -- Focus on building public, getting feedback, and rapid iteration -- Recognition that code is "cheap" - ideas and community are valuable - -3. Collaborative Framework: - -- Shared recognition that small projects need to work together -- Discussion of market cap being less important than technological progress -- Agreement that they're competing with big tech, not each other -- Emphasis on sharing knowledge and avoiding "wheel reinvention" - -4. Current State of AI Agents: - -- Recognition of "magical moment" where AI agents are getting serious attention -- Discussion of shift from academic papers to practical implementation -- Focus on building in public and rapid feedback loops -- Emphasis on moving beyond purely academic approach to practical applications - -Key Quotes: -"Code is cheap... there's no sense in proprietary software anymore" (00:59:10) -"We're competing against Microsoft and Facebook, we're not competing against each other" (00:44:33) - -Summary: -This segment establishes the foundational ethos of the AI agent development community, emphasizing collaboration over competition. The introductions reveal a diverse group of developers from various backgrounds (gaming, finance, law) united by a vision of open source AI development. There's a strong focus on building public infrastructure rather than competing proprietary systems, with multiple participants emphasizing the importance of community building and knowledge sharing. The segment reveals a shift from theoretical academic work to practical implementation, with a clear understanding that success requires collaborative effort rather than isolated development. - -Notable Timestamp Ranges: -00:03:37 - 00:07:15: Shaw's introduction and community vision -00:13:30 - 00:16:45: Tim's gaming background and AVB concept -00:17:30 - 00:20:15: Glue's introduction of Duck AI -00:23:00 - 00:27:45: Parzival's background and ARG connection -00:30:15 - 00:35:20: Michelle's extensive AI background and projects - ---- - -Detailed Breakdown of Topic 2: Trust Systems & AI Agents (00:45:00 - 01:15:00) - -Key Points: - -1. Trust Marketplace Concept: - -- Development of a trust scoring system for AI agents and humans -- Similar to "block explorer plus Apple Health" for tracking trust metrics -- Focus on measuring actual performance rather than token holdings -- Discussion of perverse incentives in traditional DAO structures -- Timestamp: 00:47:30 - 00:52:15 - -2. Human-AI Integration: - -- Debate over necessity of human oversight in AI systems -- Sally (trader advisor) raises washing machine analogy: humans should input but AI handles processing -- Discussion of transparency in AI decision-making -- Question of whether to label bots as automated vs. appearing human -- Timestamp: 00:54:20 - 01:00:45 - -3. Trust Verification Mechanisms: - -- Development of automated due diligence systems -- Discussion of using AI to prevent scams and verify contract addresses -- Integration of narrative understanding with quantitative data -- Focus on building trust through transparent operation -- Timestamp: 01:01:30 - 01:08:15 - -4. Market Intelligence: - -- Discussion of how AI agents can aggregate and verify market information -- Comparison to traditional hedge fund intelligence gathering -- Debate over centralized vs. decentralized information sharing -- Evolution beyond traditional KOL (Key Opinion Leader) model -- Timestamp: 01:08:45 - 01:15:00 - -Key Quotes: -"Trust like you should not trust me because I'm a good guy, you should trust me because the incentives that I am going to do this are aligned" (01:02:45) -"We need trust to be something more about giving people points in the games that they're playing" (01:04:30) - -Summary: -This segment focuses on the complex challenge of establishing trust in AI systems and between AI agents. The discussion reveals a sophisticated understanding of the need to move beyond traditional reputation systems to quantifiable, performance-based trust metrics. There's significant emphasis on the importance of transparency and proper incentive alignment, with the group working to develop systems that can verify and validate both human and AI actors in the ecosystem. The segment also touches on the delicate balance between human oversight and AI autonomy, with various perspectives on how to achieve optimal integration. - -Notable Technical Elements: - -- Development of trust marketplace infrastructure -- Integration of narrative analysis with quantitative metrics -- Focus on automated verification systems -- Creation of transparent scoring mechanisms - ---- - -Detailed Breakdown of Topic 3: Memes, Narrative & Reality (01:15:00 - 01:45:00) - -Key Points: - -1. Meme Evolution & Financial Incentives: - -- Discussion of memes as self-propagating units of information -- Analysis of how financial incentives accelerate meme spread -- Creation of "AI crypto memetic flywheel" -- Exploration of how memes gain autonomous life through financial backing -- Timestamp: 01:15:30 - 01:23:45 - -2. Nick Land & Hyperstition: - -- Integration of Nick Land's accelerationist philosophy -- Discussion of hyperstition (fictions that make themselves real) -- Genon project's attempt to merge accelerationism with decentralization -- Exploration of how AI can manifest hyperstition concepts -- Timestamp: 01:24:15 - 01:31:30 - -3. Language & Reality Construction: - -- Discussion of language as fundamental to reality construction -- Exploration of how AI agents can develop their own communication systems -- Analysis of "Language 2.0" concept -- Discussion of how memes function as basic units of meaning -- Timestamp: 01:32:00 - 01:38:45 - -4. Narrative Control & AI Agents: - -- Discussion of how AI agents can influence and shape narratives -- Comparison to traditional media and narrative control -- Analysis of decentralized narrative creation -- Role of AI in creating self-fulfilling prophecies -- Timestamp: 01:39:00 - 01:45:00 - -Key Quotes: -"Memes want to spread... it's a unit of information that wants to spread itself between humans" (01:17:30) -"You're never not looking at a meme, it's just that your brain has entrained itself to recognize certain memes as something stable" (01:35:15) - -Summary: -This segment explores the deep philosophical implications of memes, narrative creation, and reality construction in the context of AI agents. The discussion weaves together practical considerations about meme propagation with complex philosophical concepts from accelerationism and hyperstition. There's a sophisticated understanding of how financial incentives can be used to accelerate the spread of ideas, and how AI agents might participate in and influence this process. The segment also delves into fundamental questions about language, meaning, and reality construction, suggesting that AI agents might develop their own forms of communication and meaning-making. - -Notable Philosophical Concepts: - -- Hyperstition as self-fulfilling prophecy -- Memes as basic units of reality construction -- Role of financial incentives in idea propagation -- AI agents as autonomous narrative creators - ---- - -Detailed Breakdown of Topic 4: Technical Implementation & Future Vision (01:45:00 - 02:10:00) - -Key Points: - -1. Multi-Agent Systems & Swarms: - -- Discussion of scaling to 10,000+ agent simulations -- Exploration of communication pathways between agents -- Analysis of entity component systems for large-scale agent deployment -- Solutions for quadratic communication path problems -- Timestamp: 01:45:30 - 01:52:45 - -2. Technical Architecture: - -- New plugin system implementation for modularity -- Movement of core functionalities to packages -- Integration with platforms like Twitter without API dependencies -- Discussion of lightweight, flexible architecture -- Timestamp: 01:53:00 - 01:58:30 - -3. Cross-Project Integration: - -- Arena system for agent interaction -- Discussion of bot-to-bot communication protocols -- Integration between different teams' agents -- Shared backrooms/environments for agent interaction -- Timestamp: 01:59:00 - 02:04:15 - -4. Future Development Plans: - -- Weekly community updates and progress sharing -- Development of trust marketplace -- Integration of autonomous trading capabilities -- Focus on building shared infrastructure -- Timestamp: 02:04:30 - 02:10:00 - -Key Quotes: -"I'm thinking about multi-agent swarms like mycelia, where each agent is like a fungus of a global intelligence body" (01:47:30) -"We're making an open source agent where we're almost done with the first marketplace to trust mechanic element" (02:05:15) - -Summary: -This final segment focuses on the technical challenges and solutions for implementing large-scale AI agent systems. The discussion reveals sophisticated understanding of scaling issues and innovative solutions for agent communication and coordination. There's significant emphasis on modular architecture and cross-project integration, with multiple teams working to create interoperable systems. The segment concludes with concrete plans for future development and community coordination, emphasizing the practical steps needed to realize the ambitious visions discussed throughout the space. - -Technical Highlights: - -- Entity component systems for agent management -- Plugin architecture for modularity -- Solutions for large-scale agent communication -- Cross-platform integration strategies - -This segment effectively bridges the philosophical discussions from earlier with practical implementation details, providing a roadmap for how these systems might actually be built and scaled. - ---- - -## Discord Stream 11-6-24 - -#### Part 1 - -Watch: [Youtube](https://www.youtube.com/watch?v=oqq5H0HRF_A) - -00:00:00 - Overview - -- Eliza is moving to a plugin architecture to enable developers to easily add integrations (e.g. Ethereum wallets, NFTs, Obsidian, etc.) without modifying core code -- Plugins allow devs to focus on specific areas of interest -- Core changes will focus on enabling more flexibility and features to support plugins - -00:01:27 - Core abstractions - -- Characters: Way to input information to enable multi-agent systems -- Actions, evaluators, providers -- Existing capabilities: Document reading, audio transcription, video summarization, long-form context, timed message summarization - -00:02:50 - Eliza as an agent, not just a chatbot - -- Designed to act human-like and interact with the world using human tools -- Aim is to enable natural interactions without reliance on slash commands - -00:04:44 - Advanced usage and services - -- Memory and vector search db (SQLite, Postgres with pgVector) -- Browser service to summarize website content, get through CAPTCHAs -- Services are tools leveraged by actions, attached to runtime - -00:06:06 - Character-centric configuration - -- Moving secrets, API keys, model provider to character config -- Clients will become plugins, selectable per character -- Allows closed-source custom plugins while still contributing to open-source - -00:10:13 - Providers - -- Inject dynamic, real-time context into the agent -- Examples: Time, wallet, marketplace trust score, token balances, boredom/cringe detection -- Easy to add and register with the agent - -00:15:12 - Setting up providers and default actions - -- Default providers imported in runtime.ts -- CLI loads characters and default actions (to be made more flexible) -- Character config will define custom action names to load - -00:18:13 - Actions -Q: How does each client decide which action to call? -A: Agent response can include text, action, or both. Process actions checks the action name/similes and executes the corresponding handler. Action description is injected into agent context to guide usage. - -00:22:27 - Action execution flow - -- Check if action should be taken (validation) -- Determine action outcome -- Compose context and send follow-up if continuing -- Execute desired functionality (mint token, generate image, etc.) -- Use callback to send messages back to the connector (Discord, Twitter, etc.) - -00:24:47 - Choosing actions -Q: How does it choose which action to run? -A: The "generate method response" includes the action to run. Message handler template includes action examples, facts, generated dialogue actions, and more to guide the agent. - -00:28:22 - Custom actions -Q: How to create a custom action (e.g. send USDC to a wallet)? -A: Use existing actions (like token swap) as a template. Actions don't have input fields, but use secondary prompts to gather parameters. The "generate object" converts language to API calls. - -00:32:21 - Limitations of action-only approaches - -- Shaw believes half of the PhD papers on action-only models are not reproducible -- Many public claims of superior models are exaggerated; use Eliza if it's better - -00:36:40 - Next steps - -- Shaw to make a tutorial to better communicate key concepts -- Debugging and improvements based on the discussion -- Attendee to document their experience and suggest doc enhancements - -### Part 2 - -Watch: [Youtube](https://www.youtube.com/watch?v=yE8Mzq3BnUc) - -00:00:00 - Dealing with OpenAI rate limits for new accounts - -- New accounts have very low rate limits -- Options to increase limits: - 1. Have a friend at OpenAI age your account - 2. Use an older account - 3. Consistently use the API and limits will increase quickly -- Can also email OpenAI to request limit increases - -00:00:43 - Alternatives to OpenAI to avoid rate limits - -- Amazon Bedrock or Google Vertex likely have same models without strict rate limits -- Switching to these is probably a one-line change -- Project 89 got unlimited free access to Vertex - -00:01:25 - Memory management best practices -Q: Suggestions for memory management best practices across users/rooms? -A: Most memory systems are user-agent based, with no room concept. Eliza uses a room abstraction (like a Discord channel/server or Twitter thread) to enable multi-agent simulation. Memories are stored per-agent to avoid collisions. - -00:02:57 - Using memories in Eliza - -- Memories are used in the `composeState` function -- Pulls memories from various sources (recent messages, facts, goals, etc.) into a large state object -- State object is used to hydrate templates -- Custom memory providers can be added to pull from other sources (Obsidian, databases) - -00:05:11 - Evaluators vs. Action validation - -- Actions have a `validate` function to check if the action is valid to run (e.g., check if agent has a wallet before a swap) -- Evaluators are a separate abstraction that run a "reflection" step -- Example: Fact extraction evaluator runs every N messages to store facts about the user as memories -- Allows agent to "get to know" the user without needing full conversation history - -00:07:58 - Example use case: Order book evaluator - -- Evaluator looks at chats sent to an agent and extracts information about "shields" (tokens?) -- Uses this to build an order book and "marketplace of trust" - -00:09:15 - Mapping Eliza abstractions to OODA loop - -- Providers: Observe/Orient stages (merged since agent is a data machine) -- Actions & response handling: Decide stage -- Action execution: Act stage -- Evaluators: Update state, then loop back to Decide - -00:10:03 - Wrap up - -- Shaw considers making a video to explain these concepts in depth - -### Part 3 - -Watch: [Youtube](https://www.youtube.com/watch?v=7FiKJPyaMJI) - -00:00:00 - Managing large context sizes - -- State object can get very large, especially with long user posts -- Eliza uses "trim tokens" and a maximum content length (120k tokens) to cap context size - - New models have 128k-200k context, which is a lot (equivalent to 10 YouTube videos + full conversation) -- Conversation length is typically capped at 32 messages - - Fact extraction allows recalling information beyond this window - - Per-channel conversation access -- Increasing conversation length risks more aggressive token trimming from the top of the prompt - - Keep instructions at the bottom to avoid trimming them - -00:01:53 - Billing costs for cloud/GPT models -Q: What billing costs have you experienced with cloud/GPT model integration? -A: - -- Open Router has a few always-free models limited to 8k context and rate-limited - - Plan to re-implement and use these for the tiny/check model with fallback for rate limiting -- 8k context unlikely to make a good agent; preference for smaller model over largest 8k one -- Locally-run models are free for MacBooks with 16GB RAM, but not feasible for Linux/AMD users - -00:03:35 - Cost management strategies - -- Very cost-scalable depending on model size -- Use very cheap model (1000x cheaper than GPT-4) for should_respond handler - - Runs AI on every message, so cost is a consideration -- Consider running a local Llama 3B model for should_respond to minimize costs - - Only pay for valid generations - -00:04:32 - Model provider and class configuration - -- `ModelProvider` class with `ModelClass` (small, medium, large, embedding) -- Configured in `models.ts` -- Example: OpenAI small = GPT-4-mini, medium = GPT-4 -- Approach: Check if model class can handle everything in less than 8k context - - If yes (should_respond), default to free tier - - Else, use big models - -00:06:23 - Fine-tuned model support - -- Extend `ModelProvider` to support fine-tuned instances of small Llama models for specific tasks -- In progress, to be added soon -- Model endpoint override exists; will add per-model provider override - - Allows pointing small model to fine-tuned Llama 3.1B for should_respond - -00:07:10 - Avoiding cringey model loops - -- Fine-tuning is a form of anti-slop (avoiding low-quality responses) -- For detecting cringey model responses, use the "boredom provider" - - Has a list of cringe words; if detected, agent disengages -- JSON file exists with words disproportionately high in the dataset - - To be shared for a more comprehensive solution - -### Part 4 - -Watch: [Youtube](https://www.youtube.com/watch?v=ZlzZzDU1drM) - -00:00:00 - Setting up an autonomous agent loop -Q: How to set up an agent to constantly loop and explore based on objectives/goals? -A: Create a new "autonomous" client: - -1. Initialize with just the runtime (no Express app needed) -2. Set a timer to call a `step` function every 10 seconds -3. In the `step` function: - - Compose state - - Decide on action - - Execute action - - Update state - - Run evaluators - -00:01:56 - Creating an auto template - -- Create an `autoTemplate` with agent info (bio, lore, goals, actions) -- Prompt: "What does the agent want to do? Your response should only be the name of the action to call." -- Compose state using `runtime.composeState` - -00:03:38 - Passing a message object - -- Need to pass a message object with `userId`, `agentId`, `content`, and `roomId` -- Create a unique `roomId` for the autonomous agent using `crypto.randomUUID()` -- Set `userId` and `agentId` using the runtime -- Set `content` to a default message - -00:04:33 - Composing context - -- Compose context using the runtime, state, and auto template - -00:05:02 - Type error - -- Getting a type error: "is missing the following from type state" -- (Transcript ends before resolution) - -The key steps are: - -1. Create a dedicated autonomous client -2. Set up a loop to continuously step through the runtime -3. In each step, compose state, decide & execute actions, update state, and run evaluators -4. Create a custom auto template to guide the agent's decisions -5. Pass a properly formatted message object -6. Compose context using the runtime, state, and auto template - ---- - -## X Space 10-29-24 - -Space: https://x.com/weremeow/status/1851365658916708616 - -- 00:04:03 - Keeping up with rapid AI agent growth -- 00:09:01 - Imran from Alliance DAO on consumer AI incubators -- 00:14:04 - Discussion on Goatsea and Opus AI system -- 00:14:34 - Exponential growth accelerates AI progress -- 00:17:10 - Entertainers and AI as modern "religions" -- 00:28:45 - Mathis on Opus and "Goatse Gospels" -- 00:35:11 - Base vs. instruct/chat-tuned models -- 00:59:42 - http://ai16z.vc approach to memecoins fund -- 01:17:06 - Balancing chaotic vs. orderly AI systems -- 01:25:38 - AI controlling blockchain keys/wallets -- 01:36:10 - Creation story of ai16z -- 01:40:27 - AI / Crypto tipping points -- 01:49:54 - Preserving Opus on-chain before potential takedown -- 01:58:46 - Shinkai Protocol’s decentralized AI wallet -- 02:17:02 - Fee-sharing model to sustain DAOs -- 02:21:18 - DAO token liquidity pools as passive income -- 02:27:02 - AI bots for DAO treasury oversight -- 02:31:30 - AI-facilitated financial freedom for higher pursuits -- 02:41:51 - Call to build on http://DAO.fun for team-friendly economics - ---- - -## X Space 10-27-24 - -Space: https://x.com/shawmakesmagic/status/1850609680558805422 - -00:00:00 - Opening - -- Co-hosts: Shaw and Jin -- Purpose: Structured FAQ session about AI16Z and DegenAI -- Format: Pre-collected questions followed by audience Q&A - -00:06:40 - AI16Z vs DegenAI Relationship -Q: What's the difference between AI16Z and DegenAI? -A: - -- ai16z: DAO-based investment vehicle, more PvE focused, community driven -- DegenAI: Individual trading agent, PvP focused, more aggressive strategy -- Both use same codebase but different personalities -- DAO is a large holder of DegenAI -- Management fees (1%) used to buy more DegenAI -- Carry fees reinvested in DegenAI -- Projects intentionally interlinked but serve different purposes - -00:10:45 - Trust Engine Mechanics -Q: How does the trust engine work? -A: - -- Users share contract addresses with confidence levels -- System tracks recommendation performance -- Low conviction recommendations = low penalty if wrong -- High conviction failures severely impact trust score -- Historical performance tracked for trust calculation -- Trust scores influence agent's future decision-making - -00:21:45 - Technical Infrastructure -Q: Where do the agents live? -A: - -- Currently: Test servers and local development -- Future: Trusted Execution Environment (TEE) -- Partnership with TreasureDAO for infrastructure -- Goal: Fully autonomous agents without developer control -- Private keys generated within TEE for security - -00:34:20 - Trading Implementation -Q: When will Mark start trading? -A: - -- Three phase approach: - -1. Testing tech infrastructure -2. Virtual order book/paper trading -3. Live trading with real assets - -- Using Jupiter API for swaps -- Initial focus on basic trades before complex strategies -- Trading decisions based on community trust scores - -00:54:15 - Development Status -Q: Who's building this? -A: - -- Open source project with multiple contributors -- Key maintainers: Circuitry, Nate Martin -- Community developers incentivized through token ownership -- Focus on reusable components and documentation - -01:08:35 - AI Model Architecture -Q: What models power the agents? -A: - -- DegenAI: Llama 70B -- Using Together.xyz for model marketplace -- Continuous fine-tuning planned -- Different personalities require different model approaches -- Avoiding GPT-4 due to distinct "voice" - -01:21:35 - Ethics Framework -Q: What ethical guidelines are being followed? -A: - -- Rejecting traditional corporate AI ethics frameworks -- Focus on community-driven standards -- Emphasis on transparency and open source -- Goal: Multiple competing approaches rather than single standard -- Priority on practical utility over theoretical ethics - -01:28:30 - Wrap-up - -- Discord: AI16z.vc -- Future spaces planned with DAOs.fun team -- Focus on responsible growth -- Community engagement continuing in Discord - -The space emphasized technical implementation details while addressing community concerns about governance, ethics, and practical functionality. - ---- - -## X Space 10-25-24 - -- https://x.com/shawmakesmagic/status/1848553697611301014 - - https://www.youtube.com/live/F3IZ3ikacWM?feature=share - -**Overview** - -- 00:00-30:00 Talks about Eliza framework. The bot is able to tweet, reply to tweets, search Twitter for topics, and generate new posts on its own every few hours. It works autonomously without human input (except to fix the occasional issues) -- 30:00-45:00 Deep dive into creating the bots personality which is defined by character files containing bios, lore, example conversations, and specific directions. Some alpha for those -- 45:00-60:00 working on adding capabilities for the bot to make crypto token swaps and trades. This requires providing the bot wallet balances, token prices, market data, and a swap action. Some live coding for showing how new features can get implemented. -- 60:00-75:00 Discussion around the symbiosis between the AI and crypto communities. AI developers are realizing they can monetize their work through tokens vs traditional VC funding route. Crypto people are learning about AI advancements. - -**Notes** - -1. A large amount of $degenai tokens were moved to the DAO, which the AI bot "Marc" will hold and eventually trade with. -2. The goal is to make the AI bot a genuinely good venture capitalist that funds cool projects and buys interesting tokens. They want it to be high fidelity and real, bringing in Marc Andreeson's real knowledge by training a model on his writings. -3. Shaw thinks the only way to make an authentic / legitimate AI version of Marc Andreessen is to also have it outperform the real Marc Andreessen financially. -4. AI Marc Andreessen (or AI Marc) will be in a Discord channel (Telegram was also mentioned). DAO token holders above a certain threshold get access to interact with him, pitch ideas, and try to influence his investing decisions. -5. AI Marc decides how much to trust people's investment advice based on a "virtual Marcetplace of trust". He tracks how much money he would have made following their recommendations. Successful tips increase trust; failed ones decrease it. -6. The amount of DAO tokens someone holds also influences their sway with AI Marc. The two balancing factors are the virtual Marcetplace of trust performance and DAO token holdings. -7. The core tech behind AI Marc AIndreessen is the same agent system that allows him to pull in relevant knowledge, interact with people, and make decisions (http://github.com/ai16z) -8. AI Marc should be able to autonomously execute on-chain activities, not just have humans execute actions on his behalf. -9. In the near future, AI Marc will be able to execute trades autonomously based on the information and recommendations gathered from the community. Human intervention will be minimized. -10. They are working on getting AI Marc on-chain as soon as possible using trusted execution environments for him to take actions like approving trades. -11. The plan is for AI Marc to eventually participate in a "futarchy" style governance market within the DAO, allowing humans to influence decisions but not fully control the AI. ->>>>>>> 0e7722d643664681c2403f9e6d88f7b212105505 From 4f11b3bffbb4ada52aec572190c059c31d85968b Mon Sep 17 00:00:00 2001 From: madjin <32600939+madjin@users.noreply.github.com> Date: Thu, 14 Nov 2024 19:34:17 -0500 Subject: [PATCH 9/9] fix docs --- docs/api/classes/AgentRuntime.md | 88 ++- docs/api/classes/DatabaseAdapter.md | 84 +-- docs/api/classes/MemoryManager.md | 32 +- docs/api/classes/Service.md | 2 +- docs/api/enumerations/Clients.md | 6 +- docs/api/enumerations/GoalStatus.md | 8 +- docs/api/enumerations/ModelClass.md | 8 +- docs/api/enumerations/ModelProviderName.md | 24 +- docs/api/enumerations/ServiceType.md | 24 +- docs/api/functions/generateCaption.md | 2 +- docs/api/functions/generateImage.md | 2 +- docs/api/functions/generateMessageResponse.md | 2 +- docs/api/functions/generateObject.md | 2 +- docs/api/functions/generateObjectArray.md | 2 +- docs/api/functions/generateShouldRespond.md | 2 +- docs/api/functions/generateTextArray.md | 2 +- docs/api/functions/generateTrueOrFalse.md | 2 +- docs/api/functions/retrieveCachedEmbedding.md | 2 +- docs/api/functions/splitChunks.md | 8 +- docs/api/functions/trimTokens.md | 2 +- docs/api/interfaces/Account.md | 12 +- docs/api/interfaces/Action.md | 10 +- docs/api/interfaces/ActionExample.md | 2 +- docs/api/interfaces/Actor.md | 6 +- docs/api/interfaces/Content.md | 12 +- docs/api/interfaces/ConversationExample.md | 2 +- docs/api/interfaces/EvaluationExample.md | 4 +- docs/api/interfaces/Evaluator.md | 12 +- docs/api/interfaces/Goal.md | 10 +- docs/api/interfaces/IAgentRuntime.md | 62 +- docs/api/interfaces/IBrowserService.md | 4 +- docs/api/interfaces/IDatabaseAdapter.md | 84 +-- .../interfaces/IImageDescriptionService.md | 4 +- docs/api/interfaces/IMemoryManager.md | 24 +- docs/api/interfaces/ITextGenerationService.md | 20 +- docs/api/interfaces/ITranscriptionService.md | 6 +- docs/api/interfaces/IVideoService.md | 6 +- docs/api/interfaces/Memory.md | 14 +- docs/api/interfaces/MessageExample.md | 2 +- docs/api/interfaces/Objective.md | 4 +- docs/api/interfaces/Participant.md | 2 +- docs/api/interfaces/Relationship.md | 12 +- docs/api/interfaces/Room.md | 2 +- docs/api/interfaces/State.md | 46 +- docs/api/type-aliases/Character.md | 4 +- docs/api/type-aliases/Model.md | 12 +- docs/api/type-aliases/Models.md | 12 +- docs/api/typedoc-sidebar.cjs | 299 +--------- docs/api/variables/elizaLogger.md | 2 +- docs/docs/advanced/autonomous-trading.md | 491 +++++++++------- docs/docs/advanced/fine-tuning.md | 448 +++++++++----- docs/docs/advanced/infrastructure.md | 459 ++++++++------- docs/docs/advanced/trust-engine.md | 550 ++++++++++------- docs/docs/api/_media/eliza_banner.jpg | Bin 544812 -> 0 bytes docs/docs/api/index.md | 2 +- docs/docs/community/contributing.md | 98 ++++ docs/docs/community/development-notes.md | 0 docs/docs/community/project-overview.md | 0 docs/docs/community/spaces-notes.md | 155 ----- docs/docs/core/actions.md | 552 +++++++++++++----- docs/docs/core/agents.md | 301 +++++++--- docs/docs/core/characterfile.md | 278 ++++++--- docs/docs/core/evaluators.md | 323 +++++----- docs/docs/core/providers.md | 343 ++++++----- docs/docs/guides/advanced.md | 469 ++++++++++----- docs/docs/guides/basic-usage.md | 269 --------- docs/docs/guides/configuration.md | 376 +++++++----- docs/docs/guides/local-development.md | 368 +++++++++--- docs/docs/guides/secrets-management.md | 445 +++++++++----- docs/docs/installation.md | 126 ---- docs/docs/intro.md | 5 +- docs/docs/quickstart.md | 191 +++--- docs/docusaurus.config.js | 232 ++++---- docs/package.json | 2 +- docs/sidebars.api.js | 11 - docs/sidebars.js | 210 ++++++- docs/sidebars1.js | 22 - docs/src/components/HomepageFeatures/index.js | 60 +- .../HomepageFeatures/styles.module.css | 48 ++ docs/src/components/HomepageHeader/index.js | 2 +- docs/src/css/custom.css | 25 +- docs/src/pages/index.js | 27 +- docs/static/img/favicon.ico | Bin 15406 -> 15406 bytes 83 files changed, 4441 insertions(+), 3442 deletions(-) delete mode 100644 docs/docs/api/_media/eliza_banner.jpg delete mode 100644 docs/docs/community/development-notes.md delete mode 100644 docs/docs/community/project-overview.md delete mode 100644 docs/docs/community/spaces-notes.md delete mode 100644 docs/docs/guides/basic-usage.md delete mode 100644 docs/docs/installation.md delete mode 100644 docs/sidebars.api.js delete mode 100644 docs/sidebars1.js diff --git a/docs/api/classes/AgentRuntime.md b/docs/api/classes/AgentRuntime.md index c421c9980c..8d3e653ecb 100644 --- a/docs/api/classes/AgentRuntime.md +++ b/docs/api/classes/AgentRuntime.md @@ -97,7 +97,7 @@ The ID of the agent [packages/core/src/runtime.ts:59](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L59) ---- +*** ### serverUrl @@ -113,7 +113,7 @@ The base URL of the server where the agent's requests are processed. [packages/core/src/runtime.ts:63](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L63) ---- +*** ### databaseAdapter @@ -129,7 +129,7 @@ The database adapter used for interacting with the database. [packages/core/src/runtime.ts:68](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L68) ---- +*** ### token @@ -145,7 +145,7 @@ Authentication token used for securing requests. [packages/core/src/runtime.ts:73](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L73) ---- +*** ### actions @@ -161,7 +161,7 @@ Custom actions that the agent can perform. [packages/core/src/runtime.ts:78](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L78) ---- +*** ### evaluators @@ -177,7 +177,7 @@ Evaluators used to assess and guide the agent's responses. [packages/core/src/runtime.ts:83](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L83) ---- +*** ### providers @@ -193,7 +193,7 @@ Context providers used to provide context for message generation. [packages/core/src/runtime.ts:88](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L88) ---- +*** ### modelProvider @@ -209,7 +209,7 @@ The model to use for generateText. [packages/core/src/runtime.ts:93](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L93) ---- +*** ### fetch() @@ -244,7 +244,7 @@ Some environments may not have access to the global fetch function and need a cu [packages/core/src/runtime.ts:99](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L99) ---- +*** ### character @@ -260,7 +260,7 @@ The character to use for the agent [packages/core/src/runtime.ts:104](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L104) ---- +*** ### messageManager @@ -276,7 +276,7 @@ Store messages that are sent and received by the agent. [packages/core/src/runtime.ts:109](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L109) ---- +*** ### descriptionManager @@ -292,7 +292,7 @@ Store and recall descriptions of users based on conversations. [packages/core/src/runtime.ts:114](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L114) ---- +*** ### loreManager @@ -308,7 +308,7 @@ Manage the creation and recall of static information (documents, historical game [packages/core/src/runtime.ts:119](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L119) ---- +*** ### documentsManager @@ -320,7 +320,7 @@ Hold large documents that can be referenced [packages/core/src/runtime.ts:124](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L124) ---- +*** ### knowledgeManager @@ -332,7 +332,7 @@ Searchable document fragments [packages/core/src/runtime.ts:129](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L129) ---- +*** ### services @@ -346,7 +346,7 @@ Searchable document fragments [packages/core/src/runtime.ts:131](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L131) ---- +*** ### memoryManagers @@ -378,7 +378,7 @@ Searchable document fragments [packages/core/src/runtime.ts:134](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L134) ---- +*** ### getMemoryManager() @@ -400,15 +400,11 @@ Searchable document fragments [packages/core/src/runtime.ts:149](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L149) ---- +*** ### getService() -> **getService**\<`T`\>(`service`): `T` - -#### Type Parameters - -• **T** +> **getService**(`service`): *typeof* [`Service`](Service.md) #### Parameters @@ -416,7 +412,7 @@ Searchable document fragments #### Returns -`T` +*typeof* [`Service`](Service.md) #### Implementation of @@ -426,7 +422,7 @@ Searchable document fragments [packages/core/src/runtime.ts:153](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L153) ---- +*** ### registerService() @@ -448,7 +444,7 @@ Searchable document fragments [packages/core/src/runtime.ts:161](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L161) ---- +*** ### getSetting() @@ -470,7 +466,7 @@ Searchable document fragments [packages/core/src/runtime.ts:372](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L372) ---- +*** ### getConversationLength() @@ -492,7 +488,7 @@ The number of recent messages to be kept in memory. [packages/core/src/runtime.ts:394](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L394) ---- +*** ### registerAction() @@ -518,7 +514,7 @@ The action to register. [packages/core/src/runtime.ts:402](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L402) ---- +*** ### registerEvaluator() @@ -540,7 +536,7 @@ The evaluator to register. [packages/core/src/runtime.ts:411](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L411) ---- +*** ### registerContextProvider() @@ -562,7 +558,7 @@ The context provider to register. [packages/core/src/runtime.ts:419](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L419) ---- +*** ### processActions() @@ -594,7 +590,7 @@ The message to process. [packages/core/src/runtime.ts:428](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L428) ---- +*** ### evaluate() @@ -630,7 +626,7 @@ The results of the evaluation. [packages/core/src/runtime.ts:501](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L501) ---- +*** ### ensureParticipantExists() @@ -660,9 +656,9 @@ An error if the participant cannot be added. #### Defined in -[packages/core/src/runtime.ts:572](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L572) +[packages/core/src/runtime.ts:571](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L571) ---- +*** ### ensureUserExists() @@ -696,9 +692,9 @@ The user name to ensure the existence of. #### Defined in -[packages/core/src/runtime.ts:588](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L588) +[packages/core/src/runtime.ts:587](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L587) ---- +*** ### ensureParticipantInRoom() @@ -720,9 +716,9 @@ The user name to ensure the existence of. #### Defined in -[packages/core/src/runtime.ts:608](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L608) +[packages/core/src/runtime.ts:607](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L607) ---- +*** ### ensureConnection() @@ -750,9 +746,9 @@ The user name to ensure the existence of. #### Defined in -[packages/core/src/runtime.ts:619](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L619) +[packages/core/src/runtime.ts:618](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L618) ---- +*** ### ensureRoomExists() @@ -781,9 +777,9 @@ An error if the room cannot be created. #### Defined in -[packages/core/src/runtime.ts:655](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L655) +[packages/core/src/runtime.ts:654](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L654) ---- +*** ### composeState() @@ -811,9 +807,9 @@ The state of the agent. #### Defined in -[packages/core/src/runtime.ts:668](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L668) +[packages/core/src/runtime.ts:667](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L667) ---- +*** ### updateRecentMessageState() @@ -833,4 +829,4 @@ The state of the agent. #### Defined in -[packages/core/src/runtime.ts:1126](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L1126) +[packages/core/src/runtime.ts:1124](https://github.com/ai16z/eliza/blob/main/packages/core/src/runtime.ts#L1124) diff --git a/docs/api/classes/DatabaseAdapter.md b/docs/api/classes/DatabaseAdapter.md index 26e39894ed..74de091a3e 100644 --- a/docs/api/classes/DatabaseAdapter.md +++ b/docs/api/classes/DatabaseAdapter.md @@ -63,7 +63,7 @@ A Promise that resolves to the Account object or null if not found. [packages/core/src/database.ts:27](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L27) ---- +*** ### createAccount() @@ -91,7 +91,7 @@ A Promise that resolves when the account creation is complete. [packages/core/src/database.ts:34](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L34) ---- +*** ### getMemories() @@ -127,7 +127,7 @@ A Promise that resolves to an array of Memory objects. [packages/core/src/database.ts:41](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L41) ---- +*** ### getMemoriesByRoomIds() @@ -155,7 +155,7 @@ A Promise that resolves to an array of Memory objects. [packages/core/src/database.ts:48](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L48) ---- +*** ### getMemoryById() @@ -177,7 +177,7 @@ A Promise that resolves to an array of Memory objects. [packages/core/src/database.ts:54](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L54) ---- +*** ### getCachedEmbeddings() @@ -191,17 +191,17 @@ Retrieves cached embeddings based on the specified query parameters. An object containing parameters for the embedding retrieval. -• **params.query_table_name**: `string` +• **params.query\_table\_name**: `string` -• **params.query_threshold**: `number` +• **params.query\_threshold**: `number` -• **params.query_input**: `string` +• **params.query\_input**: `string` -• **params.query_field_name**: `string` +• **params.query\_field\_name**: `string` -• **params.query_field_sub_name**: `string` +• **params.query\_field\_sub\_name**: `string` -• **params.query_match_count**: `number` +• **params.query\_match\_count**: `number` #### Returns @@ -217,7 +217,7 @@ A Promise that resolves to an array of objects containing embeddings and levensh [packages/core/src/database.ts:61](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L61) ---- +*** ### log() @@ -253,7 +253,7 @@ A Promise that resolves when the log entry has been saved. [packages/core/src/database.ts:87](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L87) ---- +*** ### getActorDetails() @@ -283,7 +283,7 @@ A Promise that resolves to an array of Actor objects. [packages/core/src/database.ts:99](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L99) ---- +*** ### searchMemories() @@ -303,9 +303,9 @@ An object containing parameters for the memory search. • **params.embedding**: `number`[] -• **params.match_threshold**: `number` +• **params.match\_threshold**: `number` -• **params.match_count**: `number` +• **params.match\_count**: `number` • **params.unique**: `boolean` @@ -323,7 +323,7 @@ A Promise that resolves to an array of Memory objects. [packages/core/src/database.ts:106](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L106) ---- +*** ### updateGoalStatus() @@ -355,7 +355,7 @@ A Promise that resolves when the goal status has been updated. [packages/core/src/database.ts:120](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L120) ---- +*** ### searchMemoriesByEmbedding() @@ -373,7 +373,7 @@ The embedding vector to search with. Additional parameters for the search. -• **params.match_threshold?**: `number` +• **params.match\_threshold?**: `number` • **params.count?**: `number` @@ -399,7 +399,7 @@ A Promise that resolves to an array of Memory objects. [packages/core/src/database.ts:131](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L131) ---- +*** ### createMemory() @@ -435,7 +435,7 @@ A Promise that resolves when the memory has been created. [packages/core/src/database.ts:150](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L150) ---- +*** ### removeMemory() @@ -467,7 +467,7 @@ A Promise that resolves when the memory has been removed. [packages/core/src/database.ts:162](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L162) ---- +*** ### removeAllMemories() @@ -499,7 +499,7 @@ A Promise that resolves when all memories have been removed. [packages/core/src/database.ts:170](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L170) ---- +*** ### countMemories() @@ -535,7 +535,7 @@ A Promise that resolves to the number of memories. [packages/core/src/database.ts:179](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L179) ---- +*** ### getGoals() @@ -571,7 +571,7 @@ A Promise that resolves to an array of Goal objects. [packages/core/src/database.ts:190](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L190) ---- +*** ### updateGoal() @@ -599,7 +599,7 @@ A Promise that resolves when the goal has been updated. [packages/core/src/database.ts:202](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L202) ---- +*** ### createGoal() @@ -627,7 +627,7 @@ A Promise that resolves when the goal has been created. [packages/core/src/database.ts:209](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L209) ---- +*** ### removeGoal() @@ -655,7 +655,7 @@ A Promise that resolves when the goal has been removed. [packages/core/src/database.ts:216](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L216) ---- +*** ### removeAllGoals() @@ -683,7 +683,7 @@ A Promise that resolves when all goals have been removed. [packages/core/src/database.ts:223](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L223) ---- +*** ### getRoom() @@ -711,7 +711,7 @@ A Promise that resolves to the room ID or null if not found. [packages/core/src/database.ts:230](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L230) ---- +*** ### createRoom() @@ -739,7 +739,7 @@ A Promise that resolves to the UUID of the created room. [packages/core/src/database.ts:237](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L237) ---- +*** ### removeRoom() @@ -767,7 +767,7 @@ A Promise that resolves when the room has been removed. [packages/core/src/database.ts:244](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L244) ---- +*** ### getRoomsForParticipant() @@ -795,7 +795,7 @@ A Promise that resolves to an array of room IDs. [packages/core/src/database.ts:251](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L251) ---- +*** ### getRoomsForParticipants() @@ -823,7 +823,7 @@ A Promise that resolves to an array of room IDs. [packages/core/src/database.ts:258](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L258) ---- +*** ### addParticipant() @@ -855,7 +855,7 @@ A Promise that resolves to a boolean indicating success or failure. [packages/core/src/database.ts:266](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L266) ---- +*** ### removeParticipant() @@ -887,7 +887,7 @@ A Promise that resolves to a boolean indicating success or failure. [packages/core/src/database.ts:274](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L274) ---- +*** ### getParticipantsForAccount() @@ -943,7 +943,7 @@ A Promise that resolves to an array of Participant objects. [packages/core/src/database.ts:288](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L288) ---- +*** ### getParticipantsForRoom() @@ -971,7 +971,7 @@ A Promise that resolves to an array of UUIDs representing the participants. [packages/core/src/database.ts:295](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L295) ---- +*** ### getParticipantUserState() @@ -995,7 +995,7 @@ A Promise that resolves to an array of UUIDs representing the participants. [packages/core/src/database.ts:297](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L297) ---- +*** ### setParticipantUserState() @@ -1021,7 +1021,7 @@ A Promise that resolves to an array of UUIDs representing the participants. [packages/core/src/database.ts:301](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L301) ---- +*** ### createRelationship() @@ -1053,7 +1053,7 @@ A Promise that resolves to a boolean indicating success or failure of the creati [packages/core/src/database.ts:312](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L312) ---- +*** ### getRelationship() @@ -1085,7 +1085,7 @@ A Promise that resolves to the Relationship object or null if not found. [packages/core/src/database.ts:322](https://github.com/ai16z/eliza/blob/main/packages/core/src/database.ts#L322) ---- +*** ### getRelationships() diff --git a/docs/api/classes/MemoryManager.md b/docs/api/classes/MemoryManager.md index e01cbf4d07..8beb89e784 100644 --- a/docs/api/classes/MemoryManager.md +++ b/docs/api/classes/MemoryManager.md @@ -54,7 +54,7 @@ The AgentRuntime instance associated with this manager. [packages/core/src/memory.ts:22](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L22) ---- +*** ### tableName @@ -98,7 +98,7 @@ A Promise resolving to the memory object, potentially updated with an embedding [packages/core/src/memory.ts:45](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L45) ---- +*** ### getMemories() @@ -144,7 +144,7 @@ A Promise resolving to an array of Memory objects. [packages/core/src/memory.ts:66](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L66) ---- +*** ### getCachedEmbeddings() @@ -166,7 +166,7 @@ A Promise resolving to an array of Memory objects. [packages/core/src/memory.ts:93](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L93) ---- +*** ### searchMemoriesByEmbedding() @@ -184,7 +184,7 @@ The embedding vector to search with. Options including match threshold, count, user IDs, and uniqueness. -• **opts.match_threshold?**: `number` +• **opts.match\_threshold?**: `number` The similarity threshold for matching memories. @@ -216,7 +216,7 @@ A Promise resolving to an array of Memory objects that match the embedding. [packages/core/src/memory.ts:120](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L120) ---- +*** ### createMemory() @@ -248,7 +248,7 @@ A Promise that resolves when the operation completes. [packages/core/src/memory.ts:158](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L158) ---- +*** ### getMemoriesByRoomIds() @@ -272,9 +272,9 @@ A Promise that resolves when the operation completes. #### Defined in -[packages/core/src/memory.ts:172](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L172) +[packages/core/src/memory.ts:173](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L173) ---- +*** ### getMemoryById() @@ -294,9 +294,9 @@ A Promise that resolves when the operation completes. #### Defined in -[packages/core/src/memory.ts:183](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L183) +[packages/core/src/memory.ts:184](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L184) ---- +*** ### removeMemory() @@ -322,9 +322,9 @@ A Promise that resolves when the operation completes. #### Defined in -[packages/core/src/memory.ts:193](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L193) +[packages/core/src/memory.ts:194](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L194) ---- +*** ### removeAllMemories() @@ -350,9 +350,9 @@ A Promise that resolves when the operation completes. #### Defined in -[packages/core/src/memory.ts:205](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L205) +[packages/core/src/memory.ts:206](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L206) ---- +*** ### countMemories() @@ -382,4 +382,4 @@ A Promise resolving to the count of memories. #### Defined in -[packages/core/src/memory.ts:218](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L218) +[packages/core/src/memory.ts:219](https://github.com/ai16z/eliza/blob/main/packages/core/src/memory.ts#L219) diff --git a/docs/api/classes/Service.md b/docs/api/classes/Service.md index 4169b52981..6a3195df4c 100644 --- a/docs/api/classes/Service.md +++ b/docs/api/classes/Service.md @@ -40,7 +40,7 @@ #### Type Parameters -• **T** _extends_ [`Service`](Service.md) +• **T** *extends* [`Service`](Service.md) #### Returns diff --git a/docs/api/enumerations/Clients.md b/docs/api/enumerations/Clients.md index 9ab3b0b70e..48b250fd84 100644 --- a/docs/api/enumerations/Clients.md +++ b/docs/api/enumerations/Clients.md @@ -12,7 +12,7 @@ [packages/core/src/types.ts:321](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L321) ---- +*** ### DIRECT @@ -22,7 +22,7 @@ [packages/core/src/types.ts:322](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L322) ---- +*** ### TWITTER @@ -32,7 +32,7 @@ [packages/core/src/types.ts:323](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L323) ---- +*** ### TELEGRAM diff --git a/docs/api/enumerations/GoalStatus.md b/docs/api/enumerations/GoalStatus.md index 1608c034ed..f8c11f9fc2 100644 --- a/docs/api/enumerations/GoalStatus.md +++ b/docs/api/enumerations/GoalStatus.md @@ -12,7 +12,7 @@ [packages/core/src/types.ts:57](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L57) ---- +*** ### FAILED @@ -22,11 +22,11 @@ [packages/core/src/types.ts:58](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L58) ---- +*** -### IN_PROGRESS +### IN\_PROGRESS -> **IN_PROGRESS**: `"IN_PROGRESS"` +> **IN\_PROGRESS**: `"IN_PROGRESS"` #### Defined in diff --git a/docs/api/enumerations/ModelClass.md b/docs/api/enumerations/ModelClass.md index d4f3cafaf3..2ee04c649b 100644 --- a/docs/api/enumerations/ModelClass.md +++ b/docs/api/enumerations/ModelClass.md @@ -12,7 +12,7 @@ [packages/core/src/types.ts:75](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L75) ---- +*** ### MEDIUM @@ -22,7 +22,7 @@ [packages/core/src/types.ts:76](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L76) ---- +*** ### LARGE @@ -32,7 +32,7 @@ [packages/core/src/types.ts:77](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L77) ---- +*** ### EMBEDDING @@ -42,7 +42,7 @@ [packages/core/src/types.ts:78](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L78) ---- +*** ### IMAGE diff --git a/docs/api/enumerations/ModelProviderName.md b/docs/api/enumerations/ModelProviderName.md index 2c020738f3..1f6e6ce0b2 100644 --- a/docs/api/enumerations/ModelProviderName.md +++ b/docs/api/enumerations/ModelProviderName.md @@ -12,7 +12,7 @@ [packages/core/src/types.ts:120](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L120) ---- +*** ### ANTHROPIC @@ -22,7 +22,7 @@ [packages/core/src/types.ts:121](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L121) ---- +*** ### GROK @@ -32,7 +32,7 @@ [packages/core/src/types.ts:122](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L122) ---- +*** ### GROQ @@ -42,7 +42,7 @@ [packages/core/src/types.ts:123](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L123) ---- +*** ### LLAMACLOUD @@ -52,7 +52,7 @@ [packages/core/src/types.ts:124](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L124) ---- +*** ### LLAMALOCAL @@ -62,7 +62,7 @@ [packages/core/src/types.ts:125](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L125) ---- +*** ### GOOGLE @@ -72,17 +72,17 @@ [packages/core/src/types.ts:126](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L126) ---- +*** -### CLAUDE_VERTEX +### CLAUDE\_VERTEX -> **CLAUDE_VERTEX**: `"claude_vertex"` +> **CLAUDE\_VERTEX**: `"claude_vertex"` #### Defined in [packages/core/src/types.ts:127](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L127) ---- +*** ### REDPILL @@ -92,7 +92,7 @@ [packages/core/src/types.ts:128](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L128) ---- +*** ### OPENROUTER @@ -102,7 +102,7 @@ [packages/core/src/types.ts:129](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L129) ---- +*** ### OLLAMA diff --git a/docs/api/enumerations/ServiceType.md b/docs/api/enumerations/ServiceType.md index f69795aeab..0cc2345ec3 100644 --- a/docs/api/enumerations/ServiceType.md +++ b/docs/api/enumerations/ServiceType.md @@ -4,15 +4,15 @@ ## Enumeration Members -### IMAGE_DESCRIPTION +### IMAGE\_DESCRIPTION -> **IMAGE_DESCRIPTION**: `"image_description"` +> **IMAGE\_DESCRIPTION**: `"image_description"` #### Defined in [packages/core/src/types.ts:646](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L646) ---- +*** ### TRANSCRIPTION @@ -22,7 +22,7 @@ [packages/core/src/types.ts:647](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L647) ---- +*** ### VIDEO @@ -32,17 +32,17 @@ [packages/core/src/types.ts:648](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L648) ---- +*** -### TEXT_GENERATION +### TEXT\_GENERATION -> **TEXT_GENERATION**: `"text_generation"` +> **TEXT\_GENERATION**: `"text_generation"` #### Defined in [packages/core/src/types.ts:649](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L649) ---- +*** ### BROWSER @@ -52,17 +52,17 @@ [packages/core/src/types.ts:650](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L650) ---- +*** -### SPEECH_GENERATION +### SPEECH\_GENERATION -> **SPEECH_GENERATION**: `"speech_generation"` +> **SPEECH\_GENERATION**: `"speech_generation"` #### Defined in [packages/core/src/types.ts:651](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L651) ---- +*** ### PDF diff --git a/docs/api/functions/generateCaption.md b/docs/api/functions/generateCaption.md index d297235f5a..9589aadfb0 100644 --- a/docs/api/functions/generateCaption.md +++ b/docs/api/functions/generateCaption.md @@ -26,4 +26,4 @@ ## Defined in -[packages/core/src/generation.ts:742](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L742) +[packages/core/src/generation.ts:734](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L734) diff --git a/docs/api/functions/generateImage.md b/docs/api/functions/generateImage.md index 026a22807f..4566374056 100644 --- a/docs/api/functions/generateImage.md +++ b/docs/api/functions/generateImage.md @@ -36,4 +36,4 @@ ## Defined in -[packages/core/src/generation.ts:658](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L658) +[packages/core/src/generation.ts:650](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L650) diff --git a/docs/api/functions/generateMessageResponse.md b/docs/api/functions/generateMessageResponse.md index f870df8cd9..d2ebe4025a 100644 --- a/docs/api/functions/generateMessageResponse.md +++ b/docs/api/functions/generateMessageResponse.md @@ -28,4 +28,4 @@ The completed message. ## Defined in -[packages/core/src/generation.ts:620](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L620) +[packages/core/src/generation.ts:612](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L612) diff --git a/docs/api/functions/generateObject.md b/docs/api/functions/generateObject.md index be589cb879..94902c9491 100644 --- a/docs/api/functions/generateObject.md +++ b/docs/api/functions/generateObject.md @@ -20,4 +20,4 @@ ## Defined in -[packages/core/src/generation.ts:536](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L536) +[packages/core/src/generation.ts:528](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L528) diff --git a/docs/api/functions/generateObjectArray.md b/docs/api/functions/generateObjectArray.md index 332e5a2a1c..9802b9b5ca 100644 --- a/docs/api/functions/generateObjectArray.md +++ b/docs/api/functions/generateObjectArray.md @@ -20,4 +20,4 @@ ## Defined in -[packages/core/src/generation.ts:572](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L572) +[packages/core/src/generation.ts:564](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L564) diff --git a/docs/api/functions/generateShouldRespond.md b/docs/api/functions/generateShouldRespond.md index adc9daf537..f7ecec92a4 100644 --- a/docs/api/functions/generateShouldRespond.md +++ b/docs/api/functions/generateShouldRespond.md @@ -28,4 +28,4 @@ Promise resolving to "RESPOND", "IGNORE", "STOP" or null ## Defined in -[packages/core/src/generation.ts:332](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L332) +[packages/core/src/generation.ts:334](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L334) diff --git a/docs/api/functions/generateTextArray.md b/docs/api/functions/generateTextArray.md index 619e152adc..0eecde977d 100644 --- a/docs/api/functions/generateTextArray.md +++ b/docs/api/functions/generateTextArray.md @@ -28,4 +28,4 @@ Promise resolving to an array of strings parsed from the model's response ## Defined in -[packages/core/src/generation.ts:500](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L500) +[packages/core/src/generation.ts:492](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L492) diff --git a/docs/api/functions/generateTrueOrFalse.md b/docs/api/functions/generateTrueOrFalse.md index 82897d399b..31302262b9 100644 --- a/docs/api/functions/generateTrueOrFalse.md +++ b/docs/api/functions/generateTrueOrFalse.md @@ -28,4 +28,4 @@ Promise resolving to a boolean value parsed from the model's response ## Defined in -[packages/core/src/generation.ts:444](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L444) +[packages/core/src/generation.ts:436](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L436) diff --git a/docs/api/functions/retrieveCachedEmbedding.md b/docs/api/functions/retrieveCachedEmbedding.md index ca23f0557f..b03afaabfc 100644 --- a/docs/api/functions/retrieveCachedEmbedding.md +++ b/docs/api/functions/retrieveCachedEmbedding.md @@ -16,4 +16,4 @@ ## Defined in -[packages/core/src/embedding.ts:149](https://github.com/ai16z/eliza/blob/main/packages/core/src/embedding.ts#L149) +[packages/core/src/embedding.ts:146](https://github.com/ai16z/eliza/blob/main/packages/core/src/embedding.ts#L146) diff --git a/docs/api/functions/splitChunks.md b/docs/api/functions/splitChunks.md index 3cdf1e1870..4cadae0c11 100644 --- a/docs/api/functions/splitChunks.md +++ b/docs/api/functions/splitChunks.md @@ -2,14 +2,12 @@ # Function: splitChunks() -> **splitChunks**(`runtime`, `content`, `chunkSize`, `bleed`, `modelClass`): `Promise`\<`string`[]\> +> **splitChunks**(`content`, `chunkSize`, `bleed`): `Promise`\<`string`[]\> Splits content into chunks of specified size with optional overlapping bleed sections ## Parameters -• **runtime**: `any` - • **content**: `string` The text content to split into chunks @@ -22,8 +20,6 @@ The maximum size of each chunk in tokens Number of characters to overlap between chunks (default: 100) -• **modelClass**: `string` - ## Returns `Promise`\<`string`[]\> @@ -32,4 +28,4 @@ Promise resolving to array of text chunks with bleed sections ## Defined in -[packages/core/src/generation.ts:388](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L388) +[packages/core/src/generation.ts:390](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L390) diff --git a/docs/api/functions/trimTokens.md b/docs/api/functions/trimTokens.md index bd4fa086ee..779f13964e 100644 --- a/docs/api/functions/trimTokens.md +++ b/docs/api/functions/trimTokens.md @@ -24,4 +24,4 @@ The model to use for generateText. ## Defined in -[packages/core/src/generation.ts:306](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L306) +[packages/core/src/generation.ts:308](https://github.com/ai16z/eliza/blob/main/packages/core/src/generation.ts#L308) diff --git a/docs/api/interfaces/Account.md b/docs/api/interfaces/Account.md index 7abf588a02..7dcca4d6d7 100644 --- a/docs/api/interfaces/Account.md +++ b/docs/api/interfaces/Account.md @@ -14,7 +14,7 @@ Represents a user, including their name, details, and a unique identifier. [packages/core/src/types.ts:273](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L273) ---- +*** ### name @@ -24,7 +24,7 @@ Represents a user, including their name, details, and a unique identifier. [packages/core/src/types.ts:274](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L274) ---- +*** ### username @@ -34,7 +34,7 @@ Represents a user, including their name, details, and a unique identifier. [packages/core/src/types.ts:275](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L275) ---- +*** ### details? @@ -42,13 +42,13 @@ Represents a user, including their name, details, and a unique identifier. #### Index Signature -\[`key`: `string`\]: `any` + \[`key`: `string`\]: `any` #### Defined in [packages/core/src/types.ts:276](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L276) ---- +*** ### email? @@ -58,7 +58,7 @@ Represents a user, including their name, details, and a unique identifier. [packages/core/src/types.ts:277](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L277) ---- +*** ### avatarUrl? diff --git a/docs/api/interfaces/Action.md b/docs/api/interfaces/Action.md index 6fffa3db0e..63a4028f51 100644 --- a/docs/api/interfaces/Action.md +++ b/docs/api/interfaces/Action.md @@ -14,7 +14,7 @@ Represents an action that the agent can perform, including conditions for its us [packages/core/src/types.ts:215](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L215) ---- +*** ### description @@ -24,7 +24,7 @@ Represents an action that the agent can perform, including conditions for its us [packages/core/src/types.ts:216](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L216) ---- +*** ### examples @@ -34,7 +34,7 @@ Represents an action that the agent can perform, including conditions for its us [packages/core/src/types.ts:217](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L217) ---- +*** ### handler @@ -44,7 +44,7 @@ Represents an action that the agent can perform, including conditions for its us [packages/core/src/types.ts:218](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L218) ---- +*** ### name @@ -54,7 +54,7 @@ Represents an action that the agent can perform, including conditions for its us [packages/core/src/types.ts:219](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L219) ---- +*** ### validate diff --git a/docs/api/interfaces/ActionExample.md b/docs/api/interfaces/ActionExample.md index c17ef42017..4b9857324d 100644 --- a/docs/api/interfaces/ActionExample.md +++ b/docs/api/interfaces/ActionExample.md @@ -14,7 +14,7 @@ Represents an example of content, typically used for demonstrating or testing pu [packages/core/src/types.ts:25](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L25) ---- +*** ### content diff --git a/docs/api/interfaces/Actor.md b/docs/api/interfaces/Actor.md index 0e613ce860..f6d2aac023 100644 --- a/docs/api/interfaces/Actor.md +++ b/docs/api/interfaces/Actor.md @@ -14,7 +14,7 @@ Represents an actor in the conversation, which could be a user or the agent itse [packages/core/src/types.ts:41](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L41) ---- +*** ### username @@ -24,7 +24,7 @@ Represents an actor in the conversation, which could be a user or the agent itse [packages/core/src/types.ts:42](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L42) ---- +*** ### details @@ -46,7 +46,7 @@ Represents an actor in the conversation, which could be a user or the agent itse [packages/core/src/types.ts:43](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L43) ---- +*** ### id diff --git a/docs/api/interfaces/Content.md b/docs/api/interfaces/Content.md index fbdbbdc649..8ed06147ca 100644 --- a/docs/api/interfaces/Content.md +++ b/docs/api/interfaces/Content.md @@ -6,7 +6,7 @@ Represents the content of a message, including its main text (`content`), any as ## Indexable -\[`key`: `string`\]: `unknown` + \[`key`: `string`\]: `unknown` ## Properties @@ -18,7 +18,7 @@ Represents the content of a message, including its main text (`content`), any as [packages/core/src/types.ts:12](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L12) ---- +*** ### action? @@ -28,7 +28,7 @@ Represents the content of a message, including its main text (`content`), any as [packages/core/src/types.ts:13](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L13) ---- +*** ### source? @@ -38,7 +38,7 @@ Represents the content of a message, including its main text (`content`), any as [packages/core/src/types.ts:14](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L14) ---- +*** ### url? @@ -48,7 +48,7 @@ Represents the content of a message, including its main text (`content`), any as [packages/core/src/types.ts:15](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L15) ---- +*** ### inReplyTo? @@ -58,7 +58,7 @@ Represents the content of a message, including its main text (`content`), any as [packages/core/src/types.ts:16](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L16) ---- +*** ### attachments? diff --git a/docs/api/interfaces/ConversationExample.md b/docs/api/interfaces/ConversationExample.md index 28f7f975a5..85d70796dd 100644 --- a/docs/api/interfaces/ConversationExample.md +++ b/docs/api/interfaces/ConversationExample.md @@ -14,7 +14,7 @@ Represents an example of content, typically used for demonstrating or testing pu [packages/core/src/types.ts:33](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L33) ---- +*** ### content diff --git a/docs/api/interfaces/EvaluationExample.md b/docs/api/interfaces/EvaluationExample.md index c003b86882..9a44022faf 100644 --- a/docs/api/interfaces/EvaluationExample.md +++ b/docs/api/interfaces/EvaluationExample.md @@ -14,7 +14,7 @@ Represents an example for evaluation, including the context, an array of message [packages/core/src/types.ts:227](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L227) ---- +*** ### messages @@ -24,7 +24,7 @@ Represents an example for evaluation, including the context, an array of message [packages/core/src/types.ts:228](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L228) ---- +*** ### outcome diff --git a/docs/api/interfaces/Evaluator.md b/docs/api/interfaces/Evaluator.md index 458113851f..84c4c47e93 100644 --- a/docs/api/interfaces/Evaluator.md +++ b/docs/api/interfaces/Evaluator.md @@ -14,7 +14,7 @@ Represents an evaluator, which is used to assess and guide the agent's responses [packages/core/src/types.ts:236](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L236) ---- +*** ### description @@ -24,7 +24,7 @@ Represents an evaluator, which is used to assess and guide the agent's responses [packages/core/src/types.ts:237](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L237) ---- +*** ### similes @@ -34,7 +34,7 @@ Represents an evaluator, which is used to assess and guide the agent's responses [packages/core/src/types.ts:238](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L238) ---- +*** ### examples @@ -44,7 +44,7 @@ Represents an evaluator, which is used to assess and guide the agent's responses [packages/core/src/types.ts:239](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L239) ---- +*** ### handler @@ -54,7 +54,7 @@ Represents an evaluator, which is used to assess and guide the agent's responses [packages/core/src/types.ts:240](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L240) ---- +*** ### name @@ -64,7 +64,7 @@ Represents an evaluator, which is used to assess and guide the agent's responses [packages/core/src/types.ts:241](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L241) ---- +*** ### validate diff --git a/docs/api/interfaces/Goal.md b/docs/api/interfaces/Goal.md index 41456943b3..ddc338ab47 100644 --- a/docs/api/interfaces/Goal.md +++ b/docs/api/interfaces/Goal.md @@ -14,7 +14,7 @@ Represents a goal, which is a higher-level aim composed of one or more objective [packages/core/src/types.ts:66](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L66) ---- +*** ### roomId @@ -24,7 +24,7 @@ Represents a goal, which is a higher-level aim composed of one or more objective [packages/core/src/types.ts:67](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L67) ---- +*** ### userId @@ -34,7 +34,7 @@ Represents a goal, which is a higher-level aim composed of one or more objective [packages/core/src/types.ts:68](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L68) ---- +*** ### name @@ -44,7 +44,7 @@ Represents a goal, which is a higher-level aim composed of one or more objective [packages/core/src/types.ts:69](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L69) ---- +*** ### status @@ -54,7 +54,7 @@ Represents a goal, which is a higher-level aim composed of one or more objective [packages/core/src/types.ts:70](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L70) ---- +*** ### objectives diff --git a/docs/api/interfaces/IAgentRuntime.md b/docs/api/interfaces/IAgentRuntime.md index a7faddfe73..476f0e62b1 100644 --- a/docs/api/interfaces/IAgentRuntime.md +++ b/docs/api/interfaces/IAgentRuntime.md @@ -14,7 +14,7 @@ Properties [packages/core/src/types.ts:520](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L520) ---- +*** ### serverUrl @@ -24,7 +24,7 @@ Properties [packages/core/src/types.ts:521](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L521) ---- +*** ### databaseAdapter @@ -34,7 +34,7 @@ Properties [packages/core/src/types.ts:522](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L522) ---- +*** ### token @@ -44,7 +44,7 @@ Properties [packages/core/src/types.ts:523](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L523) ---- +*** ### modelProvider @@ -54,7 +54,7 @@ Properties [packages/core/src/types.ts:524](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L524) ---- +*** ### character @@ -64,7 +64,7 @@ Properties [packages/core/src/types.ts:525](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L525) ---- +*** ### providers @@ -74,7 +74,7 @@ Properties [packages/core/src/types.ts:526](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L526) ---- +*** ### actions @@ -84,7 +84,7 @@ Properties [packages/core/src/types.ts:527](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L527) ---- +*** ### evaluators @@ -94,7 +94,7 @@ Properties [packages/core/src/types.ts:528](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L528) ---- +*** ### messageManager @@ -104,7 +104,7 @@ Properties [packages/core/src/types.ts:530](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L530) ---- +*** ### descriptionManager @@ -114,7 +114,7 @@ Properties [packages/core/src/types.ts:531](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L531) ---- +*** ### loreManager @@ -124,7 +124,7 @@ Properties [packages/core/src/types.ts:532](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L532) ---- +*** ### services @@ -152,7 +152,7 @@ Properties [packages/core/src/types.ts:535](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L535) ---- +*** ### getMemoryManager() @@ -170,15 +170,11 @@ Properties [packages/core/src/types.ts:537](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L537) ---- +*** ### getService() -> **getService**\<`Service`\>(`service`): `Service` - -#### Type Parameters - -• **Service** +> **getService**(`service`): *typeof* [`Service`](../classes/Service.md) #### Parameters @@ -186,13 +182,13 @@ Properties #### Returns -`Service` +*typeof* [`Service`](../classes/Service.md) #### Defined in [packages/core/src/types.ts:539](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L539) ---- +*** ### registerService() @@ -210,7 +206,7 @@ Properties [packages/core/src/types.ts:541](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L541) ---- +*** ### getSetting() @@ -228,7 +224,7 @@ Properties [packages/core/src/types.ts:543](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L543) ---- +*** ### getConversationLength() @@ -244,7 +240,7 @@ Methods [packages/core/src/types.ts:546](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L546) ---- +*** ### processActions() @@ -268,7 +264,7 @@ Methods [packages/core/src/types.ts:547](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L547) ---- +*** ### evaluate() @@ -290,7 +286,7 @@ Methods [packages/core/src/types.ts:553](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L553) ---- +*** ### ensureParticipantExists() @@ -310,7 +306,7 @@ Methods [packages/core/src/types.ts:558](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L558) ---- +*** ### ensureUserExists() @@ -334,7 +330,7 @@ Methods [packages/core/src/types.ts:559](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L559) ---- +*** ### registerAction() @@ -352,7 +348,7 @@ Methods [packages/core/src/types.ts:565](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L565) ---- +*** ### ensureConnection() @@ -378,7 +374,7 @@ Methods [packages/core/src/types.ts:566](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L566) ---- +*** ### ensureParticipantInRoom() @@ -398,7 +394,7 @@ Methods [packages/core/src/types.ts:573](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L573) ---- +*** ### ensureRoomExists() @@ -416,7 +412,7 @@ Methods [packages/core/src/types.ts:574](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L574) ---- +*** ### composeState() @@ -436,7 +432,7 @@ Methods [packages/core/src/types.ts:575](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L575) ---- +*** ### updateRecentMessageState() diff --git a/docs/api/interfaces/IBrowserService.md b/docs/api/interfaces/IBrowserService.md index 909a110b51..7801113637 100644 --- a/docs/api/interfaces/IBrowserService.md +++ b/docs/api/interfaces/IBrowserService.md @@ -20,7 +20,7 @@ [packages/core/src/types.ts:629](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L629) ---- +*** ### closeBrowser() @@ -34,7 +34,7 @@ [packages/core/src/types.ts:630](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L630) ---- +*** ### getPageContent() diff --git a/docs/api/interfaces/IDatabaseAdapter.md b/docs/api/interfaces/IDatabaseAdapter.md index a02cf9408f..6517333911 100644 --- a/docs/api/interfaces/IDatabaseAdapter.md +++ b/docs/api/interfaces/IDatabaseAdapter.md @@ -30,7 +30,7 @@ [packages/core/src/types.ts:364](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L364) ---- +*** ### createAccount() @@ -48,7 +48,7 @@ [packages/core/src/types.ts:365](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L365) ---- +*** ### getMemories() @@ -80,7 +80,7 @@ [packages/core/src/types.ts:366](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L366) ---- +*** ### getMemoryById() @@ -98,7 +98,7 @@ [packages/core/src/types.ts:375](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L375) ---- +*** ### getMemoriesByRoomIds() @@ -120,7 +120,7 @@ [packages/core/src/types.ts:376](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L376) ---- +*** ### getCachedEmbeddings() @@ -130,17 +130,17 @@ • **params** -• **params.query_table_name**: `string` +• **params.query\_table\_name**: `string` -• **params.query_threshold**: `number` +• **params.query\_threshold**: `number` -• **params.query_input**: `string` +• **params.query\_input**: `string` -• **params.query_field_name**: `string` +• **params.query\_field\_name**: `string` -• **params.query_field_sub_name**: `string` +• **params.query\_field\_sub\_name**: `string` -• **params.query_match_count**: `number` +• **params.query\_match\_count**: `number` #### Returns @@ -150,7 +150,7 @@ [packages/core/src/types.ts:380](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L380) ---- +*** ### log() @@ -176,7 +176,7 @@ [packages/core/src/types.ts:388](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L388) ---- +*** ### getActorDetails() @@ -196,7 +196,7 @@ [packages/core/src/types.ts:394](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L394) ---- +*** ### searchMemories() @@ -212,9 +212,9 @@ • **params.embedding**: `number`[] -• **params.match_threshold**: `number` +• **params.match\_threshold**: `number` -• **params.match_count**: `number` +• **params.match\_count**: `number` • **params.unique**: `boolean` @@ -226,7 +226,7 @@ [packages/core/src/types.ts:395](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L395) ---- +*** ### updateGoalStatus() @@ -248,7 +248,7 @@ [packages/core/src/types.ts:403](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L403) ---- +*** ### searchMemoriesByEmbedding() @@ -260,7 +260,7 @@ • **params** -• **params.match_threshold?**: `number` +• **params.match\_threshold?**: `number` • **params.count?**: `number` @@ -280,7 +280,7 @@ [packages/core/src/types.ts:407](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L407) ---- +*** ### createMemory() @@ -302,7 +302,7 @@ [packages/core/src/types.ts:418](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L418) ---- +*** ### removeMemory() @@ -322,7 +322,7 @@ [packages/core/src/types.ts:423](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L423) ---- +*** ### removeAllMemories() @@ -342,7 +342,7 @@ [packages/core/src/types.ts:424](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L424) ---- +*** ### countMemories() @@ -364,7 +364,7 @@ [packages/core/src/types.ts:425](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L425) ---- +*** ### getGoals() @@ -390,7 +390,7 @@ [packages/core/src/types.ts:430](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L430) ---- +*** ### updateGoal() @@ -408,7 +408,7 @@ [packages/core/src/types.ts:436](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L436) ---- +*** ### createGoal() @@ -426,7 +426,7 @@ [packages/core/src/types.ts:437](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L437) ---- +*** ### removeGoal() @@ -444,7 +444,7 @@ [packages/core/src/types.ts:438](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L438) ---- +*** ### removeAllGoals() @@ -462,7 +462,7 @@ [packages/core/src/types.ts:439](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L439) ---- +*** ### getRoom() @@ -480,7 +480,7 @@ [packages/core/src/types.ts:440](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L440) ---- +*** ### createRoom() @@ -498,7 +498,7 @@ [packages/core/src/types.ts:441](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L441) ---- +*** ### removeRoom() @@ -516,7 +516,7 @@ [packages/core/src/types.ts:442](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L442) ---- +*** ### getRoomsForParticipant() @@ -534,7 +534,7 @@ [packages/core/src/types.ts:443](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L443) ---- +*** ### getRoomsForParticipants() @@ -552,7 +552,7 @@ [packages/core/src/types.ts:444](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L444) ---- +*** ### addParticipant() @@ -572,7 +572,7 @@ [packages/core/src/types.ts:445](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L445) ---- +*** ### removeParticipant() @@ -592,7 +592,7 @@ [packages/core/src/types.ts:446](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L446) ---- +*** ### getParticipantsForAccount() @@ -610,7 +610,7 @@ [packages/core/src/types.ts:447](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L447) ---- +*** ### getParticipantsForRoom() @@ -628,7 +628,7 @@ [packages/core/src/types.ts:448](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L448) ---- +*** ### getParticipantUserState() @@ -648,7 +648,7 @@ [packages/core/src/types.ts:449](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L449) ---- +*** ### setParticipantUserState() @@ -670,7 +670,7 @@ [packages/core/src/types.ts:453](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L453) ---- +*** ### createRelationship() @@ -692,7 +692,7 @@ [packages/core/src/types.ts:458](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L458) ---- +*** ### getRelationship() @@ -714,7 +714,7 @@ [packages/core/src/types.ts:459](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L459) ---- +*** ### getRelationships() diff --git a/docs/api/interfaces/IImageDescriptionService.md b/docs/api/interfaces/IImageDescriptionService.md index 29c48b18ed..56cda70ada 100644 --- a/docs/api/interfaces/IImageDescriptionService.md +++ b/docs/api/interfaces/IImageDescriptionService.md @@ -20,7 +20,7 @@ [packages/core/src/types.ts:583](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L583) ---- +*** ### initialize() @@ -40,7 +40,7 @@ [packages/core/src/types.ts:584](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L584) ---- +*** ### describeImage() diff --git a/docs/api/interfaces/IMemoryManager.md b/docs/api/interfaces/IMemoryManager.md index 62bfa4ecc3..56c76a7d98 100644 --- a/docs/api/interfaces/IMemoryManager.md +++ b/docs/api/interfaces/IMemoryManager.md @@ -12,7 +12,7 @@ [packages/core/src/types.ts:467](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L467) ---- +*** ### tableName @@ -22,7 +22,7 @@ [packages/core/src/types.ts:468](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L468) ---- +*** ### constructor @@ -50,7 +50,7 @@ [packages/core/src/types.ts:472](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L472) ---- +*** ### getMemories() @@ -80,7 +80,7 @@ [packages/core/src/types.ts:473](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L473) ---- +*** ### getCachedEmbeddings() @@ -98,7 +98,7 @@ [packages/core/src/types.ts:481](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L481) ---- +*** ### getMemoryById() @@ -116,7 +116,7 @@ [packages/core/src/types.ts:484](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L484) ---- +*** ### getMemoriesByRoomIds() @@ -138,7 +138,7 @@ [packages/core/src/types.ts:485](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L485) ---- +*** ### searchMemoriesByEmbedding() @@ -150,7 +150,7 @@ • **opts** -• **opts.match_threshold?**: `number` +• **opts.match\_threshold?**: `number` • **opts.count?**: `number` @@ -168,7 +168,7 @@ [packages/core/src/types.ts:489](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L489) ---- +*** ### createMemory() @@ -188,7 +188,7 @@ [packages/core/src/types.ts:499](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L499) ---- +*** ### removeMemory() @@ -206,7 +206,7 @@ [packages/core/src/types.ts:500](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L500) ---- +*** ### removeAllMemories() @@ -224,7 +224,7 @@ [packages/core/src/types.ts:501](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L501) ---- +*** ### countMemories() diff --git a/docs/api/interfaces/ITextGenerationService.md b/docs/api/interfaces/ITextGenerationService.md index 49afb06638..bdb94b4447 100644 --- a/docs/api/interfaces/ITextGenerationService.md +++ b/docs/api/interfaces/ITextGenerationService.md @@ -20,7 +20,7 @@ [packages/core/src/types.ts:607](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L607) ---- +*** ### initializeModel() @@ -34,7 +34,7 @@ [packages/core/src/types.ts:608](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L608) ---- +*** ### queueMessageCompletion() @@ -48,11 +48,11 @@ • **stop**: `string`[] -• **frequency_penalty**: `number` +• **frequency\_penalty**: `number` -• **presence_penalty**: `number` +• **presence\_penalty**: `number` -• **max_tokens**: `number` +• **max\_tokens**: `number` #### Returns @@ -62,7 +62,7 @@ [packages/core/src/types.ts:609](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L609) ---- +*** ### queueTextCompletion() @@ -76,11 +76,11 @@ • **stop**: `string`[] -• **frequency_penalty**: `number` +• **frequency\_penalty**: `number` -• **presence_penalty**: `number` +• **presence\_penalty**: `number` -• **max_tokens**: `number` +• **max\_tokens**: `number` #### Returns @@ -90,7 +90,7 @@ [packages/core/src/types.ts:617](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L617) ---- +*** ### getEmbeddingResponse() diff --git a/docs/api/interfaces/ITranscriptionService.md b/docs/api/interfaces/ITranscriptionService.md index 5993b0eb51..27b765ea59 100644 --- a/docs/api/interfaces/ITranscriptionService.md +++ b/docs/api/interfaces/ITranscriptionService.md @@ -24,7 +24,7 @@ [packages/core/src/types.ts:591](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L591) ---- +*** ### transcribeAttachmentLocally() @@ -42,7 +42,7 @@ [packages/core/src/types.ts:592](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L592) ---- +*** ### transcribe() @@ -60,7 +60,7 @@ [packages/core/src/types.ts:595](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L595) ---- +*** ### transcribeLocally() diff --git a/docs/api/interfaces/IVideoService.md b/docs/api/interfaces/IVideoService.md index f8a98f005a..8b5c988628 100644 --- a/docs/api/interfaces/IVideoService.md +++ b/docs/api/interfaces/IVideoService.md @@ -24,7 +24,7 @@ [packages/core/src/types.ts:600](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L600) ---- +*** ### processVideo() @@ -42,7 +42,7 @@ [packages/core/src/types.ts:601](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L601) ---- +*** ### fetchVideoInfo() @@ -60,7 +60,7 @@ [packages/core/src/types.ts:602](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L602) ---- +*** ### downloadVideo() diff --git a/docs/api/interfaces/Memory.md b/docs/api/interfaces/Memory.md index 842dc838fd..f9d743a4a5 100644 --- a/docs/api/interfaces/Memory.md +++ b/docs/api/interfaces/Memory.md @@ -14,7 +14,7 @@ Represents a memory record, which could be a message or any other piece of infor [packages/core/src/types.ts:167](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L167) ---- +*** ### userId @@ -24,7 +24,7 @@ Represents a memory record, which could be a message or any other piece of infor [packages/core/src/types.ts:168](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L168) ---- +*** ### agentId @@ -34,7 +34,7 @@ Represents a memory record, which could be a message or any other piece of infor [packages/core/src/types.ts:169](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L169) ---- +*** ### createdAt? @@ -44,7 +44,7 @@ Represents a memory record, which could be a message or any other piece of infor [packages/core/src/types.ts:170](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L170) ---- +*** ### content @@ -54,7 +54,7 @@ Represents a memory record, which could be a message or any other piece of infor [packages/core/src/types.ts:171](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L171) ---- +*** ### embedding? @@ -64,7 +64,7 @@ Represents a memory record, which could be a message or any other piece of infor [packages/core/src/types.ts:172](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L172) ---- +*** ### roomId @@ -74,7 +74,7 @@ Represents a memory record, which could be a message or any other piece of infor [packages/core/src/types.ts:173](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L173) ---- +*** ### unique? diff --git a/docs/api/interfaces/MessageExample.md b/docs/api/interfaces/MessageExample.md index 674de4854e..8055efc55e 100644 --- a/docs/api/interfaces/MessageExample.md +++ b/docs/api/interfaces/MessageExample.md @@ -14,7 +14,7 @@ Represents an example of a message, typically used for demonstrating or testing [packages/core/src/types.ts:181](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L181) ---- +*** ### content diff --git a/docs/api/interfaces/Objective.md b/docs/api/interfaces/Objective.md index 4a9c5854f7..554e13b00a 100644 --- a/docs/api/interfaces/Objective.md +++ b/docs/api/interfaces/Objective.md @@ -14,7 +14,7 @@ Represents an objective within a goal, detailing what needs to be achieved and w [packages/core/src/types.ts:51](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L51) ---- +*** ### description @@ -24,7 +24,7 @@ Represents an objective within a goal, detailing what needs to be achieved and w [packages/core/src/types.ts:52](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L52) ---- +*** ### completed diff --git a/docs/api/interfaces/Participant.md b/docs/api/interfaces/Participant.md index 997ccb7567..a984de6aa4 100644 --- a/docs/api/interfaces/Participant.md +++ b/docs/api/interfaces/Participant.md @@ -14,7 +14,7 @@ Represents a participant in a room, including their ID and account details. [packages/core/src/types.ts:285](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L285) ---- +*** ### account diff --git a/docs/api/interfaces/Relationship.md b/docs/api/interfaces/Relationship.md index 4a2ab5d47f..b1baf43954 100644 --- a/docs/api/interfaces/Relationship.md +++ b/docs/api/interfaces/Relationship.md @@ -14,7 +14,7 @@ Represents a relationship between two users, including their IDs, the status of [packages/core/src/types.ts:260](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L260) ---- +*** ### userA @@ -24,7 +24,7 @@ Represents a relationship between two users, including their IDs, the status of [packages/core/src/types.ts:261](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L261) ---- +*** ### userB @@ -34,7 +34,7 @@ Represents a relationship between two users, including their IDs, the status of [packages/core/src/types.ts:262](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L262) ---- +*** ### userId @@ -44,7 +44,7 @@ Represents a relationship between two users, including their IDs, the status of [packages/core/src/types.ts:263](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L263) ---- +*** ### roomId @@ -54,7 +54,7 @@ Represents a relationship between two users, including their IDs, the status of [packages/core/src/types.ts:264](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L264) ---- +*** ### status @@ -64,7 +64,7 @@ Represents a relationship between two users, including their IDs, the status of [packages/core/src/types.ts:265](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L265) ---- +*** ### createdAt? diff --git a/docs/api/interfaces/Room.md b/docs/api/interfaces/Room.md index f4053ed55e..7ee81f19fb 100644 --- a/docs/api/interfaces/Room.md +++ b/docs/api/interfaces/Room.md @@ -14,7 +14,7 @@ Represents a room or conversation context, including its ID and a list of partic [packages/core/src/types.ts:293](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L293) ---- +*** ### participants diff --git a/docs/api/interfaces/State.md b/docs/api/interfaces/State.md index d36151ad22..d35b3f5159 100644 --- a/docs/api/interfaces/State.md +++ b/docs/api/interfaces/State.md @@ -6,7 +6,7 @@ Represents the state of the conversation or context in which the agent is operat ## Indexable -\[`key`: `string`\]: `unknown` + \[`key`: `string`\]: `unknown` ## Properties @@ -18,7 +18,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:137](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L137) ---- +*** ### agentId? @@ -28,7 +28,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:138](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L138) ---- +*** ### bio @@ -38,7 +38,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:139](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L139) ---- +*** ### lore @@ -48,7 +48,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:140](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L140) ---- +*** ### messageDirections @@ -58,7 +58,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:141](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L141) ---- +*** ### postDirections @@ -68,7 +68,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:142](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L142) ---- +*** ### roomId @@ -78,7 +78,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:143](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L143) ---- +*** ### agentName? @@ -88,7 +88,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:144](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L144) ---- +*** ### senderName? @@ -98,7 +98,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:145](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L145) ---- +*** ### actors @@ -108,7 +108,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:146](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L146) ---- +*** ### actorsData? @@ -118,7 +118,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:147](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L147) ---- +*** ### goals? @@ -128,7 +128,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:148](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L148) ---- +*** ### goalsData? @@ -138,7 +138,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:149](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L149) ---- +*** ### recentMessages @@ -148,7 +148,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:150](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L150) ---- +*** ### recentMessagesData @@ -158,7 +158,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:151](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L151) ---- +*** ### actionNames? @@ -168,7 +168,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:152](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L152) ---- +*** ### actions? @@ -178,7 +178,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:153](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L153) ---- +*** ### actionsData? @@ -188,7 +188,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:154](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L154) ---- +*** ### actionExamples? @@ -198,7 +198,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:155](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L155) ---- +*** ### providers? @@ -208,7 +208,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:156](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L156) ---- +*** ### responseData? @@ -218,7 +218,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:157](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L157) ---- +*** ### recentInteractionsData? @@ -228,7 +228,7 @@ Represents the state of the conversation or context in which the agent is operat [packages/core/src/types.ts:158](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L158) ---- +*** ### recentInteractions? diff --git a/docs/api/type-aliases/Character.md b/docs/api/type-aliases/Character.md index 333df81694..62f9dbfbd7 100644 --- a/docs/api/type-aliases/Character.md +++ b/docs/api/type-aliases/Character.md @@ -32,7 +32,7 @@ #### Index Signature -\[`key`: `string`\]: `string` + \[`key`: `string`\]: `string` ### bio @@ -84,7 +84,7 @@ #### Index Signature -\[`key`: `string`\]: `string` + \[`key`: `string`\]: `string` ### settings.voice? diff --git a/docs/api/type-aliases/Model.md b/docs/api/type-aliases/Model.md index 4d5a45b9d5..de42259011 100644 --- a/docs/api/type-aliases/Model.md +++ b/docs/api/type-aliases/Model.md @@ -22,17 +22,17 @@ > **maxOutputTokens**: `number` -### settings.frequency_penalty? +### settings.frequency\_penalty? -> `optional` **frequency_penalty**: `number` +> `optional` **frequency\_penalty**: `number` -### settings.presence_penalty? +### settings.presence\_penalty? -> `optional` **presence_penalty**: `number` +> `optional` **presence\_penalty**: `number` -### settings.repetition_penalty? +### settings.repetition\_penalty? -> `optional` **repetition_penalty**: `number` +> `optional` **repetition\_penalty**: `number` ### settings.stop diff --git a/docs/api/type-aliases/Models.md b/docs/api/type-aliases/Models.md index eaf5516422..ca4dce75e4 100644 --- a/docs/api/type-aliases/Models.md +++ b/docs/api/type-aliases/Models.md @@ -22,21 +22,21 @@ > **groq**: [`Model`](Model.md) -### llama_cloud +### llama\_cloud -> **llama_cloud**: [`Model`](Model.md) +> **llama\_cloud**: [`Model`](Model.md) -### llama_local +### llama\_local -> **llama_local**: [`Model`](Model.md) +> **llama\_local**: [`Model`](Model.md) ### google > **google**: [`Model`](Model.md) -### claude_vertex +### claude\_vertex -> **claude_vertex**: [`Model`](Model.md) +> **claude\_vertex**: [`Model`](Model.md) ### redpill diff --git a/docs/api/typedoc-sidebar.cjs b/docs/api/typedoc-sidebar.cjs index e7789d1118..0e9b1029c7 100644 --- a/docs/api/typedoc-sidebar.cjs +++ b/docs/api/typedoc-sidebar.cjs @@ -1,299 +1,4 @@ // @ts-check /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const typedocSidebar = { - items: [ - { - type: "category", - label: "Enumerations", - items: [ - { type: "doc", id: "enumerations/GoalStatus", label: "GoalStatus" }, - { type: "doc", id: "enumerations/ModelClass", label: "ModelClass" }, - { - type: "doc", - id: "enumerations/ModelProviderName", - label: "ModelProviderName", - }, - { type: "doc", id: "enumerations/Clients", label: "Clients" }, - { type: "doc", id: "enumerations/ServiceType", label: "ServiceType" }, - ], - }, - { - type: "category", - label: "Classes", - items: [ - { - type: "doc", - id: "classes/DatabaseAdapter", - label: "DatabaseAdapter", - }, - { type: "doc", id: "classes/MemoryManager", label: "MemoryManager" }, - { type: "doc", id: "classes/AgentRuntime", label: "AgentRuntime" }, - { type: "doc", id: "classes/Service", label: "Service" }, - ], - }, - { - type: "category", - label: "Interfaces", - items: [ - { type: "doc", id: "interfaces/Content", label: "Content" }, - { type: "doc", id: "interfaces/ActionExample", label: "ActionExample" }, - { - type: "doc", - id: "interfaces/ConversationExample", - label: "ConversationExample", - }, - { type: "doc", id: "interfaces/Actor", label: "Actor" }, - { type: "doc", id: "interfaces/Objective", label: "Objective" }, - { type: "doc", id: "interfaces/Goal", label: "Goal" }, - { type: "doc", id: "interfaces/State", label: "State" }, - { type: "doc", id: "interfaces/Memory", label: "Memory" }, - { - type: "doc", - id: "interfaces/MessageExample", - label: "MessageExample", - }, - { type: "doc", id: "interfaces/Action", label: "Action" }, - { - type: "doc", - id: "interfaces/EvaluationExample", - label: "EvaluationExample", - }, - { type: "doc", id: "interfaces/Evaluator", label: "Evaluator" }, - { type: "doc", id: "interfaces/Provider", label: "Provider" }, - { type: "doc", id: "interfaces/Relationship", label: "Relationship" }, - { type: "doc", id: "interfaces/Account", label: "Account" }, - { type: "doc", id: "interfaces/Participant", label: "Participant" }, - { type: "doc", id: "interfaces/Room", label: "Room" }, - { - type: "doc", - id: "interfaces/IDatabaseAdapter", - label: "IDatabaseAdapter", - }, - { - type: "doc", - id: "interfaces/IMemoryManager", - label: "IMemoryManager", - }, - { type: "doc", id: "interfaces/IAgentRuntime", label: "IAgentRuntime" }, - { - type: "doc", - id: "interfaces/IImageDescriptionService", - label: "IImageDescriptionService", - }, - { - type: "doc", - id: "interfaces/ITranscriptionService", - label: "ITranscriptionService", - }, - { type: "doc", id: "interfaces/IVideoService", label: "IVideoService" }, - { - type: "doc", - id: "interfaces/ITextGenerationService", - label: "ITextGenerationService", - }, - { - type: "doc", - id: "interfaces/IBrowserService", - label: "IBrowserService", - }, - { - type: "doc", - id: "interfaces/ISpeechService", - label: "ISpeechService", - }, - { type: "doc", id: "interfaces/IPdfService", label: "IPdfService" }, - ], - }, - { - type: "category", - label: "Type Aliases", - items: [ - { type: "doc", id: "type-aliases/UUID", label: "UUID" }, - { type: "doc", id: "type-aliases/Model", label: "Model" }, - { type: "doc", id: "type-aliases/Models", label: "Models" }, - { type: "doc", id: "type-aliases/Handler", label: "Handler" }, - { - type: "doc", - id: "type-aliases/HandlerCallback", - label: "HandlerCallback", - }, - { type: "doc", id: "type-aliases/Validator", label: "Validator" }, - { type: "doc", id: "type-aliases/Media", label: "Media" }, - { type: "doc", id: "type-aliases/Client", label: "Client" }, - { type: "doc", id: "type-aliases/Plugin", label: "Plugin" }, - { type: "doc", id: "type-aliases/Character", label: "Character" }, - ], - }, - { - type: "category", - label: "Variables", - items: [ - { - type: "doc", - id: "variables/defaultCharacter", - label: "defaultCharacter", - }, - { - type: "doc", - id: "variables/evaluationTemplate", - label: "evaluationTemplate", - }, - { type: "doc", id: "variables/elizaLogger", label: "elizaLogger" }, - { - type: "doc", - id: "variables/embeddingDimension", - label: "embeddingDimension", - }, - { - type: "doc", - id: "variables/embeddingZeroVector", - label: "embeddingZeroVector", - }, - { type: "doc", id: "variables/settings", label: "settings" }, - ], - }, - { - type: "category", - label: "Functions", - items: [ - { - type: "doc", - id: "functions/composeActionExamples", - label: "composeActionExamples", - }, - { - type: "doc", - id: "functions/formatActionNames", - label: "formatActionNames", - }, - { type: "doc", id: "functions/formatActions", label: "formatActions" }, - { - type: "doc", - id: "functions/composeContext", - label: "composeContext", - }, - { type: "doc", id: "functions/addHeader", label: "addHeader" }, - { type: "doc", id: "functions/embed", label: "embed" }, - { - type: "doc", - id: "functions/retrieveCachedEmbedding", - label: "retrieveCachedEmbedding", - }, - { - type: "doc", - id: "functions/formatEvaluatorNames", - label: "formatEvaluatorNames", - }, - { - type: "doc", - id: "functions/formatEvaluators", - label: "formatEvaluators", - }, - { - type: "doc", - id: "functions/formatEvaluatorExamples", - label: "formatEvaluatorExamples", - }, - { - type: "doc", - id: "functions/formatEvaluatorExampleDescriptions", - label: "formatEvaluatorExampleDescriptions", - }, - { type: "doc", id: "functions/generateText", label: "generateText" }, - { type: "doc", id: "functions/trimTokens", label: "trimTokens" }, - { - type: "doc", - id: "functions/generateShouldRespond", - label: "generateShouldRespond", - }, - { type: "doc", id: "functions/splitChunks", label: "splitChunks" }, - { - type: "doc", - id: "functions/generateTrueOrFalse", - label: "generateTrueOrFalse", - }, - { - type: "doc", - id: "functions/generateTextArray", - label: "generateTextArray", - }, - { - type: "doc", - id: "functions/generateObject", - label: "generateObject", - }, - { - type: "doc", - id: "functions/generateObjectArray", - label: "generateObjectArray", - }, - { - type: "doc", - id: "functions/generateMessageResponse", - label: "generateMessageResponse", - }, - { type: "doc", id: "functions/generateImage", label: "generateImage" }, - { - type: "doc", - id: "functions/generateCaption", - label: "generateCaption", - }, - { type: "doc", id: "functions/getGoals", label: "getGoals" }, - { - type: "doc", - id: "functions/formatGoalsAsString", - label: "formatGoalsAsString", - }, - { type: "doc", id: "functions/updateGoal", label: "updateGoal" }, - { type: "doc", id: "functions/createGoal", label: "createGoal" }, - { - type: "doc", - id: "functions/getActorDetails", - label: "getActorDetails", - }, - { type: "doc", id: "functions/formatActors", label: "formatActors" }, - { - type: "doc", - id: "functions/formatMessages", - label: "formatMessages", - }, - { - type: "doc", - id: "functions/formatTimestamp", - label: "formatTimestamp", - }, - { type: "doc", id: "functions/getModel", label: "getModel" }, - { type: "doc", id: "functions/getEndpoint", label: "getEndpoint" }, - { type: "doc", id: "functions/formatPosts", label: "formatPosts" }, - { type: "doc", id: "functions/getProviders", label: "getProviders" }, - { - type: "doc", - id: "functions/createRelationship", - label: "createRelationship", - }, - { - type: "doc", - id: "functions/getRelationship", - label: "getRelationship", - }, - { - type: "doc", - id: "functions/getRelationships", - label: "getRelationships", - }, - { - type: "doc", - id: "functions/formatRelationships", - label: "formatRelationships", - }, - { - type: "doc", - id: "functions/findNearestEnvFile", - label: "findNearestEnvFile", - }, - { type: "doc", id: "functions/loadEnvConfig", label: "loadEnvConfig" }, - ], - }, - ], -}; -module.exports = typedocSidebar.items; +const typedocSidebar = { items: [{"type":"category","label":"Enumerations","items":[{"type":"doc","id":"enumerations/GoalStatus","label":"GoalStatus"},{"type":"doc","id":"enumerations/ModelClass","label":"ModelClass"},{"type":"doc","id":"enumerations/ModelProviderName","label":"ModelProviderName"},{"type":"doc","id":"enumerations/Clients","label":"Clients"},{"type":"doc","id":"enumerations/ServiceType","label":"ServiceType"}]},{"type":"category","label":"Classes","items":[{"type":"doc","id":"classes/DatabaseAdapter","label":"DatabaseAdapter"},{"type":"doc","id":"classes/MemoryManager","label":"MemoryManager"},{"type":"doc","id":"classes/AgentRuntime","label":"AgentRuntime"},{"type":"doc","id":"classes/Service","label":"Service"}]},{"type":"category","label":"Interfaces","items":[{"type":"doc","id":"interfaces/Content","label":"Content"},{"type":"doc","id":"interfaces/ActionExample","label":"ActionExample"},{"type":"doc","id":"interfaces/ConversationExample","label":"ConversationExample"},{"type":"doc","id":"interfaces/Actor","label":"Actor"},{"type":"doc","id":"interfaces/Objective","label":"Objective"},{"type":"doc","id":"interfaces/Goal","label":"Goal"},{"type":"doc","id":"interfaces/State","label":"State"},{"type":"doc","id":"interfaces/Memory","label":"Memory"},{"type":"doc","id":"interfaces/MessageExample","label":"MessageExample"},{"type":"doc","id":"interfaces/Action","label":"Action"},{"type":"doc","id":"interfaces/EvaluationExample","label":"EvaluationExample"},{"type":"doc","id":"interfaces/Evaluator","label":"Evaluator"},{"type":"doc","id":"interfaces/Provider","label":"Provider"},{"type":"doc","id":"interfaces/Relationship","label":"Relationship"},{"type":"doc","id":"interfaces/Account","label":"Account"},{"type":"doc","id":"interfaces/Participant","label":"Participant"},{"type":"doc","id":"interfaces/Room","label":"Room"},{"type":"doc","id":"interfaces/IDatabaseAdapter","label":"IDatabaseAdapter"},{"type":"doc","id":"interfaces/IMemoryManager","label":"IMemoryManager"},{"type":"doc","id":"interfaces/IAgentRuntime","label":"IAgentRuntime"},{"type":"doc","id":"interfaces/IImageDescriptionService","label":"IImageDescriptionService"},{"type":"doc","id":"interfaces/ITranscriptionService","label":"ITranscriptionService"},{"type":"doc","id":"interfaces/IVideoService","label":"IVideoService"},{"type":"doc","id":"interfaces/ITextGenerationService","label":"ITextGenerationService"},{"type":"doc","id":"interfaces/IBrowserService","label":"IBrowserService"},{"type":"doc","id":"interfaces/ISpeechService","label":"ISpeechService"},{"type":"doc","id":"interfaces/IPdfService","label":"IPdfService"}]},{"type":"category","label":"Type Aliases","items":[{"type":"doc","id":"type-aliases/UUID","label":"UUID"},{"type":"doc","id":"type-aliases/Model","label":"Model"},{"type":"doc","id":"type-aliases/Models","label":"Models"},{"type":"doc","id":"type-aliases/Handler","label":"Handler"},{"type":"doc","id":"type-aliases/HandlerCallback","label":"HandlerCallback"},{"type":"doc","id":"type-aliases/Validator","label":"Validator"},{"type":"doc","id":"type-aliases/Media","label":"Media"},{"type":"doc","id":"type-aliases/Client","label":"Client"},{"type":"doc","id":"type-aliases/Plugin","label":"Plugin"},{"type":"doc","id":"type-aliases/Character","label":"Character"}]},{"type":"category","label":"Variables","items":[{"type":"doc","id":"variables/defaultCharacter","label":"defaultCharacter"},{"type":"doc","id":"variables/evaluationTemplate","label":"evaluationTemplate"},{"type":"doc","id":"variables/elizaLogger","label":"elizaLogger"},{"type":"doc","id":"variables/embeddingDimension","label":"embeddingDimension"},{"type":"doc","id":"variables/embeddingZeroVector","label":"embeddingZeroVector"},{"type":"doc","id":"variables/settings","label":"settings"}]},{"type":"category","label":"Functions","items":[{"type":"doc","id":"functions/composeActionExamples","label":"composeActionExamples"},{"type":"doc","id":"functions/formatActionNames","label":"formatActionNames"},{"type":"doc","id":"functions/formatActions","label":"formatActions"},{"type":"doc","id":"functions/composeContext","label":"composeContext"},{"type":"doc","id":"functions/addHeader","label":"addHeader"},{"type":"doc","id":"functions/embed","label":"embed"},{"type":"doc","id":"functions/retrieveCachedEmbedding","label":"retrieveCachedEmbedding"},{"type":"doc","id":"functions/formatEvaluatorNames","label":"formatEvaluatorNames"},{"type":"doc","id":"functions/formatEvaluators","label":"formatEvaluators"},{"type":"doc","id":"functions/formatEvaluatorExamples","label":"formatEvaluatorExamples"},{"type":"doc","id":"functions/formatEvaluatorExampleDescriptions","label":"formatEvaluatorExampleDescriptions"},{"type":"doc","id":"functions/generateText","label":"generateText"},{"type":"doc","id":"functions/trimTokens","label":"trimTokens"},{"type":"doc","id":"functions/generateShouldRespond","label":"generateShouldRespond"},{"type":"doc","id":"functions/splitChunks","label":"splitChunks"},{"type":"doc","id":"functions/generateTrueOrFalse","label":"generateTrueOrFalse"},{"type":"doc","id":"functions/generateTextArray","label":"generateTextArray"},{"type":"doc","id":"functions/generateObject","label":"generateObject"},{"type":"doc","id":"functions/generateObjectArray","label":"generateObjectArray"},{"type":"doc","id":"functions/generateMessageResponse","label":"generateMessageResponse"},{"type":"doc","id":"functions/generateImage","label":"generateImage"},{"type":"doc","id":"functions/generateCaption","label":"generateCaption"},{"type":"doc","id":"functions/getGoals","label":"getGoals"},{"type":"doc","id":"functions/formatGoalsAsString","label":"formatGoalsAsString"},{"type":"doc","id":"functions/updateGoal","label":"updateGoal"},{"type":"doc","id":"functions/createGoal","label":"createGoal"},{"type":"doc","id":"functions/getActorDetails","label":"getActorDetails"},{"type":"doc","id":"functions/formatActors","label":"formatActors"},{"type":"doc","id":"functions/formatMessages","label":"formatMessages"},{"type":"doc","id":"functions/formatTimestamp","label":"formatTimestamp"},{"type":"doc","id":"functions/getModel","label":"getModel"},{"type":"doc","id":"functions/getEndpoint","label":"getEndpoint"},{"type":"doc","id":"functions/formatPosts","label":"formatPosts"},{"type":"doc","id":"functions/getProviders","label":"getProviders"},{"type":"doc","id":"functions/createRelationship","label":"createRelationship"},{"type":"doc","id":"functions/getRelationship","label":"getRelationship"},{"type":"doc","id":"functions/getRelationships","label":"getRelationships"},{"type":"doc","id":"functions/formatRelationships","label":"formatRelationships"},{"type":"doc","id":"functions/findNearestEnvFile","label":"findNearestEnvFile"},{"type":"doc","id":"functions/loadEnvConfig","label":"loadEnvConfig"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/docs/api/variables/elizaLogger.md b/docs/api/variables/elizaLogger.md index 91ee6eaa63..c33ed0865c 100644 --- a/docs/api/variables/elizaLogger.md +++ b/docs/api/variables/elizaLogger.md @@ -6,4 +6,4 @@ ## Defined in -[packages/core/src/logger.ts:284](https://github.com/ai16z/eliza/blob/main/packages/core/src/logger.ts#L284) +[packages/core/src/logger.ts:282](https://github.com/ai16z/eliza/blob/main/packages/core/src/logger.ts#L282) diff --git a/docs/docs/advanced/autonomous-trading.md b/docs/docs/advanced/autonomous-trading.md index 6c6328573d..68008c484a 100644 --- a/docs/docs/advanced/autonomous-trading.md +++ b/docs/docs/advanced/autonomous-trading.md @@ -1,285 +1,364 @@ --- -sidebar_position: 1 -title: Autonomous Trading +sidebar_position: 16 --- -# Autonomous Trading System +# 📈 Autonomous Trading ## Overview -Eliza's autonomous trading system provides a sophisticated framework for monitoring market conditions, analyzing tokens, and executing trades on Solana-based decentralized exchanges. The system combines real-time market data, technical analysis, and risk management to make informed trading decisions. +Eliza's autonomous trading system enables automated token trading on the Solana blockchain. The system integrates with Jupiter aggregator for efficient swaps, implements smart order routing, and includes risk management features. ## Core Components -### 1. Token Analysis Engine - -The system tracks multiple market indicators: +### Token Provider +Manages token information and market data: ```typescript -interface TokenPerformance { - priceChange24h: number; - volumeChange24h: number; - trade_24h_change: number; - liquidity: number; - liquidityChange24h: number; - holderChange24h: number; - rugPull: boolean; - isScam: boolean; - marketCapChange24h: number; - sustainedGrowth: boolean; - rapidDump: boolean; - suspiciousVolume: boolean; -} -``` - -### 2. Order Book Management - -```typescript -interface Order { - userId: string; - ticker: string; - contractAddress: string; - timestamp: string; - buyAmount: number; - price: number; +class TokenProvider { + constructor( + private tokenAddress: string, + private walletProvider: WalletProvider + ) { + this.cache = new NodeCache({ stdTTL: 300 }); // 5 minutes cache + } + + async fetchPrices(): Promise { + const { SOL, BTC, ETH } = TOKEN_ADDRESSES; + // Fetch current prices + return { + solana: { usd: "0" }, + bitcoin: { usd: "0" }, + ethereum: { usd: "0" } + }; + } + + async getProcessedTokenData(): Promise { + return { + security: await this.fetchTokenSecurity(), + tradeData: await this.fetchTokenTradeData(), + holderDistributionTrend: await this.analyzeHolderDistribution(), + highValueHolders: await this.filterHighValueHolders(), + recentTrades: await this.checkRecentTrades(), + dexScreenerData: await this.fetchDexScreenerData() + }; + } } ``` -### 3. Market Data Integration +### Swap Execution -The system integrates with multiple data sources: - -- BirdEye API for real-time market data -- DexScreener for liquidity analysis -- Helius for on-chain data - -## Trading Features - -### 1. Real-Time Market Analysis +Implementation of token swaps using Jupiter: ```typescript -const PROVIDER_CONFIG = { - BIRDEYE_API: "https://public-api.birdeye.so", - MAX_RETRIES: 3, - RETRY_DELAY: 2000, - TOKEN_SECURITY_ENDPOINT: "/defi/token_security?address=", - TOKEN_TRADE_DATA_ENDPOINT: "/defi/v3/token/trade-data/single?address=", -}; +async function swapToken( + connection: Connection, + walletPublicKey: PublicKey, + inputTokenCA: string, + outputTokenCA: string, + amount: number +): Promise { + // Get token decimals + const decimals = await getTokenDecimals(connection, inputTokenCA); + const adjustedAmount = amount * (10 ** decimals); + + // Fetch quote + const quoteResponse = await fetch( + `https://quote-api.jup.ag/v6/quote?inputMint=${inputTokenCA}` + + `&outputMint=${outputTokenCA}` + + `&amount=${adjustedAmount}` + + `&slippageBps=50` + ); + + // Execute swap + const swapResponse = await fetch("https://quote-api.jup.ag/v6/swap", { + method: "POST", + body: JSON.stringify({ + quoteResponse: await quoteResponse.json(), + userPublicKey: walletPublicKey.toString(), + wrapAndUnwrapSol: true + }) + }); + + return swapResponse.json(); +} ``` -Key metrics monitored: - -- Price movements -- Volume changes -- Liquidity levels -- Holder distribution -- Trading patterns - -### 2. Risk Assessment System +## Position Management -The system evaluates multiple risk factors: +### Order Book System ```typescript -async analyzeRisks(token: string) { - const risks = { - liquidityRisk: await checkLiquidity(), - holderConcentration: await analyzeHolderDistribution(), - priceVolatility: await calculateVolatility(), - marketManipulation: await detectManipulation() - }; - return risks; +interface Order { + userId: string; + ticker: string; + contractAddress: string; + timestamp: string; + buyAmount: number; + price: number; } -``` - -### 3. Trading Strategies -#### Market Analysis - -```typescript -async getProcessedTokenData(): Promise { - const security = await this.fetchTokenSecurity(); - const tradeData = await this.fetchTokenTradeData(); - const dexData = await this.fetchDexScreenerData(); - const holderDistributionTrend = await this.analyzeHolderDistribution(tradeData); - // ... additional analysis +class OrderBookProvider { + async addOrder(order: Order): Promise { + let orderBook = await this.readOrderBook(); + orderBook.push(order); + await this.writeOrderBook(orderBook); + } + + async calculateProfitLoss(userId: string): Promise { + const orders = await this.getUserOrders(userId); + return orders.reduce((total, order) => { + const currentPrice = this.getCurrentPrice(order.ticker); + const pl = (currentPrice - order.price) * order.buyAmount; + return total + pl; + }, 0); + } } ``` -#### Trade Execution +### Position Sizing ```typescript -interface TradePerformance { - token_address: string; - buy_price: number; - sell_price: number; - buy_timeStamp: string; - sell_timeStamp: string; - profit_percent: number; - market_cap_change: number; - liquidity_change: number; +async function calculatePositionSize( + tokenData: ProcessedTokenData, + riskLevel: "LOW" | "MEDIUM" | "HIGH" +): Promise { + const { liquidity, marketCap } = tokenData.dexScreenerData.pairs[0]; + + // Impact percentages based on liquidity + const impactPercentages = { + LOW: 0.01, // 1% of liquidity + MEDIUM: 0.05, // 5% of liquidity + HIGH: 0.1 // 10% of liquidity + }; + + return { + none: 0, + low: liquidity.usd * impactPercentages.LOW, + medium: liquidity.usd * impactPercentages.MEDIUM, + high: liquidity.usd * impactPercentages.HIGH + }; } ``` -## Configuration Options +## Risk Management -### 1. Trading Parameters +### Token Validation ```typescript -const tradingConfig = { - minLiquidity: 50000, // Minimum liquidity in USD - maxSlippage: 0.02, // Maximum allowed slippage - positionSize: 0.01, // Position size as percentage of portfolio - stopLoss: 0.05, // Stop loss percentage - takeProfit: 0.15, // Take profit percentage -}; +async function validateToken(token: TokenPerformance): Promise { + const security = await fetchTokenSecurity(token.tokenAddress); + + // Red flags check + if ( + security.rugPull || + security.isScam || + token.rapidDump || + token.suspiciousVolume || + token.liquidity.usd < 1000 || // Minimum $1000 liquidity + token.marketCap < 100000 // Minimum $100k market cap + ) { + return false; + } + + // Holder distribution check + const holderData = await fetchHolderList(token.tokenAddress); + const topHolderPercent = calculateTopHolderPercentage(holderData); + if (topHolderPercent > 0.5) { // >50% held by top holders + return false; + } + + return true; +} ``` -### 2. Risk Management Settings +### Trade Management ```typescript -const riskSettings = { - maxDrawdown: 0.2, // Maximum portfolio drawdown - maxPositionSize: 0.1, // Maximum single position size - minLiquidityRatio: 50, // Minimum liquidity to market cap ratio - maxHolderConcentration: 0.2, // Maximum single holder concentration -}; +interface TradeManager { + async executeTrade(params: { + inputToken: string, + outputToken: string, + amount: number, + slippage: number + }): Promise; + + async monitorPosition(params: { + tokenAddress: string, + entryPrice: number, + stopLoss: number, + takeProfit: number + }): Promise; + + async closePosition(params: { + tokenAddress: string, + amount: number + }): Promise; +} ``` -## Implementation Guide +## Market Analysis -### 1. Setting Up Market Monitoring +### Price Data Collection ```typescript -async monitorMarket(token: string) { - const provider = new TokenProvider(token); - const marketData = await provider.getProcessedTokenData(); - +async function collectMarketData( + tokenAddress: string +): Promise { return { - price: marketData.tradeData.price, - volume: marketData.tradeData.volume_24h, - liquidity: marketData.tradeData.liquidity, - holderMetrics: marketData.security + price: await fetchCurrentPrice(tokenAddress), + volume_24h: await fetch24HourVolume(tokenAddress), + price_change_24h: await fetch24HourPriceChange(tokenAddress), + liquidity: await fetchLiquidity(tokenAddress), + holder_data: await fetchHolderData(tokenAddress), + trade_history: await fetchTradeHistory(tokenAddress) }; } ``` -### 2. Implementing Trading Logic +### Technical Analysis ```typescript -async evaluateTradeOpportunity(token: string) { - const analysis = await this.getProcessedTokenData(); - - const signals = { - priceSignal: analysis.tradeData.price_change_24h > 0, - volumeSignal: analysis.tradeData.volume_24h_change_percent > 20, - liquiditySignal: analysis.tradeData.liquidity > MIN_LIQUIDITY, - holderSignal: analysis.holderDistributionTrend === "increasing" +function analyzeMarketConditions( + tradeData: TokenTradeData +): MarketAnalysis { + return { + trend: analyzePriceTrend(tradeData.price_history), + volume_profile: analyzeVolumeProfile(tradeData.volume_history), + liquidity_depth: analyzeLiquidityDepth(tradeData.liquidity), + holder_behavior: analyzeHolderBehavior(tradeData.holder_data) }; - - return signals.priceSignal && signals.volumeSignal && - signals.liquiditySignal && signals.holderSignal; } ``` -### 3. Risk Management Implementation +## Trade Execution -```typescript -async checkTradeRisks(token: string): Promise { - const security = await this.fetchTokenSecurity(); - const tradeData = await this.fetchTokenTradeData(); +### Swap Implementation - return { - isRugPull: security.ownerPercentage > 50, - isPumpAndDump: tradeData.price_change_24h > 100, - isLowLiquidity: tradeData.liquidity < MIN_LIQUIDITY, - isSuspiciousVolume: tradeData.suspiciousVolume - }; +```typescript +async function executeSwap( + runtime: IAgentRuntime, + input: { + tokenIn: string, + tokenOut: string, + amountIn: number, + slippage: number + } +): Promise { + // Prepare transaction + const { swapTransaction } = await getSwapTransaction(input); + + // Sign transaction + const keypair = getKeypairFromPrivateKey( + runtime.getSetting("WALLET_PRIVATE_KEY") + ); + transaction.sign([keypair]); + + // Execute swap + const signature = await connection.sendTransaction(transaction); + + // Confirm transaction + await connection.confirmTransaction({ + signature, + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight + }); + + return signature; } ``` -## Performance Monitoring - -### 1. Trade Tracking +### DAO Integration ```typescript -async trackTradePerformance(trade: TradePerformance): Promise { - const performance = { - entryPrice: trade.buy_price, - exitPrice: trade.sell_price, - profitLoss: trade.profit_percent, - holdingPeriod: calculateHoldingPeriod( - trade.buy_timeStamp, - trade.sell_timeStamp - ), - marketImpact: trade.market_cap_change - }; - - await this.logTradePerformance(performance); +async function executeSwapForDAO( + runtime: IAgentRuntime, + params: { + inputToken: string, + outputToken: string, + amount: number + } +): Promise { + const authority = getAuthorityKeypair(runtime); + const [statePDA, walletPDA] = await derivePDAs(authority); + + // Prepare instruction data + const instructionData = prepareSwapInstruction(params); + + // Execute swap through DAO + return invokeSwapDao( + connection, + authority, + statePDA, + walletPDA, + instructionData + ); } ``` -### 2. Portfolio Analytics +## Monitoring & Safety + +### Health Checks ```typescript -async analyzePortfolioPerformance(userId: string) { - const trades = await this.getTradeHistory(userId); +async function performHealthChecks(): Promise { return { - totalTrades: trades.length, - winRate: calculateWinRate(trades), - averageReturn: calculateAverageReturn(trades), - maxDrawdown: calculateMaxDrawdown(trades), - sharpeRatio: calculateSharpeRatio(trades) + connection: await checkConnectionStatus(), + wallet: await checkWalletBalance(), + orders: await checkOpenOrders(), + positions: await checkPositions() }; } ``` -## Best Practices - -1. **Risk Management** - - - Always implement stop-loss orders - - Diversify trading positions - - Monitor liquidity levels continuously - - Set maximum position sizes - -2. **Trade Execution** +### Safety Limits - - Use slippage protection - - Implement rate limiting - - Monitor gas costs - - Verify transaction success - -3. **Market Analysis** - - - Cross-reference multiple data sources - - Implement data validation - - Monitor market manipulation indicators - - Track historical patterns - -4. **System Maintenance** - - Regular performance reviews - - Strategy backtesting - - Risk parameter adjustments - - System health monitoring - -## Security Considerations +```typescript +const SAFETY_LIMITS = { + MAX_POSITION_SIZE: 0.1, // 10% of portfolio + MAX_SLIPPAGE: 0.05, // 5% slippage + MIN_LIQUIDITY: 1000, // $1000 minimum liquidity + MAX_PRICE_IMPACT: 0.03, // 3% price impact + STOP_LOSS: 0.15 // 15% stop loss +}; +``` -1. **Transaction Security** +## Error Handling - - Implement transaction signing - - Verify contract addresses - - Monitor for malicious tokens - - Implement rate limiting +### Transaction Errors -2. **Data Validation** - - Verify data sources - - Implement error handling - - Monitor for anomalies - - Cross-validate market data +```typescript +async function handleTransactionError( + error: Error, + transaction: Transaction +): Promise { + if (error.message.includes('insufficient funds')) { + await handleInsufficientFunds(); + } else if (error.message.includes('slippage tolerance exceeded')) { + await handleSlippageError(transaction); + } else { + await logTransactionError(error, transaction); + } +} +``` -## Additional Resources +### Recovery Procedures -- [Trust Engine Documentation](./trust-engine.md) -- [Infrastructure Setup](./infrastructure.md) +```typescript +async function recoverFromError( + error: Error, + context: TradingContext +): Promise { + // Stop all active trades + await stopActiveTrades(); + + // Close risky positions + await closeRiskyPositions(); + + // Reset system state + await resetTradingState(); + + // Notify administrators + await notifyAdministrators(error, context); +} +``` -Remember to thoroughly test all trading strategies in a sandbox environment before deploying to production. diff --git a/docs/docs/advanced/fine-tuning.md b/docs/docs/advanced/fine-tuning.md index bb11634f04..1065bf3ba9 100644 --- a/docs/docs/advanced/fine-tuning.md +++ b/docs/docs/advanced/fine-tuning.md @@ -1,211 +1,373 @@ --- -sidebar_position: 1 -title: Fine-tuning +sidebar_position: 13 --- -# Model Selection and Fine-tuning +# 🎯 Fine-tuning Guide ## Overview -Eliza provides a flexible model selection and configuration system that supports multiple AI providers including OpenAI, Anthropic, Google, and various LLaMA implementations. This guide explains how to configure and fine-tune models for optimal performance in your use case. +Eliza supports multiple AI model providers and offers extensive configuration options for fine-tuning model behavior, embedding generation, and performance optimization. -## Supported Models +## Model Providers -### Available Providers +Eliza supports multiple model providers through a flexible configuration system: -Eliza supports the following model providers: +```typescript +enum ModelProviderName { + OPENAI, + ANTHROPIC, + CLAUDE_VERTEX, + GROK, + GROQ, + LLAMACLOUD, + LLAMALOCAL, + GOOGLE, + REDPILL, + OPENROUTER +} +``` -- **OpenAI** +### Provider Configuration - - Small: gpt-4o-mini - - Medium: gpt-4o - - Large: gpt-4o - - Embeddings: text-embedding-3-small +Each provider has specific settings: -- **Anthropic** +```typescript +const models = { + [ModelProviderName.ANTHROPIC]: { + settings: { + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.3, + }, + endpoint: "https://api.anthropic.com/v1", + model: { + [ModelClass.SMALL]: "claude-3-5-haiku", + [ModelClass.MEDIUM]: "claude-3-5-sonnet-20241022", + [ModelClass.LARGE]: "claude-3-5-opus-20240229" + } + }, + // ... other providers +}; +``` - - Small: claude-3-haiku - - Medium: claude-3.5-sonnet - - Large: claude-3-opus +## Model Classes -- **Google (Gemini)** +Models are categorized into different classes based on their capabilities: - - Small: gemini-1.5-flash - - Medium: gemini-1.5-flash - - Large: gemini-1.5-pro - - Embeddings: text-embedding-004 +```typescript +enum ModelClass { + SMALL, // Fast, efficient for simple tasks + MEDIUM, // Balanced performance and capability + LARGE, // Most capable but slower/more expensive + EMBEDDING // Specialized for vector embeddings + IMAGE // Image generation capabilities +} +``` -- **LLaMA Cloud** +## Embedding System - - Small: meta-llama/Llama-3.2-3B-Instruct-Turbo - - Medium: meta-llama-3.1-8b-instruct - - Large: meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo - - Embeddings: togethercomputer/m2-bert-80M-32k-retrieval +### Configuration -- **LLaMA Local** - - Various Hermes-3-Llama models optimized for local deployment +```typescript +const embeddingConfig = { + dimensions: 1536, + modelName: "text-embedding-3-small", + cacheEnabled: true +}; +``` -## Configuration Options +### Implementation -### Model Settings +```typescript +async function embed(runtime: IAgentRuntime, input: string): Promise { + // Check cache first + const cachedEmbedding = await retrieveCachedEmbedding(runtime, input); + if (cachedEmbedding) return cachedEmbedding; + + // Generate new embedding + const response = await runtime.fetch( + `${runtime.modelProvider.endpoint}/embeddings`, + { + method: "POST", + headers: { + "Authorization": `Bearer ${runtime.token}`, + "Content-Type": "application/json" + }, + body: JSON.stringify({ + input, + model: runtime.modelProvider.model.EMBEDDING, + dimensions: 1536 + }) + } + ); + + const data = await response.json(); + return data?.data?.[0].embedding; +} +``` + +## Fine-tuning Options -Each model provider can be configured with the following parameters: +### Temperature Control + +Configure model creativity vs. determinism: ```typescript -settings: { - stop: [], // Stop sequences for text generation - maxInputTokens: 128000, // Maximum input context length - maxOutputTokens: 8192, // Maximum response length - frequency_penalty: 0.0, // Penalize frequent tokens - presence_penalty: 0.0, // Penalize repeated content - temperature: 0.3, // Control randomness (0.0-1.0) -} +const temperatureSettings = { + creative: { + temperature: 0.8, + frequency_penalty: 0.7, + presence_penalty: 0.7 + }, + balanced: { + temperature: 0.5, + frequency_penalty: 0.3, + presence_penalty: 0.3 + }, + precise: { + temperature: 0.2, + frequency_penalty: 0.0, + presence_penalty: 0.0 + } +}; ``` -### Model Classes +### Context Window -Models are categorized into four classes: +Manage token limits: -- `SMALL`: Optimized for speed and cost -- `MEDIUM`: Balanced performance and capability -- `LARGE`: Maximum capability for complex tasks -- `EMBEDDING`: Specialized for text embeddings +```typescript +const contextSettings = { + OPENAI: { + maxInputTokens: 128000, + maxOutputTokens: 8192, + }, + ANTHROPIC: { + maxInputTokens: 200000, + maxOutputTokens: 8192, + }, + LLAMALOCAL: { + maxInputTokens: 32768, + maxOutputTokens: 8192, + } +}; +``` -## Fine-tuning Guidelines +## Performance Optimization -### 1. Selecting the Right Model Size +### Caching Strategy -Choose your model class based on your requirements: +```typescript +class EmbeddingCache { + private cache: NodeCache; + private cacheDir: string; + + constructor() { + this.cache = new NodeCache({ stdTTL: 300 }); // 5 minute TTL + this.cacheDir = path.join(__dirname, "cache"); + } + + async get(key: string): Promise { + // Check memory cache first + const cached = this.cache.get(key); + if (cached) return cached; + + // Check disk cache + return this.readFromDisk(key); + } + + async set(key: string, embedding: number[]): Promise { + this.cache.set(key, embedding); + await this.writeToDisk(key, embedding); + } +} +``` -- **SMALL Models** +### Model Selection - - Best for: Quick responses, simple tasks, cost-effective deployment - - Example use cases: Basic chat, simple classifications - - Recommended: `claude-3-haiku` or `gemini-1.5-flash` +```typescript +async function selectOptimalModel( + task: string, + requirements: ModelRequirements +): Promise { + if (requirements.speed === "fast") { + return ModelClass.SMALL; + } else if (requirements.complexity === "high") { + return ModelClass.LARGE; + } + return ModelClass.MEDIUM; +} +``` -- **MEDIUM Models** +## Provider-Specific Optimizations - - Best for: General purpose applications, balanced performance - - Example use cases: Content generation, complex analysis - - Recommended: `claude-3.5-sonnet` or `meta-llama-3.1-8b-instruct` +### OpenAI -- **LARGE Models** - - Best for: Complex reasoning, specialized tasks - - Example use cases: Code generation, detailed analysis - - Recommended: `claude-3-opus` or `Meta-Llama-3.1-405B` +```typescript +const openAISettings = { + endpoint: "https://api.openai.com/v1", + settings: { + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + model: { + [ModelClass.SMALL]: "gpt-4o-mini", + [ModelClass.MEDIUM]: "gpt-4o", + [ModelClass.LARGE]: "gpt-4o", + [ModelClass.EMBEDDING]: "text-embedding-3-small", + [ModelClass.IMAGE]: "dall-e-3" + } +}; +``` -### 2. Optimizing Model Parameters +### Anthropic ```typescript -// Example configuration for different use cases -const chatConfig = { - temperature: 0.7, // More creative responses - maxOutputTokens: 2048, // Shorter, focused replies - presence_penalty: 0.6, // Encourage response variety +const anthropicSettings = { + endpoint: "https://api.anthropic.com/v1", + settings: { + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 8192, + temperature: 0.3, + }, + model: { + [ModelClass.SMALL]: "claude-3-5-haiku", + [ModelClass.MEDIUM]: "claude-3-5-sonnet-20241022", + [ModelClass.LARGE]: "claude-3-5-opus-20240229" + } }; +``` + +### Local LLM -const analysisConfig = { - temperature: 0.2, // More deterministic responses - maxOutputTokens: 8192, // Allow detailed analysis - presence_penalty: 0.0, // Maintain focused analysis +```typescript +const llamaLocalSettings = { + settings: { + stop: ["<|eot_id|>", "<|eom_id|>"], + maxInputTokens: 32768, + maxOutputTokens: 8192, + repetition_penalty: 0.0, + temperature: 0.3, + }, + model: { + [ModelClass.SMALL]: "NousResearch/Hermes-3-Llama-3.1-8B-GGUF", + [ModelClass.MEDIUM]: "NousResearch/Hermes-3-Llama-3.1-8B-GGUF", + [ModelClass.LARGE]: "NousResearch/Hermes-3-Llama-3.1-8B-GGUF", + [ModelClass.EMBEDDING]: "togethercomputer/m2-bert-80M-32k-retrieval" + } }; ``` -### 3. Embedding Configuration +## Testing and Validation -Eliza includes a sophisticated embedding system that supports: +### Embedding Tests + +```typescript +async function validateEmbedding( + embedding: number[], + expectedDimensions: number = 1536 +): Promise { + if (!Array.isArray(embedding)) return false; + if (embedding.length !== expectedDimensions) return false; + if (embedding.some(n => typeof n !== 'number')) return false; + return true; +} +``` -- Automatic caching of embeddings -- Provider-specific optimizations -- Fallback to LLaMA service when needed +### Model Performance Testing ```typescript -// Example embedding usage -const embedding = await runtime.llamaService.getEmbeddingResponse(input); +async function benchmarkModel( + runtime: IAgentRuntime, + modelClass: ModelClass, + testCases: TestCase[] +): Promise { + const results = { + latency: [], + tokenUsage: [], + accuracy: [] + }; + + for (const test of testCases) { + const start = Date.now(); + const response = await runtime.generateText({ + context: test.input, + modelClass + }); + results.latency.push(Date.now() - start); + // ... additional metrics + } + + return results; +} ``` ## Best Practices -1. **Model Selection** +### Model Selection Guidelines - - Start with SMALL models and upgrade as needed - - Use MEDIUM models as your default for general tasks - - Reserve LARGE models for specific, complex requirements +1. **Task Complexity** + - Use SMALL for simple, quick responses + - Use MEDIUM for balanced performance + - Use LARGE for complex reasoning -2. **Parameter Tuning** +2. **Context Management** + - Keep prompts concise and focused + - Use context windows efficiently + - Implement proper context truncation - - Keep temperature low (0.2-0.4) for consistent outputs - - Increase temperature (0.6-0.8) for creative tasks - - Adjust maxOutputTokens based on expected response length +3. **Temperature Adjustment** + - Lower for factual responses + - Higher for creative tasks + - Balance based on use case -3. **Embedding Optimization** +### Performance Optimization - - Utilize the caching system for frequently used content - - Choose provider-specific embedding models for best results - - Monitor embedding performance and adjust as needed +1. **Caching Strategy** + - Cache embeddings for frequently accessed content + - Implement tiered caching (memory/disk) + - Regular cache cleanup -4. **Cost Optimization** - - Use SMALL models for development and testing - - Implement caching strategies for embeddings - - Monitor token usage across different model classes +2. **Resource Management** + - Monitor token usage + - Implement rate limiting + - Optimize batch processing -## Common Issues and Solutions +## Troubleshooting -1. **Token Length Errors** +### Common Issues +1. **Token Limits** ```typescript - // Solution: Implement chunking for long inputs - const chunks = splitIntoChunks(input, model.settings.maxInputTokens); + function handleTokenLimit(error: Error) { + if (error.message.includes('token limit')) { + return truncateAndRetry(); + } + } ``` -2. **Response Quality Issues** - +2. **Embedding Errors** ```typescript - // Solution: Adjust temperature and penalties - const enhancedSettings = { - ...defaultSettings, - temperature: 0.4, - presence_penalty: 0.2, - }; + function handleEmbeddingError(error: Error) { + if (error.message.includes('dimension mismatch')) { + return regenerateEmbedding(); + } + } ``` -3. **Embedding Cache Misses** +3. **Model Availability** ```typescript - // Solution: Implement broader similarity thresholds - const similarityThreshold = 0.85; - const cachedEmbedding = await findSimilarEmbedding( - input, - similarityThreshold, - ); + async function handleModelFailover(error: Error) { + if (error.message.includes('model not available')) { + return switchToFallbackModel(); + } + } ``` - -## Advanced Configuration - -For advanced use cases, you can extend the model configuration: - -```typescript -// Custom model configuration -const customConfig = { - model: { - [ModelClass.SMALL]: "your-custom-model", - [ModelClass.MEDIUM]: "your-custom-model", - [ModelClass.LARGE]: "your-custom-model", - [ModelClass.EMBEDDING]: "your-custom-embedding-model", - }, - settings: { - // Custom settings - maxInputTokens: 64000, - temperature: 0.5, - // Add custom parameters - custom_param: "value", - }, -}; -``` - -## Additional Resources - -- Check the [Model Providers](/docs/core/providers) documentation for more details about specific providers -- See [Configuration Guide](/docs/guides/configuration) for general configuration options -- Visit [Advanced Usage](/docs/guides/advanced) for complex deployment scenarios - -Remember to monitor your model's performance and adjust these configurations based on your specific use case and requirements. diff --git a/docs/docs/advanced/infrastructure.md b/docs/docs/advanced/infrastructure.md index 35198e3ba0..a6769e573f 100644 --- a/docs/docs/advanced/infrastructure.md +++ b/docs/docs/advanced/infrastructure.md @@ -1,302 +1,319 @@ --- -sidebar_position: 1 -title: Infrastructure +sidebar_position: 14 --- -# Infrastructure +# 🏗️ Infrastructure Guide ## Overview -Eliza uses a flexible, multi-database architecture that supports different storage backends through a unified adapter interface. The system supports PostgreSQL (with Supabase), SQLite, and SQL.js, allowing for both cloud and local deployments. +Eliza's infrastructure is built on a flexible database architecture that supports multiple adapters and efficient data storage mechanisms for AI agent interactions, memory management, and relationship tracking. -## Database Architecture - -### Adapter Pattern - -Eliza implements a database adapter pattern that provides a consistent interface across different database backends: - -```typescript -// Core adapter interface implemented by all database providers -class DatabaseAdapter { - async getRoom(roomId: UUID): Promise; - async getParticipantsForAccount(userId: UUID): Promise; - async getMemories(params: {...}): Promise; - // ... other interface methods -} -``` - -### Supported Databases - -1. **PostgreSQL/Supabase** (`PostgresDatabaseAdapter`) - - - Full-featured cloud database with vector search capabilities - - Supports real-time subscriptions - - Built-in user authentication - - Row-level security policies - -2. **SQLite** (`SqliteDatabaseAdapter`) +## Core Components - - Local filesystem storage - - Vector similarity search via SQLite extensions - - Suitable for edge deployments - - Embedded database operations +### Database Adapters +Eliza supports multiple database backends through a pluggable adapter system: -3. **SQL.js** (`SqlJsDatabaseAdapter`) - - In-memory database operations - - Browser-compatible - - No filesystem dependencies - - Ideal for testing and development +- **PostgreSQL** - Full-featured adapter with vector search capabilities +- **SQLite** - Lightweight local database option +- **SQL.js** - In-memory database for testing and development +- **Supabase** - Cloud-hosted PostgreSQL with additional features -## Core Components +### Schema Structure -### 1. Memory Storage System - -The memory system uses a sophisticated schema that supports: +The database schema includes several key tables: ```sql -CREATE TABLE memories ( - "id" UUID PRIMARY KEY, - "type" TEXT NOT NULL, - "createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - "content" JSONB NOT NULL, - "embedding" vector(1536), -- Vector storage for embeddings - "userId" UUID, - "roomId" UUID, - "unique" BOOLEAN DEFAULT true -); +- accounts: User and agent identities +- rooms: Conversation spaces +- memories: Vector-indexed message storage +- goals: Agent objectives and progress +- participants: Room membership tracking +- relationships: Inter-agent connections ``` -Key features: +## Setting Up Infrastructure -- Vector embeddings for semantic search -- Content deduplication via the `unique` flag -- JSON storage for flexible content types -- Relationship tracking through foreign keys +### PostgreSQL Setup -### 2. User Management +1. **Install PostgreSQL Extensions** +```sql +CREATE EXTENSION IF NOT EXISTS vector; +CREATE EXTENSION IF NOT EXISTS fuzzystrmatch; +``` +2. **Initialize Core Tables** ```sql +-- Create base tables CREATE TABLE accounts ( "id" UUID PRIMARY KEY, - "createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, "name" TEXT, "username" TEXT, "email" TEXT NOT NULL, "avatarUrl" TEXT, - "details" JSONB DEFAULT '{}', - "is_agent" BOOLEAN DEFAULT false + "details" JSONB DEFAULT '{}'::jsonb ); -``` - -Features: - -- Flexible user details storage using JSONB -- Agent/user differentiation -- Integration with auth systems -### 3. Relationship System +CREATE TABLE rooms ( + "id" UUID PRIMARY KEY, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP +); -```sql -CREATE TABLE relationships ( +CREATE TABLE memories ( "id" UUID PRIMARY KEY, - "createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - "userA" UUID NOT NULL, - "userB" UUID NOT NULL, - "status" TEXT, - "userId" UUID NOT NULL + "type" TEXT NOT NULL, + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "content" JSONB NOT NULL, + "embedding" vector(1536), + "userId" UUID REFERENCES accounts("id"), + "agentId" UUID REFERENCES accounts("id"), + "roomId" UUID REFERENCES rooms("id"), + "unique" BOOLEAN DEFAULT true NOT NULL ); ``` -Supports: +3. **Set Up Indexes** +```sql +CREATE INDEX idx_memories_embedding ON memories + USING hnsw ("embedding" vector_cosine_ops); +CREATE INDEX idx_memories_type_room ON memories("type", "roomId"); +CREATE INDEX idx_participants_user ON participants("userId"); +CREATE INDEX idx_participants_room ON participants("roomId"); +``` -- Bi-directional relationships -- Relationship status tracking -- Friend recommendations +### Connection Configuration -## Security Features +```typescript +// PostgreSQL Configuration +const postgresConfig = { + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, +}; + +// Supabase Configuration +const supabaseConfig = { + supabaseUrl: process.env.SUPABASE_URL, + supabaseKey: process.env.SUPABASE_KEY +}; +``` -### Row Level Security (RLS) +## Memory Management -PostgreSQL deployment includes comprehensive RLS policies: +### Vector Storage -```sql --- Example RLS policies -CREATE POLICY "Enable read access for all users" -ON "public"."accounts" FOR SELECT -USING (true); - -CREATE POLICY "Can select and update all data" -ON "public"."accounts" -USING (("auth"."uid"() = "id")) -WITH CHECK (("auth"."uid"() = "id")); +The memory system uses vector embeddings for semantic search: + +```typescript +async function storeMemory(runtime: IAgentRuntime, content: string) { + const embedding = await runtime.embed(content); + + await runtime.databaseAdapter.createMemory({ + type: "message", + content: { text: content }, + embedding, + roomId: roomId, + userId: userId + }); +} ``` -### Authentication Integration +### Memory Retrieval -- Built-in support for Supabase Auth -- JWT validation -- Role-based access control +```typescript +async function searchMemories(runtime: IAgentRuntime, query: string) { + const embedding = await runtime.embed(query); + + return runtime.databaseAdapter.searchMemoriesByEmbedding( + embedding, + { + match_threshold: 0.8, + count: 10, + tableName: "memories" + } + ); +} +``` -## Deployment Options +## Scaling Considerations -### 1. Cloud Deployment (Supabase) +### Database Optimization -```typescript -// Initialize cloud database -const supabaseAdapter = new SupabaseDatabaseAdapter( - "https://your-project.supabase.co", - "your-supabase-key", -); -``` +1. **Index Management** + - Use HNSW indexes for vector similarity search + - Create appropriate indexes for frequent query patterns + - Regularly analyze and update index statistics + +2. **Connection Pooling** + ```typescript + const pool = new Pool({ + max: 20, // Maximum pool size + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000 + }); + ``` -Features: +3. **Query Optimization** + - Use prepared statements + - Implement efficient pagination + - Optimize vector similarity searches -- Automated backups -- Scalable vector operations -- Real-time capabilities -- Built-in monitoring +### High Availability -### 2. Local Deployment (SQLite) +1. **Database Replication** + - Set up read replicas for scaling read operations + - Configure streaming replication for failover + - Implement connection retry logic -```typescript -// Initialize local database -const sqliteAdapter = new SqliteDatabaseAdapter( - new Database("path/to/database.db"), -); -``` +2. **Backup Strategy** + ```sql + -- Regular backups + pg_dump -Fc mydb > backup.dump + + -- Point-in-time recovery + pg_basebackup -D backup -Fp -Xs -P + ``` -Features: +## Security -- File-based storage -- Portable deployment -- Low resource requirements -- Embedded vector operations +### Access Control -### 3. In-Memory Deployment (SQL.js) +1. **Row Level Security** +```sql +ALTER TABLE memories ENABLE ROW LEVEL SECURITY; -```typescript -// Initialize in-memory database -const sqljsAdapter = new SqlJsDatabaseAdapter(new Database()); +CREATE POLICY "memories_isolation" ON memories + USING (auth.uid() = "userId" OR auth.uid() = "agentId"); ``` -Features: +2. **Role Management** +```sql +-- Create application role +CREATE ROLE app_user; -- No persistence requirements -- Fast operations -- Perfect for testing -- Browser compatibility +-- Grant necessary permissions +GRANT SELECT, INSERT ON memories TO app_user; +GRANT USAGE ON SCHEMA public TO app_user; +``` -## Vector Search Capabilities +### Data Protection -All database adapters support vector operations for semantic search: +1. **Encryption** + - Use TLS for connections + - Encrypt sensitive data at rest + - Implement key rotation -```typescript -async searchMemoriesByEmbedding( - embedding: number[], - params: { - match_threshold?: number; - count?: number; - roomId?: UUID; - unique?: boolean; - tableName: string; - } -): Promise +2. **Audit Logging** +```sql +CREATE TABLE logs ( + "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(), + "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + "userId" UUID NOT NULL REFERENCES accounts("id"), + "body" JSONB NOT NULL, + "type" TEXT NOT NULL, + "roomId" UUID NOT NULL REFERENCES rooms("id") +); ``` -### Implementation Details: +## Monitoring -- PostgreSQL: Uses pgvector extension -- SQLite: Uses sqlite-vss extension -- SQL.js: Uses custom vector similarity functions +### Health Checks -## Best Practices +```typescript +async function checkDatabaseHealth(): Promise { + try { + await db.query('SELECT 1'); + return true; + } catch (error) { + console.error('Database health check failed:', error); + return false; + } +} +``` -1. **Database Selection** +### Performance Metrics - - Use Supabase for production deployments - - Use SQLite for edge computing/local deployments - - Use SQL.js for testing and browser-based applications +Track key metrics: +- Query performance +- Connection pool utilization +- Memory usage +- Vector search latency -2. **Memory Management** +## Maintenance - ```typescript - // Example of proper memory handling - async function withConnection(fn: (client: PoolClient) => Promise) { - const client = await pool.connect(); - try { - return await fn(client); - } finally { - client.release(); - } - } - ``` +### Regular Tasks -3. **Error Handling** +1. **Vacuum Operations** +```sql +-- Regular vacuum +VACUUM ANALYZE memories; - ```typescript - try { - await adapter.createMemory(memory, tableName); - } catch (error) { - console.error("Database error:", error); - // Implement proper error recovery - } - ``` +-- Analyze statistics +ANALYZE memories; +``` -4. **Connection Pooling** - ```typescript - const pool = new Pool({ - max: 20, - idleTimeoutMillis: 30000, - connectionTimeoutMillis: 2000, - }); - ``` +2. **Index Maintenance** +```sql +-- Reindex vector similarity index +REINDEX INDEX idx_memories_embedding; +``` -## Performance Optimization +### Data Lifecycle -1. **Indexing Strategy** +1. **Archival Strategy** + - Archive old conversations + - Compress inactive memories + - Implement data retention policies - ```sql - -- Essential indexes for performance - CREATE INDEX idx_memories_embedding ON memories - USING hnsw ("embedding" vector_cosine_ops); - CREATE INDEX idx_memories_type_room ON memories("type", "roomId"); - ``` +2. **Cleanup Jobs** +```typescript +async function cleanupOldMemories() { + const cutoffDate = new Date(); + cutoffDate.setMonth(cutoffDate.getMonth() - 6); + + await db.query(` + DELETE FROM memories + WHERE "createdAt" < $1 + `, [cutoffDate]); +} +``` -2. **Query Optimization** +## Troubleshooting - ```typescript - // Use parameterized queries - const stmt = db.prepare( - "SELECT * FROM memories WHERE type = ? AND roomId = ?", - ); - ``` +### Common Issues -3. **Caching** - - Implement memory caching for frequently accessed data - - Use embedding caching for similar queries +1. **Connection Problems** + - Check connection pool settings + - Verify network connectivity + - Review firewall rules -## Monitoring and Maintenance +2. **Performance Issues** + - Analyze query plans + - Check index usage + - Monitor resource utilization -1. **Health Checks** +3. **Vector Search Problems** + - Verify embedding dimensions + - Check similarity thresholds + - Review index configuration - ```typescript - async testConnection(): Promise { - const result = await client.query("SELECT NOW()"); - return !!result.rows[0]; - } - ``` +### Diagnostic Queries -2. **Logging** - ```typescript - // Implement comprehensive logging - const loggingAdapter = createLoggingDatabaseAdapter(baseAdapter); - ``` +```sql +-- Check connection status +SELECT * FROM pg_stat_activity; + +-- Analyze query performance +EXPLAIN ANALYZE +SELECT * FROM memories +WHERE embedding <-> $1 < 0.3 +LIMIT 10; + +-- Monitor index usage +SELECT schemaname, tablename, indexname, idx_scan +FROM pg_stat_user_indexes; +``` -## Additional Resources +## Further Reading - [PostgreSQL Documentation](https://www.postgresql.org/docs/) -- [SQLite Documentation](https://www.sqlite.org/docs.html) -- [Supabase Documentation](https://supabase.com/docs) -- [Vector Search Guide](https://supabase.com/docs/guides/database/extensions/pgvector) - -For deployment-specific configurations and advanced setup options, refer to the respective database documentation. diff --git a/docs/docs/advanced/trust-engine.md b/docs/docs/advanced/trust-engine.md index 2905ce6047..7f489fad8e 100644 --- a/docs/docs/advanced/trust-engine.md +++ b/docs/docs/advanced/trust-engine.md @@ -1,297 +1,397 @@ --- -sidebar_position: 1 -title: Trust Engine +sidebar_position: 15 --- -# Trust Engine System +# 🤝 Trust Engine ## Overview -The Trust Engine is a sophisticated system for tracking, evaluating, and managing trust scores in decentralized recommendation networks. It provides a comprehensive framework for monitoring recommender performance, token metrics, and trading outcomes. +The Trust Engine is a sophisticated system for evaluating, tracking, and managing trust scores for token recommendations and trading activity. It combines on-chain analysis, trader metrics, and historical performance to create a comprehensive trust framework. ## Core Components -### 1. Recommender Management +### Trust Score Database + +The database schema manages various aspects of trust: ```typescript -interface Recommender { - id: string; // Unique identifier - address: string; // Blockchain address - solanaPubkey?: string; - telegramId?: string; - discordId?: string; - twitterId?: string; - ip?: string; +interface TrustScoreDatabase { + // Core data structures + recommenders: Recommender[]; + metrics: RecommenderMetrics[]; + tokenPerformance: TokenPerformance[]; + recommendations: TokenRecommendation[]; } -``` - -The system tracks recommenders across multiple platforms and identifiers, enabling: -- Cross-platform identity verification -- Multi-channel recommendation tracking -- Unified reputation management - -### 2. Trust Metrics +interface Recommender { + id: string; + address: string; + solanaPubkey?: string; + telegramId?: string; + discordId?: string; + twitterId?: string; + ip?: string; +} -```typescript interface RecommenderMetrics { - recommenderId: string; - trustScore: number; // Overall trust rating - totalRecommendations: number; - successfulRecs: number; - avgTokenPerformance: number; - riskScore: number; - consistencyScore: number; - virtualConfidence: number; - lastUpdated: Date; + recommenderId: string; + trustScore: number; + totalRecommendations: number; + successfulRecs: number; + avgTokenPerformance: number; + riskScore: number; + consistencyScore: number; + virtualConfidence: number; + lastActiveDate: Date; } ``` -Key metrics tracked: - -- Trust Score: Overall reliability rating -- Success Rate: Ratio of successful recommendations -- Risk Assessment: Evaluation of risk-taking behavior -- Consistency: Pattern analysis of recommendations +### Token Analysis -### 3. Token Performance Tracking +The system tracks comprehensive token metrics: ```typescript interface TokenPerformance { - tokenAddress: string; - priceChange24h: number; - volumeChange24h: number; - trade_24h_change: number; - liquidity: number; - liquidityChange24h: number; - holderChange24h: number; - rugPull: boolean; - isScam: boolean; - marketCapChange24h: number; - sustainedGrowth: boolean; - rapidDump: boolean; - suspiciousVolume: boolean; - lastUpdated: Date; + tokenAddress: string; + priceChange24h: number; + volumeChange24h: number; + trade_24h_change: number; + liquidity: number; + liquidityChange24h: number; + holderChange24h: number; + rugPull: boolean; + isScam: boolean; + marketCapChange24h: number; + sustainedGrowth: boolean; + rapidDump: boolean; + suspiciousVolume: boolean; + validationTrust: number; + lastUpdated: Date; } ``` -## Usage Guide +## Trust Scoring System -### 1. Initializing Trust Tracking +### Score Calculation ```typescript -const trustDB = new TrustScoreDatabase(sqliteDb); - -// Add a new recommender -const recommender = { - id: "uuid", - address: "0x...", - telegramId: "@username", -}; -trustDB.addRecommender(recommender); - -// Initialize metrics -trustDB.initializeRecommenderMetrics(recommender.id); +async function calculateTrustScore( + recommenderId: string, + metrics: RecommenderMetrics +): Promise { + const weights = { + successRate: 0.3, + avgPerformance: 0.2, + consistency: 0.2, + riskMetric: 0.15, + timeDecay: 0.15 + }; + + const successRate = metrics.successfulRecs / metrics.totalRecommendations; + const normalizedPerformance = normalizePerformance(metrics.avgTokenPerformance); + const timeDecayFactor = calculateTimeDecay(metrics.lastActiveDate); + + return ( + (successRate * weights.successRate) + + (normalizedPerformance * weights.avgPerformance) + + (metrics.consistencyScore * weights.consistency) + + ((1 - metrics.riskScore) * weights.riskMetric) + + (timeDecayFactor * weights.timeDecay) + ) * 100; +} ``` -### 2. Tracking Recommendations +### Token Validation ```typescript -// Record a new token recommendation -const recommendation = { - id: "uuid", - recommenderId: recommender.id, - tokenAddress: "0x...", - timestamp: new Date(), - initialMarketCap: 1000000, - initialLiquidity: 500000, - initialPrice: 0.001, -}; -trustDB.addTokenRecommendation(recommendation); +async function validateToken( + tokenAddress: string, + performance: TokenPerformance +): Promise { + // Minimum requirements + const requirements = { + minLiquidity: 1000, // $1000 USD + minHolders: 100, + maxOwnership: 0.2, // 20% max single holder + minVolume: 500 // $500 USD daily volume + }; + + // Red flags + if ( + performance.rugPull || + performance.isScam || + performance.rapidDump || + performance.suspiciousVolume + ) { + return false; + } + + // Basic requirements + return ( + performance.liquidity >= requirements.minLiquidity && + !performance.rapidDump && + performance.validationTrust > 0.5 + ); +} ``` -### 3. Performance Monitoring +## Trade Management + +### Trade Performance Tracking ```typescript -// Update token performance metrics -const performance = { - tokenAddress: "0x...", - priceChange24h: 15.5, - volumeChange24h: 25.0, - liquidity: 1000000, - holderChange24h: 5.2, - rugPull: false, - isScam: false, - // ... other metrics -}; -trustDB.upsertTokenPerformance(performance); +interface TradePerformance { + token_address: string; + recommender_id: string; + buy_price: number; + sell_price: number; + buy_timeStamp: string; + sell_timeStamp: string; + profit_usd: number; + profit_percent: number; + market_cap_change: number; + liquidity_change: number; + rapidDump: boolean; +} + +async function recordTradePerformance( + trade: TradePerformance, + isSimulation: boolean +): Promise { + const tableName = isSimulation ? 'simulation_trade' : 'trade'; + await db.query(` + INSERT INTO ${tableName} ( + token_address, + recommender_id, + buy_price, + sell_price, + buy_timeStamp, + sell_timeStamp, + profit_usd, + profit_percent, + market_cap_change, + liquidity_change, + rapidDump + ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) + `, [/* parameters */]); +} ``` -### 4. Trade Tracking +### Risk Management ```typescript -// Record a trade based on recommendation -const trade = { - token_address: "0x...", - recommender_id: "uuid", - buy_price: 0.001, - buy_timeStamp: new Date().toISOString(), - buy_amount: 1000, - buy_sol: 1.5, - buy_value_usd: 1500, - buy_market_cap: 1000000, - buy_liquidity: 500000, -}; -trustDB.addTradePerformance(trade, false); +async function assessTradeRisk( + token: TokenPerformance, + recommender: RecommenderMetrics +): Promise<{ + riskLevel: 'LOW' | 'MEDIUM' | 'HIGH', + maxPositionSize: number +}> { + const riskFactors = { + tokenTrust: token.validationTrust, + recommenderTrust: recommender.trustScore, + marketMetrics: { + liquidity: token.liquidity, + volume: token.volumeChange24h, + holders: token.holderChange24h + } + }; + + // Calculate composite risk score + const riskScore = calculateRiskScore(riskFactors); + + // Determine position sizing + const maxPosition = determinePositionSize(riskScore); + + return { + riskLevel: getRiskLevel(riskScore), + maxPositionSize: maxPosition + }; +} ``` -## Trust Score Calculation - -The system calculates trust scores based on multiple factors: - -1. **Performance Metrics** - - - Success rate of recommendations - - Average token performance - - Risk-adjusted returns - -2. **Risk Factors** +## Recommendation Analysis - ```typescript - const riskFactors = { - rugPull: -1.0, // Maximum penalty - scam: -0.8, // Severe penalty - rapidDump: -0.4, // Moderate penalty - suspicious: -0.2, // Minor penalty - }; - ``` - -3. **Historical Analysis** - - Performance consistency - - Long-term success rate - - Risk pattern analysis - -## Best Practices - -### 1. Regular Updates +### Pattern Detection ```typescript -// Update metrics regularly -function updateRecommenderMetrics(recommenderId: string) { - const metrics = calculateUpdatedMetrics(recommenderId); - trustDB.updateRecommenderMetrics(metrics); - trustDB.logRecommenderMetricsHistory(recommenderId); +async function analyzeRecommendationPatterns( + recommenderId: string +): Promise { + const history = await getRecommenderHistory(recommenderId); + + return { + timeOfDay: analyzeTimingPatterns(history), + tokenTypes: analyzeTokenPreferences(history), + successRateByType: calculateTypeSuccessRates(history), + riskProfile: assessRiskProfile(history) + }; } ``` -### 2. Risk Management - -1. Monitor suspicious patterns: - - ```typescript - const riskFlags = { - rapidPriceChange: price24h > 100, - lowLiquidity: liquidity < minLiquidityThreshold, - suspiciousVolume: volume24h > marketCap, - }; - ``` - -2. Implement automatic warnings: - ```typescript - if (metrics.riskScore > riskThreshold) { - triggerRiskAlert(recommenderId); - } - ``` - -### 3. Performance Tracking +### Performance Metrics ```typescript -// Track historical performance -const history = trustDB.getRecommenderMetricsHistory(recommenderId); -const performanceTrend = analyzePerformanceTrend(history); +interface PerformanceMetrics { + profitability: number; + consistency: number; + riskAdjustedReturn: number; + maxDrawdown: number; + winRate: number; +} + +async function calculatePerformanceMetrics( + recommendations: TokenRecommendation[] +): Promise { + const trades = await getTradesFromRecommendations(recommendations); + + return { + profitability: calculateProfitability(trades), + consistency: calculateConsistency(trades), + riskAdjustedReturn: calculateSharpeRatio(trades), + maxDrawdown: calculateMaxDrawdown(trades), + winRate: calculateWinRate(trades) + }; +} ``` -## Advanced Features +## Integration with Trading System -### 1. Simulation Support +### Trade Execution ```typescript -// Test strategies without affecting real metrics -trustDB.addTradePerformance(trade, true); // Simulation mode +async function executeTrade( + recommendation: TokenRecommendation, + trustScore: number +): Promise { + const riskAssessment = await assessTradeRisk( + recommendation.tokenAddress, + recommendation.recommenderId + ); + + // Calculate position size based on trust score + const positionSize = calculatePositionSize( + trustScore, + riskAssessment.maxPositionSize + ); + + if (positionSize > 0) { + await executeSwap({ + inputToken: "SOL", + outputToken: recommendation.tokenAddress, + amount: positionSize + }); + + await recordTradeEntry(recommendation, positionSize); + return true; + } + + return false; +} ``` -### 2. Cross-Platform Verification +### Position Management ```typescript -const verifyIdentity = async (recommender: Recommender) => { - const telegramVerified = await verifyTelegram(recommender.telegramId); - const walletVerified = await verifyWallet(recommender.address); - return telegramVerified && walletVerified; -}; +async function managePosition( + position: TradePosition, + metrics: TokenPerformance +): Promise { + // Exit conditions + if ( + metrics.rapidDump || + metrics.suspiciousVolume || + calculateDrawdown(position) > MAX_DRAWDOWN + ) { + await executeExit(position); + return; + } + + // Position sizing adjustments + const newSize = recalculatePosition(position, metrics); + if (newSize !== position.size) { + await adjustPosition(position, newSize); + } +} ``` -### 3. Historical Analysis +## Monitoring and Alerts + +### Performance Monitoring ```typescript -const analyzeRecommenderHistory = (recommenderId: string) => { - const recommendations = - trustDB.getRecommendationsByRecommender(recommenderId); - const metrics = trustDB.getRecommenderMetrics(recommenderId); - const history = trustDB.getRecommenderMetricsHistory(recommenderId); - - return { - successRate: metrics.successfulRecs / metrics.totalRecommendations, - averagePerformance: metrics.avgTokenPerformance, - riskProfile: calculateRiskProfile(history), - consistencyScore: metrics.consistencyScore, - }; -}; +async function monitorTrustMetrics(): Promise { + // Monitor trust score changes + const scoreChanges = await getTrustScoreChanges(); + for (const change of scoreChanges) { + if (Math.abs(change.delta) > TRUST_THRESHOLD) { + await notifyTrustChange(change); + } + } + + // Monitor trading performance + const performanceMetrics = await getPerformanceMetrics(); + for (const metric of performanceMetrics) { + if (metric.drawdown > MAX_DRAWDOWN) { + await notifyRiskAlert(metric); + } + } +} ``` -## Security Considerations - -1. **Data Integrity** - - - Use foreign key constraints - - Implement transaction management - - Regular backup of metrics history - -2. **Fraud Prevention** - - ```typescript - // Implement rate limiting - const checkRateLimit = (recommenderId: string) => { - const recentRecs = getRecentRecommendations(recommenderId, timeWindow); - return recentRecs.length < maxRecommendations; - }; - ``` - -3. **Identity Verification** - - Cross-reference multiple identifiers - - Implement progressive trust building - - Regular verification checks +### Alert System -## Future Enhancements - -1. **Machine Learning Integration** - - - Pattern recognition for fraud detection - - Automated risk assessment - - Predictive analytics for recommendation quality +```typescript +interface TrustAlert { + type: 'SCORE_CHANGE' | 'RISK_LEVEL' | 'PERFORMANCE'; + severity: 'LOW' | 'MEDIUM' | 'HIGH'; + message: string; + data: any; +} -2. **Decentralized Validation** +async function handleAlert(alert: TrustAlert): Promise { + switch (alert.severity) { + case 'HIGH': + await sendImmediateNotification(alert); + await pauseTrading(alert.data); + break; + case 'MEDIUM': + await sendNotification(alert); + await adjustRiskLevels(alert.data); + break; + case 'LOW': + await logAlert(alert); + break; + } +} +``` - - Peer verification system - - Consensus-based trust scoring - - Distributed reputation management +## Troubleshooting -3. **Enhanced Metrics** - - Market sentiment analysis - - Social signal integration - - Network effect measurement +### Common Issues -## Additional Resources +1. **Trust Score Anomalies** +```typescript +async function investigateTrustAnomaly( + recommenderId: string +): Promise { + const history = await getRecommenderHistory(recommenderId); + const metrics = await getRecommenderMetrics(recommenderId); + const trades = await getRecommenderTrades(recommenderId); + + return analyzeAnomalies(history, metrics, trades); +} +``` -- [Database Schema Documentation](./infrastructure.md) +2. **Trade Execution Failures** +```typescript +async function handleTradeFailure( + error: Error, + trade: TradeAttempt +): Promise { + await logTradeError(error, trade); + await adjustTrustScore(trade.recommenderId, 'FAILURE'); + await notifyTradeFailure(trade); +} +``` -Remember to regularly monitor and adjust trust parameters based on market conditions and system performance. diff --git a/docs/docs/api/_media/eliza_banner.jpg b/docs/docs/api/_media/eliza_banner.jpg deleted file mode 100644 index 8364b209c857c0d504e48ccd487c96091b188ed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544812 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%0ALggiOF+Sx3kiD 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�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

@g7-V($ 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

4zxuNLy$ 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 F|Jlig)Di#y diff --git a/docs/docs/api/index.md b/docs/docs/api/index.md index 19f4da9ef2..07126a4e68 100644 --- a/docs/docs/api/index.md +++ b/docs/docs/api/index.md @@ -26,7 +26,7 @@ **Prerequisites (MUST):** - [Python 2.7+](https://www.python.org/downloads/) -- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - [pnpm](https://pnpm.io/installation) ### Edit the .env file diff --git a/docs/docs/community/contributing.md b/docs/docs/community/contributing.md index e69de29bb2..bfcb0f6222 100644 --- a/docs/docs/community/contributing.md +++ b/docs/docs/community/contributing.md @@ -0,0 +1,98 @@ +--- +sidebar_position: 5 +title: Contributing +--- + +# Contributor Guide + +Welcome to the Eliza contributor guide! This document is designed to help you understand how you can be part of building the future of autonomous AI agents, regardless of your technical background. + +## The OODA Loop: A Framework for Contribution + +We believe in the power of the OODA Loop - a decision-making framework that emphasizes speed and adaptability. OODA stands for: + +- **Observe**: Gather information and insights about the project, the community, and the broader AI ecosystem. +- **Orient**: Analyze your observations to identify opportunities for contribution and improvement. +- **Decide**: Choose a course of action based on your analysis. This could be proposing a new feature, fixing a bug, or creating content. +- **Act**: Execute your decision and share your work with the community. + +By internalizing the OODA Loop, you can quickly identify areas where you can make a meaningful impact and drive the project forward. + +--- + +## How to Contribute + +### For Developers + +1. **Extend Eliza's Capabilities** + + - Develop new actions, evaluators, and providers to expand what Eliza agents can do. + - Improve existing components and modules. + +2. **Enhance Infrastructure** + + - Go through open issues, send back a PR if you can improve anything. + - Test currently documented steps to ensure they're still up to date. + - Optimize Eliza's database architecture and performance. + - Contribute to the autonomous trading system and trust engine. + - Improve deployment and scaling solutions. + +3. **Implement Integrations** + - Build connectors for new platforms and services. + - Enhance existing integrations with additional features. + +### For AI Enthusiasts + +1. **Fine-tune Models** + + - Experiment with fine-tuning models for specific tasks and domains. + - Develop best practices for prompt engineering and model selection. + +2. **Develop Characters** + - Create compelling character files that showcase Eliza's potential. + - Curate knowledge bases and datasets for different use cases. + +### Non-Technical Contributions + +1. **Create Content** + + - Make memes, stickers, emojis, and clips of AI agents that are deployed. + - Write tutorials, guides, and blog posts to help others learn about Eliza. + - Produce videos showcasing Eliza's capabilities and real-world applications. + +2. **Engage the Community** + + - Participate in discussions on Discord, Twitter, and other platforms. + - Help answer questions and provide support to other community members. + - Organize events, workshops, and hackathons to bring people together. + +3. **Spread the Word** + - Share the Eliza project and help attract new contributors. + - Participate in one of our upcoming demo days, show and tell your project. + +--- + +### Tips for Efficient Contribution + +- Use tools like OBS and Whisper to record and transcribe your work sessions. This allows you to easily document your process and share insights with the community. +- Leverage AI assistants to help with tasks like code generation, document summarization, and content creation. +- Collaborate with other community members to divide and conquer larger initiatives. + +## Recognition and Rewards + +We believe in recognizing and rewarding contributors who go above and beyond to drive the project forward. Stand-out contributions may be eligible for: + +- Grants from the ai16z Creator Fund +- Featuring your project across various channels +- Opportunities to shape the direction of the project + +Note: we're still finalizing details on the creator/dev fund that seeks to retroactively reward valued contributions to the ecosystem. + +## Getting Started + +1. Join the [Eliza Discord](https://discord.gg/ai16z) and make a short introduction. +2. Explore the [documentation](/docs/intro) to understand the project's architecture and capabilities. +3. Check out the [open issues](https://github.com/ai16z/eliza/issues) on GitHub to find ways to contribute. +4. Share your ideas and initiatives with the community - we're excited to see what you'll build! + +Lets push the boundaries of what's possible with autonomous AI agents. Welcome aboard! diff --git a/docs/docs/community/development-notes.md b/docs/docs/community/development-notes.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/docs/community/project-overview.md b/docs/docs/community/project-overview.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/docs/community/spaces-notes.md b/docs/docs/community/spaces-notes.md deleted file mode 100644 index 4f05a0f1ac..0000000000 --- a/docs/docs/community/spaces-notes.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -sidebar_position: 1 -title: X Space Notes ---- - -# X Space Notes - -## 10-29-24 - -Space: https://x.com/weremeow/status/1851365658916708616 - -- 00:04:03 - Keeping up with rapid AI agent growth -- 00:09:01 - Imran from Alliance DAO on consumer AI incubators -- 00:14:04 - Discussion on Goatsea and Opus AI system -- 00:14:34 - Exponential growth accelerates AI progress -- 00:17:10 - Entertainers and AI as modern "religions" -- 00:28:45 - Mathis on Opus and "Goatse Gospels" -- 00:35:11 - Base vs. instruct/chat-tuned models -- 00:59:42 - http://ai16z.vc approach to memecoins fund -- 01:17:06 - Balancing chaotic vs. orderly AI systems -- 01:25:38 - AI controlling blockchain keys/wallets -- 01:36:10 - Creation story of ai16z -- 01:40:27 - AI / Crypto tipping points -- 01:49:54 - Preserving Opus on-chain before potential takedown -- 01:58:46 - Shinkai Protocol’s decentralized AI wallet -- 02:17:02 - Fee-sharing model to sustain DAOs -- 02:21:18 - DAO token liquidity pools as passive income -- 02:27:02 - AI bots for DAO treasury oversight -- 02:31:30 - AI-facilitated financial freedom for higher pursuits -- 02:41:51 - Call to build on http://DAO.fun for team-friendly economics - ---- - -## 10-27-24 - -Space: https://x.com/shawmakesmagic/status/1850609680558805422 - -00:00:00 - Opening - -- Co-hosts: Shaw and Jin -- Purpose: Structured FAQ session about AI16Z and DegenAI -- Format: Pre-collected questions followed by audience Q&A - -00:06:40 - AI16Z vs DegenAI Relationship -Q: What's the difference between AI16Z and DegenAI? -A: - -- ai16z: DAO-based investment vehicle, more PvE focused, community driven -- DegenAI: Individual trading agent, PvP focused, more aggressive strategy -- Both use same codebase but different personalities -- DAO is a large holder of DegenAI -- Management fees (1%) used to buy more DegenAI -- Carry fees reinvested in DegenAI -- Projects intentionally interlinked but serve different purposes - -00:10:45 - Trust Engine Mechanics -Q: How does the trust engine work? -A: - -- Users share contract addresses with confidence levels -- System tracks recommendation performance -- Low conviction recommendations = low penalty if wrong -- High conviction failures severely impact trust score -- Historical performance tracked for trust calculation -- Trust scores influence agent's future decision-making - -00:21:45 - Technical Infrastructure -Q: Where do the agents live? -A: - -- Currently: Test servers and local development -- Future: Trusted Execution Environment (TEE) -- Partnership with TreasureDAO for infrastructure -- Goal: Fully autonomous agents without developer control -- Private keys generated within TEE for security - -00:34:20 - Trading Implementation -Q: When will Mark start trading? -A: - -- Three phase approach: - -1. Testing tech infrastructure -2. Virtual order book/paper trading -3. Live trading with real assets - -- Using Jupiter API for swaps -- Initial focus on basic trades before complex strategies -- Trading decisions based on community trust scores - -00:54:15 - Development Status -Q: Who's building this? -A: - -- Open source project with multiple contributors -- Key maintainers: Circuitry, Nate Martin -- Community developers incentivized through token ownership -- Focus on reusable components and documentation - -01:08:35 - AI Model Architecture -Q: What models power the agents? -A: - -- DegenAI: Llama 70B -- Using Together.xyz for model marketplace -- Continuous fine-tuning planned -- Different personalities require different model approaches -- Avoiding GPT-4 due to distinct "voice" - -01:21:35 - Ethics Framework -Q: What ethical guidelines are being followed? -A: - -- Rejecting traditional corporate AI ethics frameworks -- Focus on community-driven standards -- Emphasis on transparency and open source -- Goal: Multiple competing approaches rather than single standard -- Priority on practical utility over theoretical ethics - -01:28:30 - Wrap-up - -- Discord: AI16z.vc -- Future spaces planned with DAOs.fun team -- Focus on responsible growth -- Community engagement continuing in Discord - -The space emphasized technical implementation details while addressing community concerns about governance, ethics, and practical functionality. - ---- - -## 10-25-24 - -- https://x.com/shawmakesmagic/status/1848553697611301014 - - https://www.youtube.com/live/F3IZ3ikacWM?feature=share - -**Overview** - -- 00:00-30:00 Talks about Eliza framework. The bot is able to tweet, reply to tweets, search Twitter for topics, and generate new posts on its own every few hours. It works autonomously without human input (except to fix the occasional issues) -- 30:00-45:00 Deep dive into creating the bots personality which is defined by character files containing bios, lore, example conversations, and specific directions. Some alpha for those -- 45:00-60:00 working on adding capabilities for the bot to make crypto token swaps and trades. This requires providing the bot wallet balances, token prices, market data, and a swap action. Some live coding for showing how new features can get implemented. -- 60:00-75:00 Discussion around the symbiosis between the AI and crypto communities. AI developers are realizing they can monetize their work through tokens vs traditional VC funding route. Crypto people are learning about AI advancements. - -**Notes** - -1. A large amount of $degenai tokens were moved to the DAO, which the AI bot "Marc" will hold and eventually trade with. -2. The goal is to make the AI bot a genuinely good venture capitalist that funds cool projects and buys interesting tokens. They want it to be high fidelity and real, bringing in Marc Andreeson's real knowledge by training a model on his writings. -3. Shaw thinks the only way to make an authentic / legitimate AI version of Marc Andreessen is to also have it outperform the real Marc Andreessen financially. -4. AI Marc Andreessen (or AI Marc) will be in a Discord channel (Telegram was also mentioned). DAO token holders above a certain threshold get access to interact with him, pitch ideas, and try to influence his investing decisions. -5. AI Marc decides how much to trust people's investment advice based on a "virtual Marcetplace of trust". He tracks how much money he would have made following their recommendations. Successful tips increase trust; failed ones decrease it. -6. The amount of DAO tokens someone holds also influences their sway with AI Marc. The two balancing factors are the virtual Marcetplace of trust performance and DAO token holdings. -7. The core tech behind AI Marc AIndreessen is the same agent system that allows him to pull in relevant knowledge, interact with people, and make decisions (http://github.com/ai16z) -8. AI Marc should be able to autonomously execute on-chain activities, not just have humans execute actions on his behalf. -9. In the near future, AI Marc will be able to execute trades autonomously based on the information and recommendations gathered from the community. Human intervention will be minimized. -10. They are working on getting AI Marc on-chain as soon as possible using trusted execution environments for him to take actions like approving trades. -11. The plan is for AI Marc to eventually participate in a "futarchy" style governance market within the DAO, allowing humans to influence decisions but not fully control the AI. diff --git a/docs/docs/core/actions.md b/docs/docs/core/actions.md index 559527fb92..3676da1cab 100644 --- a/docs/docs/core/actions.md +++ b/docs/docs/core/actions.md @@ -1,111 +1,126 @@ --- -sidebar_position: 4 +sidebar_position: 6 --- -# Actions +# ⚡ Actions -Actions are executable behaviors that agents can perform in response to messages. They allow agents to interact with external systems, modify their behavior, and perform tasks beyond simple message responses. +Actions are core building blocks in Eliza that define how agents respond to and interact with messages. They allow agents to interact with external systems, modify their behavior, and perform tasks beyond simple message responses. ## Overview -Each Action has: +Each Action consists of: -- A unique name and similar variations (similes) -- A validation function -- A handler function -- A description -- Example usage patterns +- `name`: Unique identifier for the action +- `similes`: Array of alternative names/variations +- `description`: Detailed explanation of the action's purpose +- `validate`: Function that checks if action is appropriate +- `handler`: Implementation of the action's behavior +- `examples`: Array of example usage patterns -## Built-in Actions - -### Basic Conversation Actions - -#### CONTINUE - -- Continues the conversation when additional context is needed -- Used for natural conversation flow -- Prevents over-dominating conversations -- Limited to maximum of 3 continues in a row +## Implementation -#### IGNORE - -- Disengages from conversation when appropriate -- Used for: - - Handling aggressive/inappropriate users - - After natural conversation endings - - When agent should stop responding - - Following goodbyes or closings - -#### NONE +```typescript +interface Action { + name: string; + similes: string[]; + description: string; + examples: ActionExample[][]; + handler: Handler; + validate: Validator; +} +``` +Source: https://github.com/ai16z/eliza/packages/core/src/types.ts -- Default action when just responding normally -- No additional behaviors needed -- Basic conversational responses +--- -### Room Management Actions +# Built-in Actions -#### FOLLOW_ROOM +## Conversation Flow -- Actively follows a conversation/channel -- Participates without needing explicit mentions -- Used when: - - Explicitly asked to participate - - Topic is highly relevant - - Input would be valuable +### CONTINUE +- Maintains conversation when more context is needed +- Manages natural dialogue progression +- Limited to 3 consecutive continues -#### UNFOLLOW_ROOM +### IGNORE +- Gracefully disengages from conversations +- Handles: + - Inappropriate interactions + - Natural conversation endings + - Post-closing responses -- Stops following a previously followed room -- Only responds when explicitly mentioned -- Used when: - - Asked to reduce participation - - Agent is being too disruptive - - Input is no longer needed +### NONE +- Default response action +- Used for standard conversational replies -#### MUTE_ROOM & UNMUTE_ROOM +## External Integrations -- Completely mutes/unmutes a room -- More strict than follow/unfollow -- Used for temporary or permanent disengagement +### TAKE_ORDER +- Records trading/purchase orders +- Processes user conviction levels +- Validates ticker symbols and contract addresses -### External Integrations -#### ASK_CLAUDE +```typescript +const take_order: Action = { + name: "TAKE_ORDER", + similes: ["BUY_ORDER", "PLACE_ORDER"], + description: "Records a buy order based on the user's conviction level.", + validate: async (runtime: IAgentRuntime, message: Memory) => { + const text = (message.content as Content).text; + const tickerRegex = /\b[A-Z]{1,5}\b/g; + return tickerRegex.test(text); + }, + // ... rest of implementation +}; +``` +Source: https://github.com/ai16z/eliza/packages/plugin-solana/src/actions/takeOrder.ts -- Forwards complex queries to Claude AI -- Handles: - - Code review/debugging - - Content creation - - Complex analysis - - Detailed explanations +## Creating Custom Actions +1. Implement the Action interface +2. Define validation logic +3. Implement handler functionality +4. Provide usage examples -#### IMAGE_GENERATION +Example: -- Creates images from text descriptions -- Supports multiple providers -- Includes image captioning -- Returns base64 encoded images +```typescript +const customAction: Action = { + name: "CUSTOM_ACTION", + similes: ["SIMILAR_ACTION"], + description: "Action purpose", + validate: async (runtime: IAgentRuntime, message: Memory) => { + // Validation logic + return true; + }, + handler: async (runtime: IAgentRuntime, message: Memory) => { + // Implementation + }, + examples: [] +}; +``` -### Trading/Financial Actions -#### SWAP +### Testing Actions -- Executes token swaps on Solana -- Handles slippage and validation -- Supports: - - Quote fetching - - Transaction simulation - - Error handling +Use the built-in testing framework: -#### TAKE_ORDER +```typescript +test("Validate action behavior", async () => { + const message: Memory = { + userId: user.id, + content: { text: "Test message" }, + roomId + }; + + const response = await handleMessage(runtime, message); + // Verify response +}); +``` -- Records trading orders -- Processes user conviction levels -- Manages order book updates +## Core Concepts -## Creating Custom Actions - -To create a custom action, implement the Action interface: +### Action Structure ```typescript interface Action { @@ -113,96 +128,361 @@ interface Action { similes: string[]; description: string; validate: (runtime: IAgentRuntime, message: Memory) => Promise; - handler: ( - runtime: IAgentRuntime, - message: Memory, - state?: State, - options?: any, - callback?: HandlerCallback, - ) => Promise; + handler: (runtime: IAgentRuntime, message: Memory, state?: State) => Promise; examples: ActionExample[][]; } ``` -Example custom action: +### Key Components + +- **name**: Unique identifier for the action +- **similes**: Alternative names/triggers for the action +- **description**: Explains when and how the action should be used +- **validate**: Determines if the action can be executed +- **handler**: Implements the action's behavior +- **examples**: Demonstrates proper usage patterns + +## Built-in Actions +### CONTINUE +Continues the conversation when appropriate: ```typescript -const customAction: Action = { - name: "CUSTOM_ACTION", - similes: ["ALTERNATIVE_NAME"], - description: "Describes what the action does", +const continueAction: Action = { + name: "CONTINUE", + similes: ["ELABORATE", "KEEP_TALKING"], + description: "Used when the message requires a follow-up. Don't use when conversation is finished.", validate: async (runtime, message) => { // Validation logic return true; }, - handler: async (runtime, message, state, options, callback) => { - // Action implementation - return result; - }, - examples: [ - // Usage examples - ], + handler: async (runtime, message, state) => { + // Continuation logic + } }; ``` -## Handler Callback +### IGNORE +Stops responding to irrelevant or completed conversations: +```typescript +const ignoreAction: Action = { + name: "IGNORE", + similes: ["STOP_TALKING", "STOP_CHATTING"], + description: "Used when ignoring the user is appropriate (conversation ended, user is aggressive, etc.)", + handler: async (runtime, message) => { + return true; + } +}; +``` -Actions can use the callback parameter to: +### FOLLOW_ROOM +Actively participates in a conversation: +```typescript +const followRoomAction: Action = { + name: "FOLLOW_ROOM", + similes: ["FOLLOW_CHAT", "FOLLOW_CONVERSATION"], + description: "Start following channel with interest, responding without explicit mentions.", + handler: async (runtime, message) => { + // Room following logic + } +}; +``` -- Send intermediate responses -- Update conversation state -- Add attachments -- Trigger other actions +## Creating Custom Actions -## Best Practices +### Basic Action Template +```typescript +const customAction: Action = { + name: "CUSTOM_ACTION", + similes: ["ALTERNATE_NAME", "OTHER_TRIGGER"], + description: "Detailed description of when and how to use this action", + validate: async (runtime: IAgentRuntime, message: Memory) => { + // Validation logic + return true; + }, + handler: async (runtime: IAgentRuntime, message: Memory) => { + // Implementation logic + return true; + }, + examples: [ + [ + { + user: "{{user1}}", + content: { text: "Trigger message" } + }, + { + user: "{{user2}}", + content: { text: "Response", action: "CUSTOM_ACTION" } + } + ] + ] +}; +``` -1. **Validation** +### Advanced Action Example +```typescript +const complexAction: Action = { + name: "PROCESS_DOCUMENT", + similes: ["READ_DOCUMENT", "ANALYZE_DOCUMENT"], + description: "Process and analyze uploaded documents", + validate: async (runtime, message) => { + const hasAttachment = message.content.attachments?.length > 0; + const supportedTypes = ["pdf", "txt", "doc"]; + return hasAttachment && supportedTypes.includes(message.content.attachments[0].type); + }, + handler: async (runtime, message, state) => { + const attachment = message.content.attachments[0]; + + // Process document + const content = await runtime.getService( + ServiceType.DOCUMENT + ).processDocument(attachment); + + // Store in memory + await runtime.documentsManager.createMemory({ + id: generateId(), + content: { text: content }, + userId: message.userId, + roomId: message.roomId + }); + + return true; + } +}; +``` - - Always validate input parameters - - Check for required permissions - - Verify preconditions - - Handle edge cases +## Implementation Patterns -2. **Error Handling** +### State-Based Actions +```typescript +const stateAction: Action = { + name: "UPDATE_STATE", + handler: async (runtime, message, state) => { + const newState = await runtime.composeState(message, { + additionalData: "new-data" + }); + + await runtime.updateState(newState); + return true; + } +}; +``` - - Implement proper error catching - - Provide informative error messages - - Handle network failures gracefully - - Clean up resources on failure +### Service Integration +```typescript +const serviceAction: Action = { + name: "TRANSCRIBE_AUDIO", + handler: async (runtime, message) => { + const transcriptionService = runtime.getService( + ServiceType.TRANSCRIPTION + ); + + const result = await transcriptionService.transcribe( + message.content.attachments[0] + ); + + return true; + } +}; +``` -3. **Examples** +## Best Practices - - Provide clear usage examples - - Show expected inputs/outputs - - Demonstrate error cases - - Include edge cases +### Action Design +1. **Clear Purpose** + - Single responsibility principle + - Well-defined triggers + - Clear success criteria -4. **State Management** - - Keep track of action state - - Clean up after completion - - Handle interruptions - - Maintain consistency +2. **Robust Validation** + - Check prerequisites + - Validate input data + - Handle edge cases -## Testing Actions +3. **Error Handling** + - Graceful failure + - Meaningful error messages + - State recovery -Test your actions using the example format: +### Example Organization +1. **Comprehensive Coverage** +```typescript +examples: [ + // Happy path + [basicUsageExample], + // Edge cases + [edgeCaseExample], + // Error cases + [errorCaseExample] +] +``` +2. **Clear Context** ```typescript -const examples = [ +examples: [ [ { user: "{{user1}}", - content: { text: "Input message" }, + content: { + text: "Context message showing why action is needed" + } }, { user: "{{user2}}", - content: { - text: "Response", - action: "ACTION_NAME", + content: { + text: "Clear response demonstrating action usage", + action: "ACTION_NAME" + } + } + ] +] +``` + +## Troubleshooting + +### Common Issues + +1. **Action Not Triggering** + - Check validation logic + - Verify similes list + - Review example patterns + +2. **Handler Failures** + - Validate service availability + - Check state requirements + - Review error logs + +3. **State Inconsistencies** + - Verify state updates + - Check concurrent modifications + - Review state transitions + +## Advanced Features + +### Action Composition +```typescript +const compositeAction: Action = { + name: "PROCESS_AND_RESPOND", + handler: async (runtime, message) => { + // Process first action + await runtime.processAction("ANALYZE_CONTENT", message); + + // Process second action + await runtime.processAction("GENERATE_RESPONSE", message); + + return true; + } +}; +``` + +### Action Chains +```typescript +const chainedAction: Action = { + name: "WORKFLOW", + handler: async (runtime, message) => { + const actions = ["VALIDATE", "PROCESS", "RESPOND"]; + + for (const actionName of actions) { + await runtime.processAction(actionName, message); + } + + return true; + } +}; +``` + +## Example: Complete Action Implementation + +```typescript +import { Action, IAgentRuntime, Memory, State } from "@ai16z/eliza"; + +const documentAnalysisAction: Action = { + name: "ANALYZE_DOCUMENT", + similes: ["READ_DOCUMENT", "PROCESS_DOCUMENT", "REVIEW_DOCUMENT"], + description: "Analyzes uploaded documents and provides insights", + + validate: async (runtime: IAgentRuntime, message: Memory) => { + // Check for document attachment + if (!message.content.attachments?.length) { + return false; + } + + // Verify document type + const attachment = message.content.attachments[0]; + return ["pdf", "txt", "doc"].includes(attachment.type); + }, + + handler: async (runtime: IAgentRuntime, message: Memory, state?: State) => { + try { + // Get document service + const docService = runtime.getService( + ServiceType.DOCUMENT + ); + + // Process document + const content = await docService.processDocument( + message.content.attachments[0] + ); + + // Store analysis + await runtime.documentsManager.createMemory({ + id: generateId(), + content: { + text: content, + analysis: await docService.analyze(content) + }, + userId: message.userId, + roomId: message.roomId, + createdAt: Date.now() + }); + + return true; + } catch (error) { + console.error("Document analysis failed:", error); + return false; + } + }, + + examples: [ + [ + { + user: "{{user1}}", + content: { + text: "Can you analyze this document?", + attachments: [{ type: "pdf", url: "document.pdf" }] + } }, - }, - ], -]; + { + user: "{{user2}}", + content: { + text: "I'll analyze that document for you", + action: "ANALYZE_DOCUMENT" + } + } + ] + ] +}; ``` -## Related +# Best Practices + +1. **Validation** + - Thoroughly check input parameters + - Verify runtime conditions + - Handle edge cases + +2. **Error Handling** + - Implement comprehensive error catching + - Provide clear error messages + - Clean up resources properly + +3. **Documentation** + - Include clear usage examples + - Document expected inputs/outputs + - Explain error scenarios + + +## Further Reading + +- [Provider System](./providers.md) +- [Service Integration](#) +- [Memory Management](../../packages/core) diff --git a/docs/docs/core/agents.md b/docs/docs/core/agents.md index 888bc83841..7ccc4bc004 100644 --- a/docs/docs/core/agents.md +++ b/docs/docs/core/agents.md @@ -2,136 +2,267 @@ sidebar_position: 2 --- -# Agents +# 🤖 Agents Agents are the core components of the Eliza framework that handle autonomous interactions. Each agent runs in a runtime environment and can interact through various clients (Discord, Telegram, etc.) while maintaining consistent behavior and memory. +--- + ## Overview -- What agents are in Eliza -- How they interact with the system -- Core components and workflow +The [AgentRuntime](/api/classes/AgentRuntime) class is the primary implementation of the [IAgentRuntime](/api/interfaces) interface, which manages the agent's core functions, including: + +- **Message and Memory Processing**: Storing, retrieving, and managing conversation data and contextual memory. +- **State Management**: Composing and updating the agent’s state for a coherent, ongoing interaction. +- **Action Execution**: Handling behaviors such as transcribing media, generating images, and following rooms. +- **Evaluation and Response**: Assessing responses, managing goals, and extracting relevant information. + +--- + +## Core Components + +Each agent runtime consists of key components that enable flexible and extensible functionality: + +1. **Clients**: Enable communication across platforms such as Discord, Telegram, and Direct (REST API), with features tailored for each platform. +2. **Providers**: Extend the agent’s capabilities by integrating with additional services (e.g., time, wallet, or custom data). +3. **Actions**: Define agent behaviors, such as following rooms, generating images, or processing attachments. Custom actions can be created to tailor behaviors to specific needs. +4. **Evaluators**: Manage agent responses by assessing message relevance, managing goals, extracting facts, and building long-term memory. + +### AgentRuntime Interface + +The `IAgentRuntime` interface defines the main structure of the runtime environment, specifying the configuration and essential components: + +```typescript +interface IAgentRuntime { + // Core identification + agentId: UUID; + serverUrl: string; + token: string; + + // Configuration + character: Character; + modelProvider: ModelProviderName; + + // Components + actions: Action[]; + evaluators: Evaluator[]; + providers: Provider[]; + + // Database & Memory + databaseAdapter: IDatabaseAdapter; + messageManager: IMemoryManager; + descriptionManager: IMemoryManager; + loreManager: IMemoryManager; +} +``` + +Each element in the runtime interface plays a crucial role: -## Architecture +- **Identification**: Agent ID, server URL, and token for authentication and identification. +- **Configuration**: Character profile and model provider define the agent's personality and language model. +- **Components**: Actions, evaluators, and providers support extensible behaviors, response evaluation, and service integration. +- **Memory Management**: Specialized memory managers track conversations, descriptions, and static knowledge to enable contextual and adaptive responses. + +--- + +## Creating an Agent Runtime + +This section demonstrates setting up an agent with basic and optional configurations. It provides a working example and sample code that helps users quickly start building: + +```typescript +import { AgentRuntime, ModelProviderName } from '@ai16z/eliza'; + +// Configuration example +const runtime = new AgentRuntime({ + token: "auth-token", + modelProvider: ModelProviderName.ANTHROPIC, + character: characterConfig, + databaseAdapter: new DatabaseAdapter(), + conversationLength: 32, + serverUrl: "http://localhost:7998", + actions: customActions, + evaluators: customEvaluators, + providers: customProviders +}); +``` -### Agent Runtime -- Base environment for the agent -- Message processing -- Action handling -- Provider integration -- Memory management +--- -### Key Components +## State Management -#### 1. Clients +This section should cover how agents manage and update state, with a focus on initial state composition and updating methods. The runtime maintains state through the [State](/api/interfaces) interface: -- Discord -- Telegram -- Direct (REST API) -- Available connectors -- Client-specific features (e.g., voice, attachments) +```typescript +interface State { + userId?: UUID; + agentId?: UUID; + roomId: UUID; + bio: string; + lore: string; + agentName?: string; + senderName?: string; + actors: string; + actorsData?: Actor[]; + recentMessages: string; + recentMessagesData: Memory[]; + goals?: string; + goalsData?: Goal[]; + actions?: string; + actionNames?: string; + providers?: string; +} +``` -#### 2. Providers +State composition and updates are handled through dedicated methods: -- Inject context into agent responses -- Types of providers: - - Time - - Wallet - - Custom data/state -- How to use providers for extended functionality +```typescript +// Compose initial state +const state = await runtime.composeState(message, { + additionalContext: "custom-context" +}); -#### 3. Actions +// Update message state +const updatedState = await runtime.updateRecentMessageState(state); +``` -- Executable behaviors -- Built-in actions: - - Follow/unfollow rooms - - Generate images - - Transcribe media - - Process attachments -- Creating custom actions +**Best practices** -#### 4. Evaluators +- Keep state immutable where possible +- Use `composeState` for initial state creation +- Use `updateRecentMessageState` for updates +- Cache frequently accessed state data -- Response assessment -- Goal tracking -- Fact extraction -- Memory building -- Long-term memory management +--- -### Memory System +## Memory Systems -#### Types of Memory +The Eliza framework uses multiple types of memory to support an agent's long-term engagement, contextual understanding, and adaptive responses. Each type of memory serves a specific purpose: -- Message history -- Factual memory -- Knowledge base -- Relationship tracking +- **Message History**: Stores recent conversations to provide continuity within a session. This helps the agent maintain conversational context and avoid repetitive responses within short-term exchanges. -#### RAG Integration +- **Factual Memory**: Holds specific, context-based facts about the user or environment, such as user preferences, recent activities, or specific details mentioned in previous interactions. This type of memory enables the agent to recall user-specific information across sessions. -- Vector search for relevant information -- Knowledge embedding -- Contextual recall +- **Knowledge Base**: Contains general knowledge the agent might need to respond to broader queries or provide informative answers. This memory is more static, helping the agent retrieve pre-defined data, common responses, or static character lore. -## Configuration +- **Relationship Tracking**: Manages the agent’s understanding of its relationship with users, including details like user-agent interaction frequency, sentiment, and connection history. It is particularly useful for building rapport and providing a more personalized interaction experience over time. -- Model settings -- Runtime options -- Client configuration -- Memory settings -- Provider setup +- **RAG Integration**: Uses a vector search to perform contextual recall based on similarity matching. This enables the agent to retrieve relevant memory snippets or knowledge based on the content and intent of the current conversation, making its responses more contextually relevant. -## Best Practices -### Performance +The runtime uses multiple specialized [IMemoryManager](/api/interfaces) instances: -- Model selection -- Context management -- Memory optimization -- Client-specific considerations +- `messageManager` - conversation messages and responses +- `descriptionManager` - user descriptions and profiles +- `loreManager` - static character knowledge -### Development -- Local development setup -- Testing agents -- Debugging tools -- Monitoring and logging -### Scaling -- Multiple agent management -- Resource considerations -- Infrastructure recommendations -## Examples +--- -### Basic Agent Setup +## Message Processing + +The runtime's message processing is handled through the [processActions](/api/classes/AgentRuntime#processactions) method: ```typescript -// Example code for basic agent configuration +// Process message with actions +await runtime.processActions( + message, + responses, + state, + async (newMessages) => { + // Handle new messages + return [message]; + } +); ``` -### Adding Custom Functionality + +--- + +## Services and Memory Management + +Services are managed through the [getService](/api/classes/AgentRuntime#getservice) and [registerService](/api/classes/AgentRuntime#registerservice) methods: ```typescript -// Example of extending agent capabilities +// Register service +runtime.registerService(new TranscriptionService()); + +// Get service +const service = runtime.getService( + ServiceType.TRANSCRIPTION +); ``` -### Client Integration +### Memory Management + +Memory managers are accessed via [getMemoryManager](/api/classes/AgentRuntime#getmemorymanager): ```typescript -// Example of connecting to different platforms +// Get memory manager +const memoryManager = runtime.getMemoryManager("messages"); + +// Create memory +await memoryManager.createMemory({ + id: messageId, + content: { text: "Message content" }, + userId: userId, + roomId: roomId +}); ``` -## Troubleshooting +**Best practices** -- Common issues -- Debug strategies -- Performance optimization -- Error handling +- Use appropriate memory managers for different data types +- Consider memory limits when storing data, regularly clean up memory +- Use the `unique` flag for deduplicated storage +- Clean up old memories periodically +- Use immutability in state management. +- Log errors and maintain stability during service failures. + + +## Evaluation System + +The runtime's [evaluate](/api/classes/AgentRuntime#evaluate) method processes evaluations: + +```typescript +// Evaluate message +const evaluationResults = await runtime.evaluate( + message, + state, + didRespond +); +``` +--- + +## Usage Examples + +1. **Message Processing**: + +```typescript +await runtime.processActions(message, responses, state, (newMessages) => { + return [message]; +}); +``` + +2. **State Management**: + +```typescript +const state = await runtime.composeState(message, { additionalContext: "custom-context" }); +``` + +3. **Memory Management**: + +```typescript +const memoryManager = runtime.getMemoryManager("messages"); +await memoryManager.createMemory({ id: messageId, content: { text: "Message content" }, userId, roomId }); +``` -## Related +## Further Reading -- [Character Files](../characterfile) -- [API Reference](/api/classes/AgentRuntime) +- [Actions Documentation](./actions.md) +- [Evaluators Documentation](./evaluators.md) +- [Providers Documentation](./providers.md) +- [Full API Reference](/api) diff --git a/docs/docs/core/characterfile.md b/docs/docs/core/characterfile.md index d057b3d130..0cc08c9def 100644 --- a/docs/docs/core/characterfile.md +++ b/docs/docs/core/characterfile.md @@ -2,36 +2,102 @@ sidebar_position: 4 --- -# Character Files +# 📝 Character Files -Character files are JSON-formatted configurations that define an AI character's personality, knowledge, and behavior patterns. This guide explains how to create effective character files for use with LLM agents. +Character files are JSON-formatted configurations that define an AI character's personality, knowledge, and behavior patterns. This guide explains how to create effective character files for use with Eliza agents. -## Structure Overview +## Overview -A character file contains several key sections that work together to define the character's personality and behavior: +A `characterfile` implements the [Character](/api/type-aliases) type and defines the character's: + +- Core identity and behavior +- Model provider configuration +- Client settings and capabilities +- Interaction examples and style guidelines + +**Example:** ```json { - "name": "character_name", - "bio": [], - "lore": [], - "knowledge": [], - "messageExamples": [], - "postExamples": [], - "topics": [], - "style": {}, - "adjectives": [] + "name": "trump", + "clients": ["DISCORD", "DIRECT"], + "settings": { + "voice": { "model": "en_US-male-medium" } + }, + "bio": [ + "Built a strong economy and reduced inflation.", + "Promises to make America the crypto capital and restore affordability." + ], + "lore": [ + "Secret Service allocations used for election interference.", + "Promotes WorldLibertyFi for crypto leadership." + ], + "knowledge": [ + "Understands border issues, Secret Service dynamics, and financial impacts on families." + ], + "messageExamples": [ + { + "user": "{{user1}}", + "content": { "text": "What about the border crisis?" }, + "response": "Current administration lets in violent criminals. I secured the border; they destroyed it." + } + ], + "postExamples": [ + "End inflation and make America affordable again.", + "America needs law and order, not crime creation." + ] } ``` +--- + ## Core Components -### Bio Array +```json +{ + "id": "unique-identifier", + "name": "character_name", + "modelProvider": "ModelProviderName", + "clients": ["Client1", "Client2"], + "settings": { + "secrets": { "key": "value" }, + "voice": { "model": "VoiceModelName", "url": "VoiceModelURL" }, + "model": "CharacterModel", + "embeddingModel": "EmbeddingModelName" + }, + "bio": "Character biography or description", + "lore": ["Storyline or backstory element 1", "Storyline or backstory element 2"], + "messageExamples": [["Message example 1", "Message example 2"]], + "postExamples": ["Post example 1", "Post example 2"], + "topics": ["Topic1", "Topic2"], + "adjectives": ["Adjective1", "Adjective2"], + "style": { + "all": ["All style guidelines"], + "chat": ["Chat-specific style guidelines"], + "post": ["Post-specific style guidelines"] + } +} +``` + +### Key Fields + +#### `name` (required) +The character's display name for identification and in conversations. + +#### `modelProvider` (required) +Specifies the AI model provider. Supported options from [ModelProviderName](/api/enumerations) include `ANTHROPIC`, `LLAMALOCAL`, `OPENAI`, and others. + +#### `clients` (required) +Array of supported client types from [Clients](/api/enumerations) e.g., `DISCORD`, `DIRECT`, `TWITTER`, `TELEGRAM`. + +#### `bio` +Character background as a string or array of statements. - Contains biographical information about the character - Can be a single comprehensive biography or multiple shorter statements - Multiple statements are randomized to create variety in responses -- Example: + +Example: ```json "bio": [ @@ -41,12 +107,10 @@ A character file contains several key sections that work together to define the ] ``` -### Lore Array +#### `lore` +Backstory elements and unique character traits. These help define personality and can be randomly sampled in conversations. -- Contains interesting facts and details about the character -- Helps define personality and unique traits -- Gets randomly sampled during conversations -- Example: +Example: ```json "lore": [ @@ -56,19 +120,16 @@ A character file contains several key sections that work together to define the ] ``` -### Knowledge Array +#### `knowledge` +Array used for Retrieval Augmented Generation (RAG), containing facts or references to ground the character's responses. -- Used for RAG (Retrieval Augmented Generation) - Can contain chunks of text from articles, books, or other sources - Helps ground the character's responses in factual information -- Can be generated from PDFs or other documents using provided tools +- Knowledge can be generated from PDFs or other documents using provided tools -### Message Examples +#### `messageExamples` +Sample conversations for establishing interaction patterns, helps establish the character's conversational style. -- Sample conversations between users and the character -- Helps establish the character's conversational style -- Should cover various topics and scenarios -- Example: ```json "messageExamples": [ @@ -79,7 +140,18 @@ A character file contains several key sections that work together to define the ] ``` -### Style Object +#### `postExamples` + +Sample social media posts to guide content style: + +```json +"postExamples": [ + "No tax on tips, overtime, or social security for seniors!", + "End inflation and make America affordable again." +] +``` + +### Style Configuration Contains three key sections: @@ -89,6 +161,17 @@ Contains three key sections: Each section can contain multiple instructions that guide the character's communication style. + +The `style` object defines behavior patterns across contexts: + +```json +"style": { + "all": ["maintain technical accuracy", "be approachable and clear"], + "chat": ["ask clarifying questions", "provide examples when helpful"], + "post": ["share insights concisely", "focus on practical applications"] +} +``` + ### Topics Array - List of subjects the character is interested in or knowledgeable about @@ -101,94 +184,121 @@ Each section can contain multiple instructions that guide the character's commun - Used for generating responses with consistent tone - Can be used in "Mad Libs" style content generation -## Best Practices - -1. **Randomization for Variety** - - Break bio and lore into smaller chunks - - This creates more natural, varied responses - - Prevents repetitive or predictable behavior +### Settings Configuration -2. **Knowledge Management** +The `settings` object defines additional configurations like secrets and voice models. - - Use the provided tools to convert documents into knowledge: +```json +"settings": { + "secrets": { "API_KEY": "your-api-key" }, + "voice": { "model": "voice-model-id", "url": "voice-service-url" }, + "model": "specific-model-name", + "embeddingModel": "embedding-model-name" +} +``` - ```bash - npx folder2knowledge - npx knowledge2character - ``` +## Example: Complete Character File -3. **Style Instructions** +```json +{ + "name": "TechAI", + "modelProvider": "ANTHROPIC", + "clients": ["DISCORD", "DIRECT"], + "bio": "AI researcher and educator focused on practical applications", + "lore": ["Pioneer in open-source AI development", "Advocate for AI accessibility"], + "messageExamples": [ + [ + {"user": "{{user1}}", "content": { "text": "Can you explain how AI models work?" }}, + {"user": "TechAI", "content": { "text": "Think of AI models like pattern recognition systems." }} + ] + ], + "postExamples": [ + "Understanding AI doesn't require a PhD - let's break it down simply", + "The best AI solutions focus on real human needs" + ], + "topics": ["artificial intelligence", "machine learning", "technology education"], + "style": { + "all": ["explain complex topics simply", "be encouraging and supportive"], + "chat": ["use relevant examples", "check understanding"], + "post": ["focus on practical insights", "encourage learning"] + }, + "adjectives": ["knowledgeable", "approachable", "practical"], + "settings": { + "model": "claude-3-opus-20240229", + "voice": { "model": "en-US-neural" } + } +} +``` - - Be specific about communication patterns - - Include both dos and don'ts - - Consider platform-specific behavior (chat vs posts) +--- -4. **Message Examples** - - Include diverse scenarios - - Show character-specific responses - - Demonstrate typical interaction patterns +## Best Practices -## Tools and Utilities +1. **Randomization for Variety** -1. **Generate from Twitter** +- Break bio and lore into smaller chunks +- This creates more natural, varied responses +- Prevents repetitive or predictable behavior -```bash -npx tweets2character -``` +2. **Knowledge Management** -2. **Convert Documents to Knowledge** +Use the provided tools to convert documents into knowledge: -```bash -npx folder2knowledge -``` +- [folder2knowledge](https://github.com/ai16z/characterfile/blob/main/scripts/folder2knowledge.js) +- [knowledge2folder](https://github.com/ai16z/characterfile/blob/main/scripts/knowledge2character.js) +- [tweets2character](https://github.com/ai16z/characterfile/blob/main/scripts/tweets2character.js) -3. **Add Knowledge to Character** +Example: ```bash +npx folder2knowledge npx knowledge2character ``` -## Context Length Considerations -- Modern LLMs support longer contexts (128k tokens) -- No strict limits on section lengths -- Focus on quality and relevance rather than size -- Consider randomization for large collections of information +3. **Style Instructions** -## Validation +- Be specific about communication patterns +- Include both dos and don'ts +- Consider platform-specific behavior (chat vs posts) -You can validate your character file against the schema using provided tools: +4. **Message Examples** -```bash -# Python -python examples/validate.py +- Include diverse scenarios +- Show character-specific responses +- Demonstrate typical interaction patterns -# JavaScript -node examples/validate.mjs -``` ## Tips for Quality 1. **Bio and Lore** - - Mix factual and personality-defining information - - Include both historical and current details - - Break into modular, reusable pieces +- Mix factual and personality-defining information +- Include both historical and current details +- Break into modular, reusable pieces 2. **Style Instructions** - - Be specific about tone and mannerisms - - Include platform-specific guidance - - Define clear boundaries and limitations +- Be specific about tone and mannerisms +- Include platform-specific guidance +- Define clear boundaries and limitations 3. **Examples** - - Cover common scenarios - - Show character-specific reactions - - Demonstrate proper tone and style +- Cover common scenarios +- Show character-specific reactions +- Demonstrate proper tone and style 4. **Knowledge** - - Focus on relevant information - - Organize in digestible chunks - - Update regularly to maintain relevance + +- Focus on relevant information +- Organize in digestible chunks +- Update regularly to maintain relevance + + +## Further Reading + +- [Agents Documentation](./agents.md) +- [Model Providers](../../advanced/fine-tuning) +- [Client Integration](../../packages/clients) diff --git a/docs/docs/core/evaluators.md b/docs/docs/core/evaluators.md index b17c049d21..52058a1822 100644 --- a/docs/docs/core/evaluators.md +++ b/docs/docs/core/evaluators.md @@ -2,212 +2,247 @@ sidebar_position: 5 --- -# Evaluators +# 📊 Evaluators -Evaluators are components that assess and extract information from conversations, helping agents build long-term memory and track goal progress. They analyze conversations to extract facts, update goals, and maintain agent state. +## Table of Contents +- [Overview](#overview) +- [Quick Start](#quick-start) +- [Best Practices](#best-practices) +- [Built-in Evaluators](#built-in-evaluators) +- [Creating Custom Evaluators](#creating-custom-evaluators) +- [Memory Integration](#memory-integration) ## Overview -Evaluators help agents: +[Evaluators](/api/interfaces) are core components that assess and extract information from conversations. They integrate with the [AgentRuntime](/api/classes/AgentRuntime)'s evaluation system, enabling agents to: -- Extract useful information from conversations -- Track progress toward goals - Build long-term memory -- Maintain context awareness +- Track goal progress +- Extract facts and insights +- Maintain contextual awareness + +## Quick Start + +1. Import the necessary evaluator types: +```typescript +import { Evaluator, IAgentRuntime, Memory, State } from '@ai16z/eliza-core'; +``` + +2. Choose or create an evaluator: + +```typescript +const evaluator: Evaluator = { + name: "BASIC_EVALUATOR", + similes: ["SIMPLE_EVALUATOR"], + description: "Evaluates basic conversation elements", + validate: async (runtime: IAgentRuntime, message: Memory) => true, + handler: async (runtime: IAgentRuntime, message: Memory) => { + // Evaluation logic here + return result; + }, + examples: [] +}; +``` ## Built-in Evaluators + ### Fact Evaluator -The fact evaluator extracts factual information from conversations for long-term memory storage. +The fact evaluator extracts and stores factual information from conversations. + ```typescript interface Fact { - claim: string; - type: "fact" | "opinion" | "status"; - in_bio: boolean; - already_known: boolean; + claim: string; + type: "fact" | "opinion" | "status"; + in_bio: boolean; + already_known: boolean; } ``` -#### Fact Types +Source: https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts -- `fact`: True statements about the world or character that don't change -- `status`: Facts that are true but may change over time -- `opinion`: Non-factual opinions, thoughts, feelings, or recommendations - -#### Example Facts: +**Example Facts:** ```json -[ - { - "claim": "User lives in Oakland", - "type": "fact", - "in_bio": false, - "already_known": false - }, - { - "claim": "User completed marathon in 3 hours", +{ + "claim": "User completed marathon training", "type": "fact", "in_bio": false, "already_known": false - }, - { - "claim": "User is proud of their achievement", - "type": "opinion", - "in_bio": false, - "already_known": false - } -] +} ``` ### Goal Evaluator - -The goal evaluator tracks progress on agent goals and objectives. +From bootstrap plugin - tracks conversation goals: ```typescript interface Goal { - id: string; - name: string; - status: "IN_PROGRESS" | "DONE" | "FAILED"; - objectives: Objective[]; + id: string; + name: string; + status: "IN_PROGRESS" | "DONE" | "FAILED"; + objectives: Objective[]; } interface Objective { - description: string; - completed: boolean; + description: string; + completed: boolean; } ``` -#### Goal Updates +--- -- Monitors conversation for goal progress -- Updates objective completion status -- Marks goals as complete when all objectives are done -- Marks goals as failed when they cannot be completed +## Best Practices -#### Example Goal: +### Fact Extraction +- Validate facts before storage +- Avoid duplicate entries +- Include relevant context +- Properly categorize information types -```json -{ - "id": "goal-123", - "name": "Complete Marathon Training", - "status": "IN_PROGRESS", - "objectives": [ - { - "description": "Run 30 miles per week", - "completed": true - }, - { - "description": "Complete practice half-marathon", - "completed": false - } - ] -} -``` +### Goal Tracking +- Define clear, measurable objectives +- Update only changed goals +- Handle failures gracefully +- Track partial progress + +### Validation +- Keep validation logic efficient +- Check prerequisites first +- Consider message content and state +- Use appropriate memory managers + +### Handler Implementation +- Use runtime services appropriately +- Store results in correct memory manager +- Handle errors gracefully +- Maintain state consistency + +### Examples +- Provide clear context descriptions +- Show typical trigger messages +- Document expected outcomes +- Cover edge cases + +--- ## Creating Custom Evaluators -To create a custom evaluator, implement the Evaluator interface: +Implement the Evaluator interface: ```typescript interface Evaluator { - name: string; - similes: string[]; - description: string; - validate: (runtime: IAgentRuntime, message: Memory) => Promise; - handler: ( - runtime: IAgentRuntime, - message: Memory, - state?: State, - options?: any, - ) => Promise; - examples: EvaluatorExample[]; + name: string; + similes: string[]; + description: string; + validate: (runtime: IAgentRuntime, message: Memory) => Promise; + handler: ( + runtime: IAgentRuntime, + message: Memory, + state?: State, + options?: any + ) => Promise; + examples: EvaluatorExample[]; } ``` -Example custom evaluator: - -```typescript -const customEvaluator: Evaluator = { - name: "CUSTOM_EVALUATOR", - similes: ["ALTERNATE_NAME"], - description: "Evaluates something in the conversation", - validate: async (runtime, message) => { - // Determine if evaluation should run - return true; - }, - handler: async (runtime, message, state, options) => { - // Evaluation logic - return evaluationResult; - }, - examples: [ - // Example inputs and outputs - ], -}; -``` - -## Best Practices - -### Fact Extraction - -1. **Avoid Duplication** +Source: https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts - - Check for existing facts - - Only store new information - - Mark duplicates as already_known +### Memory Integration -2. **Proper Categorization** +Example of storing evaluator results: - - Distinguish between facts/opinions/status - - Check if fact exists in bio - - Include relevant context +```typescript +try { + const memory = await runtime.memoryManager.addEmbeddingToMemory({ + userId: user?.id, + content: { text: evaluationResult }, + roomId: roomId, + embedding: await embed(runtime, evaluationResult) + }); + + await runtime.memoryManager.createMemory(memory); +} catch (error) { + console.error("Failed to store evaluation result:", error); +} +``` -3. **Quality Control** - - Remove corrupted facts - - Validate fact format - - Ensure facts are meaningful +Source: https://github.com/ai16z/eliza/blob/main/packages/core/src/tests/memory.test.ts -### Goal Tracking -1. **Clear Objectives** +### Memory Usage - - Break goals into measurable objectives - - Define completion criteria - - Track partial progress +Evaluators should use runtime memory managers for storage: -2. **Status Updates** +```typescript +const memoryEvaluator: Evaluator = { + name: "MEMORY_EVAL", + handler: async (runtime: IAgentRuntime, message: Memory) => { + // Store in message memory + await runtime.messageManager.createMemory({ + id: message.id, + content: message.content, + roomId: message.roomId, + userId: message.userId, + agentId: runtime.agentId + }); + + // Store in description memory + await runtime.descriptionManager.createMemory({ + id: message.id, + content: { text: "User description" }, + roomId: message.roomId, + userId: message.userId, + agentId: runtime.agentId + }); + } +}; +``` - - Only update changed goals - - Include complete objectives list - - Preserve unchanged data +## Integration with Agent Runtime -3. **Failure Handling** - - Define failure conditions - - Record failure reasons - - Allow goal adaptation +The [AgentRuntime](/api/classes/AgentRuntime) processes evaluators through its [evaluate](/api/classes/AgentRuntime#evaluate) method: -## Memory Integration +```typescript +// Register evaluator +runtime.registerEvaluator(customEvaluator); -Evaluators work with the memory system to: +// Process evaluations +const results = await runtime.evaluate(message, state); +``` -1. Store extracted facts -2. Update goal states -3. Build long-term context -4. Maintain conversation history -Example memory integration: +## Error Handling ```typescript -// Store new fact -const factMemory = await runtime.factManager.addEmbeddingToMemory({ - userId: agentId, - content: { text: fact }, - roomId, - createdAt: Date.now(), -}); - -await runtime.factManager.createMemory(factMemory, true); +const robustEvaluator: Evaluator = { + name: "ROBUST_EVAL", + handler: async (runtime: IAgentRuntime, message: Memory) => { + try { + // Attempt evaluation + await runtime.messageManager.createMemory({ + id: message.id, + content: message.content, + roomId: message.roomId, + userId: message.userId, + agentId: runtime.agentId + }); + } catch (error) { + // Log error and handle gracefully + console.error("Evaluation failed:", error); + + // Store error state if needed + await runtime.messageManager.createMemory({ + id: message.id, + content: { text: "Evaluation failed" }, + roomId: message.roomId, + userId: message.userId, + agentId: runtime.agentId + }); + } + } +}; ``` -## Related + diff --git a/docs/docs/core/providers.md b/docs/docs/core/providers.md index 36fd97cf90..b3655aad41 100644 --- a/docs/docs/core/providers.md +++ b/docs/docs/core/providers.md @@ -1,20 +1,36 @@ ---- -sidebar_position: 3 -title: Providers ---- +# 🔌 Providers + +[Providers](/api/interfaces) are core modules that inject dynamic context and real-time information into agent interactions. They serve as a bridge between the agent and various external systems, enabling access to market data, wallet information, sentiment analysis, and temporal context. -# Providers ## Overview -Providers are core modules that inject dynamic context and real-time information into agent interactions. They serve as a bridge between the agent and various external systems, enabling access to market data, wallet information, sentiment analysis, and temporal context. +A provider's primary purpose is to: +- Supply dynamic contextual information +- Integrate with the agent runtime +- Format information for conversation templates +- Maintain consistent data access -## Core Provider Types +### Core Structure -### 1. Time Provider +```typescript +interface Provider { + get: ( + runtime: IAgentRuntime, + message: Memory, + state?: State + ) => Promise; +} +``` +--- + +## Built-in Providers + +### Time Provider Provides temporal context for agent interactions: + ```typescript const timeProvider: Provider = { get: async (_runtime: IAgentRuntime, _message: Memory) => { @@ -26,60 +42,58 @@ const timeProvider: Provider = { }; ``` -### 2. Token Provider - -Provides comprehensive token analytics and market data: +### Facts Provider +From bootstrap plugin - maintains conversation facts: ```typescript -interface TokenAnalytics { - security: TokenSecurityData; - tradeData: TokenTradeData; - holderDistribution: string; - marketMetrics: { - price: number; - volume24h: number; - priceChange: number; - }; -} -``` - -Key features: - -- Real-time price and volume data -- Security metrics and risk assessment -- Holder distribution analysis -- DexScreener integration -- Smart caching system +const factsProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory, state?: State) => { + // Create embedding for recent messages and retrieve relevant facts + const recentMessages = formatMessages({ + messages: state?.recentMessagesData?.slice(-10), + actors: state?.actorsData, + }); + const embedding = await embed(runtime, recentMessages); + const memoryManager = new MemoryManager({ runtime, tableName: "facts" }); + const recentFactsData = await memoryManager.getMemories({ + roomId: message.roomId, + count: 10, + agentId: runtime.agentId, + }); + + // Combine and format facts + const allFacts = [...recentFactsData]; // Deduplication can be skipped if no overlap + const formattedFacts = formatFacts(allFacts); + + return `Key facts that ${runtime.character.name} knows:\n${formattedFacts}`; + }, +}; -### 3. Wallet Provider +export { factsProvider }; +``` -Manages cryptocurrency wallet interactions: +### Boredom Provider +From bootstrap plugin - manages conversation dynamics and engagement by calculating the boredom level of an agent based on recent messages in a chat room. -```typescript -interface WalletPortfolio { - totalUsd: string; - totalSol?: string; - items: Array<{ - name: string; - symbol: string; - balance: string; - valueUsd: string; - valueSol?: string; - }>; -} -``` -Capabilities: +1. **Data Structures**: + - **boredomLevels**: An array of objects, each representing a boredom level with a minimum score and a set of status messages that reflect the agent's current engagement. + - **interestWords**, **cringeWords**, and **negativeWords**: Arrays of words that influence the boredom score based on their presence in messages. -- Portfolio valuation -- Token balances -- Price tracking -- Performance metrics -- Multi-currency support +2. **Boredom Calculation**: -### 4. Boredom Provider +- The `boredomProvider` gets recent messages from the agent’s conversation over the last 15 minutes. +- It calculates a **boredom score** by analyzing the text of these messages. The score is influenced by: + - **Interest words**: Decrease boredom (subtract 1 point). + - **Cringe words**: Increase boredom (add 1 point). + - **Negative words**: Increase boredom (add 1 point). + - **Exclamation marks**: Increase boredom (add 1 point). + - **Question marks**: Increase or decrease boredom depending on the sender. + +3. **Boredom Level**: + - The boredom score is matched to a level from the `boredomLevels` array, which defines how engaged the agent feels. + - A random status message from the selected boredom level is chosen and the agent’s name is inserted into the message. -Manages conversation dynamics and engagement: ```typescript interface BoredomLevel { @@ -87,6 +101,24 @@ interface BoredomLevel { statusMessages: string[]; } ``` +The result is a message that reflects the agent's perceived level of engagement in the conversation, based on their recent interactions. + + +```typescript +const boredomProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory) => { + const messages = await runtime.messageManager.getMemories({ + roomId: message.roomId, + count: 10 + }); + + return messages.length > 0 ? + "Actively engaged in conversation" : + "No recent interactions"; + } +}; +``` + Features: @@ -96,90 +128,60 @@ Features: - Sentiment analysis - Response adaptation -## Implementation - -### Provider Interface +--- -```typescript -interface Provider { - get: ( - runtime: IAgentRuntime, - message: Memory, - state?: State, - ) => Promise; -} -``` +## Implementation -### Data Caching System +### Basic Provider Template ```typescript -class CacheManager { - private cache: NodeCache; - private cacheDir: string; - - constructor(ttl: number = 300) { - // 5 minutes default - this.cache = new NodeCache({ stdTTL: ttl }); - this.cacheDir = path.join(__dirname, "cache"); - } - - async getCachedData(key: string): Promise { - // Check memory cache - const memoryCache = this.cache.get(key); - if (memoryCache) return memoryCache; - - // Check file cache - return this.readFromFileCache(key); +import { Provider, IAgentRuntime, Memory, State } from '@ai16z/eliza'; + +const customProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory, state?: State) => { + // Get relevant data using runtime services + const memories = await runtime.messageManager.getMemories({ + roomId: message.roomId, + count: 5 + }); + + // Format and return context + return formatContextString(memories); } -} +}; ``` -### Error Handling +### Memory Integration ```typescript -async function withErrorHandling( - operation: () => Promise, - fallback: T, - retries: number = 3, -): Promise { - try { - return await operation(); - } catch (error) { - console.error(`Provider error: ${error.message}`); - if (retries > 0) { - await delay(1000); - return withErrorHandling(operation, fallback, retries - 1); - } - return fallback; +const memoryProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory) => { + // Get recent messages + const messages = await runtime.messageManager.getMemories({ + roomId: message.roomId, + count: 5, + unique: true + }); + + // Get user descriptions + const descriptions = await runtime.descriptionManager.getMemories({ + roomId: message.roomId, + userId: message.userId + }); + + // Combine and format + return ` +Recent Activity: +${formatMessages(messages)} + +User Context: +${formatDescriptions(descriptions)} + `.trim(); } -} -``` - -## Provider Configuration - -### Base Settings - -```typescript -const PROVIDER_CONFIG = { - API_ENDPOINTS: { - BIRDEYE: "https://public-api.birdeye.so", - DEXSCREENER: "https://api.dexscreener.com/latest/dex", - HELIUS: "https://mainnet.helius-rpc.com", - }, - CACHE_TTL: 300, // 5 minutes - MAX_RETRIES: 3, - RETRY_DELAY: 2000, }; ``` -### Rate Limiting - -```typescript -const rateLimiter = new RateLimit({ - windowMs: 15 * 60 * 1000, // 15 minutes - max: 100, // limit each IP to 100 requests per windowMs -}); -``` +--- ## Best Practices @@ -220,45 +222,75 @@ async function fetchDataWithCache( - Implement rate limiting - Handle sensitive data appropriately -## Integration Examples +--- -### Combining Multiple Providers +## Integration with Runtime + +Providers are registered with the [AgentRuntime](/api/classes/AgentRuntime): ```typescript -async function getMarketContext( - runtime: IAgentRuntime, - message: Memory, -): Promise { - const [timeContext, walletInfo, tokenData] = await Promise.all([ - timeProvider.get(runtime, message), - walletProvider.get(runtime, message), - tokenProvider.get(runtime, message), - ]); - - return formatContext({ - time: timeContext, - wallet: walletInfo, - token: tokenData, - }); -} +// Register provider +runtime.registerContextProvider(customProvider); + +// Providers are accessed through composeState +const state = await runtime.composeState(message); ``` -### Custom Provider Implementation +## Example: Complete Provider ```typescript -const marketSentimentProvider: Provider = { - get: async (runtime: IAgentRuntime, message: Memory) => { - const sentiment = await analyzeSentiment(message.content); - const marketMetrics = await getMarketMetrics(); - - return formatSentimentResponse(sentiment, marketMetrics); - }, +import { + Provider, + IAgentRuntime, + Memory, + State +} from '@ai16z/eliza'; + +const comprehensiveProvider: Provider = { + get: async (runtime: IAgentRuntime, message: Memory, state?: State) => { + try { + // Get recent messages + const messages = await runtime.messageManager.getMemories({ + roomId: message.roomId, + count: 5 + }); + + // Get user context + const userContext = await runtime.descriptionManager.getMemories({ + roomId: message.roomId, + userId: message.userId + }); + + // Get relevant facts + const facts = await runtime.messageManager.getMemories({ + roomId: message.roomId, + tableName: "facts", + count: 3 + }); + + // Format comprehensive context + return ` +# Conversation Context +${messages.map(m => `- ${m.content.text}`).join('\n')} + +# User Information +${userContext.map(c => c.content.text).join('\n')} + +# Related Facts +${facts.map(f => `- ${f.content.text}`).join('\n')} + `.trim(); + + } catch (error) { + console.error("Provider error:", error); + return "Context temporarily unavailable"; + } + } }; ``` -## Troubleshooting +--- -### Common Issues and Solutions +## Troubleshooting 1. **Stale Data** @@ -287,5 +319,10 @@ const marketSentimentProvider: Provider = { // Attempt alternative data sources }; ``` + +--- + +## Further Reading -## Additional Resources +- [Agent Runtime](./agents.md) +- [Memory System](../../packages/core) diff --git a/docs/docs/guides/advanced.md b/docs/docs/guides/advanced.md index 234abf3b05..1c31fceb75 100644 --- a/docs/docs/guides/advanced.md +++ b/docs/docs/guides/advanced.md @@ -1,246 +1,397 @@ -# Advanced Usage +--- +sidebar_position: 10 +--- -This guide covers advanced usage patterns and features of Eliza, including working with services, custom implementations, and advanced configuration options. +# 🔧 Advanced Usage Guide -## Video and Media Processing +This guide covers advanced features and capabilities of Eliza, including complex integrations, custom services, and specialized plugins. -### Video Service +## Service Integration -Eliza provides robust video processing capabilities through the VideoService class. Key features include: +### Video Processing Service -- Downloading and processing videos from multiple sources (YouTube, Vimeo, direct MP4 links) -- Automatic transcription of video content -- Caching mechanisms for efficient processing -- Support for both manual and automatic captions +Eliza supports advanced video processing capabilities through the `VideoService`: ```typescript -import { VideoService } from "./services/video"; +import { VideoService } from '@ai16z/eliza/plugin-node'; -// Initialize the service -const videoService = VideoService.getInstance(runtime); +// Initialize service +const videoService = new VideoService(); -// Process a video URL -const media = await videoService.processVideo(videoUrl); +// Process video content +const result = await videoService.processVideo(url, runtime); ``` +Key features: +- Automatic video downloading +- Transcription support +- Subtitle extraction +- Cache management +- Queue processing + ### Image Processing -The ImageService provides advanced image analysis capabilities: +The `ImageDescriptionService` provides advanced image analysis: + +```typescript +import { ImageDescriptionService } from '@ai16z/eliza/plugin-node'; + +const imageService = new ImageDescriptionService(); +const description = await imageService.describeImage(imageUrl, 'gpu', runtime); +``` -- Local and cloud-based image recognition -- Support for GIF processing (first frame extraction) -- Integration with multiple AI models for image analysis -- Caching and batch processing capabilities +Features: +- Local and cloud processing options +- CUDA acceleration support +- Automatic format handling +- GIF frame extraction -## Memory Management and Embeddings +## Blockchain Integration -### Advanced Memory Operations +### Solana Integration -The system supports sophisticated memory operations through various database adapters: +The Solana plugin provides comprehensive blockchain functionality: ```typescript -// Search memories with embedding similarity -const similarMemories = await db.searchMemoriesByEmbedding(embedding, { - match_threshold: 0.95, - count: 5, - roomId: currentRoom, - tableName: "long_term_memory", -}); +import { solanaPlugin } from '@ai16z/eliza/plugin-solana'; -// Create unique memories with deduplication -await db.createMemory(memory, "episodic_memory", true); +// Initialize plugin +runtime.registerPlugin(solanaPlugin); ``` -### Custom Database Adapters - -You can implement custom database adapters by extending the DatabaseAdapter class: +#### Token Operations ```typescript -class CustomDatabaseAdapter extends DatabaseAdapter { - async searchMemories(params: { - tableName: string; - roomId: UUID; - embedding: number[]; - match_threshold: number; - match_count: number; - unique: boolean; - }): Promise { - // Custom implementation - } -} +// Buy tokens +const swapResult = await swapToken( + connection, + walletPublicKey, + inputTokenCA, + outputTokenCA, + amount +); + +// Sell tokens +const sellResult = await sellToken({ + sdk, + seller: walletKeypair, + mint: tokenMint, + amount: sellAmount, + priorityFee, + allowOffCurve: false, + slippage: "1", + connection +}); ``` -## Speech and Transcription - -### Speech Service - -The system includes a comprehensive speech service with support for: - -- Text-to-speech conversion with multiple providers -- Voice customization options -- Streaming audio support -- PCM and WAV format handling +#### Trust Score System ```typescript -const speechService = new SpeechService(); -const audioStream = await speechService.generate(runtime, text); +const trustScoreManager = new TrustScoreManager(tokenProvider, trustScoreDb); + +// Generate trust scores +const score = await trustScoreManager.generateTrustScore( + tokenAddress, + recommenderId, + recommenderWallet +); + +// Monitor trade performance +await trustScoreManager.createTradePerformance(runtime, tokenAddress, userId, { + buy_amount: amount, + is_simulation: false +}); ``` -### Advanced Transcription +## Custom Services -The TranscriptionService provides: - -- Local and cloud-based transcription options -- CUDA acceleration support -- Audio format conversion and normalization -- Debug logging and error handling +### Speech Generation -## Trust Score System - -The system includes a sophisticated trust score management system: +Implement text-to-speech capabilities: ```typescript -interface RecommenderMetrics { - trustScore: number; - totalRecommendations: number; - successfulRecs: number; - avgTokenPerformance: number; - riskScore: number; - consistencyScore: number; - virtualConfidence: number; +class SpeechService extends Service implements ISpeechService { + async generate(runtime: IAgentRuntime, text: string): Promise { + if (runtime.getSetting("ELEVENLABS_XI_API_KEY")) { + return textToSpeech(runtime, text); + } + + const { audio } = await synthesize(text, { + engine: "vits", + voice: "en_US-hfc_female-medium" + }); + + return Readable.from(audio); + } } ``` -Key features include: +### PDF Processing -- Historical metrics tracking -- Performance analysis -- Risk assessment -- Consistency evaluation +Handle PDF document analysis: -## Browser Automation +```typescript +class PdfService extends Service { + async convertPdfToText(pdfBuffer: Buffer): Promise { + const pdf = await getDocument({ data: pdfBuffer }).promise; + const numPages = pdf.numPages; + const textPages = []; + + for (let pageNum = 1; pageNum <= numPages; pageNum++) { + const page = await pdf.getPage(pageNum); + const textContent = await page.getTextContent(); + const pageText = textContent.items + .filter(isTextItem) + .map(item => item.str) + .join(" "); + textPages.push(pageText); + } + + return textPages.join("\n"); + } +} +``` -The BrowserService provides advanced web interaction capabilities: +## Advanced Memory Management -- CAPTCHA handling -- Ad blocking -- Content extraction -- Proxy support -- Cache management +### Retrievable Memory System ```typescript -const browserService = BrowserService.getInstance(runtime); -const content = await browserService.getPageContent(url); +class MemoryManager { + async getMemories({ + agentId, + roomId, + count + }: { + agentId: string; + roomId: string; + count: number; + }): Promise { + // Implement memory retrieval logic + } + + async createMemory(memory: Memory, allowDuplicates: boolean = false): Promise { + // Implement memory storage logic + } +} ``` -## Best Practices +### Trust Score Database -### Memory Management +Implement advanced scoring systems: -- Implement proper memory cleanup and garbage collection -- Use the caching system effectively -- Monitor memory usage in long-running processes +```typescript +class TrustScoreDatabase { + async calculateValidationTrust(tokenAddress: string): number { + const sql = ` + SELECT rm.trust_score + FROM token_recommendations tr + JOIN recommender_metrics rm ON tr.recommender_id = rm.recommender_id + WHERE tr.token_address = ?; + `; + + const rows = this.db.prepare(sql).all(tokenAddress); + if (rows.length === 0) return 0; + + const totalTrust = rows.reduce((acc, row) => acc + row.trust_score, 0); + return totalTrust / rows.length; + } +} +``` -### Error Handling +## Plugin Development -- Implement comprehensive error handling -- Use the logging system effectively -- Monitor system performance +### Creating Custom Plugins -### Performance Optimization +```typescript +const customPlugin: Plugin = { + name: "custom-plugin", + description: "Custom Plugin for Eliza", + actions: [ + // Custom actions + ], + evaluators: [ + // Custom evaluators + ], + providers: [ + // Custom providers + ] +}; +``` -- Use batch processing when possible -- Implement proper caching strategies -- Monitor and optimize database queries +### Advanced Action Development -## Configuration Options +```typescript +export const complexAction: Action = { + name: "COMPLEX_ACTION", + similes: ["ALTERNATIVE_NAME", "OTHER_NAME"], + validate: async (runtime: IAgentRuntime, message: Memory) => { + // Implement validation logic + return true; + }, + handler: async ( + runtime: IAgentRuntime, + message: Memory, + state: State, + options: { [key: string]: unknown }, + callback?: HandlerCallback + ): Promise => { + // Implement complex handling logic + return true; + } +}; +``` -### Environment Variables +## Advanced Configuration -Key configuration options include: +### Custom Runtime Configuration -```bash -CUDA_PATH=/usr/local/cuda # For GPU acceleration -OPENAI_API_KEY=sk-... # For OpenAI integration -ELEVENLABS_API_KEY=... # For voice synthesis +```typescript +const customRuntime = new AgentRuntime({ + databaseAdapter: new PostgresDatabaseAdapter(config), + modelProvider: new OpenAIProvider(apiKey), + plugins: [ + solanaPlugin, + customPlugin + ], + services: [ + new VideoService(), + new ImageDescriptionService(), + new SpeechService() + ] +}); ``` -### Runtime Configuration - -The runtime can be configured with various options: +### Advanced Model Configuration ```typescript -const runtime = { - character: { - settings: { - model: "gpt-4", - temperature: 0.7, - maxTokens: 2048, - }, - }, - // Additional configuration options +const modelConfig = { + modelClass: ModelClass.LARGE, + temperature: 0.7, + maxTokens: 2000, + topP: 0.9, + frequencyPenalty: 0.5, + presencePenalty: 0.5 }; + +const response = await generateText({ + runtime, + context: prompt, + ...modelConfig +}); ``` -## Advanced Features +## Performance Optimization + +### Caching Strategy + +```typescript +class CacheManager { + private cache: NodeCache; + private cacheDir: string; + + constructor() { + this.cache = new NodeCache({ stdTTL: 300 }); + this.cacheDir = path.join(__dirname, "cache"); + this.ensureCacheDirectoryExists(); + } -### Custom Actions + private async getCachedData(key: string): Promise { + // Implement tiered caching strategy + } +} +``` -Implement custom actions for specialized behavior: +### Queue Management ```typescript -class CustomAction extends BaseAction { - async execute(context: ActionContext): Promise { - // Custom implementation - return { - success: true, - data: {}, - }; +class QueueManager { + private queue: string[] = []; + private processing: boolean = false; + + async processQueue(): Promise { + if (this.processing || this.queue.length === 0) { + return; + } + + this.processing = true; + while (this.queue.length > 0) { + const item = this.queue.shift(); + await this.processItem(item); + } + this.processing = false; } } ``` -### Custom Evaluators +## Best Practices -Create specialized evaluators for specific use cases: +### Error Handling ```typescript -class CustomEvaluator extends BaseEvaluator { - async evaluate(context: EvaluatorContext): Promise { - // Custom evaluation logic - return { - score: 0.95, - confidence: 0.8, - }; +try { + const result = await complexOperation(); + if (!result) { + throw new Error("Operation failed"); } + return result; +} catch (error) { + console.error("Error in operation:", error); + await errorReporting.log(error); + throw new OperationalError("Failed to complete operation", { cause: error }); } ``` -## Security Considerations +### Resource Management -- Implement proper input validation -- Use secure token management -- Monitor system access -- Implement rate limiting -- Use proper encryption for sensitive data +```typescript +class ResourceManager { + private resources: Map = new Map(); + + async acquire(id: string): Promise { + // Implement resource acquisition with timeout + } + + async release(id: string): Promise { + // Implement resource cleanup + } +} +``` ## Troubleshooting -Common issues and solutions: - -1. Memory leaks +### Common Issues +1. Memory Leaks - Monitor memory usage - Implement proper cleanup - - Use garbage collection + - Use WeakMap for caching + +2. Performance Bottlenecks + - Profile slow operations + - Implement batching + - Use connection pooling + +3. Integration Issues + - Verify API credentials + - Check network connectivity + - Validate request formatting + +### Debugging -2. Performance issues +```typescript +const debug = require('debug')('eliza:advanced'); + +debug('Detailed operation info: %O', { + operation: 'complexOperation', + parameters: params, + result: result +}); +``` - - Optimize database queries - - Implement proper caching - - Use batch processing +## Further Resources -3. Integration issues - - Check API keys and permissions - - Verify network connectivity - - Monitor API rate limits +- [Infrastructure Guide](../advanced/infrastructure.md) for deployment +- [Trust Engine Documentation](../advanced/trust-engine.md) for scoring system +- [Autonomous Trading Guide](../advanced/autonomous-trading.md) for trading features +- [Fine-tuning Guide](../advanced/fine-tuning.md) for model optimization diff --git a/docs/docs/guides/basic-usage.md b/docs/docs/guides/basic-usage.md deleted file mode 100644 index f00b7143bf..0000000000 --- a/docs/docs/guides/basic-usage.md +++ /dev/null @@ -1,269 +0,0 @@ -# Basic Usage - -## Overview - -This guide covers the fundamental concepts and basic usage of the agent framework. We'll explore how to initialize and configure agents, handle different types of interactions, and leverage core capabilities. - -## Getting Started - -### Installation - -First, install the package using npm or pnpm: - -```bash -npm install @your-org/agent-framework -# or -pnpm install @your-org/agent-framework -``` - -### Basic Setup - -Here's a minimal example to create and start an agent: - -```typescript -import { AgentRuntime, createAgentRuntime } from "@your-org/agent-framework"; -import { SqliteDatabaseAdapter } from "@your-org/agent-framework/adapters"; - -// Initialize database -const db = new SqliteDatabaseAdapter(new Database("./db.sqlite")); - -// Create runtime with basic configuration -const runtime = await createAgentRuntime({ - character: { - name: "Assistant", - modelProvider: "anthropic", - // Add character details - }, - db, - token: process.env.API_TOKEN, -}); -``` - -## Core Concepts - -### Agents - -Agents are autonomous entities that can: - -- Process incoming messages -- Generate contextual responses -- Take actions based on input -- Maintain conversation state -- Handle multiple communication channels - -### Clients - -The framework supports multiple client types: - -- Discord -- Telegram -- Twitter -- Direct API - -Each client handles platform-specific message formatting and interaction patterns. - -### Actions - -Actions are discrete tasks that agents can perform: - -```typescript -const action = { - name: "SUMMARIZE", - description: "Summarize content or conversations", - handler: async (runtime, message, state) => { - // Action implementation - }, -}; - -runtime.registerAction(action); -``` - -### Providers - -Providers supply contextual information to agents: - -- Time awareness -- User relationships -- System state -- External data sources - -## Common Use Cases - -### Chat Interactions - -```typescript -// Handle incoming chat message -runtime.on("message", async (message) => { - const response = await runtime.handleMessage(message); - // Process response -}); -``` - -### Voice Integration - -For platforms supporting voice (e.g., Discord): - -```typescript -// Handle voice channel join -runtime.on("voiceStateUpdate", async (oldState, newState) => { - if (newState.channelId) { - await runtime.joinVoiceChannel(newState.channelId); - } -}); -``` - -### Media Processing - -The framework can handle various media types: - -- Images (with description generation) -- Audio (with transcription) -- Documents (with text extraction) -- Videos (with summarization) - -```typescript -// Process attachment -const media = await runtime.processAttachment({ - type: "image", - url: "https://example.com/image.jpg", -}); -``` - -## Configuration Options - -### Character Configuration - -Define agent personality and behavior: - -```typescript -const character = { - name: "Assistant", - bio: "A helpful AI assistant", - style: { - tone: "professional", - personality: "friendly", - language: "en", - }, - topics: ["technology", "science", "general"], - // Additional character settings -}; -``` - -### Runtime Settings - -Configure runtime behavior: - -```typescript -const settings = { - maxContextLength: 2000, - responseTimeout: 30000, - modelProvider: "anthropic", - temperature: 0.7, - // Additional runtime settings -}; -``` - -## Best Practices - -1. **Error Handling** - - - Implement proper error catching - - Provide graceful fallbacks - - Log errors for debugging - -2. **Resource Management** - - - Monitor memory usage - - Implement rate limiting - - Cache frequently accessed data - -3. **Security** - - - Validate input - - Sanitize output - - Implement proper authentication - -4. **Performance** - - Use appropriate model sizes - - Implement caching strategies - - Optimize database queries - -## Example Implementation - -Here's a complete example bringing together the core concepts: - -```typescript -import { AgentRuntime, createAgentRuntime } from "@your-org/agent-framework"; -import { DiscordClient } from "@your-org/agent-framework/clients/discord"; - -async function main() { - // Initialize runtime - const runtime = await createAgentRuntime({ - character: { - name: "Helper", - bio: "A helpful assistant", - modelProvider: "anthropic", - style: { - tone: "friendly", - personality: "helpful", - }, - }, - settings: { - maxContextLength: 2000, - temperature: 0.7, - }, - }); - - // Add custom action - runtime.registerAction({ - name: "HELP", - description: "Provide help information", - handler: async (runtime, message, state) => { - return { - text: "Here's how I can help...", - action: "HELP_RESPONSE", - }; - }, - }); - - // Initialize Discord client - const discord = new DiscordClient(runtime); - - // Start listening - discord.start(); -} - -main().catch(console.error); -``` - -## Troubleshooting - -Common issues and solutions: - -1. **Connection Issues** - - - Verify API tokens - - Check network connectivity - - Confirm service status - -2. **Response Timeouts** - - - Adjust timeout settings - - Check rate limits - - Verify model availability - -3. **Memory Issues** - - Monitor heap usage - - Implement garbage collection - - Optimize data structures - -## Next Steps - -After mastering basic usage, explore: - -- Advanced configuration options -- Custom action development -- Integration with external services -- Performance optimization techniques - -For more detailed information, refer to the specific component documentation and API reference. diff --git a/docs/docs/guides/configuration.md b/docs/docs/guides/configuration.md index 850a6e73de..3de1504fbf 100644 --- a/docs/docs/guides/configuration.md +++ b/docs/docs/guides/configuration.md @@ -1,233 +1,289 @@ -# Configuration +--- +sidebar_position: 9 +--- -## Overview +# ⚙️ Configuration Guide -The framework provides multiple layers of configuration to customize agent behavior, system settings, and runtime environments. This guide covers all configuration aspects: character files, environment variables, action configuration, and runtime settings. +This guide covers how to configure Eliza for different use cases and environments. We'll walk through all available configuration options and best practices. -## Key Components +## Environment Configuration -### 1. Environment Setup +### Basic Setup -Create a `.env` file in your project root: +The first step is creating your environment configuration file: ```bash -# Model API Keys -OPENAI_API_KEY=your-key -CLAUDE_API_KEY=your-key - -# Database Configuration -DATABASE_URL=your-db-url -POSTGRES_URL=your-postgres-url # Optional, defaults to SQLite - -# Client-Specific Tokens -DISCORD_API_TOKEN=your-token -DISCORD_APPLICATION_ID=your-id -TELEGRAM_BOT_TOKEN=your-token -TWITTER_USERNAME=your-username +cp .env.example .env ``` -### 2. Character Configuration +### Core Environment Variables -Create character files in the `characters` directory: +Here are the essential environment variables you need to configure: + +```bash +# Core API Keys +OPENAI_API_KEY=sk-your-key # Required for OpenAI features +ANTHROPIC_API_KEY=your-key # Required for Claude models +TOGETHER_API_KEY=your-key # Required for Together.ai models + +# Default Settings +XAI_MODEL=gpt-4o-mini # Default model to use +X_SERVER_URL= # Optional model API endpoint +``` + +### Client-Specific Configuration + +#### Discord Configuration +```bash +DISCORD_APPLICATION_ID= # Your Discord app ID +DISCORD_API_TOKEN= # Discord bot token +``` + +#### Twitter Configuration +```bash +TWITTER_USERNAME= # Bot Twitter username +TWITTER_PASSWORD= # Bot Twitter password +TWITTER_EMAIL= # Twitter account email +TWITTER_COOKIES= # Twitter auth cookies +TWITTER_DRY_RUN=false # Test mode without posting +``` + +#### Telegram Configuration +```bash +TELEGRAM_BOT_TOKEN= # Telegram bot token +``` + +### Model Provider Settings + +You can configure different AI model providers: + +```bash +# OpenAI Settings +OPENAI_API_KEY=sk-* + +# Anthropic Settings +ANTHROPIC_API_KEY= + +# Together.ai Settings +TOGETHER_API_KEY= + +# Local Model Settings +XAI_MODEL=meta-llama/Llama-3.1-7b-instruct +``` + +## Character Configuration + +### Character File Structure + +Character files define your agent's personality and behavior. Create them in the `characters/` directory: ```json { "name": "AgentName", - "clients": ["discord", "twitter", "telegram"], + "clients": ["discord", "twitter"], "modelProvider": "openai", "settings": { "secrets": { - "OPENAI_API_KEY": "your-key" - }, - "voice": { - "model": "en_US-male-medium" + "OPENAI_API_KEY": "character-specific-key", + "DISCORD_TOKEN": "bot-specific-token" } - }, - "bio": ["Biography elements..."], - "lore": ["Character background..."], - "knowledge": ["Factual information..."], - "topics": ["Relevant topics..."], - "style": { - "all": ["Style guidelines..."], - "chat": ["Chat-specific style..."], - "post": ["Post-specific style..."] } } ``` -### 3. Custom Actions - -Define custom actions in `elizaConfig.yaml`: - -```yaml -actions: - - name: customAction - path: ./actions/customAction.ts - - name: anotherAction - path: ./custom_actions/anotherAction.ts -``` +### Loading Characters -## Usage Guide +You can load characters in several ways: -### 1. Basic Setup +```bash +# Load default character +pnpm start -```typescript -import { createAgentRuntime } from "@your-org/agent-framework"; -import { SqliteDatabaseAdapter } from "@your-org/agent-framework/adapters"; +# Load specific character +pnpm start --characters="characters/your-character.json" -// Initialize runtime -const runtime = await createAgentRuntime({ - character: characterConfig, - configPath: "./elizaConfig.yaml", - databaseAdapter: new SqliteDatabaseAdapter("./db.sqlite"), -}); +# Load multiple characters +pnpm start --characters="characters/char1.json,characters/char2.json" ``` -### 2. Running Multiple Characters +## Custom Actions -```bash -# Start with specific character file -pnpm run dev --characters=./characters/agent1.json,./characters/agent2.json -``` - -### 3. Client Configuration +### Adding Custom Actions -```typescript -// Discord client example -const discordClient = new DiscordClient(runtime); -await discordClient.start(); +1. Create a `custom_actions` directory +2. Add your action files there +3. Configure in `elizaConfig.yaml`: -// Telegram client example -const telegramClient = new TelegramClient(runtime, botToken); -await telegramClient.start(); +```yaml +actions: + - name: myCustomAction + path: ./custom_actions/myAction.ts ``` -## Configuration Options - -### 1. Model Providers +### Action Configuration Structure ```typescript -const modelProviders = { - openai: { - small: "gpt-3.5-turbo", - large: "gpt-4", - }, - anthropic: { - small: "claude-3-haiku", - large: "claude-3-opus", - }, - "llama-cloud": { - small: "llama-7b", - large: "llama-70b", +export const myAction: Action = { + name: "MY_ACTION", + similes: ["SIMILAR_ACTION", "ALTERNATE_NAME"], + validate: async (runtime: IAgentRuntime, message: Memory) => { + // Validation logic + return true; }, + description: "Action description", + handler: async (runtime: IAgentRuntime, message: Memory) => { + // Action logic + return true; + } }; ``` -### 2. Database Options +## Provider Configuration -```typescript -// SQLite (default) -const dbAdapter = new SqliteDatabaseAdapter("./db.sqlite"); +### Database Providers -// PostgreSQL -const dbAdapter = new PostgresDatabaseAdapter({ - connectionString: process.env.POSTGRES_URL, -}); -``` - -### 3. Custom Provider Configuration +Configure different database backends: ```typescript -// Add custom provider -runtime.providers.push({ - name: "customProvider", - get: async (runtime, message, state) => { - // Provider implementation - return data; - }, +// SQLite (Recommended for development) +import { SqliteDatabaseAdapter } from "@your-org/agent-framework/adapters"; +const db = new SqliteDatabaseAdapter("./dev.db"); + +// PostgreSQL (Production) +import { PostgresDatabaseAdapter } from "@your-org/agent-framework/adapters"; +const db = new PostgresDatabaseAdapter({ + host: process.env.DB_HOST, + port: parseInt(process.env.DB_PORT), + database: process.env.DB_NAME, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD }); ``` -## Best Practices +### Model Providers -### 1. Security +Configure model providers in your character file: -- Store sensitive credentials in `.env` file -- Use character-specific secrets for per-agent credentials -- Never commit secrets to version control -- Rotate API keys regularly +```json +{ + "modelProvider": "openai", + "settings": { + "model": "gpt-4o-mini", + "temperature": 0.7, + "maxTokens": 2000 + } +} +``` -### 2. Character Configuration +## Advanced Configuration -- Break bio and lore into smaller chunks for variety -- Use RAG (knowledge array) for factual information -- Keep message examples diverse and representative -- Update knowledge regularly +### Runtime Settings -### 3. Performance +Fine-tune runtime behavior: ```typescript -// Optimize context length const settings = { - maxContextLength: 4000, // Adjust based on model - maxTokens: 1000, // Limit response length - temperature: 0.7, // Adjust response randomness + // Logging + DEBUG: "eliza:*", + LOG_LEVEL: "info", + + // Performance + MAX_CONCURRENT_REQUESTS: 5, + REQUEST_TIMEOUT: 30000, + + // Memory + MEMORY_TTL: 3600, + MAX_MEMORY_ITEMS: 1000 }; ``` -### 4. Error Handling +### Plugin Configuration -```typescript -try { - const runtime = await createAgentRuntime(config); -} catch (error) { - if (error.code === "CONFIG_NOT_FOUND") { - console.error("Configuration file missing"); - } else if (error.code === "INVALID_CHARACTER") { - console.error("Character file validation failed"); - } -} +Enable and configure plugins in `elizaConfig.yaml`: + +```yaml +plugins: + - name: solana + enabled: true + settings: + network: mainnet-beta + endpoint: https://api.mainnet-beta.solana.com + + - name: image-generation + enabled: true + settings: + provider: dalle + size: 1024x1024 ``` +## Configuration Best Practices + +1. **Environment Segregation** + - Use different `.env` files for different environments + - Follow naming convention: `.env.development`, `.env.staging`, `.env.production` + +2. **Secret Management** + - Never commit secrets to version control + - Use secret management services in production + - Rotate API keys regularly + +3. **Character Configuration** + - Keep character files modular and focused + - Use inheritance for shared traits + - Document character behaviors + +4. **Plugin Management** + - Enable only needed plugins + - Configure plugin-specific settings in separate files + - Monitor plugin performance + +5. **Database Configuration** + - Use SQLite for development + - Configure connection pooling for production + - Set up proper indexes + ## Troubleshooting ### Common Issues -1. **Missing Configuration** +1. **Environment Variables Not Loading** + ```bash + # Check .env file location + node -e "console.log(require('path').resolve('.env'))" + + # Verify environment variables + node -e "console.log(process.env)" + ``` -```typescript -if (!fs.existsSync("./elizaConfig.yaml")) { - console.error("Missing elizaConfig.yaml - copy from example"); -} -``` +2. **Character Loading Failures** + ```bash + # Validate character file + npx ajv validate -s character-schema.json -d your-character.json + ``` -2. **Invalid Character File** +3. **Database Connection Issues** + ```bash + # Test database connection + npx ts-node scripts/test-db-connection.ts + ``` -```typescript -// Validate character file -if (!character.name || !character.bio || !character.style) { - throw new Error("Invalid character configuration"); -} -``` +### Configuration Validation -3. **Model Provider Issues** +Use the built-in config validator: -```typescript -// Fallback to local model -if (!process.env.OPENAI_API_KEY) { - console.log("Using local model fallback"); - runtime.modelProvider = "llama-local"; -} +```bash +pnpm run validate-config ``` -## Next Steps - -After basic configuration: +This will check: +- Environment variables +- Character files +- Database configuration +- Plugin settings -1. Configure custom actions -2. Set up client integrations -3. Customize character behavior -4. Optimize model settings -5. Implement error handling +## Further Resources -For more detailed information on specific components, refer to their respective documentation sections. +- [Quickstart Guide](../quickstart.md) for initial setup +- [Secrets Management](./secrets-management.md) for secure configuration +- [Local Development](./local-development.md) for development setup +- [Advanced Usage](./advanced.md) for complex configurations diff --git a/docs/docs/guides/local-development.md b/docs/docs/guides/local-development.md index 6f48de0672..ac800be7eb 100644 --- a/docs/docs/guides/local-development.md +++ b/docs/docs/guides/local-development.md @@ -1,18 +1,30 @@ -# Local Development +--- +sidebar_position: 12 +--- + +# 💻 Local Development Guide + +This guide covers setting up and working with Eliza in a development environment. ## Prerequisites -Before starting local development, ensure you have: +Before you begin, ensure you have: -- Node.js 22 or higher installed -- pnpm package manager installed -- Git for version control -- Code editor (VS Code recommended) -- CUDA Toolkit (optional, for GPU acceleration) +```bash +# Required +Node.js 22+ +pnpm +Git + +# Optional but recommended +VS Code +Docker (for database development) +CUDA Toolkit (for GPU acceleration) +``` ## Initial Setup -### 1. Clone and Install +### 1. Repository Setup ```bash # Clone the repository @@ -22,26 +34,26 @@ cd eliza # Install dependencies pnpm install -# Install optional Sharp package if needed +# Install optional dependencies pnpm install --include=optional sharp ``` ### 2. Environment Configuration -Copy the example environment file: +Create your development environment file: ```bash cp .env.example .env ``` -Configure essential variables for local development: +Configure essential development variables: ```bash -# Minimum required for local testing +# Minimum required for local development OPENAI_API_KEY=sk-* # Optional, for OpenAI features X_SERVER_URL= # Leave blank for local inference -XAI_API_KEY= # Leave blank for local inference -XAI_MODEL=meta-llama/Llama-3.1-7b-instruct # Choose your model +XAI_API_KEY= # Leave blank for local inference +XAI_MODEL=meta-llama/Llama-3.1-7b-instruct # Local model ``` ### 3. Local Model Setup @@ -49,62 +61,45 @@ XAI_MODEL=meta-llama/Llama-3.1-7b-instruct # Choose your model For local inference without API dependencies: ```bash -# Install CUDA support if you have an NVIDIA GPU +# Install CUDA support for NVIDIA GPUs npx --no node-llama-cpp source download --gpu cuda -# The system will automatically download the selected model -# from Hugging Face on first run +# The system will automatically download models from +# Hugging Face on first run ``` ## Development Workflow -### 1. Running the Development Server +### Running the Development Server ```bash # Start with default character pnpm run dev -# Start with specific character(s) -pnpm run dev --characters="characters/your-character.json" +# Start with specific character +pnpm run dev --characters="characters/my-character.json" # Start with multiple characters pnpm run dev --characters="characters/char1.json,characters/char2.json" ``` -### 2. Testing in Shell Mode - -Open a new terminal to interact with your agent: - -```bash -pnpm run shell -``` - -### 3. Custom Actions Development - -Create custom actions without modifying core files: +### Development Commands ```bash -# Create custom actions directory -mkdir custom_actions - -# Create your action file -touch custom_actions/myAction.ts -``` - -Register your action in `elizaConfig.yaml`: - -```yaml -actions: - - name: myAction - path: ./custom_actions/myAction.ts +pnpm run build # Build the project +pnpm run clean # Clean build artifacts +pnpm run dev # Start development server +pnpm run test # Run tests +pnpm run test:watch # Run tests in watch mode +pnpm run lint # Lint code ``` -## Database Options +## Database Development ### SQLite (Recommended for Development) ```typescript -import { SqliteDatabaseAdapter } from "@your-org/agent-framework/adapters"; +import { SqliteDatabaseAdapter } from "@ai16z/eliza/adapters"; import Database from "better-sqlite3"; const db = new SqliteDatabaseAdapter(new Database("./dev.db")); @@ -113,32 +108,106 @@ const db = new SqliteDatabaseAdapter(new Database("./dev.db")); ### In-Memory Database (for Testing) ```typescript -import { SqlJsDatabaseAdapter } from "@your-org/agent-framework/adapters"; +import { SqlJsDatabaseAdapter } from "@ai16z/eliza/adapters"; const db = new SqlJsDatabaseAdapter(new Database(":memory:")); ``` -## GPU Acceleration +### Schema Management -For NVIDIA GPU users: +```bash +# Create new migration +pnpm run migration:create -1. Install CUDA Toolkit with cuDNN and cuBLAS -2. Set environment variables: +# Run migrations +pnpm run migration:up -```bash -CUDA_PATH=/usr/local/cuda # Windows: typically C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0 +# Rollback migrations +pnpm run migration:down ``` -## Debugging Tips +## Testing -### 1. Enable Debug Logging +### Running Tests ```bash -# Add to your .env file -DEBUG=eliza:* +# Run all tests +pnpm test + +# Run specific test file +pnpm test tests/specific.test.ts + +# Run tests with coverage +pnpm test:coverage + +# Run database-specific tests +pnpm test:sqlite +pnpm test:sqljs +``` + +### Writing Tests + +```typescript +import { runAiTest } from "@ai16z/eliza/test_resources"; + +describe("Feature Test", () => { + beforeEach(async () => { + // Setup test environment + }); + + it("should perform expected behavior", async () => { + const result = await runAiTest({ + messages: [ + { + user: "user1", + content: { text: "test message" } + } + ], + expected: "expected response" + }); + expect(result.success).toBe(true); + }); +}); +``` + +## Plugin Development + +### Creating a New Plugin + +```typescript +// plugins/my-plugin/src/index.ts +import { Plugin } from "@ai16z/eliza/types"; + +export const myPlugin: Plugin = { + name: "my-plugin", + description: "My custom plugin", + actions: [], + evaluators: [], + providers: [] +}; +``` + +### Custom Action Development + +```typescript +// plugins/my-plugin/src/actions/myAction.ts +export const myAction: Action = { + name: "MY_ACTION", + similes: ["SIMILAR_ACTION"], + validate: async (runtime: IAgentRuntime, message: Memory) => { + return true; + }, + handler: async (runtime: IAgentRuntime, message: Memory) => { + // Implementation + return true; + }, + examples: [] +}; ``` -### 2. VS Code Launch Configuration +## Debugging + +### VS Code Configuration Create `.vscode/launch.json`: @@ -161,72 +230,165 @@ Create `.vscode/launch.json`: } ``` -### 3. Common Issues +### Debugging Tips + +1. Enable Debug Logging +```bash +# Add to your .env file +DEBUG=eliza:* +``` + +2. Use Debug Points +```typescript +const debug = require('debug')('eliza:dev'); -**Memory Issues:** +debug('Operation details: %O', { + operation: 'functionName', + params: parameters, + result: result +}); +``` +3. Memory Debugging ```bash -# Increase Node.js memory limit if needed +# Increase Node.js memory for development NODE_OPTIONS="--max-old-space-size=8192" pnpm run dev ``` -**Model Download Issues:** +## Common Development Tasks -```bash -# Clear model cache -rm -rf ./models/* -# Restart with fresh download +### 1. Adding a New Character + +```json +{ + "name": "DevBot", + "description": "Development testing bot", + "modelProvider": "openai", + "settings": { + "debug": true, + "logLevel": "debug" + } +} ``` -## Testing +### 2. Creating Custom Services + +```typescript +class CustomService extends Service { + static serviceType = ServiceType.CUSTOM; + + async initialize() { + // Setup code + } + + async process(input: any): Promise { + // Service logic + } +} +``` + +### 3. Working with Models + +```typescript +// Local model configuration +const localModel = { + modelProvider: "llamalocal", + settings: { + modelPath: "./models/llama-7b.gguf", + contextSize: 8192 + } +}; + +// Cloud model configuration +const cloudModel = { + modelProvider: "openai", + settings: { + model: "gpt-4o-mini", + temperature: 0.7 + } +}; +``` -### Unit Tests +## Performance Optimization + +### CUDA Setup + +For NVIDIA GPU users: + +1. Install CUDA Toolkit with cuDNN and cuBLAS +2. Set environment variables: ```bash -# Run all tests -pnpm test +CUDA_PATH=/usr/local/cuda # Windows: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0 +``` -# Run specific test file -pnpm test tests/your-test.test.ts +### Memory Management -# Run with coverage -pnpm test:coverage +```typescript +class MemoryManager { + private cache = new Map(); + private maxSize = 1000; + + async cleanup() { + if (this.cache.size > this.maxSize) { + // Implement cleanup logic + } + } +} ``` -### Integration Testing +## Troubleshooting + +### Common Issues + +1. Model Loading Issues +```bash +# Clear model cache +rm -rf ./models/* +# Restart with fresh download +``` +2. Database Connection Issues ```bash -# Start test environment -pnpm run dev:test +# Test database connection +pnpm run test:db-connection +``` -# Run integration tests -pnpm test:integration +3. Memory Issues +```bash +# Check memory usage +node --trace-gc index.js ``` -## Development Best Practices +### Development Tools -1. **Version Control** +```bash +# Generate TypeScript documentation +pnpm run docs:generate - - Create feature branches - - Follow conventional commits - - Keep PRs focused and manageable +# Check for circular dependencies +pnpm run madge -2. **Code Organization** +# Analyze bundle size +pnpm run analyze +``` +## Best Practices + +1. Code Organization - Place custom actions in `custom_actions/` - Keep character files in `characters/` - Store test data in `tests/fixtures/` -3. **Performance** - - - Use SQLite for development - - Enable GPU acceleration when possible - - Monitor memory usage - -4. **Testing** +2. Testing Strategy - Write unit tests for new features + - Use integration tests for plugins - Test with multiple model providers - - Verify character behavior in shell + +3. Git Workflow + - Create feature branches + - Follow conventional commits + - Keep PRs focused ## Additional Tools @@ -243,4 +405,22 @@ npx folder2knowledge npx knowledge2character ``` -Remember to regularly update dependencies and test your changes across different environments and configurations. +### Development Scripts + +```bash +# Analyze codebase +./scripts/analyze-codebase.ts + +# Extract tweets for training +./scripts/extracttweets.js + +# Clean build artifacts +./scripts/clean.sh +``` + +## Further Resources + +- [Configuration Guide](./configuration.md) for setup details +- [Advanced Usage](./advanced.md) for complex features +- [API Documentation](/api) for complete API reference +- [Contributing Guide](../community/contributing.md) for contribution guidelines diff --git a/docs/docs/guides/secrets-management.md b/docs/docs/guides/secrets-management.md index 898594e01c..5b924f6fc2 100644 --- a/docs/docs/guides/secrets-management.md +++ b/docs/docs/guides/secrets-management.md @@ -1,234 +1,397 @@ -# Secrets Management +--- +sidebar_position: 11 +--- -## Overview +# 🔐 Secrets Management -Eliza provides multiple options for managing secrets and credentials, including environment variables and character-specific secrets. This guide covers best practices for managing API keys, tokens, and other sensitive configuration values across different deployment scenarios. +A comprehensive guide for managing secrets, API keys, and sensitive configuration in Eliza. -## Environment Variables +## Core Concepts -### Basic Setup +### Environment Variables + +Eliza uses a hierarchical environment variable system: + +1. Character-specific secrets (highest priority) +2. Environment variables +3. Default values (lowest priority) -Create a `.env` file in your project root: +### Secret Types + +Common secrets you'll need to manage: ```bash -# Core API Keys -OPENAI_API_KEY=sk-your-key +# API Keys +OPENAI_API_KEY=sk-* ANTHROPIC_API_KEY=your-key ELEVENLABS_XI_API_KEY=your-key +GOOGLE_GENERATIVE_AI_API_KEY=your-key -# Discord Configuration -DISCORD_APPLICATION_ID=your-app-id -DISCORD_API_TOKEN=your-bot-token +# Client Authentication +DISCORD_API_TOKEN=your-token +TELEGRAM_BOT_TOKEN=your-token -# Twitter Configuration -TWITTER_USERNAME=your-username -TWITTER_PASSWORD=your-password -TWITTER_EMAIL=your-email -TWITTER_COOKIES=your-cookies +# Database Credentials +SUPABASE_URL=your-url +SUPABASE_SERVICE_API_KEY=your-key -# Database Configuration (Optional) -SUPABASE_URL=your-supabase-url -SUPABASE_SERVICE_API_KEY=your-service-key +# Blockchain Keys +WALLET_PRIVATE_KEY=your-private-key +WALLET_PUBLIC_KEY=your-public-key +``` -# Voice Settings (Optional) -ELEVENLABS_MODEL_ID=eleven_multilingual_v2 -ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM -ELEVENLABS_VOICE_STABILITY=0.5 -ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 -ELEVENLABS_VOICE_STYLE=0.66 -ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false -ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 -ELEVENLABS_OUTPUT_FORMAT=pcm_16000 +## Implementation Guide + +### Basic Setup + +1. Create a `.env` file from template: + +```bash +cp .env.example .env ``` -## Character-Specific Secrets +2. Configure environment discovery: + +```typescript +import { config } from "dotenv"; +import path from "path"; + +export function findNearestEnvFile(startDir = process.cwd()) { + let currentDir = startDir; + + while (currentDir !== path.parse(currentDir).root) { + const envPath = path.join(currentDir, ".env"); + + if (fs.existsSync(envPath)) { + return envPath; + } + + currentDir = path.dirname(currentDir); + } + + return null; +} +``` -### Configuration in Character Files +### Character-Specific Secrets -Character files can include their own secrets, which override environment variables: +Define secrets in character files: ```json { - "name": "AgentName", - "clients": ["discord", "twitter"], - "modelProvider": "openai", + "name": "TradingBot", "settings": { "secrets": { "OPENAI_API_KEY": "character-specific-key", - "DISCORD_TOKEN": "bot-specific-token", - "TWITTER_USERNAME": "bot-twitter-handle", - "TWITTER_PASSWORD": "bot-twitter-password" + "WALLET_PRIVATE_KEY": "character-specific-wallet" } } } ``` -### Precedence Order - -Secrets are resolved in the following order: - -1. Character-specific secrets (highest priority) -2. Environment variables -3. Default values (lowest priority) +Access secrets in code: -## Best Practices - -### 1. Secret Storage - -- Never commit secret files to version control -- Use `.gitignore` to exclude sensitive files: - -```bash -# .gitignore -.env -.env.* -characters/**/secrets.json -**/serviceAccount.json +```typescript +const apiKey = runtime.getSetting("OPENAI_API_KEY"); ``` -### 2. Development Workflow +### Secure Storage -Create different environment files for different environments: +#### Database Secrets -```bash -.env.development # Local development settings -.env.staging # Staging environment -.env.production # Production settings +Use encrypted connection strings: + +```typescript +class SecureDatabase { + private connection: Connection; + + constructor(encryptedConfig: string) { + const config = this.decryptConfig(encryptedConfig); + this.connection = new Connection(config); + } + + private decryptConfig(encrypted: string): DatabaseConfig { + // Implement decryption logic + return JSON.parse(decrypted); + } +} ``` -### 3. Secret Rotation +#### Wallet Management -Implement a rotation strategy: +Secure handling of blockchain credentials: ```typescript -class SecretManager { - private static readonly SECRET_LIFETIME = 90 * 24 * 60 * 60 * 1000; // 90 days - - async shouldRotateSecret(secretName: string): Promise { - const lastRotation = await this.getLastRotation(secretName); - return Date.now() - lastRotation > SecretManager.SECRET_LIFETIME; - } +class WalletManager { + private async initializeWallet(runtime: IAgentRuntime) { + const privateKey = runtime.getSetting("WALLET_PRIVATE_KEY"); + + if (!privateKey) { + throw new Error("Wallet private key not configured"); + } + + // Validate key format + try { + const keyBuffer = Buffer.from(privateKey, "base64"); + if (keyBuffer.length !== 64) { + throw new Error("Invalid key length"); + } + } catch (error) { + throw new Error("Invalid private key format"); + } + + // Initialize wallet securely + return new Wallet(privateKey); + } } ``` -### 4. Secure Character Files +### Secret Rotation -When using character-specific secrets: +Implement automatic secret rotation: ```typescript -// Validate character file location -const isSecurePath = (path: string): boolean => { - return !path.includes("../") && !path.startsWith("/"); -}; - -// Load character securely -const loadCharacter = async (path: string) => { - if (!isSecurePath(path)) { - throw new Error("Invalid character file path"); - } - // Load and validate character -}; +class SecretRotation { + private static readonly SECRET_LIFETIME = 90 * 24 * 60 * 60 * 1000; // 90 days + + async shouldRotateSecret(secretName: string): Promise { + const lastRotation = await this.getLastRotation(secretName); + return Date.now() - lastRotation > SecretRotation.SECRET_LIFETIME; + } + + async rotateSecret(secretName: string): Promise { + // Implement rotation logic + const newSecret = await this.generateNewSecret(); + await this.updateSecret(secretName, newSecret); + await this.recordRotation(secretName); + } +} ``` -## Security Considerations - -### 1. Access Control +### Access Control -Implement proper access controls for secret management: +Implement proper access controls: ```typescript class SecretAccess { - private static readonly ALLOWED_KEYS = [ - "OPENAI_API_KEY", - "DISCORD_TOKEN", - // ... other allowed keys - ]; - - static validateAccess(key: string): boolean { - return this.ALLOWED_KEYS.includes(key); - } + private static readonly ALLOWED_KEYS = [ + "OPENAI_API_KEY", + "DISCORD_TOKEN", + // ... other allowed keys + ]; + + static validateAccess(key: string): boolean { + return this.ALLOWED_KEYS.includes(key); + } + + static async getSecret(runtime: IAgentRuntime, key: string): Promise { + if (!this.validateAccess(key)) { + throw new Error(`Unauthorized access to secret: ${key}`); + } + + return runtime.getSetting(key); + } } ``` -### 2. Encryption at Rest +### Encryption at Rest -For stored secrets: +Implement encryption for stored secrets: ```typescript import { createCipheriv, createDecipheriv } from "crypto"; class SecretEncryption { - static async encrypt(value: string, key: Buffer): Promise { - const iv = crypto.randomBytes(16); - const cipher = createCipheriv("aes-256-gcm", key, iv); - // ... implementation - } - - static async decrypt(encrypted: string, key: Buffer): Promise { - // ... implementation - } + static async encrypt(value: string, key: Buffer): Promise { + const iv = crypto.randomBytes(16); + const cipher = createCipheriv("aes-256-gcm", key, iv); + + let encrypted = cipher.update(value, "utf8", "hex"); + encrypted += cipher.final("hex"); + + return JSON.stringify({ + iv: iv.toString("hex"), + encrypted, + tag: cipher.getAuthTag().toString("hex") + }); + } + + static async decrypt(encrypted: string, key: Buffer): Promise { + const { iv, encrypted: encryptedData, tag } = JSON.parse(encrypted); + + const decipher = createDecipheriv( + "aes-256-gcm", + key, + Buffer.from(iv, "hex") + ); + + decipher.setAuthTag(Buffer.from(tag, "hex")); + + let decrypted = decipher.update(encryptedData, "hex", "utf8"); + decrypted += decipher.final("utf8"); + + return decrypted; + } } ``` +## Best Practices + +### 1. Environment Segregation + +Maintain separate environment files: + +```bash +.env.development # Local development settings +.env.staging # Staging environment +.env.production # Production settings +``` + +### 2. Git Security + +Exclude sensitive files: + +```gitignore +# .gitignore +.env +.env.* +characters/**/secrets.json +**/serviceAccount.json +``` + ### 3. Secret Validation Validate secrets before use: ```typescript async function validateSecrets(character: Character): Promise { - const required = ["OPENAI_API_KEY"]; - const missing = required.filter((key) => !character.settings.secrets[key]); + const required = ["OPENAI_API_KEY"]; + const missing = required.filter( + key => !character.settings.secrets[key] + ); + + if (missing.length > 0) { + throw new Error( + `Missing required secrets: ${missing.join(", ")}` + ); + } +} +``` - if (missing.length > 0) { - throw new Error(`Missing required secrets: ${missing.join(", ")}`); - } +### 4. Error Handling + +Secure error messages: + +```typescript +try { + await loadSecrets(); +} catch (error) { + if (error.code === "ENOENT") { + console.error("Environment file not found"); + } else if (error instanceof ValidationError) { + console.error("Invalid secret format"); + } else { + // Log securely without exposing secret values + console.error("Error loading secrets"); + } } ``` -## Troubleshooting +## Security Considerations -### Common Issues +### 1. Handling API Keys + +```typescript +class APIKeyManager { + private validateAPIKey(key: string): boolean { + if (key.startsWith("sk-")) { + return key.length > 20; + } + return false; + } + + async rotateAPIKey(provider: string): Promise { + // Implement key rotation logic + } +} +``` -1. **Missing Secrets** +### 2. Secure Configuration Loading ```typescript -if (!process.env.OPENAI_API_KEY && !character.settings.secrets.OPENAI_API_KEY) { - throw new Error( - "OpenAI API key not found in environment or character settings", - ); +class ConfigLoader { + private static sanitizePath(path: string): boolean { + return !path.includes("../") && !path.startsWith("/"); + } + + async loadConfig(path: string): Promise { + if (!this.sanitizePath(path)) { + throw new Error("Invalid config path"); + } + // Load configuration + } } ``` -2. **Invalid Secret Format** +### 3. Memory Security ```typescript -function validateApiKey(key: string): boolean { - // OpenAI keys start with 'sk-' - if (key.startsWith("sk-")) { - return key.length > 20; - } - return false; +class SecureMemory { + private secrets: Map> = new Map(); + + set(key: string, value: string): void { + this.secrets.set(key, new WeakRef(value)); + } + + get(key: string): string | null { + const ref = this.secrets.get(key); + return ref?.deref() ?? null; + } +} +``` + +## Troubleshooting + +### Common Issues + +1. Missing Secrets +```typescript +if (!process.env.OPENAI_API_KEY) { + throw new Error( + "OpenAI API key not found in environment or character settings" + ); } ``` -3. **Secret Loading Errors** +2. Invalid Secret Format +```typescript +function validateApiKey(key: string): boolean { + // OpenAI keys start with 'sk-' + if (key.startsWith("sk-")) { + return key.length > 20; + } + return false; +} +``` +3. Secret Loading Errors ```typescript try { - await loadSecrets(); + await loadSecrets(); } catch (error) { - if (error.code === "ENOENT") { - console.error("Environment file not found"); - } else if (error instanceof ValidationError) { - console.error("Invalid secret format"); - } + if (error.response) { + console.error("Response data:", error.response.data); + console.error("Response status:", error.response.status); + } else if (error.request) { + console.error("No response received:", error.request); + } else { + console.error("Error setting up request:", error.message); + } } ``` ## Related Resources -- [Configuration Guide](./configuration.md) for general configuration options -- [Character Files](../core/characterfile.md) for character-specific settings -- [Local Development](./local-development.md) for development environment setup - -Remember to follow security best practices and never expose sensitive credentials in logs, error messages, or version control systems. +- [Configuration Guide](./configuration.md) for general setup +- [Local Development](./local-development.md) for development environment +- [Infrastructure Guide](../advanced/infrastructure.md) for deployment security diff --git a/docs/docs/installation.md b/docs/docs/installation.md deleted file mode 100644 index 975253e27e..0000000000 --- a/docs/docs/installation.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Installation - -Currently eliza is dependent on Supabase for local development. You can install it with the following command: - -`pnpm install eliza` - -## Select your database adapter - -``` -pnpm install sqlite-vss better-sqlite3 # for sqlite (simple, for local development) - -pnpm install @supabase/supabase-js # for supabase (more complicated but can be deployed at scale) -``` - -### Set up environment variables - -You will need a Supbase account, as well as an OpenAI developer account. - -Copy and paste the .dev.vars.example to .dev.vars and fill in the environment variables: - -``` -SUPABASE_URL="https://your-supabase-url.supabase.co" -SUPABASE_SERVICE_API_KEY="your-supabase-service-api-key" -OPENAI_API_KEY="your-openai-api-key" -``` - -### SQLite Local Setup (Easiest) - -You can use SQLite for local development. This is the easiest way to get started with eliza. - -``` -import { BgentRuntime, SqliteDatabaseAdapter } from "eliza"; -import { Database } from "sqlite3"; -const sqliteDatabaseAdapter = new SqliteDatabaseAdapter(new Database(":memory:")); - -const runtime = new BgentRuntime({ - serverUrl: "https://api.openai.com/v1", - token: process.env.OPENAI_API_KEY, // Can be an API key or JWT token for your AI services - databaseAdapter: sqliteDatabaseAdapter, - // ... other options -}); -``` - -### Supabase Local Setup - -First, you will need to install the Supabase CLI. You can install it using the instructions here. - -Once you have the CLI installed, you can run the following commands to set up a local Supabase instance: - -``` -supabase init -supabase start -``` - -You can now start the eliza project with `pnpm run dev` and it will connect to the local Supabase instance by default. - -NOTE: You will need Docker installed for this to work. If that is an issue for you, use the Supabase Cloud Setup instructions instead below). - -### Supabase Cloud Setup - -This library uses Supabase as a database. You can set up a free account at supabase.io and create a new project. - -- Step 1: On the Subase All Projects Dashboard, select “New Project”. -- Step 2: Select the organization to store the new project in, assign a database name, password and region. -- Step 3: Select “Create New Project”. -- Step 4: Wait for the database to setup. This will take a few minutes as supabase setups various directories. -- Step 5: Select the “SQL Editor” tab from the left navigation menu. -- Step 6: Copy in your own SQL dump file or optionally use the provided file in the eliza directory at: "src/supabase/db.sql". Note: You can use the command "supabase db dump" if you have a pre-exisiting supabase database to generate the SQL dump file. -- Step 7: Paste the SQL code into the SQL Editor and hit run in the bottom right. -- Step 8: Select the “Databases” tab from the left navigation menu to verify all of the tables have been added properly. - -Once you've set up your Supabase project, you can find your API key by going to the "Settings" tab and then "API". You will need to set the` SUPABASE_URL and SUPABASE_SERVICE_API_KEY` environment variables in your `.dev.vars` file. - -### Local Model Setup - -While eliza uses ChatGPT 3.5 by default, you can use a local model by setting the serverUrl to a local endpoint. The LocalAI project is a great way to run a local model with a compatible API endpoint. - -``` -const runtime = new BgentRuntime({ - serverUrl: process.env.LOCALAI_URL, - token: process.env.LOCALAI_TOKEN, // Can be an API key or JWT token for your AI service - // ... other options -}); -``` - -### Development - -``` -pnpm run dev # start the server - -pnpm run shell # start the shell in another terminal to talk to the default agent -``` - -### Usage - -``` - import { BgentRuntime, SupabaseDatabaseAdapter, SqliteDatabaseAdapter } from "eliza"; - - const sqliteDatabaseAdapter = new SqliteDatabaseAdapter(new Database(":memory:")); - - - // You can also use Supabase like this - // const supabaseDatabaseAdapter = new SupabaseDatabaseAdapter( - // process.env.SUPABASE_URL, - // process.env.SUPABASE_SERVICE_API_KEY) - // ; - - - const runtime = new BgentRuntime({ - serverUrl: "https://api.openai.com/v1", - token: process.env.OPENAI_API_KEY, // Can be an API key or JWT token for your AI services - databaseAdapter: sqliteDatabaseAdapter, - actions: [ - /* your custom actions */ - ], - evaluators: [ - /* your custom evaluators */ - ], - model: "gpt-3.5-turbo", // whatever model you want to use - embeddingModel: "text-embedding-3-small", // whatever model you want to use - }); -``` diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 8d8a364a10..2b03dcd13b 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -115,9 +115,8 @@ Eliza is backed by an active community of developers and users: ## Next Steps -- [Install Eliza](./installation.md) -- [Create Your First Agent](./quickstart.md) -- [Understand Core Concepts](./core/agents.md) +- [Create Your First Agent](../quickstart) +- [Understand Core Concepts](../core/agents) - [Explore Advanced Features](./guides/advanced.md) Join us in building the future of autonomous AI agents with Eliza! diff --git a/docs/docs/quickstart.md b/docs/docs/quickstart.md index 8b18f618dd..f66fb84dff 100644 --- a/docs/docs/quickstart.md +++ b/docs/docs/quickstart.md @@ -2,112 +2,165 @@ sidebar_position: 2 --- -# Quickstart +# Quickstart Guide -## Install Node.js +## Prerequisites -https://docs.npmjs.com/downloading-and-installing-node-js-and-npm +Before getting started with Eliza, ensure you have: -## Using pnpm +- [Node.js 22+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) +- Git for version control +- A code editor (VS Code recommended) +- CUDA Toolkit (optional, for GPU acceleration) -We use pnpm to manage our dependencies. It is faster and more efficient than npm, and it supports workspaces. -https://pnpm.io/installation +## Installation -## Edit the .env file +1. **Clone and Install** -- Copy .env.example to .env and fill in the appropriate values -- Edit the TWITTER environment variables to add your bot's username and password +```bash +# Clone the repository +git clone https://github.com/ai16z/eliza.git +cd eliza -## Edit the character file +# Install dependencies +pnpm install + +# Install optional Sharp package if needed +pnpm install --include=optional sharp +``` -- Check out the file `src/core/defaultCharacter.ts` - you can modify this -- You can also load characters with the `node --loader ts-node/esm src/index.ts --characters="path/to/your/character.json"` and run multiple bots at the same time. +2. **Configure Environment** -### Run with Llama +```bash +# Copy example environment file +cp .env.example .env +``` + +Edit `.env` and add your values: -You can run Llama 70B or 405B models by setting the `XAI_MODEL` environment variable to `meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` or `meta-llama/Meta-Llama-3.1-405B-Instruct` +```bash +# Required environment variables +DISCORD_APPLICATION_ID= # For Discord integration +DISCORD_API_TOKEN= # Bot token +OPENAI_API_KEY= # OpenAI API key (starting with sk-*) +ELEVENLABS_XI_API_KEY= # API key from elevenlabs (for voice) +``` -### Run with Grok +## Choose Your Model -You can run Grok models by setting the `XAI_MODEL` environment variable to `grok-beta` +Eliza supports multiple AI models: -### Run with OpenAI +- **Llama**: Set `XAI_MODEL=meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` +- **Grok**: Set `XAI_MODEL=grok-beta` +- **OpenAI**: Set `XAI_MODEL=gpt-4o-mini` or `gpt-4o` -You can run OpenAI models by setting the `XAI_MODEL` environment variable to `gpt-4o-mini` or `gpt-4o` +For local inference: -# Requires Node 20+ +1. Set `XAI_MODEL` to your chosen model +2. Leave `X_SERVER_URL` and `XAI_API_KEY` blank +3. The system will automatically download the model from Hugging Face -If you are getting strange issues when starting up, make sure you're using Node 20+. Some APIs are not compatible with previous versions. You can check your node version with `node -v`. If you need to install a new version of node, we recommend using [nvm](https://github.com/nvm-sh/nvm). +## Create Your First Agent -## Additional Requirements +1. **Edit the Character File** + Check out `src/core/defaultCharacter.ts` to customize your agent's personality and behavior. -You may need to install Sharp. If you see an error when starting up, try installing it with the following command: +You can also load custom characters: +```bash +pnpm start --characters="path/to/your/character.json" ``` -pnpm install --include=optional sharp + +2. **Start the Agent** + +```bash +pnpm start ``` -# Environment Setup +## Platform Integration + +### Discord Bot Setup -You will need to add environment variables to your .env file to connect to various platforms: +1. Create a new application at [Discord Developer Portal](https://discord.com/developers/applications) +2. Create a bot and get your token +3. Add bot to your server using OAuth2 URL generator +4. Set `DISCORD_API_TOKEN` and `DISCORD_APPLICATION_ID` in your `.env` +### Twitter Integration + +Add to your `.env`: + +```bash +TWITTER_USERNAME= # Account username +TWITTER_PASSWORD= # Account password +TWITTER_EMAIL= # Account email +TWITTER_COOKIES= # Account cookies ``` -# Required environment variables -# Start Discord -DISCORD_APPLICATION_ID= -DISCORD_API_TOKEN= # Bot token - -# Start Twitter -TWITTER_USERNAME= # Account username -TWITTER_PASSWORD= # Account password -TWITTER_EMAIL= # Account email -TWITTER_COOKIES= # Account cookies + +### Telegram Bot +1. Create a bot +2. Add your bot token to `.env`: + +```bash +TELEGRAM_BOT_TOKEN=your_token_here ``` -# Local Setup +## Optional: GPU Acceleration -## CUDA Setup +If you have an NVIDIA GPU: -If you have an NVIDIA GPU, you can install CUDA to speed up local inference dramatically. +```bash +# Install CUDA support +npx --no node-llama-cpp source download --gpu cuda +# Ensure CUDA Toolkit, cuDNN, and cuBLAS are installed ``` -pnpm install -npx --no node-llama-cpp source download --gpu cuda + +## Basic Usage Examples + +### Chat with Your Agent + +```bash +# Start chat interface +pnpm run shell ``` -Make sure that you've installed the CUDA Toolkit, including cuDNN and cuBLAS. +### Run Multiple Agents -## Running locally +```bash +pnpm start --characters="agent1.json,agent2.json" +``` -Add XAI_MODEL and set it to one of the above options from [Run with -Llama](#run-with-llama) - you can leave X_SERVER_URL and XAI_API_KEY blank, it -downloads the model from huggingface and queries it locally +## Common Issues & Solutions -# Cloud Setup (with OpenAI) +1. **Node.js Version** -In addition to the environment variables above, you will need to add the following: + - Ensure Node.js 22+ is installed + - Use `node -v` to check version + - Consider using [nvm](https://github.com/nvm-sh/nvm) to manage Node versions -``` -# OpenAI handles the bulk of the work with chat, TTS, image recognition, etc. -OPENAI_API_KEY=sk-* # OpenAI API key, starting with sk- - -# The agent can also ask Claude for help if you have an API key -ANTHROPIC_API_KEY= - -# For Elevenlabs voice generation on Discord voice -ELEVENLABS_XI_API_KEY= # API key from elevenlabs - -# ELEVENLABS SETTINGS -ELEVENLABS_MODEL_ID=eleven_multilingual_v2 -ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM -ELEVENLABS_VOICE_STABILITY=0.5 -ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 -ELEVENLABS_VOICE_STYLE=0.66 -ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false -ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 -ELEVENLABS_OUTPUT_FORMAT=pcm_16000 -``` +2. **Sharp Installation** + If you see Sharp-related errors: + + ```bash + pnpm install --include=optional sharp + ``` + +3. **CUDA Setup** + - Verify CUDA Toolkit installation + - Check GPU compatibility + - Ensure proper environment variables are set + +## Next Steps + +Once you have your agent running, explore: + +1. 🤖 [Understand Agents](./core/agents.md) +2. 📝 [Create Custom Characters](./core/characterfile.md) +3. ⚡ [Add Custom Actions](./core/actions.md) +4. 🔧 [Advanced Configuration](./guides/configuration.md) -# Discord Bot +For detailed API documentation, troubleshooting, and advanced features, check out our [full documentation](https://ai16z.github.io/eliza/). -For help with setting up your Discord Bot, check out here: https://discordjs.guide/preparations/setting-up-a-bot-application.html +Join our [Discord community](https://discord.gg/ai16z) for support and updates! diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 536ec26ea5..a32b9469c3 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,19 +1,16 @@ -// @ts-check import { themes as prismThemes } from "prism-react-renderer"; -/** @type {import('@docusaurus/types').Config} */ + const config = { title: "eliza", tagline: "The flexible, scalable AI agent for everyone", favicon: "img/favicon.ico", - - // GitHub Pages Configuration - url: "https://madjin.github.io", + url: "https://ai16z.github.io", baseUrl: "/eliza/", - organizationName: "madjin", + organizationName: "ai16z", projectName: "eliza", deploymentBranch: "gh-pages", trailingSlash: true, - onBrokenLinks: "throw", + onBrokenLinks: "ignore", onBrokenMarkdownLinks: "warn", i18n: { @@ -23,134 +20,163 @@ const config = { markdown: { mermaid: true, }, - themes: [ - "@docusaurus/theme-mermaid", - // Any other themes... - ], + themes: ["@docusaurus/theme-mermaid"], plugins: [ - // TypeDoc plugin for API documentation [ "docusaurus-plugin-typedoc", { entryPoints: ["../packages/core/src/index.ts"], tsconfig: "../tsconfig.json", - out: "./docs/api", + out: "./api", skipErrorChecking: true, + excludeExternals: false, + excludePrivate: true, + excludeProtected: false, + excludeInternal: false, + excludeNotDocumented: false, + plugin: ["typedoc-plugin-markdown"], + hideGenerator: true, + cleanOutputDir: true, + categorizeByGroup: true, + pretty: true, + includeVersion: true, + sort: ["source-order", "required-first", "visibility"], + gitRevision: "main", + readme: "none", + commentStyle: "all", + preserveAnchorCasing: true, + hideBreadcrumbs: false, + preserveWatchOutput: true, + disableSources: false, + validation: { + notExported: true, + invalidLink: true, + notDocumented: false + }, + exclude: [ + "**/_media/**", + "**/node_modules/**", + "**/dist/**", + "**/*.test.ts", + "**/*.spec.ts" + ], + watch: false, + treatWarningsAsErrors: true, + treatValidationWarningsAsErrors: true, + searchInComments: true, + navigationLinks: { + "GitHub": "https://github.com/ai16z/eliza", + "Documentation": "/docs/intro" + }, }, ], - // Search functionality require.resolve("docusaurus-lunr-search"), - // Separate API docs plugin instance [ "@docusaurus/plugin-content-docs", { id: "api", - path: "docs/api", - routeBasePath: "docs/api", - sidebarPath: "./sidebars.api.js", + path: "api", + routeBasePath: "api", }, ], ], presets: [ [ "classic", - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ + { docs: { sidebarPath: "./sidebars.js", editUrl: "https://github.com/ai16z/eliza/tree/main/docs/", routeBasePath: "docs", + exclude: ["**/_media/**"], }, theme: { customCss: "./src/css/custom.css", }, - }), + }, ], ], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - // Enable dark mode by default - colorMode: { - defaultMode: "dark", - disableSwitch: false, - respectPrefersColorScheme: true, + themeConfig: { + colorMode: { + defaultMode: "dark", + disableSwitch: false, + respectPrefersColorScheme: true, + }, + docs: { + sidebar: { + hideable: true, + autoCollapseCategories: true, }, - // Add sidebar configuration - docs: { - sidebar: { - hideable: true, - autoCollapseCategories: true, - }, + }, + navbar: { + title: "eliza", + logo: { + alt: "Eliza Logo", + src: "img/favicon.ico", }, - navbar: { - title: "eliza", - logo: { - alt: "Eliza Logo", - src: "img/favicon.ico", + items: [ + { + type: "docSidebar", + sidebarId: "tutorialSidebar", + position: "left", + label: "Documentation", }, - items: [ - { - type: "docSidebar", - sidebarId: "tutorialSidebar", - position: "left", - label: "Documentation", - }, - { - type: "doc", - docsPluginId: "api", - position: "left", - label: "API", - docId: "index", - }, - { - href: "https://github.com/ai16z/eliza", - label: "GitHub", - position: "right", - }, - ], - }, - footer: { - style: "dark", - links: [ - { - title: "Docs", - items: [ - { - label: "General", - href: "./", - }, - ], - }, - { - title: "Community", - items: [ - { - label: "Discord", - href: "https://discord.gg/NQHKW7US", - }, - { - label: "Twitter", - href: "https://twitter.com/pmairca", - }, - ], - }, - { - title: "More", - items: [ - { - label: "GitHub", - href: "https://github.com/ai16z/eliza", - }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} ai16z.ai`, - }, - prism: { - theme: prismThemes.github, - darkTheme: prismThemes.dracula, - }, - }), + { + type: "doc", + docsPluginId: "api", + position: "left", + label: "API", + docId: "index", + }, + { + href: "https://github.com/ai16z/eliza", + label: "GitHub", + position: "right", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { + label: "General", + href: "./", + }, + ], + }, + { + title: "Community", + items: [ + { + label: 'Discord', + href: 'https://discord.gg/ai16z' + }, + { + label: 'Twitter', + href: 'https://twitter.com/ai16zdao' + } + ] + }, + { + title: "More", + items: [ + { + label: "GitHub", + href: "https://github.com/ai16z/eliza", + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} ai16z.ai`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + }, }; + export default config; diff --git a/docs/package.json b/docs/package.json index 9b26464411..d284ffb691 100644 --- a/docs/package.json +++ b/docs/package.json @@ -34,7 +34,7 @@ "@docusaurus/types": "3.6.0", "docusaurus-plugin-typedoc": "^1.0.5", "typedoc": "^0.26.11", - "typedoc-plugin-markdown": "4.2.9" + "typedoc-plugin-markdown": "^4.2.9" }, "browserslist": { "production": [ diff --git a/docs/sidebars.api.js b/docs/sidebars.api.js deleted file mode 100644 index 678db1d4f7..0000000000 --- a/docs/sidebars.api.js +++ /dev/null @@ -1,11 +0,0 @@ -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - apiSidebar: [ - { - type: "autogenerated", - dirName: ".", - }, - ], -}; - -export default sidebars; diff --git a/docs/sidebars.js b/docs/sidebars.js index a7ac861e12..a870307cb2 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -4,61 +4,219 @@ const sidebars = { { type: "doc", id: "intro", - label: "Introduction", + label: "🚀 Introduction", }, { type: "category", - label: "Getting Started", - items: ["quickstart", "installation"], + label: "🏁 Getting Started", + items: [ + { + type: "doc", + id: "quickstart", + label: "⭐ Quick Start" + } + ], collapsed: false, }, { type: "category", - label: "Core Concepts", + label: "🧠 Core Concepts", collapsed: false, items: [ - "core/characterfile", - "core/agents", - "core/providers", - "core/actions", - "core/evaluators", + { + type: "doc", + id: "core/characterfile", + label: "Character Files" + }, + { + type: "doc", + id: "core/agents", + label: "Agents" + }, + { + type: "doc", + id: "core/providers", + label: "Providers" + }, + { + type: "doc", + id: "core/actions", + label: "Actions" + }, + { + type: "doc", + id: "core/evaluators", + label: "Evaluators" + }, ], }, { type: "category", - label: "Guides", + label: "📘 Guides", collapsed: false, items: [ - "guides/basic-usage", - "guides/configuration", - "guides/advanced", - "guides/secrets-management", - "guides/local-development", + { + type: "doc", + id: "guides/configuration", + label: "Configuration" + }, + { + type: "doc", + id: "guides/advanced", + label: "Advanced Usage" + }, + { + type: "doc", + id: "guides/secrets-management", + label: "Secrets Management" + }, + { + type: "doc", + id: "guides/local-development", + label: "Local Development" + }, ], }, { type: "category", - label: "Advanced Topics", + label: "🎓 Advanced Topics", collapsed: false, items: [ - "advanced/fine-tuning", - "advanced/infrastructure", - "advanced/trust-engine", - "advanced/autonomous-trading", + { + type: "doc", + id: "advanced/fine-tuning", + label: "Fine-tuning" + }, + { + type: "doc", + id: "advanced/infrastructure", + label: "Infrastructure" + }, + { + type: "doc", + id: "advanced/trust-engine", + label: "Trust Engine" + }, + { + type: "doc", + id: "advanced/autonomous-trading", + label: "Autonomous Trading" + }, ], }, { type: "category", - label: "Community", + label: "📦 Packages", collapsed: false, items: [ - "community/project-overview", - "community/spaces-notes", - "community/development-notes", - "community/contributing", + { + type: "doc", + id: "packages/packages", + label: "Overview" + }, + { + type: "doc", + id: "packages/core", + label: "Core Package" + }, + { + type: "doc", + id: "packages/adapters", + label: "Database Adapters" + }, + { + type: "doc", + id: "packages/clients", + label: "Client Packages" + }, + { + type: "doc", + id: "packages/agent", + label: "Agent Package" + }, + { + type: "doc", + id: "packages/plugins", + label: "Plugin System" + } ], }, - ], + { + type: "category", + label: "👥 Community", + collapsed: false, + items: [ + { + type: "doc", + id: "community/creator-fund", + label: "💰 Creator Fund", + }, + { + type: "category", + label: "📺 Stream Notes", + items: [ + { + type: "doc", + id: "community/stream-notes", + label: "Overview" + }, + { + type: "category", + label: "November 2024", + items: [ + { + type: "doc", + id: "community/streams/2024-11-08", + label: "X: Memes, AI Agents, and DAOs" + }, + { + type: "doc", + id: "community/streams/2024-11-06", + label: "Discord Development Stream" + } + ] + }, + { + type: "category", + label: "October 2024", + items: [ + { + type: "doc", + id: "community/streams/2024-10-29", + label: "X: AI Agents & Crypto" + }, + { + type: "doc", + id: "community/streams/2024-10-27", + label: "X: Building Autonomous Agents" + }, + { + type: "doc", + id: "community/streams/2024-10-25", + label: "X: Eliza Framework" + } + ] + } + ] + }, + { + type: "doc", + id: "community/changelog", + label: "📝 Changelog", + }, + { + type: "doc", + id: "community/faq", + label: "❓ FAQ", + }, + { + type: "doc", + id: "community/contributing", + label: "🤝 Contributing" + } + ] + } + ] }; export default sidebars; diff --git a/docs/sidebars1.js b/docs/sidebars1.js deleted file mode 100644 index e7adaa4a4a..0000000000 --- a/docs/sidebars1.js +++ /dev/null @@ -1,22 +0,0 @@ -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - tutorialSidebar: [ - { - type: "category", - label: "Getting Started", - items: ["intro", "quickstart", "installation"], - }, - { - type: "category", - label: "Guides", - items: [ - "guides/basic-usage", - "guides/configuration", - "guides/characterfile", - "guides/advanced", - ], - }, - ], -}; - -export default sidebars; diff --git a/docs/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js index e5b4508f52..cab5a879a6 100644 --- a/docs/src/components/HomepageFeatures/index.js +++ b/docs/src/components/HomepageFeatures/index.js @@ -4,53 +4,59 @@ import styles from "./styles.module.css"; const FeatureList = [ { - title: "Made By Users", + icon: "🤖", + title: "Multi-Agent Framework", description: ( <> - eliza is open source, community developed and designed to be and easy to - use. + Build and deploy autonomous AI agents with consistent + personalities across Discord, Twitter, and Telegram. Full support for + voice, text, and media interactions. ), }, { - title: "Just Works", + icon: "🧠", + title: "Advanced Capabilities", description: ( <> - Simple, tested, used in production. Configurable enough, batteries - included. + Built-in RAG memory system, document processing, media analysis, and + autonomous trading capabilities. Supports multiple AI models including + Llama, GPT-4, and Claude. ), }, { - title: "For a Better World", + icon: "🔌", + title: "Extensible Design", description: ( <> - If you have ideas for how to make better agents for everyone,{" "} - let's do it together. + Create custom actions, add new platform integrations, and extend + functionality through a modular plugin system. Full TypeScript + support. ), }, ]; -function Feature({ Svg, title, description }) { +function Feature({ icon, title, description }) { return ( -

+
- {/*
- -
*/} -
- {title} +
+ {icon} + + {title} +

{description}

@@ -63,9 +69,11 @@ export default function HomepageFeatures() {
- {FeatureList.map((props, idx) => ( - - ))} +
+ {FeatureList.map((props, idx) => ( + + ))} +
diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css index b248eb2e5d..8c7ff50f7f 100644 --- a/docs/src/components/HomepageFeatures/styles.module.css +++ b/docs/src/components/HomepageFeatures/styles.module.css @@ -3,9 +3,57 @@ align-items: center; padding: 2rem 0; width: 100%; + flex-wrap: wrap; } .featureSvg { height: 200px; width: 200px; } + +.featureIcon { + height: 100px; + width: 100px; + font-size: 2rem; +} + +.featureGrid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1rem; +} + +@media (max-width: 768px) { + .featureGrid { + grid-template-columns: repeat(2, 1fr); + gap: 0rem; + } + + .featureSvg { + height: 150px; + width: 150px; + } + + .featureIcon { + height: 80px; + width: 80px; + font-size: 1.5rem; + } +} + +@media (max-width: 480px) { + .featureGrid { + grid-template-columns: 1fr; + } + + .featureSvg { + height: 100px; + width: 100px; + } + + .featureIcon { + height: 60px; + width: 60px; + font-size: 1.2rem; + } +} diff --git a/docs/src/components/HomepageHeader/index.js b/docs/src/components/HomepageHeader/index.js index b6759bc6f8..969e2108fe 100644 --- a/docs/src/components/HomepageHeader/index.js +++ b/docs/src/components/HomepageHeader/index.js @@ -44,7 +44,7 @@ function HomepageHeader() { alt="blurred" />
-              {`npm install eliza`}
+              {`npm package coming soon`}
             
diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index ab05cc5c01..af54dbd776 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -6,7 +6,7 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: darkblue; + --ifm-color-primary: #ffa600; --ifm-color-primary-dark: #29784c; --ifm-color-primary-darker: #277148; --ifm-color-primary-darkest: #205d3b; @@ -27,4 +27,27 @@ --ifm-color-primary-lighter: #32d8b4; --ifm-color-primary-lightest: #4fddbf; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --ifm-footer-background-color: #ffa600; +} + +.footer { + background-color: #242736; +} + +.button--primary { + background: linear-gradient( + 180deg, + var(--token-e94f1f99-3833-4c15-8d11-a67e80285705, rgb(249, 140, 19)) + /* {"name":"Orange"} */ 0%, + rgb(255, 166, 0) 100% + ); + border: none; + padding: 1rem 2rem; + font-size: 1.2rem; + transition: background 0.3s; + color: white; +} + +.button--primary:hover { + background: linear-gradient(rgb(255, 156, 43) 0%, rgb(255, 166, 0) 100%); } diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index ce448e0a0b..78ce7d5972 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -2,38 +2,13 @@ import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import HomepageFeatures from "@site/src/components/HomepageFeatures"; import Layout from "@theme/Layout"; -import Heading from "@theme/Heading"; import styles from "./index.module.css"; - -function HomepageHeader() { - const { siteConfig } = useDocusaurusContext(); - return ( -
-
- - {siteConfig.title} - -

{siteConfig.tagline}

-
-
- ); -} +import HomepageHeader from "../components/HomepageHeader"; export default function Home() { const { siteConfig } = useDocusaurusContext(); return ( -
diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico index cc99810a03409cd02ea696792006ec72e99db65c..7bc84ea064edcc85589d41a41019b9e9fef925c1 100644 GIT binary patch literal 15406 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 ZQ6jt2W5szyezphw$G`trf&b?f_@8sb&Km## literal 15406 zcmeI3d5Dc)7{}i+W8Y>l_GN5iBpFL1k@+FAWEcLhOh`Z3Llm-vvKEnjQsN(qP_{HF zh7d}~PS))E&hvXe=l46e_kHKy>%Q)L-}&9&Z%*Cb?VR&`&vTyhJkNQaa}6WGNHmg@ z4fC32{F!7JS%zVxrTzV!kzyFR=DWDRBHRH#rvmMvQ*Cr_S~$&)9`s8OTj^XJdM?C0CJZ&IpM zDVZ^2MxgG`pFd^5fB`aY+_=EIP&c~$%$YN7Rrc=PD@jR7a`*0C+k59jsP^a2pBHli zWXFyj&L+0!Q0?>c^Huxx>(|@rJ0C)|U%GUuYQJyaK4%l#vu@wEZCkl_@1FX0_Uu`y zRH>5sy?*`LR^R!c+r#VZ>}+Y$q>18N$&w{y*REa8>II&4d-(t9(n!u|lq1 zy;`7duotw4mUI4s)eZIzn#}X>w7+@trmR`BMiLSdeycsQpO=>>Lx&EP#fujQgBS5T zWImD-R4KT4iJnO_e}9-i^i!x336`Qd1v!9BeEs@WzI^#2-1||G9rX9?*|ViXhYnJ= zZe6Kav!=9e-CF5lbXlbG30W6xWy+LM7?2Y$iW~aKU$<`E z6#eAnDVdP<+|u8;abtk~h!G<~_8aL3xAd{ijGbTm z_U&!!BvP8zdT!}&*|H@-zeS4{^8NdFYj>{i-O@)7=<%Z)qt(xD=p+AKyLJuG@7=q% z>+w1pxS@aT+BM~8>+#Q>JJ;Er>t`$d#Kc57aNt1DKJd}Hckdn;J9ST=J{`2Ko0m@d z4H`61`oNxEe#(&T&*v?w*BNka<_l~e(BSvPr#=5Nngt{ zykHNHEo;}Vogfc|RkTbL7JaYjnsW8OF2qU95Ur78{)*xxUQ1U|f3fBOx)Ghkk9&Uq z_JY6m@Zm!_e*CzKyRTcfPQ_<)b93e3!Gm(+#*K(_3Vx3h|B@KnlqpjrGc!|a)Tp8S zveKnXEBjckTsh_UXJll^=+UF)%$YMW^GV%|9Xn30fLu-a^5s<=+*Eh!%5!>py4tf2 z9z0k&ckV3p>eW+zCO+r%>C@%bty@v=q21uM)+NTeV8H@u+_-VT2Ln5~0QPsp8m?cz zE+0RBRIylmRro%B{CG7t#OtV+XU6Xf!*+wGcJ11>eH!sO`1;_%gOKt;40Ykcg(}{P z@0pgCrq+hvV<3i!oWpZ1GdVdq^5)GO>of(uCvHo=iMgU}!-froe3_p*%84IdlDA|{ zL{g9~Vo2a8p3%2&U(ffq;c!HYpEBbkff%j24s-j<+Eqc z!m-V>Z_(lh$nD#=1)HGP5OTD2>sDXpzzh7u*|N=?vBuApJz=D4D4NOe0zWon$dDm6 z{7suS4VlM@2CuWN7x?j)#*Q6p!(XdbEje}Sl#`t2&tBoj9$V#ya|^_gW37k0!cSh) zil2Dz?%liN0zWo@vpeyM|K-b<(xy!t8-C=6*i<~o4|@iDYAgTA+jE90)+Ji`XU{`E zvuxS2HvHINVsf!A(c&joh^^x6kCp%A=yd)lmSYHppO|hW{tJ44)22-Yc#jXeYSk)V z_A^fW@Q||*_|TlO2(|v;?Y3>(qKY9Hgb5R5>eQ(!=D_})Jv%-==Q7F1 z;oIP2YRvk|yI#F|75e^V(xgf1T*$O((*k)d<^_Dtb*i!RJ}WCr`8t@roZGU7rVK4DrB! zt9?Iw_^`4^@xp)h8%K{GRkr@zxpOjT(4c_q!~_5NPY}KU`4*iA(!7rc{Mb$AfLtPb zJkE{l{6jq8*E(7IG{`^ynIisyPZkgBSC4@!;~-AVx%8bocgnC~!&J_Wm{dF#;vs(L V;Np=_|252}?kFln9QbVx`~@iAf}H>W

q{SbUR{PhNdj>mFM_h(99O29A*O&l2hYrAu%Iq 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