Skip to content

Commit 2b8a007

Browse files
committed
fix(litellm): simplify model/provider extraction and improve metadata handling
1 parent fea8009 commit 2b8a007

File tree

1 file changed

+22
-61
lines changed

1 file changed

+22
-61
lines changed

sentry_sdk/integrations/litellm.py

Lines changed: 22 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -19,61 +19,35 @@
1919
raise DidNotEnable("LiteLLM not installed")
2020

2121

22-
def _get_provider_from_model(model):
23-
# type: (str) -> str
24-
"""Extract provider name from model string using LiteLLM's logic"""
25-
if not model:
26-
return "unknown"
27-
28-
# Common provider prefixes/patterns
29-
if model.startswith("gpt-") or model.startswith("o1-") or "openai/" in model:
30-
return "openai"
31-
elif model.startswith("claude-") or "anthropic/" in model:
32-
return "anthropic"
33-
elif (
34-
model.startswith("gemini-")
35-
or "google/" in model
36-
or model.startswith("vertex_ai/")
37-
):
38-
return "google"
39-
elif "cohere/" in model or model.startswith("command-"):
40-
return "cohere"
41-
elif "azure/" in model:
42-
return "azure"
43-
elif "bedrock/" in model:
44-
return "bedrock"
45-
elif "ollama/" in model:
46-
return "ollama"
47-
else:
48-
# Try to use LiteLLM's internal provider detection if available
49-
try:
50-
if hasattr(litellm, "get_llm_provider"):
51-
provider_info = litellm.get_llm_provider(model)
52-
if isinstance(provider_info, tuple) and len(provider_info) > 1:
53-
return provider_info[1] or "unknown"
54-
return "unknown"
55-
except Exception:
56-
return "unknown"
57-
58-
5922
def _get_metadata_dict(kwargs):
6023
# type: (Dict[str, Any]) -> Dict[str, Any]
6124
"""Get the metadata dictionary from the kwargs."""
62-
return kwargs.setdefault("litellm_params", {}).setdefault("metadata", {})
25+
litellm_params = kwargs.setdefault("litellm_params", {})
26+
27+
# we need this weird little dance, as metadata might be set but may be None initially
28+
metadata = litellm_params.get("metadata")
29+
if metadata is None:
30+
metadata = {}
31+
litellm_params["metadata"] = metadata
32+
return metadata
6333

6434

65-
def _input_callback(
66-
kwargs, # type: Dict[str, Any]
67-
):
68-
# type: (...) -> None
35+
def _input_callback(kwargs):
36+
# type: (Dict[str, Any]) -> None
6937
"""Handle the start of a request."""
7038
integration = sentry_sdk.get_client().get_integration(LiteLLMIntegration)
7139

7240
if integration is None:
7341
return
7442

7543
# Get key parameters
76-
model = kwargs.get("model", "")
44+
full_model = kwargs.get("model", "")
45+
try:
46+
model, provider, _, _ = litellm.get_llm_provider(full_model)
47+
except Exception:
48+
model = full_model
49+
provider = "unknown"
50+
7751
messages = kwargs.get("messages", [])
7852
operation = "chat" if messages else "embeddings"
7953

@@ -93,11 +67,8 @@ def _input_callback(
9367
_get_metadata_dict(kwargs)["_sentry_span"] = span
9468

9569
# Set basic data
96-
set_data_normalized(span, SPANDATA.GEN_AI_SYSTEM, "litellm")
70+
set_data_normalized(span, SPANDATA.GEN_AI_SYSTEM, provider)
9771
set_data_normalized(span, SPANDATA.GEN_AI_OPERATION_NAME, operation)
98-
set_data_normalized(
99-
span, "gen_ai.litellm.provider", _get_provider_from_model(model)
100-
)
10172

10273
# Record messages if allowed
10374
if messages and should_send_default_pii() and integration.include_prompts:
@@ -131,13 +102,8 @@ def _input_callback(
131102
set_data_normalized(span, f"gen_ai.litellm.{key}", value)
132103

133104

134-
def _success_callback(
135-
kwargs, # type: Dict[str, Any]
136-
completion_response, # type: Any
137-
start_time, # type: datetime
138-
end_time, # type: datetime
139-
):
140-
# type: (...) -> None
105+
def _success_callback(kwargs, completion_response, start_time, end_time):
106+
# type: (Dict[str, Any], Any, datetime, datetime) -> None
141107
"""Handle successful completion."""
142108

143109
span = _get_metadata_dict(kwargs).get("_sentry_span")
@@ -196,13 +162,8 @@ def _success_callback(
196162
span.__exit__(None, None, None)
197163

198164

199-
def _failure_callback(
200-
kwargs, # type: Dict[str, Any]
201-
exception, # type: Exception
202-
start_time, # type: datetime
203-
end_time, # type: datetime
204-
):
205-
# type: (...) -> None
165+
def _failure_callback(kwargs, exception, start_time, end_time):
166+
# type: (Dict[str, Any], Exception, datetime, datetime) -> None
206167
"""Handle request failure."""
207168
span = _get_metadata_dict(kwargs).get("_sentry_span")
208169
if span is None:

0 commit comments

Comments
 (0)