From 730679784e05c8d8d465402ebbafc9d37df10a82 Mon Sep 17 00:00:00 2001 From: Alexsander Hamir Date: Fri, 30 Jan 2026 10:18:11 -0800 Subject: [PATCH] fix: send list(log_queue) when building request bodies for BoundedQueue Generic API, Datadog, and Datadog LLM Obs were passing the BoundedQueue object into HTTP/serialization, causing request body to be the queue's string repr. Use list(self.log_queue) so payloads are real lists. --- litellm/integrations/datadog/datadog.py | 2 +- litellm/integrations/datadog/datadog_llm_obs.py | 4 ++-- litellm/integrations/generic_api/generic_api_callback.py | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/litellm/integrations/datadog/datadog.py b/litellm/integrations/datadog/datadog.py index 503e8d8c87a..3a41277c95d 100644 --- a/litellm/integrations/datadog/datadog.py +++ b/litellm/integrations/datadog/datadog.py @@ -230,7 +230,7 @@ class DataDogLogger( self.intake_url, ) - response = await self.async_send_compressed_data(self.log_queue) + response = await self.async_send_compressed_data(list(self.log_queue)) if response.status_code == 413: verbose_logger.exception(DD_ERRORS.DATADOG_413_ERROR.value) return diff --git a/litellm/integrations/datadog/datadog_llm_obs.py b/litellm/integrations/datadog/datadog_llm_obs.py index 75003e38cd6..5db09bbbfa0 100644 --- a/litellm/integrations/datadog/datadog_llm_obs.py +++ b/litellm/integrations/datadog/datadog_llm_obs.py @@ -139,14 +139,14 @@ class DataDogLLMObsLogger(CustomBatchLogger[LLMObsPayload]): f"DataDogLLMObs: Flushing {len(self.log_queue)} events" ) - # Prepare the payload + # Prepare the payload (use list() so serialization gets a list, not BoundedQueue) payload = { "data": DDIntakePayload( type="span", attributes=DDSpanAttributes( ml_app=get_datadog_service(), tags=[get_datadog_tags()], - spans=self.log_queue, + spans=list(self.log_queue), ), ), } diff --git a/litellm/integrations/generic_api/generic_api_callback.py b/litellm/integrations/generic_api/generic_api_callback.py index 5b00f2dd623..5cb79b61209 100644 --- a/litellm/integrations/generic_api/generic_api_callback.py +++ b/litellm/integrations/generic_api/generic_api_callback.py @@ -342,11 +342,12 @@ class GenericAPILogger(CustomBatchLogger[Union[Dict, StandardLoggingPayload]]): f"Generic API Logger - sent log {idx}, status: {result.status_code}" # type: ignore ) else: - # Format the payload based on log_format + # Format the payload based on log_format (use list() so JSON gets a list, not BoundedQueue) + batch = list(self.log_queue) if self.log_format == "json_array": - data = safe_dumps(self.log_queue) + data = safe_dumps(batch) elif self.log_format == "ndjson": - data = "\n".join(safe_dumps(log) for log in self.log_queue) + data = "\n".join(safe_dumps(log) for log in batch) else: raise ValueError(f"Unknown log_format: {self.log_format}")