|
|
@@ -1,9 +1,12 @@
|
|
|
-import type { ProviderConfigs, ProviderOverride } from "@/stores/wiki-store"
|
|
|
+import type { ProviderConfigs, ProviderOverride, SavedModel } from "@/stores/wiki-store"
|
|
|
|
|
|
function isProviderAvailable(providerId: string, config: ProviderOverride): boolean {
|
|
|
- return providerId.startsWith("custom-")
|
|
|
- ? config.enabled !== false
|
|
|
- : config.enabled === true
|
|
|
+ if (providerId.startsWith("custom-")) {
|
|
|
+ return config.enabled !== false
|
|
|
+ }
|
|
|
+ // 内置预设:已启用,或有有效配置(apiKey + model/savedModels)
|
|
|
+ return config.enabled === true
|
|
|
+ || Boolean((config.apiKey || config.savedModels?.length) && (config.model || config.savedModels?.length))
|
|
|
}
|
|
|
|
|
|
function getAvailableProviderEntries(
|
|
|
@@ -18,14 +21,34 @@ function getAvailableProviderEntries(
|
|
|
]
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 获取 provider 的有效模型列表。
|
|
|
+ * 优先使用 savedModels;为空时回退到 model 字段(兼容旧数据/未拉取模型的场景)。
|
|
|
+ */
|
|
|
+export function getEffectiveSavedModels(config: ProviderOverride): SavedModel[] {
|
|
|
+ if (config.savedModels && config.savedModels.length > 0) {
|
|
|
+ return config.savedModels
|
|
|
+ }
|
|
|
+ const model = config.model?.trim()
|
|
|
+ if (model) {
|
|
|
+ return [{
|
|
|
+ id: `fallback-${model}`,
|
|
|
+ name: model,
|
|
|
+ model,
|
|
|
+ createdAt: 0,
|
|
|
+ }]
|
|
|
+ }
|
|
|
+ return []
|
|
|
+}
|
|
|
+
|
|
|
export function hasAvailableModels(providerConfigs: ProviderConfigs): boolean {
|
|
|
return getAvailableProviderEntries(providerConfigs)
|
|
|
- .some(([, config]) => (config.savedModels?.length ?? 0) > 0)
|
|
|
+ .some(([, config]) => getEffectiveSavedModels(config).length > 0)
|
|
|
}
|
|
|
|
|
|
export function getFirstAvailableModelKey(providerConfigs: ProviderConfigs): string {
|
|
|
for (const [providerId, config] of getAvailableProviderEntries(providerConfigs)) {
|
|
|
- const first = config.savedModels?.[0]
|
|
|
+ const first = getEffectiveSavedModels(config)[0]
|
|
|
if (first) return `${providerId}/${first.model}`
|
|
|
}
|
|
|
return ""
|
|
|
@@ -48,7 +71,7 @@ export function getStableAvailableModelKey(
|
|
|
const config = providerConfigs[providerId]
|
|
|
if (
|
|
|
isProviderAvailable(providerId, config)
|
|
|
- && config.savedModels?.some((model) => model.model === modelId)
|
|
|
+ && getEffectiveSavedModels(config).some((model) => model.model === modelId)
|
|
|
) {
|
|
|
return `${providerId}/${modelId}`
|
|
|
}
|
|
|
@@ -57,7 +80,7 @@ export function getStableAvailableModelKey(
|
|
|
|
|
|
for (const [providerId, config] of getAvailableProviderEntries(providerConfigs)) {
|
|
|
if (providerId === exactProviderId) continue
|
|
|
- if (config.savedModels?.some((model) => model.model === trimmed)) {
|
|
|
+ if (getEffectiveSavedModels(config).some((model) => model.model === trimmed)) {
|
|
|
return `${providerId}/${trimmed}`
|
|
|
}
|
|
|
}
|