Skip to content

Commit 9772a18

Browse files
committed
LLMs: centralize config UI into 1 function
1 parent 0ac80b2 commit 9772a18

19 files changed

Lines changed: 65 additions & 59 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import * as React from 'react';
2+
3+
import type { DModelsService, DModelsServiceId } from '~/common/stores/llms/llms.service.types';
4+
5+
import { findModelVendor, ModelVendorId } from '../vendors/vendors.registry';
6+
7+
8+
// direct imports for all vendor setup components - NOTE: we could lazy load if this becomes a performance issue
9+
import { AlibabaServiceSetup } from '../vendors/alibaba/AlibabaServiceSetup';
10+
import { AnthropicServiceSetup } from '../vendors/anthropic/AnthropicServiceSetup';
11+
import { AzureServiceSetup } from '../vendors/azure/AzureServiceSetup';
12+
import { DeepseekAIServiceSetup } from '../vendors/deepseek/DeepseekAIServiceSetup';
13+
import { GeminiServiceSetup } from '../vendors/gemini/GeminiServiceSetup';
14+
import { GroqServiceSetup } from '../vendors/groq/GroqServiceSetup';
15+
import { LMStudioServiceSetup } from '../vendors/lmstudio/LMStudioServiceSetup';
16+
import { LocalAIServiceSetup } from '../vendors/localai/LocalAIServiceSetup';
17+
import { MistralServiceSetup } from '../vendors/mistral/MistralServiceSetup';
18+
import { OllamaServiceSetup } from '../vendors/ollama/OllamaServiceSetup';
19+
import { OpenAIServiceSetup } from '../vendors/openai/OpenAIServiceSetup';
20+
import { OpenPipeServiceSetup } from '../vendors/openpipe/OpenPipeServiceSetup';
21+
import { OpenRouterServiceSetup } from '../vendors/openrouter/OpenRouterServiceSetup';
22+
import { PerplexityServiceSetup } from '../vendors/perplexity/PerplexityServiceSetup';
23+
import { TogetherAIServiceSetup } from '../vendors/togetherai/TogetherAIServiceSetup';
24+
import { XAIServiceSetup } from '../vendors/xai/XAIServiceSetup';
25+
26+
27+
/**
28+
* Hardcoded mapping with the setup components for each vendor.
29+
* NOTE: we do it here to only depend on this file (even lazily) and avoid to import all the Components (UI)
30+
* code on vendor definitions (which must be lightweight as it impacts boot time).
31+
*/
32+
const vendorSetupComponents: Record<ModelVendorId, React.ComponentType<{ serviceId: DModelsServiceId }>> = {
33+
alibaba: AlibabaServiceSetup,
34+
anthropic: AnthropicServiceSetup,
35+
azure: AzureServiceSetup,
36+
deepseek: DeepseekAIServiceSetup,
37+
googleai: GeminiServiceSetup,
38+
groq: GroqServiceSetup,
39+
lmstudio: LMStudioServiceSetup,
40+
localai: LocalAIServiceSetup,
41+
mistral: MistralServiceSetup,
42+
ollama: OllamaServiceSetup,
43+
openai: OpenAIServiceSetup,
44+
openpipe: OpenPipeServiceSetup,
45+
openrouter: OpenRouterServiceSetup,
46+
perplexity: PerplexityServiceSetup,
47+
togetherai: TogetherAIServiceSetup,
48+
xai: XAIServiceSetup,
49+
} as const;
50+
51+
52+
export function LLMVendorSetup(props: { service: DModelsService }) {
53+
const vendor = findModelVendor(props.service.vId);
54+
if (!vendor)
55+
return 'Configuration issue: Vendor not found for Service ' + props.service.id;
56+
57+
const SetupComponent = vendorSetupComponents[vendor.id];
58+
if (!SetupComponent)
59+
return 'Configuration issue: Setup component not found for vendor ' + vendor.id;
60+
61+
return <SetupComponent key={props.service.id} serviceId={props.service.id} />;
62+
}

