From 166b5f6d41a9484557320d193ea1ac292d14dd24 Mon Sep 17 00:00:00 2001 From: "Victor M. SMITH" <72023257+MVS-source@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:06:17 +0200 Subject: [PATCH] feat(llm): add Eden AI as an OpenAI-compatible provider Eden AI (https://www.edenai.co) is an OpenAI-compatible aggregator exposing 100+ models from many providers (OpenAI, Anthropic, Google, Mistral, DeepSeek, ...) through a single EU-hosted endpoint and API key. Models use the provider/model naming scheme. Mirrors the existing OpenAI-compatible providers (Cerebras/Deepseek): - core/llm/llms/EdenAI.ts (extends OpenAI, apiBase https://api.edenai.run/v3/) - registered in core/llm/llms/index.ts - @continuedev/openai-adapters: provider literal + openAICompatible case - OpenAI-compatible-core.vitest.ts coverage entry - docs page + nav API key is provided via config (apiKey) and never hardcoded. Signed-off-by: Victor M. SMITH <72023257+MVS-source@users.noreply.github.com> --- core/llm/llms/EdenAI.ts | 25 +++++++++++ .../llm/llms/OpenAI-compatible-core.vitest.ts | 6 +++ core/llm/llms/index.ts | 2 + .../customize/model-providers/more/edenai.mdx | 45 +++++++++++++++++++ docs/docs.json | 1 + packages/openai-adapters/src/index.ts | 2 + packages/openai-adapters/src/types.ts | 1 + 7 files changed, 82 insertions(+) create mode 100644 core/llm/llms/EdenAI.ts create mode 100644 docs/customize/model-providers/more/edenai.mdx diff --git a/core/llm/llms/EdenAI.ts b/core/llm/llms/EdenAI.ts new file mode 100644 index 00000000000..864f0be67fb --- /dev/null +++ b/core/llm/llms/EdenAI.ts @@ -0,0 +1,25 @@ +import { LLMOptions } from "../../index.js"; +import { osModelsEditPrompt } from "../templates/edit.js"; + +import OpenAI from "./OpenAI.js"; + +/** + * Eden AI (https://www.edenai.co) is an OpenAI-compatible aggregator that + * provides unified access to 100+ models from many providers (OpenAI, + * Anthropic, Google, Mistral, DeepSeek, and more) through a single EU-hosted + * endpoint and API key. Models use the `provider/model` naming scheme, e.g. + * `anthropic/claude-sonnet-4-5` or `mistral/codestral-latest`. + */ +class EdenAI extends OpenAI { + static providerName = "edenai"; + static defaultOptions: Partial = { + apiBase: "https://api.edenai.run/v3/", + model: "anthropic/claude-sonnet-4-5", + promptTemplates: { + edit: osModelsEditPrompt, + }, + useLegacyCompletionsEndpoint: false, + }; +} + +export default EdenAI; diff --git a/core/llm/llms/OpenAI-compatible-core.vitest.ts b/core/llm/llms/OpenAI-compatible-core.vitest.ts index 5d96d099099..f66b2da37bb 100644 --- a/core/llm/llms/OpenAI-compatible-core.vitest.ts +++ b/core/llm/llms/OpenAI-compatible-core.vitest.ts @@ -6,6 +6,7 @@ import Groq from "./Groq.js"; import Fireworks from "./Fireworks.js"; import Together from "./Together.js"; import Deepseek from "./Deepseek.js"; +import EdenAI from "./EdenAI.js"; import OpenRouter from "./OpenRouter.js"; import xAI from "./xAI.js"; import Mistral from "./Mistral.js"; @@ -226,6 +227,11 @@ createOpenAISubclassTests(Deepseek, { defaultApiBase: "https://api.deepseek.com/", }); +createOpenAISubclassTests(EdenAI, { + providerName: "edenai", + defaultApiBase: "https://api.edenai.run/v3/", +}); + createOpenAISubclassTests(OpenRouter, { providerName: "openrouter", defaultApiBase: "https://openrouter.ai/api/v1/", diff --git a/core/llm/llms/index.ts b/core/llm/llms/index.ts index 4978f0617f2..d9d765ac71c 100644 --- a/core/llm/llms/index.ts +++ b/core/llm/llms/index.ts @@ -21,6 +21,7 @@ import CometAPI from "./CometAPI"; import DeepInfra from "./DeepInfra"; import Deepseek from "./Deepseek"; import Docker from "./Docker"; +import EdenAI from "./EdenAI"; import Fireworks from "./Fireworks"; import Flowise from "./Flowise"; import FunctionNetwork from "./FunctionNetwork"; @@ -106,6 +107,7 @@ export const LLMClasses = [ Cloudflare, Deepseek, Docker, + EdenAI, Msty, Azure, WatsonX, diff --git a/docs/customize/model-providers/more/edenai.mdx b/docs/customize/model-providers/more/edenai.mdx new file mode 100644 index 00000000000..730a2b711a2 --- /dev/null +++ b/docs/customize/model-providers/more/edenai.mdx @@ -0,0 +1,45 @@ +--- +title: "Eden AI" +description: "Configure Eden AI with Continue — an OpenAI-compatible, EU-hosted API to 100+ models from many providers through a single API key" +--- + +[Eden AI](https://www.edenai.co) provides unified, OpenAI-compatible access to 100+ models from many providers (OpenAI, Anthropic, Google, Mistral, DeepSeek, and more) through a single EU-hosted endpoint and API key. Models use the `provider/model` naming scheme. + +1. Create an account and get an API key from the [Eden AI platform](https://app.edenai.run). +2. Copy the API key for use in Continue. +3. Update your Continue config file: + + + + ```yaml title="config.yaml" + name: My Config + version: 0.0.1 + schema: v1 + + models: + - name: Eden AI Claude Sonnet 4.5 + provider: edenai + model: anthropic/claude-sonnet-4-5 + apiKey: + ``` + + + ```json title="config.json" + { + "models": [ + { + "title": "Eden AI Claude Sonnet 4.5", + "provider": "edenai", + "model": "anthropic/claude-sonnet-4-5", + "apiKey": "" + } + ] + } + ``` + + + + + The default endpoint is `https://api.edenai.run/v3`. For EU-only data residency, + set `apiBase` to `https://api.eu.edenai.run/v3`. + diff --git a/docs/docs.json b/docs/docs.json index b7a1d83f13a..c5b4d527516 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -109,6 +109,7 @@ "customize/model-providers/more/clawrouter", "customize/model-providers/more/deepseek", "customize/model-providers/more/deepinfra", + "customize/model-providers/more/edenai", "customize/model-providers/more/groq", "customize/model-providers/more/llamacpp", "customize/model-providers/more/llamastack", diff --git a/packages/openai-adapters/src/index.ts b/packages/openai-adapters/src/index.ts index 52fb2d33a0c..e5445208984 100644 --- a/packages/openai-adapters/src/index.ts +++ b/packages/openai-adapters/src/index.ts @@ -149,6 +149,8 @@ export function constructLlmApi(config: LLMConfig): BaseLlmApi | undefined { return openAICompatible("http://127.0.0.1:5000/v1/", config); case "cerebras": return openAICompatible("https://api.cerebras.ai/v1/", config); + case "edenai": + return openAICompatible("https://api.edenai.run/v3/", config); case "kindo": return openAICompatible("https://llm.kindo.ai/v1/", config); case "msty": diff --git a/packages/openai-adapters/src/types.ts b/packages/openai-adapters/src/types.ts index 14b9512f75b..21450e306a8 100644 --- a/packages/openai-adapters/src/types.ts +++ b/packages/openai-adapters/src/types.ts @@ -49,6 +49,7 @@ export const OpenAIConfigSchema = BasePlusConfig.extend({ z.literal("lmstudio"), z.literal("ollama"), z.literal("cerebras"), + z.literal("edenai"), z.literal("kindo"), z.literal("msty"), z.literal("openrouter"),