From: Anderson A. Giacomolli Date: Fri, 6 Nov 2026 18:33:04 +0000 (-0300) Subject: Leave the turn state out of the usage records X-Git-Url: http://git.giacomolli.uk/onechat/commitdiff_plain/6f7eda727e519ae43d7d35195cbe412a2725abd7 Leave the turn state out of the usage records The ChatGPT backend sends x-codex-turn-state on each response: an opaque state of the backend of about 1 KB, not quota. The usage records keep every other x-codex-* header, so each line holds the plan and the windows without the noise. Issue: b14d537 --- diff --git a/responses.go b/responses.go index ebffaa3..cdc1558 100644 --- a/responses.go +++ b/responses.go @@ -27,6 +27,10 @@ const ( // backend, in canonical form. quotaPrefix = "X-Codex-" + // turnStateHeader is an x-codex-* header that holds an opaque state of + // the backend, not quota. + turnStateHeader = "X-Codex-Turn-State" + // errorBytes is the most bytes of an error response that go into the // error. errorBytes = 4096 @@ -262,7 +266,8 @@ type usageLog struct { } // usageRecord is one line of usage.jsonl. Status is the HTTP status, or 0 when -// no response came. Quota holds the x-codex-* headers of the response. +// no response came. Quota holds the x-codex-* headers of the response, without +// the turn state. type usageRecord struct { Date string `json:"date"` Model string `json:"model"` @@ -331,11 +336,12 @@ func userMessage(texts ...string) any { } } -// quotaHeaders returns the x-codex-* headers, with lowercase names. +// quotaHeaders returns the x-codex-* headers, with lowercase names, without the +// turn state. func quotaHeaders(header http.Header) map[string]string { var quota map[string]string for name, values := range header { - if !strings.HasPrefix(name, quotaPrefix) || len(values) == 0 { + if !strings.HasPrefix(name, quotaPrefix) || name == turnStateHeader || len(values) == 0 { continue } diff --git a/responses_test.go b/responses_test.go index c1a7b4d..577e611 100644 --- a/responses_test.go +++ b/responses_test.go @@ -102,6 +102,7 @@ func TestClientRecordsEachCall(t *testing.T) { w.Header().Set("X-Codex-Primary-Used-Percent", "12") w.Header().Set("X-Codex-Plan-Type", "plus") w.Header().Set("X-Other", "not quota") + w.Header().Set("X-Codex-Turn-State", "opaque state") if call.number == 1 { w.WriteHeader(http.StatusTooManyRequests) _, _ = io.WriteString(w, `{"detail": "slow down"}`)