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