From 7e327bb260fa493365323e155ccb2fd0a41ded22 Mon Sep 17 00:00:00 2001 From: syarbeats Date: Fri, 7 Mar 2025 21:45:16 +0700 Subject: [PATCH] add telkom models provider --- .../modules/llm/providers/telkom-design.ts | 110 ++++++++++++++++++ app/lib/modules/llm/registry.ts | 2 + app/lib/stores/settings.ts | 2 +- 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 app/lib/modules/llm/providers/telkom-design.ts diff --git a/app/lib/modules/llm/providers/telkom-design.ts b/app/lib/modules/llm/providers/telkom-design.ts new file mode 100644 index 00000000..d8c6fa3b --- /dev/null +++ b/app/lib/modules/llm/providers/telkom-design.ts @@ -0,0 +1,110 @@ +import { BaseProvider } from '~/lib/modules/llm/base-provider'; +import type { ModelInfo } from '~/lib/modules/llm/types'; +import type { IProviderSetting } from '~/types/model'; +import type { LanguageModelV1 } from 'ai'; +import { createOpenAI } from '@ai-sdk/openai'; + +export default class TelkomDesignProvider extends BaseProvider { + name = 'TelkomDesign'; + getApiKeyLink = undefined; + labelForGetApiKey = 'Get Telkom Design API Key'; + + // Use default icon + icon = 'i-ph:robot'; + + config = { + baseUrlKey: 'TELKOM_DESIGN_API_BASE_URL', + apiTokenKey: 'TELKOM_DESIGN_API_KEY', + baseUrl: 'https://api-stage-aitools.telkom.design', + }; + + // Default model if dynamic fetching fails + staticModels: ModelInfo[] = [ + { + name: 'gpt-4o-mini', + label: 'GPT-4o Mini', + provider: this.name, + maxTokenAllowed: 8000, + }, + ]; + + // Implement dynamic model fetching + async getDynamicModels( + apiKeys?: Record, + settings?: IProviderSetting, + serverEnv: Record = {}, + ): Promise { + const { baseUrl, apiKey } = this.getProviderBaseUrlAndKey({ + apiKeys, + providerSettings: settings, + serverEnv, + defaultBaseUrlKey: 'TELKOM_DESIGN_API_BASE_URL', + defaultApiTokenKey: 'TELKOM_DESIGN_API_KEY', + }); + + if (!baseUrl || !apiKey) { + return this.staticModels; + } + + try { + // Fetch models from the API + const response = await fetch(`${baseUrl}/v1/openai/models`, { + headers: { + 'Api-Key': apiKey, + Authorization: `Bearer ${apiKey}`, + }, + }); + + if (!response.ok) { + return this.staticModels; + } + + const data = (await response.json()) as { data: Array<{ id: string }> }; + + // Map API response to ModelInfo objects + return data.data.map((model: any) => ({ + name: model.id, + label: model.id, + provider: this.name, + maxTokenAllowed: 8000, // Default value, adjust as needed + })); + } catch (error) { + console.error(`Error fetching models for ${this.name}:`, error); + return this.staticModels; + } + } + + // Implement model instance creation with custom headers + getModelInstance(options: { + model: string; + serverEnv: Env; + apiKeys?: Record; + providerSettings?: Record; + }): LanguageModelV1 { + const { model, serverEnv, apiKeys, providerSettings } = options; + + const { baseUrl, apiKey } = this.getProviderBaseUrlAndKey({ + apiKeys, + providerSettings: providerSettings?.[this.name], + serverEnv: serverEnv as any, + defaultBaseUrlKey: 'TELKOM_DESIGN_API_BASE_URL', + defaultApiTokenKey: 'TELKOM_DESIGN_API_KEY', + }); + + if (!baseUrl || !apiKey) { + throw new Error(`Missing configuration for ${this.name} provider`); + } + + // Create OpenAI instance with custom headers + const openai = createOpenAI({ + baseURL: `${baseUrl}/v1/openai`, // Add the /v1/openai path + apiKey, // Use the API key directly (shorthand property) + headers: { + 'Api-Key': apiKey, // Also include it in the headers + Authorization: `Bearer ${apiKey}`, // Add standard Authorization header as well + }, + }); + + return openai(model); + } +} diff --git a/app/lib/modules/llm/registry.ts b/app/lib/modules/llm/registry.ts index 6edba6d8..8f344c15 100644 --- a/app/lib/modules/llm/registry.ts +++ b/app/lib/modules/llm/registry.ts @@ -11,6 +11,7 @@ import OpenRouterProvider from './providers/open-router'; import OpenAILikeProvider from './providers/openai-like'; import OpenAIProvider from './providers/openai'; import PerplexityProvider from './providers/perplexity'; +import TelkomDesignProvider from './providers/telkom-design'; import TogetherProvider from './providers/together'; import XAIProvider from './providers/xai'; import HyperbolicProvider from './providers/hyperbolic'; @@ -31,6 +32,7 @@ export { OpenRouterProvider, OpenAILikeProvider, PerplexityProvider, + TelkomDesignProvider, XAIProvider, TogetherProvider, LMStudioProvider, diff --git a/app/lib/stores/settings.ts b/app/lib/stores/settings.ts index 917f6e0a..83c2097c 100644 --- a/app/lib/stores/settings.ts +++ b/app/lib/stores/settings.ts @@ -29,7 +29,7 @@ export interface Shortcuts { toggleTerminal: Shortcut; } -export const URL_CONFIGURABLE_PROVIDERS = ['Ollama', 'LMStudio', 'OpenAILike']; +export const URL_CONFIGURABLE_PROVIDERS = ['Ollama', 'LMStudio', 'OpenAILike', 'TelkomDesign']; export const LOCAL_PROVIDERS = ['OpenAILike', 'LMStudio', 'Ollama']; export type ProviderSetting = Record;