src/modules/llms/models-modal/ModelsModal.tsx

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,20 @@ import { useHasLLMs, useModelsServices } from '~/common/stores/llms/llms.hooks';
1111
import { useIsMobile } from '~/common/components/useMatchMedia';
1212

1313
import { LLMOptionsModal } from './LLMOptionsModal';
14+
import { LLMVendorSetup } from '../components/LLMVendorSetup';
1415
import { ModelsList } from './ModelsList';
1516
import { ModelsServiceSelector } from './ModelsServiceSelector';
1617
import { ModelsWizard } from './ModelsWizard';
17-
import { findModelVendor } from '../vendors/vendors.registry';
1818

1919

2020
// configuration
2121
const MODELS_WIZARD_ENABLE_INITIALLY = true;
2222

2323

24-
function VendorServiceSetup(props: { service: DModelsService }) {
25-
const vendor = findModelVendor(props.service.vId);
26-
if (!vendor)
27-
return 'Configuration issue: Vendor not found for Service ' + props.service.id;
28-
return <vendor.ServiceSetupComponent key={props.service.id} serviceId={props.service.id} />;
29-
}
30-
31-
3224
type TabValue = 'wizard' | 'setup' | 'defaults';
3325

3426
/**
35-
* Note: the reason for this component separation from the parent state, is delayed state intitialization.
27+
* Note: the reason for this component separation from the parent state, is delayed state initialization.
3628
*/
3729
function ModelsConfiguratorModal(props: {
3830
modelsServices: DModelsService[],
@@ -148,7 +140,7 @@ function ModelsConfiguratorModal(props: {
148140
{isTabSetup && (
149141
<Box sx={{ display: 'grid', gap: 'var(--Card-padding)' }}>
150142
{activeService
151-
? <VendorServiceSetup service={activeService} />
143+
? <LLMVendorSetup service={activeService} />
152144
: <Box sx={{ minHeight: '7.375rem' }} />
153145
}
154146
</Box>

src/modules/llms/vendors/IModelVendor.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type { SvgIconProps } from '@mui/joy';
55
import type { BackendCapabilities } from '~/modules/backend/store-backend-capabilities';
66

77
import type { DLLM } from '~/common/stores/llms/llms.types';
8-
import type { DModelsServiceId } from '~/common/stores/llms/llms.service.types';
98

109
import type { ModelDescriptionSchema } from '../server/llm.server.types';
1110
import type { ModelVendorId } from './vendors.registry';
@@ -24,7 +23,6 @@ export interface IModelVendor<TServiceSettings extends Record<string, any> = {},
2423

2524
// components
2625
readonly Icon: React.FunctionComponent<SvgIconProps>;
27-
readonly ServiceSetupComponent: React.ComponentType<{ serviceId: DModelsServiceId }>;
2826

2927
/// abstraction interface ///
3028

src/modules/llms/vendors/alibaba/alibaba.vendor.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import type { IModelVendor } from '../IModelVendor';
44
import type { OpenAIAccessSchema } from '../../server/openai/openai.router';
55
import { ModelVendorOpenAI } from '../openai/openai.vendor';
66

7-
import { AlibabaServiceSetup } from './AlibabaServiceSetup';
8-
97

108
interface DAlibabaServiceSettings {
119
alibabaOaiKey: string;
@@ -22,7 +20,6 @@ export const ModelVendorAlibaba: IModelVendor<DAlibabaServiceSettings, OpenAIAcc
2220

2321
// components
2422
Icon: AlibabaCloudIcon,
25-
ServiceSetupComponent: AlibabaServiceSetup,
2623

2724
// functions
2825
initializeSetup: () => ({

src/modules/llms/vendors/anthropic/anthropic.vendor.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import { apiAsync } from '~/common/util/trpc.client';
44
import type { AnthropicAccessSchema } from '../../server/anthropic/anthropic.router';
55
import type { IModelVendor } from '../IModelVendor';
66

7-
import { AnthropicServiceSetup } from './AnthropicServiceSetup';
8-
97

108
// special symbols
119
export const isValidAnthropicApiKey = (apiKey?: string) => !!apiKey && (apiKey.startsWith('sk-') ? apiKey.length >= 39 : apiKey.length > 1);
@@ -27,7 +25,6 @@ export const ModelVendorAnthropic: IModelVendor<DAnthropicServiceSettings, Anthr
2725

2826
// components
2927
Icon: AnthropicIcon,
30-
ServiceSetupComponent: AnthropicServiceSetup,
3128

3229
// functions
3330
getTransportAccess: (partialSetup): AnthropicAccessSchema => ({

src/modules/llms/vendors/azure/azure.vendor.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router';
55

66
import { ModelVendorOpenAI } from '../openai/openai.vendor';
77

8-
import { AzureServiceSetup } from './AzureServiceSetup';
9-
108

119
// special symbols
1210
export const isValidAzureApiKey = (apiKey?: string) => !!apiKey && apiKey.length >= 32;
@@ -42,7 +40,6 @@ export const ModelVendorAzure: IModelVendor<DAzureServiceSettings, OpenAIAccessS
4240

4341
// components
4442
Icon: AzureIcon,
45-
ServiceSetupComponent: AzureServiceSetup,
4643

4744
// functions
4845
getTransportAccess: (partialSetup): OpenAIAccessSchema => ({

src/modules/llms/vendors/deepseek/deepseekai.vendor.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router';
55

66
import { ModelVendorOpenAI } from '../openai/openai.vendor';
77

8-
import { DeepseekAIServiceSetup } from './DeepseekAIServiceSetup';
9-
108

119
export interface DDeepseekServiceSettings {
1210
deepseekKey: string;
@@ -22,7 +20,6 @@ export const ModelVendorDeepseek: IModelVendor<DDeepseekServiceSettings, OpenAIA
2220

2321
// components
2422
Icon: DeepseekIcon,
25-
ServiceSetupComponent: DeepseekAIServiceSetup,
2623

2724
// functions
2825
initializeSetup: () => ({

src/modules/llms/vendors/gemini/gemini.vendor.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import type { GeminiAccessSchema } from '../../server/gemini/gemini.router';
55
import type { GeminiWire_Safety } from '~/modules/aix/server/dispatch/wiretypes/gemini.wiretypes';
66
import type { IModelVendor } from '../IModelVendor';
77

8-
import { GeminiServiceSetup } from './GeminiServiceSetup';
9-
108

119
interface DGeminiServiceSettings {
1210
geminiKey: string;
@@ -35,7 +33,6 @@ export const ModelVendorGemini: IModelVendor<DGeminiServiceSettings, GeminiAcces
3533

3634
// components
3735
Icon: GeminiIcon,
38-
ServiceSetupComponent: GeminiServiceSetup,
3936

4037
// functions
4138
initializeSetup: () => ({

src/modules/llms/vendors/groq/groq.vendor.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router';
55

66
import { ModelVendorOpenAI } from '../openai/openai.vendor';
77

8-
import { GroqServiceSetup } from './GroqServiceSetup';
9-
108

119
interface DGroqServiceSettings {
1210
groqKey: string;
@@ -22,7 +20,6 @@ export const ModelVendorGroq: IModelVendor<DGroqServiceSettings, OpenAIAccessSch
2220

2321
// components
2422
Icon: GroqIcon,
25-
ServiceSetupComponent: GroqServiceSetup,
2623

2724
// functions
2825
initializeSetup: () => ({

src/modules/llms/vendors/lmstudio/lmstudio.vendor.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import type { OpenAIAccessSchema } from '../../server/openai/openai.router';
33

44
import { ModelVendorOpenAI } from '../openai/openai.vendor';
55

6-
import { LMStudioServiceSetup } from './LMStudioServiceSetup';
76
import { LMStudioIcon } from '~/common/components/icons/vendors/LMStudioIcon';
87

98

@@ -20,7 +19,6 @@ export const ModelVendorLMStudio: IModelVendor<DLMStudioServiceSettings, OpenAIA
2019

2120
// components
2221
Icon: LMStudioIcon,
23-
ServiceSetupComponent: LMStudioServiceSetup,
2422

2523
// functions
2624
initializeSetup: () => ({

0 commit comments

Comments
 (0)