diff --git a/sentry_sdk/consts.py b/sentry_sdk/consts.py index e54e42625c..18a7ff37a3 100644 --- a/sentry_sdk/consts.py +++ b/sentry_sdk/consts.py @@ -495,6 +495,12 @@ class SPANDATA: Example: "qa-pipeline" """ + GEN_AI_PROVIDER_NAME = "gen_ai.provider.name" + """ + The Generative AI provider as identified by the client or server instrumentation. + Example: "openai" + """ + GEN_AI_RESPONSE_FINISH_REASONS = "gen_ai.response.finish_reasons" """ The reason why the model stopped generating. @@ -605,6 +611,9 @@ class SPANDATA: GEN_AI_SYSTEM = "gen_ai.system" """ + .. deprecated:: + This attribute is deprecated. Use the GEN_AI_PROVIDER_NAME attribute instead. + The name of the AI system being used. Example: "openai" """ diff --git a/sentry_sdk/integrations/google_genai/__init__.py b/sentry_sdk/integrations/google_genai/__init__.py index 27a42f4f6a..03ad45fc93 100644 --- a/sentry_sdk/integrations/google_genai/__init__.py +++ b/sentry_sdk/integrations/google_genai/__init__.py @@ -91,7 +91,7 @@ def new_generate_content_stream( ) chat_span.__enter__() chat_span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "chat") - chat_span.set_data(SPANDATA.GEN_AI_SYSTEM, GEN_AI_SYSTEM) + chat_span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, GEN_AI_SYSTEM) chat_span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model_name) set_span_data_for_request(chat_span, integration, model_name, contents, kwargs) chat_span.set_data(SPANDATA.GEN_AI_RESPONSE_STREAMING, True) @@ -166,7 +166,7 @@ async def new_async_generate_content_stream( ) chat_span.__enter__() chat_span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "chat") - chat_span.set_data(SPANDATA.GEN_AI_SYSTEM, GEN_AI_SYSTEM) + chat_span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, GEN_AI_SYSTEM) chat_span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model_name) set_span_data_for_request(chat_span, integration, model_name, contents, kwargs) chat_span.set_data(SPANDATA.GEN_AI_RESPONSE_STREAMING, True) @@ -234,7 +234,7 @@ def new_generate_content(self: "Any", *args: "Any", **kwargs: "Any") -> "Any": origin=ORIGIN, ) as chat_span: chat_span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "chat") - chat_span.set_data(SPANDATA.GEN_AI_SYSTEM, GEN_AI_SYSTEM) + chat_span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, GEN_AI_SYSTEM) chat_span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model_name) chat_span.set_data(SPANDATA.GEN_AI_AGENT_NAME, model_name) set_span_data_for_request( @@ -282,7 +282,7 @@ async def new_async_generate_content( origin=ORIGIN, ) as chat_span: chat_span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "chat") - chat_span.set_data(SPANDATA.GEN_AI_SYSTEM, GEN_AI_SYSTEM) + chat_span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, GEN_AI_SYSTEM) chat_span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model_name) set_span_data_for_request( chat_span, integration, model_name, contents, kwargs @@ -317,7 +317,7 @@ def new_embed_content(self: "Any", *args: "Any", **kwargs: "Any") -> "Any": origin=ORIGIN, ) as span: span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "embeddings") - span.set_data(SPANDATA.GEN_AI_SYSTEM, GEN_AI_SYSTEM) + span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, GEN_AI_SYSTEM) span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model_name) set_span_data_for_embed_request(span, integration, contents, kwargs) @@ -352,7 +352,7 @@ async def new_async_embed_content( origin=ORIGIN, ) as span: span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "embeddings") - span.set_data(SPANDATA.GEN_AI_SYSTEM, GEN_AI_SYSTEM) + span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, GEN_AI_SYSTEM) span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model_name) set_span_data_for_embed_request(span, integration, contents, kwargs) diff --git a/sentry_sdk/integrations/google_genai/utils.py b/sentry_sdk/integrations/google_genai/utils.py index b2d6499843..bc85e00c7f 100644 --- a/sentry_sdk/integrations/google_genai/utils.py +++ b/sentry_sdk/integrations/google_genai/utils.py @@ -789,7 +789,7 @@ def set_span_data_for_request( kwargs: "dict[str, Any]", ) -> None: """Set span data for the request.""" - span.set_data(SPANDATA.GEN_AI_SYSTEM, GEN_AI_SYSTEM) + span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, GEN_AI_SYSTEM) span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model) if kwargs.get("stream", False): diff --git a/sentry_sdk/integrations/langchain.py b/sentry_sdk/integrations/langchain.py index 7a5e863e4d..0cf315412b 100644 --- a/sentry_sdk/integrations/langchain.py +++ b/sentry_sdk/integrations/langchain.py @@ -383,9 +383,9 @@ def on_llm_start( ai_type = all_params.get("_type", "") if "anthropic" in ai_type: - span.set_data(SPANDATA.GEN_AI_SYSTEM, "anthropic") + span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, "anthropic") elif "openai" in ai_type: - span.set_data(SPANDATA.GEN_AI_SYSTEM, "openai") + span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, "openai") for key, attribute in DATA_FIELDS.items(): if key in all_params and all_params[key] is not None: @@ -451,9 +451,9 @@ def on_chat_model_start( ai_type = all_params.get("_type", "") if "anthropic" in ai_type: - span.set_data(SPANDATA.GEN_AI_SYSTEM, "anthropic") + span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, "anthropic") elif "openai" in ai_type: - span.set_data(SPANDATA.GEN_AI_SYSTEM, "openai") + span.set_data(SPANDATA.GEN_AI_PROVIDER_NAME, "openai") agent_name = _get_current_agent() if agent_name: diff --git a/sentry_sdk/integrations/litellm.py b/sentry_sdk/integrations/litellm.py index 28bcc34d3e..b0023d6a54 100644 --- a/sentry_sdk/integrations/litellm.py +++ b/sentry_sdk/integrations/litellm.py @@ -103,7 +103,7 @@ def _input_callback(kwargs: "Dict[str, Any]") -> None: _get_metadata_dict(kwargs)["_sentry_span"] = span # Set basic data - set_data_normalized(span, SPANDATA.GEN_AI_SYSTEM, provider) + set_data_normalized(span, SPANDATA.GEN_AI_PROVIDER_NAME, provider) set_data_normalized(span, SPANDATA.GEN_AI_OPERATION_NAME, operation) # Record input/messages if allowed diff --git a/sentry_sdk/integrations/openai.py b/sentry_sdk/integrations/openai.py index 863f146a51..4f90a82004 100644 --- a/sentry_sdk/integrations/openai.py +++ b/sentry_sdk/integrations/openai.py @@ -239,7 +239,7 @@ def _commmon_set_input_data( kwargs: "dict[str, Any]", ) -> None: # Input attributes: Common - set_data_normalized(span, SPANDATA.GEN_AI_SYSTEM, "openai") + set_data_normalized(span, SPANDATA.GEN_AI_PROVIDER_NAME, "openai") # Input attributes: Optional kwargs_keys_to_attributes = { diff --git a/sentry_sdk/integrations/openai_agents/utils.py b/sentry_sdk/integrations/openai_agents/utils.py index f3873db886..76405c592a 100644 --- a/sentry_sdk/integrations/openai_agents/utils.py +++ b/sentry_sdk/integrations/openai_agents/utils.py @@ -61,7 +61,7 @@ def _record_exception_on_span(span: "Span", error: Exception) -> "Any": def _set_agent_data(span: "sentry_sdk.tracing.Span", agent: "agents.Agent") -> None: span.set_data( - SPANDATA.GEN_AI_SYSTEM, "openai" + SPANDATA.GEN_AI_PROVIDER_NAME, "openai" ) # See footnote for https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-system for explanation why. span.set_data(SPANDATA.GEN_AI_AGENT_NAME, agent.name)