From 3a1bb525a4e4c01db7be65d1719c84940256c7df Mon Sep 17 00:00:00 2001 From: devteamaegis Date: Fri, 22 May 2026 01:52:31 -0400 Subject: [PATCH] fix(otel): normalise list guardrail_mode to tuple in _emit_once to avoid TypeError --- litellm/integrations/opentelemetry.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/litellm/integrations/opentelemetry.py b/litellm/integrations/opentelemetry.py index 6c8510380a8..519b90efc70 100644 --- a/litellm/integrations/opentelemetry.py +++ b/litellm/integrations/opentelemetry.py @@ -955,7 +955,14 @@ class OpenTelemetry(OTELGenAISemconvMixin, CustomLogger): spans_logged = {} _otel_internal["spans_logged"] = spans_logged - dedupe_key = (self.__class__.__name__, id(self), *scope) + # Normalise scope parts so they are always hashable. `guardrail_mode` + # can be a list (e.g. ["pre_call", "post_call"]) and a tuple containing + # a list is itself unhashable, causing a TypeError when used as a dict key. + normalized_scope = tuple( + tuple(part) if isinstance(part, list) else part + for part in scope + ) + dedupe_key = (self.__class__.__name__, id(self), *normalized_scope) if spans_logged.get(dedupe_key) is True: return False