Skip to content

Commit 33ab924

Browse files
feat(api): add typed references to Realtime response input
Castiron-Internal-PR: openai/openai-python-internal#349 Castiron-Source-SHA: 35d1417de7d2de0a22bd04c6226c703ca62e9f4e Castiron-Public-Base-SHA: 1b37b9a
1 parent 1b37b9a commit 33ab924

10 files changed

Lines changed: 302 additions & 20 deletions

‎.castiron.stats.yml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
schema_version: 1
2-
generation_id: 3979ac4c-7176-4e6d-9fde-1b9fa94dca0e
2+
generation_id: 66c33b8f-b104-40d5-882f-9e511b4c0f84
33
openapi_spec_hash: 2c78c708cab402e8904f555026c78020
4-
openapi_transformed_spec_hash: e513b495f24d8119b952521ffc783d86
5-
config_hash: e8e4d0a0f7d89bb89f18f5ed789c0ac6
6-
codegen_sha: 47c0bc8105b4986bef09e3e9e43ab8a26cd882c9
7-
codegen_hash: a0d517f4d93e3430ed6dbcf2dfb9aeba57e563f1b7348a093d149c3d6c20ea77
4+
openapi_transformed_spec_hash: 078e0a8b0fbf06b663d2a310567695ce
5+
config_hash: e901e1843aa6ac7c3816ad65338289ac
6+
codegen_sha: 3f98cde2ae19fc412a1425b432a34c789a42f3cc
7+
codegen_hash: 1408cfa777ed0a695f6a9a7585f15457a30078e5a4518b18e7589f59e81153a2

‎api_reference/openapi.transformed.yml‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58291,6 +58291,7 @@ components:
5829158291
- $ref: '#/components/schemas/RealtimeMCPListTools'
5829258292
- $ref: '#/components/schemas/RealtimeMCPToolCall'
5829358293
- $ref: '#/components/schemas/RealtimeMCPApprovalRequest'
58294+
- $ref: '#/components/schemas/RealtimeResponseItemReference'
5829458295
discriminator:
5829558296
propertyName: type
5829658297
RealtimeConversationItemFunctionCall:
@@ -111167,6 +111168,28 @@ components:
111167111168
- type
111168111169
- server_label
111169111170
- name
111171+
RealtimeResponseItemReference:
111172+
type: object
111173+
description: |
111174+
Reference an existing item in this Realtime session as response.create input.
111175+
Item references are only accepted in the response input array, not as new
111176+
conversation items.
111177+
properties:
111178+
type:
111179+
type: string
111180+
enum:
111181+
- item_reference
111182+
x-stainless-const: true
111183+
description: The type of this item. Always `item_reference`.
111184+
id:
111185+
type: string
111186+
minLength: 1
111187+
maxLength: 32
111188+
pattern: ^[a-zA-Z0-9_-]+$
111189+
description: The ID of an existing item in the same Realtime session.
111190+
required:
111191+
- type
111192+
- id
111170111193
responses:
111171111194
TooManyRequests:
111172111195
description: The request was rejected because a rate limit was exceeded.

