main
1# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
3from __future__ import annotations
4
5import os
6from typing import Any, cast
7
8import httpx
9import pytest
10from respx import MockRouter
11
12import openai._legacy_response as _legacy_response
13from openai import OpenAI, AsyncOpenAI
14from tests.utils import assert_matches_type
15
16# pyright: reportDeprecated=false
17
18base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
19
20
21class TestCalls:
22 parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
23
24 @parametrize
25 @pytest.mark.respx(base_url=base_url)
26 def test_method_create(self, client: OpenAI, respx_mock: MockRouter) -> None:
27 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
28 call = client.realtime.calls.create(
29 sdp="sdp",
30 )
31 assert isinstance(call, _legacy_response.HttpxBinaryResponseContent)
32 assert call.json() == {"foo": "bar"}
33
34 @parametrize
35 @pytest.mark.respx(base_url=base_url)
36 def test_method_create_with_all_params(self, client: OpenAI, respx_mock: MockRouter) -> None:
37 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
38 call = client.realtime.calls.create(
39 sdp="sdp",
40 session={
41 "type": "realtime",
42 "audio": {
43 "input": {
44 "format": {
45 "rate": 24000,
46 "type": "audio/pcm",
47 },
48 "noise_reduction": {"type": "near_field"},
49 "transcription": {
50 "language": "language",
51 "model": "whisper-1",
52 "prompt": "prompt",
53 },
54 "turn_detection": {
55 "type": "server_vad",
56 "create_response": True,
57 "idle_timeout_ms": 5000,
58 "interrupt_response": True,
59 "prefix_padding_ms": 0,
60 "silence_duration_ms": 0,
61 "threshold": 0,
62 },
63 },
64 "output": {
65 "format": {
66 "rate": 24000,
67 "type": "audio/pcm",
68 },
69 "speed": 0.25,
70 "voice": "ash",
71 },
72 },
73 "include": ["item.input_audio_transcription.logprobs"],
74 "instructions": "instructions",
75 "max_output_tokens": 0,
76 "model": "string",
77 "output_modalities": ["text"],
78 "prompt": {
79 "id": "id",
80 "variables": {"foo": "string"},
81 "version": "version",
82 },
83 "tool_choice": "none",
84 "tools": [
85 {
86 "description": "description",
87 "name": "name",
88 "parameters": {},
89 "type": "function",
90 }
91 ],
92 "tracing": "auto",
93 "truncation": "auto",
94 },
95 )
96 assert isinstance(call, _legacy_response.HttpxBinaryResponseContent)
97 assert call.json() == {"foo": "bar"}
98
99 @parametrize
100 @pytest.mark.respx(base_url=base_url)
101 def test_raw_response_create(self, client: OpenAI, respx_mock: MockRouter) -> None:
102 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
103
104 response = client.realtime.calls.with_raw_response.create(
105 sdp="sdp",
106 )
107
108 assert response.is_closed is True
109 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
110 call = response.parse()
111 assert_matches_type(_legacy_response.HttpxBinaryResponseContent, call, path=["response"])
112
113 @parametrize
114 @pytest.mark.respx(base_url=base_url)
115 def test_streaming_response_create(self, client: OpenAI, respx_mock: MockRouter) -> None:
116 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
117 with client.realtime.calls.with_streaming_response.create(
118 sdp="sdp",
119 ) as response:
120 assert not response.is_closed
121 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
122
123 call = response.parse()
124 assert_matches_type(bytes, call, path=["response"])
125
126 assert cast(Any, response.is_closed) is True
127
128 @parametrize
129 def test_method_accept(self, client: OpenAI) -> None:
130 call = client.realtime.calls.accept(
131 call_id="call_id",
132 type="realtime",
133 )
134 assert call is None
135
136 @parametrize
137 def test_method_accept_with_all_params(self, client: OpenAI) -> None:
138 call = client.realtime.calls.accept(
139 call_id="call_id",
140 type="realtime",
141 audio={
142 "input": {
143 "format": {
144 "rate": 24000,
145 "type": "audio/pcm",
146 },
147 "noise_reduction": {"type": "near_field"},
148 "transcription": {
149 "language": "language",
150 "model": "whisper-1",
151 "prompt": "prompt",
152 },
153 "turn_detection": {
154 "type": "server_vad",
155 "create_response": True,
156 "idle_timeout_ms": 5000,
157 "interrupt_response": True,
158 "prefix_padding_ms": 0,
159 "silence_duration_ms": 0,
160 "threshold": 0,
161 },
162 },
163 "output": {
164 "format": {
165 "rate": 24000,
166 "type": "audio/pcm",
167 },
168 "speed": 0.25,
169 "voice": "ash",
170 },
171 },
172 include=["item.input_audio_transcription.logprobs"],
173 instructions="instructions",
174 max_output_tokens=0,
175 model="string",
176 output_modalities=["text"],
177 prompt={
178 "id": "id",
179 "variables": {"foo": "string"},
180 "version": "version",
181 },
182 tool_choice="none",
183 tools=[
184 {
185 "description": "description",
186 "name": "name",
187 "parameters": {},
188 "type": "function",
189 }
190 ],
191 tracing="auto",
192 truncation="auto",
193 )
194 assert call is None
195
196 @parametrize
197 def test_raw_response_accept(self, client: OpenAI) -> None:
198 response = client.realtime.calls.with_raw_response.accept(
199 call_id="call_id",
200 type="realtime",
201 )
202
203 assert response.is_closed is True
204 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
205 call = response.parse()
206 assert call is None
207
208 @parametrize
209 def test_streaming_response_accept(self, client: OpenAI) -> None:
210 with client.realtime.calls.with_streaming_response.accept(
211 call_id="call_id",
212 type="realtime",
213 ) as response:
214 assert not response.is_closed
215 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
216
217 call = response.parse()
218 assert call is None
219
220 assert cast(Any, response.is_closed) is True
221
222 @parametrize
223 def test_path_params_accept(self, client: OpenAI) -> None:
224 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
225 client.realtime.calls.with_raw_response.accept(
226 call_id="",
227 type="realtime",
228 )
229
230 @parametrize
231 def test_method_hangup(self, client: OpenAI) -> None:
232 call = client.realtime.calls.hangup(
233 "call_id",
234 )
235 assert call is None
236
237 @parametrize
238 def test_raw_response_hangup(self, client: OpenAI) -> None:
239 response = client.realtime.calls.with_raw_response.hangup(
240 "call_id",
241 )
242
243 assert response.is_closed is True
244 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
245 call = response.parse()
246 assert call is None
247
248 @parametrize
249 def test_streaming_response_hangup(self, client: OpenAI) -> None:
250 with client.realtime.calls.with_streaming_response.hangup(
251 "call_id",
252 ) as response:
253 assert not response.is_closed
254 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
255
256 call = response.parse()
257 assert call is None
258
259 assert cast(Any, response.is_closed) is True
260
261 @parametrize
262 def test_path_params_hangup(self, client: OpenAI) -> None:
263 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
264 client.realtime.calls.with_raw_response.hangup(
265 "",
266 )
267
268 @parametrize
269 def test_method_refer(self, client: OpenAI) -> None:
270 call = client.realtime.calls.refer(
271 call_id="call_id",
272 target_uri="tel:+14155550123",
273 )
274 assert call is None
275
276 @parametrize
277 def test_raw_response_refer(self, client: OpenAI) -> None:
278 response = client.realtime.calls.with_raw_response.refer(
279 call_id="call_id",
280 target_uri="tel:+14155550123",
281 )
282
283 assert response.is_closed is True
284 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
285 call = response.parse()
286 assert call is None
287
288 @parametrize
289 def test_streaming_response_refer(self, client: OpenAI) -> None:
290 with client.realtime.calls.with_streaming_response.refer(
291 call_id="call_id",
292 target_uri="tel:+14155550123",
293 ) as response:
294 assert not response.is_closed
295 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
296
297 call = response.parse()
298 assert call is None
299
300 assert cast(Any, response.is_closed) is True
301
302 @parametrize
303 def test_path_params_refer(self, client: OpenAI) -> None:
304 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
305 client.realtime.calls.with_raw_response.refer(
306 call_id="",
307 target_uri="tel:+14155550123",
308 )
309
310 @parametrize
311 def test_method_reject(self, client: OpenAI) -> None:
312 call = client.realtime.calls.reject(
313 call_id="call_id",
314 )
315 assert call is None
316
317 @parametrize
318 def test_method_reject_with_all_params(self, client: OpenAI) -> None:
319 call = client.realtime.calls.reject(
320 call_id="call_id",
321 status_code=486,
322 )
323 assert call is None
324
325 @parametrize
326 def test_raw_response_reject(self, client: OpenAI) -> None:
327 response = client.realtime.calls.with_raw_response.reject(
328 call_id="call_id",
329 )
330
331 assert response.is_closed is True
332 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
333 call = response.parse()
334 assert call is None
335
336 @parametrize
337 def test_streaming_response_reject(self, client: OpenAI) -> None:
338 with client.realtime.calls.with_streaming_response.reject(
339 call_id="call_id",
340 ) as response:
341 assert not response.is_closed
342 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
343
344 call = response.parse()
345 assert call is None
346
347 assert cast(Any, response.is_closed) is True
348
349 @parametrize
350 def test_path_params_reject(self, client: OpenAI) -> None:
351 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
352 client.realtime.calls.with_raw_response.reject(
353 call_id="",
354 )
355
356
357class TestAsyncCalls:
358 parametrize = pytest.mark.parametrize(
359 "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
360 )
361
362 @parametrize
363 @pytest.mark.respx(base_url=base_url)
364 async def test_method_create(self, async_client: AsyncOpenAI, respx_mock: MockRouter) -> None:
365 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
366 call = await async_client.realtime.calls.create(
367 sdp="sdp",
368 )
369 assert isinstance(call, _legacy_response.HttpxBinaryResponseContent)
370 assert call.json() == {"foo": "bar"}
371
372 @parametrize
373 @pytest.mark.respx(base_url=base_url)
374 async def test_method_create_with_all_params(self, async_client: AsyncOpenAI, respx_mock: MockRouter) -> None:
375 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
376 call = await async_client.realtime.calls.create(
377 sdp="sdp",
378 session={
379 "type": "realtime",
380 "audio": {
381 "input": {
382 "format": {
383 "rate": 24000,
384 "type": "audio/pcm",
385 },
386 "noise_reduction": {"type": "near_field"},
387 "transcription": {
388 "language": "language",
389 "model": "whisper-1",
390 "prompt": "prompt",
391 },
392 "turn_detection": {
393 "type": "server_vad",
394 "create_response": True,
395 "idle_timeout_ms": 5000,
396 "interrupt_response": True,
397 "prefix_padding_ms": 0,
398 "silence_duration_ms": 0,
399 "threshold": 0,
400 },
401 },
402 "output": {
403 "format": {
404 "rate": 24000,
405 "type": "audio/pcm",
406 },
407 "speed": 0.25,
408 "voice": "ash",
409 },
410 },
411 "include": ["item.input_audio_transcription.logprobs"],
412 "instructions": "instructions",
413 "max_output_tokens": 0,
414 "model": "string",
415 "output_modalities": ["text"],
416 "prompt": {
417 "id": "id",
418 "variables": {"foo": "string"},
419 "version": "version",
420 },
421 "tool_choice": "none",
422 "tools": [
423 {
424 "description": "description",
425 "name": "name",
426 "parameters": {},
427 "type": "function",
428 }
429 ],
430 "tracing": "auto",
431 "truncation": "auto",
432 },
433 )
434 assert isinstance(call, _legacy_response.HttpxBinaryResponseContent)
435 assert call.json() == {"foo": "bar"}
436
437 @parametrize
438 @pytest.mark.respx(base_url=base_url)
439 async def test_raw_response_create(self, async_client: AsyncOpenAI, respx_mock: MockRouter) -> None:
440 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
441
442 response = await async_client.realtime.calls.with_raw_response.create(
443 sdp="sdp",
444 )
445
446 assert response.is_closed is True
447 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
448 call = response.parse()
449 assert_matches_type(_legacy_response.HttpxBinaryResponseContent, call, path=["response"])
450
451 @parametrize
452 @pytest.mark.respx(base_url=base_url)
453 async def test_streaming_response_create(self, async_client: AsyncOpenAI, respx_mock: MockRouter) -> None:
454 respx_mock.post("/realtime/calls").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
455 async with async_client.realtime.calls.with_streaming_response.create(
456 sdp="sdp",
457 ) as response:
458 assert not response.is_closed
459 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
460
461 call = await response.parse()
462 assert_matches_type(bytes, call, path=["response"])
463
464 assert cast(Any, response.is_closed) is True
465
466 @parametrize
467 async def test_method_accept(self, async_client: AsyncOpenAI) -> None:
468 call = await async_client.realtime.calls.accept(
469 call_id="call_id",
470 type="realtime",
471 )
472 assert call is None
473
474 @parametrize
475 async def test_method_accept_with_all_params(self, async_client: AsyncOpenAI) -> None:
476 call = await async_client.realtime.calls.accept(
477 call_id="call_id",
478 type="realtime",
479 audio={
480 "input": {
481 "format": {
482 "rate": 24000,
483 "type": "audio/pcm",
484 },
485 "noise_reduction": {"type": "near_field"},
486 "transcription": {
487 "language": "language",
488 "model": "whisper-1",
489 "prompt": "prompt",
490 },
491 "turn_detection": {
492 "type": "server_vad",
493 "create_response": True,
494 "idle_timeout_ms": 5000,
495 "interrupt_response": True,
496 "prefix_padding_ms": 0,
497 "silence_duration_ms": 0,
498 "threshold": 0,
499 },
500 },
501 "output": {
502 "format": {
503 "rate": 24000,
504 "type": "audio/pcm",
505 },
506 "speed": 0.25,
507 "voice": "ash",
508 },
509 },
510 include=["item.input_audio_transcription.logprobs"],
511 instructions="instructions",
512 max_output_tokens=0,
513 model="string",
514 output_modalities=["text"],
515 prompt={
516 "id": "id",
517 "variables": {"foo": "string"},
518 "version": "version",
519 },
520 tool_choice="none",
521 tools=[
522 {
523 "description": "description",
524 "name": "name",
525 "parameters": {},
526 "type": "function",
527 }
528 ],
529 tracing="auto",
530 truncation="auto",
531 )
532 assert call is None
533
534 @parametrize
535 async def test_raw_response_accept(self, async_client: AsyncOpenAI) -> None:
536 response = await async_client.realtime.calls.with_raw_response.accept(
537 call_id="call_id",
538 type="realtime",
539 )
540
541 assert response.is_closed is True
542 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
543 call = response.parse()
544 assert call is None
545
546 @parametrize
547 async def test_streaming_response_accept(self, async_client: AsyncOpenAI) -> None:
548 async with async_client.realtime.calls.with_streaming_response.accept(
549 call_id="call_id",
550 type="realtime",
551 ) as response:
552 assert not response.is_closed
553 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
554
555 call = await response.parse()
556 assert call is None
557
558 assert cast(Any, response.is_closed) is True
559
560 @parametrize
561 async def test_path_params_accept(self, async_client: AsyncOpenAI) -> None:
562 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
563 await async_client.realtime.calls.with_raw_response.accept(
564 call_id="",
565 type="realtime",
566 )
567
568 @parametrize
569 async def test_method_hangup(self, async_client: AsyncOpenAI) -> None:
570 call = await async_client.realtime.calls.hangup(
571 "call_id",
572 )
573 assert call is None
574
575 @parametrize
576 async def test_raw_response_hangup(self, async_client: AsyncOpenAI) -> None:
577 response = await async_client.realtime.calls.with_raw_response.hangup(
578 "call_id",
579 )
580
581 assert response.is_closed is True
582 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
583 call = response.parse()
584 assert call is None
585
586 @parametrize
587 async def test_streaming_response_hangup(self, async_client: AsyncOpenAI) -> None:
588 async with async_client.realtime.calls.with_streaming_response.hangup(
589 "call_id",
590 ) as response:
591 assert not response.is_closed
592 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
593
594 call = await response.parse()
595 assert call is None
596
597 assert cast(Any, response.is_closed) is True
598
599 @parametrize
600 async def test_path_params_hangup(self, async_client: AsyncOpenAI) -> None:
601 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
602 await async_client.realtime.calls.with_raw_response.hangup(
603 "",
604 )
605
606 @parametrize
607 async def test_method_refer(self, async_client: AsyncOpenAI) -> None:
608 call = await async_client.realtime.calls.refer(
609 call_id="call_id",
610 target_uri="tel:+14155550123",
611 )
612 assert call is None
613
614 @parametrize
615 async def test_raw_response_refer(self, async_client: AsyncOpenAI) -> None:
616 response = await async_client.realtime.calls.with_raw_response.refer(
617 call_id="call_id",
618 target_uri="tel:+14155550123",
619 )
620
621 assert response.is_closed is True
622 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
623 call = response.parse()
624 assert call is None
625
626 @parametrize
627 async def test_streaming_response_refer(self, async_client: AsyncOpenAI) -> None:
628 async with async_client.realtime.calls.with_streaming_response.refer(
629 call_id="call_id",
630 target_uri="tel:+14155550123",
631 ) as response:
632 assert not response.is_closed
633 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
634
635 call = await response.parse()
636 assert call is None
637
638 assert cast(Any, response.is_closed) is True
639
640 @parametrize
641 async def test_path_params_refer(self, async_client: AsyncOpenAI) -> None:
642 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
643 await async_client.realtime.calls.with_raw_response.refer(
644 call_id="",
645 target_uri="tel:+14155550123",
646 )
647
648 @parametrize
649 async def test_method_reject(self, async_client: AsyncOpenAI) -> None:
650 call = await async_client.realtime.calls.reject(
651 call_id="call_id",
652 )
653 assert call is None
654
655 @parametrize
656 async def test_method_reject_with_all_params(self, async_client: AsyncOpenAI) -> None:
657 call = await async_client.realtime.calls.reject(
658 call_id="call_id",
659 status_code=486,
660 )
661 assert call is None
662
663 @parametrize
664 async def test_raw_response_reject(self, async_client: AsyncOpenAI) -> None:
665 response = await async_client.realtime.calls.with_raw_response.reject(
666 call_id="call_id",
667 )
668
669 assert response.is_closed is True
670 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
671 call = response.parse()
672 assert call is None
673
674 @parametrize
675 async def test_streaming_response_reject(self, async_client: AsyncOpenAI) -> None:
676 async with async_client.realtime.calls.with_streaming_response.reject(
677 call_id="call_id",
678 ) as response:
679 assert not response.is_closed
680 assert response.http_request.headers.get("X-Stainless-Lang") == "python"
681
682 call = await response.parse()
683 assert call is None
684
685 assert cast(Any, response.is_closed) is True
686
687 @parametrize
688 async def test_path_params_reject(self, async_client: AsyncOpenAI) -> None:
689 with pytest.raises(ValueError, match=r"Expected a non-empty value for `call_id` but received ''"):
690 await async_client.realtime.calls.with_raw_response.reject(
691 call_id="",
692 )