main
1from __future__ import annotations
2
3import json
4from typing_extensions import override
5
6import httpx
7
8from openai import _legacy_response
9from openai._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
10from openai._utils import maybe_transform, async_maybe_transform
11from openai._base_client import make_request_options
12from openai.resources.realtime.calls import Calls, AsyncCalls
13from openai.types.realtime.realtime_session_create_request_param import RealtimeSessionCreateRequestParam
14
15__all__ = ["_Calls", "_AsyncCalls"]
16
17
18# Custom code to override the `create` method to have correct behavior with
19# application/sdp and multipart/form-data.
20# Ideally we can cutover to the generated code this overrides eventually and remove this.
21class _Calls(Calls):
22 @override
23 def create(
24 self,
25 *,
26 sdp: str,
27 session: RealtimeSessionCreateRequestParam | Omit = omit,
28 extra_headers: Headers | None = None,
29 extra_query: Query | None = None,
30 extra_body: Body | None = None,
31 timeout: float | httpx.Timeout | None | NotGiven = not_given,
32 ) -> _legacy_response.HttpxBinaryResponseContent:
33 if session is omit:
34 extra_headers = {"Accept": "application/sdp", "Content-Type": "application/sdp", **(extra_headers or {})}
35 return self._post(
36 "/realtime/calls",
37 body=sdp.encode("utf-8"),
38 options=make_request_options(extra_headers=extra_headers, extra_query=extra_query, timeout=timeout),
39 cast_to=_legacy_response.HttpxBinaryResponseContent,
40 )
41
42 extra_headers = {"Accept": "application/sdp", "Content-Type": "multipart/form-data", **(extra_headers or {})}
43 session_payload = maybe_transform(session, RealtimeSessionCreateRequestParam)
44 files = [
45 ("sdp", (None, sdp.encode("utf-8"), "application/sdp")),
46 ("session", (None, json.dumps(session_payload).encode("utf-8"), "application/json")),
47 ]
48 return self._post(
49 "/realtime/calls",
50 files=files,
51 options=make_request_options(
52 extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
53 ),
54 cast_to=_legacy_response.HttpxBinaryResponseContent,
55 )
56
57
58class _AsyncCalls(AsyncCalls):
59 @override
60 async def create(
61 self,
62 *,
63 sdp: str,
64 session: RealtimeSessionCreateRequestParam | Omit = omit,
65 extra_headers: Headers | None = None,
66 extra_query: Query | None = None,
67 extra_body: Body | None = None,
68 timeout: float | httpx.Timeout | None | NotGiven = not_given,
69 ) -> _legacy_response.HttpxBinaryResponseContent:
70 if session is omit:
71 extra_headers = {"Accept": "application/sdp", "Content-Type": "application/sdp", **(extra_headers or {})}
72 return await self._post(
73 "/realtime/calls",
74 body=sdp.encode("utf-8"),
75 options=make_request_options(extra_headers=extra_headers, extra_query=extra_query, timeout=timeout),
76 cast_to=_legacy_response.HttpxBinaryResponseContent,
77 )
78
79 extra_headers = {"Accept": "application/sdp", "Content-Type": "multipart/form-data", **(extra_headers or {})}
80 session_payload = await async_maybe_transform(session, RealtimeSessionCreateRequestParam)
81 files = [
82 ("sdp", (None, sdp.encode("utf-8"), "application/sdp")),
83 ("session", (None, json.dumps(session_payload).encode("utf-8"), "application/json")),
84 ]
85 return await self._post(
86 "/realtime/calls",
87 files=files,
88 options=make_request_options(
89 extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
90 ),
91 cast_to=_legacy_response.HttpxBinaryResponseContent,
92 )