diff --git a/packages/@buildingai/ai-sdk/src/providers/edenai/index.ts b/packages/@buildingai/ai-sdk/src/providers/edenai/index.ts new file mode 100644 index 000000000..860808c8a --- /dev/null +++ b/packages/@buildingai/ai-sdk/src/providers/edenai/index.ts @@ -0,0 +1,46 @@ +import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; +import type { LanguageModelV3 } from "@ai-sdk/provider"; + +import type { AIProvider, BaseProviderSettings, ProviderModelInfo } from "../../types"; +import { fetchProviderModels } from "../../utils/fetch-models"; + +export interface EdenAIProviderSettings extends BaseProviderSettings {} + +class EdenAIProviderImpl implements AIProvider { + readonly id = "edenai"; + readonly name = "Eden AI"; + + private baseProvider: ReturnType; + private settings: EdenAIProviderSettings; + + constructor(settings: EdenAIProviderSettings = {}) { + this.settings = { + ...settings, + baseURL: settings.baseURL || "https://api.edenai.run/v3", + }; + + this.baseProvider = createOpenAICompatible({ + name: "edenai", + baseURL: this.settings.baseURL!, + headers: { + Authorization: + this.settings?.apiKey && this.settings?.apiKey.includes("Bearer ") + ? this.settings.apiKey + : `Bearer ${this.settings.apiKey}`, + ...this.settings.headers, + }, + }); + } + + languageModel(modelId: string): LanguageModelV3 { + return this.baseProvider.languageModel(modelId); + } + + async listModels(): Promise { + return fetchProviderModels(this.settings); + } +} + +export function edenai(settings: EdenAIProviderSettings = {}): AIProvider { + return new EdenAIProviderImpl(settings); +} diff --git a/packages/@buildingai/ai-sdk/src/providers/index.ts b/packages/@buildingai/ai-sdk/src/providers/index.ts index 0be842058..8dd3030ee 100644 --- a/packages/@buildingai/ai-sdk/src/providers/index.ts +++ b/packages/@buildingai/ai-sdk/src/providers/index.ts @@ -3,6 +3,7 @@ export { azure, type AzureProviderSettings } from "./azure"; export { cohere, type CohereProviderSettings } from "./cohere"; export { custom, type CustomProviderSettings } from "./custom"; export { deepseek, type DeepSeekProviderSettings } from "./deepseek"; +export { edenai, type EdenAIProviderSettings } from "./edenai"; export { giteeAi, type GiteeAIProviderSettings } from "./gitee-ai"; export { google, type GoogleProviderSettings } from "./google"; export { hunyuan, type HunyuanProviderSettings } from "./hunyuan"; diff --git a/packages/@buildingai/ai-sdk/src/registry/provider-registry.ts b/packages/@buildingai/ai-sdk/src/registry/provider-registry.ts index 4000a09b0..9e0a65994 100644 --- a/packages/@buildingai/ai-sdk/src/registry/provider-registry.ts +++ b/packages/@buildingai/ai-sdk/src/registry/provider-registry.ts @@ -4,6 +4,7 @@ import { cohere, custom, deepseek, + edenai, giteeAi, google, hunyuan, @@ -53,6 +54,7 @@ class ProviderRegistry { this.register("gitee_ai", giteeAi, "Gitee AI 魔力方舟"); this.register("x", x, "xAI Grok 系列模型"); this.register("openrouter", openrouter, "OpenRouter 统一接入 300+ 模型"); + this.register("edenai", edenai, "Eden AI 欧洲 OpenAI 兼容网关"); this.register("azure", azure, "Azure AI 服务"); this.register("custom", custom, "自定义 OpenAI 兼容 API"); } diff --git a/packages/@buildingai/db/src/seeds/data/model-config.json b/packages/@buildingai/db/src/seeds/data/model-config.json index d503f5443..835ddc17f 100644 --- a/packages/@buildingai/db/src/seeds/data/model-config.json +++ b/packages/@buildingai/db/src/seeds/data/model-config.json @@ -1,5 +1,5 @@ { - "total": 19, + "total": 20, "updated_at": "2026-02-11T10:12:54.673Z", "configs": [ { @@ -23,6 +23,13 @@ "supported_model_types": ["llm"], "models": [] }, + { + "provider": "edenai", + "label": "Eden AI", + "icon_url": "", + "supported_model_types": ["llm"], + "models": [] + }, { "provider": "openrouter", "label": "OpenRouter",