revox 0.2.0 → 0.4.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.
Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/README.md +38 -38
  4. data/lib/revox/client.rb +8 -0
  5. data/lib/revox/internal/type/base_model.rb +3 -3
  6. data/lib/revox/models/assistant_clone_params.rb +20 -0
  7. data/lib/revox/models/assistant_clone_response.rb +1616 -0
  8. data/lib/revox/models/assistant_create_params.rb +90 -66
  9. data/lib/revox/models/assistant_create_response.rb +87 -65
  10. data/lib/revox/models/assistant_list_response.rb +87 -65
  11. data/lib/revox/models/assistant_retrieve_response.rb +86 -65
  12. data/lib/revox/models/assistant_update_params.rb +90 -66
  13. data/lib/revox/models/assistant_update_response.rb +87 -65
  14. data/lib/revox/models/auth_status_retrieve_params.rb +14 -0
  15. data/lib/revox/models/auth_status_retrieve_response.rb +17 -0
  16. data/lib/revox/models/call_cancel_params.rb +20 -0
  17. data/lib/revox/models/call_cancel_response.rb +16 -0
  18. data/lib/revox/models/call_create_params.rb +117 -90
  19. data/lib/revox/models/call_create_response.rb +680 -90
  20. data/lib/revox/models/call_export_params.rb +203 -0
  21. data/lib/revox/models/call_export_response.rb +22 -0
  22. data/lib/revox/models/call_pause_params.rb +20 -0
  23. data/lib/revox/models/call_pause_response.rb +16 -0
  24. data/lib/revox/models/call_phone_history_params.rb +14 -0
  25. data/lib/revox/models/call_phone_history_response.rb +95 -0
  26. data/lib/revox/models/call_resume_params.rb +20 -0
  27. data/lib/revox/models/call_resume_response.rb +16 -0
  28. data/lib/revox/models/call_retrieve_response.rb +681 -90
  29. data/lib/revox/models/call_search_params.rb +169 -0
  30. data/lib/revox/models/call_search_response.rb +3694 -0
  31. data/lib/revox/models/campaign_create_params.rb +7 -57
  32. data/lib/revox/models/campaign_create_response.rb +108 -119
  33. data/lib/revox/models/campaign_get_rows_response.rb +682 -90
  34. data/lib/revox/models/campaign_list_response.rb +108 -119
  35. data/lib/revox/models/campaign_pause_params.rb +20 -0
  36. data/lib/revox/models/campaign_pause_response.rb +16 -0
  37. data/lib/revox/models/campaign_resume_params.rb +20 -0
  38. data/lib/revox/models/campaign_resume_response.rb +16 -0
  39. data/lib/revox/models/campaign_retrieve_response.rb +108 -119
  40. data/lib/revox/models/campaign_statistics_params.rb +20 -0
  41. data/lib/revox/models/campaign_statistics_response.rb +514 -0
  42. data/lib/revox/models/campaign_update_params.rb +165 -0
  43. data/lib/revox/models/campaign_update_response.rb +2019 -0
  44. data/lib/revox/models/phone_number_delete_params.rb +20 -0
  45. data/lib/revox/models/phone_number_delete_response.rb +16 -0
  46. data/lib/revox/models/phone_number_list_params.rb +14 -0
  47. data/lib/revox/models/phone_number_list_response.rb +1799 -0
  48. data/lib/revox/models/phone_number_update_params.rb +32 -0
  49. data/lib/revox/models/phone_number_update_response.rb +1799 -0
  50. data/lib/revox/models/user_retrieve_params.rb +14 -0
  51. data/lib/revox/models/user_retrieve_response.rb +99 -0
  52. data/lib/revox/models/voice_clone_params.rb +78 -0
  53. data/lib/revox/models/voice_clone_response.rb +40 -0
  54. data/lib/revox/models/voice_delete_params.rb +20 -0
  55. data/lib/revox/models/voice_delete_response.rb +16 -0
  56. data/lib/revox/models/voice_list_response.rb +1 -0
  57. data/lib/revox/models/voice_preview_params.rb +1 -0
  58. data/lib/revox/models/voice_retrieve_params.rb +1 -0
  59. data/lib/revox/models.rb +35 -1
  60. data/lib/revox/resources/assistants.rb +31 -10
  61. data/lib/revox/resources/auth_status.rb +32 -0
  62. data/lib/revox/resources/call.rb +149 -4
  63. data/lib/revox/resources/campaigns.rb +110 -11
  64. data/lib/revox/resources/phone_numbers.rb +74 -0
  65. data/lib/revox/resources/users.rb +17 -3
  66. data/lib/revox/resources/voices.rb +50 -0
  67. data/lib/revox/version.rb +1 -1
  68. data/lib/revox.rb +38 -5
  69. data/rbi/revox/client.rbi +6 -0
  70. data/rbi/revox/models/assistant_clone_params.rbi +33 -0
  71. data/rbi/revox/models/assistant_clone_response.rbi +3351 -0
  72. data/rbi/revox/models/assistant_create_params.rbi +148 -162
  73. data/rbi/revox/models/assistant_create_response.rbi +157 -147
  74. data/rbi/revox/models/assistant_list_response.rbi +157 -147
  75. data/rbi/revox/models/assistant_retrieve_response.rbi +153 -147
  76. data/rbi/revox/models/assistant_update_params.rbi +148 -162
  77. data/rbi/revox/models/assistant_update_response.rbi +157 -147
  78. data/rbi/revox/models/auth_status_retrieve_params.rbi +27 -0
  79. data/rbi/revox/models/auth_status_retrieve_response.rbi +30 -0
  80. data/rbi/revox/models/call_cancel_params.rbi +33 -0
  81. data/rbi/revox/models/call_cancel_response.rbi +23 -0
  82. data/rbi/revox/models/call_create_params.rbi +190 -187
  83. data/rbi/revox/models/call_create_response.rbi +1150 -227
  84. data/rbi/revox/models/call_export_params.rbi +446 -0
  85. data/rbi/revox/models/call_export_response.rbi +26 -0
  86. data/rbi/revox/models/call_pause_params.rbi +31 -0
  87. data/rbi/revox/models/call_pause_response.rbi +23 -0
  88. data/rbi/revox/models/call_phone_history_params.rbi +27 -0
  89. data/rbi/revox/models/call_phone_history_response.rbi +209 -0
  90. data/rbi/revox/models/call_resume_params.rbi +33 -0
  91. data/rbi/revox/models/call_resume_response.rbi +23 -0
  92. data/rbi/revox/models/call_retrieve_response.rbi +1150 -227
  93. data/rbi/revox/models/call_search_params.rbi +281 -0
  94. data/rbi/revox/models/call_search_response.rbi +7504 -0
  95. data/rbi/revox/models/campaign_create_params.rbi +9 -87
  96. data/rbi/revox/models/campaign_create_response.rbi +188 -266
  97. data/rbi/revox/models/campaign_get_rows_response.rbi +1150 -225
  98. data/rbi/revox/models/campaign_list_response.rbi +188 -262
  99. data/rbi/revox/models/campaign_pause_params.rbi +33 -0
  100. data/rbi/revox/models/campaign_pause_response.rbi +23 -0
  101. data/rbi/revox/models/campaign_resume_params.rbi +33 -0
  102. data/rbi/revox/models/campaign_resume_response.rbi +23 -0
  103. data/rbi/revox/models/campaign_retrieve_response.rbi +188 -266
  104. data/rbi/revox/models/campaign_statistics_params.rbi +33 -0
  105. data/rbi/revox/models/campaign_statistics_response.rbi +1069 -0
  106. data/rbi/revox/models/campaign_update_params.rbi +313 -0
  107. data/rbi/revox/models/campaign_update_response.rbi +4092 -0
  108. data/rbi/revox/models/phone_number_delete_params.rbi +33 -0
  109. data/rbi/revox/models/phone_number_delete_response.rbi +26 -0
  110. data/rbi/revox/models/phone_number_list_params.rbi +27 -0
  111. data/rbi/revox/models/phone_number_list_response.rbi +3690 -0
  112. data/rbi/revox/models/phone_number_update_params.rbi +53 -0
  113. data/rbi/revox/models/phone_number_update_response.rbi +3693 -0
  114. data/rbi/revox/models/user_retrieve_params.rbi +27 -0
  115. data/rbi/revox/models/user_retrieve_response.rbi +140 -0
  116. data/rbi/revox/models/voice_clone_params.rbi +141 -0
  117. data/rbi/revox/models/voice_clone_response.rbi +53 -0
  118. data/rbi/revox/models/voice_delete_params.rbi +33 -0
  119. data/rbi/revox/models/voice_delete_response.rbi +23 -0
  120. data/rbi/revox/models/voice_list_response.rbi +5 -0
  121. data/rbi/revox/models/voice_preview_params.rbi +2 -0
  122. data/rbi/revox/models/voice_retrieve_params.rbi +2 -0
  123. data/rbi/revox/models.rbi +35 -1
  124. data/rbi/revox/resources/assistants.rbi +52 -22
  125. data/rbi/revox/resources/auth_status.rbi +21 -0
  126. data/rbi/revox/resources/call.rbi +114 -4
  127. data/rbi/revox/resources/campaigns.rbi +77 -15
  128. data/rbi/revox/resources/phone_numbers.rbi +43 -0
  129. data/rbi/revox/resources/users.rbi +8 -2
  130. data/rbi/revox/resources/voices.rbi +39 -0
  131. data/sig/revox/client.rbs +4 -0
  132. data/sig/revox/models/assistant_clone_params.rbs +20 -0
  133. data/sig/revox/models/assistant_clone_response.rbs +1310 -0
  134. data/sig/revox/models/assistant_create_params.rbs +39 -58
  135. data/sig/revox/models/assistant_create_response.rbs +46 -54
  136. data/sig/revox/models/assistant_list_response.rbs +46 -54
  137. data/sig/revox/models/assistant_retrieve_response.rbs +46 -54
  138. data/sig/revox/models/assistant_update_params.rbs +39 -58
  139. data/sig/revox/models/assistant_update_response.rbs +46 -54
  140. data/sig/revox/models/auth_status_retrieve_params.rbs +15 -0
  141. data/sig/revox/models/auth_status_retrieve_response.rbs +13 -0
  142. data/sig/revox/models/call_cancel_params.rbs +20 -0
  143. data/sig/revox/models/call_cancel_response.rbs +13 -0
  144. data/sig/revox/models/call_create_params.rbs +50 -71
  145. data/sig/revox/models/call_create_response.rbs +473 -77
  146. data/sig/revox/models/call_export_params.rbs +230 -0
  147. data/sig/revox/models/call_export_response.rbs +15 -0
  148. data/sig/revox/models/call_pause_params.rbs +20 -0
  149. data/sig/revox/models/call_pause_response.rbs +13 -0
  150. data/sig/revox/models/call_phone_history_params.rbs +15 -0
  151. data/sig/revox/models/call_phone_history_response.rbs +93 -0
  152. data/sig/revox/models/call_resume_params.rbs +20 -0
  153. data/sig/revox/models/call_resume_response.rbs +13 -0
  154. data/sig/revox/models/call_retrieve_response.rbs +473 -77
  155. data/sig/revox/models/call_search_params.rbs +194 -0
  156. data/sig/revox/models/call_search_response.rbs +3045 -0
  157. data/sig/revox/models/campaign_create_params.rbs +5 -50
  158. data/sig/revox/models/campaign_create_response.rbs +62 -98
  159. data/sig/revox/models/campaign_get_rows_response.rbs +472 -73
  160. data/sig/revox/models/campaign_list_response.rbs +62 -98
  161. data/sig/revox/models/campaign_pause_params.rbs +20 -0
  162. data/sig/revox/models/campaign_pause_response.rbs +13 -0
  163. data/sig/revox/models/campaign_resume_params.rbs +20 -0
  164. data/sig/revox/models/campaign_resume_response.rbs +13 -0
  165. data/sig/revox/models/campaign_retrieve_response.rbs +62 -98
  166. data/sig/revox/models/campaign_statistics_params.rbs +20 -0
  167. data/sig/revox/models/campaign_statistics_response.rbs +489 -0
  168. data/sig/revox/models/campaign_update_params.rbs +135 -0
  169. data/sig/revox/models/campaign_update_response.rbs +1658 -0
  170. data/sig/revox/models/phone_number_delete_params.rbs +20 -0
  171. data/sig/revox/models/phone_number_delete_response.rbs +13 -0
  172. data/sig/revox/models/phone_number_list_params.rbs +15 -0
  173. data/sig/revox/models/phone_number_list_response.rbs +1454 -0
  174. data/sig/revox/models/phone_number_update_params.rbs +32 -0
  175. data/sig/revox/models/phone_number_update_response.rbs +1452 -0
  176. data/sig/revox/models/user_retrieve_params.rbs +14 -0
  177. data/sig/revox/models/user_retrieve_response.rbs +71 -0
  178. data/sig/revox/models/voice_clone_params.rbs +79 -0
  179. data/sig/revox/models/voice_clone_response.rbs +40 -0
  180. data/sig/revox/models/voice_delete_params.rbs +20 -0
  181. data/sig/revox/models/voice_delete_response.rbs +13 -0
  182. data/sig/revox/models/voice_list_response.rbs +2 -1
  183. data/sig/revox/models/voice_preview_params.rbs +2 -1
  184. data/sig/revox/models/voice_retrieve_params.rbs +2 -1
  185. data/sig/revox/models.rbs +35 -1
  186. data/sig/revox/resources/assistants.rbs +9 -4
  187. data/sig/revox/resources/auth_status.rbs +11 -0
  188. data/sig/revox/resources/call.rbs +46 -1
  189. data/sig/revox/resources/campaigns.rbs +24 -3
  190. data/sig/revox/resources/phone_numbers.rbs +23 -0
  191. data/sig/revox/resources/users.rbs +3 -1
  192. data/sig/revox/resources/voices.rbs +13 -0
  193. metadata +116 -17
  194. data/lib/revox/models/users/me_retrieve_params.rb +0 -16
  195. data/lib/revox/models/users/me_retrieve_response.rb +0 -101
  196. data/lib/revox/models/users/me_update_params.rb +0 -22
  197. data/lib/revox/models/users/me_update_response.rb +0 -101
  198. data/lib/revox/resources/users/me.rb +0 -55
  199. data/rbi/revox/models/users/me_retrieve_params.rbi +0 -29
  200. data/rbi/revox/models/users/me_retrieve_response.rbi +0 -149
  201. data/rbi/revox/models/users/me_update_params.rbi +0 -43
  202. data/rbi/revox/models/users/me_update_response.rbi +0 -149
  203. data/rbi/revox/resources/users/me.rbi +0 -33
  204. data/sig/revox/models/users/me_retrieve_params.rbs +0 -16
  205. data/sig/revox/models/users/me_retrieve_response.rbs +0 -75
  206. data/sig/revox/models/users/me_update_params.rbs +0 -28
  207. data/sig/revox/models/users/me_update_response.rbs +0 -75
  208. data/sig/revox/resources/users/me.rbs +0 -18
