From a62d7ac87a4ea6d881448945106ffff0959a2958 Mon Sep 17 00:00:00 2001 From: Joshua Valluru <326636767+joshua-berri@users.noreply.github.com> Date: Tue, 3 Nov 2026 08:44:52 -0800 Subject: [PATCH] fix(accounting): preserve dates in serialized payloads --- litellm/accounting/snapshot.py | 7 ++++++- tests/unit/accounting/test_projection.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/litellm/accounting/snapshot.py b/litellm/accounting/snapshot.py index df22742b9f0..3464bb07d5a 100644 --- a/litellm/accounting/snapshot.py +++ b/litellm/accounting/snapshot.py @@ -1,4 +1,5 @@ from collections.abc import Callable, Mapping, Sequence +from datetime import datetime from typing import TYPE_CHECKING, Final from pydantic import TypeAdapter @@ -112,6 +113,10 @@ def build_accounting_payload( ) ) return { - **{key: value for key, value in payload.items() if key in _ACCOUNTING_FIELDS}, + **{ + key: value.isoformat() if isinstance(value, datetime) else value + for key, value in payload.items() + if key in _ACCOUNTING_FIELDS + }, "metadata": {key: value for key, value in metadata.items() if key in ACCOUNTING_METADATA_FIELDS}, } diff --git a/tests/unit/accounting/test_projection.py b/tests/unit/accounting/test_projection.py index 90f830fac8b..8674d769c54 100644 --- a/tests/unit/accounting/test_projection.py +++ b/tests/unit/accounting/test_projection.py @@ -69,6 +69,7 @@ async def test_daily_projection_matches_legacy_writer(status: str, origin: str | restored: Final = _FIELDS.validate_json(json.dumps(accounting, default=str)) stored_daily: Final = next(item for item in project(restored) if item.table == "LiteLLM_DailyUserSpend") assert dict(stored_daily.increments) == {name: legacy[name] for name, _ in stored_daily.increments} + assert stored_daily.key == projected.key assert not {"messages", "response", "proxy_server_request", "requester_ip_address"}.intersection(accounting)