Skip to content

Commit 7174593

Browse files
authored
feat: sync provider sorting from settings to model selection (#736)
* feat: sync provider sorting from settings to model selection * feat: refactor ModelSelect to use computed providers for better reactivity
1 parent bce1fec commit 7174593

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

src/renderer/src/components/ModelSelect.vue

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
</template>
3939
<script setup lang="ts">
4040
import { useI18n } from 'vue-i18n'
41-
import { ref, computed, onMounted, PropType } from 'vue'
41+
import { ref, computed, PropType } from 'vue'
4242
import Input from './ui/input/Input.vue'
4343
// import Badge from './ui/badge/Badge.vue'
4444
import { useChatStore } from '@/stores/chat'
@@ -54,8 +54,6 @@ const chatStore = useChatStore()
5454
const settingsStore = useSettingsStore()
5555
const themeStore = useThemeStore()
5656
const langStore = useLanguageStore()
57-
const providers = ref<{ id: string; name: string; models: RENDERER_MODEL_META[] }[]>([])
58-
5957
const emit = defineEmits<{
6058
(e: 'update:model', model: RENDERER_MODEL_META, providerId: string): void
6159
}>()
@@ -66,6 +64,35 @@ const props = defineProps({
6664
default: undefined // ← explicit for clarity
6765
}
6866
})
67+
const providers = computed(() => {
68+
const sortedProviders = settingsStore.sortedProviders
69+
const enabledModels = settingsStore.enabledModels
70+
const orderedProviders = sortedProviders
71+
.filter((provider) => provider.enable)
72+
.map((provider) => {
73+
const enabledProvider = enabledModels.find((ep) => ep.providerId === provider.id)
74+
if (!enabledProvider || enabledProvider.models.length === 0) {
75+
return null
76+
}
77+
78+
return {
79+
id: provider.id,
80+
name: provider.name,
81+
models:
82+
!props.type || props.type.length === 0
83+
? enabledProvider.models
84+
: enabledProvider.models.filter(
85+
(model) => model.type !== undefined && props.type!.includes(model.type as ModelType)
86+
)
87+
}
88+
})
89+
.filter(
90+
(provider): provider is { id: string; name: string; models: RENDERER_MODEL_META[] } =>
91+
provider !== null && provider.models.length > 0
92+
)
93+
94+
return orderedProviders
95+
})
6996
7097
const filteredProviders = computed(() => {
7198
if (!keyword.value) return providers.value.filter((provider) => provider.models.length > 0)
@@ -99,25 +126,4 @@ const handleModelSelect = async (providerId: string, model: RENDERER_MODEL_META)
99126
// if (model.description) tags.push(model.description)
100127
// return tags
101128
// }
102-
103-
onMounted(async () => {
104-
try {
105-
const enabledModels = settingsStore.enabledModels
106-
providers.value = enabledModels.map(({ providerId, models }) => {
107-
const provider = settingsStore.providers.find((p) => p.id === providerId)
108-
return {
109-
id: providerId,
110-
name: provider?.name || providerId,
111-
models:
112-
!props.type || props.type.length === 0
113-
? models
114-
: models.filter(
115-
(model) => model.type !== undefined && props.type!.includes(model.type as ModelType)
116-
)
117-
}
118-
})
119-
} catch (error) {
120-
console.error(t('model.error.loadFailed'), error)
121-
}
122-
})
123129
</script>

0 commit comments

Comments
 (0)