jan/web-app/src/services/providers.ts
Louis 6676e0ced8
chore: add relocate jan data folder function to new FE (#5043)
* chore: typo

* fix: linter issues

* chore: fix linter

* chore: fix linter

* chore: add relocate data folder
2025-05-21 10:48:10 +07:00

113 lines
3.7 KiB
TypeScript

import { models as providerModels } from 'token.js'
import { mockModelProvider } from '@/mock/data'
import { EngineManager, SettingComponentProps } from '@janhq/core'
import { ModelCapabilities } from '@/types/models'
import { modelSettings } from '@/lib/predefined'
import { fetchModels } from './models'
import { ExtensionManager } from '@/lib/extension'
export const getProviders = async (): Promise<ModelProvider[]> => {
const builtinProviders = mockModelProvider.map((provider) => {
let models = provider.models as Model[]
if (Object.keys(providerModels).includes(provider.provider)) {
const builtInModels = providerModels[
provider.provider as unknown as keyof typeof providerModels
].models as unknown as string[]
if (Array.isArray(builtInModels))
models = builtInModels.map((model) => {
const modelManifest = models.find((e) => e.id === model)
const capabilities = [
ModelCapabilities.COMPLETION,
(
providerModels[
provider.provider as unknown as keyof typeof providerModels
].supportsToolCalls as unknown as string[]
).includes(model)
? ModelCapabilities.TOOLS
: undefined,
].filter(Boolean) as string[]
return {
...(modelManifest ?? { id: model, name: model }),
capabilities,
} as Model
})
}
return {
...provider,
models,
}
})
const runtimeProviders: ModelProvider[] = []
for (const [key, value] of EngineManager.instance().engines) {
// TODO: Remove this when the cortex extension is removed
const providerName = key === 'cortex' ? 'llama.cpp' : key
const models =
((await fetchModels()) ?? []).filter(
(model) =>
(model.engine === 'llama-cpp' ? 'llama.cpp' : model.engine) ===
providerName &&
'status' in model &&
model.status === 'downloaded'
) ?? []
const provider: ModelProvider = {
active: false,
provider: providerName,
base_url:
'inferenceUrl' in value
? (value.inferenceUrl as string).replace('/chat/completions', '')
: '',
settings: (await value.getSettings()).map((setting) => ({
key: setting.key,
title: setting.title,
description: setting.description,
controller_type: setting.controllerType as unknown,
controller_props: setting.controllerProps as unknown,
})) as ProviderSetting[],
models: models.map((model) => ({
id: model.id,
model: model.id,
name: model.name,
description: model.description,
capabilities:
'capabilities' in model
? (model.capabilities as string[])
: [ModelCapabilities.COMPLETION],
provider: providerName,
settings: modelSettings ,
})),
}
runtimeProviders.push(provider)
}
return runtimeProviders.concat(builtinProviders as ModelProvider[])
}
/**
* Update the settings of a provider extension.
* TODO: Later on we don't retrieve this using provider name
* @param providerName
* @param settings
*/
export const updateSettings = async (
providerName: string,
settings: ProviderSetting[]
): Promise<void> => {
const provider = providerName === 'llama.cpp' ? 'cortex' : providerName
return ExtensionManager.getInstance()
.getEngine(provider)
?.updateSettings(
settings.map((setting) => ({
...setting,
controllerProps: {
...setting.controller_props,
value: setting.controller_props.value ?? '',
},
controllerType: setting.controller_type,
})) as SettingComponentProps[]
)
}