fix(providers): 修复 Key 表单状态同步与 streaming 候选状态码处理

前端:
- KeyAllowedModelsEditDialog 同时监听 open 和 apiKey 变化,避免切换 key 时状态未刷新
- KeyFormDialog 新增 api_formats 过滤与默认值逻辑,可用格式变化时自动同步表单
- ProviderDetailDrawer 合并 provider 和 endpoint 的 api_formats 传递给 Key 表单,
  数据刷新后同步 currentEndpoint 和 editingKey 引用

后端:
- mark_candidate_streaming 移除 status_code 参数,streaming 阶段不再提前写入状态码
- 简化 active_requests 中 streaming 请求的完成判断,不再依赖 status_code 条件
This commit is contained in:
fawney19
2026-03-07 17:11:19 +08:00
parent 239238fe47
commit a00e137ffc
6 changed files with 154 additions and 51 deletions
@@ -717,49 +717,44 @@ function parseAllowedModels(allowed: AllowedModels): string[] {
return [...allowed]
}
// 监听对话框打开
watch(() => props.open, async (open) => {
if (open && props.apiKey) {
loadingCancelled = false
async function initializeDialogState(apiKey: EndpointAPIKey) {
loadingCancelled = false
const parsed = parseAllowedModels(props.apiKey.allowed_models ?? null)
selectedModels.value = [...parsed]
initialSelectedModels.value = [...parsed]
const parsed = parseAllowedModels(apiKey.allowed_models ?? null)
selectedModels.value = [...parsed]
initialSelectedModels.value = [...parsed]
// 加载锁定的模型
const locked = props.apiKey.locked_models ?? []
lockedModels.value = [...locked]
initialLockedModels.value = [...locked]
const locked = apiKey.locked_models ?? []
lockedModels.value = [...locked]
initialLockedModels.value = [...locked]
searchQuery.value = ''
upstreamModels.value = []
upstreamModelsLoaded.value = false
allCustomModels.value = []
searchQuery.value = ''
upstreamModels.value = []
upstreamModelsLoaded.value = false
allCustomModels.value = []
// 自动获取模式下展开上游模型,其他收缩;非自动获取模式下全部展开
if (props.apiKey.auto_fetch_models) {
collapsedGroups.value = new Set(['global', 'custom'])
} else {
collapsedGroups.value = new Set()
}
if (apiKey.auto_fetch_models) {
collapsedGroups.value = new Set(['global', 'custom'])
} else {
collapsedGroups.value = new Set()
}
// 加载该 Provider 已关联模型
await loadProviderModels()
await loadProviderModels()
// 自动获取模式下,获取上游模型用于显示(但选中状态使用已保存的 allowed_models)
if (props.apiKey.auto_fetch_models) {
await fetchUpstreamModels()
// 注意:不再将所有上游模型自动标记为选中
// 因为后端有过滤规则,实际保存的 allowed_models 是过滤后的结果
// selectedModels 已在上面从 props.apiKey.allowed_models 初始化
}
if (apiKey.auto_fetch_models) {
await fetchUpstreamModels()
}
// 提取自定义模型(不在提供商模型和上游模型中的)
const upstreamModelIdsSet = new Set(upstreamModels.value.map(m => m.id))
// 自定义模型是用户手动添加的、不在已知模型列表中的
allCustomModels.value = selectedModels.value.filter(m =>
!providerModelNamesSet.value.has(m) && !upstreamModelIdsSet.has(m)
)
const upstreamModelIdsSet = new Set(upstreamModels.value.map(m => m.id))
allCustomModels.value = selectedModels.value.filter(m =>
!providerModelNamesSet.value.has(m) && !upstreamModelIdsSet.has(m)
)
}
// 监听对话框打开 / 当前 key 变化
watch([() => props.open, () => props.apiKey], async ([open, apiKey]) => {
if (open && apiKey) {
await initializeDialogState(apiKey)
} else {
loadingCancelled = true
}