diff --git a/src/lib/models/providers/anthropic/anthropicLLM.ts b/src/lib/models/providers/anthropic/anthropicLLM.ts index 9d660d6..a020de6 100644 --- a/src/lib/models/providers/anthropic/anthropicLLM.ts +++ b/src/lib/models/providers/anthropic/anthropicLLM.ts @@ -1,5 +1,5 @@ -import OpenAILLM from "../openai/openaiLLM"; +import OpenAILLM from '../openai/openaiLLM'; class AnthropicLLM extends OpenAILLM {} -export default AnthropicLLM; \ No newline at end of file +export default AnthropicLLM; diff --git a/src/lib/models/providers/anthropic/index.ts b/src/lib/models/providers/anthropic/index.ts index 2278ca2..0342647 100644 --- a/src/lib/models/providers/anthropic/index.ts +++ b/src/lib/models/providers/anthropic/index.ts @@ -81,7 +81,7 @@ class AnthropicProvider extends BaseModelProvider { return new AnthropicLLM({ apiKey: this.config.apiKey, model: key, - baseURL: 'https://api.anthropic.com/v1' + baseURL: 'https://api.anthropic.com/v1', }); } @@ -112,4 +112,4 @@ class AnthropicProvider extends BaseModelProvider { } } -export default AnthropicProvider; \ No newline at end of file +export default AnthropicProvider; diff --git a/src/lib/models/providers/index.ts b/src/lib/models/providers/index.ts index c53cb71..ef52f4b 100644 --- a/src/lib/models/providers/index.ts +++ b/src/lib/models/providers/index.ts @@ -15,7 +15,7 @@ export const providers: Record> = { transformers: TransformersProvider, groq: GroqProvider, lemonade: LemonadeProvider, - anthropic: AnthropicProvider + anthropic: AnthropicProvider, }; export const getModelProvidersUIConfigSection = diff --git a/src/lib/models/providers/lemonade/index.ts b/src/lib/models/providers/lemonade/index.ts index 12f5391..d31676b 100644 --- a/src/lib/models/providers/lemonade/index.ts +++ b/src/lib/models/providers/lemonade/index.ts @@ -8,142 +8,146 @@ import BaseEmbedding from '../../base/embedding'; import LemonadeEmbedding from './lemonadeEmbedding'; interface LemonadeConfig { - baseURL: string; - apiKey?: string; + baseURL: string; + apiKey?: string; } const providerConfigFields: UIConfigField[] = [ - { - type: 'string', - name: 'Base URL', - key: 'baseURL', - description: 'The base URL for Lemonade API', - required: true, - placeholder: 'https://api.lemonade.ai/v1', - env: 'LEMONADE_BASE_URL', - scope: 'server', - }, - { - type: 'password', - name: 'API Key', - key: 'apiKey', - description: 'Your Lemonade API key (optional)', - required: false, - placeholder: 'Lemonade API Key', - env: 'LEMONADE_API_KEY', - scope: 'server', - }, + { + type: 'string', + name: 'Base URL', + key: 'baseURL', + description: 'The base URL for Lemonade API', + required: true, + placeholder: 'https://api.lemonade.ai/v1', + env: 'LEMONADE_BASE_URL', + scope: 'server', + }, + { + type: 'password', + name: 'API Key', + key: 'apiKey', + description: 'Your Lemonade API key (optional)', + required: false, + placeholder: 'Lemonade API Key', + env: 'LEMONADE_API_KEY', + scope: 'server', + }, ]; class LemonadeProvider extends BaseModelProvider { - constructor(id: string, name: string, config: LemonadeConfig) { - super(id, name, config); - } + constructor(id: string, name: string, config: LemonadeConfig) { + super(id, name, config); + } - async getDefaultModels(): Promise { - try { - const res = await fetch(`${this.config.baseURL}/models`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - ...this.config.apiKey ? {'Authorization': `Bearer ${this.config.apiKey}`} : {} - }, - }); + async getDefaultModels(): Promise { + try { + const res = await fetch(`${this.config.baseURL}/models`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + ...(this.config.apiKey + ? { Authorization: `Bearer ${this.config.apiKey}` } + : {}), + }, + }); - const data = await res.json(); + const data = await res.json(); - const models: Model[] = data.data.filter((m: any) => m.recipe === 'llamacpp').map((m: any) => { - return { - name: m.id, - key: m.id, - }; - }); - - return { - embedding: models, - chat: models, - }; - } catch (err) { - if (err instanceof TypeError) { - throw new Error( - 'Error connecting to Lemonade API. Please ensure the base URL is correct and the service is available.', - ); - } - - throw err; - } - } - - async getModelList(): Promise { - const defaultModels = await this.getDefaultModels(); - const configProvider = getConfiguredModelProviderById(this.id)!; - - return { - embedding: [ - ...defaultModels.embedding, - ...configProvider.embeddingModels, - ], - chat: [...defaultModels.chat, ...configProvider.chatModels], - }; - } - - async loadChatModel(key: string): Promise> { - const modelList = await this.getModelList(); - - const exists = modelList.chat.find((m) => m.key === key); - - if (!exists) { - throw new Error( - 'Error Loading Lemonade Chat Model. Invalid Model Selected', - ); - } - - return new LemonadeLLM({ - apiKey: this.config.apiKey || 'not-needed', - model: key, - baseURL: this.config.baseURL, + const models: Model[] = data.data + .filter((m: any) => m.recipe === 'llamacpp') + .map((m: any) => { + return { + name: m.id, + key: m.id, + }; }); + + return { + embedding: models, + chat: models, + }; + } catch (err) { + if (err instanceof TypeError) { + throw new Error( + 'Error connecting to Lemonade API. Please ensure the base URL is correct and the service is available.', + ); + } + + throw err; + } + } + + async getModelList(): Promise { + const defaultModels = await this.getDefaultModels(); + const configProvider = getConfiguredModelProviderById(this.id)!; + + return { + embedding: [ + ...defaultModels.embedding, + ...configProvider.embeddingModels, + ], + chat: [...defaultModels.chat, ...configProvider.chatModels], + }; + } + + async loadChatModel(key: string): Promise> { + const modelList = await this.getModelList(); + + const exists = modelList.chat.find((m) => m.key === key); + + if (!exists) { + throw new Error( + 'Error Loading Lemonade Chat Model. Invalid Model Selected', + ); } - async loadEmbeddingModel(key: string): Promise> { - const modelList = await this.getModelList(); - const exists = modelList.embedding.find((m) => m.key === key); + return new LemonadeLLM({ + apiKey: this.config.apiKey || 'not-needed', + model: key, + baseURL: this.config.baseURL, + }); + } - if (!exists) { - throw new Error( - 'Error Loading Lemonade Embedding Model. Invalid Model Selected.', - ); - } + async loadEmbeddingModel(key: string): Promise> { + const modelList = await this.getModelList(); + const exists = modelList.embedding.find((m) => m.key === key); - return new LemonadeEmbedding({ - apiKey: this.config.apiKey || 'not-needed', - model: key, - baseURL: this.config.baseURL, - }); + if (!exists) { + throw new Error( + 'Error Loading Lemonade Embedding Model. Invalid Model Selected.', + ); } - static parseAndValidate(raw: any): LemonadeConfig { - if (!raw || typeof raw !== 'object') - throw new Error('Invalid config provided. Expected object'); - if (!raw.baseURL) - throw new Error('Invalid config provided. Base URL must be provided'); + return new LemonadeEmbedding({ + apiKey: this.config.apiKey || 'not-needed', + model: key, + baseURL: this.config.baseURL, + }); + } - return { - baseURL: String(raw.baseURL), - apiKey: raw.apiKey ? String(raw.apiKey) : undefined, - }; - } + static parseAndValidate(raw: any): LemonadeConfig { + if (!raw || typeof raw !== 'object') + throw new Error('Invalid config provided. Expected object'); + if (!raw.baseURL) + throw new Error('Invalid config provided. Base URL must be provided'); - static getProviderConfigFields(): UIConfigField[] { - return providerConfigFields; - } + return { + baseURL: String(raw.baseURL), + apiKey: raw.apiKey ? String(raw.apiKey) : undefined, + }; + } - static getProviderMetadata(): ProviderMetadata { - return { - key: 'lemonade', - name: 'Lemonade', - }; - } + static getProviderConfigFields(): UIConfigField[] { + return providerConfigFields; + } + + static getProviderMetadata(): ProviderMetadata { + return { + key: 'lemonade', + name: 'Lemonade', + }; + } } -export default LemonadeProvider; \ No newline at end of file +export default LemonadeProvider; diff --git a/src/lib/models/providers/lemonade/lemonadeEmbedding.ts b/src/lib/models/providers/lemonade/lemonadeEmbedding.ts index a8e2155..7d720f8 100644 --- a/src/lib/models/providers/lemonade/lemonadeEmbedding.ts +++ b/src/lib/models/providers/lemonade/lemonadeEmbedding.ts @@ -1,5 +1,5 @@ -import OpenAIEmbedding from "../openai/openaiEmbedding"; +import OpenAIEmbedding from '../openai/openaiEmbedding'; class LemonadeEmbedding extends OpenAIEmbedding {} -export default LemonadeEmbedding; \ No newline at end of file +export default LemonadeEmbedding; diff --git a/src/lib/models/providers/lemonade/lemonadeLLM.ts b/src/lib/models/providers/lemonade/lemonadeLLM.ts index d207e13..bfd3e28 100644 --- a/src/lib/models/providers/lemonade/lemonadeLLM.ts +++ b/src/lib/models/providers/lemonade/lemonadeLLM.ts @@ -1,5 +1,5 @@ -import OpenAILLM from "../openai/openaiLLM"; +import OpenAILLM from '../openai/openaiLLM'; class LemonadeLLM extends OpenAILLM {} -export default LemonadeLLM; \ No newline at end of file +export default LemonadeLLM;