‎scripts/castiron/generated-files.json‎

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@
583583
},
584584
"src/openai/resources/realtime/api.md": {
585585
"mode": "100644",
586-
"sha256": "f977c3b6d8ac7161eeb7025492ac820fc4a17465a54dbec223359b8d72ec6346"
586+
"sha256": "eead2cb85c18f8618053945184022e68166bee967e60078cc0c8b3ef8be3fc34"
587587
},
588588
"src/openai/resources/realtime/calls.py": {
589589
"mode": "100644",
@@ -595,7 +595,7 @@
595595
},
596596
"src/openai/resources/realtime/realtime.py": {
597597
"mode": "100644",
598-
"sha256": "0285ac5edb9b8b17f296b2d513068cb35c3413895e35424221765cc4a15c8592"
598+
"sha256": "0bfb331a5a3b95022b8d93532b05f906279d38f52b7dd1d3d455207039b6847f"
599599
},
600600
"src/openai/resources/realtime/translations/__init__.py": {
601601
"mode": "100644",
@@ -5119,7 +5119,7 @@
51195119
},
51205120
"src/openai/types/realtime/__init__.py": {
51215121
"mode": "100644",
5122-
"sha256": "261c144fdf20c27eb36a7d231089412a837f0e4c515fdc32a25cd7e856ab166e"
5122+
"sha256": "9666db4186bc43fb9172e062757c6fd9f80a602243e9bb887453843ae705e187"
51235123
},
51245124
"src/openai/types/realtime/audio_transcription.py": {
51255125
"mode": "100644",
@@ -5521,6 +5521,10 @@
55215521
"mode": "100644",
55225522
"sha256": "d8b30f5cf2b34637790ca055cf95e50391346dcf72e5ff009f6b44afc4bcb547"
55235523
},
5524+
"src/openai/types/realtime/realtime_response_create_params_with_references_param.py": {
5525+
"mode": "100644",
5526+
"sha256": "e497ef7761e669350ca27b7083e6435c41f4864b0bd5bbfd5c3c204b35d2f883"
5527+
},
55245528
"src/openai/types/realtime/realtime_response_status.py": {
55255529
"mode": "100644",
55265530
"sha256": "b00b75118e8e7d2c42fcf4fbdb15e4018c572f1c371af7d86b89015dc4c08156"
@@ -5761,6 +5765,10 @@
57615765
"mode": "100644",
57625766
"sha256": "5ca62450179ad1415d9c4057d8aa8850463a346d7541c1f5cf4cd1cc4373ab03"
57635767
},
5768+
"src/openai/types/realtime/response_create_event_with_references_param.py": {
5769+
"mode": "100644",
5770+
"sha256": "447311a4c3fcc158d048b7a661f8c3839a889a05f7bde833f35c883ea1a8e1c1"
5771+
},
57645772
"src/openai/types/realtime/response_created_event.py": {
57655773
"mode": "100644",
57665774
"sha256": "36bf360cb5d65a600e0580a6cf6887a229a03607d96218f400c4903b49ea5728"
@@ -5777,6 +5785,14 @@
57775785
"mode": "100644",
57785786
"sha256": "75586fb8816948a71e001c78c0a8f3ac2ab821a878f2f9b58a4f137867ec05cb"
57795787
},
5788+
"src/openai/types/realtime/response_item_reference.py": {
5789+
"mode": "100644",
5790+
"sha256": "bbd4ddcfc8a99940f161eed062552d3f7e70f40042824948bad7ab80022ebc57"
5791+
},
5792+
"src/openai/types/realtime/response_item_reference_param.py": {
5793+
"mode": "100644",
5794+
"sha256": "06d0f4594d15309a190f72098cfb0970a49ca8da14214c2ca8fbc27ab9e142be"
5795+
},
57805796
"src/openai/types/realtime/response_mcp_call_arguments_delta.py": {
57815797
"mode": "100644",
57825798
"sha256": "59af6b127685ea447c94ee2577aab8509adf0fa6f74efa45706aabbebc0b41d4"

‎src/openai/resources/realtime/api.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ from openai.types.realtime import (
106106
ResponseDoneEvent,
107107
ResponseFunctionCallArgumentsDeltaEvent,
108108
ResponseFunctionCallArgumentsDoneEvent,
109+
ResponseItemReference,
109110
ResponseMcpCallArgumentsDelta,
110111
ResponseMcpCallArgumentsDone,
111112
ResponseMcpCallCompleted,

‎src/openai/resources/realtime/realtime.py‎

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@
6262
from ...types.realtime.conversation_item_param import ConversationItemParam
6363
from ...types.realtime.realtime_client_event_param import RealtimeClientEventParam
6464
from ...types.realtime.realtime_response_create_params_param import RealtimeResponseCreateParamsParam
65+
from ...types.realtime.response_create_event_with_references_param import ResponseCreateEventWithReferencesParam
66+
from ...types.realtime.realtime_response_create_params_with_references_param import (
67+
RealtimeResponseCreateParamsWithReferencesParam,
68+
)
6569

6670
if TYPE_CHECKING:
6771
from websockets.sync.client import ClientConnection as WebSocketConnection
@@ -395,11 +399,17 @@ async def recv_bytes(self) -> bytes:
395399
self._reconnect_attempt = 0
396400
return message
397401

398-
async def send(self, event: RealtimeClientEvent | RealtimeClientEventParam) -> None:
402+
async def send(
403+
self, event: RealtimeClientEvent | Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam]
404+
) -> None:
399405
data = (
400406
event.to_json(use_api_names=True, exclude_unset=True)
401407
if isinstance(event, BaseModel)
402-
else json.dumps(await async_maybe_transform(event, RealtimeClientEventParam))
408+
else json.dumps(
409+
await async_maybe_transform(
410+
event, Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam]
411+
)
412+
)
403413
)
404414
if self._is_reconnecting:
405415
self._send_queue.enqueue(data)
@@ -546,7 +556,9 @@ def __init__(
546556
self.__send_queue = SendQueue(max_bytes=max_queue_size)
547557
self.__event_handler_registry = EventHandlerRegistry(use_lock=False)
548558

549-
def send(self, event: RealtimeClientEvent | RealtimeClientEventParam) -> None:
559+
def send(
560+
self, event: RealtimeClientEvent | Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam]
561+
) -> None:
550562
"""Queue a message to be sent when the connection is established.
551563
552564
This can be called before entering the context manager. Queued messages
@@ -555,7 +567,9 @@ def send(self, event: RealtimeClientEvent | RealtimeClientEventParam) -> None:
555567
data = (
556568
event.to_json(use_api_names=True, exclude_unset=True)
557569
if isinstance(event, BaseModel)
558-
else json.dumps(maybe_transform(event, RealtimeClientEventParam))
570+
else json.dumps(
571+
maybe_transform(event, Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam])
572+
)
559573
)
560574
self.__send_queue.enqueue(data)
561575

@@ -840,11 +854,15 @@ def recv_bytes(self) -> bytes:
840854
self._reconnect_attempt = 0
841855
return message
842856

843-
def send(self, event: RealtimeClientEvent | RealtimeClientEventParam) -> None:
857+
def send(
858+
self, event: RealtimeClientEvent | Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam]
859+
) -> None:
844860
data = (
845861
event.to_json(use_api_names=True, exclude_unset=True)
846862
if isinstance(event, BaseModel)
847-
else json.dumps(maybe_transform(event, RealtimeClientEventParam))
863+
else json.dumps(
864+
maybe_transform(event, Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam])
865+
)
848866
)
849867
if self._is_reconnecting:
850868
self._send_queue.enqueue(data)
@@ -985,7 +1003,9 @@ def __init__(
9851003
self.__send_queue = SendQueue(max_bytes=max_queue_size)
9861004
self.__event_handler_registry = EventHandlerRegistry(use_lock=True)
9871005

988-
def send(self, event: RealtimeClientEvent | RealtimeClientEventParam) -> None:
1006+
def send(
1007+
self, event: RealtimeClientEvent | Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam]
1008+
) -> None:
9891009
"""Queue a message to be sent when the connection is established.
9901010
9911011
This can be called before entering the context manager. Queued messages
@@ -994,7 +1014,9 @@ def send(self, event: RealtimeClientEvent | RealtimeClientEventParam) -> None:
9941014
data = (
9951015
event.to_json(use_api_names=True, exclude_unset=True)
9961016
if isinstance(event, BaseModel)
997-
else json.dumps(maybe_transform(event, RealtimeClientEventParam))
1017+
else json.dumps(
1018+
maybe_transform(event, Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam])
1019+
)
9981020
)
9991021
self.__send_queue.enqueue(data)
10001022

