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