|
1 | | -import { computed, type ComputedRef, readonly, ref } from 'vue' |
| 1 | +import { computed, type ComputedRef, readonly, ref, watch } from 'vue' |
2 | 2 | import { defineStore } from 'pinia' |
3 | 3 | import { useQueryCache, type DataState, type EntryKey, type UseQueryEntry } from '@pinia/colada' |
4 | 4 | import { useThrottleFn } from '@vueuse/core' |
@@ -55,6 +55,15 @@ export const useModelStore = defineStore('model', () => { |
55 | 55 | const pendingRefreshStarts = new Set<string>() |
56 | 56 | const pendingModelStatusEchoes = new Map<string, boolean>() |
57 | 57 | const providerModelsReadyAt = new Map<string, number>() |
| 58 | + const activeProviderIds = computed( |
| 59 | + () => |
| 60 | + new Set( |
| 61 | + providerStore.providers.filter((provider) => provider.enable).map((provider) => provider.id) |
| 62 | + ) |
| 63 | + ) |
| 64 | + const activeEnabledModels = computed(() => |
| 65 | + enabledModels.value.filter((group) => activeProviderIds.value.has(group.providerId)) |
| 66 | + ) |
58 | 67 |
|
59 | 68 | const MODEL_TOGGLE_PERF_LOG_PREFIX = '[ModelTogglePerf]' |
60 | 69 | const getPerfNow = () => (typeof performance !== 'undefined' ? performance.now() : Date.now()) |
@@ -109,6 +118,43 @@ export const useModelStore = defineStore('model', () => { |
109 | 118 | ).filter((providerId): providerId is string => Boolean(providerId)) |
110 | 119 | } |
111 | 120 |
|
| 121 | + const removeProviderGroups = ( |
| 122 | + groups: { providerId: string; models: RENDERER_MODEL_META[] }[], |
| 123 | + providerId: string |
| 124 | + ) => { |
| 125 | + return groups.filter((group) => group.providerId !== providerId) |
| 126 | + } |
| 127 | + |
| 128 | + const purgeRemovedProviderState = (providerId: string) => { |
| 129 | + allProviderModels.value = removeProviderGroups(allProviderModels.value, providerId) |
| 130 | + customModels.value = removeProviderGroups(customModels.value, providerId) |
| 131 | + enabledModels.value = removeProviderGroups(enabledModels.value, providerId) |
| 132 | + providerModelQueries.delete(providerId) |
| 133 | + customModelQueries.delete(providerId) |
| 134 | + enabledModelQueries.delete(providerId) |
| 135 | + pendingRefreshStarts.delete(providerId) |
| 136 | + rerunRequested.delete(providerId) |
| 137 | + clearProviderModelsReady(providerId) |
| 138 | + |
| 139 | + for (const statusKey of Array.from(pendingModelStatusEchoes.keys())) { |
| 140 | + if (statusKey.startsWith(`${providerId}:`)) { |
| 141 | + pendingModelStatusEchoes.delete(statusKey) |
| 142 | + } |
| 143 | + } |
| 144 | + } |
| 145 | + |
| 146 | + watch( |
| 147 | + () => providerStore.providers.map((provider) => provider.id), |
| 148 | + (providerIds) => { |
| 149 | + const providerIdSet = new Set(providerIds) |
| 150 | + for (const materializedProviderId of getMaterializedProviderIds()) { |
| 151 | + if (!providerIdSet.has(materializedProviderId)) { |
| 152 | + purgeRemovedProviderState(materializedProviderId) |
| 153 | + } |
| 154 | + } |
| 155 | + } |
| 156 | + ) |
| 157 | + |
112 | 158 | const refreshMaterializedProviders = async () => { |
113 | 159 | const providerIds = getMaterializedProviderIds() |
114 | 160 | for (const providerId of providerIds) { |
@@ -775,7 +821,7 @@ export const useModelStore = defineStore('model', () => { |
775 | 821 |
|
776 | 822 | const searchModels = (query: string) => { |
777 | 823 | const normalized = query.toLowerCase() |
778 | | - return enabledModels.value |
| 824 | + return activeEnabledModels.value |
779 | 825 | .map((group) => ({ |
780 | 826 | providerId: group.providerId, |
781 | 827 | models: group.models.filter( |
@@ -1233,6 +1279,7 @@ export const useModelStore = defineStore('model', () => { |
1233 | 1279 |
|
1234 | 1280 | return { |
1235 | 1281 | enabledModels, |
| 1282 | + activeEnabledModels, |
1236 | 1283 | allProviderModels, |
1237 | 1284 | customModels, |
1238 | 1285 | initialized: readonly(initialized), |
|
0 commit comments