diff --git a/ChromiumBasedEditors/plugins/ai-agent/src/lib/types.ts b/ChromiumBasedEditors/plugins/ai-agent/src/lib/types.ts index 53a3f621..52270310 100644 --- a/ChromiumBasedEditors/plugins/ai-agent/src/lib/types.ts +++ b/ChromiumBasedEditors/plugins/ai-agent/src/lib/types.ts @@ -17,6 +17,7 @@ export type ProviderType = | "anthropic" | "ollama" | "openai" + | "openaicompatible" | "together" | "openrouter" | "genai" diff --git a/ChromiumBasedEditors/plugins/ai-agent/src/providers/openaicompatible/index.ts b/ChromiumBasedEditors/plugins/ai-agent/src/providers/openaicompatible/index.ts new file mode 100644 index 00000000..df0e6b9c --- /dev/null +++ b/ChromiumBasedEditors/plugins/ai-agent/src/providers/openaicompatible/index.ts @@ -0,0 +1,43 @@ +import type { Model } from "@/lib/types"; +import type { TData } from "../base"; +import { OpenAIProvider } from "../openai"; +import { openaicompatibleInfo } from "./info"; + +/** + * OpenAI Compatible provider - extends OpenAI without model filtering. + * Use this for any OpenAI-compatible API that you want full model access to. + */ +class OpenAICompatibleProvider extends OpenAIProvider { + // ============================================ + // Provider Info + // ============================================ + + getName = (): string => openaicompatibleInfo.name; + + getBaseUrl = (): string => openaicompatibleInfo.baseUrl; + + // ============================================ + // Model Fetching (no filters - returns all models) + // ============================================ + + getProviderModels = async (data: TData): Promise => { + const client = this.createClient(data.apiKey, data.url); + + try { + const response = await client.models.list(); + + return response.data.map((model) => ({ + id: model.id, + name: openaicompatibleInfo.modelNames[model.id] || model.id, + provider: "openaicompatible" as const, + })); + } catch (error) { + console.error("Failed to fetch OpenAI Compatible models:", error); + return []; + } + }; +} + +const openaicompatibleProvider = new OpenAICompatibleProvider(); + +export { OpenAICompatibleProvider, openaicompatibleProvider }; diff --git a/ChromiumBasedEditors/plugins/ai-agent/src/providers/openaicompatible/info.ts b/ChromiumBasedEditors/plugins/ai-agent/src/providers/openaicompatible/info.ts new file mode 100644 index 00000000..f2f1717a --- /dev/null +++ b/ChromiumBasedEditors/plugins/ai-agent/src/providers/openaicompatible/info.ts @@ -0,0 +1,6 @@ +export const openaicompatibleInfo = { + name: "OpenAI Compatible", + baseUrl: "", + modelFilters: [] as string[], // No filters - returns all models from the API + modelNames: {} as Record, // Uses model ID from API +}; diff --git a/ChromiumBasedEditors/plugins/ai-agent/src/providers/registry.ts b/ChromiumBasedEditors/plugins/ai-agent/src/providers/registry.ts index 823efd3b..7860e946 100644 --- a/ChromiumBasedEditors/plugins/ai-agent/src/providers/registry.ts +++ b/ChromiumBasedEditors/plugins/ai-agent/src/providers/registry.ts @@ -6,6 +6,10 @@ import { type LMStudioProvider, lmStudioProvider } from "./lm-studio"; import { type MistralProvider, mistralProvider } from "./mistral"; import { type OllamaProvider, ollamaProvider } from "./ollama"; import { type OpenAIProvider, openaiProvider } from "./openai"; +import { + type OpenAICompatibleProvider, + openaicompatibleProvider, +} from "./openaicompatible"; import { type OpenRouterProvider, openrouterProvider } from "./openrouter"; import { type TogetherProvider, togetherProvider } from "./together"; import { type XAIProvider, xaiProvider } from "./xai"; @@ -14,6 +18,7 @@ export type BaseProvider = | AnthropicProvider | OllamaProvider | OpenAIProvider + | OpenAICompatibleProvider | TogetherProvider | OpenRouterProvider | GenAIProvider @@ -30,6 +35,7 @@ export const providerRegistry: Record = { anthropic: anthropicProvider, ollama: ollamaProvider, openai: openaiProvider, + openaicompatible: openaicompatibleProvider, together: togetherProvider, openrouter: openrouterProvider, genai: genaiProvider,