diff --git a/extensions/llamacpp-extension/src/index.ts b/extensions/llamacpp-extension/src/index.ts index 3538389ec..ec2ae5a36 100644 --- a/extensions/llamacpp-extension/src/index.ts +++ b/extensions/llamacpp-extension/src/index.ts @@ -886,7 +886,7 @@ export default class llamacpp_extension extends AIEngine { modelId = modelId !== 'imported' - ? modelId + ? modelId.replace(/^(cortex\.so|huggingface\.co)[\/\\]/, '') : (await basename(child)).replace('.yml', '') const modelName = legacyModelConfig.model ?? modelId diff --git a/web-app/src/hooks/__tests__/useHardware.test.ts b/web-app/src/hooks/__tests__/useHardware.test.ts index ee8b182bb..94c6ed50a 100644 --- a/web-app/src/hooks/__tests__/useHardware.test.ts +++ b/web-app/src/hooks/__tests__/useHardware.test.ts @@ -68,6 +68,11 @@ describe('useHardware', () => { extensions: ['SSE', 'AVX'], name: 'Intel Core i7', usage: 25.5, + instructions: [], + }, + ram: { + available: 0, + total: 0, }, gpus: [ { diff --git a/web-app/src/hooks/useHardware.ts b/web-app/src/hooks/useHardware.ts index 013417f51..183fa2490 100644 --- a/web-app/src/hooks/useHardware.ts +++ b/web-app/src/hooks/useHardware.ts @@ -9,6 +9,7 @@ export interface CPU { extensions: string[] name: string usage: number + instructions?: string[] // Cortex migration: ensure instructions data ready } export interface GPUAdditionalInfo { @@ -171,6 +172,15 @@ export const useHardware = create()( set({ hardwareData: { ...data, + cpu: { + ...data.cpu, + // Cortex migration - ensure instructions data ready + instructions: [], + }, + ram: { + available: 0, + total: 0, + }, gpus: data.gpus.map((gpu) => ({ ...gpu, activated: gpu.activated ?? false, diff --git a/web-app/src/hooks/useModelProvider.ts b/web-app/src/hooks/useModelProvider.ts index 90c49b9e1..919dec091 100644 --- a/web-app/src/hooks/useModelProvider.ts +++ b/web-app/src/hooks/useModelProvider.ts @@ -1,6 +1,7 @@ import { create } from 'zustand' import { persist, createJSONStorage } from 'zustand/middleware' import { localStorageKey } from '@/constants/localStorage' +import { sep } from '@tauri-apps/api/path' type ModelProviderState = { providers: ModelProvider[] @@ -50,6 +51,17 @@ export const useModelProvider = create()( ), } }) + + let legacyModels: Model[] | undefined = [] + /// Cortex Migration + if ( + localStorage.getItem('cortex_model_settings_migrated') !== 'true' + ) { + legacyModels = state.providers.find( + (e) => e.provider === 'llama.cpp' + )?.models + localStorage.setItem('cortex_model_settings_migrated', 'true') + } // Ensure deletedModels is always an array const currentDeletedModels = Array.isArray(state.deletedModels) ? state.deletedModels @@ -75,13 +87,21 @@ export const useModelProvider = create()( ...models, ] const updatedModels = provider.models?.map((model) => { + const settings = + (legacyModels && legacyModels?.length > 0 + ? legacyModels + : models + ).find( + (m) => m.id.split(':').slice(0, 2).join(sep()) === model.id + )?.settings || model.settings const existingModel = models.find((m) => m.id === model.id) return { ...model, - settings: existingModel?.settings || model.settings, + settings: settings, capabilities: existingModel?.capabilities || model.capabilities, } }) + return { ...provider, models: provider.persist ? updatedModels : mergedModels, diff --git a/web-app/src/hooks/useThreads.ts b/web-app/src/hooks/useThreads.ts index e66cc6056..665681462 100644 --- a/web-app/src/hooks/useThreads.ts +++ b/web-app/src/hooks/useThreads.ts @@ -2,6 +2,7 @@ import { create } from 'zustand' import { ulid } from 'ulidx' import { createThread, deleteThread, updateThread } from '@/services/threads' import { Fzf } from 'fzf' +import { sep } from '@tauri-apps/api/path' type ThreadState = { threads: Record @@ -34,7 +35,19 @@ export const useThreads = create()((set, get) => ({ setThreads: (threads) => { const threadMap = threads.reduce( (acc: Record, thread) => { - acc[thread.id] = thread + acc[thread.id] = { + ...thread, + model: thread.model + ? { + provider: thread.model.provider.replace( + 'llama.cpp', + 'llamacpp' + ), + // Cortex migration: take first two parts of the ID (the last is file name which is not needed) + id: thread.model?.id.split(':').slice(0, 2).join(sep()), + } + : undefined, + } return acc }, {} as Record