diff --git a/src/modules/llms/components/LLMVendorSetup.tsx b/src/modules/llms/components/LLMVendorSetup.tsx new file mode 100644 index 000000000..872d98008 --- /dev/null +++ b/src/modules/llms/components/LLMVendorSetup.tsx @@ -0,0 +1,62 @@ +import * as React from 'react'; + +import type { DModelsService, DModelsServiceId } from '~/common/stores/llms/llms.service.types'; + +import { findModelVendor, ModelVendorId } from '../vendors/vendors.registry'; + + +// direct imports for all vendor setup components - NOTE: we could lazy load if this becomes a performance issue +import { AlibabaServiceSetup } from '../vendors/alibaba/AlibabaServiceSetup'; +import { AnthropicServiceSetup } from '../vendors/anthropic/AnthropicServiceSetup'; +import { AzureServiceSetup } from '../vendors/azure/AzureServiceSetup'; +import { DeepseekAIServiceSetup } from '../vendors/deepseek/DeepseekAIServiceSetup'; +import { GeminiServiceSetup } from '../vendors/gemini/GeminiServiceSetup'; +import { GroqServiceSetup } from '../vendors/groq/GroqServiceSetup'; +import { LMStudioServiceSetup } from '../vendors/lmstudio/LMStudioServiceSetup'; +import { LocalAIServiceSetup } from '../vendors/localai/LocalAIServiceSetup'; +import { MistralServiceSetup } from '../vendors/mistral/MistralServiceSetup'; +import { OllamaServiceSetup } from '../vendors/ollama/OllamaServiceSetup'; +import { OpenAIServiceSetup } from '../vendors/openai/OpenAIServiceSetup'; +import { OpenPipeServiceSetup } from '../vendors/openpipe/OpenPipeServiceSetup'; +import { OpenRouterServiceSetup } from '../vendors/openrouter/OpenRouterServiceSetup'; +import { PerplexityServiceSetup } from '../vendors/perplexity/PerplexityServiceSetup'; +import { TogetherAIServiceSetup } from '../vendors/togetherai/TogetherAIServiceSetup'; +import { XAIServiceSetup } from '../vendors/xai/XAIServiceSetup'; + + +/** + * Hardcoded mapping with the setup components for each vendor. + * NOTE: we do it here to only depend on this file (even lazily) and avoid to import all the Components (UI) + * code on vendor definitions (which must be lightweight as it impacts boot time). + */ +const vendorSetupComponents: Record> = { + alibaba: AlibabaServiceSetup, + anthropic: AnthropicServiceSetup, + azure: AzureServiceSetup, + deepseek: DeepseekAIServiceSetup, + googleai: GeminiServiceSetup, + groq: GroqServiceSetup, + lmstudio: LMStudioServiceSetup, + localai: LocalAIServiceSetup, + mistral: MistralServiceSetup, + ollama: OllamaServiceSetup, + openai: OpenAIServiceSetup, + openpipe: OpenPipeServiceSetup, + openrouter: OpenRouterServiceSetup, + perplexity: PerplexityServiceSetup, + togetherai: TogetherAIServiceSetup, + xai: XAIServiceSetup, +} as const; + + +export function LLMVendorSetup(props: { service: DModelsService }) { + const vendor = findModelVendor(props.service.vId); + if (!vendor) + return 'Configuration issue: Vendor not found for Service ' + props.service.id; + + const SetupComponent = vendorSetupComponents[vendor.id]; + if (!SetupComponent) + return 'Configuration issue: Setup component not found for vendor ' + vendor.id; + + return ; +} diff --git a/src/modules/llms/models-modal/ModelsModal.tsx b/src/modules/llms/models-modal/ModelsModal.tsx index 6d52b6874..146624dcb 100644 --- a/src/modules/llms/models-modal/ModelsModal.tsx +++ b/src/modules/llms/models-modal/ModelsModal.tsx @@ -11,28 +11,20 @@ import { useHasLLMs, useModelsServices } from '~/common/stores/llms/llms.hooks'; import { useIsMobile } from '~/common/components/useMatchMedia'; import { LLMOptionsModal } from './LLMOptionsModal'; +import { LLMVendorSetup } from '../components/LLMVendorSetup'; import { ModelsList } from './ModelsList'; import { ModelsServiceSelector } from './ModelsServiceSelector'; import { ModelsWizard } from './ModelsWizard'; -import { findModelVendor } from '../vendors/vendors.registry'; // configuration const MODELS_WIZARD_ENABLE_INITIALLY = true; -function VendorServiceSetup(props: { service: DModelsService }) { - const vendor = findModelVendor(props.service.vId); - if (!vendor) - return 'Configuration issue: Vendor not found for Service ' + props.service.id; - return ; -} - - type TabValue = 'wizard' | 'setup' | 'defaults'; /** - * Note: the reason for this component separation from the parent state, is delayed state intitialization. + * Note: the reason for this component separation from the parent state, is delayed state initialization. */ function ModelsConfiguratorModal(props: { modelsServices: DModelsService[], @@ -148,7 +140,7 @@ function ModelsConfiguratorModal(props: { {isTabSetup && ( {activeService - ? + ? : } diff --git a/src/modules/llms/vendors/IModelVendor.ts b/src/modules/llms/vendors/IModelVendor.ts index 66526eb9f..08e8c83d5 100644 --- a/src/modules/llms/vendors/IModelVendor.ts +++ b/src/modules/llms/vendors/IModelVendor.ts @@ -5,7 +5,6 @@ import type { SvgIconProps } from '@mui/joy'; import type { BackendCapabilities } from '~/modules/backend/store-backend-capabilities'; import type { DLLM } from '~/common/stores/llms/llms.types'; -import type { DModelsServiceId } from '~/common/stores/llms/llms.service.types'; import type { ModelDescriptionSchema } from '../server/llm.server.types'; import type { ModelVendorId } from './vendors.registry'; @@ -24,7 +23,6 @@ export interface IModelVendor = {}, // components readonly Icon: React.FunctionComponent; - readonly ServiceSetupComponent: React.ComponentType<{ serviceId: DModelsServiceId }>; /// abstraction interface /// diff --git a/src/modules/llms/vendors/alibaba/alibaba.vendor.ts b/src/modules/llms/vendors/alibaba/alibaba.vendor.ts index 4faebaf9e..026770f03 100644 --- a/src/modules/llms/vendors/alibaba/alibaba.vendor.ts +++ b/src/modules/llms/vendors/alibaba/alibaba.vendor.ts @@ -4,8 +4,6 @@ import type { IModelVendor } from '../IModelVendor'; import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { AlibabaServiceSetup } from './AlibabaServiceSetup'; - interface DAlibabaServiceSettings { alibabaOaiKey: string; @@ -22,7 +20,6 @@ export const ModelVendorAlibaba: IModelVendor ({ diff --git a/src/modules/llms/vendors/anthropic/anthropic.vendor.ts b/src/modules/llms/vendors/anthropic/anthropic.vendor.ts index ce2007362..82a1668c9 100644 --- a/src/modules/llms/vendors/anthropic/anthropic.vendor.ts +++ b/src/modules/llms/vendors/anthropic/anthropic.vendor.ts @@ -4,8 +4,6 @@ import { apiAsync } from '~/common/util/trpc.client'; import type { AnthropicAccessSchema } from '../../server/anthropic/anthropic.router'; import type { IModelVendor } from '../IModelVendor'; -import { AnthropicServiceSetup } from './AnthropicServiceSetup'; - // special symbols export const isValidAnthropicApiKey = (apiKey?: string) => !!apiKey && (apiKey.startsWith('sk-') ? apiKey.length >= 39 : apiKey.length > 1); @@ -27,7 +25,6 @@ export const ModelVendorAnthropic: IModelVendor ({ diff --git a/src/modules/llms/vendors/azure/azure.vendor.ts b/src/modules/llms/vendors/azure/azure.vendor.ts index b41e2465c..ae71fc2a7 100644 --- a/src/modules/llms/vendors/azure/azure.vendor.ts +++ b/src/modules/llms/vendors/azure/azure.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { AzureServiceSetup } from './AzureServiceSetup'; - // special symbols export const isValidAzureApiKey = (apiKey?: string) => !!apiKey && apiKey.length >= 32; @@ -42,7 +40,6 @@ export const ModelVendorAzure: IModelVendor ({ diff --git a/src/modules/llms/vendors/deepseek/deepseekai.vendor.ts b/src/modules/llms/vendors/deepseek/deepseekai.vendor.ts index f375107ba..09b0c0418 100644 --- a/src/modules/llms/vendors/deepseek/deepseekai.vendor.ts +++ b/src/modules/llms/vendors/deepseek/deepseekai.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { DeepseekAIServiceSetup } from './DeepseekAIServiceSetup'; - export interface DDeepseekServiceSettings { deepseekKey: string; @@ -22,7 +20,6 @@ export const ModelVendorDeepseek: IModelVendor ({ diff --git a/src/modules/llms/vendors/gemini/gemini.vendor.ts b/src/modules/llms/vendors/gemini/gemini.vendor.ts index ca0a691f1..416000ea0 100644 --- a/src/modules/llms/vendors/gemini/gemini.vendor.ts +++ b/src/modules/llms/vendors/gemini/gemini.vendor.ts @@ -5,8 +5,6 @@ import type { GeminiAccessSchema } from '../../server/gemini/gemini.router'; import type { GeminiWire_Safety } from '~/modules/aix/server/dispatch/wiretypes/gemini.wiretypes'; import type { IModelVendor } from '../IModelVendor'; -import { GeminiServiceSetup } from './GeminiServiceSetup'; - interface DGeminiServiceSettings { geminiKey: string; @@ -35,7 +33,6 @@ export const ModelVendorGemini: IModelVendor ({ diff --git a/src/modules/llms/vendors/groq/groq.vendor.ts b/src/modules/llms/vendors/groq/groq.vendor.ts index 98de405a8..38f301316 100644 --- a/src/modules/llms/vendors/groq/groq.vendor.ts +++ b/src/modules/llms/vendors/groq/groq.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { GroqServiceSetup } from './GroqServiceSetup'; - interface DGroqServiceSettings { groqKey: string; @@ -22,7 +20,6 @@ export const ModelVendorGroq: IModelVendor ({ diff --git a/src/modules/llms/vendors/lmstudio/lmstudio.vendor.ts b/src/modules/llms/vendors/lmstudio/lmstudio.vendor.ts index 5eda573e8..0e5bb2b6d 100644 --- a/src/modules/llms/vendors/lmstudio/lmstudio.vendor.ts +++ b/src/modules/llms/vendors/lmstudio/lmstudio.vendor.ts @@ -3,7 +3,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { LMStudioServiceSetup } from './LMStudioServiceSetup'; import { LMStudioIcon } from '~/common/components/icons/vendors/LMStudioIcon'; @@ -20,7 +19,6 @@ export const ModelVendorLMStudio: IModelVendor ({ diff --git a/src/modules/llms/vendors/localai/localai.vendor.ts b/src/modules/llms/vendors/localai/localai.vendor.ts index 0327d8207..f8bca8c0a 100644 --- a/src/modules/llms/vendors/localai/localai.vendor.ts +++ b/src/modules/llms/vendors/localai/localai.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { LocalAIServiceSetup } from './LocalAIServiceSetup'; - interface DLocalAIServiceSettings { localAIHost: string; // use OpenAI-compatible non-default hosts (full origin path) @@ -27,7 +25,6 @@ export const ModelVendorLocalAI: IModelVendor ({ diff --git a/src/modules/llms/vendors/mistral/mistral.vendor.ts b/src/modules/llms/vendors/mistral/mistral.vendor.ts index 3e549f187..e21bb1810 100644 --- a/src/modules/llms/vendors/mistral/mistral.vendor.ts +++ b/src/modules/llms/vendors/mistral/mistral.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { DOpenAIServiceSettings, ModelVendorOpenAI } from '../openai/openai.vendor'; -import { MistralServiceSetup } from './MistralServiceSetup'; - // special symbols @@ -25,7 +23,6 @@ export const ModelVendorMistral: IModelVendor ({ diff --git a/src/modules/llms/vendors/ollama/ollama.vendor.ts b/src/modules/llms/vendors/ollama/ollama.vendor.ts index bc56d2001..c674c4665 100644 --- a/src/modules/llms/vendors/ollama/ollama.vendor.ts +++ b/src/modules/llms/vendors/ollama/ollama.vendor.ts @@ -4,8 +4,6 @@ import { apiAsync } from '~/common/util/trpc.client'; import type { IModelVendor } from '../IModelVendor'; import type { OllamaAccessSchema } from '../../server/ollama/ollama.router'; -import { OllamaServiceSetup } from './OllamaServiceSetup'; - interface DOllamaServiceSettings { ollamaHost: string; @@ -23,7 +21,6 @@ export const ModelVendorOllama: IModelVendor ({ diff --git a/src/modules/llms/vendors/openai/openai.vendor.ts b/src/modules/llms/vendors/openai/openai.vendor.ts index e77fd9e5a..b862a6dd2 100644 --- a/src/modules/llms/vendors/openai/openai.vendor.ts +++ b/src/modules/llms/vendors/openai/openai.vendor.ts @@ -3,7 +3,6 @@ import { apiAsync } from '~/common/util/trpc.client'; import type { IModelVendor } from '../IModelVendor'; import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; -import { OpenAIServiceSetup } from './OpenAIServiceSetup'; // special symbols @@ -27,7 +26,6 @@ export const ModelVendorOpenAI: IModelVendor ({ diff --git a/src/modules/llms/vendors/openpipe/openpipe.vendor.ts b/src/modules/llms/vendors/openpipe/openpipe.vendor.ts index abf7b99eb..9ec6c720a 100644 --- a/src/modules/llms/vendors/openpipe/openpipe.vendor.ts +++ b/src/modules/llms/vendors/openpipe/openpipe.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { OpenPipeServiceSetup } from './OpenPipeServiceSetup'; - export interface DOpenPipeServiceSettings { openPipeKey: string; @@ -23,7 +21,6 @@ export const ModelVendorOpenPipe: IModelVendor ({ diff --git a/src/modules/llms/vendors/openrouter/openrouter.vendor.ts b/src/modules/llms/vendors/openrouter/openrouter.vendor.ts index 268ec402e..b60b315bb 100644 --- a/src/modules/llms/vendors/openrouter/openrouter.vendor.ts +++ b/src/modules/llms/vendors/openrouter/openrouter.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { OpenRouterServiceSetup } from './OpenRouterServiceSetup'; - // special symbols export const isValidOpenRouterKey = (apiKey?: string) => !!apiKey && apiKey.startsWith('sk-or-') && apiKey.length > 40; @@ -39,7 +37,6 @@ export const ModelVendorOpenRouter: IModelVendor ({ diff --git a/src/modules/llms/vendors/perplexity/perplexity.vendor.ts b/src/modules/llms/vendors/perplexity/perplexity.vendor.ts index dbc68e10f..98eb0d921 100644 --- a/src/modules/llms/vendors/perplexity/perplexity.vendor.ts +++ b/src/modules/llms/vendors/perplexity/perplexity.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { PerplexityServiceSetup } from './PerplexityServiceSetup'; - interface DPerpexityServiceSettings { perplexityKey: string; @@ -22,7 +20,6 @@ export const ModelVendorPerplexity: IModelVendor ({ diff --git a/src/modules/llms/vendors/togetherai/togetherai.vendor.ts b/src/modules/llms/vendors/togetherai/togetherai.vendor.ts index ce3251a69..e850a6367 100644 --- a/src/modules/llms/vendors/togetherai/togetherai.vendor.ts +++ b/src/modules/llms/vendors/togetherai/togetherai.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { TogetherAIServiceSetup } from './TogetherAIServiceSetup'; - interface DTogetherAIServiceSettings { togetherKey: string; @@ -24,7 +22,6 @@ export const ModelVendorTogetherAI: IModelVendor ({ diff --git a/src/modules/llms/vendors/xai/xai.vendor.ts b/src/modules/llms/vendors/xai/xai.vendor.ts index 236c1f37b..071237159 100644 --- a/src/modules/llms/vendors/xai/xai.vendor.ts +++ b/src/modules/llms/vendors/xai/xai.vendor.ts @@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router'; import { ModelVendorOpenAI } from '../openai/openai.vendor'; -import { XAIServiceSetup } from './XAIServiceSetup'; - export interface DXAIServiceSettings { xaiKey: string; @@ -22,7 +20,6 @@ export const ModelVendorXAI: IModelVendor ({ xaiKey: '' }),