diff --git a/app/lib/modules/llm/providers/openai-like.ts b/app/lib/modules/llm/providers/openai-like.ts index f33f21ed..dd5552aa 100644 --- a/app/lib/modules/llm/providers/openai-like.ts +++ b/app/lib/modules/llm/providers/openai-like.ts @@ -10,10 +10,47 @@ export default class OpenAILikeProvider extends BaseProvider { config = { baseUrlKey: 'OPENAI_LIKE_API_BASE_URL', apiTokenKey: 'OPENAI_LIKE_API_KEY', + modelKey: 'OPENAI_LIKE_API_MODELS', }; staticModels: ModelInfo[] = []; + getEnvDefinedModels(serverEnv: Record = {}): ModelInfo[] { + const models = serverEnv[this.config.modelKey] || process.env[this.config.modelKey]; + console.debug(`${this.name}: ${this.config.modelKey}=${models}`); + + const mklabel = (model: string) => { + let parts = model.split('/').reverse() || []; + parts = parts.filter((p) => p && !p.includes('accounts') && !p.includes('models')); + + let label = parts.join('-'); + + if (parts.length >= 2) { + label = `${parts.shift()} (${parts.join(', ')})`; + } + + return label.toLowerCase().replace(/\b\w/g, (match) => match.toUpperCase()); + }; + + const ret = + models?.split(';').map((model) => { + const parts = model.split(':'); + const name = (parts.length && parts.shift()?.trim()) || 'parse-error'; + const ret = { + name, + label: mklabel(name), + provider: this.name, + maxTokenAllowed: parseInt(parts.shift() || '0'), + }; + + return ret; + }) || []; + + console.debug(`${this.name}: Parsed Models: `, ...ret); + + return ret; + } + async getDynamicModels( apiKeys?: Record, settings?: IProviderSetting, @@ -34,17 +71,29 @@ export default class OpenAILikeProvider extends BaseProvider { const response = await fetch(`${baseUrl}/models`, { headers: { Authorization: `Bearer ${apiKey}`, + ContentType: 'application/json', }, }); - const res = (await response.json()) as any; + let ret = []; - return res.data.map((model: any) => ({ - name: model.id, - label: model.id, - provider: this.name, - maxTokenAllowed: 8000, - })); + try { + const json = (await response.json()) as any; + ret = json.data.map((model: any) => ({ + name: model.id, + label: model.id, + provider: this.name, + maxTokenAllowed: 8000, + })); + } catch { + if (response.headers.has('x-error-message')) { + const xerr = response.headers.get('x-error-message'); + console.debug(`${this.name}: ${xerr}`); + ret = this.getEnvDefinedModels(serverEnv); + } + } + + return ret; } getModelInstance(options: {