feat: 增强 provider query 端点选择逻辑,支持 openai:responses 格式与 key 级 api_formats 过滤

- provider_query_selected_fetch_endpoints 支持按 key.api_formats 过滤可用端点
- 端点选择增加 endpoint_supports_rust_models_fetch 检查
- 支持优先级列表之外的自定义 api_format 端点
- 新增 openai:responses 端点的 provider query 集成测试
- 各 crate 补充缺失的 tracing instrument 和小修正
- 前端 Pool 管理页面补充状态逻辑
This commit is contained in:
fawney19
2026-04-09 13:55:18 +08:00
parent b0b40c16ff
commit fe81eafe2c
24 changed files with 380 additions and 37 deletions

View File

@@ -3,6 +3,7 @@ import { beforeEach, describe, expect, it } from 'vitest'
import {
buildPoolManagementQueryPatch,
readPoolManagementViewState,
resolvePoolManagementPageAfterLoad,
writePoolManagementViewState,
} from '@/features/pool/utils/poolManagementState'
@@ -100,4 +101,24 @@ describe('poolManagementState', () => {
pageSize: undefined,
})
})
it('clamps a restored page to the last available page after load', () => {
expect(
resolvePoolManagementPageAfterLoad({
requestedPage: 5,
pageSize: 50,
total: 120,
}),
).toBe(3)
})
it('resets an out-of-range empty result page back to page 1', () => {
expect(
resolvePoolManagementPageAfterLoad({
requestedPage: 4,
pageSize: 50,
total: 0,
}),
).toBe(1)
})
})

View File

@@ -127,3 +127,23 @@ export function buildPoolManagementQueryPatch(
: String(normalized.pageSize),
}
}
export function resolvePoolManagementPageAfterLoad(input: {
requestedPage: number
pageSize: number
total: number
}): number {
const requestedPage = normalizePositiveInteger(
input.requestedPage,
DEFAULT_POOL_MANAGEMENT_VIEW_STATE.page,
)
const pageSize = normalizePositiveInteger(
input.pageSize,
DEFAULT_POOL_MANAGEMENT_VIEW_STATE.pageSize,
)
const total = Math.max(0, Number.parseInt(String(input.total ?? 0), 10) || 0)
const lastPage =
total > 0 ? Math.ceil(total / pageSize) : DEFAULT_POOL_MANAGEMENT_VIEW_STATE.page
return Math.min(requestedPage, lastPage)
}

View File

@@ -1201,6 +1201,7 @@ import {
import {
buildPoolManagementQueryPatch,
readPoolManagementViewState,
resolvePoolManagementPageAfterLoad,
type PoolManagementViewState,
writePoolManagementViewState,
} from '@/features/pool/utils/poolManagementState'
@@ -1790,6 +1791,15 @@ async function loadKeys() {
status,
})
if (requestId !== keysRequestId || selectedProviderId.value !== providerId) return
const resolvedPage = resolvePoolManagementPageAfterLoad({
requestedPage: page,
pageSize: pageSizeValue,
total: nextPage.total,
})
if (resolvedPage !== page) {
currentPage.value = resolvedPage
return
}
keyPage.value = nextPage
} catch (err) {
if (requestId !== keysRequestId || selectedProviderId.value !== providerId) return