openai 0.88.0 → 0.89.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/lib/openai/client.rb +4 -0
- data/lib/openai/models/beta/beta_response_input_item.rb +91 -1
- data/lib/openai/models/beta/beta_response_item.rb +93 -1
- data/lib/openai/models/beta/beta_response_output_item.rb +91 -1
- data/lib/openai/models/conversations/conversation_item.rb +91 -1
- data/lib/openai/models/live/audio_format.rb +109 -0
- data/lib/openai/models/live/built_in_voice.rb +38 -0
- data/lib/openai/models/live/client_config.rb +22 -0
- data/lib/openai/models/live/client_delegation.rb +22 -0
- data/lib/openai/models/live/client_event.rb +54 -0
- data/lib/openai/models/live/commentary_append_event.rb +59 -0
- data/lib/openai/models/live/commentary_appended_event.rb +65 -0
- data/lib/openai/models/live/custom_voice.rb +17 -0
- data/lib/openai/models/live/data_channel_config.rb +81 -0
- data/lib/openai/models/live/delegation_created_event.rb +140 -0
- data/lib/openai/models/live/error.rb +60 -0
- data/lib/openai/models/live/error_event.rb +52 -0
- data/lib/openai/models/live/fork_client_event.rb +53 -0
- data/lib/openai/models/live/fork_server_event.rb +295 -0
- data/lib/openai/models/live/fork_session_config.rb +107 -0
- data/lib/openai/models/live/fork_session_start_event.rb +48 -0
- data/lib/openai/models/live/function_tool.rb +60 -0
- data/lib/openai/models/live/info_event.rb +60 -0
- data/lib/openai/models/live/initial_item.rb +419 -0
- data/lib/openai/models/live/input_audio_append_event.rb +50 -0
- data/lib/openai/models/live/input_audio_mute_event.rb +33 -0
- data/lib/openai/models/live/input_audio_muted_event.rb +42 -0
- data/lib/openai/models/live/input_audio_unmute_event.rb +33 -0
- data/lib/openai/models/live/input_audio_unmuted_event.rb +42 -0
- data/lib/openai/models/live/input_transcript_delta_event.rb +76 -0
- data/lib/openai/models/live/instructions_append_event.rb +57 -0
- data/lib/openai/models/live/instructions_appended_event.rb +65 -0
- data/lib/openai/models/live/live_create_params.rb +57 -0
- data/lib/openai/models/live/live_create_response.rb +77 -0
- data/lib/openai/models/live/media_session_config.rb +227 -0
- data/lib/openai/models/live/media_session_fork_config.rb +75 -0
- data/lib/openai/models/live/output_audio_delta_event.rb +58 -0
- data/lib/openai/models/live/output_transcript_delta_event.rb +76 -0
- data/lib/openai/models/live/response_create_event.rb +33 -0
- data/lib/openai/models/live/response_event.rb +67 -0
- data/lib/openai/models/live/response_item_create_event.rb +44 -0
- data/lib/openai/models/live/responses_delegation_config.rb +332 -0
- data/lib/openai/models/live/responses_delegation_update_config.rb +332 -0
- data/lib/openai/models/live/server_event.rb +295 -0
- data/lib/openai/models/live/server_event_selector.rb +32 -0
- data/lib/openai/models/live/session_accept_params.rb +257 -0
- data/lib/openai/models/live/session_close_event.rb +33 -0
- data/lib/openai/models/live/session_closed_event.rb +113 -0
- data/lib/openai/models/live/session_config.rb +236 -0
- data/lib/openai/models/live/session_download_recording_params.rb +27 -0
- data/lib/openai/models/live/session_fork_params.rb +66 -0
- data/lib/openai/models/live/session_fork_response.rb +77 -0
- data/lib/openai/models/live/session_hangup_params.rb +22 -0
- data/lib/openai/models/live/session_refer_params.rb +34 -0
- data/lib/openai/models/live/session_reject_params.rb +32 -0
- data/lib/openai/models/live/session_resource.rb +268 -0
- data/lib/openai/models/live/session_start_event.rb +46 -0
- data/lib/openai/models/live/session_started_event.rb +51 -0
- data/lib/openai/models/live/session_update_config.rb +69 -0
- data/lib/openai/models/live/session_update_event.rb +46 -0
- data/lib/openai/models/live/session_updated_event.rb +51 -0
- data/lib/openai/models/live/session_usage.rb +24 -0
- data/lib/openai/models/live/session_usage_updated_event.rb +81 -0
- data/lib/openai/models/live/thinking_append_event.rb +59 -0
- data/lib/openai/models/live/thinking_appended_event.rb +65 -0
- data/lib/openai/models/responses/response_input_item.rb +91 -1
- data/lib/openai/models/responses/response_item.rb +93 -1
- data/lib/openai/models/responses/response_output_item.rb +91 -1
- data/lib/openai/models/webhooks/live_call_incoming_webhook_event.rb +12 -7
- data/lib/openai/models/webhooks/live_transport_incoming_webhook_event.rb +137 -0
- data/lib/openai/models/webhooks/realtime_call_incoming_webhook_event.rb +4 -4
- data/lib/openai/models/webhooks/unwrap_webhook_event.rb +9 -2
- data/lib/openai/models.rb +2 -0
- data/lib/openai/resources/live/forks.rb +16 -0
- data/lib/openai/resources/live/sessions.rb +180 -0
- data/lib/openai/resources/live/sideband.rb +16 -0
- data/lib/openai/resources/live.rb +54 -0
- data/lib/openai/resources/webhooks.rb +1 -1
- data/lib/openai/version.rb +1 -1
- data/lib/openai.rb +65 -0
- data/rbi/openai/client.rbi +3 -0
- data/rbi/openai/models/beta/beta_response_input_item.rbi +109 -0
- data/rbi/openai/models/beta/beta_response_item.rbi +105 -0
- data/rbi/openai/models/beta/beta_response_output_item.rbi +119 -0
- data/rbi/openai/models/conversations/conversation_item.rbi +133 -0
- data/rbi/openai/models/live/audio_format.rbi +185 -0
- data/rbi/openai/models/live/built_in_voice.rbi +46 -0
- data/rbi/openai/models/live/client_config.rbi +54 -0
- data/rbi/openai/models/live/client_delegation.rbi +51 -0
- data/rbi/openai/models/live/client_event.rbi +41 -0
- data/rbi/openai/models/live/commentary_append_event.rbi +88 -0
- data/rbi/openai/models/live/commentary_appended_event.rbi +97 -0
- data/rbi/openai/models/live/custom_voice.rbi +46 -0
- data/rbi/openai/models/live/data_channel_config.rbi +119 -0
- data/rbi/openai/models/live/delegation_created_event.rbi +207 -0
- data/rbi/openai/models/live/error.rbi +95 -0
- data/rbi/openai/models/live/error_event.rbi +87 -0
- data/rbi/openai/models/live/fork_client_event.rbi +40 -0
- data/rbi/openai/models/live/fork_server_event.rbi +436 -0
- data/rbi/openai/models/live/fork_session_config.rbi +234 -0
- data/rbi/openai/models/live/fork_session_start_event.rbi +80 -0
- data/rbi/openai/models/live/function_tool.rbi +95 -0
- data/rbi/openai/models/live/info_event.rbi +92 -0
- data/rbi/openai/models/live/initial_item.rbi +661 -0
- data/rbi/openai/models/live/input_audio_append_event.rbi +79 -0
- data/rbi/openai/models/live/input_audio_mute_event.rbi +62 -0
- data/rbi/openai/models/live/input_audio_muted_event.rbi +74 -0
- data/rbi/openai/models/live/input_audio_unmute_event.rbi +62 -0
- data/rbi/openai/models/live/input_audio_unmuted_event.rbi +74 -0
- data/rbi/openai/models/live/input_transcript_delta_event.rbi +115 -0
- data/rbi/openai/models/live/instructions_append_event.rbi +86 -0
- data/rbi/openai/models/live/instructions_appended_event.rbi +97 -0
- data/rbi/openai/models/live/live_create_params.rbi +121 -0
- data/rbi/openai/models/live/live_create_response.rbi +160 -0
- data/rbi/openai/models/live/media_session_config.rbi +390 -0
- data/rbi/openai/models/live/media_session_fork_config.rbi +143 -0
- data/rbi/openai/models/live/output_audio_delta_event.rbi +93 -0
- data/rbi/openai/models/live/output_transcript_delta_event.rbi +115 -0
- data/rbi/openai/models/live/response_create_event.rbi +62 -0
- data/rbi/openai/models/live/response_event.rbi +105 -0
- data/rbi/openai/models/live/response_item_create_event.rbi +183 -0
- data/rbi/openai/models/live/responses_delegation_config.rbi +562 -0
- data/rbi/openai/models/live/responses_delegation_update_config.rbi +585 -0
- data/rbi/openai/models/live/server_event.rbi +436 -0
- data/rbi/openai/models/live/server_event_selector.rbi +64 -0
- data/rbi/openai/models/live/session_accept_params.rbi +451 -0
- data/rbi/openai/models/live/session_close_event.rbi +62 -0
- data/rbi/openai/models/live/session_closed_event.rbi +148 -0
- data/rbi/openai/models/live/session_config.rbi +427 -0
- data/rbi/openai/models/live/session_download_recording_params.rbi +57 -0
- data/rbi/openai/models/live/session_fork_params.rbi +131 -0
- data/rbi/openai/models/live/session_fork_response.rbi +160 -0
- data/rbi/openai/models/live/session_hangup_params.rbi +53 -0
- data/rbi/openai/models/live/session_refer_params.rbi +64 -0
- data/rbi/openai/models/live/session_reject_params.rbi +62 -0
- data/rbi/openai/models/live/session_resource.rbi +461 -0
- data/rbi/openai/models/live/session_start_event.rbi +78 -0
- data/rbi/openai/models/live/session_started_event.rbi +86 -0
- data/rbi/openai/models/live/session_update_config.rbi +134 -0
- data/rbi/openai/models/live/session_update_event.rbi +78 -0
- data/rbi/openai/models/live/session_updated_event.rbi +86 -0
- data/rbi/openai/models/live/session_usage.rbi +53 -0
- data/rbi/openai/models/live/session_usage_updated_event.rbi +148 -0
- data/rbi/openai/models/live/thinking_append_event.rbi +88 -0
- data/rbi/openai/models/live/thinking_appended_event.rbi +97 -0
- data/rbi/openai/models/responses/response_input_item.rbi +113 -0
- data/rbi/openai/models/responses/response_item.rbi +105 -0
- data/rbi/openai/models/responses/response_output_item.rbi +125 -0
- data/rbi/openai/models/webhooks/live_call_incoming_webhook_event.rbi +11 -7
- data/rbi/openai/models/webhooks/live_transport_incoming_webhook_event.rbi +226 -0
- data/rbi/openai/models/webhooks/realtime_call_incoming_webhook_event.rbi +4 -4
- data/rbi/openai/models/webhooks/unwrap_webhook_event.rbi +1 -0
- data/rbi/openai/models.rbi +2 -0
- data/rbi/openai/resources/live/forks.rbi +19 -0
- data/rbi/openai/resources/live/sessions.rbi +110 -0
- data/rbi/openai/resources/live/sideband.rbi +19 -0
- data/rbi/openai/resources/live.rbi +43 -0
- data/rbi/openai/resources/responses.rbi +75 -38
- data/rbi/openai/resources/webhooks.rbi +1 -0
- data/sig/openai/client.rbs +2 -0
- data/sig/openai/models/beta/beta_response_input_item.rbs +56 -0
- data/sig/openai/models/beta/beta_response_item.rbs +56 -0
- data/sig/openai/models/beta/beta_response_output_item.rbs +56 -0
- data/sig/openai/models/conversations/conversation_item.rbs +56 -0
- data/sig/openai/models/live/audio_format.rbs +73 -0
- data/sig/openai/models/live/built_in_voice.rbs +58 -0
- data/sig/openai/models/live/client_config.rbs +15 -0
- data/sig/openai/models/live/client_delegation.rbs +15 -0
- data/sig/openai/models/live/client_event.rbs +24 -0
- data/sig/openai/models/live/commentary_append_event.rbs +37 -0
- data/sig/openai/models/live/commentary_appended_event.rbs +44 -0
- data/sig/openai/models/live/custom_voice.rbs +15 -0
- data/sig/openai/models/live/data_channel_config.rbs +56 -0
- data/sig/openai/models/live/delegation_created_event.rbs +89 -0
- data/sig/openai/models/live/error.rbs +46 -0
- data/sig/openai/models/live/error_event.rbs +39 -0
- data/sig/openai/models/live/fork_client_event.rbs +24 -0
- data/sig/openai/models/live/fork_server_event.rbs +212 -0
- data/sig/openai/models/live/fork_session_config.rbs +89 -0
- data/sig/openai/models/live/fork_session_start_event.rbs +32 -0
- data/sig/openai/models/live/function_tool.rbs +42 -0
- data/sig/openai/models/live/info_event.rbs +44 -0
- data/sig/openai/models/live/initial_item.rbs +332 -0
- data/sig/openai/models/live/input_audio_append_event.rbs +32 -0
- data/sig/openai/models/live/input_audio_mute_event.rbs +24 -0
- data/sig/openai/models/live/input_audio_muted_event.rbs +34 -0
- data/sig/openai/models/live/input_audio_unmute_event.rbs +24 -0
- data/sig/openai/models/live/input_audio_unmuted_event.rbs +34 -0
- data/sig/openai/models/live/input_transcript_delta_event.rbs +49 -0
- data/sig/openai/models/live/instructions_append_event.rbs +37 -0
- data/sig/openai/models/live/instructions_appended_event.rbs +44 -0
- data/sig/openai/models/live/live_create_params.rbs +45 -0
- data/sig/openai/models/live/live_create_response.rbs +49 -0
- data/sig/openai/models/live/media_session_config.rbs +157 -0
- data/sig/openai/models/live/media_session_fork_config.rbs +66 -0
- data/sig/openai/models/live/output_audio_delta_event.rbs +41 -0
- data/sig/openai/models/live/output_transcript_delta_event.rbs +49 -0
- data/sig/openai/models/live/response_create_event.rbs +18 -0
- data/sig/openai/models/live/response_event.rbs +44 -0
- data/sig/openai/models/live/response_item_create_event.rbs +32 -0
- data/sig/openai/models/live/responses_delegation_config.rbs +244 -0
- data/sig/openai/models/live/responses_delegation_update_config.rbs +246 -0
- data/sig/openai/models/live/server_event.rbs +212 -0
- data/sig/openai/models/live/server_event_selector.rbs +19 -0
- data/sig/openai/models/live/session_accept_params.rbs +185 -0
- data/sig/openai/models/live/session_close_event.rbs +17 -0
- data/sig/openai/models/live/session_closed_event.rbs +68 -0
- data/sig/openai/models/live/session_config.rbs +168 -0
- data/sig/openai/models/live/session_download_recording_params.rbs +25 -0
- data/sig/openai/models/live/session_fork_params.rbs +54 -0
- data/sig/openai/models/live/session_fork_response.rbs +49 -0
- data/sig/openai/models/live/session_hangup_params.rbs +25 -0
- data/sig/openai/models/live/session_refer_params.rbs +33 -0
- data/sig/openai/models/live/session_reject_params.rbs +33 -0
- data/sig/openai/models/live/session_resource.rbs +183 -0
- data/sig/openai/models/live/session_start_event.rbs +32 -0
- data/sig/openai/models/live/session_started_event.rbs +39 -0
- data/sig/openai/models/live/session_update_config.rbs +56 -0
- data/sig/openai/models/live/session_update_event.rbs +32 -0
- data/sig/openai/models/live/session_updated_event.rbs +39 -0
- data/sig/openai/models/live/session_usage.rbs +15 -0
- data/sig/openai/models/live/session_usage_updated_event.rbs +58 -0
- data/sig/openai/models/live/thinking_append_event.rbs +37 -0
- data/sig/openai/models/live/thinking_appended_event.rbs +44 -0
- data/sig/openai/models/responses/response_input_item.rbs +56 -0
- data/sig/openai/models/responses/response_item.rbs +56 -0
- data/sig/openai/models/responses/response_output_item.rbs +56 -0
- data/sig/openai/models/webhooks/live_transport_incoming_webhook_event.rbs +95 -0
- data/sig/openai/models/webhooks/unwrap_webhook_event.rbs +1 -0
- data/sig/openai/models.rbs +2 -0
- data/sig/openai/resources/live/forks.rbs +9 -0
- data/sig/openai/resources/live/sessions.rbs +44 -0
- data/sig/openai/resources/live/sideband.rbs +9 -0
- data/sig/openai/resources/live.rbs +19 -0
- data/sig/openai/resources/webhooks.rbs +1 -0
- metadata +196 -1
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module OpenAI
|
|
4
|
+
module Models
|
|
5
|
+
|
|
6
|
+
module Live
|
|
7
|
+
|
|
8
|
+
class SessionAcceptParams < OpenAI::Internal::Type::BaseModel
|
|
9
|
+
|
|
10
|
+
extend OpenAI::Internal::Type::RequestParameters::Converter
|
|
11
|
+
include OpenAI::Internal::Type::RequestParameters
|
|
12
|
+
|
|
13
|
+
OrHash = T.type_alias do
|
|
14
|
+
T.any(
|
|
15
|
+
OpenAI::Live::SessionAcceptParams,
|
|
16
|
+
OpenAI::Internal::AnyHash
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
sig { returns(String) }
|
|
21
|
+
attr_accessor :session_id
|
|
22
|
+
|
|
23
|
+
# Model and startup configuration for the Live session that answers the incoming
|
|
24
|
+
# SIP call.
|
|
25
|
+
sig { returns(OpenAI::Live::SessionAcceptParams::Session) }
|
|
26
|
+
attr_reader :session
|
|
27
|
+
|
|
28
|
+
sig { params(session: OpenAI::Live::SessionAcceptParams::Session::OrHash).void }
|
|
29
|
+
attr_writer :session
|
|
30
|
+
|
|
31
|
+
sig do
|
|
32
|
+
params(
|
|
33
|
+
|
|
34
|
+
session_id: String,
|
|
35
|
+
|
|
36
|
+
session: OpenAI::Live::SessionAcceptParams::Session::OrHash,
|
|
37
|
+
|
|
38
|
+
request_options: OpenAI::RequestOptions::OrHash
|
|
39
|
+
)
|
|
40
|
+
.returns(T.attached_class)
|
|
41
|
+
end
|
|
42
|
+
def self.new(
|
|
43
|
+
|
|
44
|
+
session_id:,
|
|
45
|
+
|
|
46
|
+
# Model and startup configuration for the Live session that answers the incoming
|
|
47
|
+
# SIP call.
|
|
48
|
+
session:,
|
|
49
|
+
|
|
50
|
+
request_options: {}
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
sig do
|
|
55
|
+
override.returns(
|
|
56
|
+
{
|
|
57
|
+
session_id: String,
|
|
58
|
+
session: OpenAI::Live::SessionAcceptParams::Session,
|
|
59
|
+
request_options: OpenAI::RequestOptions
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
def to_hash
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class Session < OpenAI::Internal::Type::BaseModel
|
|
67
|
+
OrHash = T.type_alias do
|
|
68
|
+
T.any(
|
|
69
|
+
OpenAI::Live::SessionAcceptParams::Session,
|
|
70
|
+
OpenAI::Internal::AnyHash
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# The Live model to use for the accepted call.
|
|
75
|
+
sig { returns(T.any(String, OpenAI::Live::SessionAcceptParams::Session::Model::OrSymbol)) }
|
|
76
|
+
attr_accessor :model
|
|
77
|
+
|
|
78
|
+
# The session type. Always `live`.
|
|
79
|
+
sig { returns(Symbol) }
|
|
80
|
+
attr_accessor :type
|
|
81
|
+
|
|
82
|
+
# Startup audio output configuration. SIP negotiates the media format;
|
|
83
|
+
# audio.format is only accepted for primary WebSockets. Voice cannot change after
|
|
84
|
+
# startup.
|
|
85
|
+
sig { returns(T.nilable(OpenAI::Live::SessionAcceptParams::Session::Audio)) }
|
|
86
|
+
attr_reader :audio
|
|
87
|
+
|
|
88
|
+
sig { params(audio: OpenAI::Live::SessionAcceptParams::Session::Audio::OrHash).void }
|
|
89
|
+
attr_writer :audio
|
|
90
|
+
|
|
91
|
+
# Who handles tasks delegated by the Live model. Omitted or null selects your
|
|
92
|
+
# application; use `responses` to let the API manage a Responses backend.
|
|
93
|
+
sig {
|
|
94
|
+
returns(
|
|
95
|
+
T.nilable(
|
|
96
|
+
T.any(OpenAI::Live::ClientDelegation, OpenAI::Live::SessionAcceptParams::Session::Delegation::Responses)
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
attr_accessor :delegation
|
|
101
|
+
|
|
102
|
+
# Ordered text-only history supplied before startup. Supports developer, user, and
|
|
103
|
+
# assistant messages with one text part each; at most 128 messages and 8,192
|
|
104
|
+
# rendered tokens in total.
|
|
105
|
+
sig {
|
|
106
|
+
returns(
|
|
107
|
+
T.nilable(
|
|
108
|
+
T::Array[
|
|
109
|
+
T.any(
|
|
110
|
+
OpenAI::Live::InitialItem::Developer,
|
|
111
|
+
OpenAI::Live::InitialItem::User,
|
|
112
|
+
OpenAI::Live::InitialItem::Assistant
|
|
113
|
+
)
|
|
114
|
+
]
|
|
115
|
+
)
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
attr_reader :input
|
|
119
|
+
|
|
120
|
+
sig {
|
|
121
|
+
params(
|
|
122
|
+
input: T::Array[
|
|
123
|
+
T.any(
|
|
124
|
+
OpenAI::Live::InitialItem::Developer::OrHash,
|
|
125
|
+
OpenAI::Live::InitialItem::User::OrHash,
|
|
126
|
+
OpenAI::Live::InitialItem::Assistant::OrHash
|
|
127
|
+
)
|
|
128
|
+
]
|
|
129
|
+
)
|
|
130
|
+
.void
|
|
131
|
+
}
|
|
132
|
+
attr_writer :input
|
|
133
|
+
|
|
134
|
+
# Frontend instructions for voice, conversation, interruptions, and when to
|
|
135
|
+
# delegate. Start with the
|
|
136
|
+
# [Live prompting guide](https://developers.openai.com/api/docs/guides/live-prompting);
|
|
137
|
+
# put business rules and tool workflows in a separate
|
|
138
|
+
# [backend prompt](https://developers.openai.com/api/docs/guides/live-delegation#start-with-your-existing-backend-prompt).
|
|
139
|
+
# Limited to 16,384 client-supplied tokens. Omitted or blank instructions use
|
|
140
|
+
# server defaults. Immutable after startup.
|
|
141
|
+
sig { returns(T.nilable(String)) }
|
|
142
|
+
attr_accessor :instructions
|
|
143
|
+
|
|
144
|
+
# Whether to store the session for later forking and recording download. Defaults
|
|
145
|
+
# to false for new sessions.
|
|
146
|
+
sig { returns(T.nilable(T::Boolean)) }
|
|
147
|
+
attr_reader :store
|
|
148
|
+
|
|
149
|
+
sig { params(store: T::Boolean).void }
|
|
150
|
+
attr_writer :store
|
|
151
|
+
|
|
152
|
+
# Model and startup configuration for the Live session that answers the incoming
|
|
153
|
+
# SIP call.
|
|
154
|
+
sig do
|
|
155
|
+
params(
|
|
156
|
+
|
|
157
|
+
model: T.any(String, OpenAI::Live::SessionAcceptParams::Session::Model::OrSymbol),
|
|
158
|
+
|
|
159
|
+
audio: OpenAI::Live::SessionAcceptParams::Session::Audio::OrHash,
|
|
160
|
+
|
|
161
|
+
delegation: T.nilable(
|
|
162
|
+
T.any(
|
|
163
|
+
OpenAI::Live::ClientDelegation::OrHash,
|
|
164
|
+
OpenAI::Live::SessionAcceptParams::Session::Delegation::Responses::OrHash
|
|
165
|
+
)
|
|
166
|
+
),
|
|
167
|
+
|
|
168
|
+
input: T::Array[
|
|
169
|
+
T.any(
|
|
170
|
+
OpenAI::Live::InitialItem::Developer::OrHash,
|
|
171
|
+
OpenAI::Live::InitialItem::User::OrHash,
|
|
172
|
+
OpenAI::Live::InitialItem::Assistant::OrHash
|
|
173
|
+
)
|
|
174
|
+
],
|
|
175
|
+
|
|
176
|
+
instructions: T.nilable(String),
|
|
177
|
+
|
|
178
|
+
store: T::Boolean,
|
|
179
|
+
|
|
180
|
+
type: Symbol
|
|
181
|
+
)
|
|
182
|
+
.returns(T.attached_class)
|
|
183
|
+
end
|
|
184
|
+
def self.new(
|
|
185
|
+
|
|
186
|
+
# The Live model to use for the accepted call.
|
|
187
|
+
model:,
|
|
188
|
+
|
|
189
|
+
# Startup audio output configuration. SIP negotiates the media format;
|
|
190
|
+
# audio.format is only accepted for primary WebSockets. Voice cannot change after
|
|
191
|
+
# startup.
|
|
192
|
+
audio: nil,
|
|
193
|
+
|
|
194
|
+
# Who handles tasks delegated by the Live model. Omitted or null selects your
|
|
195
|
+
# application; use `responses` to let the API manage a Responses backend.
|
|
196
|
+
delegation: nil,
|
|
197
|
+
|
|
198
|
+
# Ordered text-only history supplied before startup. Supports developer, user, and
|
|
199
|
+
# assistant messages with one text part each; at most 128 messages and 8,192
|
|
200
|
+
# rendered tokens in total.
|
|
201
|
+
input: nil,
|
|
202
|
+
|
|
203
|
+
# Frontend instructions for voice, conversation, interruptions, and when to
|
|
204
|
+
# delegate. Start with the
|
|
205
|
+
# [Live prompting guide](https://developers.openai.com/api/docs/guides/live-prompting);
|
|
206
|
+
# put business rules and tool workflows in a separate
|
|
207
|
+
# [backend prompt](https://developers.openai.com/api/docs/guides/live-delegation#start-with-your-existing-backend-prompt).
|
|
208
|
+
# Limited to 16,384 client-supplied tokens. Omitted or blank instructions use
|
|
209
|
+
# server defaults. Immutable after startup.
|
|
210
|
+
instructions: nil,
|
|
211
|
+
|
|
212
|
+
# Whether to store the session for later forking and recording download. Defaults
|
|
213
|
+
# to false for new sessions.
|
|
214
|
+
store: nil,
|
|
215
|
+
|
|
216
|
+
# The session type. Always `live`.
|
|
217
|
+
|
|
218
|
+
type: :live
|
|
219
|
+
)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
sig do
|
|
223
|
+
override.returns(
|
|
224
|
+
{
|
|
225
|
+
model: T.any(String, OpenAI::Live::SessionAcceptParams::Session::Model::OrSymbol),
|
|
226
|
+
type: Symbol,
|
|
227
|
+
audio: OpenAI::Live::SessionAcceptParams::Session::Audio,
|
|
228
|
+
delegation: T.nilable(
|
|
229
|
+
T.any(
|
|
230
|
+
OpenAI::Live::ClientDelegation,
|
|
231
|
+
OpenAI::Live::SessionAcceptParams::Session::Delegation::Responses
|
|
232
|
+
)
|
|
233
|
+
),
|
|
234
|
+
input: T::Array[
|
|
235
|
+
T.any(
|
|
236
|
+
OpenAI::Live::InitialItem::Developer,
|
|
237
|
+
OpenAI::Live::InitialItem::User,
|
|
238
|
+
OpenAI::Live::InitialItem::Assistant
|
|
239
|
+
)
|
|
240
|
+
],
|
|
241
|
+
instructions: T.nilable(String),
|
|
242
|
+
store: T::Boolean
|
|
243
|
+
}
|
|
244
|
+
)
|
|
245
|
+
end
|
|
246
|
+
def to_hash
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# The Live model to use for the accepted call.
|
|
250
|
+
module Model
|
|
251
|
+
extend OpenAI::Internal::Type::Union
|
|
252
|
+
|
|
253
|
+
Variants = T.type_alias { T.any(String, OpenAI::Live::SessionAcceptParams::Session::Model::TaggedSymbol) }
|
|
254
|
+
|
|
255
|
+
sig { override.returns(T::Array[OpenAI::Live::SessionAcceptParams::Session::Model::Variants]) }
|
|
256
|
+
def self.variants
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
TaggedSymbol = T.type_alias do
|
|
260
|
+
T.all(Symbol, OpenAI::Live::SessionAcceptParams::Session::Model)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
264
|
+
|
|
265
|
+
GPT_LIVE_1 = T.let(:"gpt-live-1", OpenAI::Live::SessionAcceptParams::Session::Model::TaggedSymbol)
|
|
266
|
+
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
class Audio < OpenAI::Internal::Type::BaseModel
|
|
270
|
+
OrHash = T.type_alias do
|
|
271
|
+
T.any(
|
|
272
|
+
OpenAI::Live::SessionAcceptParams::Session::Audio,
|
|
273
|
+
OpenAI::Internal::AnyHash
|
|
274
|
+
)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Settings for speech generated by the Live model. Choose the voice before
|
|
278
|
+
# starting the session.
|
|
279
|
+
sig { returns(T.nilable(OpenAI::Live::SessionAcceptParams::Session::Audio::Output)) }
|
|
280
|
+
attr_reader :output
|
|
281
|
+
|
|
282
|
+
sig { params(output: OpenAI::Live::SessionAcceptParams::Session::Audio::Output::OrHash).void }
|
|
283
|
+
attr_writer :output
|
|
284
|
+
|
|
285
|
+
# Startup audio output configuration. SIP negotiates the media format;
|
|
286
|
+
# audio.format is only accepted for primary WebSockets. Voice cannot change after
|
|
287
|
+
# startup.
|
|
288
|
+
sig do
|
|
289
|
+
params(
|
|
290
|
+
|
|
291
|
+
output: OpenAI::Live::SessionAcceptParams::Session::Audio::Output::OrHash
|
|
292
|
+
)
|
|
293
|
+
.returns(T.attached_class)
|
|
294
|
+
end
|
|
295
|
+
def self.new(
|
|
296
|
+
|
|
297
|
+
# Settings for speech generated by the Live model. Choose the voice before
|
|
298
|
+
# starting the session.
|
|
299
|
+
|
|
300
|
+
output: nil
|
|
301
|
+
)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
sig do
|
|
305
|
+
override.returns(
|
|
306
|
+
{output: OpenAI::Live::SessionAcceptParams::Session::Audio::Output}
|
|
307
|
+
)
|
|
308
|
+
end
|
|
309
|
+
def to_hash
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
class Output < OpenAI::Internal::Type::BaseModel
|
|
313
|
+
OrHash = T.type_alias do
|
|
314
|
+
T.any(
|
|
315
|
+
OpenAI::Live::SessionAcceptParams::Session::Audio::Output,
|
|
316
|
+
OpenAI::Internal::AnyHash
|
|
317
|
+
)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# The voice used for Live speech, as a built-in voice name or a custom voice
|
|
321
|
+
# object containing its ID. Defaults to `marin` and cannot change after startup.
|
|
322
|
+
sig {
|
|
323
|
+
returns(T.nilable(T.any(String, OpenAI::Live::BuiltInVoice::OrSymbol, OpenAI::Live::CustomVoice)))
|
|
324
|
+
}
|
|
325
|
+
attr_reader :voice
|
|
326
|
+
|
|
327
|
+
sig {
|
|
328
|
+
params(voice: T.any(String, OpenAI::Live::BuiltInVoice::OrSymbol, OpenAI::Live::CustomVoice::OrHash))
|
|
329
|
+
.void
|
|
330
|
+
}
|
|
331
|
+
attr_writer :voice
|
|
332
|
+
|
|
333
|
+
# Settings for speech generated by the Live model. Choose the voice before
|
|
334
|
+
# starting the session.
|
|
335
|
+
sig do
|
|
336
|
+
params(
|
|
337
|
+
|
|
338
|
+
voice: T.any(String, OpenAI::Live::BuiltInVoice::OrSymbol, OpenAI::Live::CustomVoice::OrHash)
|
|
339
|
+
)
|
|
340
|
+
.returns(T.attached_class)
|
|
341
|
+
end
|
|
342
|
+
def self.new(
|
|
343
|
+
|
|
344
|
+
# The voice used for Live speech, as a built-in voice name or a custom voice
|
|
345
|
+
# object containing its ID. Defaults to `marin` and cannot change after startup.
|
|
346
|
+
|
|
347
|
+
voice: nil
|
|
348
|
+
)
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
sig do
|
|
352
|
+
override.returns(
|
|
353
|
+
{voice: T.any(String, OpenAI::Live::BuiltInVoice::OrSymbol, OpenAI::Live::CustomVoice)}
|
|
354
|
+
)
|
|
355
|
+
end
|
|
356
|
+
def to_hash
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# The voice used for Live speech, as a built-in voice name or a custom voice
|
|
360
|
+
# object containing its ID. Defaults to `marin` and cannot change after startup.
|
|
361
|
+
module Voice
|
|
362
|
+
extend OpenAI::Internal::Type::Union
|
|
363
|
+
|
|
364
|
+
Variants = T.type_alias {
|
|
365
|
+
T.any(String, OpenAI::Live::BuiltInVoice::TaggedSymbol, OpenAI::Live::CustomVoice)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
sig {
|
|
369
|
+
override.returns(T::Array[OpenAI::Live::SessionAcceptParams::Session::Audio::Output::Voice::Variants])
|
|
370
|
+
}
|
|
371
|
+
def self.variants
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
# Who handles tasks delegated by the Live model. Omitted or null selects your
|
|
379
|
+
# application; use `responses` to let the API manage a Responses backend.
|
|
380
|
+
module Delegation
|
|
381
|
+
extend OpenAI::Internal::Type::Union
|
|
382
|
+
|
|
383
|
+
Variants = T.type_alias {
|
|
384
|
+
T.any(OpenAI::Live::ClientDelegation, OpenAI::Live::SessionAcceptParams::Session::Delegation::Responses)
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
class Responses < OpenAI::Internal::Type::BaseModel
|
|
388
|
+
OrHash = T.type_alias do
|
|
389
|
+
T.any(
|
|
390
|
+
OpenAI::Live::SessionAcceptParams::Session::Delegation::Responses,
|
|
391
|
+
OpenAI::Internal::AnyHash
|
|
392
|
+
)
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
# Backend model, prompt, and tools used when the Live session delegates a task to
|
|
396
|
+
# Responses.
|
|
397
|
+
sig { returns(OpenAI::Live::ResponsesDelegationConfig) }
|
|
398
|
+
attr_reader :responses
|
|
399
|
+
|
|
400
|
+
sig { params(responses: OpenAI::Live::ResponsesDelegationConfig::OrHash).void }
|
|
401
|
+
attr_writer :responses
|
|
402
|
+
|
|
403
|
+
# The delegation owner. Always `responses` for tasks handled by the Responses API.
|
|
404
|
+
sig { returns(Symbol) }
|
|
405
|
+
attr_accessor :type
|
|
406
|
+
|
|
407
|
+
# Delegate tasks to a Responses model managed by the Live session.
|
|
408
|
+
sig do
|
|
409
|
+
params(
|
|
410
|
+
|
|
411
|
+
responses: OpenAI::Live::ResponsesDelegationConfig::OrHash,
|
|
412
|
+
|
|
413
|
+
type: Symbol
|
|
414
|
+
)
|
|
415
|
+
.returns(T.attached_class)
|
|
416
|
+
end
|
|
417
|
+
def self.new(
|
|
418
|
+
|
|
419
|
+
# Backend model, prompt, and tools used when the Live session delegates a task to
|
|
420
|
+
# Responses.
|
|
421
|
+
responses:,
|
|
422
|
+
|
|
423
|
+
# The delegation owner. Always `responses` for tasks handled by the Responses API.
|
|
424
|
+
|
|
425
|
+
type: :responses
|
|
426
|
+
)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
sig do
|
|
430
|
+
override.returns(
|
|
431
|
+
{responses: OpenAI::Live::ResponsesDelegationConfig, type: Symbol}
|
|
432
|
+
)
|
|
433
|
+
end
|
|
434
|
+
def to_hash
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
sig { override.returns(T::Array[OpenAI::Live::SessionAcceptParams::Session::Delegation::Variants]) }
|
|
440
|
+
def self.variants
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
end
|
|
451
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module OpenAI
|
|
4
|
+
module Models
|
|
5
|
+
|
|
6
|
+
module Live
|
|
7
|
+
|
|
8
|
+
class SessionCloseEvent < OpenAI::Internal::Type::BaseModel
|
|
9
|
+
|
|
10
|
+
OrHash = T.type_alias do
|
|
11
|
+
T.any(
|
|
12
|
+
OpenAI::Live::SessionCloseEvent,
|
|
13
|
+
OpenAI::Internal::AnyHash
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# The Live client event type. Always `session.close`.
|
|
18
|
+
sig { returns(Symbol) }
|
|
19
|
+
attr_accessor :type
|
|
20
|
+
|
|
21
|
+
# Optional client identifier for correlating this command with a server event's
|
|
22
|
+
# client_event_id or error.client_event_id.
|
|
23
|
+
sig { returns(T.nilable(String)) }
|
|
24
|
+
attr_accessor :event_id
|
|
25
|
+
|
|
26
|
+
# Request that the Live session close. The terminal `session.closed` event
|
|
27
|
+
# contains the close reason and final usage.
|
|
28
|
+
sig do
|
|
29
|
+
params(
|
|
30
|
+
|
|
31
|
+
event_id: T.nilable(String),
|
|
32
|
+
|
|
33
|
+
type: Symbol
|
|
34
|
+
)
|
|
35
|
+
.returns(T.attached_class)
|
|
36
|
+
end
|
|
37
|
+
def self.new(
|
|
38
|
+
|
|
39
|
+
# Optional client identifier for correlating this command with a server event's
|
|
40
|
+
# client_event_id or error.client_event_id.
|
|
41
|
+
event_id: nil,
|
|
42
|
+
|
|
43
|
+
# The Live client event type. Always `session.close`.
|
|
44
|
+
|
|
45
|
+
type: :"session.close"
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
sig do
|
|
50
|
+
override.returns(
|
|
51
|
+
{type: Symbol, event_id: T.nilable(String)}
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
def to_hash
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module OpenAI
|
|
4
|
+
module Models
|
|
5
|
+
|
|
6
|
+
module Live
|
|
7
|
+
|
|
8
|
+
class SessionClosedEvent < OpenAI::Internal::Type::BaseModel
|
|
9
|
+
|
|
10
|
+
OrHash = T.type_alias do
|
|
11
|
+
T.any(
|
|
12
|
+
OpenAI::Live::SessionClosedEvent,
|
|
13
|
+
OpenAI::Internal::AnyHash
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# The unique ID of the Live server event.
|
|
18
|
+
sig { returns(String) }
|
|
19
|
+
attr_accessor :event_id
|
|
20
|
+
|
|
21
|
+
# Why the Live session ended: `close_requested` for an application close or hangup
|
|
22
|
+
# request, `expired` for the session duration limit, `content` for a safety
|
|
23
|
+
# filter, `remote_hangup` for a graceful remote disconnect, or `connection_lost`
|
|
24
|
+
# for an unexpected primary or upstream disconnection.
|
|
25
|
+
sig { returns(OpenAI::Live::SessionClosedEvent::Reason::OrSymbol) }
|
|
26
|
+
attr_accessor :reason
|
|
27
|
+
|
|
28
|
+
# The resolved Live session configuration and server-assigned session metadata.
|
|
29
|
+
sig { returns(OpenAI::Live::SessionResource) }
|
|
30
|
+
attr_reader :session
|
|
31
|
+
|
|
32
|
+
sig { params(session: OpenAI::Live::SessionResource::OrHash).void }
|
|
33
|
+
attr_writer :session
|
|
34
|
+
|
|
35
|
+
# The event type, always `session.closed`.
|
|
36
|
+
sig { returns(Symbol) }
|
|
37
|
+
attr_accessor :type
|
|
38
|
+
|
|
39
|
+
# The final cumulative Live audio usage after session finalization.
|
|
40
|
+
sig { returns(OpenAI::Live::SessionUsage) }
|
|
41
|
+
attr_reader :usage
|
|
42
|
+
|
|
43
|
+
sig { params(usage: OpenAI::Live::SessionUsage::OrHash).void }
|
|
44
|
+
attr_writer :usage
|
|
45
|
+
|
|
46
|
+
# The event_id of the client command associated with this server event, when
|
|
47
|
+
# supplied.
|
|
48
|
+
sig { returns(T.nilable(String)) }
|
|
49
|
+
attr_reader :client_event_id
|
|
50
|
+
|
|
51
|
+
sig { params(client_event_id: String).void }
|
|
52
|
+
attr_writer :client_event_id
|
|
53
|
+
|
|
54
|
+
# Returned after the Live session finishes finalizing, with the close reason,
|
|
55
|
+
# final session snapshot, and cumulative audio usage. A connection closing without
|
|
56
|
+
# this event does not confirm successful finalization.
|
|
57
|
+
sig do
|
|
58
|
+
params(
|
|
59
|
+
|
|
60
|
+
event_id: String,
|
|
61
|
+
|
|
62
|
+
reason: OpenAI::Live::SessionClosedEvent::Reason::OrSymbol,
|
|
63
|
+
|
|
64
|
+
session: OpenAI::Live::SessionResource::OrHash,
|
|
65
|
+
|
|
66
|
+
usage: OpenAI::Live::SessionUsage::OrHash,
|
|
67
|
+
|
|
68
|
+
client_event_id: String,
|
|
69
|
+
|
|
70
|
+
type: Symbol
|
|
71
|
+
)
|
|
72
|
+
.returns(T.attached_class)
|
|
73
|
+
end
|
|
74
|
+
def self.new(
|
|
75
|
+
|
|
76
|
+
# The unique ID of the Live server event.
|
|
77
|
+
event_id:,
|
|
78
|
+
|
|
79
|
+
# Why the Live session ended: `close_requested` for an application close or hangup
|
|
80
|
+
# request, `expired` for the session duration limit, `content` for a safety
|
|
81
|
+
# filter, `remote_hangup` for a graceful remote disconnect, or `connection_lost`
|
|
82
|
+
# for an unexpected primary or upstream disconnection.
|
|
83
|
+
reason:,
|
|
84
|
+
|
|
85
|
+
# The resolved Live session configuration and server-assigned session metadata.
|
|
86
|
+
session:,
|
|
87
|
+
|
|
88
|
+
# The final cumulative Live audio usage after session finalization.
|
|
89
|
+
usage:,
|
|
90
|
+
|
|
91
|
+
# The event_id of the client command associated with this server event, when
|
|
92
|
+
# supplied.
|
|
93
|
+
client_event_id: nil,
|
|
94
|
+
|
|
95
|
+
# The event type, always `session.closed`.
|
|
96
|
+
|
|
97
|
+
type: :"session.closed"
|
|
98
|
+
)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
sig do
|
|
102
|
+
override.returns(
|
|
103
|
+
{
|
|
104
|
+
event_id: String,
|
|
105
|
+
reason: OpenAI::Live::SessionClosedEvent::Reason::OrSymbol,
|
|
106
|
+
session: OpenAI::Live::SessionResource,
|
|
107
|
+
type: Symbol,
|
|
108
|
+
usage: OpenAI::Live::SessionUsage,
|
|
109
|
+
client_event_id: T.nilable(String)
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
end
|
|
113
|
+
def to_hash
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Why the Live session ended: `close_requested` for an application close or hangup
|
|
117
|
+
# request, `expired` for the session duration limit, `content` for a safety
|
|
118
|
+
# filter, `remote_hangup` for a graceful remote disconnect, or `connection_lost`
|
|
119
|
+
# for an unexpected primary or upstream disconnection.
|
|
120
|
+
module Reason
|
|
121
|
+
extend OpenAI::Internal::Type::Union
|
|
122
|
+
|
|
123
|
+
Variants = T.type_alias { OpenAI::Live::SessionClosedEvent::Reason::TaggedSymbol }
|
|
124
|
+
|
|
125
|
+
sig { override.returns(T::Array[OpenAI::Live::SessionClosedEvent::Reason::Variants]) }
|
|
126
|
+
def self.variants
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
TaggedSymbol = T.type_alias do
|
|
130
|
+
T.all(Symbol, OpenAI::Live::SessionClosedEvent::Reason)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
134
|
+
|
|
135
|
+
CLOSE_REQUESTED = T.let(:close_requested, OpenAI::Live::SessionClosedEvent::Reason::TaggedSymbol)
|
|
136
|
+
EXPIRED = T.let(:expired, OpenAI::Live::SessionClosedEvent::Reason::TaggedSymbol)
|
|
137
|
+
CONTENT = T.let(:content, OpenAI::Live::SessionClosedEvent::Reason::TaggedSymbol)
|
|
138
|
+
REMOTE_HANGUP = T.let(:remote_hangup, OpenAI::Live::SessionClosedEvent::Reason::TaggedSymbol)
|
|
139
|
+
CONNECTION_LOST = T.let(:connection_lost, OpenAI::Live::SessionClosedEvent::Reason::TaggedSymbol)
|
|
140
|
+
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
end
|
|
148
|
+
end
|