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