@@ -0,0 +1,3351 @@
1
+ # typed: strong
2
+
3
+ module Revox
4
+ module Models
5
+ class AssistantCloneResponse < Revox::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(Revox::Models::AssistantCloneResponse, Revox::Internal::AnyHash)
9
+ end
10
+
11
+ sig { returns(Revox::Models::AssistantCloneResponse::Assistant) }
12
+ attr_reader :assistant
13
+
14
+ sig do
15
+ params(
16
+ assistant: Revox::Models::AssistantCloneResponse::Assistant::OrHash
17
+ ).void
18
+ end
19
+ attr_writer :assistant
20
+
21
+ sig do
22
+ params(
23
+ assistant: Revox::Models::AssistantCloneResponse::Assistant::OrHash
24
+ ).returns(T.attached_class)
25
+ end
26
+ def self.new(assistant:)
27
+ end
28
+
29
+ sig do
30
+ override.returns(
31
+ { assistant: Revox::Models::AssistantCloneResponse::Assistant }
32
+ )
33
+ end
34
+ def to_hash
35
+ end
36
+
37
+ class Assistant < Revox::Internal::Type::BaseModel
38
+ OrHash =
39
+ T.type_alias do
40
+ T.any(
41
+ Revox::Models::AssistantCloneResponse::Assistant,
42
+ Revox::Internal::AnyHash
43
+ )
44
+ end
45
+
46
+ sig { returns(String) }
47
+ attr_accessor :id
48
+
49
+ # Which call outcomes trigger the after-call SMS. When empty or null, no
50
+ # after-call SMS is sent. Use "none" when outcome is null.
51
+ sig do
52
+ returns(
53
+ T.nilable(
54
+ T::Array[
55
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
56
+ ]
57
+ )
58
+ )
59
+ end
60
+ attr_accessor :after_call_sms_outcomes
61
+
62
+ # Prompt / instructions for the after-call SMS. Supports {{variable}}
63
+ # placeholders. When null, no after-call SMS is sent.
64
+ sig { returns(T.nilable(String)) }
65
+ attr_accessor :after_call_sms_prompt
66
+
67
+ # Ambient background sound to play during the call. null disables it.
68
+ sig do
69
+ returns(
70
+ T.nilable(
71
+ Revox::Models::AssistantCloneResponse::Assistant::BackgroundSound::TaggedSymbol
72
+ )
73
+ )
74
+ end
75
+ attr_accessor :background_sound
76
+
77
+ # Volume of the ambient background sound (0 = silent, 1 = max).
78
+ sig { returns(Float) }
79
+ attr_accessor :background_sound_volume
80
+
81
+ sig do
82
+ returns(
83
+ T.nilable(
84
+ Revox::Models::AssistantCloneResponse::Assistant::Calendly
85
+ )
86
+ )
87
+ end
88
+ attr_reader :calendly
89
+
90
+ sig do
91
+ params(
92
+ calendly:
93
+ T.nilable(
94
+ Revox::Models::AssistantCloneResponse::Assistant::Calendly::OrHash
95
+ )
96
+ ).void
97
+ end
98
+ attr_writer :calendly
99
+
100
+ # Configuration for call retry behavior including time windows, delays, and max
101
+ # iterations. If not provided, defaults will be used.
102
+ sig do
103
+ returns(
104
+ T.nilable(
105
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig
106
+ )
107
+ )
108
+ end
109
+ attr_reader :call_retry_config
110
+
111
+ sig do
112
+ params(
113
+ call_retry_config:
114
+ T.nilable(
115
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::OrHash
116
+ )
117
+ ).void
118
+ end
119
+ attr_writer :call_retry_config
120
+
121
+ # Optional Cartesia pronunciation dictionary ID linked to this assistant.
122
+ sig { returns(T.nilable(String)) }
123
+ attr_accessor :cartesia_dictionary_pronunciation_id
124
+
125
+ sig { returns(T.anything) }
126
+ attr_accessor :created_at
127
+
128
+ sig do
129
+ returns(
130
+ T.nilable(
131
+ T::Array[
132
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool
133
+ ]
134
+ )
135
+ )
136
+ end
137
+ attr_accessor :custom_tools
138
+
139
+ # Email address(es) to receive notifications when a call ends with a matching
140
+ # outcome. Accepts a single email or a comma-separated list (e.g. "alice@x.com,
141
+ # bob@y.com").
142
+ sig { returns(T.nilable(String)) }
143
+ attr_accessor :email_notification_address
144
+
145
+ # Which call outcomes trigger an email notification. E.g. ["interested",
146
+ # "completed", "none"]. Use "none" when outcome is null.
147
+ sig do
148
+ returns(
149
+ T.nilable(
150
+ T::Array[
151
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
152
+ ]
153
+ )
154
+ )
155
+ end
156
+ attr_accessor :email_notification_outcomes
157
+
158
+ sig { returns(T.nilable(String)) }
159
+ attr_accessor :end_of_call_sentence
160
+
161
+ sig { returns(T.nilable(String)) }
162
+ attr_accessor :first_sentence
163
+
164
+ # Delay in milliseconds before speaking the first sentence. Default: 400.
165
+ sig { returns(Integer) }
166
+ attr_accessor :first_sentence_delay_ms
167
+
168
+ sig do
169
+ returns(
170
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode::TaggedSymbol
171
+ )
172
+ end
173
+ attr_accessor :first_sentence_mode
174
+
175
+ # Override the default outbound phone number for calls placed with this assistant.
176
+ # When null, the organization's default phone number is used.
177
+ sig { returns(T.nilable(String)) }
178
+ attr_accessor :from_phone_number
179
+
180
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
181
+ # transfer is not configured.
182
+ sig do
183
+ returns(
184
+ T.nilable(
185
+ Revox::Models::AssistantCloneResponse::Assistant::HumanTransferMode::TaggedSymbol
186
+ )
187
+ )
188
+ end
189
+ attr_accessor :human_transfer_mode
190
+
191
+ # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
192
+ # skip turns to navigate phone menus.
193
+ sig { returns(T::Boolean) }
194
+ attr_accessor :ivr_navigation_enabled
195
+
196
+ sig do
197
+ returns(
198
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::Variants
199
+ )
200
+ end
201
+ attr_accessor :llm_model
202
+
203
+ # Public URL of the brand logo shown on the assistant's demo page. Null when
204
+ # unset.
205
+ sig { returns(T.nilable(String)) }
206
+ attr_accessor :logo_url
207
+
208
+ # The maximum duration of the call in seconds. This is the maximum time the call
209
+ # will be allowed to run.
210
+ sig { returns(Float) }
211
+ attr_accessor :max_call_duration_secs
212
+
213
+ # Optional message the agent will say, without being interruptible, when the call
214
+ # reaches its max duration. Kept short so it fits inside the farewell buffer. If
215
+ # null, the call ends silently.
216
+ sig { returns(T.nilable(String)) }
217
+ attr_accessor :max_duration_end_message
218
+
219
+ sig { returns(String) }
220
+ attr_accessor :name
221
+
222
+ sig { returns(String) }
223
+ attr_accessor :organization_id
224
+
225
+ sig do
226
+ returns(
227
+ T.nilable(
228
+ Revox::Models::AssistantCloneResponse::Assistant::Position
229
+ )
230
+ )
231
+ end
232
+ attr_reader :position
233
+
234
+ sig do
235
+ params(
236
+ position:
237
+ T.nilable(
238
+ Revox::Models::AssistantCloneResponse::Assistant::Position::OrHash
239
+ )
240
+ ).void
241
+ end
242
+ attr_writer :position
243
+
244
+ # URL fetched before an inbound call is answered to resolve the assistant's prompt
245
+ # variables. Null when no lookup is configured.
246
+ sig { returns(T.nilable(String)) }
247
+ attr_accessor :precall_lookup_url
248
+
249
+ sig { returns(String) }
250
+ attr_accessor :prompt
251
+
252
+ sig do
253
+ returns(
254
+ T.nilable(
255
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow
256
+ )
257
+ )
258
+ end
259
+ attr_reader :prompt_flow
260
+
261
+ sig do
262
+ params(
263
+ prompt_flow:
264
+ T.nilable(
265
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::OrHash
266
+ )
267
+ ).void
268
+ end
269
+ attr_writer :prompt_flow
270
+
271
+ sig do
272
+ returns(
273
+ T.nilable(Revox::Models::AssistantCloneResponse::Assistant::Slack)
274
+ )
275
+ end
276
+ attr_reader :slack
277
+
278
+ sig do
279
+ params(
280
+ slack:
281
+ T.nilable(
282
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::OrHash
283
+ )
284
+ ).void
285
+ end
286
+ attr_writer :slack
287
+
288
+ # Enable SMS tool during calls. When enabled, the agent can send SMS messages to
289
+ # the user on the call.
290
+ sig { returns(T::Boolean) }
291
+ attr_accessor :sms_enabled
292
+
293
+ # Hardcoded SMS template to send during calls. When set, this exact text is sent
294
+ # instead of letting the agent generate the message. Supports {{variable}}
295
+ # placeholders.
296
+ sig { returns(T.nilable(String)) }
297
+ attr_accessor :sms_template
298
+
299
+ # The structured output config to use for the call. This is used to extract the
300
+ # data from the call (like email, name, company name, etc.).
301
+ sig do
302
+ returns(
303
+ T.nilable(
304
+ T::Array[
305
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig
306
+ ]
307
+ )
308
+ )
309
+ end
310
+ attr_accessor :structured_output_config
311
+
312
+ # Custom prompt for structured data extraction. If not provided, a default prompt
313
+ # is used. Available variables: {{transcript}}, {{call_direction}},
314
+ # {{user_phone_number}}, {{agent_phone_number}}.
315
+ sig { returns(T.nilable(String)) }
316
+ attr_accessor :structured_output_prompt
317
+
318
+ # Assistant-level speech-to-text context: structured `general` key/value pairs
319
+ # plus a list of domain `terms`. Prompt-derived context is merged in without
320
+ # replacing existing entries.
321
+ sig do
322
+ returns(
323
+ T.nilable(
324
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext
325
+ )
326
+ )
327
+ end
328
+ attr_reader :stt_context
329
+
330
+ sig do
331
+ params(
332
+ stt_context:
333
+ T.nilable(
334
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext::OrHash
335
+ )
336
+ ).void
337
+ end
338
+ attr_writer :stt_context
339
+
340
+ # Transcriber (speech-to-text) model used for the assistant.
341
+ sig do
342
+ returns(
343
+ Revox::Models::AssistantCloneResponse::Assistant::SttModel::TaggedSymbol
344
+ )
345
+ end
346
+ attr_accessor :stt_model
347
+
348
+ # Audio clip to play while the agent is processing a response. One of the built-in
349
+ # LiveKit audio clips; null disables it.
350
+ sig do
351
+ returns(
352
+ T.nilable(
353
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
354
+ )
355
+ )
356
+ end
357
+ attr_accessor :thinking_sound
358
+
359
+ # Probability [0..1] that the thinking sound plays on any given turn; otherwise
360
+ # the agent is silent while thinking.
361
+ sig { returns(Float) }
362
+ attr_accessor :thinking_sound_probability
363
+
364
+ # Volume of the thinking sound (0 = silent, 1 = max).
365
+ sig { returns(Float) }
366
+ attr_accessor :thinking_sound_volume
367
+
368
+ # Where calls can be transferred to when users ask to speak to a human. Null or
369
+ # empty when transfer is not configured.
370
+ sig do
371
+ returns(
372
+ T.nilable(
373
+ T::Array[
374
+ Revox::Models::AssistantCloneResponse::Assistant::TransferDestination
375
+ ]
376
+ )
377
+ )
378
+ end
379
+ attr_accessor :transfer_destinations
380
+
381
+ sig do
382
+ returns(
383
+ Revox::Models::AssistantCloneResponse::Assistant::Type::TaggedSymbol
384
+ )
385
+ end
386
+ attr_accessor :type
387
+
388
+ sig { returns(T.anything) }
389
+ attr_accessor :updated_at
390
+
391
+ sig do
392
+ returns(
393
+ T.nilable(Revox::Models::AssistantCloneResponse::Assistant::Voice)
394
+ )
395
+ end
396
+ attr_reader :voice
397
+
398
+ sig do
399
+ params(
400
+ voice:
401
+ T.nilable(
402
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::OrHash
403
+ )
404
+ ).void
405
+ end
406
+ attr_writer :voice
407
+
408
+ # If set, when voicemail is detected the agent will speak this message then hang
409
+ # up; if null, hang up immediately.
410
+ sig { returns(T.nilable(String)) }
411
+ attr_accessor :voicemail_message
412
+
413
+ # Prompt / instructions for the voicemail SMS. Supports {{variable}} placeholders.
414
+ # When null, no SMS is sent on voicemail.
415
+ sig { returns(T.nilable(String)) }
416
+ attr_accessor :voicemail_sms_prompt
417
+
418
+ # Warm transfer only: instructions for the supervisor handoff summary; null when
419
+ # not configured or cold transfer.
420
+ sig { returns(T.nilable(String)) }
421
+ attr_accessor :warm_transfer_summary_instructions
422
+
423
+ # The webhook URL to call when the call is completed.
424
+ sig { returns(T.nilable(String)) }
425
+ attr_accessor :webhook_url
426
+
427
+ sig do
428
+ returns(
429
+ T.nilable(Revox::Models::AssistantCloneResponse::Assistant::Zoho)
430
+ )
431
+ end
432
+ attr_reader :zoho
433
+
434
+ sig do
435
+ params(
436
+ zoho:
437
+ T.nilable(
438
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::OrHash
439
+ )
440
+ ).void
441
+ end
442
+ attr_writer :zoho
443
+
444
+ # The user who created the assistant.
445
+ sig do
446
+ returns(
447
+ T.nilable(
448
+ Revox::Models::AssistantCloneResponse::Assistant::CreatedBy
449
+ )
450
+ )
451
+ end
452
+ attr_reader :created_by
453
+
454
+ sig do
455
+ params(
456
+ created_by:
457
+ T.nilable(
458
+ Revox::Models::AssistantCloneResponse::Assistant::CreatedBy::OrHash
459
+ )
460
+ ).void
461
+ end
462
+ attr_writer :created_by
463
+
464
+ sig do
465
+ returns(
466
+ T.nilable(
467
+ T::Array[
468
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem
469
+ ]
470
+ )
471
+ )
472
+ end
473
+ attr_reader :faq_items
474
+
475
+ sig do
476
+ params(
477
+ faq_items:
478
+ T::Array[
479
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::OrHash
480
+ ]
481
+ ).void
482
+ end
483
+ attr_writer :faq_items
484
+
485
+ sig { returns(T.nilable(T::Boolean)) }
486
+ attr_reader :is_inbound_receptionist
487
+
488
+ sig { params(is_inbound_receptionist: T::Boolean).void }
489
+ attr_writer :is_inbound_receptionist
490
+
491
+ sig { returns(T.nilable(T::Boolean)) }
492
+ attr_reader :is_realestate_assistant
493
+
494
+ sig { params(is_realestate_assistant: T::Boolean).void }
495
+ attr_writer :is_realestate_assistant
496
+
497
+ sig { returns(T.nilable(Float)) }
498
+ attr_reader :pending_faq_count
499
+
500
+ sig { params(pending_faq_count: Float).void }
501
+ attr_writer :pending_faq_count
502
+
503
+ sig do
504
+ params(
505
+ id: String,
506
+ after_call_sms_outcomes:
507
+ T.nilable(
508
+ T::Array[
509
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::OrSymbol
510
+ ]
511
+ ),
512
+ after_call_sms_prompt: T.nilable(String),
513
+ background_sound:
514
+ T.nilable(
515
+ Revox::Models::AssistantCloneResponse::Assistant::BackgroundSound::OrSymbol
516
+ ),
517
+ background_sound_volume: Float,
518
+ calendly:
519
+ T.nilable(
520
+ Revox::Models::AssistantCloneResponse::Assistant::Calendly::OrHash
521
+ ),
522
+ call_retry_config:
523
+ T.nilable(
524
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::OrHash
525
+ ),
526
+ cartesia_dictionary_pronunciation_id: T.nilable(String),
527
+ created_at: T.anything,
528
+ custom_tools:
529
+ T.nilable(
530
+ T::Array[
531
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::OrHash
532
+ ]
533
+ ),
534
+ email_notification_address: T.nilable(String),
535
+ email_notification_outcomes:
536
+ T.nilable(
537
+ T::Array[
538
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::OrSymbol
539
+ ]
540
+ ),
541
+ end_of_call_sentence: T.nilable(String),
542
+ first_sentence: T.nilable(String),
543
+ first_sentence_delay_ms: Integer,
544
+ first_sentence_mode:
545
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode::OrSymbol,
546
+ from_phone_number: T.nilable(String),
547
+ human_transfer_mode:
548
+ T.nilable(
549
+ Revox::Models::AssistantCloneResponse::Assistant::HumanTransferMode::OrSymbol
550
+ ),
551
+ ivr_navigation_enabled: T::Boolean,
552
+ llm_model:
553
+ T.any(
554
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::OrHash,
555
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember1::OrHash,
556
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember2::OrHash,
557
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::OrHash
558
+ ),
559
+ logo_url: T.nilable(String),
560
+ max_call_duration_secs: Float,
561
+ max_duration_end_message: T.nilable(String),
562
+ name: String,
563
+ organization_id: String,
564
+ position:
565
+ T.nilable(
566
+ Revox::Models::AssistantCloneResponse::Assistant::Position::OrHash
567
+ ),
568
+ precall_lookup_url: T.nilable(String),
569
+ prompt: String,
570
+ prompt_flow:
571
+ T.nilable(
572
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::OrHash
573
+ ),
574
+ slack:
575
+ T.nilable(
576
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::OrHash
577
+ ),
578
+ sms_enabled: T::Boolean,
579
+ sms_template: T.nilable(String),
580
+ structured_output_config:
581
+ T.nilable(
582
+ T::Array[
583
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::OrHash
584
+ ]
585
+ ),
586
+ structured_output_prompt: T.nilable(String),
587
+ stt_context:
588
+ T.nilable(
589
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext::OrHash
590
+ ),
591
+ stt_model:
592
+ Revox::Models::AssistantCloneResponse::Assistant::SttModel::OrSymbol,
593
+ thinking_sound:
594
+ T.nilable(
595
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::OrSymbol
596
+ ),
597
+ thinking_sound_probability: Float,
598
+ thinking_sound_volume: Float,
599
+ transfer_destinations:
600
+ T.nilable(
601
+ T::Array[
602
+ Revox::Models::AssistantCloneResponse::Assistant::TransferDestination::OrHash
603
+ ]
604
+ ),
605
+ type:
606
+ Revox::Models::AssistantCloneResponse::Assistant::Type::OrSymbol,
607
+ updated_at: T.anything,
608
+ voice:
609
+ T.nilable(
610
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::OrHash
611
+ ),
612
+ voicemail_message: T.nilable(String),
613
+ voicemail_sms_prompt: T.nilable(String),
614
+ warm_transfer_summary_instructions: T.nilable(String),
615
+ webhook_url: T.nilable(String),
616
+ zoho:
617
+ T.nilable(
618
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::OrHash
619
+ ),
620
+ created_by:
621
+ T.nilable(
622
+ Revox::Models::AssistantCloneResponse::Assistant::CreatedBy::OrHash
623
+ ),
624
+ faq_items:
625
+ T::Array[
626
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::OrHash
627
+ ],
628
+ is_inbound_receptionist: T::Boolean,
629
+ is_realestate_assistant: T::Boolean,
630
+ pending_faq_count: Float
631
+ ).returns(T.attached_class)
632
+ end
633
+ def self.new(
634
+ id:,
635
+ # Which call outcomes trigger the after-call SMS. When empty or null, no
636
+ # after-call SMS is sent. Use "none" when outcome is null.
637
+ after_call_sms_outcomes:,
638
+ # Prompt / instructions for the after-call SMS. Supports {{variable}}
639
+ # placeholders. When null, no after-call SMS is sent.
640
+ after_call_sms_prompt:,
641
+ # Ambient background sound to play during the call. null disables it.
642
+ background_sound:,
643
+ # Volume of the ambient background sound (0 = silent, 1 = max).
644
+ background_sound_volume:,
645
+ calendly:,
646
+ # Configuration for call retry behavior including time windows, delays, and max
647
+ # iterations. If not provided, defaults will be used.
648
+ call_retry_config:,
649
+ # Optional Cartesia pronunciation dictionary ID linked to this assistant.
650
+ cartesia_dictionary_pronunciation_id:,
651
+ created_at:,
652
+ custom_tools:,
653
+ # Email address(es) to receive notifications when a call ends with a matching
654
+ # outcome. Accepts a single email or a comma-separated list (e.g. "alice@x.com,
655
+ # bob@y.com").
656
+ email_notification_address:,
657
+ # Which call outcomes trigger an email notification. E.g. ["interested",
658
+ # "completed", "none"]. Use "none" when outcome is null.
659
+ email_notification_outcomes:,
660
+ end_of_call_sentence:,
661
+ first_sentence:,
662
+ # Delay in milliseconds before speaking the first sentence. Default: 400.
663
+ first_sentence_delay_ms:,
664
+ first_sentence_mode:,
665
+ # Override the default outbound phone number for calls placed with this assistant.
666
+ # When null, the organization's default phone number is used.
667
+ from_phone_number:,
668
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
669
+ # transfer is not configured.
670
+ human_transfer_mode:,
671
+ # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
672
+ # skip turns to navigate phone menus.
673
+ ivr_navigation_enabled:,
674
+ llm_model:,
675
+ # Public URL of the brand logo shown on the assistant's demo page. Null when
676
+ # unset.
677
+ logo_url:,
678
+ # The maximum duration of the call in seconds. This is the maximum time the call
679
+ # will be allowed to run.
680
+ max_call_duration_secs:,
681
+ # Optional message the agent will say, without being interruptible, when the call
682
+ # reaches its max duration. Kept short so it fits inside the farewell buffer. If
683
+ # null, the call ends silently.
684
+ max_duration_end_message:,
685
+ name:,
686
+ organization_id:,
687
+ position:,
688
+ # URL fetched before an inbound call is answered to resolve the assistant's prompt
689
+ # variables. Null when no lookup is configured.
690
+ precall_lookup_url:,
691
+ prompt:,
692
+ prompt_flow:,
693
+ slack:,
694
+ # Enable SMS tool during calls. When enabled, the agent can send SMS messages to
695
+ # the user on the call.
696
+ sms_enabled:,
697
+ # Hardcoded SMS template to send during calls. When set, this exact text is sent
698
+ # instead of letting the agent generate the message. Supports {{variable}}
699
+ # placeholders.
700
+ sms_template:,
701
+ # The structured output config to use for the call. This is used to extract the
702
+ # data from the call (like email, name, company name, etc.).
703
+ structured_output_config:,
704
+ # Custom prompt for structured data extraction. If not provided, a default prompt
705
+ # is used. Available variables: {{transcript}}, {{call_direction}},
706
+ # {{user_phone_number}}, {{agent_phone_number}}.
707
+ structured_output_prompt:,
708
+ # Assistant-level speech-to-text context: structured `general` key/value pairs
709
+ # plus a list of domain `terms`. Prompt-derived context is merged in without
710
+ # replacing existing entries.
711
+ stt_context:,
712
+ # Transcriber (speech-to-text) model used for the assistant.
713
+ stt_model:,
714
+ # Audio clip to play while the agent is processing a response. One of the built-in
715
+ # LiveKit audio clips; null disables it.
716
+ thinking_sound:,
717
+ # Probability [0..1] that the thinking sound plays on any given turn; otherwise
718
+ # the agent is silent while thinking.
719
+ thinking_sound_probability:,
720
+ # Volume of the thinking sound (0 = silent, 1 = max).
721
+ thinking_sound_volume:,
722
+ # Where calls can be transferred to when users ask to speak to a human. Null or
723
+ # empty when transfer is not configured.
724
+ transfer_destinations:,
725
+ type:,
726
+ updated_at:,
727
+ voice:,
728
+ # If set, when voicemail is detected the agent will speak this message then hang
729
+ # up; if null, hang up immediately.
730
+ voicemail_message:,
731
+ # Prompt / instructions for the voicemail SMS. Supports {{variable}} placeholders.
732
+ # When null, no SMS is sent on voicemail.
733
+ voicemail_sms_prompt:,
734
+ # Warm transfer only: instructions for the supervisor handoff summary; null when
735
+ # not configured or cold transfer.
736
+ warm_transfer_summary_instructions:,
737
+ # The webhook URL to call when the call is completed.
738
+ webhook_url:,
739
+ zoho:,
740
+ # The user who created the assistant.
741
+ created_by: nil,
742
+ faq_items: nil,
743
+ is_inbound_receptionist: nil,
744
+ is_realestate_assistant: nil,
745
+ pending_faq_count: nil
746
+ )
747
+ end
748
+
749
+ sig do
750
+ override.returns(
751
+ {
752
+ id: String,
753
+ after_call_sms_outcomes:
754
+ T.nilable(
755
+ T::Array[
756
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
757
+ ]
758
+ ),
759
+ after_call_sms_prompt: T.nilable(String),
760
+ background_sound:
761
+ T.nilable(
762
+ Revox::Models::AssistantCloneResponse::Assistant::BackgroundSound::TaggedSymbol
763
+ ),
764
+ background_sound_volume: Float,
765
+ calendly:
766
+ T.nilable(
767
+ Revox::Models::AssistantCloneResponse::Assistant::Calendly
768
+ ),
769
+ call_retry_config:
770
+ T.nilable(
771
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig
772
+ ),
773
+ cartesia_dictionary_pronunciation_id: T.nilable(String),
774
+ created_at: T.anything,
775
+ custom_tools:
776
+ T.nilable(
777
+ T::Array[
778
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool
779
+ ]
780
+ ),
781
+ email_notification_address: T.nilable(String),
782
+ email_notification_outcomes:
783
+ T.nilable(
784
+ T::Array[
785
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
786
+ ]
787
+ ),
788
+ end_of_call_sentence: T.nilable(String),
789
+ first_sentence: T.nilable(String),
790
+ first_sentence_delay_ms: Integer,
791
+ first_sentence_mode:
792
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode::TaggedSymbol,
793
+ from_phone_number: T.nilable(String),
794
+ human_transfer_mode:
795
+ T.nilable(
796
+ Revox::Models::AssistantCloneResponse::Assistant::HumanTransferMode::TaggedSymbol
797
+ ),
798
+ ivr_navigation_enabled: T::Boolean,
799
+ llm_model:
800
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::Variants,
801
+ logo_url: T.nilable(String),
802
+ max_call_duration_secs: Float,
803
+ max_duration_end_message: T.nilable(String),
804
+ name: String,
805
+ organization_id: String,
806
+ position:
807
+ T.nilable(
808
+ Revox::Models::AssistantCloneResponse::Assistant::Position
809
+ ),
810
+ precall_lookup_url: T.nilable(String),
811
+ prompt: String,
812
+ prompt_flow:
813
+ T.nilable(
814
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow
815
+ ),
816
+ slack:
817
+ T.nilable(
818
+ Revox::Models::AssistantCloneResponse::Assistant::Slack
819
+ ),
820
+ sms_enabled: T::Boolean,
821
+ sms_template: T.nilable(String),
822
+ structured_output_config:
823
+ T.nilable(
824
+ T::Array[
825
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig
826
+ ]
827
+ ),
828
+ structured_output_prompt: T.nilable(String),
829
+ stt_context:
830
+ T.nilable(
831
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext
832
+ ),
833
+ stt_model:
834
+ Revox::Models::AssistantCloneResponse::Assistant::SttModel::TaggedSymbol,
835
+ thinking_sound:
836
+ T.nilable(
837
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
838
+ ),
839
+ thinking_sound_probability: Float,
840
+ thinking_sound_volume: Float,
841
+ transfer_destinations:
842
+ T.nilable(
843
+ T::Array[
844
+ Revox::Models::AssistantCloneResponse::Assistant::TransferDestination
845
+ ]
846
+ ),
847
+ type:
848
+ Revox::Models::AssistantCloneResponse::Assistant::Type::TaggedSymbol,
849
+ updated_at: T.anything,
850
+ voice:
851
+ T.nilable(
852
+ Revox::Models::AssistantCloneResponse::Assistant::Voice
853
+ ),
854
+ voicemail_message: T.nilable(String),
855
+ voicemail_sms_prompt: T.nilable(String),
856
+ warm_transfer_summary_instructions: T.nilable(String),
857
+ webhook_url: T.nilable(String),
858
+ zoho:
859
+ T.nilable(
860
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho
861
+ ),
862
+ created_by:
863
+ T.nilable(
864
+ Revox::Models::AssistantCloneResponse::Assistant::CreatedBy
865
+ ),
866
+ faq_items:
867
+ T::Array[
868
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem
869
+ ],
870
+ is_inbound_receptionist: T::Boolean,
871
+ is_realestate_assistant: T::Boolean,
872
+ pending_faq_count: Float
873
+ }
874
+ )
875
+ end
876
+ def to_hash
877
+ end
878
+
879
+ module AfterCallSMSOutcome
880
+ extend Revox::Internal::Type::Enum
881
+
882
+ TaggedSymbol =
883
+ T.type_alias do
884
+ T.all(
885
+ Symbol,
886
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome
887
+ )
888
+ end
889
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
890
+
891
+ NOT_INTERESTED =
892
+ T.let(
893
+ :not_interested,
894
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
895
+ )
896
+ INTERESTED =
897
+ T.let(
898
+ :interested,
899
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
900
+ )
901
+ COMPLETED =
902
+ T.let(
903
+ :completed,
904
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
905
+ )
906
+ REQUESTED_CALLBACK_LATER =
907
+ T.let(
908
+ :requested_callback_later,
909
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
910
+ )
911
+ NONE =
912
+ T.let(
913
+ :none,
914
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
915
+ )
916
+
917
+ sig do
918
+ override.returns(
919
+ T::Array[
920
+ Revox::Models::AssistantCloneResponse::Assistant::AfterCallSMSOutcome::TaggedSymbol
921
+ ]
922
+ )
923
+ end
924
+ def self.values
925
+ end
926
+ end
927
+
928
+ # Ambient background sound to play during the call. null disables it.
929
+ module BackgroundSound
930
+ extend Revox::Internal::Type::Enum
931
+
932
+ TaggedSymbol =
933
+ T.type_alias do
934
+ T.all(
935
+ Symbol,
936
+ Revox::Models::AssistantCloneResponse::Assistant::BackgroundSound
937
+ )
938
+ end
939
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
940
+
941
+ AUDIO_OFFICE_OGG =
942
+ T.let(
943
+ :"audio/office.ogg",
944
+ Revox::Models::AssistantCloneResponse::Assistant::BackgroundSound::TaggedSymbol
945
+ )
946
+
947
+ sig do
948
+ override.returns(
949
+ T::Array[
950
+ Revox::Models::AssistantCloneResponse::Assistant::BackgroundSound::TaggedSymbol
951
+ ]
952
+ )
953
+ end
954
+ def self.values
955
+ end
956
+ end
957
+
958
+ class Calendly < Revox::Internal::Type::BaseModel
959
+ OrHash =
960
+ T.type_alias do
961
+ T.any(
962
+ Revox::Models::AssistantCloneResponse::Assistant::Calendly,
963
+ Revox::Internal::AnyHash
964
+ )
965
+ end
966
+
967
+ # The connection ID representing the link between your Calendly account and Revox.
968
+ sig { returns(String) }
969
+ attr_accessor :connection_id
970
+
971
+ # The event type ID representing the event type to schedule. (eg:
972
+ # https://api.calendly.com/event_types/b2330295-2a91-4a1d-bb73-99e7707663d5)
973
+ sig { returns(String) }
974
+ attr_accessor :event_type_id
975
+
976
+ sig do
977
+ params(connection_id: String, event_type_id: String).returns(
978
+ T.attached_class
979
+ )
980
+ end
981
+ def self.new(
982
+ # The connection ID representing the link between your Calendly account and Revox.
983
+ connection_id:,
984
+ # The event type ID representing the event type to schedule. (eg:
985
+ # https://api.calendly.com/event_types/b2330295-2a91-4a1d-bb73-99e7707663d5)
986
+ event_type_id:
987
+ )
988
+ end
989
+
990
+ sig do
991
+ override.returns({ connection_id: String, event_type_id: String })
992
+ end
993
+ def to_hash
994
+ end
995
+ end
996
+
997
+ class CallRetryConfig < Revox::Internal::Type::BaseModel
998
+ OrHash =
999
+ T.type_alias do
1000
+ T.any(
1001
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig,
1002
+ Revox::Internal::AnyHash
1003
+ )
1004
+ end
1005
+
1006
+ # Days of the week when calls are allowed, in the recipient's timezone. Default:
1007
+ # Monday through Friday.
1008
+ sig do
1009
+ returns(
1010
+ T::Array[
1011
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1012
+ ]
1013
+ )
1014
+ end
1015
+ attr_accessor :allowed_days
1016
+
1017
+ # If true and max_retry_attempts >= 2, attempt #2 fires immediately (skipping
1018
+ # retry_delay_seconds) when attempt #1 didn't reach a human.
1019
+ # Calling-window/allowed-days checks still apply. Only affects the 1→2 transition.
1020
+ # Default: false.
1021
+ sig { returns(T::Boolean) }
1022
+ attr_accessor :call_twice_in_a_row
1023
+
1024
+ sig do
1025
+ returns(
1026
+ T::Array[
1027
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::CallingWindow
1028
+ ]
1029
+ )
1030
+ end
1031
+ attr_accessor :calling_windows
1032
+
1033
+ # Maximum number of call retry attempts. Default: 3.
1034
+ sig { returns(Integer) }
1035
+ attr_accessor :max_retry_attempts
1036
+
1037
+ # Optional IANA timezone identifier to override the automatic timezone detection
1038
+ # from phone number. If not provided, timezone is determined from the recipient's
1039
+ # phone number country code. Examples: 'America/New_York', 'Europe/Paris'.
1040
+ sig { returns(T.nilable(String)) }
1041
+ attr_accessor :timezone
1042
+
1043
+ # Configuration for call retry behavior including time windows, delays, and max
1044
+ # iterations. If not provided, defaults will be used.
1045
+ sig do
1046
+ params(
1047
+ allowed_days:
1048
+ T::Array[
1049
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::OrSymbol
1050
+ ],
1051
+ call_twice_in_a_row: T::Boolean,
1052
+ calling_windows:
1053
+ T::Array[
1054
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::CallingWindow::OrHash
1055
+ ],
1056
+ max_retry_attempts: Integer,
1057
+ timezone: T.nilable(String)
1058
+ ).returns(T.attached_class)
1059
+ end
1060
+ def self.new(
1061
+ # Days of the week when calls are allowed, in the recipient's timezone. Default:
1062
+ # Monday through Friday.
1063
+ allowed_days:,
1064
+ # If true and max_retry_attempts >= 2, attempt #2 fires immediately (skipping
1065
+ # retry_delay_seconds) when attempt #1 didn't reach a human.
1066
+ # Calling-window/allowed-days checks still apply. Only affects the 1→2 transition.
1067
+ # Default: false.
1068
+ call_twice_in_a_row:,
1069
+ calling_windows:,
1070
+ # Maximum number of call retry attempts. Default: 3.
1071
+ max_retry_attempts:,
1072
+ # Optional IANA timezone identifier to override the automatic timezone detection
1073
+ # from phone number. If not provided, timezone is determined from the recipient's
1074
+ # phone number country code. Examples: 'America/New_York', 'Europe/Paris'.
1075
+ timezone: nil
1076
+ )
1077
+ end
1078
+
1079
+ sig do
1080
+ override.returns(
1081
+ {
1082
+ allowed_days:
1083
+ T::Array[
1084
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1085
+ ],
1086
+ call_twice_in_a_row: T::Boolean,
1087
+ calling_windows:
1088
+ T::Array[
1089
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::CallingWindow
1090
+ ],
1091
+ max_retry_attempts: Integer,
1092
+ timezone: T.nilable(String)
1093
+ }
1094
+ )
1095
+ end
1096
+ def to_hash
1097
+ end
1098
+
1099
+ module AllowedDay
1100
+ extend Revox::Internal::Type::Enum
1101
+
1102
+ TaggedSymbol =
1103
+ T.type_alias do
1104
+ T.all(
1105
+ Symbol,
1106
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay
1107
+ )
1108
+ end
1109
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1110
+
1111
+ MONDAY =
1112
+ T.let(
1113
+ :monday,
1114
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1115
+ )
1116
+ TUESDAY =
1117
+ T.let(
1118
+ :tuesday,
1119
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1120
+ )
1121
+ WEDNESDAY =
1122
+ T.let(
1123
+ :wednesday,
1124
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1125
+ )
1126
+ THURSDAY =
1127
+ T.let(
1128
+ :thursday,
1129
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1130
+ )
1131
+ FRIDAY =
1132
+ T.let(
1133
+ :friday,
1134
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1135
+ )
1136
+ SATURDAY =
1137
+ T.let(
1138
+ :saturday,
1139
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1140
+ )
1141
+ SUNDAY =
1142
+ T.let(
1143
+ :sunday,
1144
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1145
+ )
1146
+
1147
+ sig do
1148
+ override.returns(
1149
+ T::Array[
1150
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::AllowedDay::TaggedSymbol
1151
+ ]
1152
+ )
1153
+ end
1154
+ def self.values
1155
+ end
1156
+ end
1157
+
1158
+ class CallingWindow < Revox::Internal::Type::BaseModel
1159
+ OrHash =
1160
+ T.type_alias do
1161
+ T.any(
1162
+ Revox::Models::AssistantCloneResponse::Assistant::CallRetryConfig::CallingWindow,
1163
+ Revox::Internal::AnyHash
1164
+ )
1165
+ end
1166
+
1167
+ # End time for the calling window in the recipient's timezone (or
1168
+ # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
1169
+ # Examples: '17:00', '6pm'. Default: '18:00'.
1170
+ sig { returns(String) }
1171
+ attr_accessor :calling_window_end_time
1172
+
1173
+ # Start time for the calling window in the recipient's timezone (or
1174
+ # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
1175
+ # Examples: '09:00', '10am'. Default: '10:00'.
1176
+ sig { returns(String) }
1177
+ attr_accessor :calling_window_start_time
1178
+
1179
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1180
+ # allows. Default: 7200 (2 hours).
1181
+ sig { returns(Integer) }
1182
+ attr_accessor :retry_delay_seconds
1183
+
1184
+ sig do
1185
+ params(
1186
+ calling_window_end_time: String,
1187
+ calling_window_start_time: String,
1188
+ retry_delay_seconds: Integer
1189
+ ).returns(T.attached_class)
1190
+ end
1191
+ def self.new(
1192
+ # End time for the calling window in the recipient's timezone (or
1193
+ # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
1194
+ # Examples: '17:00', '6pm'. Default: '18:00'.
1195
+ calling_window_end_time:,
1196
+ # Start time for the calling window in the recipient's timezone (or
1197
+ # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
1198
+ # Examples: '09:00', '10am'. Default: '10:00'.
1199
+ calling_window_start_time:,
1200
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1201
+ # allows. Default: 7200 (2 hours).
1202
+ retry_delay_seconds:
1203
+ )
1204
+ end
1205
+
1206
+ sig do
1207
+ override.returns(
1208
+ {
1209
+ calling_window_end_time: String,
1210
+ calling_window_start_time: String,
1211
+ retry_delay_seconds: Integer
1212
+ }
1213
+ )
1214
+ end
1215
+ def to_hash
1216
+ end
1217
+ end
1218
+ end
1219
+
1220
+ class CustomTool < Revox::Internal::Type::BaseModel
1221
+ OrHash =
1222
+ T.type_alias do
1223
+ T.any(
1224
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool,
1225
+ Revox::Internal::AnyHash
1226
+ )
1227
+ end
1228
+
1229
+ # JSON body template for the request. Use quoted {{variable}} placeholders (e.g.
1230
+ # "{{name}}") for dynamic values
1231
+ sig { returns(T.nilable(String)) }
1232
+ attr_accessor :body_template
1233
+
1234
+ # Human-readable description of what the tool does, used by the LLM to decide when
1235
+ # to call it
1236
+ sig { returns(String) }
1237
+ attr_accessor :description
1238
+
1239
+ # HTTP headers to include in the request. Values support {{variable}} placeholders
1240
+ sig do
1241
+ returns(
1242
+ T::Array[
1243
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Header
1244
+ ]
1245
+ )
1246
+ end
1247
+ attr_accessor :headers
1248
+
1249
+ # Schema defining the parameters the LLM should extract from the conversation to
1250
+ # pass to this tool
1251
+ sig do
1252
+ returns(
1253
+ T::Array[
1254
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema
1255
+ ]
1256
+ )
1257
+ end
1258
+ attr_accessor :input_schema
1259
+
1260
+ # HTTP method to use when calling the API endpoint
1261
+ sig do
1262
+ returns(
1263
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol
1264
+ )
1265
+ end
1266
+ attr_accessor :method_
1267
+
1268
+ # Unique tool name in lowercase_snake_case (e.g. check_inventory)
1269
+ sig { returns(String) }
1270
+ attr_accessor :name
1271
+
1272
+ # Query string parameters appended to the URL. Values support {{variable}}
1273
+ # placeholders
1274
+ sig do
1275
+ returns(
1276
+ T::Array[
1277
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::QueryParam
1278
+ ]
1279
+ )
1280
+ end
1281
+ attr_accessor :query_params
1282
+
1283
+ # Full URL of the API endpoint. Supports {{variable}} placeholders for dynamic
1284
+ # values
1285
+ sig { returns(String) }
1286
+ attr_accessor :url
1287
+
1288
+ sig do
1289
+ params(
1290
+ body_template: T.nilable(String),
1291
+ description: String,
1292
+ headers:
1293
+ T::Array[
1294
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Header::OrHash
1295
+ ],
1296
+ input_schema:
1297
+ T::Array[
1298
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::OrHash
1299
+ ],
1300
+ method_:
1301
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::OrSymbol,
1302
+ name: String,
1303
+ query_params:
1304
+ T::Array[
1305
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::QueryParam::OrHash
1306
+ ],
1307
+ url: String
1308
+ ).returns(T.attached_class)
1309
+ end
1310
+ def self.new(
1311
+ # JSON body template for the request. Use quoted {{variable}} placeholders (e.g.
1312
+ # "{{name}}") for dynamic values
1313
+ body_template:,
1314
+ # Human-readable description of what the tool does, used by the LLM to decide when
1315
+ # to call it
1316
+ description:,
1317
+ # HTTP headers to include in the request. Values support {{variable}} placeholders
1318
+ headers:,
1319
+ # Schema defining the parameters the LLM should extract from the conversation to
1320
+ # pass to this tool
1321
+ input_schema:,
1322
+ # HTTP method to use when calling the API endpoint
1323
+ method_:,
1324
+ # Unique tool name in lowercase_snake_case (e.g. check_inventory)
1325
+ name:,
1326
+ # Query string parameters appended to the URL. Values support {{variable}}
1327
+ # placeholders
1328
+ query_params:,
1329
+ # Full URL of the API endpoint. Supports {{variable}} placeholders for dynamic
1330
+ # values
1331
+ url:
1332
+ )
1333
+ end
1334
+
1335
+ sig do
1336
+ override.returns(
1337
+ {
1338
+ body_template: T.nilable(String),
1339
+ description: String,
1340
+ headers:
1341
+ T::Array[
1342
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Header
1343
+ ],
1344
+ input_schema:
1345
+ T::Array[
1346
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema
1347
+ ],
1348
+ method_:
1349
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol,
1350
+ name: String,
1351
+ query_params:
1352
+ T::Array[
1353
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::QueryParam
1354
+ ],
1355
+ url: String
1356
+ }
1357
+ )
1358
+ end
1359
+ def to_hash
1360
+ end
1361
+
1362
+ class Header < Revox::Internal::Type::BaseModel
1363
+ OrHash =
1364
+ T.type_alias do
1365
+ T.any(
1366
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Header,
1367
+ Revox::Internal::AnyHash
1368
+ )
1369
+ end
1370
+
1371
+ sig { returns(String) }
1372
+ attr_accessor :key
1373
+
1374
+ sig { returns(String) }
1375
+ attr_accessor :value
1376
+
1377
+ sig { params(key: String, value: String).returns(T.attached_class) }
1378
+ def self.new(key:, value:)
1379
+ end
1380
+
1381
+ sig { override.returns({ key: String, value: String }) }
1382
+ def to_hash
1383
+ end
1384
+ end
1385
+
1386
+ class InputSchema < Revox::Internal::Type::BaseModel
1387
+ OrHash =
1388
+ T.type_alias do
1389
+ T.any(
1390
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema,
1391
+ Revox::Internal::AnyHash
1392
+ )
1393
+ end
1394
+
1395
+ sig { returns(String) }
1396
+ attr_accessor :name
1397
+
1398
+ sig { returns(T::Boolean) }
1399
+ attr_accessor :required
1400
+
1401
+ sig do
1402
+ returns(
1403
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1404
+ )
1405
+ end
1406
+ attr_accessor :type
1407
+
1408
+ sig { returns(T.nilable(String)) }
1409
+ attr_reader :description
1410
+
1411
+ sig { params(description: String).void }
1412
+ attr_writer :description
1413
+
1414
+ sig { returns(T.nilable(T::Array[String])) }
1415
+ attr_reader :enum_options
1416
+
1417
+ sig { params(enum_options: T::Array[String]).void }
1418
+ attr_writer :enum_options
1419
+
1420
+ sig do
1421
+ params(
1422
+ name: String,
1423
+ required: T::Boolean,
1424
+ type:
1425
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::OrSymbol,
1426
+ description: String,
1427
+ enum_options: T::Array[String]
1428
+ ).returns(T.attached_class)
1429
+ end
1430
+ def self.new(
1431
+ name:,
1432
+ required:,
1433
+ type:,
1434
+ description: nil,
1435
+ enum_options: nil
1436
+ )
1437
+ end
1438
+
1439
+ sig do
1440
+ override.returns(
1441
+ {
1442
+ name: String,
1443
+ required: T::Boolean,
1444
+ type:
1445
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol,
1446
+ description: String,
1447
+ enum_options: T::Array[String]
1448
+ }
1449
+ )
1450
+ end
1451
+ def to_hash
1452
+ end
1453
+
1454
+ module Type
1455
+ extend Revox::Internal::Type::Enum
1456
+
1457
+ TaggedSymbol =
1458
+ T.type_alias do
1459
+ T.all(
1460
+ Symbol,
1461
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type
1462
+ )
1463
+ end
1464
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1465
+
1466
+ STRING =
1467
+ T.let(
1468
+ :string,
1469
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1470
+ )
1471
+ NUMBER =
1472
+ T.let(
1473
+ :number,
1474
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1475
+ )
1476
+ BOOLEAN =
1477
+ T.let(
1478
+ :boolean,
1479
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1480
+ )
1481
+ ENUM =
1482
+ T.let(
1483
+ :enum,
1484
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1485
+ )
1486
+ DATE =
1487
+ T.let(
1488
+ :date,
1489
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1490
+ )
1491
+ DATETIME =
1492
+ T.let(
1493
+ :datetime,
1494
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1495
+ )
1496
+
1497
+ sig do
1498
+ override.returns(
1499
+ T::Array[
1500
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::InputSchema::Type::TaggedSymbol
1501
+ ]
1502
+ )
1503
+ end
1504
+ def self.values
1505
+ end
1506
+ end
1507
+ end
1508
+
1509
+ # HTTP method to use when calling the API endpoint
1510
+ module Method
1511
+ extend Revox::Internal::Type::Enum
1512
+
1513
+ TaggedSymbol =
1514
+ T.type_alias do
1515
+ T.all(
1516
+ Symbol,
1517
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method
1518
+ )
1519
+ end
1520
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1521
+
1522
+ GET =
1523
+ T.let(
1524
+ :GET,
1525
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol
1526
+ )
1527
+ POST =
1528
+ T.let(
1529
+ :POST,
1530
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol
1531
+ )
1532
+ PUT =
1533
+ T.let(
1534
+ :PUT,
1535
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol
1536
+ )
1537
+ PATCH =
1538
+ T.let(
1539
+ :PATCH,
1540
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol
1541
+ )
1542
+ DELETE =
1543
+ T.let(
1544
+ :DELETE,
1545
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol
1546
+ )
1547
+
1548
+ sig do
1549
+ override.returns(
1550
+ T::Array[
1551
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::Method::TaggedSymbol
1552
+ ]
1553
+ )
1554
+ end
1555
+ def self.values
1556
+ end
1557
+ end
1558
+
1559
+ class QueryParam < Revox::Internal::Type::BaseModel
1560
+ OrHash =
1561
+ T.type_alias do
1562
+ T.any(
1563
+ Revox::Models::AssistantCloneResponse::Assistant::CustomTool::QueryParam,
1564
+ Revox::Internal::AnyHash
1565
+ )
1566
+ end
1567
+
1568
+ sig { returns(String) }
1569
+ attr_accessor :key
1570
+
1571
+ sig { returns(String) }
1572
+ attr_accessor :value
1573
+
1574
+ sig { params(key: String, value: String).returns(T.attached_class) }
1575
+ def self.new(key:, value:)
1576
+ end
1577
+
1578
+ sig { override.returns({ key: String, value: String }) }
1579
+ def to_hash
1580
+ end
1581
+ end
1582
+ end
1583
+
1584
+ module EmailNotificationOutcome
1585
+ extend Revox::Internal::Type::Enum
1586
+
1587
+ TaggedSymbol =
1588
+ T.type_alias do
1589
+ T.all(
1590
+ Symbol,
1591
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome
1592
+ )
1593
+ end
1594
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1595
+
1596
+ NOT_INTERESTED =
1597
+ T.let(
1598
+ :not_interested,
1599
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
1600
+ )
1601
+ INTERESTED =
1602
+ T.let(
1603
+ :interested,
1604
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
1605
+ )
1606
+ COMPLETED =
1607
+ T.let(
1608
+ :completed,
1609
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
1610
+ )
1611
+ REQUESTED_CALLBACK_LATER =
1612
+ T.let(
1613
+ :requested_callback_later,
1614
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
1615
+ )
1616
+ NONE =
1617
+ T.let(
1618
+ :none,
1619
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
1620
+ )
1621
+
1622
+ sig do
1623
+ override.returns(
1624
+ T::Array[
1625
+ Revox::Models::AssistantCloneResponse::Assistant::EmailNotificationOutcome::TaggedSymbol
1626
+ ]
1627
+ )
1628
+ end
1629
+ def self.values
1630
+ end
1631
+ end
1632
+
1633
+ module FirstSentenceMode
1634
+ extend Revox::Internal::Type::Enum
1635
+
1636
+ TaggedSymbol =
1637
+ T.type_alias do
1638
+ T.all(
1639
+ Symbol,
1640
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode
1641
+ )
1642
+ end
1643
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1644
+
1645
+ GENERATED =
1646
+ T.let(
1647
+ :generated,
1648
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode::TaggedSymbol
1649
+ )
1650
+ STATIC =
1651
+ T.let(
1652
+ :static,
1653
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode::TaggedSymbol
1654
+ )
1655
+ NONE =
1656
+ T.let(
1657
+ :none,
1658
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode::TaggedSymbol
1659
+ )
1660
+
1661
+ sig do
1662
+ override.returns(
1663
+ T::Array[
1664
+ Revox::Models::AssistantCloneResponse::Assistant::FirstSentenceMode::TaggedSymbol
1665
+ ]
1666
+ )
1667
+ end
1668
+ def self.values
1669
+ end
1670
+ end
1671
+
1672
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
1673
+ # transfer is not configured.
1674
+ module HumanTransferMode
1675
+ extend Revox::Internal::Type::Enum
1676
+
1677
+ TaggedSymbol =
1678
+ T.type_alias do
1679
+ T.all(
1680
+ Symbol,
1681
+ Revox::Models::AssistantCloneResponse::Assistant::HumanTransferMode
1682
+ )
1683
+ end
1684
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1685
+
1686
+ WARM =
1687
+ T.let(
1688
+ :warm,
1689
+ Revox::Models::AssistantCloneResponse::Assistant::HumanTransferMode::TaggedSymbol
1690
+ )
1691
+ COLD =
1692
+ T.let(
1693
+ :cold,
1694
+ Revox::Models::AssistantCloneResponse::Assistant::HumanTransferMode::TaggedSymbol
1695
+ )
1696
+
1697
+ sig do
1698
+ override.returns(
1699
+ T::Array[
1700
+ Revox::Models::AssistantCloneResponse::Assistant::HumanTransferMode::TaggedSymbol
1701
+ ]
1702
+ )
1703
+ end
1704
+ def self.values
1705
+ end
1706
+ end
1707
+
1708
+ module LlmModel
1709
+ extend Revox::Internal::Type::Union
1710
+
1711
+ Variants =
1712
+ T.type_alias do
1713
+ T.any(
1714
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0,
1715
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember1,
1716
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember2,
1717
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3
1718
+ )
1719
+ end
1720
+
1721
+ class UnionMember0 < Revox::Internal::Type::BaseModel
1722
+ OrHash =
1723
+ T.type_alias do
1724
+ T.any(
1725
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0,
1726
+ Revox::Internal::AnyHash
1727
+ )
1728
+ end
1729
+
1730
+ sig do
1731
+ returns(
1732
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::Name::TaggedSymbol
1733
+ )
1734
+ end
1735
+ attr_accessor :name
1736
+
1737
+ sig { returns(Symbol) }
1738
+ attr_accessor :type
1739
+
1740
+ sig do
1741
+ params(
1742
+ name:
1743
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::Name::OrSymbol,
1744
+ type: Symbol
1745
+ ).returns(T.attached_class)
1746
+ end
1747
+ def self.new(name:, type: :"dedicated-instance")
1748
+ end
1749
+
1750
+ sig do
1751
+ override.returns(
1752
+ {
1753
+ name:
1754
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::Name::TaggedSymbol,
1755
+ type: Symbol
1756
+ }
1757
+ )
1758
+ end
1759
+ def to_hash
1760
+ end
1761
+
1762
+ module Name
1763
+ extend Revox::Internal::Type::Enum
1764
+
1765
+ TaggedSymbol =
1766
+ T.type_alias do
1767
+ T.all(
1768
+ Symbol,
1769
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::Name
1770
+ )
1771
+ end
1772
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1773
+
1774
+ GPT_4_1 =
1775
+ T.let(
1776
+ :"gpt-4.1",
1777
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::Name::TaggedSymbol
1778
+ )
1779
+ MINISTRAL_3_8B_INSTRUCT =
1780
+ T.let(
1781
+ :"ministral-3-8b-instruct",
1782
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::Name::TaggedSymbol
1783
+ )
1784
+
1785
+ sig do
1786
+ override.returns(
1787
+ T::Array[
1788
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember0::Name::TaggedSymbol
1789
+ ]
1790
+ )
1791
+ end
1792
+ def self.values
1793
+ end
1794
+ end
1795
+ end
1796
+
1797
+ class UnionMember1 < Revox::Internal::Type::BaseModel
1798
+ OrHash =
1799
+ T.type_alias do
1800
+ T.any(
1801
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember1,
1802
+ Revox::Internal::AnyHash
1803
+ )
1804
+ end
1805
+
1806
+ # The model ID to use from OpenRouter. eg: openai/gpt-4.1
1807
+ sig { returns(String) }
1808
+ attr_accessor :openrouter_model_id
1809
+
1810
+ # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
1811
+ sig { returns(String) }
1812
+ attr_accessor :openrouter_provider
1813
+
1814
+ # Use a model from OpenRouter.
1815
+ sig { returns(Symbol) }
1816
+ attr_accessor :type
1817
+
1818
+ sig do
1819
+ params(
1820
+ openrouter_model_id: String,
1821
+ openrouter_provider: String,
1822
+ type: Symbol
1823
+ ).returns(T.attached_class)
1824
+ end
1825
+ def self.new(
1826
+ # The model ID to use from OpenRouter. eg: openai/gpt-4.1
1827
+ openrouter_model_id:,
1828
+ # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
1829
+ openrouter_provider:,
1830
+ # Use a model from OpenRouter.
1831
+ type: :openrouter
1832
+ )
1833
+ end
1834
+
1835
+ sig do
1836
+ override.returns(
1837
+ {
1838
+ openrouter_model_id: String,
1839
+ openrouter_provider: String,
1840
+ type: Symbol
1841
+ }
1842
+ )
1843
+ end
1844
+ def to_hash
1845
+ end
1846
+ end
1847
+
1848
+ class UnionMember2 < Revox::Internal::Type::BaseModel
1849
+ OrHash =
1850
+ T.type_alias do
1851
+ T.any(
1852
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember2,
1853
+ Revox::Internal::AnyHash
1854
+ )
1855
+ end
1856
+
1857
+ # API key sent as Bearer token to the custom endpoint.
1858
+ sig { returns(String) }
1859
+ attr_accessor :api_key
1860
+
1861
+ # Base URL for the OpenAI-compatible API, e.g. https://api.together.xyz/v1
1862
+ sig { returns(String) }
1863
+ attr_accessor :api_url
1864
+
1865
+ # Model name as expected by the provider, e.g. meta-llama/llama-3-70b
1866
+ sig { returns(String) }
1867
+ attr_accessor :model_name
1868
+
1869
+ # OpenAI-compatible chat completions API (bring your own endpoint and key).
1870
+ sig { returns(Symbol) }
1871
+ attr_accessor :type
1872
+
1873
+ sig do
1874
+ params(
1875
+ api_key: String,
1876
+ api_url: String,
1877
+ model_name: String,
1878
+ type: Symbol
1879
+ ).returns(T.attached_class)
1880
+ end
1881
+ def self.new(
1882
+ # API key sent as Bearer token to the custom endpoint.
1883
+ api_key:,
1884
+ # Base URL for the OpenAI-compatible API, e.g. https://api.together.xyz/v1
1885
+ api_url:,
1886
+ # Model name as expected by the provider, e.g. meta-llama/llama-3-70b
1887
+ model_name:,
1888
+ # OpenAI-compatible chat completions API (bring your own endpoint and key).
1889
+ type: :custom
1890
+ )
1891
+ end
1892
+
1893
+ sig do
1894
+ override.returns(
1895
+ {
1896
+ api_key: String,
1897
+ api_url: String,
1898
+ model_name: String,
1899
+ type: Symbol
1900
+ }
1901
+ )
1902
+ end
1903
+ def to_hash
1904
+ end
1905
+ end
1906
+
1907
+ class UnionMember3 < Revox::Internal::Type::BaseModel
1908
+ OrHash =
1909
+ T.type_alias do
1910
+ T.any(
1911
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3,
1912
+ Revox::Internal::AnyHash
1913
+ )
1914
+ end
1915
+
1916
+ # The provider to use from Realtime. eg: openai, google.
1917
+ sig do
1918
+ returns(
1919
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::Provider::TaggedSymbol
1920
+ )
1921
+ end
1922
+ attr_accessor :provider
1923
+
1924
+ # The model ID to use from Realtime. eg: gpt-4.1
1925
+ sig { returns(String) }
1926
+ attr_accessor :realtime_model_id
1927
+
1928
+ # Use a model from Realtime.
1929
+ sig { returns(Symbol) }
1930
+ attr_accessor :type
1931
+
1932
+ # Output voice for the realtime provider (e.g. OpenAI: marin; Gemini: Puck).
1933
+ sig { returns(T.nilable(String)) }
1934
+ attr_reader :realtime_voice_id
1935
+
1936
+ sig { params(realtime_voice_id: String).void }
1937
+ attr_writer :realtime_voice_id
1938
+
1939
+ sig do
1940
+ params(
1941
+ provider:
1942
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::Provider::OrSymbol,
1943
+ realtime_model_id: String,
1944
+ realtime_voice_id: String,
1945
+ type: Symbol
1946
+ ).returns(T.attached_class)
1947
+ end
1948
+ def self.new(
1949
+ # The provider to use from Realtime. eg: openai, google.
1950
+ provider:,
1951
+ # The model ID to use from Realtime. eg: gpt-4.1
1952
+ realtime_model_id:,
1953
+ # Output voice for the realtime provider (e.g. OpenAI: marin; Gemini: Puck).
1954
+ realtime_voice_id: nil,
1955
+ # Use a model from Realtime.
1956
+ type: :realtime
1957
+ )
1958
+ end
1959
+
1960
+ sig do
1961
+ override.returns(
1962
+ {
1963
+ provider:
1964
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::Provider::TaggedSymbol,
1965
+ realtime_model_id: String,
1966
+ type: Symbol,
1967
+ realtime_voice_id: String
1968
+ }
1969
+ )
1970
+ end
1971
+ def to_hash
1972
+ end
1973
+
1974
+ # The provider to use from Realtime. eg: openai, google.
1975
+ module Provider
1976
+ extend Revox::Internal::Type::Enum
1977
+
1978
+ TaggedSymbol =
1979
+ T.type_alias do
1980
+ T.all(
1981
+ Symbol,
1982
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::Provider
1983
+ )
1984
+ end
1985
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1986
+
1987
+ OPENAI =
1988
+ T.let(
1989
+ :openai,
1990
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::Provider::TaggedSymbol
1991
+ )
1992
+ GOOGLE =
1993
+ T.let(
1994
+ :google,
1995
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::Provider::TaggedSymbol
1996
+ )
1997
+
1998
+ sig do
1999
+ override.returns(
2000
+ T::Array[
2001
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::UnionMember3::Provider::TaggedSymbol
2002
+ ]
2003
+ )
2004
+ end
2005
+ def self.values
2006
+ end
2007
+ end
2008
+ end
2009
+
2010
+ sig do
2011
+ override.returns(
2012
+ T::Array[
2013
+ Revox::Models::AssistantCloneResponse::Assistant::LlmModel::Variants
2014
+ ]
2015
+ )
2016
+ end
2017
+ def self.variants
2018
+ end
2019
+ end
2020
+
2021
+ class Position < Revox::Internal::Type::BaseModel
2022
+ OrHash =
2023
+ T.type_alias do
2024
+ T.any(
2025
+ Revox::Models::AssistantCloneResponse::Assistant::Position,
2026
+ Revox::Internal::AnyHash
2027
+ )
2028
+ end
2029
+
2030
+ sig { returns(Float) }
2031
+ attr_accessor :x
2032
+
2033
+ sig { returns(Float) }
2034
+ attr_accessor :y_
2035
+
2036
+ sig { params(x: Float, y_: Float).returns(T.attached_class) }
2037
+ def self.new(x:, y_:)
2038
+ end
2039
+
2040
+ sig { override.returns({ x: Float, y_: Float }) }
2041
+ def to_hash
2042
+ end
2043
+ end
2044
+
2045
+ class PromptFlow < Revox::Internal::Type::BaseModel
2046
+ OrHash =
2047
+ T.type_alias do
2048
+ T.any(
2049
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow,
2050
+ Revox::Internal::AnyHash
2051
+ )
2052
+ end
2053
+
2054
+ sig do
2055
+ returns(
2056
+ T::Array[
2057
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Edge
2058
+ ]
2059
+ )
2060
+ end
2061
+ attr_accessor :edges
2062
+
2063
+ sig do
2064
+ returns(
2065
+ T::Array[
2066
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node
2067
+ ]
2068
+ )
2069
+ end
2070
+ attr_accessor :nodes
2071
+
2072
+ sig do
2073
+ params(
2074
+ edges:
2075
+ T::Array[
2076
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Edge::OrHash
2077
+ ],
2078
+ nodes:
2079
+ T::Array[
2080
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::OrHash
2081
+ ]
2082
+ ).returns(T.attached_class)
2083
+ end
2084
+ def self.new(edges:, nodes:)
2085
+ end
2086
+
2087
+ sig do
2088
+ override.returns(
2089
+ {
2090
+ edges:
2091
+ T::Array[
2092
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Edge
2093
+ ],
2094
+ nodes:
2095
+ T::Array[
2096
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node
2097
+ ]
2098
+ }
2099
+ )
2100
+ end
2101
+ def to_hash
2102
+ end
2103
+
2104
+ class Edge < Revox::Internal::Type::BaseModel
2105
+ OrHash =
2106
+ T.type_alias do
2107
+ T.any(
2108
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Edge,
2109
+ Revox::Internal::AnyHash
2110
+ )
2111
+ end
2112
+
2113
+ sig { returns(String) }
2114
+ attr_accessor :id
2115
+
2116
+ sig { returns(String) }
2117
+ attr_accessor :source
2118
+
2119
+ sig { returns(String) }
2120
+ attr_accessor :target
2121
+
2122
+ sig do
2123
+ params(id: String, source: String, target: String).returns(
2124
+ T.attached_class
2125
+ )
2126
+ end
2127
+ def self.new(id:, source:, target:)
2128
+ end
2129
+
2130
+ sig do
2131
+ override.returns({ id: String, source: String, target: String })
2132
+ end
2133
+ def to_hash
2134
+ end
2135
+ end
2136
+
2137
+ class Node < Revox::Internal::Type::BaseModel
2138
+ OrHash =
2139
+ T.type_alias do
2140
+ T.any(
2141
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node,
2142
+ Revox::Internal::AnyHash
2143
+ )
2144
+ end
2145
+
2146
+ sig { returns(String) }
2147
+ attr_accessor :id
2148
+
2149
+ sig do
2150
+ returns(
2151
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Data
2152
+ )
2153
+ end
2154
+ attr_reader :data
2155
+
2156
+ sig do
2157
+ params(
2158
+ data:
2159
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Data::OrHash
2160
+ ).void
2161
+ end
2162
+ attr_writer :data
2163
+
2164
+ sig do
2165
+ returns(
2166
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Position
2167
+ )
2168
+ end
2169
+ attr_reader :position
2170
+
2171
+ sig do
2172
+ params(
2173
+ position:
2174
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Position::OrHash
2175
+ ).void
2176
+ end
2177
+ attr_writer :position
2178
+
2179
+ sig { returns(Symbol) }
2180
+ attr_accessor :type
2181
+
2182
+ sig do
2183
+ params(
2184
+ id: String,
2185
+ data:
2186
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Data::OrHash,
2187
+ position:
2188
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Position::OrHash,
2189
+ type: Symbol
2190
+ ).returns(T.attached_class)
2191
+ end
2192
+ def self.new(id:, data:, position:, type: :promptBlock)
2193
+ end
2194
+
2195
+ sig do
2196
+ override.returns(
2197
+ {
2198
+ id: String,
2199
+ data:
2200
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Data,
2201
+ position:
2202
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Position,
2203
+ type: Symbol
2204
+ }
2205
+ )
2206
+ end
2207
+ def to_hash
2208
+ end
2209
+
2210
+ class Data < Revox::Internal::Type::BaseModel
2211
+ OrHash =
2212
+ T.type_alias do
2213
+ T.any(
2214
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Data,
2215
+ Revox::Internal::AnyHash
2216
+ )
2217
+ end
2218
+
2219
+ sig { returns(String) }
2220
+ attr_accessor :body
2221
+
2222
+ sig { returns(String) }
2223
+ attr_accessor :title
2224
+
2225
+ sig do
2226
+ params(body: String, title: String).returns(T.attached_class)
2227
+ end
2228
+ def self.new(body:, title:)
2229
+ end
2230
+
2231
+ sig { override.returns({ body: String, title: String }) }
2232
+ def to_hash
2233
+ end
2234
+ end
2235
+
2236
+ class Position < Revox::Internal::Type::BaseModel
2237
+ OrHash =
2238
+ T.type_alias do
2239
+ T.any(
2240
+ Revox::Models::AssistantCloneResponse::Assistant::PromptFlow::Node::Position,
2241
+ Revox::Internal::AnyHash
2242
+ )
2243
+ end
2244
+
2245
+ sig { returns(Float) }
2246
+ attr_accessor :x
2247
+
2248
+ sig { returns(Float) }
2249
+ attr_accessor :y_
2250
+
2251
+ sig { params(x: Float, y_: Float).returns(T.attached_class) }
2252
+ def self.new(x:, y_:)
2253
+ end
2254
+
2255
+ sig { override.returns({ x: Float, y_: Float }) }
2256
+ def to_hash
2257
+ end
2258
+ end
2259
+ end
2260
+ end
2261
+
2262
+ class Slack < Revox::Internal::Type::BaseModel
2263
+ OrHash =
2264
+ T.type_alias do
2265
+ T.any(
2266
+ Revox::Models::AssistantCloneResponse::Assistant::Slack,
2267
+ Revox::Internal::AnyHash
2268
+ )
2269
+ end
2270
+
2271
+ # The Slack channels eligible to receive the notification. When more than one is
2272
+ # configured, the agent prompt may define routing rules to narrow it down per
2273
+ # call; with no such rules every channel here is notified.
2274
+ sig do
2275
+ returns(
2276
+ T::Array[
2277
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Channel
2278
+ ]
2279
+ )
2280
+ end
2281
+ attr_accessor :channels
2282
+
2283
+ # The Nango connection ID linking the org's Slack workspace to Revox.
2284
+ sig { returns(String) }
2285
+ attr_accessor :connection_id
2286
+
2287
+ # Which call outcomes trigger a Slack notification (e.g. ['interested', 'none']).
2288
+ # Use 'none' to notify when outcome is null.
2289
+ sig do
2290
+ returns(
2291
+ T::Array[
2292
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2293
+ ]
2294
+ )
2295
+ end
2296
+ attr_accessor :outcomes
2297
+
2298
+ # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2299
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2300
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2301
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2302
+ # null/empty a default template is used.
2303
+ sig { returns(T.nilable(String)) }
2304
+ attr_accessor :template
2305
+
2306
+ sig do
2307
+ params(
2308
+ channels:
2309
+ T::Array[
2310
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Channel::OrHash
2311
+ ],
2312
+ connection_id: String,
2313
+ outcomes:
2314
+ T::Array[
2315
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::OrSymbol
2316
+ ],
2317
+ template: T.nilable(String)
2318
+ ).returns(T.attached_class)
2319
+ end
2320
+ def self.new(
2321
+ # The Slack channels eligible to receive the notification. When more than one is
2322
+ # configured, the agent prompt may define routing rules to narrow it down per
2323
+ # call; with no such rules every channel here is notified.
2324
+ channels:,
2325
+ # The Nango connection ID linking the org's Slack workspace to Revox.
2326
+ connection_id:,
2327
+ # Which call outcomes trigger a Slack notification (e.g. ['interested', 'none']).
2328
+ # Use 'none' to notify when outcome is null.
2329
+ outcomes:,
2330
+ # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2331
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2332
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2333
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2334
+ # null/empty a default template is used.
2335
+ template: nil
2336
+ )
2337
+ end
2338
+
2339
+ sig do
2340
+ override.returns(
2341
+ {
2342
+ channels:
2343
+ T::Array[
2344
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Channel
2345
+ ],
2346
+ connection_id: String,
2347
+ outcomes:
2348
+ T::Array[
2349
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2350
+ ],
2351
+ template: T.nilable(String)
2352
+ }
2353
+ )
2354
+ end
2355
+ def to_hash
2356
+ end
2357
+
2358
+ class Channel < Revox::Internal::Type::BaseModel
2359
+ OrHash =
2360
+ T.type_alias do
2361
+ T.any(
2362
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Channel,
2363
+ Revox::Internal::AnyHash
2364
+ )
2365
+ end
2366
+
2367
+ # The Slack channel ID (e.g. 'C01234567').
2368
+ sig { returns(String) }
2369
+ attr_accessor :id
2370
+
2371
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2372
+ # LLM when the agent prompt routes by channel name.
2373
+ sig { returns(T.nilable(String)) }
2374
+ attr_accessor :name
2375
+
2376
+ sig do
2377
+ params(id: String, name: T.nilable(String)).returns(
2378
+ T.attached_class
2379
+ )
2380
+ end
2381
+ def self.new(
2382
+ # The Slack channel ID (e.g. 'C01234567').
2383
+ id:,
2384
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2385
+ # LLM when the agent prompt routes by channel name.
2386
+ name: nil
2387
+ )
2388
+ end
2389
+
2390
+ sig { override.returns({ id: String, name: T.nilable(String) }) }
2391
+ def to_hash
2392
+ end
2393
+ end
2394
+
2395
+ module Outcome
2396
+ extend Revox::Internal::Type::Enum
2397
+
2398
+ TaggedSymbol =
2399
+ T.type_alias do
2400
+ T.all(
2401
+ Symbol,
2402
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome
2403
+ )
2404
+ end
2405
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2406
+
2407
+ NOT_INTERESTED =
2408
+ T.let(
2409
+ :not_interested,
2410
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2411
+ )
2412
+ INTERESTED =
2413
+ T.let(
2414
+ :interested,
2415
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2416
+ )
2417
+ COMPLETED =
2418
+ T.let(
2419
+ :completed,
2420
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2421
+ )
2422
+ REQUESTED_CALLBACK_LATER =
2423
+ T.let(
2424
+ :requested_callback_later,
2425
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2426
+ )
2427
+ NONE =
2428
+ T.let(
2429
+ :none,
2430
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2431
+ )
2432
+
2433
+ sig do
2434
+ override.returns(
2435
+ T::Array[
2436
+ Revox::Models::AssistantCloneResponse::Assistant::Slack::Outcome::TaggedSymbol
2437
+ ]
2438
+ )
2439
+ end
2440
+ def self.values
2441
+ end
2442
+ end
2443
+ end
2444
+
2445
+ class StructuredOutputConfig < Revox::Internal::Type::BaseModel
2446
+ OrHash =
2447
+ T.type_alias do
2448
+ T.any(
2449
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig,
2450
+ Revox::Internal::AnyHash
2451
+ )
2452
+ end
2453
+
2454
+ sig { returns(String) }
2455
+ attr_accessor :name
2456
+
2457
+ sig { returns(T::Boolean) }
2458
+ attr_accessor :required
2459
+
2460
+ sig do
2461
+ returns(
2462
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2463
+ )
2464
+ end
2465
+ attr_accessor :type
2466
+
2467
+ sig { returns(T.nilable(String)) }
2468
+ attr_reader :description
2469
+
2470
+ sig { params(description: String).void }
2471
+ attr_writer :description
2472
+
2473
+ sig { returns(T.nilable(T::Array[String])) }
2474
+ attr_reader :enum_options
2475
+
2476
+ sig { params(enum_options: T::Array[String]).void }
2477
+ attr_writer :enum_options
2478
+
2479
+ sig do
2480
+ params(
2481
+ name: String,
2482
+ required: T::Boolean,
2483
+ type:
2484
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::OrSymbol,
2485
+ description: String,
2486
+ enum_options: T::Array[String]
2487
+ ).returns(T.attached_class)
2488
+ end
2489
+ def self.new(
2490
+ name:,
2491
+ required:,
2492
+ type:,
2493
+ description: nil,
2494
+ enum_options: nil
2495
+ )
2496
+ end
2497
+
2498
+ sig do
2499
+ override.returns(
2500
+ {
2501
+ name: String,
2502
+ required: T::Boolean,
2503
+ type:
2504
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol,
2505
+ description: String,
2506
+ enum_options: T::Array[String]
2507
+ }
2508
+ )
2509
+ end
2510
+ def to_hash
2511
+ end
2512
+
2513
+ module Type
2514
+ extend Revox::Internal::Type::Enum
2515
+
2516
+ TaggedSymbol =
2517
+ T.type_alias do
2518
+ T.all(
2519
+ Symbol,
2520
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type
2521
+ )
2522
+ end
2523
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2524
+
2525
+ STRING =
2526
+ T.let(
2527
+ :string,
2528
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2529
+ )
2530
+ NUMBER =
2531
+ T.let(
2532
+ :number,
2533
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2534
+ )
2535
+ BOOLEAN =
2536
+ T.let(
2537
+ :boolean,
2538
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2539
+ )
2540
+ ENUM =
2541
+ T.let(
2542
+ :enum,
2543
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2544
+ )
2545
+ DATE =
2546
+ T.let(
2547
+ :date,
2548
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2549
+ )
2550
+ DATETIME =
2551
+ T.let(
2552
+ :datetime,
2553
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2554
+ )
2555
+
2556
+ sig do
2557
+ override.returns(
2558
+ T::Array[
2559
+ Revox::Models::AssistantCloneResponse::Assistant::StructuredOutputConfig::Type::TaggedSymbol
2560
+ ]
2561
+ )
2562
+ end
2563
+ def self.values
2564
+ end
2565
+ end
2566
+ end
2567
+
2568
+ class SttContext < Revox::Internal::Type::BaseModel
2569
+ OrHash =
2570
+ T.type_alias do
2571
+ T.any(
2572
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext,
2573
+ Revox::Internal::AnyHash
2574
+ )
2575
+ end
2576
+
2577
+ sig do
2578
+ returns(
2579
+ T::Array[
2580
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext::General
2581
+ ]
2582
+ )
2583
+ end
2584
+ attr_accessor :general
2585
+
2586
+ sig { returns(T::Array[String]) }
2587
+ attr_accessor :terms
2588
+
2589
+ # Assistant-level speech-to-text context: structured `general` key/value pairs
2590
+ # plus a list of domain `terms`. Prompt-derived context is merged in without
2591
+ # replacing existing entries.
2592
+ sig do
2593
+ params(
2594
+ general:
2595
+ T::Array[
2596
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext::General::OrHash
2597
+ ],
2598
+ terms: T::Array[String]
2599
+ ).returns(T.attached_class)
2600
+ end
2601
+ def self.new(general:, terms:)
2602
+ end
2603
+
2604
+ sig do
2605
+ override.returns(
2606
+ {
2607
+ general:
2608
+ T::Array[
2609
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext::General
2610
+ ],
2611
+ terms: T::Array[String]
2612
+ }
2613
+ )
2614
+ end
2615
+ def to_hash
2616
+ end
2617
+
2618
+ class General < Revox::Internal::Type::BaseModel
2619
+ OrHash =
2620
+ T.type_alias do
2621
+ T.any(
2622
+ Revox::Models::AssistantCloneResponse::Assistant::SttContext::General,
2623
+ Revox::Internal::AnyHash
2624
+ )
2625
+ end
2626
+
2627
+ sig { returns(String) }
2628
+ attr_accessor :key
2629
+
2630
+ sig { returns(String) }
2631
+ attr_accessor :value
2632
+
2633
+ sig { params(key: String, value: String).returns(T.attached_class) }
2634
+ def self.new(key:, value:)
2635
+ end
2636
+
2637
+ sig { override.returns({ key: String, value: String }) }
2638
+ def to_hash
2639
+ end
2640
+ end
2641
+ end
2642
+
2643
+ # Transcriber (speech-to-text) model used for the assistant.
2644
+ module SttModel
2645
+ extend Revox::Internal::Type::Enum
2646
+
2647
+ TaggedSymbol =
2648
+ T.type_alias do
2649
+ T.all(
2650
+ Symbol,
2651
+ Revox::Models::AssistantCloneResponse::Assistant::SttModel
2652
+ )
2653
+ end
2654
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2655
+
2656
+ STT_RT_V4 =
2657
+ T.let(
2658
+ :"stt-rt-v4",
2659
+ Revox::Models::AssistantCloneResponse::Assistant::SttModel::TaggedSymbol
2660
+ )
2661
+ STT_RT_V5 =
2662
+ T.let(
2663
+ :"stt-rt-v5",
2664
+ Revox::Models::AssistantCloneResponse::Assistant::SttModel::TaggedSymbol
2665
+ )
2666
+
2667
+ sig do
2668
+ override.returns(
2669
+ T::Array[
2670
+ Revox::Models::AssistantCloneResponse::Assistant::SttModel::TaggedSymbol
2671
+ ]
2672
+ )
2673
+ end
2674
+ def self.values
2675
+ end
2676
+ end
2677
+
2678
+ # Audio clip to play while the agent is processing a response. One of the built-in
2679
+ # LiveKit audio clips; null disables it.
2680
+ module ThinkingSound
2681
+ extend Revox::Internal::Type::Enum
2682
+
2683
+ TaggedSymbol =
2684
+ T.type_alias do
2685
+ T.all(
2686
+ Symbol,
2687
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound
2688
+ )
2689
+ end
2690
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2691
+
2692
+ CITY_AMBIENCE_OGG =
2693
+ T.let(
2694
+ :"city-ambience.ogg",
2695
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2696
+ )
2697
+ FOREST_AMBIENCE_OGG =
2698
+ T.let(
2699
+ :"forest-ambience.ogg",
2700
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2701
+ )
2702
+ OFFICE_AMBIENCE_OGG =
2703
+ T.let(
2704
+ :"office-ambience.ogg",
2705
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2706
+ )
2707
+ CROWDED_ROOM_OGG =
2708
+ T.let(
2709
+ :"crowded-room.ogg",
2710
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2711
+ )
2712
+ KEYBOARD_TYPING_OGG =
2713
+ T.let(
2714
+ :"keyboard-typing.ogg",
2715
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2716
+ )
2717
+ KEYBOARD_TYPING2_OGG =
2718
+ T.let(
2719
+ :"keyboard-typing2.ogg",
2720
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2721
+ )
2722
+ HOLD_MUSIC_OGG =
2723
+ T.let(
2724
+ :"hold_music.ogg",
2725
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2726
+ )
2727
+
2728
+ sig do
2729
+ override.returns(
2730
+ T::Array[
2731
+ Revox::Models::AssistantCloneResponse::Assistant::ThinkingSound::TaggedSymbol
2732
+ ]
2733
+ )
2734
+ end
2735
+ def self.values
2736
+ end
2737
+ end
2738
+
2739
+ class TransferDestination < Revox::Internal::Type::BaseModel
2740
+ OrHash =
2741
+ T.type_alias do
2742
+ T.any(
2743
+ Revox::Models::AssistantCloneResponse::Assistant::TransferDestination,
2744
+ Revox::Internal::AnyHash
2745
+ )
2746
+ end
2747
+
2748
+ sig { returns(String) }
2749
+ attr_accessor :label
2750
+
2751
+ sig { returns(String) }
2752
+ attr_accessor :phone_number
2753
+
2754
+ sig do
2755
+ params(label: String, phone_number: String).returns(
2756
+ T.attached_class
2757
+ )
2758
+ end
2759
+ def self.new(label:, phone_number:)
2760
+ end
2761
+
2762
+ sig { override.returns({ label: String, phone_number: String }) }
2763
+ def to_hash
2764
+ end
2765
+ end
2766
+
2767
+ module Type
2768
+ extend Revox::Internal::Type::Enum
2769
+
2770
+ TaggedSymbol =
2771
+ T.type_alias do
2772
+ T.all(
2773
+ Symbol,
2774
+ Revox::Models::AssistantCloneResponse::Assistant::Type
2775
+ )
2776
+ end
2777
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2778
+
2779
+ STANDALONE =
2780
+ T.let(
2781
+ :standalone,
2782
+ Revox::Models::AssistantCloneResponse::Assistant::Type::TaggedSymbol
2783
+ )
2784
+ MULTI_STEP =
2785
+ T.let(
2786
+ :"multi-step",
2787
+ Revox::Models::AssistantCloneResponse::Assistant::Type::TaggedSymbol
2788
+ )
2789
+ SUB_ASSISTANT =
2790
+ T.let(
2791
+ :"sub-assistant",
2792
+ Revox::Models::AssistantCloneResponse::Assistant::Type::TaggedSymbol
2793
+ )
2794
+
2795
+ sig do
2796
+ override.returns(
2797
+ T::Array[
2798
+ Revox::Models::AssistantCloneResponse::Assistant::Type::TaggedSymbol
2799
+ ]
2800
+ )
2801
+ end
2802
+ def self.values
2803
+ end
2804
+ end
2805
+
2806
+ class Voice < Revox::Internal::Type::BaseModel
2807
+ OrHash =
2808
+ T.type_alias do
2809
+ T.any(
2810
+ Revox::Models::AssistantCloneResponse::Assistant::Voice,
2811
+ Revox::Internal::AnyHash
2812
+ )
2813
+ end
2814
+
2815
+ # The ID of the voice.
2816
+ sig { returns(String) }
2817
+ attr_accessor :id
2818
+
2819
+ # The provider of the voice.
2820
+ sig do
2821
+ returns(
2822
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider::TaggedSymbol
2823
+ )
2824
+ end
2825
+ attr_accessor :provider
2826
+
2827
+ # Cartesia TTS model (Cartesia only). Defaults to sonic-3 when omitted. Ignored
2828
+ # for other providers.
2829
+ sig do
2830
+ returns(
2831
+ T.nilable(
2832
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model::TaggedSymbol
2833
+ )
2834
+ )
2835
+ end
2836
+ attr_reader :model
2837
+
2838
+ sig do
2839
+ params(
2840
+ model:
2841
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model::OrSymbol
2842
+ ).void
2843
+ end
2844
+ attr_writer :model
2845
+
2846
+ # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
2847
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
2848
+ sig { returns(T.nilable(Float)) }
2849
+ attr_reader :speed
2850
+
2851
+ sig { params(speed: Float).void }
2852
+ attr_writer :speed
2853
+
2854
+ # Volume of the voice (Cartesia only). 0.5–2.0, default 1.0. Ignored for other
2855
+ # providers.
2856
+ sig { returns(T.nilable(Float)) }
2857
+ attr_reader :volume
2858
+
2859
+ sig { params(volume: Float).void }
2860
+ attr_writer :volume
2861
+
2862
+ sig do
2863
+ params(
2864
+ id: String,
2865
+ provider:
2866
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider::OrSymbol,
2867
+ model:
2868
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model::OrSymbol,
2869
+ speed: Float,
2870
+ volume: Float
2871
+ ).returns(T.attached_class)
2872
+ end
2873
+ def self.new(
2874
+ # The ID of the voice.
2875
+ id:,
2876
+ # The provider of the voice.
2877
+ provider:,
2878
+ # Cartesia TTS model (Cartesia only). Defaults to sonic-3 when omitted. Ignored
2879
+ # for other providers.
2880
+ model: nil,
2881
+ # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
2882
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
2883
+ speed: nil,
2884
+ # Volume of the voice (Cartesia only). 0.5–2.0, default 1.0. Ignored for other
2885
+ # providers.
2886
+ volume: nil
2887
+ )
2888
+ end
2889
+
2890
+ sig do
2891
+ override.returns(
2892
+ {
2893
+ id: String,
2894
+ provider:
2895
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider::TaggedSymbol,
2896
+ model:
2897
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model::TaggedSymbol,
2898
+ speed: Float,
2899
+ volume: Float
2900
+ }
2901
+ )
2902
+ end
2903
+ def to_hash
2904
+ end
2905
+
2906
+ # The provider of the voice.
2907
+ module Provider
2908
+ extend Revox::Internal::Type::Enum
2909
+
2910
+ TaggedSymbol =
2911
+ T.type_alias do
2912
+ T.all(
2913
+ Symbol,
2914
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider
2915
+ )
2916
+ end
2917
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2918
+
2919
+ CARTESIA =
2920
+ T.let(
2921
+ :cartesia,
2922
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider::TaggedSymbol
2923
+ )
2924
+ ELEVENLABS =
2925
+ T.let(
2926
+ :elevenlabs,
2927
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider::TaggedSymbol
2928
+ )
2929
+ GRADIUM =
2930
+ T.let(
2931
+ :gradium,
2932
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider::TaggedSymbol
2933
+ )
2934
+
2935
+ sig do
2936
+ override.returns(
2937
+ T::Array[
2938
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Provider::TaggedSymbol
2939
+ ]
2940
+ )
2941
+ end
2942
+ def self.values
2943
+ end
2944
+ end
2945
+
2946
+ # Cartesia TTS model (Cartesia only). Defaults to sonic-3 when omitted. Ignored
2947
+ # for other providers.
2948
+ module Model
2949
+ extend Revox::Internal::Type::Enum
2950
+
2951
+ TaggedSymbol =
2952
+ T.type_alias do
2953
+ T.all(
2954
+ Symbol,
2955
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model
2956
+ )
2957
+ end
2958
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2959
+
2960
+ SONIC_3 =
2961
+ T.let(
2962
+ :"sonic-3",
2963
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model::TaggedSymbol
2964
+ )
2965
+ SONIC_3_5 =
2966
+ T.let(
2967
+ :"sonic-3.5",
2968
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model::TaggedSymbol
2969
+ )
2970
+
2971
+ sig do
2972
+ override.returns(
2973
+ T::Array[
2974
+ Revox::Models::AssistantCloneResponse::Assistant::Voice::Model::TaggedSymbol
2975
+ ]
2976
+ )
2977
+ end
2978
+ def self.values
2979
+ end
2980
+ end
2981
+ end
2982
+
2983
+ class Zoho < Revox::Internal::Type::BaseModel
2984
+ OrHash =
2985
+ T.type_alias do
2986
+ T.any(
2987
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho,
2988
+ Revox::Internal::AnyHash
2989
+ )
2990
+ end
2991
+
2992
+ # The Nango connection ID linking the org's Zoho CRM account to Revox.
2993
+ sig { returns(String) }
2994
+ attr_accessor :connection_id
2995
+
2996
+ # Maps extracted call fields (structured_output / prompt variables) onto Zoho
2997
+ # field API names on the upserted record.
2998
+ sig do
2999
+ returns(
3000
+ T::Array[
3001
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::FieldMapping
3002
+ ]
3003
+ )
3004
+ end
3005
+ attr_accessor :field_mapping
3006
+
3007
+ # When true, also log the call as a record in Zoho's Calls module (related to the
3008
+ # upserted prospect via Who_Id).
3009
+ sig { returns(T::Boolean) }
3010
+ attr_accessor :log_call_activity
3011
+
3012
+ # Zoho module the prospect record is upserted into (e.g. 'Leads' or 'Contacts').
3013
+ sig { returns(String) }
3014
+ attr_accessor :module_
3015
+
3016
+ # Which call outcomes trigger the Zoho push (e.g. ['interested', 'none']). Use
3017
+ # 'none' to push when outcome is null.
3018
+ sig do
3019
+ returns(
3020
+ T::Array[
3021
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3022
+ ]
3023
+ )
3024
+ end
3025
+ attr_accessor :outcomes
3026
+
3027
+ # Optional Note body template. Supports {{summary}}, {{outcome}}, {{phone}},
3028
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{transcript}}, plus
3029
+ # prompt_variables and structured_output keys. When null/empty a default note
3030
+ # (outcome + summary + auto-listed extracted fields) is used.
3031
+ sig { returns(T.nilable(String)) }
3032
+ attr_accessor :template
3033
+
3034
+ sig do
3035
+ params(
3036
+ connection_id: String,
3037
+ field_mapping:
3038
+ T::Array[
3039
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::FieldMapping::OrHash
3040
+ ],
3041
+ log_call_activity: T::Boolean,
3042
+ module_: String,
3043
+ outcomes:
3044
+ T::Array[
3045
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::OrSymbol
3046
+ ],
3047
+ template: T.nilable(String)
3048
+ ).returns(T.attached_class)
3049
+ end
3050
+ def self.new(
3051
+ # The Nango connection ID linking the org's Zoho CRM account to Revox.
3052
+ connection_id:,
3053
+ # Maps extracted call fields (structured_output / prompt variables) onto Zoho
3054
+ # field API names on the upserted record.
3055
+ field_mapping:,
3056
+ # When true, also log the call as a record in Zoho's Calls module (related to the
3057
+ # upserted prospect via Who_Id).
3058
+ log_call_activity:,
3059
+ # Zoho module the prospect record is upserted into (e.g. 'Leads' or 'Contacts').
3060
+ module_:,
3061
+ # Which call outcomes trigger the Zoho push (e.g. ['interested', 'none']). Use
3062
+ # 'none' to push when outcome is null.
3063
+ outcomes:,
3064
+ # Optional Note body template. Supports {{summary}}, {{outcome}}, {{phone}},
3065
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{transcript}}, plus
3066
+ # prompt_variables and structured_output keys. When null/empty a default note
3067
+ # (outcome + summary + auto-listed extracted fields) is used.
3068
+ template: nil
3069
+ )
3070
+ end
3071
+
3072
+ sig do
3073
+ override.returns(
3074
+ {
3075
+ connection_id: String,
3076
+ field_mapping:
3077
+ T::Array[
3078
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::FieldMapping
3079
+ ],
3080
+ log_call_activity: T::Boolean,
3081
+ module_: String,
3082
+ outcomes:
3083
+ T::Array[
3084
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3085
+ ],
3086
+ template: T.nilable(String)
3087
+ }
3088
+ )
3089
+ end
3090
+ def to_hash
3091
+ end
3092
+
3093
+ class FieldMapping < Revox::Internal::Type::BaseModel
3094
+ OrHash =
3095
+ T.type_alias do
3096
+ T.any(
3097
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::FieldMapping,
3098
+ Revox::Internal::AnyHash
3099
+ )
3100
+ end
3101
+
3102
+ # Source key to read from the call: a structured_output field name, falling back
3103
+ # to a prompt variable of the same name.
3104
+ sig { returns(String) }
3105
+ attr_accessor :source
3106
+
3107
+ # Destination Zoho field API name on the upserted record (e.g. 'Email', 'Company',
3108
+ # or a custom 'Budget\_\_c').
3109
+ sig { returns(String) }
3110
+ attr_accessor :zoho_field
3111
+
3112
+ sig do
3113
+ params(source: String, zoho_field: String).returns(
3114
+ T.attached_class
3115
+ )
3116
+ end
3117
+ def self.new(
3118
+ # Source key to read from the call: a structured_output field name, falling back
3119
+ # to a prompt variable of the same name.
3120
+ source:,
3121
+ # Destination Zoho field API name on the upserted record (e.g. 'Email', 'Company',
3122
+ # or a custom 'Budget\_\_c').
3123
+ zoho_field:
3124
+ )
3125
+ end
3126
+
3127
+ sig { override.returns({ source: String, zoho_field: String }) }
3128
+ def to_hash
3129
+ end
3130
+ end
3131
+
3132
+ module Outcome
3133
+ extend Revox::Internal::Type::Enum
3134
+
3135
+ TaggedSymbol =
3136
+ T.type_alias do
3137
+ T.all(
3138
+ Symbol,
3139
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome
3140
+ )
3141
+ end
3142
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
3143
+
3144
+ NOT_INTERESTED =
3145
+ T.let(
3146
+ :not_interested,
3147
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3148
+ )
3149
+ INTERESTED =
3150
+ T.let(
3151
+ :interested,
3152
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3153
+ )
3154
+ COMPLETED =
3155
+ T.let(
3156
+ :completed,
3157
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3158
+ )
3159
+ REQUESTED_CALLBACK_LATER =
3160
+ T.let(
3161
+ :requested_callback_later,
3162
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3163
+ )
3164
+ NONE =
3165
+ T.let(
3166
+ :none,
3167
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3168
+ )
3169
+
3170
+ sig do
3171
+ override.returns(
3172
+ T::Array[
3173
+ Revox::Models::AssistantCloneResponse::Assistant::Zoho::Outcome::TaggedSymbol
3174
+ ]
3175
+ )
3176
+ end
3177
+ def self.values
3178
+ end
3179
+ end
3180
+ end
3181
+
3182
+ class CreatedBy < Revox::Internal::Type::BaseModel
3183
+ OrHash =
3184
+ T.type_alias do
3185
+ T.any(
3186
+ Revox::Models::AssistantCloneResponse::Assistant::CreatedBy,
3187
+ Revox::Internal::AnyHash
3188
+ )
3189
+ end
3190
+
3191
+ # The database user id of the creator.
3192
+ sig { returns(String) }
3193
+ attr_accessor :id
3194
+
3195
+ sig { returns(String) }
3196
+ attr_accessor :email
3197
+
3198
+ sig { returns(T.nilable(String)) }
3199
+ attr_accessor :first_name
3200
+
3201
+ sig { returns(T.nilable(String)) }
3202
+ attr_accessor :last_name
3203
+
3204
+ # The user who created the assistant.
3205
+ sig do
3206
+ params(
3207
+ id: String,
3208
+ email: String,
3209
+ first_name: T.nilable(String),
3210
+ last_name: T.nilable(String)
3211
+ ).returns(T.attached_class)
3212
+ end
3213
+ def self.new(
3214
+ # The database user id of the creator.
3215
+ id:,
3216
+ email:,
3217
+ first_name:,
3218
+ last_name:
3219
+ )
3220
+ end
3221
+
3222
+ sig do
3223
+ override.returns(
3224
+ {
3225
+ id: String,
3226
+ email: String,
3227
+ first_name: T.nilable(String),
3228
+ last_name: T.nilable(String)
3229
+ }
3230
+ )
3231
+ end
3232
+ def to_hash
3233
+ end
3234
+ end
3235
+
3236
+ class FaqItem < Revox::Internal::Type::BaseModel
3237
+ OrHash =
3238
+ T.type_alias do
3239
+ T.any(
3240
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem,
3241
+ Revox::Internal::AnyHash
3242
+ )
3243
+ end
3244
+
3245
+ sig { returns(String) }
3246
+ attr_accessor :answer
3247
+
3248
+ sig { returns(String) }
3249
+ attr_accessor :question
3250
+
3251
+ sig { returns(T.nilable(String)) }
3252
+ attr_reader :id
3253
+
3254
+ sig { params(id: String).void }
3255
+ attr_writer :id
3256
+
3257
+ sig { returns(T.nilable(T::Boolean)) }
3258
+ attr_reader :needs_human_answer
3259
+
3260
+ sig { params(needs_human_answer: T::Boolean).void }
3261
+ attr_writer :needs_human_answer
3262
+
3263
+ sig do
3264
+ returns(
3265
+ T.nilable(
3266
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source::TaggedSymbol
3267
+ )
3268
+ )
3269
+ end
3270
+ attr_reader :source
3271
+
3272
+ sig do
3273
+ params(
3274
+ source:
3275
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source::OrSymbol
3276
+ ).void
3277
+ end
3278
+ attr_writer :source
3279
+
3280
+ sig do
3281
+ params(
3282
+ answer: String,
3283
+ question: String,
3284
+ id: String,
3285
+ needs_human_answer: T::Boolean,
3286
+ source:
3287
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source::OrSymbol
3288
+ ).returns(T.attached_class)
3289
+ end
3290
+ def self.new(
3291
+ answer:,
3292
+ question:,
3293
+ id: nil,
3294
+ needs_human_answer: nil,
3295
+ source: nil
3296
+ )
3297
+ end
3298
+
3299
+ sig do
3300
+ override.returns(
3301
+ {
3302
+ answer: String,
3303
+ question: String,
3304
+ id: String,
3305
+ needs_human_answer: T::Boolean,
3306
+ source:
3307
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source::TaggedSymbol
3308
+ }
3309
+ )
3310
+ end
3311
+ def to_hash
3312
+ end
3313
+
3314
+ module Source
3315
+ extend Revox::Internal::Type::Enum
3316
+
3317
+ TaggedSymbol =
3318
+ T.type_alias do
3319
+ T.all(
3320
+ Symbol,
3321
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source
3322
+ )
3323
+ end
3324
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
3325
+
3326
+ HUMAN =
3327
+ T.let(
3328
+ :human,
3329
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source::TaggedSymbol
3330
+ )
3331
+ AI =
3332
+ T.let(
3333
+ :ai,
3334
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source::TaggedSymbol
3335
+ )
3336
+
3337
+ sig do
3338
+ override.returns(
3339
+ T::Array[
3340
+ Revox::Models::AssistantCloneResponse::Assistant::FaqItem::Source::TaggedSymbol
3341
+ ]
3342
+ )
3343
+ end
3344
+ def self.values
3345
+ end
3346
+ end
3347
+ end
3348
+ end
3349
+ end
3350
+ end
3351
+ end