_realtime.py 3.9 KB

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