diff --git a/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/shared/__init__.py b/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/shared/__init__.py index 2f88e9c8eb..1d03297395 100644 --- a/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/shared/__init__.py +++ b/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/shared/__init__.py @@ -232,7 +232,7 @@ def _set_response_attributes(span, response): prompt_tokens_details = dict(usage.get("prompt_tokens_details", {})) _set_span_attribute( span, - GenAIAttributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, + SpanAttributes.LLM_USAGE_CACHE_READ_INPUT_TOKENS, prompt_tokens_details.get("cached_tokens", 0), ) return diff --git a/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/v1/responses_wrappers.py b/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/v1/responses_wrappers.py index 7942e6b2c6..6fbea88168 100644 --- a/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +++ b/packages/opentelemetry-instrumentation-openai/opentelemetry/instrumentation/openai/v1/responses_wrappers.py @@ -1,9 +1,11 @@ import json import pydantic import re +import threading import time from openai import AsyncStream, Stream +from wrapt import ObjectProxy # Conditional imports for backward compatibility try: @@ -192,13 +194,11 @@ def set_data_attributes(traced_response: TracedData, span: Span): if usage.input_tokens_details: _set_span_attribute( span, - GenAIAttributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, + SpanAttributes.LLM_USAGE_CACHE_READ_INPUT_TOKENS, usage.input_tokens_details.cached_tokens, ) - # Usage - count of reasoning tokens reasoning_tokens = None - # Support both dict-style and object-style `usage` tokens_details = ( usage.get("output_tokens_details") if isinstance(usage, dict) else getattr(usage, "output_tokens_details", None) @@ -216,20 +216,16 @@ def set_data_attributes(traced_response: TracedData, span: Span): reasoning_tokens or 0, ) - # Reasoning attributes - # Request - reasoning summary _set_span_attribute( span, f"{SpanAttributes.LLM_REQUEST_REASONING_SUMMARY}", traced_response.request_reasoning_summary or (), ) - # Request - reasoning effort _set_span_attribute( span, f"{SpanAttributes.LLM_REQUEST_REASONING_EFFORT}", traced_response.request_reasoning_effort or (), ) - # Response - reasoning effort _set_span_attribute( span, f"{SpanAttributes.LLM_RESPONSE_REASONING_EFFORT}", @@ -433,7 +429,19 @@ def responses_get_or_create_wrapper(tracer: Tracer, wrapped, instance, args, kwa try: response = wrapped(*args, **kwargs) if isinstance(response, Stream): - return response + span = tracer.start_span( + SPAN_NAME, + kind=SpanKind.CLIENT, + start_time=start_time, + ) + + return ResponseStream( + span=span, + response=response, + start_time=start_time, + request_kwargs=kwargs, + tracer=tracer, + ) except Exception as e: response_id = kwargs.get("response_id") existing_data = {} @@ -563,7 +571,19 @@ async def async_responses_get_or_create_wrapper( try: response = await wrapped(*args, **kwargs) if isinstance(response, (Stream, AsyncStream)): - return response + span = tracer.start_span( + SPAN_NAME, + kind=SpanKind.CLIENT, + start_time=start_time, + ) + + return ResponseStream( + span=span, + response=response, + start_time=start_time, + request_kwargs=kwargs, + tracer=tracer, + ) except Exception as e: response_id = kwargs.get("response_id") existing_data = {} @@ -728,4 +748,228 @@ async def async_responses_cancel_wrapper( return response -# TODO: build streaming responses +class ResponseStream(ObjectProxy): + """Proxy class for streaming responses to capture telemetry data""" + + _span = None + _start_time = None + _request_kwargs = None + _tracer = None + _traced_data = None + + def __init__( + self, + span, + response, + start_time=None, + request_kwargs=None, + tracer=None, + traced_data=None, + ): + super().__init__(response) + self._span = span + self._start_time = start_time + self._request_kwargs = request_kwargs or {} + self._tracer = tracer + self._traced_data = traced_data or TracedData( + start_time=start_time, + response_id="", + input=process_input(self._request_kwargs.get("input", [])), + instructions=self._request_kwargs.get("instructions"), + tools=get_tools_from_kwargs(self._request_kwargs), + output_blocks={}, + usage=None, + output_text="", + request_model=self._request_kwargs.get("model", ""), + response_model="", + request_reasoning_summary=self._request_kwargs.get("reasoning", {}).get( + "summary" + ), + request_reasoning_effort=self._request_kwargs.get("reasoning", {}).get("effort"), + response_reasoning_effort=None, + ) + + self._complete_response_data = None + self._output_text = "" + + self._cleanup_completed = False + self._cleanup_lock = threading.Lock() + + def __del__(self): + """Cleanup when object is garbage collected""" + if hasattr(self, "_cleanup_completed") and not self._cleanup_completed: + self._ensure_cleanup() + + def __enter__(self): + """Context manager entry""" + if hasattr(self.__wrapped__, "__enter__"): + self.__wrapped__.__enter__() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Context manager exit""" + suppress = False + try: + if exc_type is not None: + self._handle_exception(exc_val) + else: + self._process_complete_response() + finally: + if hasattr(self.__wrapped__, "__exit__"): + suppress = bool(self.__wrapped__.__exit__(exc_type, exc_val, exc_tb)) + return suppress + + async def __aenter__(self): + """Async context manager entry""" + if hasattr(self.__wrapped__, "__aenter__"): + await self.__wrapped__.__aenter__() + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Async context manager exit""" + suppress = False + try: + if exc_type is not None: + self._handle_exception(exc_val) + else: + self._process_complete_response() + finally: + if hasattr(self.__wrapped__, "__aexit__"): + suppress = bool(await self.__wrapped__.__aexit__(exc_type, exc_val, exc_tb)) + return suppress + + def close(self): + try: + self._ensure_cleanup() + finally: + if hasattr(self.__wrapped__, "close"): + return self.__wrapped__.close() + + async def aclose(self): + try: + self._ensure_cleanup() + finally: + if hasattr(self.__wrapped__, "aclose"): + return await self.__wrapped__.aclose() + + def __iter__(self): + """Synchronous iterator""" + return self + + def __next__(self): + """Synchronous iteration""" + try: + chunk = self.__wrapped__.__next__() + except StopIteration: + self._process_complete_response() + raise + except Exception as e: + self._handle_exception(e) + raise + else: + self._process_chunk(chunk) + return chunk + + def __aiter__(self): + """Async iterator""" + return self + + async def __anext__(self): + """Async iteration""" + try: + chunk = await self.__wrapped__.__anext__() + except StopAsyncIteration: + self._process_complete_response() + raise + except Exception as e: + self._handle_exception(e) + raise + else: + self._process_chunk(chunk) + return chunk + + def _process_chunk(self, chunk): + """Process a streaming chunk""" + if hasattr(chunk, "type"): + if chunk.type == "response.output_text.delta": + if hasattr(chunk, "delta") and chunk.delta: + self._output_text += chunk.delta + elif chunk.type == "response.completed" and hasattr(chunk, "response"): + self._complete_response_data = chunk.response + + if hasattr(chunk, "delta"): + if hasattr(chunk.delta, "text") and chunk.delta.text: + self._output_text += chunk.delta.text + + if hasattr(chunk, "response") and chunk.response: + self._complete_response_data = chunk.response + + @dont_throw + def _process_complete_response(self): + """Process the complete response and emit span""" + with self._cleanup_lock: + if self._cleanup_completed: + return + + try: + if self._complete_response_data: + parsed_response = parse_response(self._complete_response_data) + + self._traced_data.response_id = parsed_response.id + self._traced_data.response_model = parsed_response.model + self._traced_data.output_text = self._output_text + + if parsed_response.usage: + self._traced_data.usage = parsed_response.usage + + if parsed_response.output: + self._traced_data.output_blocks = { + block.id: block for block in parsed_response.output + } + + responses[parsed_response.id] = self._traced_data + + set_data_attributes(self._traced_data, self._span) + self._span.set_status(StatusCode.OK) + self._span.end() + self._cleanup_completed = True + + except Exception as e: + if self._span and self._span.is_recording(): + self._span.set_attribute(ERROR_TYPE, e.__class__.__name__) + self._span.set_status(StatusCode.ERROR, str(e)) + self._span.end() + self._cleanup_completed = True + + @dont_throw + def _handle_exception(self, exception): + """Handle exceptions during streaming""" + with self._cleanup_lock: + if self._cleanup_completed: + return + + if self._span and self._span.is_recording(): + self._span.set_attribute(ERROR_TYPE, exception.__class__.__name__) + self._span.record_exception(exception) + self._span.set_status(StatusCode.ERROR, str(exception)) + self._span.end() + + self._cleanup_completed = True + + @dont_throw + def _ensure_cleanup(self): + """Ensure cleanup happens even if stream is not fully consumed""" + with self._cleanup_lock: + if self._cleanup_completed: + return + + try: + if self._span and self._span.is_recording(): + set_data_attributes(self._traced_data, self._span) + self._span.set_status(StatusCode.OK) + self._span.end() + + self._cleanup_completed = True + + except Exception: + self._cleanup_completed = True diff --git a/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming.yaml b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming.yaml new file mode 100644 index 0000000000..98ad9da66f --- /dev/null +++ b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming.yaml @@ -0,0 +1,255 @@ +interactions: +- request: + body: '{"input":"Tell me a three sentence bedtime story about a unicorn.","model":"gpt-4.1-nano","stream":true}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '104' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.97.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.97.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.10.16 + method: POST + uri: https://api.openai.com/v1/responses + response: + body: + string: "event: response.created\ndata: {\"type\":\"response.created\",\"sequence_number\":0,\"response\":{\"id\":\"resp_0fef0f8a68937870006911e9ecf124819491634b434678464a\",\"object\":\"response\",\"created_at\":1762781676,\"status\":\"in_progress\",\"background\":false,\"error\":null,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":null,\"max_tool_calls\":null,\"model\":\"gpt-4.1-nano-2025-04-14\",\"output\":[],\"parallel_tool_calls\":true,\"previous_response_id\":null,\"prompt_cache_key\":null,\"prompt_cache_retention\":null,\"reasoning\":{\"effort\":null,\"summary\":null},\"safety_identifier\":null,\"service_tier\":\"auto\",\"store\":true,\"temperature\":1.0,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"auto\",\"tools\":[],\"top_logprobs\":0,\"top_p\":1.0,\"truncation\":\"disabled\",\"usage\":null,\"user\":null,\"metadata\":{}}}\n\nevent: + response.in_progress\ndata: {\"type\":\"response.in_progress\",\"sequence_number\":1,\"response\":{\"id\":\"resp_0fef0f8a68937870006911e9ecf124819491634b434678464a\",\"object\":\"response\",\"created_at\":1762781676,\"status\":\"in_progress\",\"background\":false,\"error\":null,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":null,\"max_tool_calls\":null,\"model\":\"gpt-4.1-nano-2025-04-14\",\"output\":[],\"parallel_tool_calls\":true,\"previous_response_id\":null,\"prompt_cache_key\":null,\"prompt_cache_retention\":null,\"reasoning\":{\"effort\":null,\"summary\":null},\"safety_identifier\":null,\"service_tier\":\"auto\",\"store\":true,\"temperature\":1.0,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"auto\",\"tools\":[],\"top_logprobs\":0,\"top_p\":1.0,\"truncation\":\"disabled\",\"usage\":null,\"user\":null,\"metadata\":{}}}\n\nevent: + response.output_item.added\ndata: {\"type\":\"response.output_item.added\",\"sequence_number\":2,\"output_index\":0,\"item\":{\"id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"type\":\"message\",\"status\":\"in_progress\",\"content\":[],\"role\":\"assistant\"}}\n\nevent: + response.content_part.added\ndata: {\"type\":\"response.content_part.added\",\"sequence_number\":3,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"part\":{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"\"}}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":4,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\"Once\",\"logprobs\":[],\"obfuscation\":\"lOokrPj8RO6Z\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":5,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + upon\",\"logprobs\":[],\"obfuscation\":\"Tv7ebWtX2Ed\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":6,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + a\",\"logprobs\":[],\"obfuscation\":\"8axF0YPU0fXp7h\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":7,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + time\",\"logprobs\":[],\"obfuscation\":\"NXqYzsjEIGb\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":8,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\",\",\"logprobs\":[],\"obfuscation\":\"2Jd3IUgnnP4mLrt\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":9,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + in\",\"logprobs\":[],\"obfuscation\":\"Ql8dH38dSglUH\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":10,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + a\",\"logprobs\":[],\"obfuscation\":\"x171oDHxbNc8PD\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":11,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + enchanted\",\"logprobs\":[],\"obfuscation\":\"FZwnwG\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":12,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + forest\",\"logprobs\":[],\"obfuscation\":\"lQ6ALw3qg\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":13,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\",\",\"logprobs\":[],\"obfuscation\":\"F9zXblw4jtPyJU6\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":14,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + there\",\"logprobs\":[],\"obfuscation\":\"H7b2VntIit\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":15,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + was\",\"logprobs\":[],\"obfuscation\":\"DH5pCqSugHT6\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":16,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + a\",\"logprobs\":[],\"obfuscation\":\"BQIkM6dCVYtDGL\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":17,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + gentle\",\"logprobs\":[],\"obfuscation\":\"cjZV8s9Z3\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":18,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + unicorn\",\"logprobs\":[],\"obfuscation\":\"pggvktk3\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":19,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + named\",\"logprobs\":[],\"obfuscation\":\"q5Fev4vcn4\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":20,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + Luna\",\"logprobs\":[],\"obfuscation\":\"xnRqm54KfcU\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":21,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + who\",\"logprobs\":[],\"obfuscation\":\"NhtP5tN59aKb\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":22,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + loved\",\"logprobs\":[],\"obfuscation\":\"pBelAdvYUg\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":23,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + to\",\"logprobs\":[],\"obfuscation\":\"eytyHdZMDTepR\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":24,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + weave\",\"logprobs\":[],\"obfuscation\":\"bamP4SqFpY\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":25,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + dreams\",\"logprobs\":[],\"obfuscation\":\"m5j1ARS01\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":26,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + into\",\"logprobs\":[],\"obfuscation\":\"ZMxnI4OslJ6\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":27,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + sparkling\",\"logprobs\":[],\"obfuscation\":\"tAa97V\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":28,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + st\",\"logprobs\":[],\"obfuscation\":\"2tQI6DXj3L9LB\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":29,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\"ard\",\"logprobs\":[],\"obfuscation\":\"qq0ONzuSZcBWN\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":30,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\"ust\",\"logprobs\":[],\"obfuscation\":\"yzB7wenfb4sVh\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":31,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\".\",\"logprobs\":[],\"obfuscation\":\"MAHbFO4NyStuMeg\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":32,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + One\",\"logprobs\":[],\"obfuscation\":\"1ywa4ORElBut\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":33,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + night\",\"logprobs\":[],\"obfuscation\":\"oLIS3h6yKU\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":34,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\",\",\"logprobs\":[],\"obfuscation\":\"A9bHt90qNFI32uz\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":35,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + she\",\"logprobs\":[],\"obfuscation\":\"GQqIbvIglgQA\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":36,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + gathered\",\"logprobs\":[],\"obfuscation\":\"DsU1les\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":37,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + all\",\"logprobs\":[],\"obfuscation\":\"OLhODyY5Mb0z\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":38,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + her\",\"logprobs\":[],\"obfuscation\":\"jqjBNUW9eeS4\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":39,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + shimmering\",\"logprobs\":[],\"obfuscation\":\"Ldps9\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":40,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + magic\",\"logprobs\":[],\"obfuscation\":\"4pbvRjCvJ0\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":41,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + to\",\"logprobs\":[],\"obfuscation\":\"kuJnZeqm0isOd\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":42,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + create\",\"logprobs\":[],\"obfuscation\":\"W66Zbu9G1\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":43,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + a\",\"logprobs\":[],\"obfuscation\":\"6hUzY2oVNs4IU3\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":44,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + special\",\"logprobs\":[],\"obfuscation\":\"lY6RibHA\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":45,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + dream\",\"logprobs\":[],\"obfuscation\":\"rx4NLNJnq9\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":46,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + for\",\"logprobs\":[],\"obfuscation\":\"QlLjQageSjYX\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":47,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + a\",\"logprobs\":[],\"obfuscation\":\"7YSl9UHcINIVtA\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":48,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + little\",\"logprobs\":[],\"obfuscation\":\"UzaH2FnSG\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":49,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + girl\",\"logprobs\":[],\"obfuscation\":\"xndhO0b9Vlj\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":50,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + who\",\"logprobs\":[],\"obfuscation\":\"bHDjWs9pdrer\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":51,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + believed\",\"logprobs\":[],\"obfuscation\":\"1rCGba6\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":52,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + in\",\"logprobs\":[],\"obfuscation\":\"uDqlwMtWRe1AJ\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":53,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + kindness\",\"logprobs\":[],\"obfuscation\":\"Cfb7EDR\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":54,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + and\",\"logprobs\":[],\"obfuscation\":\"RmRl0UcAi117\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":55,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + hope\",\"logprobs\":[],\"obfuscation\":\"xMG6A07AbIo\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":56,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\".\",\"logprobs\":[],\"obfuscation\":\"PC49GemNmm73vyi\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":57,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + As\",\"logprobs\":[],\"obfuscation\":\"UJaW762YGDSxP\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":58,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + the\",\"logprobs\":[],\"obfuscation\":\"FIpPTrcPNVxX\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":59,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + girl\",\"logprobs\":[],\"obfuscation\":\"2RhbeqtrUQH\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":60,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + slept\",\"logprobs\":[],\"obfuscation\":\"TYCNKHPXhe\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":61,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + peacefully\",\"logprobs\":[],\"obfuscation\":\"OmW0M\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":62,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\",\",\"logprobs\":[],\"obfuscation\":\"FEo6K9FLY5vrKzc\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":63,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + Luna\",\"logprobs\":[],\"obfuscation\":\"Rdgmkx93Gm1\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":64,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\"\u2019s\",\"logprobs\":[],\"obfuscation\":\"IJSP3g05fHk1w2\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":65,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + dreams\",\"logprobs\":[],\"obfuscation\":\"YAtM80znq\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":66,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + floated\",\"logprobs\":[],\"obfuscation\":\"52v95Ec5\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":67,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + down\",\"logprobs\":[],\"obfuscation\":\"NuVfTeuBS2o\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":68,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + like\",\"logprobs\":[],\"obfuscation\":\"l8YcTwyP4ZE\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":69,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + glowing\",\"logprobs\":[],\"obfuscation\":\"SarF7yss\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":70,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + clouds\",\"logprobs\":[],\"obfuscation\":\"fS70h1tit\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":71,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\",\",\"logprobs\":[],\"obfuscation\":\"piNGFZ5xIeZ25mj\"}\n\nevent: + response.output_text.delta\ndata: {\"type\":\"response.output_text.delta\",\"sequence_number\":72,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + filling\",\"logprobs\":[],\"obfuscation\":\"9abtqV40\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":73,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + her\",\"logprobs\":[],\"obfuscation\":\"y3XzC0zitOoY\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":74,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + heart\",\"logprobs\":[],\"obfuscation\":\"t22qzqlwP1\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":75,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + with\",\"logprobs\":[],\"obfuscation\":\"a6BRPSqCiiO\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":76,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + joy\",\"logprobs\":[],\"obfuscation\":\"PrpSwMgv297g\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":77,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + and\",\"logprobs\":[],\"obfuscation\":\"25TlFvWI31Wz\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":78,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + wonder\",\"logprobs\":[],\"obfuscation\":\"wS1TFY5fw\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":79,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + until\",\"logprobs\":[],\"obfuscation\":\"aKT3enYjyO\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":80,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\" + morning\",\"logprobs\":[],\"obfuscation\":\"PEacn7sS\"}\n\nevent: response.output_text.delta\ndata: + {\"type\":\"response.output_text.delta\",\"sequence_number\":81,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"delta\":\".\",\"logprobs\":[],\"obfuscation\":\"Kv5IpzXsfR9pNyj\"}\n\nevent: + response.output_text.done\ndata: {\"type\":\"response.output_text.done\",\"sequence_number\":82,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"text\":\"Once + upon a time, in a enchanted forest, there was a gentle unicorn named Luna + who loved to weave dreams into sparkling stardust. One night, she gathered + all her shimmering magic to create a special dream for a little girl who believed + in kindness and hope. As the girl slept peacefully, Luna\u2019s dreams floated + down like glowing clouds, filling her heart with joy and wonder until morning.\",\"logprobs\":[]}\n\nevent: + response.content_part.done\ndata: {\"type\":\"response.content_part.done\",\"sequence_number\":83,\"item_id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"output_index\":0,\"content_index\":0,\"part\":{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"Once + upon a time, in a enchanted forest, there was a gentle unicorn named Luna + who loved to weave dreams into sparkling stardust. One night, she gathered + all her shimmering magic to create a special dream for a little girl who believed + in kindness and hope. As the girl slept peacefully, Luna\u2019s dreams floated + down like glowing clouds, filling her heart with joy and wonder until morning.\"}}\n\nevent: + response.output_item.done\ndata: {\"type\":\"response.output_item.done\",\"sequence_number\":84,\"output_index\":0,\"item\":{\"id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"type\":\"message\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"Once + upon a time, in a enchanted forest, there was a gentle unicorn named Luna + who loved to weave dreams into sparkling stardust. One night, she gathered + all her shimmering magic to create a special dream for a little girl who believed + in kindness and hope. As the girl slept peacefully, Luna\u2019s dreams floated + down like glowing clouds, filling her heart with joy and wonder until morning.\"}],\"role\":\"assistant\"}}\n\nevent: + response.completed\ndata: {\"type\":\"response.completed\",\"sequence_number\":85,\"response\":{\"id\":\"resp_0fef0f8a68937870006911e9ecf124819491634b434678464a\",\"object\":\"response\",\"created_at\":1762781676,\"status\":\"completed\",\"background\":false,\"error\":null,\"incomplete_details\":null,\"instructions\":null,\"max_output_tokens\":null,\"max_tool_calls\":null,\"model\":\"gpt-4.1-nano-2025-04-14\",\"output\":[{\"id\":\"msg_0fef0f8a68937870006911e9ef0ecc81949d727f28043244eb\",\"type\":\"message\",\"status\":\"completed\",\"content\":[{\"type\":\"output_text\",\"annotations\":[],\"logprobs\":[],\"text\":\"Once + upon a time, in a enchanted forest, there was a gentle unicorn named Luna + who loved to weave dreams into sparkling stardust. One night, she gathered + all her shimmering magic to create a special dream for a little girl who believed + in kindness and hope. As the girl slept peacefully, Luna\u2019s dreams floated + down like glowing clouds, filling her heart with joy and wonder until morning.\"}],\"role\":\"assistant\"}],\"parallel_tool_calls\":true,\"previous_response_id\":null,\"prompt_cache_key\":null,\"prompt_cache_retention\":null,\"reasoning\":{\"effort\":null,\"summary\":null},\"safety_identifier\":null,\"service_tier\":\"default\",\"store\":true,\"temperature\":1.0,\"text\":{\"format\":{\"type\":\"text\"},\"verbosity\":\"medium\"},\"tool_choice\":\"auto\",\"tools\":[],\"top_logprobs\":0,\"top_p\":1.0,\"truncation\":\"disabled\",\"usage\":{\"input_tokens\":18,\"input_tokens_details\":{\"cached_tokens\":0},\"output_tokens\":79,\"output_tokens_details\":{\"reasoning_tokens\":0},\"total_tokens\":97},\"user\":null,\"metadata\":{}}}\n\n" + headers: + CF-RAY: + - 99c5eda3b952f169-TLV + Connection: + - keep-alive + Content-Type: + - text/event-stream; charset=utf-8 + Date: + - Mon, 10 Nov 2025 13:34:37 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=Ck6dIIFTEEW2blYC07a.v6tgOYJNYPaVnVuCcyVE43g-1762781677-1.0.1.1-YFBcIH7RD4dv3Ernkalfwjg7J8hzWrDRP3Q7cT_E6uG5dhH4KBDQRBIJd8bK_a9sfHIdx_pCMhehmSLnr7nDBn8AS6HJzAEdUBgu6NuNp4E; + path=/; expires=Mon, 10-Nov-25 14:04:37 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=6FPEAkNUcrt3t6e22fJO8jdURmpnxYecbqDhuAHAlT0-1762781677124-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - traceloop + openai-processing-ms: + - '125' + openai-project: + - proj_tzz1TbPPOXaf6j9tEkVUBIAa + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '145' + x-request-id: + - req_8aaafe2ba53f497aae7ac48db4433038 + status: + code: 200 + message: OK +version: 1 diff --git a/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_async.yaml b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_async.yaml new file mode 100644 index 0000000000..e175b9569c --- /dev/null +++ b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_async.yaml @@ -0,0 +1,591 @@ +interactions: +- request: + body: '{"input":"Tell me a three sentence bedtime story about a unicorn.","model":"gpt-4.1-nano","stream":true}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '104' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.97.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.97.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.10.16 + method: POST + uri: https://api.openai.com/v1/responses + response: + body: + string: 'event: response.created + + data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_06d9044b13184730006911ea372f048190aabddea38a3fc299","object":"response","created_at":1762781751,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.in_progress + + data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_06d9044b13184730006911ea372f048190aabddea38a3fc299","object":"response","created_at":1762781751,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.output_item.added + + data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","type":"message","status":"in_progress","content":[],"role":"assistant"}} + + + event: response.content_part.added + + data: {"type":"response.content_part.added","sequence_number":3,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""}} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":4,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":"Once","logprobs":[],"obfuscation":"Rj88U0hLZ9YI"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":5,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + upon","logprobs":[],"obfuscation":"30N5oGrHdBg"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":6,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + a","logprobs":[],"obfuscation":"1GKZ9Wrmor6HvA"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":7,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + time","logprobs":[],"obfuscation":"I1n9Kt37NsX"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":8,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"dTaQFO01iAC78Ln"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":9,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + in","logprobs":[],"obfuscation":"GezdIeWJ40wX5"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":10,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + a","logprobs":[],"obfuscation":"82dO8OBkJTz0sx"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":11,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + magical","logprobs":[],"obfuscation":"uoMisUcW"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":12,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + forest","logprobs":[],"obfuscation":"mJMDEvGry"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":13,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"7me5JgT8SyeuYld"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":14,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + there","logprobs":[],"obfuscation":"ZxhJRz2ON0"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":15,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + was","logprobs":[],"obfuscation":"V7ZqdFtW35Wk"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":16,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + a","logprobs":[],"obfuscation":"bCj3hDo9oSxYWX"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":17,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + gentle","logprobs":[],"obfuscation":"ejZPZtvBu"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":18,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + unicorn","logprobs":[],"obfuscation":"fniYUCTE"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":19,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + named","logprobs":[],"obfuscation":"QxfG7TD9an"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":20,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + Luna","logprobs":[],"obfuscation":"G71JY5MQSys"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":21,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + who","logprobs":[],"obfuscation":"3ENhjJFN5CSt"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":22,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + loved","logprobs":[],"obfuscation":"X3kbJkGeJ6"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":23,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + to","logprobs":[],"obfuscation":"qKKpXvFV9NiFe"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":24,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + bring","logprobs":[],"obfuscation":"flDsrGj8oy"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":25,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + spark","logprobs":[],"obfuscation":"JrLkndfEjJ"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":26,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":"les","logprobs":[],"obfuscation":"UAHQStfyLKIgQ"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":27,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + of","logprobs":[],"obfuscation":"8Upv81ntdbpgI"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":28,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + happiness","logprobs":[],"obfuscation":"T7EWh3"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":29,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + wherever","logprobs":[],"obfuscation":"MONXaDx"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":30,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + she","logprobs":[],"obfuscation":"Gl1L0lSu6f0Q"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":31,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + went","logprobs":[],"obfuscation":"uBZhppkimEx"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":32,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":".","logprobs":[],"obfuscation":"S7RqBBbIycLkaaP"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":33,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + One","logprobs":[],"obfuscation":"IQJlB8npiQxN"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":34,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + evening","logprobs":[],"obfuscation":"oqjdhL8L"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":35,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"BoUyMYutGwgFO0q"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":36,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + she","logprobs":[],"obfuscation":"dU27do5TGCDq"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":37,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + discovered","logprobs":[],"obfuscation":"3jukg"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":38,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + a","logprobs":[],"obfuscation":"2EPe1gsRVkrbOx"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":39,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + lonely","logprobs":[],"obfuscation":"69gzxV9JG"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":40,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + star","logprobs":[],"obfuscation":"0gD3wbn7v77"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":41,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + fallen","logprobs":[],"obfuscation":"5UVGVyGib"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":42,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + from","logprobs":[],"obfuscation":"u0pNcSUq5um"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":43,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + the","logprobs":[],"obfuscation":"OOA2TOPyMUVY"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":44,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + sky","logprobs":[],"obfuscation":"sHaJi8eWaiin"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":45,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + and","logprobs":[],"obfuscation":"DJthqHqkQiei"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":46,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + gently","logprobs":[],"obfuscation":"Crys85cAH"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":47,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + guided","logprobs":[],"obfuscation":"Nh9QtKvNH"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":48,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + it","logprobs":[],"obfuscation":"iQsq5JRYodQq5"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":49,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + back","logprobs":[],"obfuscation":"0M7TWaOnXp9"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":50,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + home","logprobs":[],"obfuscation":"xK6Me1sEqJm"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":51,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + with","logprobs":[],"obfuscation":"xC7hZx3bIiu"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":52,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + her","logprobs":[],"obfuscation":"n5t5wlNJ8FuQ"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":53,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + shimmering","logprobs":[],"obfuscation":"yQQbn"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":54,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + horn","logprobs":[],"obfuscation":"6YeMZUr8tN1"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":55,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":".","logprobs":[],"obfuscation":"SW3Ko985lnI1ySf"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":56,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + As","logprobs":[],"obfuscation":"WdoUUv0JfkZjt"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":57,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + Luna","logprobs":[],"obfuscation":"QQJ8pPWioEO"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":58,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + returned","logprobs":[],"obfuscation":"7eDkrBY"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":59,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + to","logprobs":[],"obfuscation":"8tJQLyVdOH2Mf"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":60,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + her","logprobs":[],"obfuscation":"AVZ6uXpvSDwq"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":61,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + cozy","logprobs":[],"obfuscation":"zwtf1B0UA55"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":62,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + meadow","logprobs":[],"obfuscation":"0eJa5WDqm"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":63,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"gE3KGRcBYPKuzoZ"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":64,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + she","logprobs":[],"obfuscation":"Uk7Zq89qCPEE"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":65,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + knew","logprobs":[],"obfuscation":"s4EpZEaVU1E"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":66,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + that","logprobs":[],"obfuscation":"NxdzZFJXAkd"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":67,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + kindness","logprobs":[],"obfuscation":"mYXVnKn"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":68,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + and","logprobs":[],"obfuscation":"ZRqj1ICwoXCE"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":69,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + courage","logprobs":[],"obfuscation":"HwTttTEG"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":70,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + could","logprobs":[],"obfuscation":"LmCBocrrii"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":71,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + make","logprobs":[],"obfuscation":"ndlbS2GfqoS"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":72,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + even","logprobs":[],"obfuscation":"2qoMvbUdqNb"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":73,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + the","logprobs":[],"obfuscation":"Q5PaKNnCeQv6"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":74,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + darkest","logprobs":[],"obfuscation":"z10ID2PJ"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":75,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + night","logprobs":[],"obfuscation":"SGfZaC2hah"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":76,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + sparkle","logprobs":[],"obfuscation":"qk7bfXtV"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":77,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + with","logprobs":[],"obfuscation":"vL2okv6oisj"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":78,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":" + wonder","logprobs":[],"obfuscation":"diPbSP0F6"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":79,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"delta":".","logprobs":[],"obfuscation":"FifrXq3zcNGZLEB"} + + + event: response.output_text.done + + data: {"type":"response.output_text.done","sequence_number":80,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"text":"Once + upon a time, in a magical forest, there was a gentle unicorn named Luna who + loved to bring sparkles of happiness wherever she went. One evening, she discovered + a lonely star fallen from the sky and gently guided it back home with her + shimmering horn. As Luna returned to her cozy meadow, she knew that kindness + and courage could make even the darkest night sparkle with wonder.","logprobs":[]} + + + event: response.content_part.done + + data: {"type":"response.content_part.done","sequence_number":81,"item_id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Once + upon a time, in a magical forest, there was a gentle unicorn named Luna who + loved to bring sparkles of happiness wherever she went. One evening, she discovered + a lonely star fallen from the sky and gently guided it back home with her + shimmering horn. As Luna returned to her cozy meadow, she knew that kindness + and courage could make even the darkest night sparkle with wonder."}} + + + event: response.output_item.done + + data: {"type":"response.output_item.done","sequence_number":82,"output_index":0,"item":{"id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Once + upon a time, in a magical forest, there was a gentle unicorn named Luna who + loved to bring sparkles of happiness wherever she went. One evening, she discovered + a lonely star fallen from the sky and gently guided it back home with her + shimmering horn. As Luna returned to her cozy meadow, she knew that kindness + and courage could make even the darkest night sparkle with wonder."}],"role":"assistant"}} + + + event: response.completed + + data: {"type":"response.completed","sequence_number":83,"response":{"id":"resp_06d9044b13184730006911ea372f048190aabddea38a3fc299","object":"response","created_at":1762781751,"status":"completed","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[{"id":"msg_06d9044b13184730006911ea38edf48190ac5ce95742dede19","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Once + upon a time, in a magical forest, there was a gentle unicorn named Luna who + loved to bring sparkles of happiness wherever she went. One evening, she discovered + a lonely star fallen from the sky and gently guided it back home with her + shimmering horn. As Luna returned to her cozy meadow, she knew that kindness + and courage could make even the darkest night sparkle with wonder."}],"role":"assistant"}],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":18,"input_tokens_details":{"cached_tokens":0},"output_tokens":77,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":95},"user":null,"metadata":{}}} + + + ' + headers: + CF-RAY: + - 99c5ef754ae7c222-TLV + Connection: + - keep-alive + Content-Type: + - text/event-stream; charset=utf-8 + Date: + - Mon, 10 Nov 2025 13:35:51 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=5_pOd0XU1akbVTKq80Cn78_ORQ_CjRF4L2vpJjW45X8-1762781751-1.0.1.1-obir0TPbkwmdK5jlLsOpPB4kR8uL2WW.PN6aybNCuYgOvxS..V84zVBWv7_XGZCDc4LAimbC2L7o2lSrHNaGkkG0Mo6a13atTYCzExRQs1Q; + path=/; expires=Mon, 10-Nov-25 14:05:51 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=W9rFmLvYsxeMYYraCxoYhOxkDlhrSmwPT_ULGDccY4E-1762781751310-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - traceloop + openai-processing-ms: + - '64' + openai-project: + - proj_tzz1TbPPOXaf6j9tEkVUBIAa + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '76' + x-request-id: + - req_0c2d367f76df4e5fb864de35759f06dc + status: + code: 200 + message: OK +version: 1 diff --git a/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_async_with_context_manager.yaml b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_async_with_context_manager.yaml new file mode 100644 index 0000000000..2f57629b4c --- /dev/null +++ b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_async_with_context_manager.yaml @@ -0,0 +1,202 @@ +interactions: +- request: + body: '{"input":"Count to 5","model":"gpt-4.1-nano","stream":true}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '59' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - AsyncOpenAI/Python 1.97.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - async:asyncio + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.97.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.10.16 + method: POST + uri: https://api.openai.com/v1/responses + response: + body: + string: 'event: response.created + + data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_06bbedfc9588dfa50069120b6638f88195ac87ed4b1b0c5a5d","object":"response","created_at":1762790246,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.in_progress + + data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_06bbedfc9588dfa50069120b6638f88195ac87ed4b1b0c5a5d","object":"response","created_at":1762790246,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.output_item.added + + data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","type":"message","status":"in_progress","content":[],"role":"assistant"}} + + + event: response.content_part.added + + data: {"type":"response.content_part.added","sequence_number":3,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""}} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":4,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":"1","logprobs":[],"obfuscation":"OtpKAQZUvxYELIr"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":5,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"5yb5nyHooovqsjX"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":6,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"uOkbIvhIK21c5hl"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":7,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":"2","logprobs":[],"obfuscation":"Jmv3NwXEzyrv66E"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":8,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"4jip1bejdu6PzaI"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":9,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"tsn9Dxd2M84osEV"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":10,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":"3","logprobs":[],"obfuscation":"96Ffi5i6UfUCcQv"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":11,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"9QljGwOk47JPZ9V"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":12,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"W4cCKfXx8cplDN3"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":13,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":"4","logprobs":[],"obfuscation":"3rTkoLTUDWpRwO8"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":14,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"lR73dp3f8HdnaFP"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":15,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"bTHq6kS3Rv9TbN5"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":16,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":"5","logprobs":[],"obfuscation":"FjhsTlyqvnbKSQd"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":17,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"delta":".","logprobs":[],"obfuscation":"9q11RFXdP9eHNeu"} + + + event: response.output_text.done + + data: {"type":"response.output_text.done","sequence_number":18,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"text":"1, + 2, 3, 4, 5.","logprobs":[]} + + + event: response.content_part.done + + data: {"type":"response.content_part.done","sequence_number":19,"item_id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"1, + 2, 3, 4, 5."}} + + + event: response.output_item.done + + data: {"type":"response.output_item.done","sequence_number":20,"output_index":0,"item":{"id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, + 2, 3, 4, 5."}],"role":"assistant"}} + + + event: response.completed + + data: {"type":"response.completed","sequence_number":21,"response":{"id":"resp_06bbedfc9588dfa50069120b6638f88195ac87ed4b1b0c5a5d","object":"response","created_at":1762790246,"status":"completed","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[{"id":"msg_06bbedfc9588dfa50069120b66dae081958f547d51a59f9408","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, + 2, 3, 4, 5."}],"role":"assistant"}],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":11,"input_tokens_details":{"cached_tokens":0},"output_tokens":15,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":26},"user":null,"metadata":{}}} + + + ' + headers: + CF-RAY: + - 99c6bed9de609d70-TLV + Connection: + - keep-alive + Content-Type: + - text/event-stream; charset=utf-8 + Date: + - Mon, 10 Nov 2025 15:57:26 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=_NpKygkSLXFPwbkbJh1kPjOmcfglSOToXULEjqFd7eI-1762790246-1.0.1.1-QnN5sWUEzWjji0KEj0.RmSbsc.MKV6f3rp65ic3FFQ9tt2.5c9QA4YOCWZ8rM8t2U4W9kSDbVHkXfSjJZSMVqzz0TcX37e9iXHQVH4OfXi0; + path=/; expires=Mon, 10-Nov-25 16:27:26 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=ZLSDXIx0sGLBXd4dxkroLweqLOUxQNmVRwoHxiqBHV8-1762790246344-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - traceloop + openai-processing-ms: + - '46' + openai-project: + - proj_tzz1TbPPOXaf6j9tEkVUBIAa + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '53' + x-request-id: + - req_932db66f4c2b4496a49ec807345006c1 + status: + code: 200 + message: OK +version: 1 diff --git a/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_with_content.yaml b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_with_content.yaml new file mode 100644 index 0000000000..457f9d2c24 --- /dev/null +++ b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_with_content.yaml @@ -0,0 +1,172 @@ +interactions: +- request: + body: '{"input":"What is 2+2?","model":"gpt-4.1-nano","stream":true}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '61' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.97.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.97.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.10.16 + method: POST + uri: https://api.openai.com/v1/responses + response: + body: + string: 'event: response.created + + data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_087a1bffb8180cc4006912065042e08196a1a6445d62480120","object":"response","created_at":1762788944,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.in_progress + + data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_087a1bffb8180cc4006912065042e08196a1a6445d62480120","object":"response","created_at":1762788944,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.output_item.added + + data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","type":"message","status":"in_progress","content":[],"role":"assistant"}} + + + event: response.content_part.added + + data: {"type":"response.content_part.added","sequence_number":3,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""}} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":4,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":"2","logprobs":[],"obfuscation":"NBbiCoB2yJyshvQ"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":5,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":" + +","logprobs":[],"obfuscation":"ScF0vzdDoj56VY"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":6,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"DNDgcE1FmTYazsx"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":7,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":"2","logprobs":[],"obfuscation":"tb7IgHxxaZGhhfK"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":8,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":" + equals","logprobs":[],"obfuscation":"n2jBlV5bR"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":9,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"6b0tyCSq6HwaEOD"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":10,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":"4","logprobs":[],"obfuscation":"f2KWFcSvQWpnGqG"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":11,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"delta":".","logprobs":[],"obfuscation":"xIRR7cmTFdDcyLd"} + + + event: response.output_text.done + + data: {"type":"response.output_text.done","sequence_number":12,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"text":"2 + + 2 equals 4.","logprobs":[]} + + + event: response.content_part.done + + data: {"type":"response.content_part.done","sequence_number":13,"item_id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"2 + + 2 equals 4."}} + + + event: response.output_item.done + + data: {"type":"response.output_item.done","sequence_number":14,"output_index":0,"item":{"id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"2 + + 2 equals 4."}],"role":"assistant"}} + + + event: response.completed + + data: {"type":"response.completed","sequence_number":15,"response":{"id":"resp_087a1bffb8180cc4006912065042e08196a1a6445d62480120","object":"response","created_at":1762788944,"status":"completed","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[{"id":"msg_087a1bffb8180cc40069120650b3e08196921c90ad59e694eb","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"2 + + 2 equals 4."}],"role":"assistant"}],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":14,"input_tokens_details":{"cached_tokens":0},"output_tokens":9,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":23},"user":null,"metadata":{}}} + + + ' + headers: + CF-RAY: + - 99c69f14e92dc21d-TLV + Connection: + - keep-alive + Content-Type: + - text/event-stream; charset=utf-8 + Date: + - Mon, 10 Nov 2025 15:35:44 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=5_9aSbfWS.NCucVt7.GGTqm_rWC_laokzAs_eHsXR04-1762788944-1.0.1.1-sCokamvSbbuGB2vFVpMIdkQw7N1afbcEiSInhvbOSHykuMOU16XjhZxFFL6SAF9S8r3D1vvfE2_lvxq3gMP.7yUEr18LeEFTcvuclrIoWPk; + path=/; expires=Mon, 10-Nov-25 16:05:44 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=06mqIpxDifWagnuWrD7gXTnxIj2p9Kxd_u9GgoIEHvs-1762788944386-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - traceloop + openai-processing-ms: + - '47' + openai-project: + - proj_tzz1TbPPOXaf6j9tEkVUBIAa + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '55' + x-request-id: + - req_9f7e3f41a2a14704a45eaa9ad864042f + status: + code: 200 + message: OK +version: 1 diff --git a/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_with_context_manager.yaml b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_with_context_manager.yaml new file mode 100644 index 0000000000..956db0b9f3 --- /dev/null +++ b/packages/opentelemetry-instrumentation-openai/tests/traces/cassettes/test_responses/test_responses_streaming_with_context_manager.yaml @@ -0,0 +1,202 @@ +interactions: +- request: + body: '{"input":"Count to 5","model":"gpt-4.1-nano","stream":true}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + connection: + - keep-alive + content-length: + - '59' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.97.1 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 1.97.1 + x-stainless-read-timeout: + - '600' + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.10.16 + method: POST + uri: https://api.openai.com/v1/responses + response: + body: + string: 'event: response.created + + data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_0786f8f250c4d4490069120b29c9fc8190b5baaafc87431406","object":"response","created_at":1762790185,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.in_progress + + data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_0786f8f250c4d4490069120b29c9fc8190b5baaafc87431406","object":"response","created_at":1762790185,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} + + + event: response.output_item.added + + data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","type":"message","status":"in_progress","content":[],"role":"assistant"}} + + + event: response.content_part.added + + data: {"type":"response.content_part.added","sequence_number":3,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""}} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":4,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":"1","logprobs":[],"obfuscation":"pgN6OMeaej1652d"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":5,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"wei6ivi5HKisqLP"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":6,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"OGvKNqZwtScYkNQ"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":7,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":"2","logprobs":[],"obfuscation":"Y44yIKIokka8qvW"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":8,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"bzE8wsUxQSRfpp3"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":9,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"WKWVNkvn76VGYiv"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":10,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":"3","logprobs":[],"obfuscation":"xEP9JLZli10Bir3"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":11,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"tRGxyH6ho3LwHpb"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":12,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"E5qqQji2n7FH2qr"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":13,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":"4","logprobs":[],"obfuscation":"4RYC0qbZ5Dq3oiy"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":14,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":",","logprobs":[],"obfuscation":"EFHjP0Yb3Rk3jIV"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":15,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":" + ","logprobs":[],"obfuscation":"bC9B5v7mduSzzPC"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":16,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":"5","logprobs":[],"obfuscation":"dZAUTI7M37SeO9c"} + + + event: response.output_text.delta + + data: {"type":"response.output_text.delta","sequence_number":17,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"delta":".","logprobs":[],"obfuscation":"j5u7PchqlB4MWbv"} + + + event: response.output_text.done + + data: {"type":"response.output_text.done","sequence_number":18,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"text":"1, + 2, 3, 4, 5.","logprobs":[]} + + + event: response.content_part.done + + data: {"type":"response.content_part.done","sequence_number":19,"item_id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"1, + 2, 3, 4, 5."}} + + + event: response.output_item.done + + data: {"type":"response.output_item.done","sequence_number":20,"output_index":0,"item":{"id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, + 2, 3, 4, 5."}],"role":"assistant"}} + + + event: response.completed + + data: {"type":"response.completed","sequence_number":21,"response":{"id":"resp_0786f8f250c4d4490069120b29c9fc8190b5baaafc87431406","object":"response","created_at":1762790185,"status":"completed","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","output":[{"id":"msg_0786f8f250c4d4490069120b2a73648190a01076e12501bc76","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"1, + 2, 3, 4, 5."}],"role":"assistant"}],"parallel_tool_calls":true,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":11,"input_tokens_details":{"cached_tokens":0},"output_tokens":15,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":26},"user":null,"metadata":{}}} + + + ' + headers: + CF-RAY: + - 99c6bd5fbf32c224-TLV + Connection: + - keep-alive + Content-Type: + - text/event-stream; charset=utf-8 + Date: + - Mon, 10 Nov 2025 15:56:25 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=d7y.B185um7UCNRRdUgGW_Q.n327sVRHX0Co0ugmtvw-1762790185-1.0.1.1-xJ5tQYNXxZm_W7b5WvnUXizd6f6AzEWyBq5kgZHjgdv_q8SMedZ8FVv6ayhcEg2dFNGD0X0c8TnV0CsN9DrskjYCF8M9vy5GdMiCF.XUAO4; + path=/; expires=Mon, 10-Nov-25 16:26:25 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=JhGSjG4AfYUW_Lht3Y9BWMPrZwmeJoEeiDcVZtgFAv0-1762790185941-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + alt-svc: + - h3=":443"; ma=86400 + cf-cache-status: + - DYNAMIC + openai-organization: + - traceloop + openai-processing-ms: + - '91' + openai-project: + - proj_tzz1TbPPOXaf6j9tEkVUBIAa + openai-version: + - '2020-10-01' + x-envoy-upstream-service-time: + - '109' + x-request-id: + - req_02033a0228284320850799ba53b6777b + status: + code: 200 + message: OK +version: 1 diff --git a/packages/opentelemetry-instrumentation-openai/tests/traces/test_responses.py b/packages/opentelemetry-instrumentation-openai/tests/traces/test_responses.py index 7a0b6d8618..3d329f615c 100644 --- a/packages/opentelemetry-instrumentation-openai/tests/traces/test_responses.py +++ b/packages/opentelemetry-instrumentation-openai/tests/traces/test_responses.py @@ -1,13 +1,14 @@ - import pytest -from openai import OpenAI +from openai import AsyncOpenAI, OpenAI from opentelemetry.instrumentation.openai.utils import is_reasoning_supported from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter @pytest.mark.vcr -def test_responses(instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI): +def test_responses( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): _ = openai_client.responses.create( model="gpt-4.1-nano", input="What is the capital of France?", @@ -26,7 +27,9 @@ def test_responses(instrument_legacy, span_exporter: InMemorySpanExporter, opena @pytest.mark.vcr -def test_responses_with_input_history(instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI): +def test_responses_with_input_history( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): user_message = "Come up with an adjective in English. Respond with just one word." first_response = openai_client.responses.create( model="gpt-4.1-nano", @@ -79,7 +82,9 @@ def test_responses_with_input_history(instrument_legacy, span_exporter: InMemory @pytest.mark.vcr -def test_responses_tool_calls(instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI): +def test_responses_tool_calls( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): tools = [ { "type": "function", @@ -90,11 +95,11 @@ def test_responses_tool_calls(instrument_legacy, span_exporter: InMemorySpanExpo "properties": { "location": { "type": "string", - "description": "The city and state, e.g. San Francisco, CA" + "description": "The city and state, e.g. San Francisco, CA", } }, - "required": ["location"] - } + "required": ["location"], + }, } ] openai_client.responses.create( @@ -103,11 +108,11 @@ def test_responses_tool_calls(instrument_legacy, span_exporter: InMemorySpanExpo { "type": "message", "role": "user", - "content": "What's the weather in London?" + "content": "What's the weather in London?", } ], tools=tools, - tool_choice="auto" + tool_choice="auto", ) spans = span_exporter.get_finished_spans() @@ -145,16 +150,17 @@ def test_responses_tool_calls(instrument_legacy, span_exporter: InMemorySpanExpo @pytest.mark.vcr -@pytest.mark.skipif(not is_reasoning_supported(), - reason="Reasoning is not supported in older OpenAI library versions") -def test_responses_reasoning(instrument_legacy, span_exporter: InMemorySpanExporter, - openai_client: OpenAI): +@pytest.mark.skipif( + not is_reasoning_supported(), + reason="Reasoning is not supported in older OpenAI library versions", +) +def test_responses_reasoning( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): openai_client.responses.create( model="gpt-5-nano", input="Count r's in strawberry", - reasoning={ - "effort": "low", "summary": None - }, + reasoning={"effort": "low", "summary": None}, ) spans = span_exporter.get_finished_spans() @@ -172,18 +178,18 @@ def test_responses_reasoning(instrument_legacy, span_exporter: InMemorySpanExpor @pytest.mark.vcr -@pytest.mark.skipif(not is_reasoning_supported(), - reason="Reasoning is not supported in older OpenAI library versions") -def test_responses_reasoning_dict_issue(instrument_legacy, span_exporter: InMemorySpanExporter, - openai_client: OpenAI): +@pytest.mark.skipif( + not is_reasoning_supported(), + reason="Reasoning is not supported in older OpenAI library versions", +) +def test_responses_reasoning_dict_issue( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): """Test for issue #3350 - reasoning dict causing invalid type warning""" openai_client.responses.create( model="gpt-5-nano", input="Explain why the sky is blue", - reasoning={ - "effort": "medium", - "summary": "auto" - }, + reasoning={"effort": "medium", "summary": "auto"}, ) spans = span_exporter.get_finished_spans() @@ -191,14 +197,190 @@ def test_responses_reasoning_dict_issue(instrument_legacy, span_exporter: InMemo span = spans[0] # Verify the reasoning attributes are properly set without causing warnings - # assert span.attributes["gen_ai.request.reasoning_effort"] == "medium" - # assert span.attributes["gen_ai.request.reasoning_summary"] == "auto" - # This should not cause an "Invalid type dict" warning and should contain serialized reasoning - assert "gen_ai.completion.0.reasoning" not in span.attributes + # The main goal of this test is to ensure that when the API returns reasoning data + # as a dict/list, it gets properly serialized as JSON without causing "Invalid type" warnings + # The reasoning should be serialized as JSON since it contains complex data - # reasoning_attr = span.attributes["gen_ai.completion.0.reasoning"] - # assert isinstance(reasoning_attr, str) + reasoning_attr = span.attributes["gen_ai.completion.0.reasoning"] + assert isinstance(reasoning_attr, str), "Reasoning should be serialized as a string" + # Should be valid JSON containing reasoning summary data - # import json - # parsed_reasoning = json.loads(reasoning_attr) - # assert isinstance(parsed_reasoning, (dict, list)) # Could be dict or list depending on response structure + import json + + parsed_reasoning = json.loads(reasoning_attr) + assert isinstance( + parsed_reasoning, (dict, list) + ), "Reasoning should be a dict or list structure" + + +@pytest.mark.vcr +def test_responses_streaming( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): + """Test for streaming responses.create() - reproduces customer issue""" + input_text = "Tell me a three sentence bedtime story about a unicorn." + stream = openai_client.responses.create( + model="gpt-4.1-nano", + input=input_text, + stream=True, + ) + + # Consume the stream + full_text = "" + for item in stream: + if hasattr(item, "type") and item.type == "response.output_text.delta": + if hasattr(item, "delta") and item.delta: + full_text += item.delta + elif hasattr(item, "delta") and item.delta: + if hasattr(item.delta, "text") and item.delta.text: + full_text += item.delta.text + + spans = span_exporter.get_finished_spans() + assert len(spans) == 1, f"Expected 1 span but got {len(spans)}" + + span = spans[0] + assert span.name == "openai.response" + assert span.attributes["gen_ai.system"] == "openai" + assert span.attributes["gen_ai.request.model"] == "gpt-4.1-nano" + assert span.attributes["gen_ai.response.model"] == "gpt-4.1-nano-2025-04-14" + assert full_text != "", "Should have received streaming content" + assert span.attributes["gen_ai.prompt.0.content"] == input_text + assert span.attributes["gen_ai.prompt.0.role"] == "user" + assert span.attributes["gen_ai.completion.0.role"] == "assistant" + assert span.attributes["gen_ai.completion.0.content"] == full_text + + +@pytest.mark.vcr +@pytest.mark.asyncio +async def test_responses_streaming_async( + instrument_legacy, span_exporter: InMemorySpanExporter, async_openai_client +): + """Test for async streaming responses.create() - reproduces customer issue""" + input_text = "Tell me a three sentence bedtime story about a unicorn." + stream = await async_openai_client.responses.create( + model="gpt-4.1-nano", + input=input_text, + stream=True, + ) + + full_text = "" + async for item in stream: + if hasattr(item, "type") and item.type == "response.output_text.delta": + if hasattr(item, "delta") and item.delta: + full_text += item.delta + elif hasattr(item, "delta") and item.delta: + if hasattr(item.delta, "text") and item.delta.text: + full_text += item.delta.text + + spans = span_exporter.get_finished_spans() + assert len(spans) == 1, f"Expected 1 span but got {len(spans)}" + + span = spans[0] + assert span.name == "openai.response" + assert span.attributes["gen_ai.system"] == "openai" + assert span.attributes["gen_ai.request.model"] == "gpt-4.1-nano" + assert full_text != "", "Should have received streaming content" + assert span.attributes["gen_ai.prompt.0.content"] == input_text + assert span.attributes["gen_ai.prompt.0.role"] == "user" + assert span.attributes["gen_ai.completion.0.role"] == "assistant" + assert span.attributes["gen_ai.completion.0.content"] == full_text + + +@pytest.mark.vcr +def test_responses_streaming_with_content( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): + """Test streaming with content tracing - verifies prompts and completions are captured""" + input_text = "What is 2+2?" + stream = openai_client.responses.create( + model="gpt-4.1-nano", + input=input_text, + stream=True, + ) + + # Consume the stream + full_text = "" + for item in stream: + if hasattr(item, "type") and item.type == "response.output_text.delta": + if hasattr(item, "delta") and item.delta: + full_text += item.delta + + spans = span_exporter.get_finished_spans() + assert len(spans) == 1 + + span = spans[0] + assert span.name == "openai.response" + assert span.attributes["gen_ai.system"] == "openai" + assert span.attributes["gen_ai.request.model"] == "gpt-4.1-nano" + assert full_text != "", "Should have received streaming content" + assert span.attributes["gen_ai.prompt.0.content"] == input_text + assert span.attributes["gen_ai.prompt.0.role"] == "user" + assert span.attributes["gen_ai.completion.0.role"] == "assistant" + assert span.attributes["gen_ai.completion.0.content"] == full_text + + +@pytest.mark.vcr +def test_responses_streaming_with_context_manager( + instrument_legacy, span_exporter: InMemorySpanExporter, openai_client: OpenAI +): + """Test streaming responses using context manager (with statement)""" + input_text = "Count to 5" + full_text = "" + + with openai_client.responses.create( + model="gpt-4.1-nano", + input=input_text, + stream=True, + ) as stream: + for chunk in stream: + if chunk.type == "response.output_text.delta": + full_text += chunk.delta + + spans = span_exporter.get_finished_spans() + assert len(spans) == 1 + + span = spans[0] + assert span.name == "openai.response" + assert span.attributes["gen_ai.system"] == "openai" + assert span.attributes["gen_ai.request.model"] == "gpt-4.1-nano" + assert full_text != "", "Should have received streaming content" + assert span.attributes["gen_ai.prompt.0.content"] == input_text + assert span.attributes["gen_ai.prompt.0.role"] == "user" + assert span.attributes["gen_ai.completion.0.role"] == "assistant" + assert span.attributes["gen_ai.completion.0.content"] == full_text + + +@pytest.mark.vcr +@pytest.mark.asyncio +async def test_responses_streaming_async_with_context_manager( + instrument_legacy, + span_exporter: InMemorySpanExporter, + async_openai_client: AsyncOpenAI, +): + """Test async streaming responses using context manager (async with statement)""" + input_text = "Count to 5" + full_text = "" + + stream = await async_openai_client.responses.create( + model="gpt-4.1-nano", + input=input_text, + stream=True, + ) + + async with stream: + async for chunk in stream: + if chunk.type == "response.output_text.delta": + full_text += chunk.delta + + spans = span_exporter.get_finished_spans() + assert len(spans) == 1 + + span = spans[0] + assert span.name == "openai.response" + assert span.attributes["gen_ai.system"] == "openai" + assert span.attributes["gen_ai.request.model"] == "gpt-4.1-nano" + assert full_text != "", "Should have received streaming content" + assert span.attributes["gen_ai.prompt.0.content"] == input_text + assert span.attributes["gen_ai.prompt.0.role"] == "user" + assert span.attributes["gen_ai.completion.0.role"] == "assistant" + assert span.attributes["gen_ai.completion.0.content"] == full_text