Skip to content

Commit 582be20

Browse files
committed
fix: prefer Codex mode split totals for priority rows
1 parent c3d68f6 commit 582be20

3 files changed

Lines changed: 51 additions & 5 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Generated by Scripts/regenerate-codex-parser-hash.sh. Do not edit by hand.
22

33
enum CodexParserHash {
4-
static let value = "efead905bba540ae"
4+
static let value = "d2d731a6eb7ad436"
55
}

Sources/CodexBarCore/Vendored/CostUsage/CostUsageScanner+CacheHelpers.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,21 +1040,23 @@ extension CostUsageScanner {
10401040
} else {
10411041
nil
10421042
}
1043-
var cost = cachedBaseCost
1043+
var cost = splitTotalCost
1044+
?? cachedBaseCost
10441045
?? rowTotalCost
1045-
?? splitTotalCost
10461046
?? CostUsagePricing.codexCostUSD(
10471047
model: model,
10481048
inputTokens: input,
10491049
cachedInputTokens: cached,
10501050
outputTokens: output,
10511051
modelsDevCatalog: modelsDevCatalog,
10521052
modelsDevCacheRoot: modelsDevCacheRoot)
1053-
if let surchargeNanos = prioritySurchargeNanosByDayModel[day]?[model],
1053+
if splitTotalCost == nil,
1054+
let surchargeNanos = prioritySurchargeNanosByDayModel[day]?[model],
10541055
cachedBaseCost != nil
10551056
{
10561057
cost = (cost ?? 0) + (Double(surchargeNanos) / Self.costScale)
1057-
} else if rowTotalCost == nil,
1058+
} else if splitTotalCost == nil,
1059+
rowTotalCost == nil,
10581060
!priorityTurns.isEmpty,
10591061
let rows,
10601062
let surcharge = self.codexPrioritySurchargeUSD(

Tests/CodexBarTests/CostUsageScannerPriorityTests.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,50 @@ struct CostUsageScannerPriorityTests {
331331
#expect(breakdown.priorityTokens == 110)
332332
}
333333

334+
@Test
335+
func `codex daily report totals use completed model priority cost`() throws {
336+
let env = try CostUsageTestEnvironment()
337+
defer { env.cleanup() }
338+
339+
let day = try env.makeLocalNoon(year: 2026, month: 5, day: 10)
340+
let iso0 = env.isoString(for: day)
341+
let iso1 = env.isoString(for: day.addingTimeInterval(1))
342+
let entries: [[String: Any]] = [
343+
["type": "turn_context", "timestamp": iso0, "payload": ["model": "gpt-5.4"]],
344+
["type": "event_msg", "timestamp": iso1, "payload": ["type": "task_started", "turn_id": "priority-turn"]],
345+
self.tokenCount(timestamp: iso1, input: 100, cached: 20, output: 10),
346+
]
347+
_ = try env.writeCodexSessionFile(day: day, filename: "session.jsonl", contents: env.jsonl(entries))
348+
349+
let dbURL = env.root.appendingPathComponent("logs_2.sqlite")
350+
try CostUsageScannerCodexPriorityTests.createTestLogsDatabase(at: dbURL)
351+
try self.insertPriorityTrace(dbURL: dbURL, timestamp: iso1, model: "gpt-5.4")
352+
try CostUsageScannerCodexPriorityTests.insertTestLog(
353+
dbURL: dbURL,
354+
timestamp: iso1,
355+
body: "thread_id=thread turn.id=priority-turn websocket event: "
356+
+ #"{"type":"response.completed","response":{"model":"gpt-5.5"}}"#)
357+
358+
var options = CostUsageScanner.Options(
359+
codexSessionsRoot: env.codexSessionsRoot,
360+
cacheRoot: env.cacheRoot,
361+
codexTraceDatabaseURL: dbURL)
362+
options.refreshMinIntervalSeconds = 0
363+
364+
let report = CostUsageScanner.loadDailyReport(
365+
provider: .codex,
366+
since: day,
367+
until: day,
368+
now: day,
369+
options: options)
370+
let priorityCost = (80.0 * 1.25e-5) + (20.0 * 1.25e-6) + (10.0 * 7.5e-5)
371+
372+
#expect(report.summary?.totalCostUSD == priorityCost)
373+
let breakdown = try #require(report.data.first?.modelBreakdowns?.first)
374+
#expect(breakdown.costUSD == priorityCost)
375+
#expect(breakdown.priorityCostUSD == priorityCost)
376+
}
377+
334378
@Test
335379
func `codex daily report reprices cached priority alias when completed model arrives`() throws {
336380
let env = try CostUsageTestEnvironment()

0 commit comments

Comments
 (0)