Skip to content

Commit e797dbe

Browse files
committed
fix(usage): treat client-requested priority as fast intent
codex CLI 0.129+ subscription clients send service_tier="priority" directly to express the fast lane. Previously resolveServiceTier only normalized when actualTier=="priority"; if upstream downgraded to default (quota exhausted), the request was logged as default and lost the fast classification. Mirror sanitizeServiceTierForUpstream's fast<->priority equivalence on the inbound side: any client-requested priority is now locked to fast, so the Fast filter and badge stay accurate even when upstream downgrades.
1 parent dcc72a9 commit e797dbe

2 files changed

Lines changed: 16 additions & 3 deletions

File tree

proxy/translator.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,11 +1106,16 @@ func sanitizeServiceTierForUpstream(body []byte) []byte {
11061106
// resolveServiceTier 从实际 tier 和请求 tier 中选择最终值。
11071107
// 入库时把 "priority" 归一化为 "fast":两者在 OpenAI Responses API 是同义词
11081108
// (codex2api 把 fast → priority 后透传上游),codex2api 的 UI/筛选/徽章统一以
1109-
// "fast" 为规范名。这样 sub2api 等中间层透传 service_tier="priority" 时,仍能
1110-
// 在管理台正确显示 Fast 徽章和参与 fast 维度的统计/筛选。
1109+
// "fast" 为规范名。
1110+
//
1111+
// 两个真实场景都需要识别为 fast:
1112+
// 1. 客户端发 fast(codex2api 自己的 UI/SDK),上游透传后回 priority/降级 default;
1113+
// 2. codex CLI 0.129+ 等订阅客户端直接发 service_tier="priority",上游降级时回 default。
1114+
//
1115+
// 因此只要客户端**意图**是 fast/priority,就锁定为 fast,不被上游降级值掩盖。
11111116
func resolveServiceTier(actualTier, requestedTier string) string {
11121117
requestedTier = strings.TrimSpace(requestedTier)
1113-
if requestedTier == "fast" {
1118+
if requestedTier == "fast" || requestedTier == "priority" {
11141119
return "fast"
11151120
}
11161121
actualTier = strings.TrimSpace(actualTier)

proxy/translator_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,18 @@ func TestResolveServiceTier(t *testing.T) {
4242
if got := resolveServiceTier("priority", "default"); got != "fast" {
4343
t.Fatalf("expected actual priority to normalize to fast, got %q", got)
4444
}
45+
// codex CLI 0.129+ 直接发 service_tier="priority";上游配额耗尽降级到 default 时,
46+
// 也要锁定为 fast,避免 fast 用户的日志被错误归类成 default。
47+
if got := resolveServiceTier("default", "priority"); got != "fast" {
48+
t.Fatalf("expected requested priority + downgraded default to be fast, got %q", got)
49+
}
4550
// flex / default 等其它 tier 保持原值
4651
if got := resolveServiceTier("flex", ""); got != "flex" {
4752
t.Fatalf("expected flex tier to be preserved, got %q", got)
4853
}
54+
if got := resolveServiceTier("default", ""); got != "default" {
55+
t.Fatalf("expected default tier with no requested intent to stay default, got %q", got)
56+
}
4957
}
5058

5159
func TestSanitizeServiceTierForUpstream_FastToPriority(t *testing.T) {

0 commit comments

Comments
 (0)