Skip to content

Commit

Permalink
tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
nbonamy committed Jan 23, 2025
1 parent eacf14c commit 160a5cd
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 57 deletions.
2 changes: 1 addition & 1 deletion build/build_number.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
579
580
27 changes: 18 additions & 9 deletions defaults/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"google": {
Expand All @@ -163,7 +164,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"groq": {
Expand All @@ -172,7 +174,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"xai": {
Expand All @@ -181,7 +184,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"openrouter": {
Expand All @@ -190,7 +194,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"deepseek": {
Expand All @@ -199,7 +204,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"cerebras": {
Expand All @@ -208,7 +214,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"mistralai": {
Expand All @@ -217,7 +224,8 @@
"image": []
},
"model": {
"chat": ""
"chat": "",
"image": ""
}
},
"ollama": {
Expand All @@ -227,7 +235,8 @@
"image": []
},
"model": {
"chat": "llama2"
"chat": "",
"image": ""
}
},
"huggingface": {
Expand Down
18 changes: 12 additions & 6 deletions src/llms/llm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export default class LlmFactory {
}

getCustomEngines = (): string[] => {
return Object.keys(this.config.engines).filter(e => e != favoriteMockEngine && !standardEngines.includes(e) && !nonChatEngines.includes(e))
return Object.keys(this.config.engines).filter(e => this.isCustomEngine(e))
}

isCustomEngine = (engine: string): boolean => {
Expand Down Expand Up @@ -307,6 +307,7 @@ export default class LlmFactory {

// needed
const engineConfig = store.config.engines[engine]
const initialConfig = JSON.stringify(engineConfig)

// check
if (typeof models !== 'object') {
Expand All @@ -330,14 +331,19 @@ export default class LlmFactory {
}

// save in store
engineConfig.models = models
engineConfig.models = {
chat: [],
image: [],
...models
}
engineConfig.model = {
chat: this.getValidModelId(engineConfig, 'chat', engineConfig.model?.chat),
image: this.getValidModelId(engineConfig, 'image', engineConfig.model?.image)
chat: this.getValidModelId(engineConfig, 'chat', engineConfig.model?.chat) || '',
image: this.getValidModelId(engineConfig, 'image', engineConfig.model?.image) || '',
}

// save
if (this.config == store.config) {
// save only if modified
const updatedConfig = JSON.stringify(engineConfig)
if (this.config == store.config && updatedConfig !== initialConfig) {
store.saveSettings()
}

Expand Down
35 changes: 21 additions & 14 deletions src/services/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,32 @@ export const store: Store = reactive({
chats: null
} as Folder,

loadSettings: async () => {
loadSettings: (): void => {
loadSettings()
},

loadHistory: async () => {
loadHistory: (): void => {
loadHistory()
},

loadCommands: async () => {
loadCommands: (): void => {
loadCommands()
},

loadExperts: async () => {
loadExperts: (): void => {
loadExperts()
},

load: async () => {
load: async (): Promise<void> => {

//perf
const start = Date.now()

// load data
store.loadSettings()
store.loadCommands()
loadHistory()
loadExperts()
store.loadHistory()
store.loadExperts()

// subscribe to file changes
window.api.on('file-modified', (signal) => {
Expand All @@ -56,7 +59,7 @@ export const store: Store = reactive({

// load models and select valid engine
const llmFactory = new LlmFactory(store.config)
llmFactory.initModels()
await llmFactory.initModels()
if (!llmFactory.isEngineReady(store.config.llm.engine)) {
for (const engine of llmFactory.getChatEngines({ favorites: false })) {
if (llmFactory.isEngineReady(engine)) {
Expand All @@ -67,13 +70,17 @@ export const store: Store = reactive({
}
}

// perf
console.log(`Store loaded in ${Date.now() - start}ms`)


},

saveSettings: () => {
saveSettings: (): void => {
window.api.config.save(JSON.parse(JSON.stringify(store.config)))
},

saveHistory: () => {
saveHistory: (): void => {

try {

Expand Down Expand Up @@ -101,13 +108,13 @@ export const store: Store = reactive({

},

dump: () => {
dump: (): void => {
console.dir(JSON.parse(JSON.stringify(store.config)))
},

})

const loadSettings = () => {
const loadSettings = (): void => {
// we don't want to reassign store.config
// as others are referencing it directly
// so we update locally instead
Expand All @@ -126,7 +133,7 @@ const loadSettings = () => {
}
}

const loadHistory = () => {
const loadHistory = (): void => {

try {
store.history = { folders: [], chats: [] }
Expand All @@ -145,7 +152,7 @@ const loadHistory = () => {
}

//
const mergeHistory = (jsonHistory: History) => {
const mergeHistory = (jsonHistory: History): void => {

// only if loaded
if (!store.history) {
Expand Down
10 changes: 5 additions & 5 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,11 @@ export interface Store {
chatFilter: string|null
saveHistory?(): void
saveSettings?(): void
load?(): Promise<void>
loadSettings?(): Promise<void>
loadCommands?(): Promise<void>
loadExperts?(): Promise<void>
loadHistory?(): Promise<void>
load?(): void
loadSettings?(): void
loadCommands?(): void
loadExperts?(): void
loadHistory?(): void
mergeHistory?(chats: any[]): void
dump?(): void
}
Expand Down
6 changes: 5 additions & 1 deletion tests/components/chat_area.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ beforeAll(() => {
useNavigatorMock()
useWindowMock()
store.load()
store.config.engines.mock = { label: 'mock' }
store.config.engines.mock = {
label: 'mock',
models: { chat: [ { id: 'chat', name: 'chat'} ], image: [] },
model: { chat: 'chat', image: '' }
}
})

let chat: Chat|null = null
Expand Down
2 changes: 1 addition & 1 deletion tests/screens/settings_llm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ test('ollama settings', async () => {
await ollama.findAll('input')[1].setValue('base-url')
await ollama.findAll('input')[1].trigger('blur')
expect(store.config.engines.ollama.baseURL).toBe('base-url')
await ollama.find('button').trigger('click')
await ollama.findAll('button')[1].trigger('click')
await wait(750) //timeout
expect(loadOllamaModels).toHaveBeenCalledWith(expect.objectContaining({
}))
Expand Down
40 changes: 20 additions & 20 deletions tests/unit/llm2.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ vi.mock('multi-llm-ts', async (importOriginal) => {
return {
...mod,
loadAnthropicModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadCerebrasModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadGoogleModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadGroqModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadCerebrasModels: vi.fn((): ModelsList => ({ chat: [ { id: 'chat', name: 'chat' } ], image: [] })),
loadGoogleModels: vi.fn((): ModelsList => ({ chat: [], image: [ { id: 'image', name: 'image' } ] })),
loadGroqModels: vi.fn((): ModelsList => ({ chat: [ { id: 'chat', name: 'chat' } ], image: [{ id: 'image', name: 'image' }] })),
loadMistralAIModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadOllamaModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadOpenAIModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadOpenAIModels: vi.fn((): ModelsList => ({ chat: [ { id: 'chat', name: 'chat' } ], image: [{ id: 'image', name: 'image' }] })),
loadXAIModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadDeepSeekModels: vi.fn((): ModelsList => ({ chat: [], image: [] })),
loadOpenRouterModels: vi.fn((): ModelsList => ({ chat: [], image: [] }))
Expand All @@ -29,6 +29,11 @@ let llmFactory: LlmFactory

beforeAll(() => {
useWindowMock({ customEngine: true })
llmFactory = new LlmFactory(store.config)
})

beforeEach(() => {
vi.clearAllMocks()
store.loadSettings()
store.config.engines.openai.apiKey = '123'
store.config.engines.anthropic.apiKey = '123'
Expand All @@ -40,11 +45,6 @@ beforeAll(() => {
store.config.engines.xai.apiKey =
store.config.engines.deepseek.apiKey = '123'
store.config.engines.openrouter.apiKey = '123'
llmFactory = new LlmFactory(store.config)
})

beforeEach(() => {
vi.clearAllMocks()
})

test('Init models', async () => {
Expand All @@ -64,43 +64,43 @@ test('Init models', async () => {
test('Load models', async () => {
await llmFactory.loadModels('anthropic')
expect(loadAnthropicModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(0)

await llmFactory.loadModels('cerebras')
expect(loadCerebrasModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(2)
expect(window.api.config?.save).toHaveBeenCalledTimes(1)

await llmFactory.loadModels('google')
expect(loadGoogleModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(3)
expect(window.api.config?.save).toHaveBeenCalledTimes(2)

await llmFactory.loadModels('groq')
expect(loadGroqModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(4)
expect(window.api.config?.save).toHaveBeenCalledTimes(3)

await llmFactory.loadModels('mistralai')
expect(loadMistralAIModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(5)
expect(window.api.config?.save).toHaveBeenCalledTimes(3)

await llmFactory.loadModels('ollama')
expect(loadOllamaModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(6)
expect(window.api.config?.save).toHaveBeenCalledTimes(3)

await llmFactory.loadModels('openai')
expect(loadOpenAIModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(7)
expect(window.api.config?.save).toHaveBeenCalledTimes(4)

await llmFactory.loadModels('xai')
expect(loadXAIModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(8)
expect(window.api.config?.save).toHaveBeenCalledTimes(4)

await llmFactory.loadModels('deepseek')
expect(loadDeepSeekModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(9)
expect(window.api.config?.save).toHaveBeenCalledTimes(4)

await llmFactory.loadModels('openrouter')
expect(loadOpenRouterModels).toHaveBeenCalledTimes(1)
expect(window.api.config?.save).toHaveBeenCalledTimes(10)
expect(window.api.config?.save).toHaveBeenCalledTimes(4)

await llmFactory.loadModels('custom')
expect(loadOpenAIModels).toHaveBeenCalledTimes(2)
Expand All @@ -109,6 +109,6 @@ test('Load models', async () => {
baseURL: 'http://localhost/api/v1',
models: { chat: [], image: [] }
})
expect(window.api.config?.save).toHaveBeenCalledTimes(11)
expect(window.api.config?.save).toHaveBeenCalledTimes(5)

})

0 comments on commit 160a5cd

Please sign in to comment.