Skip to content

Commit d9de404

Browse files
committed
feat(usage): treat priority as fast alias and re-enable Fast filter
When upstream gateways (e.g. sub2api) normalize a client's `service_tier:"fast"` into the canonical `priority`, codex2api was storing `priority` verbatim, which hid the Fast badge and broke the Fast-only filter. Normalize at write time and fall back to recognizing both values for legacy rows; flip the Usage page Fast filter back on now that it has data to act on.
1 parent c7a751f commit d9de404

4 files changed

Lines changed: 33 additions & 9 deletions

File tree

database/postgres.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,10 +1918,12 @@ func (db *DB) ListUsageLogsByTimeRangePaged(ctx context.Context, f UsageLogFilte
19181918
paramIdx++
19191919
}
19201920
if f.FastOnly != nil {
1921+
// priority 是 fast 的同义词;新数据已在 resolveServiceTier 处归一化为 fast,
1922+
// 这里同时识别 priority 以兼容历史日志(issue #119 之前的 priority 透传记录)。
19211923
if *f.FastOnly {
1922-
where += ` AND COALESCE(u.service_tier, '') = 'fast'`
1924+
where += ` AND COALESCE(u.service_tier, '') IN ('fast', 'priority')`
19231925
} else {
1924-
where += ` AND COALESCE(u.service_tier, '') <> 'fast'`
1926+
where += ` AND COALESCE(u.service_tier, '') NOT IN ('fast', 'priority')`
19251927
}
19261928
}
19271929
if f.StreamOnly != nil {

frontend/src/pages/Usage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ export default function Usage() {
293293
const [apiKeys, setAPIKeys] = useState<APIKeyRow[]>([])
294294
const [modelOptions, setModelOptions] = useState<string[]>([])
295295
const [apiKeyLoadFailed, setAPIKeyLoadFailed] = useState(false)
296-
const showFastFilter = false
296+
const showFastFilter = true
297297
const pageSizeOptions = [10, 20, 50, 100]
298298
const searchTimer = useRef<ReturnType<typeof setTimeout>>(null)
299299

@@ -760,7 +760,7 @@ export default function Usage() {
760760
{isImageUsageLog(log) && (
761761
<ImageUsageBadge log={log} />
762762
)}
763-
{log.service_tier === 'fast' && (
763+
{(log.service_tier === 'fast' || log.service_tier === 'priority') && (
764764
<Badge
765765
variant="outline"
766766
className="text-[11px] font-semibold gap-0.5 border-transparent bg-blue-500/12 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400"

proxy/translator.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,17 +1103,25 @@ func sanitizeServiceTierForUpstream(body []byte) []byte {
11031103
}
11041104
}
11051105

1106-
// resolveServiceTier 从实际 tier 和请求 tier 中选择最终值
1106+
// resolveServiceTier 从实际 tier 和请求 tier 中选择最终值。
1107+
// 入库时把 "priority" 归一化为 "fast":两者在 OpenAI Responses API 是同义词
1108+
// (codex2api 把 fast → priority 后透传上游),codex2api 的 UI/筛选/徽章统一以
1109+
// "fast" 为规范名。这样 sub2api 等中间层透传 service_tier="priority" 时,仍能
1110+
// 在管理台正确显示 Fast 徽章和参与 fast 维度的统计/筛选。
11071111
func resolveServiceTier(actualTier, requestedTier string) string {
11081112
requestedTier = strings.TrimSpace(requestedTier)
11091113
if requestedTier == "fast" {
1110-
return requestedTier
1114+
return "fast"
11111115
}
11121116
actualTier = strings.TrimSpace(actualTier)
1113-
if actualTier != "" {
1114-
return actualTier
1117+
final := actualTier
1118+
if final == "" {
1119+
final = requestedTier
11151120
}
1116-
return requestedTier
1121+
if final == "priority" {
1122+
return "fast"
1123+
}
1124+
return final
11171125
}
11181126

11191127
// 上游不支持的 JSON Schema 验证约束关键字

proxy/translator_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@ func TestResolveServiceTier(t *testing.T) {
3232
if got := resolveServiceTier("default", "fast"); got != "fast" {
3333
t.Fatalf("expected requested fast to win for logging, got %q", got)
3434
}
35+
// priority 是 fast 的同义词,入库归一化为 fast,便于 UI 徽章/筛选统一识别
36+
if got := resolveServiceTier("priority", ""); got != "fast" {
37+
t.Fatalf("expected priority to normalize to fast, got %q", got)
38+
}
39+
if got := resolveServiceTier("", "priority"); got != "fast" {
40+
t.Fatalf("expected requested priority to normalize to fast, got %q", got)
41+
}
42+
if got := resolveServiceTier("priority", "default"); got != "fast" {
43+
t.Fatalf("expected actual priority to normalize to fast, got %q", got)
44+
}
45+
// flex / default 等其它 tier 保持原值
46+
if got := resolveServiceTier("flex", ""); got != "flex" {
47+
t.Fatalf("expected flex tier to be preserved, got %q", got)
48+
}
3549
}
3650

3751
func TestSanitizeServiceTierForUpstream_FastToPriority(t *testing.T) {

0 commit comments

Comments
 (0)