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