feat: provider api_formats 可空继承、OpenAI 图片 edit/variation 与用量配额多项补强

- 鉴权: provider_api_keys.api_formats 改为可空,OAuth 托管 key 自动继承 provider endpoints 激活格式,相关 handler/测试同步更新
- 图片 planner: OpenAI 图片路由新增 edit/variation 操作并完善参数校验、响应合并与流式处理
- 用量: user me usage 返回区分 client_requested_stream/upstream_is_stream,前端 usage 列表筛选与展示增强
- 统计: stats_daily_model 新增 cache_creation_ephemeral_5m/1h tokens 字段与回填链路
- 配额/observability: quota repository 新增内存与 SQL 扩展,admin observability usage 字段扩充
- 其它: OAuth 导入/轮询收敛、provider 汇总与 pool admin 读写链路小修、新增 system_config 缓存与 provider template handler

Closes #318

Co-authored-by: Entropy.Xu <[email protected]>
This commit is contained in:
fawney19
2026-04-23 14:42:51 +08:00
co-authored by Entropy.Xu
parent f55f22d2e8
commit fa328e18a1
128 changed files with 5583 additions and 690 deletions
@@ -1,6 +1,7 @@
import { describe, expect, it } from 'vitest'
import {
formatUsageStreamLabel,
hasUsageFallback,
isUsageRecordFailed,
isUsageRecordSuccessful,
@@ -98,6 +99,22 @@ describe('usage status helpers', () => {
expect(hasUsageFallback(buildUsageRecord({ has_fallback: undefined }))).toBe(false)
})
it('prefers symmetric stream aliases when present', () => {
expect(formatUsageStreamLabel(buildUsageRecord({
is_stream: true,
upstream_is_stream: true,
client_requested_stream: true,
client_is_stream: false,
}))).toBe('标准 -> 流式')
})
it('falls back to legacy stream fields when symmetric aliases are absent', () => {
expect(formatUsageStreamLabel(buildUsageRecord({
is_stream: true,
client_requested_stream: false,
}))).toBe('标准 -> 流式')
})
it('uses status code only as a last fallback for timeline status', () => {
expect(resolveTimelineFinalStatus({
statusCode: 200,
@@ -17,6 +17,52 @@ export function hasUsageFallback(
return record.has_fallback === true
}
export function resolveUsageStreamModes(
record: Pick<
UsageRecord,
'is_stream' | 'upstream_is_stream' | 'client_requested_stream' | 'client_is_stream'
>
): { clientRequestedStream: boolean, upstreamStream: boolean } {
const upstreamStream = typeof record.upstream_is_stream === 'boolean'
? record.upstream_is_stream
: record.is_stream
return {
clientRequestedStream: typeof record.client_is_stream === 'boolean'
? record.client_is_stream
: typeof record.client_requested_stream === 'boolean'
? record.client_requested_stream
: upstreamStream,
upstreamStream
}
}
export function isUsageUpstreamStream(
record: Pick<
UsageRecord,
'is_stream' | 'upstream_is_stream' | 'client_requested_stream' | 'client_is_stream'
>
): boolean {
return resolveUsageStreamModes(record).upstreamStream
}
export function formatUsageStreamLabel(
record: Pick<
UsageRecord,
'is_stream' | 'upstream_is_stream' | 'client_requested_stream' | 'client_is_stream'
>
): string {
const { clientRequestedStream, upstreamStream } = resolveUsageStreamModes(record)
const clientLabel = clientRequestedStream ? '流式' : '标准'
const upstreamLabel = upstreamStream ? '流式' : '标准'
if (clientRequestedStream === upstreamStream) {
return clientLabel
}
return `${clientLabel} -> ${upstreamLabel}`
}
function hasTerminalSuccessStatusCode(
record: Pick<UsageRecord, 'status_code'>
): boolean {