Skip to content

Commit 83ed2a6

Browse files
authored
fix(settings): add model initialization and respect chat mode option in ModelSelect (#1518)
1 parent 91ee05a commit 83ed2a6

7 files changed

Lines changed: 63 additions & 11 deletions

File tree

src/renderer/settings/App.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,13 @@ onMounted(async () => {
607607
console.error(`${SETTINGS_STARTUP_LOG_PREFIX} provider summaries failed:`, error)
608608
}
609609
610+
try {
611+
await modelStore.initialize()
612+
logSettingsStartup('enabled models ready')
613+
} catch (error) {
614+
console.error(`${SETTINGS_STARTUP_LOG_PREFIX} enabled models failed:`, error)
615+
}
616+
610617
markStartupInteractive()
611618
window.addEventListener('focus', handleWindowFocus)
612619
await syncPendingProviderInstall()

src/renderer/settings/components/BuiltinKnowledgeSettings.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@
204204
<PopoverContent class="w-80 p-0">
205205
<ModelSelect
206206
:type="[ModelType.Embedding]"
207+
:respect-chat-mode="false"
207208
@update:model="handleEmbeddingModelSelect"
208209
/>
209210
</PopoverContent>
@@ -254,6 +255,7 @@
254255
<PopoverContent class="w-80 p-0">
255256
<ModelSelect
256257
:type="[ModelType.Rerank]"
258+
:respect-chat-mode="false"
257259
@update:model="handleRerankModelSelect"
258260
/>
259261
</PopoverContent>

src/renderer/settings/components/DeepChatAgentsSettings.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@
259259
</div>
260260
<ModelSelect
261261
:exclude-providers="['acp']"
262+
:respect-chat-mode="false"
262263
:vision-only="field.key === 'visionModel'"
263264
@update:model="(model, providerId) => selectModel(field.key, model, providerId)"
264265
/>

src/renderer/settings/components/common/DefaultModelSettingsSection.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@
3131
</Button>
3232
</PopoverTrigger>
3333
<PopoverContent class="w-[320px] p-0" align="end">
34-
<ModelSelect :exclude-providers="['acp']" @update:model="handleAssistantModelSelect" />
34+
<ModelSelect
35+
:exclude-providers="['acp']"
36+
:respect-chat-mode="false"
37+
@update:model="handleAssistantModelSelect"
38+
/>
3539
</PopoverContent>
3640
</Popover>
3741
</div>
@@ -63,7 +67,11 @@
6367
</Button>
6468
</PopoverTrigger>
6569
<PopoverContent class="w-[320px] p-0" align="end">
66-
<ModelSelect :exclude-providers="['acp']" @update:model="handleChatModelSelect" />
70+
<ModelSelect
71+
:exclude-providers="['acp']"
72+
:respect-chat-mode="false"
73+
@update:model="handleChatModelSelect"
74+
/>
6775
</PopoverContent>
6876
</Popover>
6977
</div>

src/renderer/src/components/ModelSelect.vue

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ const props = defineProps({
6666
type: Array as PropType<ModelType[]>,
6767
default: undefined
6868
},
69+
respectChatMode: {
70+
type: Boolean,
71+
default: true
72+
},
6973
excludeProviders: {
7074
type: Array as PropType<string[]>,
7175
default: () => []
@@ -92,11 +96,13 @@ const providers = computed(() => {
9296
return sortedProviders
9397
.filter((provider) => provider.enable && !props.excludeProviders.includes(provider.id))
9498
.map((provider) => {
95-
if (currentMode === 'acp agent' && provider.id !== 'acp') {
96-
return null
97-
}
98-
if (currentMode !== 'acp agent' && provider.id === 'acp') {
99-
return null
99+
if (props.respectChatMode) {
100+
if (currentMode === 'acp agent' && provider.id !== 'acp') {
101+
return null
102+
}
103+
if (currentMode !== 'acp agent' && provider.id === 'acp') {
104+
return null
105+
}
100106
}
101107
102108
const enabledProvider = enabledModels.find((item) => item.providerId === provider.id)

test/renderer/components/ModelSelect.test.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,20 @@ import { mount } from '@vue/test-utils'
33
import { ref } from 'vue'
44
import { ModelType } from '../../../src/shared/model'
55

6-
const setup = async () => {
6+
const setup = async (
7+
options: {
8+
currentMode?: 'agent' | 'acp agent'
9+
props?: Record<string, unknown>
10+
} = {}
11+
) => {
712
vi.resetModules()
813

14+
const currentMode = options.currentMode ?? 'agent'
15+
916
vi.doMock('@/stores/providerStore', () => ({
1017
useProviderStore: () => ({
1118
sortedProviders: [
19+
{ id: 'acp', name: 'ACP', enable: true },
1220
{ id: 'ollama', name: 'Ollama', enable: true },
1321
{ id: 'openai', name: 'OpenAI', enable: true }
1422
]
@@ -24,6 +32,10 @@ const setup = async () => {
2432
{ id: 'deepseek-r1:1.5b', name: 'deepseek-r1:1.5b', type: 'chat' },
2533
{ id: 'nomic-embed-text:latest', name: 'nomic-embed-text:latest', type: 'embedding' }
2634
]
35+
},
36+
{
37+
providerId: 'acp',
38+
models: [{ id: 'acp-agent', name: 'ACP Agent', type: 'chat' }]
2739
}
2840
]
2941
})
@@ -43,7 +55,7 @@ const setup = async () => {
4355

4456
vi.doMock('@/components/chat-input/composables/useChatMode', () => ({
4557
useChatMode: () => ({
46-
currentMode: ref('agent')
58+
currentMode: ref(currentMode)
4759
})
4860
}))
4961

@@ -74,7 +86,8 @@ const setup = async () => {
7486

7587
return mount(ModelSelect, {
7688
props: {
77-
type: [ModelType.Chat]
89+
type: [ModelType.Chat],
90+
...options.props
7891
}
7992
})
8093
}
@@ -93,4 +106,17 @@ describe('ModelSelect', () => {
93106
[{ id: 'deepseek-r1:1.5b', name: 'deepseek-r1:1.5b', type: 'chat' }, 'ollama']
94107
])
95108
})
109+
110+
it('can ignore chat mode filtering for settings pickers', async () => {
111+
const wrapper = await setup({
112+
currentMode: 'acp agent',
113+
props: {
114+
excludeProviders: ['acp'],
115+
respectChatMode: false
116+
}
117+
})
118+
119+
expect(wrapper.text()).toContain('deepseek-r1:1.5b')
120+
expect(wrapper.text()).not.toContain('ACP Agent')
121+
})
96122
})

test/renderer/components/SettingsApp.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe('Settings App', () => {
1717
const ipcRemoveListener = vi.fn()
1818
const ipcRemoveAllListeners = vi.fn()
1919
const ipcSend = vi.fn()
20+
const initializeModelStore = vi.fn().mockResolvedValue(undefined)
2021

2122
;(window as any).electron = {
2223
ipcRenderer: {
@@ -119,7 +120,7 @@ describe('Settings App', () => {
119120
}))
120121
vi.doMock('../../../src/renderer/src/stores/modelStore', () => ({
121122
useModelStore: () => ({
122-
initialize: vi.fn().mockResolvedValue(undefined),
123+
initialize: initializeModelStore,
123124
ensureProviderModelsReady: vi.fn().mockResolvedValue(undefined)
124125
})
125126
}))
@@ -207,6 +208,7 @@ describe('Settings App', () => {
207208
await flushPromises()
208209

209210
expect(isReady).toHaveBeenCalledTimes(1)
211+
expect(initializeModelStore).toHaveBeenCalledTimes(1)
210212
expect(ipcSend).toHaveBeenCalledWith(SETTINGS_EVENTS.READY)
211213
}, 15000)
212214

0 commit comments

Comments
 (0)