2026-04-26 19:59:15 +08:00
|
|
|
|
import { reactive } from 'vue'
|
|
|
|
|
|
import { modelProviderApi } from '@/apis/system_api'
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 模型状态检查 composable,供 Chat/Embedding/Rerank 模型选择器共用。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function useModelStatus() {
|
|
|
|
|
|
const statusMap = reactive({})
|
|
|
|
|
|
|
|
|
|
|
|
const getStatusIcon = (key) => {
|
|
|
|
|
|
const status = statusMap[key]
|
|
|
|
|
|
if (!status) return '○'
|
|
|
|
|
|
if (status.status === 'available') return '✓'
|
|
|
|
|
|
if (status.status === 'unavailable') return '✗'
|
|
|
|
|
|
if (status.status === 'error') return '⚠'
|
|
|
|
|
|
return '○'
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const getStatusClass = (key) => {
|
|
|
|
|
|
return statusMap[key]?.status || ''
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const getStatusTooltip = (key) => {
|
|
|
|
|
|
const status = statusMap[key]
|
|
|
|
|
|
if (!status) return '状态未知'
|
2026-04-27 02:24:52 +08:00
|
|
|
|
const text =
|
|
|
|
|
|
{ available: '可用', unavailable: '不可用', error: '错误' }[status.status] || '未知'
|
2026-04-26 19:59:15 +08:00
|
|
|
|
return `${text}: ${status.message || '无详细信息'}`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const checkV2Status = async (spec) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const response = await modelProviderApi.getModelStatusBySpec(spec)
|
|
|
|
|
|
if (response.data) {
|
|
|
|
|
|
statusMap[spec] = response.data
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch {
|
|
|
|
|
|
statusMap[spec] = { spec, status: 'error', message: '检查失败' }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const checkV2Statuses = async (models) => {
|
|
|
|
|
|
for (const model of models || []) {
|
|
|
|
|
|
await checkV2Status(model.spec)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-27 02:24:52 +08:00
|
|
|
|
return {
|
|
|
|
|
|
statusMap,
|
|
|
|
|
|
getStatusIcon,
|
|
|
|
|
|
getStatusClass,
|
|
|
|
|
|
getStatusTooltip,
|
|
|
|
|
|
checkV2Status,
|
|
|
|
|
|
checkV2Statuses
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|