From 1cfed81ea17b9c7ade68f5492aa9569d60b4f97d Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Wed, 18 Mar 2026 12:56:35 +0100 Subject: [PATCH] fix(openai): Always set gen_ai.response.streaming for Completions --- sentry_sdk/integrations/openai.py | 8 +++----- tests/integrations/openai/test_openai.py | 4 ++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sentry_sdk/integrations/openai.py b/sentry_sdk/integrations/openai.py index 87f3794037..c6fe89f7fd 100644 --- a/sentry_sdk/integrations/openai.py +++ b/sentry_sdk/integrations/openai.py @@ -361,10 +361,6 @@ def _set_completions_api_input_data( if model is not None: span.set_data(SPANDATA.GEN_AI_REQUEST_MODEL, model) - stream = kwargs.get("stream") - if stream is not None and _is_given(stream): - span.set_data(SPANDATA.GEN_AI_RESPONSE_STREAMING, stream) - max_tokens = kwargs.get("max_tokens") if max_tokens is not None and _is_given(max_tokens): span.set_data(SPANDATA.GEN_AI_REQUEST_MAX_TOKENS, max_tokens) @@ -614,12 +610,14 @@ def _new_chat_completion_common(f: "Any", *args: "Any", **kwargs: "Any") -> "Any span.__enter__() span.set_data(SPANDATA.GEN_AI_SYSTEM, "openai") + is_streaming_response = kwargs.get("stream", False) + span.set_data(SPANDATA.GEN_AI_RESPONSE_STREAMING, is_streaming_response) + _set_completions_api_input_data(span, kwargs, integration) start_time = time.perf_counter() response = yield f, args, kwargs - is_streaming_response = kwargs.get("stream", False) if is_streaming_response: _set_streaming_completions_api_output_data( span, response, kwargs, integration, start_time, finish_span=True diff --git a/tests/integrations/openai/test_openai.py b/tests/integrations/openai/test_openai.py index f7d729ed1f..8be8befebf 100644 --- a/tests/integrations/openai/test_openai.py +++ b/tests/integrations/openai/test_openai.py @@ -167,6 +167,7 @@ def test_nonstreaming_chat_completion_no_prompts( span = tx["spans"][0] assert span["op"] == "gen_ai.chat" assert span["data"][SPANDATA.GEN_AI_SYSTEM] == "openai" + assert span["data"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is False assert span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] == "some-model" assert span["data"][SPANDATA.GEN_AI_REQUEST_MAX_TOKENS] == 100 @@ -259,6 +260,7 @@ def test_nonstreaming_chat_completion(sentry_init, capture_events, messages, req span = tx["spans"][0] assert span["op"] == "gen_ai.chat" assert span["data"][SPANDATA.GEN_AI_SYSTEM] == "openai" + assert span["data"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is False assert span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] == "some-model" assert span["data"][SPANDATA.GEN_AI_REQUEST_MAX_TOKENS] == 100 @@ -338,6 +340,7 @@ async def test_nonstreaming_chat_completion_async_no_prompts( span = tx["spans"][0] assert span["op"] == "gen_ai.chat" assert span["data"][SPANDATA.GEN_AI_SYSTEM] == "openai" + assert span["data"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is False assert span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] == "some-model" assert span["data"][SPANDATA.GEN_AI_REQUEST_MAX_TOKENS] == 100 @@ -430,6 +433,7 @@ async def test_nonstreaming_chat_completion_async( span = tx["spans"][0] assert span["op"] == "gen_ai.chat" assert span["data"][SPANDATA.GEN_AI_SYSTEM] == "openai" + assert span["data"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is False assert span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] == "some-model" assert span["data"][SPANDATA.GEN_AI_REQUEST_MAX_TOKENS] == 100