1-
21import pytest
32
43from openai import OpenAI
76
87
98@pytest .mark .vcr
10- def test_responses (instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI ):
9+ def test_responses (
10+ instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI
11+ ):
1112 _ = openai_client .responses .create (
1213 model = "gpt-4.1-nano" ,
1314 input = "What is the capital of France?" ,
@@ -26,7 +27,9 @@ def test_responses(instrument_legacy, span_exporter: InMemorySpanExporter, opena
2627
2728
2829@pytest .mark .vcr
29- def test_responses_with_input_history (instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI ):
30+ def test_responses_with_input_history (
31+ instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI
32+ ):
3033 user_message = "Come up with an adjective in English. Respond with just one word."
3134 first_response = openai_client .responses .create (
3235 model = "gpt-4.1-nano" ,
@@ -79,7 +82,9 @@ def test_responses_with_input_history(instrument_legacy, span_exporter: InMemory
7982
8083
8184@pytest .mark .vcr
82- def test_responses_tool_calls (instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI ):
85+ def test_responses_tool_calls (
86+ instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI
87+ ):
8388 tools = [
8489 {
8590 "type" : "function" ,
@@ -90,11 +95,11 @@ def test_responses_tool_calls(instrument_legacy, span_exporter: InMemorySpanExpo
9095 "properties" : {
9196 "location" : {
9297 "type" : "string" ,
93- "description" : "The city and state, e.g. San Francisco, CA"
98+ "description" : "The city and state, e.g. San Francisco, CA" ,
9499 }
95100 },
96- "required" : ["location" ]
97- }
101+ "required" : ["location" ],
102+ },
98103 }
99104 ]
100105 openai_client .responses .create (
@@ -103,11 +108,11 @@ def test_responses_tool_calls(instrument_legacy, span_exporter: InMemorySpanExpo
103108 {
104109 "type" : "message" ,
105110 "role" : "user" ,
106- "content" : "What's the weather in London?"
111+ "content" : "What's the weather in London?" ,
107112 }
108113 ],
109114 tools = tools ,
110- tool_choice = "auto"
115+ tool_choice = "auto" ,
111116 )
112117
113118 spans = span_exporter .get_finished_spans ()
@@ -145,16 +150,17 @@ def test_responses_tool_calls(instrument_legacy, span_exporter: InMemorySpanExpo
145150
146151
147152@pytest .mark .vcr
148- @pytest .mark .skipif (not is_reasoning_supported (),
149- reason = "Reasoning is not supported in older OpenAI library versions" )
150- def test_responses_reasoning (instrument_legacy , span_exporter : InMemorySpanExporter ,
151- openai_client : OpenAI ):
153+ @pytest .mark .skipif (
154+ not is_reasoning_supported (),
155+ reason = "Reasoning is not supported in older OpenAI library versions" ,
156+ )
157+ def test_responses_reasoning (
158+ instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI
159+ ):
152160 openai_client .responses .create (
153161 model = "gpt-5-nano" ,
154162 input = "Count r's in strawberry" ,
155- reasoning = {
156- "effort" : "low" , "summary" : None
157- },
163+ reasoning = {"effort" : "low" , "summary" : None },
158164 )
159165
160166 spans = span_exporter .get_finished_spans ()
@@ -172,18 +178,18 @@ def test_responses_reasoning(instrument_legacy, span_exporter: InMemorySpanExpor
172178
173179
174180@pytest .mark .vcr
175- @pytest .mark .skipif (not is_reasoning_supported (),
176- reason = "Reasoning is not supported in older OpenAI library versions" )
177- def test_responses_reasoning_dict_issue (instrument_legacy , span_exporter : InMemorySpanExporter ,
178- openai_client : OpenAI ):
181+ @pytest .mark .skipif (
182+ not is_reasoning_supported (),
183+ reason = "Reasoning is not supported in older OpenAI library versions" ,
184+ )
185+ def test_responses_reasoning_dict_issue (
186+ instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI
187+ ):
179188 """Test for issue #3350 - reasoning dict causing invalid type warning"""
180189 openai_client .responses .create (
181190 model = "gpt-5-nano" ,
182191 input = "Explain why the sky is blue" ,
183- reasoning = {
184- "effort" : "medium" ,
185- "summary" : "auto"
186- },
192+ reasoning = {"effort" : "medium" , "summary" : "auto" },
187193 )
188194
189195 spans = span_exporter .get_finished_spans ()
@@ -205,7 +211,9 @@ def test_responses_reasoning_dict_issue(instrument_legacy, span_exporter: InMemo
205211
206212
207213@pytest .mark .vcr
208- def test_responses_streaming (instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI ):
214+ def test_responses_streaming (
215+ instrument_legacy , span_exporter : InMemorySpanExporter , openai_client : OpenAI
216+ ):
209217 """Test for streaming responses.create() - reproduces customer issue"""
210218 stream = openai_client .responses .create (
211219 model = "gpt-4.1-nano" ,
@@ -216,19 +224,13 @@ def test_responses_streaming(instrument_legacy, span_exporter: InMemorySpanExpor
216224 # Consume the stream
217225 full_text = ""
218226 for item in stream :
219- # Debug: print the structure of the item
220- # print(f"Item type: {type(item)}, Item: {item}")
221- # The response API streaming events have a different structure
222- # They have type="response.output_text.delta" with a "delta" field
223227 if hasattr (item , "type" ) and item .type == "response.output_text.delta" :
224228 if hasattr (item , "delta" ) and item .delta :
225229 full_text += item .delta
226- # Also handle if there's a delta attribute with text
227230 elif hasattr (item , "delta" ) and item .delta :
228231 if hasattr (item .delta , "text" ) and item .delta .text :
229232 full_text += item .delta .text
230233
231- # Check that spans were created
232234 spans = span_exporter .get_finished_spans ()
233235 assert len (spans ) == 1 , f"Expected 1 span but got { len (spans )} "
234236
@@ -241,28 +243,25 @@ def test_responses_streaming(instrument_legacy, span_exporter: InMemorySpanExpor
241243
242244@pytest .mark .vcr
243245@pytest .mark .asyncio
244- async def test_responses_streaming_async (instrument_legacy , span_exporter : InMemorySpanExporter , async_openai_client ):
246+ async def test_responses_streaming_async (
247+ instrument_legacy , span_exporter : InMemorySpanExporter , async_openai_client
248+ ):
245249 """Test for async streaming responses.create() - reproduces customer issue"""
246250 stream = await async_openai_client .responses .create (
247251 model = "gpt-4.1-nano" ,
248252 input = "Tell me a three sentence bedtime story about a unicorn." ,
249253 stream = True ,
250254 )
251255
252- # Consume the stream
253256 full_text = ""
254257 async for item in stream :
255- # The response API streaming events have a different structure
256- # They have type="response.output_text.delta" with a "delta" field
257258 if hasattr (item , "type" ) and item .type == "response.output_text.delta" :
258259 if hasattr (item , "delta" ) and item .delta :
259260 full_text += item .delta
260- # Also handle if there's a delta attribute with text
261261 elif hasattr (item , "delta" ) and item .delta :
262262 if hasattr (item .delta , "text" ) and item .delta .text :
263263 full_text += item .delta .text
264264
265- # Check that spans were created
266265 spans = span_exporter .get_finished_spans ()
267266 assert len (spans ) == 1 , f"Expected 1 span but got { len (spans )} "
268267
0 commit comments