fix(webui): drop malformed token-usage day keys
normalize_token_usage_state only length-checked persisted day keys, so a hand-edited or foreign 10-char key (e.g. "not-a-dat3" or "2026-13-01") in token-usage.json survived reads and atomic rewrites. token_usage_payload then parsed every day key with an unguarded datetime.fromisoformat, so one such key failed every /api/settings and /api/settings/usage request until the file was repaired by hand. Validate day keys in normalize_token_usage_state, the shared boundary that every read, record, and rewrite already funnels through. Malformed keys are dropped like other malformed rows and scrubbed from the file on the next write; valid state is unchanged.
This commit is contained in:
@@ -159,6 +159,13 @@ def normalize_token_usage_state(raw: Any) -> dict[str, Any]:
|
||||
if not isinstance(date, str) or len(date) != 10 or not isinstance(row_value, dict):
|
||||
continue
|
||||
row = cast(dict[str, Any], row_value)
|
||||
try:
|
||||
datetime.fromisoformat(date)
|
||||
except ValueError:
|
||||
# A hand-edited or foreign day key that is not a real date would
|
||||
# otherwise reach token_usage_payload's date parsing and fail every
|
||||
# settings request; drop it like any other malformed row.
|
||||
continue
|
||||
normalized = _normalize_usage_row(row)
|
||||
if normalized["total_tokens"] <= 0 and normalized["requests"] <= 0:
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user