refactor: 前端全面替换 any 为 unknown 并统一错误处理,后端用量记录补写请求头/体

- 前端 API 层、stores、conversation 解析器、组件全面替换 any 为 unknown/具体类型
- 错误处理统一使用 parseApiError/getErrorStatus 替代 err.response?.data?.detail 模式
- 后端 handler/TaskService/UsageLifecycle/StreamTracker 链路传递 request_headers/request_body
- streaming/pending 状态更新时可补写客户端和提供商的请求头及请求体
- 新增 TaskService 和 UsageService 相关测试
This commit is contained in:
fawney19
2026-02-22 00:43:41 +08:00
parent 98e60e8f74
commit cf2eee222e
121 changed files with 1652 additions and 1179 deletions

View File

@@ -217,6 +217,7 @@ import {
type ProviderWithEndpointsSummary,
} from '@/api/endpoints'
import { adminApi } from '@/api/admin'
import { parseApiError } from '@/utils/errorParser'
const { error: showError, success: showSuccess } = useToast()
const { confirmDanger } = useConfirm()
@@ -303,8 +304,8 @@ async function saveDescription(_event: Event, provider: ProviderWithEndpointsSum
target.description = trimmed || undefined
}
cancelEditDescription()
} catch (err: any) {
showError(err.response?.data?.detail || '更新备注失败', '错误')
} catch (err: unknown) {
showError(parseApiError(err, '更新备注失败'), '错误')
}
}
@@ -353,8 +354,8 @@ async function loadProviders() {
providers.value = await getProvidersSummary()
// 异步加载配置了 ops 的 provider 的余额数据
loadBalances(providers.value)
} catch (err: any) {
showError(err.response?.data?.detail || '加载提供商列表失败', '错误')
} catch (err: unknown) {
showError(parseApiError(err, '加载提供商列表失败'), '错误')
} finally {
loading.value = false
}
@@ -434,8 +435,8 @@ async function handleDeleteProvider(provider: ProviderWithEndpointsSummary) {
await deleteProvider(provider.id)
showSuccess('提供商已删除')
loadProviders()
} catch (err: any) {
showError(err.response?.data?.detail || '删除提供商失败', '错误')
} catch (err: unknown) {
showError(parseApiError(err, '删除提供商失败'), '错误')
}
}
@@ -455,8 +456,8 @@ async function toggleProviderStatus(provider: ProviderWithEndpointsSummary) {
}
showSuccess(newStatus ? '提供商已启用' : '提供商已停用')
} catch (err: any) {
showError(err.response?.data?.detail || '操作失败', '错误')
} catch (err: unknown) {
showError(parseApiError(err, '操作失败'), '错误')
}
}