diff --git a/README.md b/README.md index 5ee788e692..538a3a6b45 100644 --- a/README.md +++ b/README.md @@ -1,149 +1,149 @@ -# Eliza 🤖 - -
- Eliza Banner -
- -
- -📖 [Documentation](https://elizaos.github.io/eliza/) | 🎯 [Examples](https://github.com/thejoven/awesome-eliza) - -
- -## 🌍 README Translations - -[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) | [Deutsch](./README_DE.md) | [Tiếng Việt](./README_VI.md) | [עִברִית](https://github.com/elizaos/Elisa/blob/main/README_HE.md) | [Tagalog](./README_TG.md) | [Polski](./README_PL.md) | [Arabic](./README_AR.md) | [Hungarian](./README_HU.md) | [Srpski](./README_RS.md) | [Română](./README_RO.md) - -## 🚩 Overview - -
- Eliza Diagram -
- -## ✨ Features - -- 🛠️ Full-featured Discord, Twitter and Telegram connectors -- 🔗 Support for every model (Llama, Grok, OpenAI, Anthropic, etc.) -- 👥 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 -- ☁️ Supports many models (local Llama, OpenAI, Anthropic, Groq, etc.) -- 📦 Just works! - -## Video Tutorials - -[AI Agent Dev School](https://www.youtube.com/watch?v=ArptLpQiKfI&list=PLx5pnFXdPTRzWla0RaOxALTSTnVq53fKL) - -## 🎯 Use Cases - -- 🤖 Chatbots -- 🕵️ Autonomous Agents -- 📈 Business Process Handling -- 🎮 Video Game NPCs -- 🧠 Trading - -## 🚀 Quick Start - -### Prerequisites - -- [Python 2.7+](https://www.python.org/downloads/) -- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) -- [pnpm](https://pnpm.io/installation) - -> **Note for Windows Users:** [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual) is required. - -### Use the Starter (Recommended) - -```bash -git clone https://github.com/elizaos/eliza-starter.git -cd eliza-starter -cp .env.example .env -pnpm i && pnpm build && pnpm start -``` - -Once the agent is running, you should see the message to run "pnpm start:client" at the end. -Open another terminal and move to same directory and then run below command and follow the URL to chat to your agent. - -```bash -pnpm start:client -``` - -Then read the [Documentation](https://elizaos.github.io/eliza/) to learn how to customize your Eliza. - -### Manually Start Eliza (Only recommended if you know what you are doing) - -```bash -# Clone the repository -git clone https://github.com/elizaos/eliza.git - -# Checkout the latest release -# This project iterates fast, so we recommend checking out the latest release -git checkout $(git describe --tags --abbrev=0) -``` - -### Start Eliza with Gitpod - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/elizaos/eliza/tree/main) - -### Edit the .env file - -Copy .env.example to .env and fill in the appropriate values. - -``` -cp .env.example .env -``` - -Note: .env is optional. If you're planning to run multiple distinct agents, you can pass secrets through the character JSON - -### Automatically Start Eliza - -This will run everything to set up the project and start the bot with the default character. - -```bash -sh scripts/start.sh -``` - -### Edit the character file - -1. Open `packages/core/src/defaultCharacter.ts` to modify the default character. Uncomment and edit. - -2. To load custom characters: - - Use `pnpm start --characters="path/to/your/character.json"` - - Multiple character files can be loaded simultaneously -3. Connect with X (Twitter) - - change `"clients": []` to `"clients": ["twitter"]` in the character file to connect with X - -### Manually Start Eliza - -```bash -pnpm i -pnpm build -pnpm start - -# The project iterates fast, sometimes you need to clean the project if you are coming back to the project -pnpm clean -``` - -#### Additional Requirements - -You may need to install Sharp. If you see an error when starting up, try installing it with the following command: - -``` -pnpm install --include=optional sharp -``` - -### Community & contact - -- [GitHub Issues](https://github.com/elizaos/eliza/issues). Best for: bugs you encounter using Eliza, and feature proposals. -- [Discord](https://discord.gg/ai16z). Best for: sharing your applications and hanging out with the community. - -## Contributors - - - - - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=elizaos/eliza&type=Date)](https://star-history.com/#elizaos/eliza&Date) +# Eliza 🤖 + +
+ Eliza Banner +
+ +
+ +📖 [Documentation](https://elizaos.github.io/eliza/) | 🎯 [Examples](https://github.com/thejoven/awesome-eliza) + +
+ +## 🌍 README Translations + +[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) | [Deutsch](./README_DE.md) | [Tiếng Việt](./README_VI.md) | [עִברִית](https://github.com/elizaos/Elisa/blob/main/README_HE.md) | [Tagalog](./README_TG.md) | [Polski](./README_PL.md) | [Arabic](./README_AR.md) | [Hungarian](./README_HU.md) | [Srpski](./README_RS.md) | [Română](./README_RO.md) + +## 🚩 Overview + +
+ Eliza Diagram +
+ +## ✨ Features + +- 🛠️ Full-featured Discord, Twitter and Telegram connectors +- 🔗 Support for every model (Llama, Grok, OpenAI, Anthropic, etc.) +- 👥 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 +- ☁️ Supports many models (local Llama, OpenAI, Anthropic, Groq, etc.) +- 📦 Just works! + +## Video Tutorials + +[AI Agent Dev School](https://www.youtube.com/watch?v=ArptLpQiKfI&list=PLx5pnFXdPTRzWla0RaOxALTSTnVq53fKL) + +## 🎯 Use Cases + +- 🤖 Chatbots +- 🕵️ Autonomous Agents +- 📈 Business Process Handling +- 🎮 Video Game NPCs +- 🧠 Trading + +## 🚀 Quick Start + +### Prerequisites + +- [Python 2.7+](https://www.python.org/downloads/) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) + +> **Note for Windows Users:** [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual) is required. + +### Use the Starter (Recommended) + +```bash +git clone https://github.com/elizaos/eliza-starter.git +cd eliza-starter +cp .env.example .env +pnpm i && pnpm build && pnpm start +``` + +Once the agent is running, you should see the message to run "pnpm start:client" at the end. +Open another terminal and move to same directory and then run below command and follow the URL to chat to your agent. + +```bash +pnpm start:client +``` + +Then read the [Documentation](https://elizaos.github.io/eliza/) to learn how to customize your Eliza. + +### Manually Start Eliza (Only recommended if you know what you are doing) + +```bash +# Clone the repository +git clone https://github.com/elizaos/eliza.git + +# Checkout the latest release +# This project iterates fast, so we recommend checking out the latest release +git checkout $(git describe --tags --abbrev=0) +``` + +### Start Eliza with Gitpod + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/elizaos/eliza/tree/main) + +### Edit the .env file + +Copy .env.example to .env and fill in the appropriate values. + +``` +cp .env.example .env +``` + +Note: .env is optional. If you're planning to run multiple distinct agents, you can pass secrets through the character JSON + +### Automatically Start Eliza + +This will run everything to set up the project and start the bot with the default character. + +```bash +sh scripts/start.sh +``` + +### Edit the character file + +1. Open `packages/core/src/defaultCharacter.ts` to modify the default character. Uncomment and edit. + +2. To load custom characters: + - Use `pnpm start --characters="path/to/your/character.json"` + - Multiple character files can be loaded simultaneously +3. Connect with X (Twitter) + - change `"clients": []` to `"clients": ["twitter"]` in the character file to connect with X + +### Manually Start Eliza + +```bash +pnpm i +pnpm build +pnpm start + +# The project iterates fast, sometimes you need to clean the project if you are coming back to the project +pnpm clean +``` + +#### Additional Requirements + +You may need to install Sharp. If you see an error when starting up, try installing it with the following command: + +``` +pnpm install --include=optional sharp +``` + +### Community & contact + +- [GitHub Issues](https://github.com/elizaos/eliza/issues). Best for: bugs you encounter using Eliza, and feature proposals. +- [Discord](https://discord.gg/ai16z). Best for: sharing your applications and hanging out with the community. + +## Contributors + + + + + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=elizaos/eliza&type=Date)](https://star-history.com/#elizaos/eliza&Date) diff --git a/packages/client-discord/src/actions/chat_with_attachments.ts b/packages/client-discord/src/actions/chat_with_attachments.ts index 67e0cc682d..8f62a77510 100644 --- a/packages/client-discord/src/actions/chat_with_attachments.ts +++ b/packages/client-discord/src/actions/chat_with_attachments.ts @@ -1,6 +1,5 @@ -import { composeContext } from "@elizaos/core"; +import { composeContext, getModelSettings } from "@elizaos/core"; import { generateText, trimTokens } from "@elizaos/core"; -import { models } from "@elizaos/core"; import { parseJSONObjectFromText } from "@elizaos/core"; import { Action, @@ -185,8 +184,11 @@ const summarizeAction = { let currentSummary = ""; - const model = models[runtime.character.modelProvider]; - const chunkSize = model.settings.maxOutputTokens; + const modelSettings = getModelSettings( + runtime.character.modelProvider, + ModelClass.SMALL + ); + const chunkSize = modelSettings.maxOutputTokens; state.attachmentsWithText = attachmentsWithText; state.objective = objective; diff --git a/packages/client-discord/src/actions/summarize_conversation.ts b/packages/client-discord/src/actions/summarize_conversation.ts index d9c9be6f42..accda5168e 100644 --- a/packages/client-discord/src/actions/summarize_conversation.ts +++ b/packages/client-discord/src/actions/summarize_conversation.ts @@ -1,7 +1,6 @@ -import { composeContext } from "@elizaos/core"; +import { composeContext, getModelSettings } from "@elizaos/core"; import { generateText, splitChunks, trimTokens } from "@elizaos/core"; import { getActorDetails } from "@elizaos/core"; -import { models } from "@elizaos/core"; import { parseJSONObjectFromText } from "@elizaos/core"; import { Action, @@ -247,8 +246,11 @@ const summarizeAction = { let currentSummary = ""; - const model = models[runtime.character.settings.model]; - const chunkSize = model.settings.maxContextLength - 1000; + const modelSettings = getModelSettings( + runtime.character.modelProvider, + ModelClass.SMALL + ); + const chunkSize = modelSettings.maxOutputTokens - 1000; const chunks = await splitChunks(formattedMemories, chunkSize, 0); diff --git a/packages/client-slack/src/actions/chat_with_attachments.ts b/packages/client-slack/src/actions/chat_with_attachments.ts index 169add1222..e059cc47b4 100644 --- a/packages/client-slack/src/actions/chat_with_attachments.ts +++ b/packages/client-slack/src/actions/chat_with_attachments.ts @@ -3,6 +3,7 @@ import { generateText, trimTokens, parseJSONObjectFromText, + getModelSettings, } from "@elizaos/core"; import { models } from "@elizaos/core"; import { @@ -194,8 +195,11 @@ const summarizeAction: Action = { let currentSummary = ""; - const model = models[runtime.character.modelProvider]; - const chunkSize = model.settings.maxOutputTokens; + const modelSettings = getModelSettings( + runtime.character.modelProvider, + ModelClass.SMALL + ); + const chunkSize = modelSettings.maxOutputTokens; currentState.attachmentsWithText = attachmentsWithText; currentState.objective = objective; diff --git a/packages/client-slack/src/actions/summarize_conversation.ts b/packages/client-slack/src/actions/summarize_conversation.ts index ec98e1f10d..b487757cad 100644 --- a/packages/client-slack/src/actions/summarize_conversation.ts +++ b/packages/client-slack/src/actions/summarize_conversation.ts @@ -4,6 +4,7 @@ import { splitChunks, trimTokens, parseJSONObjectFromText, + getModelSettings, } from "@elizaos/core"; import { models } from "@elizaos/core"; import { getActorDetails } from "@elizaos/core"; @@ -265,8 +266,11 @@ const summarizeAction: Action = { let currentSummary = ""; - const model = models[runtime.character.modelProvider]; - const chunkSize = model.settings.maxOutputTokens; + const modelSettings = getModelSettings( + runtime.character.modelProvider, + ModelClass.SMALL + ); + const chunkSize = modelSettings.maxOutputTokens; const chunks = await splitChunks(formattedMemories, chunkSize, 0); diff --git a/packages/core/src/embedding.ts b/packages/core/src/embedding.ts index 659001b0c2..b1dea7c685 100644 --- a/packages/core/src/embedding.ts +++ b/packages/core/src/embedding.ts @@ -1,5 +1,5 @@ import path from "node:path"; -import { models } from "./models.ts"; +import { getEmbeddingModelSettings, getEndpoint } from "./models.ts"; import { IAgentRuntime, ModelProviderName } from "./types.ts"; import settings from "./settings.ts"; import elizaLogger from "./logger.ts"; @@ -33,19 +33,20 @@ export type EmbeddingConfig = { export const getEmbeddingConfig = (): EmbeddingConfig => ({ dimensions: settings.USE_OPENAI_EMBEDDING?.toLowerCase() === "true" - ? 1536 // OpenAI + ? getEmbeddingModelSettings(ModelProviderName.OPENAI).dimensions : settings.USE_OLLAMA_EMBEDDING?.toLowerCase() === "true" - ? 1024 // Ollama mxbai-embed-large + ? getEmbeddingModelSettings(ModelProviderName.OLLAMA).dimensions : settings.USE_GAIANET_EMBEDDING?.toLowerCase() === "true" - ? 768 // GaiaNet + ? getEmbeddingModelSettings(ModelProviderName.GAIANET) + .dimensions : 384, // BGE model: settings.USE_OPENAI_EMBEDDING?.toLowerCase() === "true" - ? "text-embedding-3-small" + ? getEmbeddingModelSettings(ModelProviderName.OPENAI).name : settings.USE_OLLAMA_EMBEDDING?.toLowerCase() === "true" - ? settings.OLLAMA_EMBEDDING_MODEL || "mxbai-embed-large" + ? getEmbeddingModelSettings(ModelProviderName.OLLAMA).name : settings.USE_GAIANET_EMBEDDING?.toLowerCase() === "true" - ? settings.GAIANET_EMBEDDING_MODEL || "nomic-embed" + ? getEmbeddingModelSettings(ModelProviderName.GAIANET).name : "BGE-small-en-v1.5", provider: settings.USE_OPENAI_EMBEDDING?.toLowerCase() === "true" @@ -134,11 +135,17 @@ export function getEmbeddingZeroVector(): number[] { let embeddingDimension = 384; // Default BGE dimension if (settings.USE_OPENAI_EMBEDDING?.toLowerCase() === "true") { - embeddingDimension = 1536; // OpenAI dimension + embeddingDimension = getEmbeddingModelSettings( + ModelProviderName.OPENAI + ).dimensions; // OpenAI dimension } else if (settings.USE_OLLAMA_EMBEDDING?.toLowerCase() === "true") { - embeddingDimension = 1024; // Ollama mxbai-embed-large dimension + embeddingDimension = getEmbeddingModelSettings( + ModelProviderName.OLLAMA + ).dimensions; // Ollama mxbai-embed-large dimension } else if (settings.USE_GAIANET_EMBEDDING?.toLowerCase() === "true") { - embeddingDimension = 768; // GaiaNet dimension + embeddingDimension = getEmbeddingModelSettings( + ModelProviderName.GAIANET + ).dimensions; // GaiaNet dimension } return Array(embeddingDimension).fill(0); @@ -202,7 +209,7 @@ export async function embed(runtime: IAgentRuntime, input: string) { model: config.model, endpoint: runtime.character.modelEndpointOverride || - models[ModelProviderName.OLLAMA].endpoint, + getEndpoint(ModelProviderName.OLLAMA), isOllama: true, dimensions: config.dimensions, }); @@ -213,7 +220,7 @@ export async function embed(runtime: IAgentRuntime, input: string) { model: config.model, endpoint: runtime.character.modelEndpointOverride || - models[ModelProviderName.GAIANET].endpoint || + getEndpoint(ModelProviderName.GAIANET) || settings.SMALL_GAIANET_SERVER_URL || settings.MEDIUM_GAIANET_SERVER_URL || settings.LARGE_GAIANET_SERVER_URL, @@ -239,7 +246,7 @@ export async function embed(runtime: IAgentRuntime, input: string) { model: config.model, endpoint: runtime.character.modelEndpointOverride || - models[runtime.character.modelProvider].endpoint, + getEndpoint(runtime.character.modelProvider), apiKey: runtime.token, dimensions: config.dimensions, }); diff --git a/packages/core/src/generation.ts b/packages/core/src/generation.ts index 5db5b8e70a..0f15ff8dbb 100644 --- a/packages/core/src/generation.ts +++ b/packages/core/src/generation.ts @@ -18,7 +18,12 @@ import { AutoTokenizer } from "@huggingface/transformers"; import Together from "together-ai"; import { ZodSchema } from "zod"; import { elizaLogger } from "./index.ts"; -import { getModel, models } from "./models.ts"; +import { + models, + getModelSettings, + getImageModelSettings, + getEndpoint, +} from "./models.ts"; import { parseBooleanFromText, parseJsonArrayFromText, @@ -179,7 +184,7 @@ export async function generateText({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; tools?: Record; onStepFinish?: (event: StepResult) => Promise | void; maxSteps?: number; @@ -200,8 +205,9 @@ export async function generateText({ const provider = runtime.modelProvider; const endpoint = - runtime.character.modelEndpointOverride || models[provider].endpoint; - let model = models[provider].model[modelClass]; + runtime.character.modelEndpointOverride || getEndpoint(provider); + const modelSettings = getModelSettings(runtime.modelProvider, modelClass); + let model = modelSettings.name; // allow character.json settings => secrets to override models // FIXME: add MODEL_MEDIUM support @@ -273,23 +279,20 @@ export async function generateText({ const modelConfiguration = runtime.character?.settings?.modelConfig; const temperature = - modelConfiguration?.temperature || - models[provider].settings.temperature; + modelConfiguration?.temperature || modelSettings.temperature; const frequency_penalty = modelConfiguration?.frequency_penalty || - models[provider].settings.frequency_penalty; + modelSettings.frequency_penalty; const presence_penalty = - modelConfiguration?.presence_penalty || - models[provider].settings.presence_penalty; + modelConfiguration?.presence_penalty || modelSettings.presence_penalty; const max_context_length = - modelConfiguration?.maxInputTokens || - models[provider].settings.maxInputTokens; + modelConfiguration?.maxInputTokens || modelSettings.maxInputTokens; const max_response_length = modelConfiguration?.max_response_length || - models[provider].settings.maxOutputTokens; + modelSettings.maxOutputTokens; const experimental_telemetry = modelConfiguration?.experimental_telemetry || - models[provider].settings.experimental_telemetry; + modelSettings.experimental_telemetry; const apiKey = runtime.token; @@ -302,7 +305,7 @@ export async function generateText({ let response: string; - const _stop = stop || models[provider].settings.stop; + const _stop = stop || modelSettings.stop; elizaLogger.debug( `Using provider: ${provider}, model: ${model}, temperature: ${temperature}, max response length: ${max_response_length}` ); @@ -565,7 +568,7 @@ export async function generateText({ case ModelProviderName.REDPILL: { elizaLogger.debug("Initializing RedPill model."); - const serverUrl = models[provider].endpoint; + const serverUrl = getEndpoint(provider); const openai = createOpenAI({ apiKey, baseURL: serverUrl, @@ -596,7 +599,7 @@ export async function generateText({ case ModelProviderName.OPENROUTER: { elizaLogger.debug("Initializing OpenRouter model."); - const serverUrl = models[provider].endpoint; + const serverUrl = getEndpoint(provider); const openrouter = createOpenAI({ apiKey, baseURL: serverUrl, @@ -630,7 +633,7 @@ export async function generateText({ elizaLogger.debug("Initializing Ollama model."); const ollamaProvider = createOllama({ - baseURL: models[provider].endpoint + "/api", + baseURL: getEndpoint(provider) + "/api", fetch: runtime.fetch, }); const ollama = ollamaProvider(model); @@ -688,7 +691,7 @@ export async function generateText({ case ModelProviderName.GAIANET: { elizaLogger.debug("Initializing GAIANET model."); - var baseURL = models[provider].endpoint; + var baseURL = getEndpoint(provider); if (!baseURL) { switch (modelClass) { case ModelClass.SMALL: @@ -830,7 +833,7 @@ export async function generateShouldRespond({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; }): Promise<"RESPOND" | "IGNORE" | "STOP" | null> { let retryDelay = 1000; while (true) { @@ -913,15 +916,12 @@ export async function generateTrueOrFalse({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; }): Promise { let retryDelay = 1000; - + const modelSettings = getModelSettings(runtime.modelProvider, modelClass); const stop = Array.from( - new Set([ - ...(models[runtime.modelProvider].settings.stop || []), - ["\n"], - ]) + new Set([...(modelSettings.stop || []), ["\n"]]) ) as string[]; while (true) { @@ -968,7 +968,7 @@ export async function generateTextArray({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; }): Promise { if (!context) { elizaLogger.error("generateTextArray context is empty"); @@ -1004,7 +1004,7 @@ export async function generateObjectDeprecated({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; }): Promise { if (!context) { elizaLogger.error("generateObjectDeprecated context is empty"); @@ -1040,7 +1040,7 @@ export async function generateObjectArray({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; }): Promise { if (!context) { elizaLogger.error("generateObjectArray context is empty"); @@ -1088,10 +1088,10 @@ export async function generateMessageResponse({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; }): Promise { - const provider = runtime.modelProvider; - const max_context_length = models[provider].settings.maxInputTokens; + const modelSettings = getModelSettings(runtime.modelProvider, modelClass); + const max_context_length = modelSettings.maxInputTokens; context = await trimTokens(context, max_context_length, runtime); let retryLength = 1000; // exponential backoff @@ -1144,9 +1144,8 @@ export const generateImage = async ( data?: string[]; error?: any; }> => { - const model = getModel(runtime.imageModelProvider, ModelClass.IMAGE); - const modelSettings = models[runtime.imageModelProvider].imageSettings; - + const modelSettings = getImageModelSettings(runtime.imageModelProvider); + const model = modelSettings.name; elizaLogger.info("Generating image with options:", { imageModelProvider: model, }); @@ -1204,7 +1203,7 @@ export const generateImage = async ( seed: data.seed || -1, }, }, - model_id: data.modelId || "FLUX.1-dev", + model_id: model, deadline: 60, priority: 1, }), @@ -1226,7 +1225,7 @@ export const generateImage = async ( ) { const together = new Together({ apiKey: apiKey as string }); const response = await together.images.create({ - model: "black-forest-labs/FLUX.1-schnell", + model: model, prompt: data.prompt, width: data.width, height: data.height, @@ -1341,7 +1340,7 @@ export const generateImage = async ( "Content-Type": "application/json", }, body: JSON.stringify({ - model: data.modelId || "fluently-xl", + model: model, prompt: data.prompt, negative_prompt: data.negativePrompt, width: data.width, @@ -1387,8 +1386,7 @@ export const generateImage = async ( "Content-Type": "application/json", }, body: JSON.stringify({ - model_id: - data.modelId || "ByteDance/SDXL-Lightning", + model_id: model, prompt: data.prompt, width: data.width || 1024, height: data.height || 1024, @@ -1561,14 +1559,14 @@ export const generateObject = async ({ } const provider = runtime.modelProvider; - const model = models[provider].model[modelClass]; - const temperature = models[provider].settings.temperature; - const frequency_penalty = models[provider].settings.frequency_penalty; - const presence_penalty = models[provider].settings.presence_penalty; - const max_context_length = models[provider].settings.maxInputTokens; - const max_response_length = models[provider].settings.maxOutputTokens; - const experimental_telemetry = - models[provider].settings.experimental_telemetry; + const modelSettings = getModelSettings(runtime.modelProvider, modelClass); + const model = modelSettings.name; + const temperature = modelSettings.temperature; + const frequency_penalty = modelSettings.frequency_penalty; + const presence_penalty = modelSettings.presence_penalty; + const max_context_length = modelSettings.maxInputTokens; + const max_response_length = modelSettings.maxOutputTokens; + const experimental_telemetry = modelSettings.experimental_telemetry; const apiKey = runtime.token; try { @@ -1580,7 +1578,7 @@ export const generateObject = async ({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, - stop: stop || models[provider].settings.stop, + stop: stop || modelSettings.stop, experimental_telemetry: experimental_telemetry, }; @@ -1619,7 +1617,7 @@ interface ProviderOptions { mode?: "auto" | "json" | "tool"; experimental_providerMetadata?: Record; modelOptions: ModelSettings; - modelClass: string; + modelClass: ModelClass; context: string; } @@ -1873,7 +1871,7 @@ async function handleOllama({ provider, }: ProviderOptions): Promise> { const ollamaProvider = createOllama({ - baseURL: models[provider].endpoint + "/api", + baseURL: getEndpoint(provider) + "/api", }); const ollama = ollamaProvider(model); return await aiGenerateObject({ @@ -1902,7 +1900,7 @@ export async function generateTweetActions({ }: { runtime: IAgentRuntime; context: string; - modelClass: string; + modelClass: ModelClass; }): Promise { let retryDelay = 1000; while (true) { diff --git a/packages/core/src/models.ts b/packages/core/src/models.ts index 235edfc106..4355aee48b 100644 --- a/packages/core/src/models.ts +++ b/packages/core/src/models.ts @@ -1,531 +1,892 @@ import settings from "./settings.ts"; -import { Models, ModelProviderName, ModelClass } from "./types.ts"; +import { + Models, + ModelProviderName, + ModelClass, + ModelSettings, + ImageModelSettings, + EmbeddingModelSettings, +} from "./types.ts"; export const models: Models = { [ModelProviderName.OPENAI]: { endpoint: settings.OPENAI_API_URL || "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]: settings.SMALL_OPENAI_MODEL || "gpt-4o-mini", - [ModelClass.MEDIUM]: settings.MEDIUM_OPENAI_MODEL || "gpt-4o", - [ModelClass.LARGE]: settings.LARGE_OPENAI_MODEL || "gpt-4o", - [ModelClass.EMBEDDING]: - settings.EMBEDDING_OPENAI_MODEL || "text-embedding-3-small", - [ModelClass.IMAGE]: settings.IMAGE_OPENAI_MODEL || "dall-e-3", + [ModelClass.SMALL]: { + name: settings.SMALL_OPENAI_MODEL || "gpt-4o-mini", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: settings.MEDIUM_OPENAI_MODEL || "gpt-4o", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: settings.LARGE_OPENAI_MODEL || "gpt-4o", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.EMBEDDING]: { + name: + settings.EMBEDDING_OPENAI_MODEL || "text-embedding-3-small", + dimensions: 1536, + }, + [ModelClass.IMAGE]: { + name: settings.IMAGE_OPENAI_MODEL || "dall-e-3", + }, }, }, [ModelProviderName.ETERNALAI]: { endpoint: settings.ETERNALAI_URL, - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.0, - presence_penalty: 0.0, - temperature: 0.6, - }, model: { - [ModelClass.SMALL]: - settings.ETERNALAI_MODEL || - "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", - [ModelClass.MEDIUM]: - settings.ETERNALAI_MODEL || - "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", - [ModelClass.LARGE]: - settings.ETERNALAI_MODEL || - "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", - [ModelClass.EMBEDDING]: "", - [ModelClass.IMAGE]: "", + [ModelClass.SMALL]: { + name: + settings.ETERNALAI_MODEL || + "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: + settings.ETERNALAI_MODEL || + "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: + settings.ETERNALAI_MODEL || + "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, }, }, [ModelProviderName.ANTHROPIC]: { - settings: { - stop: [], - maxInputTokens: 200000, - maxOutputTokens: 4096, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.7, - }, endpoint: "https://api.anthropic.com/v1", model: { - [ModelClass.SMALL]: - settings.SMALL_ANTHROPIC_MODEL || "claude-3-haiku-20240307", - [ModelClass.MEDIUM]: - settings.MEDIUM_ANTHROPIC_MODEL || "claude-3-5-sonnet-20241022", - [ModelClass.LARGE]: - settings.LARGE_ANTHROPIC_MODEL || "claude-3-5-sonnet-20241022", + [ModelClass.SMALL]: { + name: + settings.SMALL_ANTHROPIC_MODEL || "claude-3-haiku-20240307", + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 4096, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_ANTHROPIC_MODEL || + "claude-3-5-sonnet-20241022", + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 4096, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + + [ModelClass.LARGE]: { + name: + settings.LARGE_ANTHROPIC_MODEL || + "claude-3-5-sonnet-20241022", + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 4096, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, }, }, [ModelProviderName.CLAUDE_VERTEX]: { - settings: { - stop: [], - maxInputTokens: 200000, - maxOutputTokens: 8192, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.7, - }, endpoint: "https://api.anthropic.com/v1", // TODO: check model: { - [ModelClass.SMALL]: "claude-3-5-sonnet-20241022", - [ModelClass.MEDIUM]: "claude-3-5-sonnet-20241022", - [ModelClass.LARGE]: "claude-3-opus-20240229", + [ModelClass.SMALL]: { + name: "claude-3-5-sonnet-20241022", + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: "claude-3-5-sonnet-20241022", + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: "claude-3-opus-20240229", + stop: [], + maxInputTokens: 200000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, }, }, [ModelProviderName.GROK]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.7, - }, endpoint: "https://api.x.ai/v1", model: { - [ModelClass.SMALL]: settings.SMALL_GROK_MODEL || "grok-2-1212", - [ModelClass.MEDIUM]: settings.MEDIUM_GROK_MODEL || "grok-2-1212", - [ModelClass.LARGE]: settings.LARGE_GROK_MODEL || "grok-2-1212", - [ModelClass.EMBEDDING]: - settings.EMBEDDING_GROK_MODEL || "grok-2-1212", // not sure about this one + [ModelClass.SMALL]: { + name: settings.SMALL_GROK_MODEL || "grok-2-1212", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: settings.MEDIUM_GROK_MODEL || "grok-2-1212", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: settings.LARGE_GROK_MODEL || "grok-2-1212", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: settings.EMBEDDING_GROK_MODEL || "grok-2-1212", // not sure about this one + }, }, }, [ModelProviderName.GROQ]: { endpoint: "https://api.groq.com/openai/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8000, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.7, - }, model: { - [ModelClass.SMALL]: - settings.SMALL_GROQ_MODEL || "llama-3.1-8b-instant", - [ModelClass.MEDIUM]: - settings.MEDIUM_GROQ_MODEL || "llama-3.3-70b-versatile", - [ModelClass.LARGE]: - settings.LARGE_GROQ_MODEL || "llama-3.2-90b-vision-preview", - [ModelClass.EMBEDDING]: - settings.EMBEDDING_GROQ_MODEL || "llama-3.1-8b-instant", + [ModelClass.SMALL]: { + name: settings.SMALL_GROQ_MODEL || "llama-3.1-8b-instant", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8000, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: settings.MEDIUM_GROQ_MODEL || "llama-3.3-70b-versatile", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8000, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: + settings.LARGE_GROQ_MODEL || "llama-3.2-90b-vision-preview", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8000, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: settings.EMBEDDING_GROQ_MODEL || "llama-3.1-8b-instant", + }, }, }, [ModelProviderName.LLAMACLOUD]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - repetition_penalty: 0.4, - temperature: 0.7, - }, - imageSettings: { - steps: 4, - }, endpoint: "https://api.llamacloud.com/v1", model: { - [ModelClass.SMALL]: "meta-llama/Llama-3.2-3B-Instruct-Turbo", - [ModelClass.MEDIUM]: "meta-llama-3.1-8b-instruct", - [ModelClass.LARGE]: "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", - [ModelClass.EMBEDDING]: - "togethercomputer/m2-bert-80M-32k-retrieval", - [ModelClass.IMAGE]: "black-forest-labs/FLUX.1-schnell", + [ModelClass.SMALL]: { + name: "meta-llama/Llama-3.2-3B-Instruct-Turbo", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: "meta-llama-3.1-8b-instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: "togethercomputer/m2-bert-80M-32k-retrieval", + }, + [ModelClass.IMAGE]: { + name: "black-forest-labs/FLUX.1-schnell", + steps: 4, + }, }, }, [ModelProviderName.TOGETHER]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - repetition_penalty: 0.4, - temperature: 0.7, - }, - imageSettings: { - steps: 4, - }, endpoint: "https://api.together.ai/v1", model: { - [ModelClass.SMALL]: "meta-llama/Llama-3.2-3B-Instruct-Turbo", - [ModelClass.MEDIUM]: "meta-llama-3.1-8b-instruct", - [ModelClass.LARGE]: "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", - [ModelClass.EMBEDDING]: - "togethercomputer/m2-bert-80M-32k-retrieval", - [ModelClass.IMAGE]: "black-forest-labs/FLUX.1-schnell", + [ModelClass.SMALL]: { + name: "meta-llama/Llama-3.2-3B-Instruct-Turbo", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: "meta-llama-3.1-8b-instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: "togethercomputer/m2-bert-80M-32k-retrieval", + }, + [ModelClass.IMAGE]: { + name: "black-forest-labs/FLUX.1-schnell", + steps: 4, + }, }, }, [ModelProviderName.LLAMALOCAL]: { - settings: { - stop: ["<|eot_id|>", "<|eom_id|>"], - maxInputTokens: 32768, - maxOutputTokens: 8192, - repetition_penalty: 0.4, - temperature: 0.7, - }, model: { - [ModelClass.SMALL]: - "NousResearch/Hermes-3-Llama-3.1-8B-GGUF/resolve/main/Hermes-3-Llama-3.1-8B.Q8_0.gguf?download=true", - [ModelClass.MEDIUM]: - "NousResearch/Hermes-3-Llama-3.1-8B-GGUF/resolve/main/Hermes-3-Llama-3.1-8B.Q8_0.gguf?download=true", // TODO: ?download=true - [ModelClass.LARGE]: - "NousResearch/Hermes-3-Llama-3.1-8B-GGUF/resolve/main/Hermes-3-Llama-3.1-8B.Q8_0.gguf?download=true", - // "RichardErkhov/NousResearch_-_Meta-Llama-3.1-70B-gguf", // TODO: - [ModelClass.EMBEDDING]: - "togethercomputer/m2-bert-80M-32k-retrieval", + [ModelClass.SMALL]: { + name: "NousResearch/Hermes-3-Llama-3.1-8B-GGUF/resolve/main/Hermes-3-Llama-3.1-8B.Q8_0.gguf?download=true", + stop: ["<|eot_id|>", "<|eom_id|>"], + maxInputTokens: 32768, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: "NousResearch/Hermes-3-Llama-3.1-8B-GGUF/resolve/main/Hermes-3-Llama-3.1-8B.Q8_0.gguf?download=true", // TODO: ?download=true + stop: ["<|eot_id|>", "<|eom_id|>"], + maxInputTokens: 32768, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: "NousResearch/Hermes-3-Llama-3.1-8B-GGUF/resolve/main/Hermes-3-Llama-3.1-8B.Q8_0.gguf?download=true", // "RichardErkhov/NousResearch_-_Meta-Llama-3.1-70B-gguf", // TODO: + stop: ["<|eot_id|>", "<|eom_id|>"], + maxInputTokens: 32768, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: "togethercomputer/m2-bert-80M-32k-retrieval", + }, }, }, [ModelProviderName.GOOGLE]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.7, - }, model: { - [ModelClass.SMALL]: - settings.SMALL_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "gemini-2.0-flash-exp", - [ModelClass.MEDIUM]: - settings.MEDIUM_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "gemini-2.0-flash-exp", - [ModelClass.LARGE]: - settings.LARGE_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "gemini-2.0-flash-exp", - [ModelClass.EMBEDDING]: - settings.EMBEDDING_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "text-embedding-004", + [ModelClass.SMALL]: { + name: + settings.SMALL_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "gemini-2.0-flash-exp", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "gemini-2.0-flash-exp", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: + settings.LARGE_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "gemini-2.0-flash-exp", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: + settings.EMBEDDING_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "text-embedding-004", + }, }, }, [ModelProviderName.REDPILL]: { endpoint: "https://api.red-pill.ai/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.0, - presence_penalty: 0.0, - temperature: 0.6, - }, // Available models: https://docs.red-pill.ai/get-started/supported-models // To test other models, change the models below model: { - [ModelClass.SMALL]: - settings.SMALL_REDPILL_MODEL || - settings.REDPILL_MODEL || - "gpt-4o-mini", - [ModelClass.MEDIUM]: - settings.MEDIUM_REDPILL_MODEL || - settings.REDPILL_MODEL || - "gpt-4o", - [ModelClass.LARGE]: - settings.LARGE_REDPILL_MODEL || - settings.REDPILL_MODEL || - "gpt-4o", - [ModelClass.EMBEDDING]: "text-embedding-3-small", + [ModelClass.SMALL]: { + name: + settings.SMALL_REDPILL_MODEL || + settings.REDPILL_MODEL || + "gpt-4o-mini", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_REDPILL_MODEL || + settings.REDPILL_MODEL || + "gpt-4o", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + + [ModelClass.LARGE]: { + name: + settings.LARGE_REDPILL_MODEL || + settings.REDPILL_MODEL || + "gpt-4o", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + + [ModelClass.EMBEDDING]: { + name: "text-embedding-3-small", + }, }, }, [ModelProviderName.OPENROUTER]: { endpoint: "https://openrouter.ai/api/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.7, - }, // Available models: https://openrouter.ai/models // To test other models, change the models below model: { - [ModelClass.SMALL]: - settings.SMALL_OPENROUTER_MODEL || - settings.OPENROUTER_MODEL || - "nousresearch/hermes-3-llama-3.1-405b", - [ModelClass.MEDIUM]: - settings.MEDIUM_OPENROUTER_MODEL || - settings.OPENROUTER_MODEL || - "nousresearch/hermes-3-llama-3.1-405b", - [ModelClass.LARGE]: - settings.LARGE_OPENROUTER_MODEL || - settings.OPENROUTER_MODEL || - "nousresearch/hermes-3-llama-3.1-405b", - [ModelClass.EMBEDDING]: "text-embedding-3-small", + [ModelClass.SMALL]: { + name: + settings.SMALL_OPENROUTER_MODEL || + settings.OPENROUTER_MODEL || + "nousresearch/hermes-3-llama-3.1-405b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_OPENROUTER_MODEL || + settings.OPENROUTER_MODEL || + "nousresearch/hermes-3-llama-3.1-405b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: + settings.LARGE_OPENROUTER_MODEL || + settings.OPENROUTER_MODEL || + "nousresearch/hermes-3-llama-3.1-405b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: "text-embedding-3-small", + }, }, }, [ModelProviderName.OLLAMA]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.7, - }, endpoint: settings.OLLAMA_SERVER_URL || "http://localhost:11434", model: { - [ModelClass.SMALL]: - settings.SMALL_OLLAMA_MODEL || - settings.OLLAMA_MODEL || - "llama3.2", - [ModelClass.MEDIUM]: - settings.MEDIUM_OLLAMA_MODEL || - settings.OLLAMA_MODEL || - "hermes3", - [ModelClass.LARGE]: - settings.LARGE_OLLAMA_MODEL || - settings.OLLAMA_MODEL || - "hermes3:70b", - [ModelClass.EMBEDDING]: - settings.OLLAMA_EMBEDDING_MODEL || "mxbai-embed-large", + [ModelClass.SMALL]: { + name: + settings.SMALL_OLLAMA_MODEL || + settings.OLLAMA_MODEL || + "llama3.2", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_OLLAMA_MODEL || + settings.OLLAMA_MODEL || + "hermes3", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + + [ModelClass.LARGE]: { + name: + settings.LARGE_OLLAMA_MODEL || + settings.OLLAMA_MODEL || + "hermes3:70b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.7, + }, + + [ModelClass.EMBEDDING]: { + name: settings.OLLAMA_EMBEDDING_MODEL || "mxbai-embed-large", + dimensions: 1024, + }, }, }, [ModelProviderName.HEURIST]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - repetition_penalty: 0.4, - temperature: 0.7, - }, - imageSettings: { - steps: 20, - }, endpoint: "https://llm-gateway.heurist.xyz", model: { - [ModelClass.SMALL]: - settings.SMALL_HEURIST_MODEL || - "meta-llama/llama-3-70b-instruct", - [ModelClass.MEDIUM]: - settings.MEDIUM_HEURIST_MODEL || - "meta-llama/llama-3-70b-instruct", - [ModelClass.LARGE]: - settings.LARGE_HEURIST_MODEL || - "meta-llama/llama-3.1-405b-instruct", - [ModelClass.EMBEDDING]: "", //Add later, - [ModelClass.IMAGE]: settings.HEURIST_IMAGE_MODEL || "PepeXL", + [ModelClass.SMALL]: { + name: + settings.SMALL_HEURIST_MODEL || + "meta-llama/llama-3-70b-instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_HEURIST_MODEL || + "meta-llama/llama-3-70b-instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: + settings.LARGE_HEURIST_MODEL || + "meta-llama/llama-3.1-405b-instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.IMAGE]: { + name: settings.HEURIST_IMAGE_MODEL || "PepeXL", + steps: 20, + }, }, }, [ModelProviderName.GALADRIEL]: { endpoint: "https://api.galadriel.com/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.5, - presence_penalty: 0.5, - temperature: 0.8, - }, model: { - [ModelClass.SMALL]: "llama3.1:70b", - [ModelClass.MEDIUM]: "llama3.1:70b", - [ModelClass.LARGE]: "llama3.1:405b", - [ModelClass.EMBEDDING]: "gte-large-en-v1.5", - [ModelClass.IMAGE]: "stabilityai/stable-diffusion-xl-base-1.0", + [ModelClass.SMALL]: { + name: "llama3.1:70b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.5, + presence_penalty: 0.5, + temperature: 0.8, + }, + [ModelClass.MEDIUM]: { + name: "llama3.1:70b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.5, + presence_penalty: 0.5, + temperature: 0.8, + }, + [ModelClass.LARGE]: { + name: "llama3.1:405b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.5, + presence_penalty: 0.5, + temperature: 0.8, + }, + [ModelClass.EMBEDDING]: { + name: "gte-large-en-v1.5", + }, + [ModelClass.IMAGE]: { + name: "stabilityai/stable-diffusion-xl-base-1.0", + }, }, }, [ModelProviderName.FAL]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - repetition_penalty: 0.4, - temperature: 0.7, - }, - imageSettings: { - steps: 28, - }, endpoint: "https://api.fal.ai/v1", model: { - [ModelClass.SMALL]: "", // FAL doesn't provide text models - [ModelClass.MEDIUM]: "", - [ModelClass.LARGE]: "", - [ModelClass.EMBEDDING]: "", - [ModelClass.IMAGE]: "fal-ai/flux-lora", + [ModelClass.IMAGE]: { name: "fal-ai/flux-lora", steps: 28 }, }, }, [ModelProviderName.GAIANET]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - repetition_penalty: 0.4, - temperature: 0.7, - }, endpoint: settings.GAIANET_SERVER_URL, model: { - [ModelClass.SMALL]: - settings.GAIANET_MODEL || - settings.SMALL_GAIANET_MODEL || - "llama3b", - [ModelClass.MEDIUM]: - settings.GAIANET_MODEL || - settings.MEDIUM_GAIANET_MODEL || - "llama", - [ModelClass.LARGE]: - settings.GAIANET_MODEL || - settings.LARGE_GAIANET_MODEL || - "qwen72b", - [ModelClass.EMBEDDING]: - settings.GAIANET_EMBEDDING_MODEL || "nomic-embed", + [ModelClass.SMALL]: { + name: + settings.GAIANET_MODEL || + settings.SMALL_GAIANET_MODEL || + "llama3b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.MEDIUM]: { + name: + settings.GAIANET_MODEL || + settings.MEDIUM_GAIANET_MODEL || + "llama", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.LARGE]: { + name: + settings.GAIANET_MODEL || + settings.LARGE_GAIANET_MODEL || + "qwen72b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + repetition_penalty: 0.4, + temperature: 0.7, + }, + [ModelClass.EMBEDDING]: { + name: settings.GAIANET_EMBEDDING_MODEL || "nomic-embed", + dimensions: 768, + }, }, }, [ModelProviderName.ALI_BAILIAN]: { endpoint: "https://dashscope.aliyuncs.com/compatible-mode/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.6, - }, model: { - [ModelClass.SMALL]: "qwen-turbo", - [ModelClass.MEDIUM]: "qwen-plus", - [ModelClass.LARGE]: "qwen-max", - [ModelClass.IMAGE]: "wanx-v1", + [ModelClass.SMALL]: { + name: "qwen-turbo", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: "qwen-plus", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: "qwen-max", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.6, + }, + [ModelClass.IMAGE]: { + name: "wanx-v1", + }, }, }, [ModelProviderName.VOLENGINE]: { endpoint: settings.VOLENGINE_API_URL || "https://open.volcengineapi.com/api/v3/", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.4, - presence_penalty: 0.4, - temperature: 0.6, - }, model: { - [ModelClass.SMALL]: - settings.SMALL_VOLENGINE_MODEL || - settings.VOLENGINE_MODEL || - "doubao-lite-128k", - [ModelClass.MEDIUM]: - settings.MEDIUM_VOLENGINE_MODEL || - settings.VOLENGINE_MODEL || - "doubao-pro-128k", - [ModelClass.LARGE]: - settings.LARGE_VOLENGINE_MODEL || - settings.VOLENGINE_MODEL || - "doubao-pro-256k", - [ModelClass.EMBEDDING]: - settings.VOLENGINE_EMBEDDING_MODEL || "doubao-embedding", + [ModelClass.SMALL]: { + name: + settings.SMALL_VOLENGINE_MODEL || + settings.VOLENGINE_MODEL || + "doubao-lite-128k", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_VOLENGINE_MODEL || + settings.VOLENGINE_MODEL || + "doubao-pro-128k", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: + settings.LARGE_VOLENGINE_MODEL || + settings.VOLENGINE_MODEL || + "doubao-pro-256k", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.4, + presence_penalty: 0.4, + temperature: 0.6, + }, + [ModelClass.EMBEDDING]: { + name: settings.VOLENGINE_EMBEDDING_MODEL || "doubao-embedding", + }, }, }, [ModelProviderName.NANOGPT]: { endpoint: "https://nano-gpt.com/api/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - frequency_penalty: 0.0, - presence_penalty: 0.0, - temperature: 0.6, - }, model: { - [ModelClass.SMALL]: settings.SMALL_NANOGPT_MODEL || "gpt-4o-mini", - [ModelClass.MEDIUM]: settings.MEDIUM_NANOGPT_MODEL || "gpt-4o", - [ModelClass.LARGE]: settings.LARGE_NANOGPT_MODEL || "gpt-4o", + [ModelClass.SMALL]: { + name: settings.SMALL_NANOGPT_MODEL || "gpt-4o-mini", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: settings.MEDIUM_NANOGPT_MODEL || "gpt-4o", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: settings.LARGE_NANOGPT_MODEL || "gpt-4o", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, }, }, [ModelProviderName.HYPERBOLIC]: { endpoint: "https://api.hyperbolic.xyz/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - temperature: 0.6, - }, model: { - [ModelClass.SMALL]: - settings.SMALL_HYPERBOLIC_MODEL || - settings.HYPERBOLIC_MODEL || - "meta-llama/Llama-3.2-3B-Instruct", - [ModelClass.MEDIUM]: - settings.MEDIUM_HYPERBOLIC_MODEL || - settings.HYPERBOLIC_MODEL || - "meta-llama/Meta-Llama-3.1-70B-Instruct", - [ModelClass.LARGE]: - settings.LARGE_HYPERBOLIC_MODEL || - settings.HYPERBOLIC_MODEL || - "meta-llama/Meta-Llama-3.1-405-Instruct", - [ModelClass.IMAGE]: settings.IMAGE_HYPERBOLIC_MODEL || "FLUX.1-dev", + [ModelClass.SMALL]: { + name: + settings.SMALL_HYPERBOLIC_MODEL || + settings.HYPERBOLIC_MODEL || + "meta-llama/Llama-3.2-3B-Instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_HYPERBOLIC_MODEL || + settings.HYPERBOLIC_MODEL || + "meta-llama/Meta-Llama-3.1-70B-Instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: + settings.LARGE_HYPERBOLIC_MODEL || + settings.HYPERBOLIC_MODEL || + "meta-llama/Meta-Llama-3.1-405-Instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.IMAGE]: { + name: settings.IMAGE_HYPERBOLIC_MODEL || "FLUX.1-dev", + }, }, }, [ModelProviderName.VENICE]: { endpoint: "https://api.venice.ai/api/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - temperature: 0.6, - }, model: { - [ModelClass.SMALL]: settings.SMALL_VENICE_MODEL || "llama-3.3-70b", - [ModelClass.MEDIUM]: - settings.MEDIUM_VENICE_MODEL || "llama-3.3-70b", - [ModelClass.LARGE]: settings.LARGE_VENICE_MODEL || "llama-3.1-405b", - [ModelClass.IMAGE]: settings.IMAGE_VENICE_MODEL || "fluently-xl", + [ModelClass.SMALL]: { + name: settings.SMALL_VENICE_MODEL || "llama-3.3-70b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: settings.MEDIUM_VENICE_MODEL || "llama-3.3-70b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: settings.LARGE_VENICE_MODEL || "llama-3.1-405b", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.IMAGE]: { + name: settings.IMAGE_VENICE_MODEL || "fluently-xl", + }, }, }, [ModelProviderName.AKASH_CHAT_API]: { endpoint: "https://chatapi.akash.network/api/v1", - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - temperature: 0.6, - }, model: { - [ModelClass.SMALL]: - settings.SMALL_AKASH_CHAT_API_MODEL || - "Meta-Llama-3-2-3B-Instruct", - [ModelClass.MEDIUM]: - settings.MEDIUM_AKASH_CHAT_API_MODEL || - "Meta-Llama-3-3-70B-Instruct", - [ModelClass.LARGE]: - settings.LARGE_AKASH_CHAT_API_MODEL || - "Meta-Llama-3-1-405B-Instruct-FP8", + [ModelClass.SMALL]: { + name: + settings.SMALL_AKASH_CHAT_API_MODEL || + "Meta-Llama-3-2-3B-Instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.MEDIUM]: { + name: + settings.MEDIUM_AKASH_CHAT_API_MODEL || + "Meta-Llama-3-3-70B-Instruct", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, + [ModelClass.LARGE]: { + name: + settings.LARGE_AKASH_CHAT_API_MODEL || + "Meta-Llama-3-1-405B-Instruct-FP8", + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + temperature: 0.6, + }, }, }, [ModelProviderName.LIVEPEER]: { - settings: { - stop: [], - maxInputTokens: 128000, - maxOutputTokens: 8192, - repetition_penalty: 0.4, - temperature: 0.7, - }, // livepeer endpoint is handled from the sdk model: { - [ModelClass.SMALL]: "", - [ModelClass.MEDIUM]: "", - [ModelClass.LARGE]: "", - [ModelClass.EMBEDDING]: "", - [ModelClass.IMAGE]: - settings.LIVEPEER_IMAGE_MODEL || "ByteDance/SDXL-Lightning", + [ModelClass.IMAGE]: { + name: + settings.LIVEPEER_IMAGE_MODEL || "ByteDance/SDXL-Lightning", + }, }, }, }; -export function getModel(provider: ModelProviderName, type: ModelClass) { - return models[provider].model[type]; +export function getModelSettings( + provider: ModelProviderName, + type: ModelClass +): ModelSettings | undefined { + return models[provider]?.model[type] as ModelSettings | undefined; +} + +export function getImageModelSettings( + provider: ModelProviderName +): ImageModelSettings | undefined { + return models[provider]?.model[ModelClass.IMAGE] as + | ImageModelSettings + | undefined; +} + +export function getEmbeddingModelSettings( + provider: ModelProviderName +): EmbeddingModelSettings | undefined { + return models[provider]?.model[ModelClass.EMBEDDING] as + | EmbeddingModelSettings + | undefined; } export function getEndpoint(provider: ModelProviderName) { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index d1dadddaf8..c6d643e962 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -137,51 +137,63 @@ export enum ModelClass { } /** - * Configuration for an AI model + * Model settings */ -export type Model = { - /** Optional API endpoint */ - endpoint?: string; +export type ModelSettings = { + /** Model name */ + name: string; - /** Model settings */ - settings: { - /** Maximum input tokens */ - maxInputTokens: number; + /** Maximum input tokens */ + maxInputTokens: number; - /** Maximum output tokens */ - maxOutputTokens: number; + /** Maximum output tokens */ + maxOutputTokens: number; - /** Optional frequency penalty */ - frequency_penalty?: number; + /** Optional frequency penalty */ + frequency_penalty?: number; - /** Optional presence penalty */ - presence_penalty?: number; + /** Optional presence penalty */ + presence_penalty?: number; - /** Optional repetition penalty */ - repetition_penalty?: number; + /** Optional repetition penalty */ + repetition_penalty?: number; - /** Stop sequences */ - stop: string[]; + /** Stop sequences */ + stop: string[]; - /** Temperature setting */ - temperature: number; + /** Temperature setting */ + temperature: number; - /** Optional telemetry configuration (experimental) */ - experimental_telemetry?: TelemetrySettings; - }; + /** Optional telemetry configuration (experimental) */ + experimental_telemetry?: TelemetrySettings; +}; - /** Optional image generation settings */ - imageSettings?: { - steps?: number; - }; +/** Image model settings */ +export type ImageModelSettings = { + name: string; + steps?: number; +}; + +/** Embedding model settings */ +export type EmbeddingModelSettings = { + name: string; + dimensions?: number; +}; + +/** + * Configuration for an AI model + */ +export type Model = { + /** Optional API endpoint */ + endpoint?: string; /** Model names by size class */ model: { - [ModelClass.SMALL]: string; - [ModelClass.MEDIUM]: string; - [ModelClass.LARGE]: string; - [ModelClass.EMBEDDING]?: string; - [ModelClass.IMAGE]?: string; + [ModelClass.SMALL]?: ModelSettings; + [ModelClass.MEDIUM]?: ModelSettings; + [ModelClass.LARGE]?: ModelSettings; + [ModelClass.EMBEDDING]?: EmbeddingModelSettings; + [ModelClass.IMAGE]?: ImageModelSettings; }; }; diff --git a/packages/plugin-node/src/services/image.ts b/packages/plugin-node/src/services/image.ts index 3ad31d5271..55c29db6d1 100644 --- a/packages/plugin-node/src/services/image.ts +++ b/packages/plugin-node/src/services/image.ts @@ -1,4 +1,4 @@ -import { elizaLogger, models } from "@elizaos/core"; +import { elizaLogger, getEndpoint, models } from "@elizaos/core"; import { Service } from "@elizaos/core"; import { IAgentRuntime, @@ -214,7 +214,7 @@ export class ImageDescriptionService // If model provider is openai, use the endpoint, otherwise use the default openai endpoint. const endpoint = this.runtime.imageModelProvider === ModelProviderName.OPENAI - ? models[this.runtime.imageModelProvider].endpoint + ? getEndpoint(this.runtime.imageModelProvider) : "https://api.openai.com/v1"; const response = await fetch(endpoint + "/chat/completions", { method: "POST",