@@ -1206,7 +1228,13 @@ def update(self, *, session: session_update_event_param.Session, event_id: str |
12061228

12071229

12081230
class RealtimeResponseResource(BaseRealtimeConnectionResource):
1209-
def create(self, *, event_id: str | Omit = omit, response: RealtimeResponseCreateParamsParam | Omit = omit) -> None:
1231+
def create(
1232+
self,
1233+
*,
1234+
event_id: str | Omit = omit,
1235+
response: Union[RealtimeResponseCreateParamsParam, RealtimeResponseCreateParamsWithReferencesParam]
1236+
| Omit = omit,
1237+
) -> None:
12101238
"""
12111239
This event instructs the server to create a Response, which means triggering
12121240
model inference. When in Server VAD mode, the server will create Responses
@@ -1236,7 +1264,7 @@ def create(self, *, event_id: str | Omit = omit, response: RealtimeResponseCreat
12361264
"""
12371265
self._connection.send(
12381266
cast(
1239-
RealtimeClientEventParam,
1267+
Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam],
12401268
strip_not_given({"type": "response.create", "event_id": event_id, "response": response}),
12411269
)
12421270
)
@@ -1450,7 +1478,11 @@ async def update(self, *, session: session_update_event_param.Session, event_id:
14501478

14511479
class AsyncRealtimeResponseResource(BaseAsyncRealtimeConnectionResource):
14521480
async def create(
1453-
self, *, event_id: str | Omit = omit, response: RealtimeResponseCreateParamsParam | Omit = omit
1481+
self,
1482+
*,
1483+
event_id: str | Omit = omit,
1484+
response: Union[RealtimeResponseCreateParamsParam, RealtimeResponseCreateParamsWithReferencesParam]
1485+
| Omit = omit,
14541486
) -> None:
14551487
"""
14561488
This event instructs the server to create a Response, which means triggering
@@ -1481,7 +1513,7 @@ async def create(
14811513
"""
14821514
await self._connection.send(
14831515
cast(
1484-
RealtimeClientEventParam,
1516+
Union[RealtimeClientEventParam, ResponseCreateEventWithReferencesParam],
14851517
strip_not_given({"type": "response.create", "event_id": event_id, "response": response}),
14861518
)
14871519
)

‎src/openai/types/realtime/__init__.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from .realtime_mcp_list_tools import RealtimeMcpListTools as RealtimeMcpListTools
3939
from .realtime_response_usage import RealtimeResponseUsage as RealtimeResponseUsage
4040
from .realtime_tracing_config import RealtimeTracingConfig as RealtimeTracingConfig
41+
from .response_item_reference import ResponseItemReference as ResponseItemReference
4142
from .mcp_list_tools_completed import McpListToolsCompleted as McpListToolsCompleted
4243
from .realtime_reasoning_param import RealtimeReasoningParam as RealtimeReasoningParam
4344
from .realtime_response_status import RealtimeResponseStatus as RealtimeResponseStatus
@@ -75,6 +76,7 @@
7576
from .realtime_mcp_approval_request import RealtimeMcpApprovalRequest as RealtimeMcpApprovalRequest
7677
from .realtime_mcp_list_tools_param import RealtimeMcpListToolsParam as RealtimeMcpListToolsParam
7778
from .realtime_tracing_config_param import RealtimeTracingConfigParam as RealtimeTracingConfigParam
79+
from .response_item_reference_param import ResponseItemReferenceParam as ResponseItemReferenceParam
7880
from .response_mcp_call_in_progress import ResponseMcpCallInProgress as ResponseMcpCallInProgress
7981
from .conversation_item_create_event import ConversationItemCreateEvent as ConversationItemCreateEvent
8082
from .conversation_item_delete_event import ConversationItemDeleteEvent as ConversationItemDeleteEvent
@@ -199,6 +201,9 @@
199201
from .realtime_translation_session_update_request import (
200202
RealtimeTranslationSessionUpdateRequest as RealtimeTranslationSessionUpdateRequest,
201203
)
204+
from .response_create_event_with_references_param import (
205+
ResponseCreateEventWithReferencesParam as ResponseCreateEventWithReferencesParam,
206+
)
202207
from .response_function_call_arguments_done_event import (
203208
ResponseFunctionCallArgumentsDoneEvent as ResponseFunctionCallArgumentsDoneEvent,
204209
)
@@ -277,6 +282,9 @@
277282
from .realtime_conversation_item_function_call_output_param import (
278283
RealtimeConversationItemFunctionCallOutputParam as RealtimeConversationItemFunctionCallOutputParam,
279284
)
285+
from .realtime_response_create_params_with_references_param import (
286+
RealtimeResponseCreateParamsWithReferencesParam as RealtimeResponseCreateParamsWithReferencesParam,
287+
)
280288
from .conversation_item_input_audio_transcription_delta_event import (
281289
ConversationItemInputAudioTranscriptionDeltaEvent as ConversationItemInputAudioTranscriptionDeltaEvent,
282290
)

0 commit comments

Comments
 (0)