Skip to content

Commit 34802fe

Browse files
committed
feat(image-workspace): 实现文本模型选择器自动刷新功能
- 添加文本模型下拉获得焦点时的自动刷新逻辑- 新增 refreshTextModels 方法用于刷新文本模型选项 - 在模型管理器关闭后同步刷新文本模型 -为文本模型选择组件添加 focus事件处理 - 注册和移除 image-workspace-refresh-text-models 全局事件监听器 - 更新文本模型选项时校验当前选择并设置回退选项- 确保模型管理器初始化后再获取启用的模型列表
1 parent 00c3ec9 commit 34802fe

File tree

4 files changed

+68
-11
lines changed

4 files changed

+68
-11
lines changed

packages/extension/src/App.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,7 @@ import type { ModelSelectOption, TemplateSelectOption } from '@prompt-optimizer/
11161116
await refreshTextModels()
11171117
// 图像模式:广播刷新图像模型事件(ImageWorkspace 监听并执行刷新)
11181118
if (typeof window !== 'undefined') {
1119+
window.dispatchEvent(new Event('image-workspace-refresh-text-models'))
11191120
window.dispatchEvent(new Event('image-workspace-refresh-image-models'))
11201121
}
11211122
}

packages/ui/src/components/image-mode/ImageWorkspace.vue

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@
146146
filterable
147147
:show-config-action="true"
148148
:show-empty-config-c-t-a="true"
149+
@focus="handleTextModelSelectFocus"
149150
@update:modelValue="saveSelections"
150151
@config="() => appOpenModelManager && appOpenModelManager('text')"
151152
/>
@@ -161,6 +162,7 @@
161162
size="medium"
162163
:disabled="isOptimizing"
163164
filterable
165+
@focus="handleTextModelSelectFocus"
164166
@update:modelValue="saveSelections"
165167
/>
166168
</template>
@@ -659,6 +661,7 @@ const {
659661
downloadImageFromResult,
660662
saveSelections,
661663
cleanup,
664+
refreshTextModels,
662665
refreshImageModels,
663666
restoreTemplateSelection
664667
} = useImageWorkspace(services)
@@ -786,6 +789,15 @@ const refreshIterateHandler = () => {
786789
promptPanelRef.value?.refreshIterateTemplateSelect?.()
787790
}
788791
792+
// 文本模型刷新事件处理器(模型管理器关闭后同步刷新)
793+
const refreshTextModelsHandler = async () => {
794+
try {
795+
await refreshTextModels()
796+
} catch (e) {
797+
console.warn('[ImageWorkspace] Failed to refresh text models after manager close:', e)
798+
}
799+
}
800+
789801
// 图像模型刷新事件处理器(模型管理器关闭后同步刷新)
790802
const refreshImageModelsHandler = async () => {
791803
try {
@@ -811,6 +823,11 @@ const handleTemplateSelectFocus = async () => {
811823
await refreshTemplatesHandler()
812824
}
813825
826+
// 文本模型下拉获得焦点时刷新,确保新建/编辑后的模型立即可用
827+
const handleTextModelSelectFocus = async () => {
828+
await refreshTextModelsHandler()
829+
}
830+
814831
onMounted(async () => {
815832
console.log('[ImageWorkspace] Starting initialization...')
816833
console.log('[ImageWorkspace] Services available:', !!services?.value)
@@ -824,6 +841,7 @@ onMounted(async () => {
824841
// 监听模板语言切换事件,刷新迭代模板选择
825842
if (typeof window !== 'undefined') {
826843
window.addEventListener('image-workspace-refresh-iterate-select', refreshIterateHandler)
844+
window.addEventListener('image-workspace-refresh-text-models', refreshTextModelsHandler)
827845
window.addEventListener('image-workspace-refresh-image-models', refreshImageModelsHandler)
828846
window.addEventListener('image-workspace-refresh-templates', refreshTemplatesHandler)
829847
}
@@ -838,6 +856,7 @@ onUnmounted(() => {
838856
cleanup()
839857
if (typeof window !== 'undefined') {
840858
window.removeEventListener('image-workspace-refresh-iterate-select', refreshIterateHandler)
859+
window.removeEventListener('image-workspace-refresh-text-models', refreshTextModelsHandler)
841860
window.removeEventListener('image-workspace-refresh-image-models', refreshImageModelsHandler)
842861
window.removeEventListener('image-workspace-refresh-templates', refreshTemplatesHandler)
843862
}

packages/ui/src/composables/useImageWorkspace.ts

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -146,20 +146,55 @@ export function useImageWorkspace(services: Ref<AppServices | null>) {
146146
return `data:${mimeType};base64,${state.inputImageB64}`
147147
})
148148

149+
// 刷新文本模型及下拉选项,并校验当前选择
150+
const refreshTextModels = async () => {
151+
if (!modelManager.value) {
152+
textModelOptions.value = []
153+
state.selectedTextModelKey = ''
154+
return
155+
}
156+
157+
try {
158+
const manager = modelManager.value
159+
if (typeof (manager as any).ensureInitialized === 'function') {
160+
await (manager as any).ensureInitialized()
161+
}
162+
163+
const textModels = await manager.getEnabledModels()
164+
textModelOptions.value = textModels.map(m => ({
165+
label: `${m.name} (${m.provider})`,
166+
primary: m.name,
167+
secondary: m.provider ?? 'Unknown',
168+
value: m.key,
169+
raw: m
170+
}))
171+
172+
const currentKey = state.selectedTextModelKey
173+
const keys = new Set(textModels.map(m => m.key))
174+
const fallback = textModels[0]?.key || ''
175+
176+
const needsFallback = (!currentKey && fallback) || (currentKey && !keys.has(currentKey))
177+
178+
if (needsFallback) {
179+
state.selectedTextModelKey = fallback
180+
if (fallback) {
181+
await setPreference(IMAGE_MODE_KEYS.SELECTED_TEXT_MODEL, fallback)
182+
}
183+
}
184+
185+
if (!textModels.length) {
186+
state.selectedTextModelKey = ''
187+
}
188+
} catch (error) {
189+
console.error('[useImageWorkspace] Failed to refresh text models:', error)
190+
textModelOptions.value = []
191+
}
192+
}
193+
149194
// 初始化
150195
const initialize = async () => {
151196
try {
152-
// 加载文本模型
153-
if (modelManager.value) {
154-
const textModels = await modelManager.value.getEnabledModels()
155-
textModelOptions.value = textModels.map(m => ({
156-
label: `${m.name} (${m.provider})`,
157-
primary: m.name,
158-
secondary: m.provider ?? 'Unknown',
159-
value: m.key,
160-
raw: m
161-
}))
162-
}
197+
await refreshTextModels()
163198

164199
// 加载图像模型
165200
await loadImageModels()
@@ -865,6 +900,7 @@ export function useImageWorkspace(services: Ref<AppServices | null>) {
865900
copyImageFromResult,
866901
saveSelections,
867902
cleanup,
903+
refreshTextModels,
868904
refreshImageModels,
869905
templateManagerState
870906
}

packages/web/src/App.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,7 @@ import type { ModelSelectOption, TemplateSelectOption } from '@prompt-optimizer/
11161116
await refreshTextModels()
11171117
// 图像模式:广播刷新图像模型事件(ImageWorkspace 监听并执行刷新)
11181118
if (typeof window !== 'undefined') {
1119+
window.dispatchEvent(new Event('image-workspace-refresh-text-models'))
11191120
window.dispatchEvent(new Event('image-workspace-refresh-image-models'))
11201121
}
11211122
}

0 commit comments

Comments
 (0)