diff --git a/litellm/integrations/opentelemetry.py b/litellm/integrations/opentelemetry.py index b5fbacdf3..bb9e34b1a 100644 --- a/litellm/integrations/opentelemetry.py +++ b/litellm/integrations/opentelemetry.py @@ -366,8 +366,6 @@ class OpenTelemetry(CustomLogger): ) message = choice.get("message") - if not isinstance(message, dict): - message = message.dict() tool_calls = message.get("tool_calls") if tool_calls: span.set_attribute( diff --git a/litellm/utils.py b/litellm/utils.py index d6efe79d3..ed405419b 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -326,6 +326,22 @@ class Function(OpenAIObject): super(Function, self).__init__(**data) + def __contains__(self, key): + # Define custom behavior for the 'in' operator + return hasattr(self, key) + + def get(self, key, default=None): + # Custom .get() method to access attributes with a default value if the attribute doesn't exist + return getattr(self, key, default) + + def __getitem__(self, key): + # Allow dictionary-style access to attributes + return getattr(self, key) + + def __setitem__(self, key, value): + # Allow dictionary-style assignment of attributes + setattr(self, key, value) + class ChatCompletionDeltaToolCall(OpenAIObject): id: Optional[str] = None @@ -385,6 +401,22 @@ class ChatCompletionMessageToolCall(OpenAIObject): else: self.type = "function" + def __contains__(self, key): + # Define custom behavior for the 'in' operator + return hasattr(self, key) + + def get(self, key, default=None): + # Custom .get() method to access attributes with a default value if the attribute doesn't exist + return getattr(self, key, default) + + def __getitem__(self, key): + # Allow dictionary-style access to attributes + return getattr(self, key) + + def __setitem__(self, key, value): + # Allow dictionary-style assignment of attributes + setattr(self, key, value) + class Message(OpenAIObject): def __init__(