revox 0.1.0 → 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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +71 -0
  3. data/README.md +39 -14
  4. data/lib/revox/client.rb +15 -1
  5. data/lib/revox/internal/transport/base_client.rb +5 -0
  6. data/lib/revox/internal/util.rb +22 -7
  7. data/lib/revox/models/assistant_create_params.rb +1038 -13
  8. data/lib/revox/models/assistant_create_response.rb +1071 -11
  9. data/lib/revox/models/assistant_list_response.rb +1070 -11
  10. data/lib/revox/models/assistant_retrieve_response.rb +1066 -11
  11. data/lib/revox/models/assistant_update_params.rb +1038 -13
  12. data/lib/revox/models/assistant_update_response.rb +1097 -12
  13. data/lib/revox/models/call_create_params.rb +1065 -13
  14. data/lib/revox/models/call_create_response.rb +1813 -101
  15. data/lib/revox/models/call_retrieve_response.rb +1815 -101
  16. data/lib/revox/models/campaign_create_params.rb +67 -2
  17. data/lib/revox/models/campaign_create_response.rb +1314 -59
  18. data/lib/revox/models/campaign_get_rows_params.rb +1 -46
  19. data/lib/revox/models/campaign_get_rows_response.rb +1837 -129
  20. data/lib/revox/models/campaign_list_response.rb +1312 -59
  21. data/lib/revox/models/campaign_retrieve_response.rb +1312 -56
  22. data/lib/revox/models/users/me_retrieve_response.rb +13 -1
  23. data/lib/revox/models/users/me_update_response.rb +13 -1
  24. data/lib/revox/models/voice_list_response.rb +55 -1
  25. data/lib/revox/models/voice_preview_params.rb +49 -1
  26. data/lib/revox/models.rb +0 -2
  27. data/lib/revox/resources/assistants.rb +116 -8
  28. data/lib/revox/resources/call.rb +0 -29
  29. data/lib/revox/resources/campaigns.rb +12 -17
  30. data/lib/revox/resources/voices.rb +16 -10
  31. data/lib/revox/version.rb +1 -1
  32. data/lib/revox.rb +0 -2
  33. data/rbi/revox/internal/util.rbi +8 -0
  34. data/rbi/revox/models/assistant_create_params.rbi +2138 -103
  35. data/rbi/revox/models/assistant_create_response.rbi +2454 -199
  36. data/rbi/revox/models/assistant_list_response.rbi +2448 -195
  37. data/rbi/revox/models/assistant_retrieve_response.rbi +2401 -210
  38. data/rbi/revox/models/assistant_update_params.rbi +2138 -103
  39. data/rbi/revox/models/assistant_update_response.rbi +2504 -198
  40. data/rbi/revox/models/call_create_params.rbi +2382 -225
  41. data/rbi/revox/models/call_create_response.rbi +4104 -384
  42. data/rbi/revox/models/call_retrieve_response.rbi +4104 -382
  43. data/rbi/revox/models/campaign_create_params.rbi +136 -0
  44. data/rbi/revox/models/campaign_create_response.rbi +2911 -231
  45. data/rbi/revox/models/campaign_get_rows_params.rbi +2 -82
  46. data/rbi/revox/models/campaign_get_rows_response.rbi +4135 -410
  47. data/rbi/revox/models/campaign_list_response.rbi +2904 -230
  48. data/rbi/revox/models/campaign_retrieve_response.rbi +2911 -231
  49. data/rbi/revox/models/users/me_retrieve_response.rbi +13 -3
  50. data/rbi/revox/models/users/me_update_response.rbi +13 -3
  51. data/rbi/revox/models/voice_list_response.rbi +105 -3
  52. data/rbi/revox/models/voice_preview_params.rbi +69 -0
  53. data/rbi/revox/models.rbi +0 -2
  54. data/rbi/revox/resources/assistants.rbi +284 -8
  55. data/rbi/revox/resources/call.rbi +0 -21
  56. data/rbi/revox/resources/campaigns.rbi +12 -19
  57. data/rbi/revox/resources/voices.rbi +17 -9
  58. data/sig/revox/internal/util.rbs +4 -0
  59. data/sig/revox/models/assistant_create_params.rbs +844 -11
  60. data/sig/revox/models/assistant_create_response.rbs +860 -3
  61. data/sig/revox/models/assistant_list_response.rbs +860 -3
  62. data/sig/revox/models/assistant_retrieve_response.rbs +859 -3
  63. data/sig/revox/models/assistant_update_params.rbs +844 -11
  64. data/sig/revox/models/assistant_update_response.rbs +886 -6
  65. data/sig/revox/models/call_create_params.rbs +847 -13
  66. data/sig/revox/models/call_create_response.rbs +1514 -34
  67. data/sig/revox/models/call_retrieve_response.rbs +1514 -34
  68. data/sig/revox/models/campaign_create_params.rbs +54 -0
  69. data/sig/revox/models/campaign_create_response.rbs +1034 -6
  70. data/sig/revox/models/campaign_get_rows_params.rbs +2 -64
  71. data/sig/revox/models/campaign_get_rows_response.rbs +1522 -54
  72. data/sig/revox/models/campaign_list_response.rbs +1034 -6
  73. data/sig/revox/models/campaign_retrieve_response.rbs +1034 -6
  74. data/sig/revox/models/users/me_retrieve_response.rbs +8 -3
  75. data/sig/revox/models/users/me_update_response.rbs +8 -3
  76. data/sig/revox/models/voice_list_response.rbs +45 -3
  77. data/sig/revox/models/voice_preview_params.rbs +42 -1
  78. data/sig/revox/models.rbs +0 -2
  79. data/sig/revox/resources/assistants.rbs +56 -2
  80. data/sig/revox/resources/call.rbs +0 -7
  81. data/sig/revox/resources/campaigns.rbs +2 -5
  82. data/sig/revox/resources/voices.rbs +4 -0
  83. metadata +2 -8
  84. data/lib/revox/models/call_list_params.rb +0 -52
  85. data/lib/revox/models/call_list_response.rb +0 -259
  86. data/rbi/revox/models/call_list_params.rbi +0 -94
  87. data/rbi/revox/models/call_list_response.rbi +0 -563
  88. data/sig/revox/models/call_list_params.rbs +0 -63
  89. data/sig/revox/models/call_list_response.rbs +0 -226
@@ -14,8 +14,26 @@ module Revox
14
14
  sig { returns(String) }
15
15
  attr_accessor :id
16
16
 
17
- # The background sound to play during the call. Useful to give the impression that
18
- # your AI agent is in an office, in the street, or anywhere else you want.
17
+ # Which call outcomes trigger the after-call SMS. When empty or null, no
18
+ # after-call SMS is sent. E.g. ["interested", "completed", "none"]. Use "none"
19
+ # when outcome is null.
20
+ sig do
21
+ returns(
22
+ T.nilable(
23
+ T::Array[
24
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::OrSymbol
25
+ ]
26
+ )
27
+ )
28
+ end
29
+ attr_accessor :after_call_sms_outcomes
30
+
31
+ # Prompt / instructions for the after-call SMS. Supports {{variable}}
32
+ # placeholders. When null, no after-call SMS is sent.
33
+ sig { returns(T.nilable(String)) }
34
+ attr_accessor :after_call_sms_prompt
35
+
36
+ # Ambient background sound to play during the call. null/omitted disables it.
19
37
  sig do
20
38
  returns(
21
39
  T.nilable(Revox::AssistantUpdateParams::BackgroundSound::OrSymbol)
@@ -23,11 +41,20 @@ module Revox
23
41
  end
24
42
  attr_accessor :background_sound
25
43
 
44
+ # Volume of the ambient background sound (0 = silent, 1 = max).
45
+ sig { returns(T.nilable(Float)) }
46
+ attr_reader :background_sound_volume
47
+
48
+ sig { params(background_sound_volume: Float).void }
49
+ attr_writer :background_sound_volume
50
+
26
51
  sig { returns(T.nilable(Revox::AssistantUpdateParams::Calendly)) }
27
52
  attr_reader :calendly
28
53
 
29
54
  sig do
30
- params(calendly: Revox::AssistantUpdateParams::Calendly::OrHash).void
55
+ params(
56
+ calendly: T.nilable(Revox::AssistantUpdateParams::Calendly::OrHash)
57
+ ).void
31
58
  end
32
59
  attr_writer :calendly
33
60
 
@@ -44,6 +71,56 @@ module Revox
44
71
  end
45
72
  attr_writer :call_retry_config
46
73
 
74
+ # Optional Cartesia pronunciation dictionary ID to use for this assistant's calls.
75
+ # Set null to unlink it.
76
+ sig { returns(T.nilable(String)) }
77
+ attr_accessor :cartesia_dictionary_pronunciation_id
78
+
79
+ # Custom API tools the assistant can call during conversations. Each tool defines
80
+ # an HTTP endpoint with variable substitution.
81
+ sig do
82
+ returns(T.nilable(T::Array[Revox::AssistantUpdateParams::CustomTool]))
83
+ end
84
+ attr_accessor :custom_tools
85
+
86
+ # Email address(es) to receive notifications when a call ends with a matching
87
+ # outcome. Accepts a single email or a comma-separated list (e.g. "alice@x.com,
88
+ # bob@y.com").
89
+ sig { returns(T.nilable(String)) }
90
+ attr_accessor :email_notification_address
91
+
92
+ # The language used for the notification email content. One of "en" or "fr".
93
+ # Defaults to "en".
94
+ sig do
95
+ returns(
96
+ T.nilable(
97
+ Revox::AssistantUpdateParams::EmailNotificationLanguage::OrSymbol
98
+ )
99
+ )
100
+ end
101
+ attr_reader :email_notification_language
102
+
103
+ sig do
104
+ params(
105
+ email_notification_language:
106
+ Revox::AssistantUpdateParams::EmailNotificationLanguage::OrSymbol
107
+ ).void
108
+ end
109
+ attr_writer :email_notification_language
110
+
111
+ # Which call outcomes trigger an email notification. E.g. ["interested",
112
+ # "completed", "none"]. Use "none" when outcome is null.
113
+ sig do
114
+ returns(
115
+ T.nilable(
116
+ T::Array[
117
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::OrSymbol
118
+ ]
119
+ )
120
+ )
121
+ end
122
+ attr_accessor :email_notification_outcomes
123
+
47
124
  # Optional message to say when the agent decides to end the call.
48
125
  sig { returns(T.nilable(String)) }
49
126
  attr_reader :end_of_call_sentence
@@ -98,6 +175,21 @@ module Revox
98
175
  end
99
176
  attr_writer :first_sentence_mode
100
177
 
178
+ # Override the default outbound phone number for calls placed with this assistant.
179
+ # Must be a phone number owned by the organization in E.164 format (e.g.
180
+ # +1234567890). When null, the organization's default phone number is used.
181
+ sig { returns(T.nilable(String)) }
182
+ attr_accessor :from_phone_number
183
+
184
+ # When transfer_phone_number is set: "warm" (AI bridges) or "cold" (SIP REFER;
185
+ # trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
186
+ sig do
187
+ returns(
188
+ T.nilable(Revox::AssistantUpdateParams::HumanTransferMode::OrSymbol)
189
+ )
190
+ end
191
+ attr_accessor :human_transfer_mode
192
+
101
193
  # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
102
194
  # skip turns to navigate phone menus.
103
195
  sig { returns(T.nilable(T::Boolean)) }
@@ -111,7 +203,9 @@ module Revox
111
203
  T.nilable(
112
204
  T.any(
113
205
  Revox::AssistantUpdateParams::LlmModel::UnionMember0,
114
- Revox::AssistantUpdateParams::LlmModel::UnionMember1
206
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1,
207
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2,
208
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3
115
209
  )
116
210
  )
117
211
  )
@@ -123,12 +217,19 @@ module Revox
123
217
  llm_model:
124
218
  T.any(
125
219
  Revox::AssistantUpdateParams::LlmModel::UnionMember0::OrHash,
126
- Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash
220
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash,
221
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2::OrHash,
222
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::OrHash
127
223
  )
128
224
  ).void
129
225
  end
130
226
  attr_writer :llm_model
131
227
 
228
+ # Public URL of the brand logo shown on the assistant's demo page. Upload a new
229
+ # logo via POST /assistants/:id/logo. Set explicitly to null to clear it.
230
+ sig { returns(T.nilable(String)) }
231
+ attr_accessor :logo_url
232
+
132
233
  # The maximum duration of the call in seconds. This is the maximum time the call
133
234
  # will be allowed to run.
134
235
  sig { returns(T.nilable(Float)) }
@@ -137,12 +238,29 @@ module Revox
137
238
  sig { params(max_call_duration_secs: Float).void }
138
239
  attr_writer :max_call_duration_secs
139
240
 
241
+ # Optional message the agent will say, without being interruptible, when the call
242
+ # reaches its max duration. Kept short so it fits inside the farewell buffer. If
243
+ # not set, the call ends silently.
244
+ sig { returns(T.nilable(String)) }
245
+ attr_accessor :max_duration_end_message
246
+
140
247
  sig { returns(T.nilable(String)) }
141
248
  attr_reader :name
142
249
 
143
250
  sig { params(name: String).void }
144
251
  attr_writer :name
145
252
 
253
+ # Canvas position of this assistant's node in its multi-step flow editor.
254
+ sig { returns(T.nilable(Revox::AssistantUpdateParams::Position)) }
255
+ attr_reader :position
256
+
257
+ sig do
258
+ params(
259
+ position: T.nilable(Revox::AssistantUpdateParams::Position::OrHash)
260
+ ).void
261
+ end
262
+ attr_writer :position
263
+
146
264
  # The prompt to use for the call. This will be given to the LLM (gpt-4.1)
147
265
  sig { returns(T.nilable(String)) }
148
266
  attr_reader :prompt
@@ -150,6 +268,46 @@ module Revox
150
268
  sig { params(prompt: String).void }
151
269
  attr_writer :prompt
152
270
 
271
+ # Visual prompt constructor data (nodes, edges, positions). Used by the UI to
272
+ # re-open the visual editor. Does not affect call behavior — the flattened prompt
273
+ # field is what the LLM receives.
274
+ sig { returns(T.nilable(Revox::AssistantUpdateParams::PromptFlow)) }
275
+ attr_reader :prompt_flow
276
+
277
+ sig do
278
+ params(
279
+ prompt_flow:
280
+ T.nilable(Revox::AssistantUpdateParams::PromptFlow::OrHash)
281
+ ).void
282
+ end
283
+ attr_writer :prompt_flow
284
+
285
+ # Slack notification config. When set, posts a message to the chosen channel after
286
+ # a call ends with one of the configured outcomes.
287
+ sig { returns(T.nilable(Revox::AssistantUpdateParams::Slack)) }
288
+ attr_reader :slack
289
+
290
+ sig do
291
+ params(
292
+ slack: T.nilable(Revox::AssistantUpdateParams::Slack::OrHash)
293
+ ).void
294
+ end
295
+ attr_writer :slack
296
+
297
+ # Enable SMS tool during calls. When enabled, the agent can send SMS messages to
298
+ # the user on the call.
299
+ sig { returns(T.nilable(T::Boolean)) }
300
+ attr_reader :sms_enabled
301
+
302
+ sig { params(sms_enabled: T::Boolean).void }
303
+ attr_writer :sms_enabled
304
+
305
+ # Hardcoded SMS template to send during calls. When set, this exact text is sent
306
+ # instead of letting the agent generate the message. Supports {{variable}}
307
+ # placeholders.
308
+ sig { returns(T.nilable(String)) }
309
+ attr_accessor :sms_template
310
+
153
311
  # The structured output config to use for the call. This is used to extract the
154
312
  # data from the call (like email, name, company name, etc.).
155
313
  sig do
@@ -171,11 +329,77 @@ module Revox
171
329
  end
172
330
  attr_writer :structured_output_config
173
331
 
332
+ # Custom prompt for structured data extraction. If not provided, a default prompt
333
+ # is used. Available variables: {{transcript}}, {{call_direction}},
334
+ # {{user_phone_number}}, {{agent_phone_number}}.
335
+ sig { returns(T.nilable(String)) }
336
+ attr_accessor :structured_output_prompt
337
+
338
+ # Assistant-level speech-to-text context: structured `general` key/value pairs
339
+ # plus a list of domain `terms`. Prompt-derived context is merged in without
340
+ # replacing existing entries.
341
+ sig { returns(T.nilable(Revox::AssistantUpdateParams::SttContext)) }
342
+ attr_reader :stt_context
343
+
344
+ sig do
345
+ params(
346
+ stt_context:
347
+ T.nilable(Revox::AssistantUpdateParams::SttContext::OrHash)
348
+ ).void
349
+ end
350
+ attr_writer :stt_context
351
+
352
+ # Transcriber (speech-to-text) model. Defaults to the newest Soniox realtime model
353
+ # when omitted.
354
+ sig do
355
+ returns(T.nilable(Revox::AssistantUpdateParams::SttModel::OrSymbol))
356
+ end
357
+ attr_reader :stt_model
358
+
359
+ sig do
360
+ params(stt_model: Revox::AssistantUpdateParams::SttModel::OrSymbol).void
361
+ end
362
+ attr_writer :stt_model
363
+
364
+ # Audio clip to play while the agent is processing a response. One of the built-in
365
+ # LiveKit audio clips; null/omitted disables it.
366
+ sig do
367
+ returns(
368
+ T.nilable(Revox::AssistantUpdateParams::ThinkingSound::OrSymbol)
369
+ )
370
+ end
371
+ attr_accessor :thinking_sound
372
+
373
+ # Probability [0..1] that the thinking sound plays on any given turn; otherwise
374
+ # the agent is silent while thinking.
375
+ sig { returns(T.nilable(Float)) }
376
+ attr_reader :thinking_sound_probability
377
+
378
+ sig { params(thinking_sound_probability: Float).void }
379
+ attr_writer :thinking_sound_probability
380
+
381
+ # Volume of the thinking sound (0 = silent, 1 = max).
382
+ sig { returns(T.nilable(Float)) }
383
+ attr_reader :thinking_sound_volume
384
+
385
+ sig { params(thinking_sound_volume: Float).void }
386
+ attr_writer :thinking_sound_volume
387
+
174
388
  # Phone number to transfer calls to when users request to speak to a human agent
175
389
  # in E.164 format (e.g. +1234567890).
176
390
  sig { returns(T.nilable(String)) }
177
391
  attr_accessor :transfer_phone_number
178
392
 
393
+ # Assistant kind. 'standalone' (default) is a normal assistant, 'multi-step'
394
+ # orchestrates a flow of sub-assistants, 'sub-assistant' is a step inside a
395
+ # multi-step flow (hidden from the assistants list). Flow transitions are managed
396
+ # via the /assistants/:id/edges endpoints, not on the assistant itself.
397
+ sig { returns(T.nilable(Revox::AssistantUpdateParams::Type::OrSymbol)) }
398
+ attr_reader :type
399
+
400
+ sig { params(type: Revox::AssistantUpdateParams::Type::OrSymbol).void }
401
+ attr_writer :type
402
+
179
403
  # The voice to use for the call. You can get the list of voices using the /voices
180
404
  # endpoint
181
405
  sig { returns(T.nilable(Revox::AssistantUpdateParams::Voice)) }
@@ -189,6 +413,17 @@ module Revox
189
413
  sig { returns(T.nilable(String)) }
190
414
  attr_accessor :voicemail_message
191
415
 
416
+ # SMS message to send when the call reaches voicemail. Supports {{variable}}
417
+ # placeholders. When null, no SMS is sent on voicemail.
418
+ sig { returns(T.nilable(String)) }
419
+ attr_accessor :voicemail_sms_prompt
420
+
421
+ # When using warm transfer: extra instructions for the supervisor handoff summary.
422
+ # If null or empty, the API uses the product default briefing when the call is
423
+ # loaded for the agent.
424
+ sig { returns(T.nilable(String)) }
425
+ attr_accessor :warm_transfer_summary_instructions
426
+
192
427
  # The webhook URL to call when the call is completed.
193
428
  sig { returns(T.nilable(String)) }
194
429
  attr_reader :webhook_url
@@ -196,49 +431,133 @@ module Revox
196
431
  sig { params(webhook_url: String).void }
197
432
  attr_writer :webhook_url
198
433
 
434
+ # Zoho CRM integration config. When set, upserts the prospect (keyed on phone)
435
+ # into the chosen module and attaches a Note with the call summary after a call
436
+ # ends with one of the configured outcomes.
437
+ sig { returns(T.nilable(Revox::AssistantUpdateParams::Zoho)) }
438
+ attr_reader :zoho
439
+
440
+ sig do
441
+ params(zoho: T.nilable(Revox::AssistantUpdateParams::Zoho::OrHash)).void
442
+ end
443
+ attr_writer :zoho
444
+
199
445
  sig do
200
446
  params(
201
447
  id: String,
448
+ after_call_sms_outcomes:
449
+ T.nilable(
450
+ T::Array[
451
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::OrSymbol
452
+ ]
453
+ ),
454
+ after_call_sms_prompt: T.nilable(String),
202
455
  background_sound:
203
456
  T.nilable(Revox::AssistantUpdateParams::BackgroundSound::OrSymbol),
204
- calendly: Revox::AssistantUpdateParams::Calendly::OrHash,
457
+ background_sound_volume: Float,
458
+ calendly: T.nilable(Revox::AssistantUpdateParams::Calendly::OrHash),
205
459
  call_retry_config:
206
460
  Revox::AssistantUpdateParams::CallRetryConfig::OrHash,
461
+ cartesia_dictionary_pronunciation_id: T.nilable(String),
462
+ custom_tools:
463
+ T.nilable(
464
+ T::Array[Revox::AssistantUpdateParams::CustomTool::OrHash]
465
+ ),
466
+ email_notification_address: T.nilable(String),
467
+ email_notification_language:
468
+ Revox::AssistantUpdateParams::EmailNotificationLanguage::OrSymbol,
469
+ email_notification_outcomes:
470
+ T.nilable(
471
+ T::Array[
472
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::OrSymbol
473
+ ]
474
+ ),
207
475
  end_of_call_sentence: String,
208
476
  faq_items: T::Array[Revox::AssistantUpdateParams::FaqItem::OrHash],
209
477
  first_sentence: String,
210
478
  first_sentence_delay_ms: Integer,
211
479
  first_sentence_mode:
212
480
  Revox::AssistantUpdateParams::FirstSentenceMode::OrSymbol,
481
+ from_phone_number: T.nilable(String),
482
+ human_transfer_mode:
483
+ T.nilable(
484
+ Revox::AssistantUpdateParams::HumanTransferMode::OrSymbol
485
+ ),
213
486
  ivr_navigation_enabled: T::Boolean,
214
487
  llm_model:
215
488
  T.any(
216
489
  Revox::AssistantUpdateParams::LlmModel::UnionMember0::OrHash,
217
- Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash
490
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash,
491
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2::OrHash,
492
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::OrHash
218
493
  ),
494
+ logo_url: T.nilable(String),
219
495
  max_call_duration_secs: Float,
496
+ max_duration_end_message: T.nilable(String),
220
497
  name: String,
498
+ position: T.nilable(Revox::AssistantUpdateParams::Position::OrHash),
221
499
  prompt: String,
500
+ prompt_flow:
501
+ T.nilable(Revox::AssistantUpdateParams::PromptFlow::OrHash),
502
+ slack: T.nilable(Revox::AssistantUpdateParams::Slack::OrHash),
503
+ sms_enabled: T::Boolean,
504
+ sms_template: T.nilable(String),
222
505
  structured_output_config:
223
506
  T::Array[
224
507
  Revox::AssistantUpdateParams::StructuredOutputConfig::OrHash
225
508
  ],
509
+ structured_output_prompt: T.nilable(String),
510
+ stt_context:
511
+ T.nilable(Revox::AssistantUpdateParams::SttContext::OrHash),
512
+ stt_model: Revox::AssistantUpdateParams::SttModel::OrSymbol,
513
+ thinking_sound:
514
+ T.nilable(Revox::AssistantUpdateParams::ThinkingSound::OrSymbol),
515
+ thinking_sound_probability: Float,
516
+ thinking_sound_volume: Float,
226
517
  transfer_phone_number: T.nilable(String),
518
+ type: Revox::AssistantUpdateParams::Type::OrSymbol,
227
519
  voice: Revox::AssistantUpdateParams::Voice::OrHash,
228
520
  voicemail_message: T.nilable(String),
521
+ voicemail_sms_prompt: T.nilable(String),
522
+ warm_transfer_summary_instructions: T.nilable(String),
229
523
  webhook_url: String,
524
+ zoho: T.nilable(Revox::AssistantUpdateParams::Zoho::OrHash),
230
525
  request_options: Revox::RequestOptions::OrHash
231
526
  ).returns(T.attached_class)
232
527
  end
233
528
  def self.new(
234
529
  id:,
235
- # The background sound to play during the call. Useful to give the impression that
236
- # your AI agent is in an office, in the street, or anywhere else you want.
530
+ # Which call outcomes trigger the after-call SMS. When empty or null, no
531
+ # after-call SMS is sent. E.g. ["interested", "completed", "none"]. Use "none"
532
+ # when outcome is null.
533
+ after_call_sms_outcomes: nil,
534
+ # Prompt / instructions for the after-call SMS. Supports {{variable}}
535
+ # placeholders. When null, no after-call SMS is sent.
536
+ after_call_sms_prompt: nil,
537
+ # Ambient background sound to play during the call. null/omitted disables it.
237
538
  background_sound: nil,
539
+ # Volume of the ambient background sound (0 = silent, 1 = max).
540
+ background_sound_volume: nil,
238
541
  calendly: nil,
239
542
  # Configuration for call retry behavior including time windows, delays, and max
240
543
  # iterations. If not provided, defaults will be used.
241
544
  call_retry_config: nil,
545
+ # Optional Cartesia pronunciation dictionary ID to use for this assistant's calls.
546
+ # Set null to unlink it.
547
+ cartesia_dictionary_pronunciation_id: nil,
548
+ # Custom API tools the assistant can call during conversations. Each tool defines
549
+ # an HTTP endpoint with variable substitution.
550
+ custom_tools: nil,
551
+ # Email address(es) to receive notifications when a call ends with a matching
552
+ # outcome. Accepts a single email or a comma-separated list (e.g. "alice@x.com,
553
+ # bob@y.com").
554
+ email_notification_address: nil,
555
+ # The language used for the notification email content. One of "en" or "fr".
556
+ # Defaults to "en".
557
+ email_notification_language: nil,
558
+ # Which call outcomes trigger an email notification. E.g. ["interested",
559
+ # "completed", "none"]. Use "none" when outcome is null.
560
+ email_notification_outcomes: nil,
242
561
  # Optional message to say when the agent decides to end the call.
243
562
  end_of_call_sentence: nil,
244
563
  # FAQ items to associate with this assistant. When provided, replaces all existing
@@ -253,30 +572,95 @@ module Revox
253
572
  # first_sentence will be spoken exactly as provided. "none" means the agent will
254
573
  # not speak first and will wait for the user.
255
574
  first_sentence_mode: nil,
575
+ # Override the default outbound phone number for calls placed with this assistant.
576
+ # Must be a phone number owned by the organization in E.164 format (e.g.
577
+ # +1234567890). When null, the organization's default phone number is used.
578
+ from_phone_number: nil,
579
+ # When transfer_phone_number is set: "warm" (AI bridges) or "cold" (SIP REFER;
580
+ # trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
581
+ human_transfer_mode: nil,
256
582
  # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
257
583
  # skip turns to navigate phone menus.
258
584
  ivr_navigation_enabled: nil,
259
585
  llm_model: nil,
586
+ # Public URL of the brand logo shown on the assistant's demo page. Upload a new
587
+ # logo via POST /assistants/:id/logo. Set explicitly to null to clear it.
588
+ logo_url: nil,
260
589
  # The maximum duration of the call in seconds. This is the maximum time the call
261
590
  # will be allowed to run.
262
591
  max_call_duration_secs: nil,
592
+ # Optional message the agent will say, without being interruptible, when the call
593
+ # reaches its max duration. Kept short so it fits inside the farewell buffer. If
594
+ # not set, the call ends silently.
595
+ max_duration_end_message: nil,
263
596
  name: nil,
597
+ # Canvas position of this assistant's node in its multi-step flow editor.
598
+ position: nil,
264
599
  # The prompt to use for the call. This will be given to the LLM (gpt-4.1)
265
600
  prompt: nil,
601
+ # Visual prompt constructor data (nodes, edges, positions). Used by the UI to
602
+ # re-open the visual editor. Does not affect call behavior — the flattened prompt
603
+ # field is what the LLM receives.
604
+ prompt_flow: nil,
605
+ # Slack notification config. When set, posts a message to the chosen channel after
606
+ # a call ends with one of the configured outcomes.
607
+ slack: nil,
608
+ # Enable SMS tool during calls. When enabled, the agent can send SMS messages to
609
+ # the user on the call.
610
+ sms_enabled: nil,
611
+ # Hardcoded SMS template to send during calls. When set, this exact text is sent
612
+ # instead of letting the agent generate the message. Supports {{variable}}
613
+ # placeholders.
614
+ sms_template: nil,
266
615
  # The structured output config to use for the call. This is used to extract the
267
616
  # data from the call (like email, name, company name, etc.).
268
617
  structured_output_config: nil,
618
+ # Custom prompt for structured data extraction. If not provided, a default prompt
619
+ # is used. Available variables: {{transcript}}, {{call_direction}},
620
+ # {{user_phone_number}}, {{agent_phone_number}}.
621
+ structured_output_prompt: nil,
622
+ # Assistant-level speech-to-text context: structured `general` key/value pairs
623
+ # plus a list of domain `terms`. Prompt-derived context is merged in without
624
+ # replacing existing entries.
625
+ stt_context: nil,
626
+ # Transcriber (speech-to-text) model. Defaults to the newest Soniox realtime model
627
+ # when omitted.
628
+ stt_model: nil,
629
+ # Audio clip to play while the agent is processing a response. One of the built-in
630
+ # LiveKit audio clips; null/omitted disables it.
631
+ thinking_sound: nil,
632
+ # Probability [0..1] that the thinking sound plays on any given turn; otherwise
633
+ # the agent is silent while thinking.
634
+ thinking_sound_probability: nil,
635
+ # Volume of the thinking sound (0 = silent, 1 = max).
636
+ thinking_sound_volume: nil,
269
637
  # Phone number to transfer calls to when users request to speak to a human agent
270
638
  # in E.164 format (e.g. +1234567890).
271
639
  transfer_phone_number: nil,
640
+ # Assistant kind. 'standalone' (default) is a normal assistant, 'multi-step'
641
+ # orchestrates a flow of sub-assistants, 'sub-assistant' is a step inside a
642
+ # multi-step flow (hidden from the assistants list). Flow transitions are managed
643
+ # via the /assistants/:id/edges endpoints, not on the assistant itself.
644
+ type: nil,
272
645
  # The voice to use for the call. You can get the list of voices using the /voices
273
646
  # endpoint
274
647
  voice: nil,
275
648
  # If set, when voicemail is detected the agent will speak this message then hang
276
649
  # up; if null, hang up immediately.
277
650
  voicemail_message: nil,
651
+ # SMS message to send when the call reaches voicemail. Supports {{variable}}
652
+ # placeholders. When null, no SMS is sent on voicemail.
653
+ voicemail_sms_prompt: nil,
654
+ # When using warm transfer: extra instructions for the supervisor handoff summary.
655
+ # If null or empty, the API uses the product default briefing when the call is
656
+ # loaded for the agent.
657
+ warm_transfer_summary_instructions: nil,
278
658
  # The webhook URL to call when the call is completed.
279
659
  webhook_url: nil,
660
+ # Zoho CRM integration config. When set, upserts the prospect (keyed on phone)
661
+ # into the chosen module and attaches a Note with the call summary after a call
662
+ # ends with one of the configured outcomes.
663
+ zoho: nil,
280
664
  request_options: {}
281
665
  )
282
666
  end
@@ -285,33 +669,78 @@ module Revox
285
669
  override.returns(
286
670
  {
287
671
  id: String,
672
+ after_call_sms_outcomes:
673
+ T.nilable(
674
+ T::Array[
675
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::OrSymbol
676
+ ]
677
+ ),
678
+ after_call_sms_prompt: T.nilable(String),
288
679
  background_sound:
289
680
  T.nilable(
290
681
  Revox::AssistantUpdateParams::BackgroundSound::OrSymbol
291
682
  ),
292
- calendly: Revox::AssistantUpdateParams::Calendly,
683
+ background_sound_volume: Float,
684
+ calendly: T.nilable(Revox::AssistantUpdateParams::Calendly),
293
685
  call_retry_config: Revox::AssistantUpdateParams::CallRetryConfig,
686
+ cartesia_dictionary_pronunciation_id: T.nilable(String),
687
+ custom_tools:
688
+ T.nilable(T::Array[Revox::AssistantUpdateParams::CustomTool]),
689
+ email_notification_address: T.nilable(String),
690
+ email_notification_language:
691
+ Revox::AssistantUpdateParams::EmailNotificationLanguage::OrSymbol,
692
+ email_notification_outcomes:
693
+ T.nilable(
694
+ T::Array[
695
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::OrSymbol
696
+ ]
697
+ ),
294
698
  end_of_call_sentence: String,
295
699
  faq_items: T::Array[Revox::AssistantUpdateParams::FaqItem],
296
700
  first_sentence: String,
297
701
  first_sentence_delay_ms: Integer,
298
702
  first_sentence_mode:
299
703
  Revox::AssistantUpdateParams::FirstSentenceMode::OrSymbol,
704
+ from_phone_number: T.nilable(String),
705
+ human_transfer_mode:
706
+ T.nilable(
707
+ Revox::AssistantUpdateParams::HumanTransferMode::OrSymbol
708
+ ),
300
709
  ivr_navigation_enabled: T::Boolean,
301
710
  llm_model:
302
711
  T.any(
303
712
  Revox::AssistantUpdateParams::LlmModel::UnionMember0,
304
- Revox::AssistantUpdateParams::LlmModel::UnionMember1
713
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1,
714
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2,
715
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3
305
716
  ),
717
+ logo_url: T.nilable(String),
306
718
  max_call_duration_secs: Float,
719
+ max_duration_end_message: T.nilable(String),
307
720
  name: String,
721
+ position: T.nilable(Revox::AssistantUpdateParams::Position),
308
722
  prompt: String,
723
+ prompt_flow: T.nilable(Revox::AssistantUpdateParams::PromptFlow),
724
+ slack: T.nilable(Revox::AssistantUpdateParams::Slack),
725
+ sms_enabled: T::Boolean,
726
+ sms_template: T.nilable(String),
309
727
  structured_output_config:
310
728
  T::Array[Revox::AssistantUpdateParams::StructuredOutputConfig],
729
+ structured_output_prompt: T.nilable(String),
730
+ stt_context: T.nilable(Revox::AssistantUpdateParams::SttContext),
731
+ stt_model: Revox::AssistantUpdateParams::SttModel::OrSymbol,
732
+ thinking_sound:
733
+ T.nilable(Revox::AssistantUpdateParams::ThinkingSound::OrSymbol),
734
+ thinking_sound_probability: Float,
735
+ thinking_sound_volume: Float,
311
736
  transfer_phone_number: T.nilable(String),
737
+ type: Revox::AssistantUpdateParams::Type::OrSymbol,
312
738
  voice: Revox::AssistantUpdateParams::Voice,
313
739
  voicemail_message: T.nilable(String),
740
+ voicemail_sms_prompt: T.nilable(String),
741
+ warm_transfer_summary_instructions: T.nilable(String),
314
742
  webhook_url: String,
743
+ zoho: T.nilable(Revox::AssistantUpdateParams::Zoho),
315
744
  request_options: Revox::RequestOptions
316
745
  }
317
746
  )
@@ -319,8 +748,68 @@ module Revox
319
748
  def to_hash
320
749
  end
321
750
 
322
- # The background sound to play during the call. Useful to give the impression that
323
- # your AI agent is in an office, in the street, or anywhere else you want.
751
+ module AfterCallSMSOutcome
752
+ extend Revox::Internal::Type::Enum
753
+
754
+ TaggedSymbol =
755
+ T.type_alias do
756
+ T.all(Symbol, Revox::AssistantUpdateParams::AfterCallSMSOutcome)
757
+ end
758
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
759
+
760
+ NOT_INTERESTED =
761
+ T.let(
762
+ :not_interested,
763
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
764
+ )
765
+ INTERESTED =
766
+ T.let(
767
+ :interested,
768
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
769
+ )
770
+ COMPLETED =
771
+ T.let(
772
+ :completed,
773
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
774
+ )
775
+ REQUESTED_CALLBACK_LATER =
776
+ T.let(
777
+ :requested_callback_later,
778
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
779
+ )
780
+ REQUESTED_CALLBACK_NEW_NUMBER =
781
+ T.let(
782
+ :requested_callback_new_number,
783
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
784
+ )
785
+ DO_NOT_CONTACT =
786
+ T.let(
787
+ :do_not_contact,
788
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
789
+ )
790
+ AI_AVERSE =
791
+ T.let(
792
+ :ai_averse,
793
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
794
+ )
795
+ NONE =
796
+ T.let(
797
+ :none,
798
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
799
+ )
800
+
801
+ sig do
802
+ override.returns(
803
+ T::Array[
804
+ Revox::AssistantUpdateParams::AfterCallSMSOutcome::TaggedSymbol
805
+ ]
806
+ )
807
+ end
808
+ def self.values
809
+ end
810
+ end
811
+
812
+ # Ambient background sound to play during the call. null/omitted disables it.
324
813
  module BackgroundSound
325
814
  extend Revox::Internal::Type::Enum
326
815
 
@@ -395,6 +884,24 @@ module Revox
395
884
  )
396
885
  end
397
886
 
887
+ # Days of the week when calls are allowed, in the recipient's timezone. Default:
888
+ # Monday through Friday.
889
+ sig do
890
+ returns(
891
+ T::Array[
892
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::OrSymbol
893
+ ]
894
+ )
895
+ end
896
+ attr_accessor :allowed_days
897
+
898
+ # If true and max_retry_attempts >= 2, attempt #2 fires immediately (skipping
899
+ # retry_delay_seconds) when attempt #1 didn't reach a human.
900
+ # Calling-window/allowed-days checks still apply. Only affects the 1→2 transition.
901
+ # Default: false.
902
+ sig { returns(T::Boolean) }
903
+ attr_accessor :call_twice_in_a_row
904
+
398
905
  sig do
399
906
  returns(
400
907
  T::Array[
@@ -418,6 +925,11 @@ module Revox
418
925
  # iterations. If not provided, defaults will be used.
419
926
  sig do
420
927
  params(
928
+ allowed_days:
929
+ T::Array[
930
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::OrSymbol
931
+ ],
932
+ call_twice_in_a_row: T::Boolean,
421
933
  calling_windows:
422
934
  T::Array[
423
935
  Revox::AssistantUpdateParams::CallRetryConfig::CallingWindow::OrHash
@@ -427,6 +939,14 @@ module Revox
427
939
  ).returns(T.attached_class)
428
940
  end
429
941
  def self.new(
942
+ # Days of the week when calls are allowed, in the recipient's timezone. Default:
943
+ # Monday through Friday.
944
+ allowed_days:,
945
+ # If true and max_retry_attempts >= 2, attempt #2 fires immediately (skipping
946
+ # retry_delay_seconds) when attempt #1 didn't reach a human.
947
+ # Calling-window/allowed-days checks still apply. Only affects the 1→2 transition.
948
+ # Default: false.
949
+ call_twice_in_a_row:,
430
950
  calling_windows:,
431
951
  # Maximum number of call retry attempts. Default: 3.
432
952
  max_retry_attempts:,
@@ -440,6 +960,11 @@ module Revox
440
960
  sig do
441
961
  override.returns(
442
962
  {
963
+ allowed_days:
964
+ T::Array[
965
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::OrSymbol
966
+ ],
967
+ call_twice_in_a_row: T::Boolean,
443
968
  calling_windows:
444
969
  T::Array[
445
970
  Revox::AssistantUpdateParams::CallRetryConfig::CallingWindow
@@ -452,6 +977,65 @@ module Revox
452
977
  def to_hash
453
978
  end
454
979
 
980
+ module AllowedDay
981
+ extend Revox::Internal::Type::Enum
982
+
983
+ TaggedSymbol =
984
+ T.type_alias do
985
+ T.all(
986
+ Symbol,
987
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay
988
+ )
989
+ end
990
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
991
+
992
+ MONDAY =
993
+ T.let(
994
+ :monday,
995
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
996
+ )
997
+ TUESDAY =
998
+ T.let(
999
+ :tuesday,
1000
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
1001
+ )
1002
+ WEDNESDAY =
1003
+ T.let(
1004
+ :wednesday,
1005
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
1006
+ )
1007
+ THURSDAY =
1008
+ T.let(
1009
+ :thursday,
1010
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
1011
+ )
1012
+ FRIDAY =
1013
+ T.let(
1014
+ :friday,
1015
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
1016
+ )
1017
+ SATURDAY =
1018
+ T.let(
1019
+ :saturday,
1020
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
1021
+ )
1022
+ SUNDAY =
1023
+ T.let(
1024
+ :sunday,
1025
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
1026
+ )
1027
+
1028
+ sig do
1029
+ override.returns(
1030
+ T::Array[
1031
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::TaggedSymbol
1032
+ ]
1033
+ )
1034
+ end
1035
+ def self.values
1036
+ end
1037
+ end
1038
+
455
1039
  class CallingWindow < Revox::Internal::Type::BaseModel
456
1040
  OrHash =
457
1041
  T.type_alias do
@@ -512,54 +1096,498 @@ module Revox
512
1096
  end
513
1097
  end
514
1098
 
515
- class FaqItem < Revox::Internal::Type::BaseModel
1099
+ class CustomTool < Revox::Internal::Type::BaseModel
516
1100
  OrHash =
517
1101
  T.type_alias do
518
1102
  T.any(
519
- Revox::AssistantUpdateParams::FaqItem,
1103
+ Revox::AssistantUpdateParams::CustomTool,
520
1104
  Revox::Internal::AnyHash
521
1105
  )
522
1106
  end
523
1107
 
524
- sig { returns(String) }
525
- attr_accessor :answer
1108
+ # JSON body template for the request. Use quoted {{variable}} placeholders (e.g.
1109
+ # "{{name}}") for dynamic values
1110
+ sig { returns(T.nilable(String)) }
1111
+ attr_accessor :body_template
526
1112
 
1113
+ # Human-readable description of what the tool does, used by the LLM to decide when
1114
+ # to call it
527
1115
  sig { returns(String) }
528
- attr_accessor :question
1116
+ attr_accessor :description
529
1117
 
1118
+ # HTTP headers to include in the request. Values support {{variable}} placeholders
530
1119
  sig do
531
- params(answer: String, question: String).returns(T.attached_class)
532
- end
533
- def self.new(answer:, question:)
1120
+ returns(T::Array[Revox::AssistantUpdateParams::CustomTool::Header])
534
1121
  end
1122
+ attr_accessor :headers
535
1123
 
536
- sig { override.returns({ answer: String, question: String }) }
537
- def to_hash
1124
+ # Schema defining the parameters the LLM should extract from the conversation to
1125
+ # pass to this tool
1126
+ sig do
1127
+ returns(
1128
+ T::Array[Revox::AssistantUpdateParams::CustomTool::InputSchema]
1129
+ )
538
1130
  end
539
- end
1131
+ attr_accessor :input_schema
540
1132
 
541
- # How the first sentence should be handled. "generated" means the LLM will
542
- # generate a response based on the first_sentence instruction. "static" means the
543
- # first_sentence will be spoken exactly as provided. "none" means the agent will
544
- # not speak first and will wait for the user.
545
- module FirstSentenceMode
546
- extend Revox::Internal::Type::Enum
1133
+ # HTTP method to use when calling the API endpoint
1134
+ sig do
1135
+ returns(Revox::AssistantUpdateParams::CustomTool::Method::OrSymbol)
1136
+ end
1137
+ attr_accessor :method_
547
1138
 
548
- TaggedSymbol =
549
- T.type_alias do
550
- T.all(Symbol, Revox::AssistantUpdateParams::FirstSentenceMode)
551
- end
552
- OrSymbol = T.type_alias { T.any(Symbol, String) }
1139
+ # Unique tool name in lowercase_snake_case (e.g. check_inventory)
1140
+ sig { returns(String) }
1141
+ attr_accessor :name
553
1142
 
554
- GENERATED =
555
- T.let(
556
- :generated,
557
- Revox::AssistantUpdateParams::FirstSentenceMode::TaggedSymbol
1143
+ # Query string parameters appended to the URL. Values support {{variable}}
1144
+ # placeholders
1145
+ sig do
1146
+ returns(
1147
+ T::Array[Revox::AssistantUpdateParams::CustomTool::QueryParam]
558
1148
  )
559
- STATIC =
560
- T.let(
561
- :static,
562
- Revox::AssistantUpdateParams::FirstSentenceMode::TaggedSymbol
1149
+ end
1150
+ attr_accessor :query_params
1151
+
1152
+ # Full URL of the API endpoint. Supports {{variable}} placeholders for dynamic
1153
+ # values
1154
+ sig { returns(String) }
1155
+ attr_accessor :url
1156
+
1157
+ sig do
1158
+ params(
1159
+ body_template: T.nilable(String),
1160
+ description: String,
1161
+ headers:
1162
+ T::Array[
1163
+ Revox::AssistantUpdateParams::CustomTool::Header::OrHash
1164
+ ],
1165
+ input_schema:
1166
+ T::Array[
1167
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::OrHash
1168
+ ],
1169
+ method_: Revox::AssistantUpdateParams::CustomTool::Method::OrSymbol,
1170
+ name: String,
1171
+ query_params:
1172
+ T::Array[
1173
+ Revox::AssistantUpdateParams::CustomTool::QueryParam::OrHash
1174
+ ],
1175
+ url: String
1176
+ ).returns(T.attached_class)
1177
+ end
1178
+ def self.new(
1179
+ # JSON body template for the request. Use quoted {{variable}} placeholders (e.g.
1180
+ # "{{name}}") for dynamic values
1181
+ body_template:,
1182
+ # Human-readable description of what the tool does, used by the LLM to decide when
1183
+ # to call it
1184
+ description:,
1185
+ # HTTP headers to include in the request. Values support {{variable}} placeholders
1186
+ headers:,
1187
+ # Schema defining the parameters the LLM should extract from the conversation to
1188
+ # pass to this tool
1189
+ input_schema:,
1190
+ # HTTP method to use when calling the API endpoint
1191
+ method_:,
1192
+ # Unique tool name in lowercase_snake_case (e.g. check_inventory)
1193
+ name:,
1194
+ # Query string parameters appended to the URL. Values support {{variable}}
1195
+ # placeholders
1196
+ query_params:,
1197
+ # Full URL of the API endpoint. Supports {{variable}} placeholders for dynamic
1198
+ # values
1199
+ url:
1200
+ )
1201
+ end
1202
+
1203
+ sig do
1204
+ override.returns(
1205
+ {
1206
+ body_template: T.nilable(String),
1207
+ description: String,
1208
+ headers:
1209
+ T::Array[Revox::AssistantUpdateParams::CustomTool::Header],
1210
+ input_schema:
1211
+ T::Array[Revox::AssistantUpdateParams::CustomTool::InputSchema],
1212
+ method_:
1213
+ Revox::AssistantUpdateParams::CustomTool::Method::OrSymbol,
1214
+ name: String,
1215
+ query_params:
1216
+ T::Array[Revox::AssistantUpdateParams::CustomTool::QueryParam],
1217
+ url: String
1218
+ }
1219
+ )
1220
+ end
1221
+ def to_hash
1222
+ end
1223
+
1224
+ class Header < Revox::Internal::Type::BaseModel
1225
+ OrHash =
1226
+ T.type_alias do
1227
+ T.any(
1228
+ Revox::AssistantUpdateParams::CustomTool::Header,
1229
+ Revox::Internal::AnyHash
1230
+ )
1231
+ end
1232
+
1233
+ sig { returns(String) }
1234
+ attr_accessor :key
1235
+
1236
+ sig { returns(String) }
1237
+ attr_accessor :value
1238
+
1239
+ sig { params(key: String, value: String).returns(T.attached_class) }
1240
+ def self.new(key:, value:)
1241
+ end
1242
+
1243
+ sig { override.returns({ key: String, value: String }) }
1244
+ def to_hash
1245
+ end
1246
+ end
1247
+
1248
+ class InputSchema < Revox::Internal::Type::BaseModel
1249
+ OrHash =
1250
+ T.type_alias do
1251
+ T.any(
1252
+ Revox::AssistantUpdateParams::CustomTool::InputSchema,
1253
+ Revox::Internal::AnyHash
1254
+ )
1255
+ end
1256
+
1257
+ sig { returns(String) }
1258
+ attr_accessor :name
1259
+
1260
+ sig { returns(T::Boolean) }
1261
+ attr_accessor :required
1262
+
1263
+ sig do
1264
+ returns(
1265
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::OrSymbol
1266
+ )
1267
+ end
1268
+ attr_accessor :type
1269
+
1270
+ sig { returns(T.nilable(String)) }
1271
+ attr_reader :description
1272
+
1273
+ sig { params(description: String).void }
1274
+ attr_writer :description
1275
+
1276
+ sig { returns(T.nilable(T::Array[String])) }
1277
+ attr_reader :enum_options
1278
+
1279
+ sig { params(enum_options: T::Array[String]).void }
1280
+ attr_writer :enum_options
1281
+
1282
+ sig do
1283
+ params(
1284
+ name: String,
1285
+ required: T::Boolean,
1286
+ type:
1287
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::OrSymbol,
1288
+ description: String,
1289
+ enum_options: T::Array[String]
1290
+ ).returns(T.attached_class)
1291
+ end
1292
+ def self.new(
1293
+ name:,
1294
+ required:,
1295
+ type:,
1296
+ description: nil,
1297
+ enum_options: nil
1298
+ )
1299
+ end
1300
+
1301
+ sig do
1302
+ override.returns(
1303
+ {
1304
+ name: String,
1305
+ required: T::Boolean,
1306
+ type:
1307
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::OrSymbol,
1308
+ description: String,
1309
+ enum_options: T::Array[String]
1310
+ }
1311
+ )
1312
+ end
1313
+ def to_hash
1314
+ end
1315
+
1316
+ module Type
1317
+ extend Revox::Internal::Type::Enum
1318
+
1319
+ TaggedSymbol =
1320
+ T.type_alias do
1321
+ T.all(
1322
+ Symbol,
1323
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type
1324
+ )
1325
+ end
1326
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1327
+
1328
+ STRING =
1329
+ T.let(
1330
+ :string,
1331
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::TaggedSymbol
1332
+ )
1333
+ NUMBER =
1334
+ T.let(
1335
+ :number,
1336
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::TaggedSymbol
1337
+ )
1338
+ BOOLEAN =
1339
+ T.let(
1340
+ :boolean,
1341
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::TaggedSymbol
1342
+ )
1343
+ ENUM =
1344
+ T.let(
1345
+ :enum,
1346
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::TaggedSymbol
1347
+ )
1348
+ DATE =
1349
+ T.let(
1350
+ :date,
1351
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::TaggedSymbol
1352
+ )
1353
+ DATETIME =
1354
+ T.let(
1355
+ :datetime,
1356
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::TaggedSymbol
1357
+ )
1358
+
1359
+ sig do
1360
+ override.returns(
1361
+ T::Array[
1362
+ Revox::AssistantUpdateParams::CustomTool::InputSchema::Type::TaggedSymbol
1363
+ ]
1364
+ )
1365
+ end
1366
+ def self.values
1367
+ end
1368
+ end
1369
+ end
1370
+
1371
+ # HTTP method to use when calling the API endpoint
1372
+ module Method
1373
+ extend Revox::Internal::Type::Enum
1374
+
1375
+ TaggedSymbol =
1376
+ T.type_alias do
1377
+ T.all(Symbol, Revox::AssistantUpdateParams::CustomTool::Method)
1378
+ end
1379
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1380
+
1381
+ GET =
1382
+ T.let(
1383
+ :GET,
1384
+ Revox::AssistantUpdateParams::CustomTool::Method::TaggedSymbol
1385
+ )
1386
+ POST =
1387
+ T.let(
1388
+ :POST,
1389
+ Revox::AssistantUpdateParams::CustomTool::Method::TaggedSymbol
1390
+ )
1391
+ PUT =
1392
+ T.let(
1393
+ :PUT,
1394
+ Revox::AssistantUpdateParams::CustomTool::Method::TaggedSymbol
1395
+ )
1396
+ PATCH =
1397
+ T.let(
1398
+ :PATCH,
1399
+ Revox::AssistantUpdateParams::CustomTool::Method::TaggedSymbol
1400
+ )
1401
+ DELETE =
1402
+ T.let(
1403
+ :DELETE,
1404
+ Revox::AssistantUpdateParams::CustomTool::Method::TaggedSymbol
1405
+ )
1406
+
1407
+ sig do
1408
+ override.returns(
1409
+ T::Array[
1410
+ Revox::AssistantUpdateParams::CustomTool::Method::TaggedSymbol
1411
+ ]
1412
+ )
1413
+ end
1414
+ def self.values
1415
+ end
1416
+ end
1417
+
1418
+ class QueryParam < Revox::Internal::Type::BaseModel
1419
+ OrHash =
1420
+ T.type_alias do
1421
+ T.any(
1422
+ Revox::AssistantUpdateParams::CustomTool::QueryParam,
1423
+ Revox::Internal::AnyHash
1424
+ )
1425
+ end
1426
+
1427
+ sig { returns(String) }
1428
+ attr_accessor :key
1429
+
1430
+ sig { returns(String) }
1431
+ attr_accessor :value
1432
+
1433
+ sig { params(key: String, value: String).returns(T.attached_class) }
1434
+ def self.new(key:, value:)
1435
+ end
1436
+
1437
+ sig { override.returns({ key: String, value: String }) }
1438
+ def to_hash
1439
+ end
1440
+ end
1441
+ end
1442
+
1443
+ # The language used for the notification email content. One of "en" or "fr".
1444
+ # Defaults to "en".
1445
+ module EmailNotificationLanguage
1446
+ extend Revox::Internal::Type::Enum
1447
+
1448
+ TaggedSymbol =
1449
+ T.type_alias do
1450
+ T.all(
1451
+ Symbol,
1452
+ Revox::AssistantUpdateParams::EmailNotificationLanguage
1453
+ )
1454
+ end
1455
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1456
+
1457
+ EN =
1458
+ T.let(
1459
+ :en,
1460
+ Revox::AssistantUpdateParams::EmailNotificationLanguage::TaggedSymbol
1461
+ )
1462
+ FR =
1463
+ T.let(
1464
+ :fr,
1465
+ Revox::AssistantUpdateParams::EmailNotificationLanguage::TaggedSymbol
1466
+ )
1467
+
1468
+ sig do
1469
+ override.returns(
1470
+ T::Array[
1471
+ Revox::AssistantUpdateParams::EmailNotificationLanguage::TaggedSymbol
1472
+ ]
1473
+ )
1474
+ end
1475
+ def self.values
1476
+ end
1477
+ end
1478
+
1479
+ module EmailNotificationOutcome
1480
+ extend Revox::Internal::Type::Enum
1481
+
1482
+ TaggedSymbol =
1483
+ T.type_alias do
1484
+ T.all(
1485
+ Symbol,
1486
+ Revox::AssistantUpdateParams::EmailNotificationOutcome
1487
+ )
1488
+ end
1489
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1490
+
1491
+ NOT_INTERESTED =
1492
+ T.let(
1493
+ :not_interested,
1494
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1495
+ )
1496
+ INTERESTED =
1497
+ T.let(
1498
+ :interested,
1499
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1500
+ )
1501
+ COMPLETED =
1502
+ T.let(
1503
+ :completed,
1504
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1505
+ )
1506
+ REQUESTED_CALLBACK_LATER =
1507
+ T.let(
1508
+ :requested_callback_later,
1509
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1510
+ )
1511
+ REQUESTED_CALLBACK_NEW_NUMBER =
1512
+ T.let(
1513
+ :requested_callback_new_number,
1514
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1515
+ )
1516
+ DO_NOT_CONTACT =
1517
+ T.let(
1518
+ :do_not_contact,
1519
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1520
+ )
1521
+ AI_AVERSE =
1522
+ T.let(
1523
+ :ai_averse,
1524
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1525
+ )
1526
+ NONE =
1527
+ T.let(
1528
+ :none,
1529
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1530
+ )
1531
+
1532
+ sig do
1533
+ override.returns(
1534
+ T::Array[
1535
+ Revox::AssistantUpdateParams::EmailNotificationOutcome::TaggedSymbol
1536
+ ]
1537
+ )
1538
+ end
1539
+ def self.values
1540
+ end
1541
+ end
1542
+
1543
+ class FaqItem < Revox::Internal::Type::BaseModel
1544
+ OrHash =
1545
+ T.type_alias do
1546
+ T.any(
1547
+ Revox::AssistantUpdateParams::FaqItem,
1548
+ Revox::Internal::AnyHash
1549
+ )
1550
+ end
1551
+
1552
+ sig { returns(String) }
1553
+ attr_accessor :answer
1554
+
1555
+ sig { returns(String) }
1556
+ attr_accessor :question
1557
+
1558
+ sig do
1559
+ params(answer: String, question: String).returns(T.attached_class)
1560
+ end
1561
+ def self.new(answer:, question:)
1562
+ end
1563
+
1564
+ sig { override.returns({ answer: String, question: String }) }
1565
+ def to_hash
1566
+ end
1567
+ end
1568
+
1569
+ # How the first sentence should be handled. "generated" means the LLM will
1570
+ # generate a response based on the first_sentence instruction. "static" means the
1571
+ # first_sentence will be spoken exactly as provided. "none" means the agent will
1572
+ # not speak first and will wait for the user.
1573
+ module FirstSentenceMode
1574
+ extend Revox::Internal::Type::Enum
1575
+
1576
+ TaggedSymbol =
1577
+ T.type_alias do
1578
+ T.all(Symbol, Revox::AssistantUpdateParams::FirstSentenceMode)
1579
+ end
1580
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1581
+
1582
+ GENERATED =
1583
+ T.let(
1584
+ :generated,
1585
+ Revox::AssistantUpdateParams::FirstSentenceMode::TaggedSymbol
1586
+ )
1587
+ STATIC =
1588
+ T.let(
1589
+ :static,
1590
+ Revox::AssistantUpdateParams::FirstSentenceMode::TaggedSymbol
563
1591
  )
564
1592
  NONE =
565
1593
  T.let(
@@ -578,85 +1606,333 @@ module Revox
578
1606
  end
579
1607
  end
580
1608
 
581
- module LlmModel
582
- extend Revox::Internal::Type::Union
1609
+ # When transfer_phone_number is set: "warm" (AI bridges) or "cold" (SIP REFER;
1610
+ # trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
1611
+ module HumanTransferMode
1612
+ extend Revox::Internal::Type::Enum
1613
+
1614
+ TaggedSymbol =
1615
+ T.type_alias do
1616
+ T.all(Symbol, Revox::AssistantUpdateParams::HumanTransferMode)
1617
+ end
1618
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1619
+
1620
+ WARM =
1621
+ T.let(
1622
+ :warm,
1623
+ Revox::AssistantUpdateParams::HumanTransferMode::TaggedSymbol
1624
+ )
1625
+ COLD =
1626
+ T.let(
1627
+ :cold,
1628
+ Revox::AssistantUpdateParams::HumanTransferMode::TaggedSymbol
1629
+ )
1630
+
1631
+ sig do
1632
+ override.returns(
1633
+ T::Array[
1634
+ Revox::AssistantUpdateParams::HumanTransferMode::TaggedSymbol
1635
+ ]
1636
+ )
1637
+ end
1638
+ def self.values
1639
+ end
1640
+ end
1641
+
1642
+ module LlmModel
1643
+ extend Revox::Internal::Type::Union
1644
+
1645
+ Variants =
1646
+ T.type_alias do
1647
+ T.any(
1648
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0,
1649
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1,
1650
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2,
1651
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3
1652
+ )
1653
+ end
1654
+
1655
+ class UnionMember0 < Revox::Internal::Type::BaseModel
1656
+ OrHash =
1657
+ T.type_alias do
1658
+ T.any(
1659
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0,
1660
+ Revox::Internal::AnyHash
1661
+ )
1662
+ end
1663
+
1664
+ sig do
1665
+ returns(
1666
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol
1667
+ )
1668
+ end
1669
+ attr_accessor :name
1670
+
1671
+ sig { returns(Symbol) }
1672
+ attr_accessor :type
1673
+
1674
+ sig do
1675
+ params(
1676
+ name:
1677
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol,
1678
+ type: Symbol
1679
+ ).returns(T.attached_class)
1680
+ end
1681
+ def self.new(name:, type: :"dedicated-instance")
1682
+ end
1683
+
1684
+ sig do
1685
+ override.returns(
1686
+ {
1687
+ name:
1688
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol,
1689
+ type: Symbol
1690
+ }
1691
+ )
1692
+ end
1693
+ def to_hash
1694
+ end
1695
+
1696
+ module Name
1697
+ extend Revox::Internal::Type::Enum
1698
+
1699
+ TaggedSymbol =
1700
+ T.type_alias do
1701
+ T.all(
1702
+ Symbol,
1703
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name
1704
+ )
1705
+ end
1706
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1707
+
1708
+ GPT_4_1 =
1709
+ T.let(
1710
+ :"gpt-4.1",
1711
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1712
+ )
1713
+ MINISTRAL_3_8B_INSTRUCT =
1714
+ T.let(
1715
+ :"ministral-3-8b-instruct",
1716
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1717
+ )
1718
+
1719
+ sig do
1720
+ override.returns(
1721
+ T::Array[
1722
+ Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1723
+ ]
1724
+ )
1725
+ end
1726
+ def self.values
1727
+ end
1728
+ end
1729
+ end
1730
+
1731
+ class UnionMember1 < Revox::Internal::Type::BaseModel
1732
+ OrHash =
1733
+ T.type_alias do
1734
+ T.any(
1735
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1,
1736
+ Revox::Internal::AnyHash
1737
+ )
1738
+ end
1739
+
1740
+ # The model ID to use from OpenRouter. eg: openai/gpt-4.1
1741
+ sig { returns(String) }
1742
+ attr_accessor :openrouter_model_id
1743
+
1744
+ # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
1745
+ sig { returns(String) }
1746
+ attr_accessor :openrouter_provider
1747
+
1748
+ # Use a model from OpenRouter.
1749
+ sig { returns(Symbol) }
1750
+ attr_accessor :type
1751
+
1752
+ sig do
1753
+ params(
1754
+ openrouter_model_id: String,
1755
+ openrouter_provider: String,
1756
+ type: Symbol
1757
+ ).returns(T.attached_class)
1758
+ end
1759
+ def self.new(
1760
+ # The model ID to use from OpenRouter. eg: openai/gpt-4.1
1761
+ openrouter_model_id:,
1762
+ # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
1763
+ openrouter_provider:,
1764
+ # Use a model from OpenRouter.
1765
+ type: :openrouter
1766
+ )
1767
+ end
1768
+
1769
+ sig do
1770
+ override.returns(
1771
+ {
1772
+ openrouter_model_id: String,
1773
+ openrouter_provider: String,
1774
+ type: Symbol
1775
+ }
1776
+ )
1777
+ end
1778
+ def to_hash
1779
+ end
1780
+ end
1781
+
1782
+ class UnionMember2 < Revox::Internal::Type::BaseModel
1783
+ OrHash =
1784
+ T.type_alias do
1785
+ T.any(
1786
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2,
1787
+ Revox::Internal::AnyHash
1788
+ )
1789
+ end
1790
+
1791
+ # API key sent as Bearer token to the custom endpoint.
1792
+ sig { returns(String) }
1793
+ attr_accessor :api_key
1794
+
1795
+ # Base URL for the OpenAI-compatible API, e.g. https://api.together.xyz/v1
1796
+ sig { returns(String) }
1797
+ attr_accessor :api_url
583
1798
 
584
- Variants =
585
- T.type_alias do
586
- T.any(
587
- Revox::AssistantUpdateParams::LlmModel::UnionMember0,
588
- Revox::AssistantUpdateParams::LlmModel::UnionMember1
1799
+ # Model name as expected by the provider, e.g. meta-llama/llama-3-70b
1800
+ sig { returns(String) }
1801
+ attr_accessor :model_name
1802
+
1803
+ # OpenAI-compatible chat completions API (bring your own endpoint and key).
1804
+ sig { returns(Symbol) }
1805
+ attr_accessor :type
1806
+
1807
+ sig do
1808
+ params(
1809
+ api_key: String,
1810
+ api_url: String,
1811
+ model_name: String,
1812
+ type: Symbol
1813
+ ).returns(T.attached_class)
1814
+ end
1815
+ def self.new(
1816
+ # API key sent as Bearer token to the custom endpoint.
1817
+ api_key:,
1818
+ # Base URL for the OpenAI-compatible API, e.g. https://api.together.xyz/v1
1819
+ api_url:,
1820
+ # Model name as expected by the provider, e.g. meta-llama/llama-3-70b
1821
+ model_name:,
1822
+ # OpenAI-compatible chat completions API (bring your own endpoint and key).
1823
+ type: :custom
1824
+ )
1825
+ end
1826
+
1827
+ sig do
1828
+ override.returns(
1829
+ {
1830
+ api_key: String,
1831
+ api_url: String,
1832
+ model_name: String,
1833
+ type: Symbol
1834
+ }
589
1835
  )
590
1836
  end
1837
+ def to_hash
1838
+ end
1839
+ end
591
1840
 
592
- class UnionMember0 < Revox::Internal::Type::BaseModel
1841
+ class UnionMember3 < Revox::Internal::Type::BaseModel
593
1842
  OrHash =
594
1843
  T.type_alias do
595
1844
  T.any(
596
- Revox::AssistantUpdateParams::LlmModel::UnionMember0,
1845
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3,
597
1846
  Revox::Internal::AnyHash
598
1847
  )
599
1848
  end
600
1849
 
1850
+ # The provider to use from Realtime. eg: openai, google.
601
1851
  sig do
602
1852
  returns(
603
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol
1853
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::OrSymbol
604
1854
  )
605
1855
  end
606
- attr_accessor :name
1856
+ attr_accessor :provider
1857
+
1858
+ # The model ID to use from Realtime. eg: gpt-4.1
1859
+ sig { returns(String) }
1860
+ attr_accessor :realtime_model_id
607
1861
 
1862
+ # Use a model from Realtime.
608
1863
  sig { returns(Symbol) }
609
1864
  attr_accessor :type
610
1865
 
1866
+ # Output voice for the realtime provider (e.g. OpenAI: marin; Gemini: Puck).
1867
+ sig { returns(T.nilable(String)) }
1868
+ attr_reader :realtime_voice_id
1869
+
1870
+ sig { params(realtime_voice_id: String).void }
1871
+ attr_writer :realtime_voice_id
1872
+
611
1873
  sig do
612
1874
  params(
613
- name:
614
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol,
1875
+ provider:
1876
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::OrSymbol,
1877
+ realtime_model_id: String,
1878
+ realtime_voice_id: String,
615
1879
  type: Symbol
616
1880
  ).returns(T.attached_class)
617
1881
  end
618
- def self.new(name:, type: :"dedicated-instance")
1882
+ def self.new(
1883
+ # The provider to use from Realtime. eg: openai, google.
1884
+ provider:,
1885
+ # The model ID to use from Realtime. eg: gpt-4.1
1886
+ realtime_model_id:,
1887
+ # Output voice for the realtime provider (e.g. OpenAI: marin; Gemini: Puck).
1888
+ realtime_voice_id: nil,
1889
+ # Use a model from Realtime.
1890
+ type: :realtime
1891
+ )
619
1892
  end
620
1893
 
621
1894
  sig do
622
1895
  override.returns(
623
1896
  {
624
- name:
625
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol,
626
- type: Symbol
1897
+ provider:
1898
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::OrSymbol,
1899
+ realtime_model_id: String,
1900
+ type: Symbol,
1901
+ realtime_voice_id: String
627
1902
  }
628
1903
  )
629
1904
  end
630
1905
  def to_hash
631
1906
  end
632
1907
 
633
- module Name
1908
+ # The provider to use from Realtime. eg: openai, google.
1909
+ module Provider
634
1910
  extend Revox::Internal::Type::Enum
635
1911
 
636
1912
  TaggedSymbol =
637
1913
  T.type_alias do
638
1914
  T.all(
639
1915
  Symbol,
640
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name
1916
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider
641
1917
  )
642
1918
  end
643
1919
  OrSymbol = T.type_alias { T.any(Symbol, String) }
644
1920
 
645
- GPT_4_1 =
1921
+ OPENAI =
646
1922
  T.let(
647
- :"gpt-4.1",
648
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1923
+ :openai,
1924
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::TaggedSymbol
649
1925
  )
650
- MINISTRAL_3_8B_INSTRUCT =
1926
+ GOOGLE =
651
1927
  T.let(
652
- :"ministral-3-8b-instruct",
653
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1928
+ :google,
1929
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::TaggedSymbol
654
1930
  )
655
1931
 
656
1932
  sig do
657
1933
  override.returns(
658
1934
  T::Array[
659
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1935
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::TaggedSymbol
660
1936
  ]
661
1937
  )
662
1938
  end
@@ -665,64 +1941,377 @@ module Revox
665
1941
  end
666
1942
  end
667
1943
 
668
- class UnionMember1 < Revox::Internal::Type::BaseModel
1944
+ sig do
1945
+ override.returns(
1946
+ T::Array[Revox::AssistantUpdateParams::LlmModel::Variants]
1947
+ )
1948
+ end
1949
+ def self.variants
1950
+ end
1951
+ end
1952
+
1953
+ class Position < Revox::Internal::Type::BaseModel
1954
+ OrHash =
1955
+ T.type_alias do
1956
+ T.any(
1957
+ Revox::AssistantUpdateParams::Position,
1958
+ Revox::Internal::AnyHash
1959
+ )
1960
+ end
1961
+
1962
+ sig { returns(Float) }
1963
+ attr_accessor :x
1964
+
1965
+ sig { returns(Float) }
1966
+ attr_accessor :y_
1967
+
1968
+ # Canvas position of this assistant's node in its multi-step flow editor.
1969
+ sig { params(x: Float, y_: Float).returns(T.attached_class) }
1970
+ def self.new(x:, y_:)
1971
+ end
1972
+
1973
+ sig { override.returns({ x: Float, y_: Float }) }
1974
+ def to_hash
1975
+ end
1976
+ end
1977
+
1978
+ class PromptFlow < Revox::Internal::Type::BaseModel
1979
+ OrHash =
1980
+ T.type_alias do
1981
+ T.any(
1982
+ Revox::AssistantUpdateParams::PromptFlow,
1983
+ Revox::Internal::AnyHash
1984
+ )
1985
+ end
1986
+
1987
+ sig do
1988
+ returns(T::Array[Revox::AssistantUpdateParams::PromptFlow::Edge])
1989
+ end
1990
+ attr_accessor :edges
1991
+
1992
+ sig do
1993
+ returns(T::Array[Revox::AssistantUpdateParams::PromptFlow::Node])
1994
+ end
1995
+ attr_accessor :nodes
1996
+
1997
+ # Visual prompt constructor data (nodes, edges, positions). Used by the UI to
1998
+ # re-open the visual editor. Does not affect call behavior — the flattened prompt
1999
+ # field is what the LLM receives.
2000
+ sig do
2001
+ params(
2002
+ edges:
2003
+ T::Array[Revox::AssistantUpdateParams::PromptFlow::Edge::OrHash],
2004
+ nodes:
2005
+ T::Array[Revox::AssistantUpdateParams::PromptFlow::Node::OrHash]
2006
+ ).returns(T.attached_class)
2007
+ end
2008
+ def self.new(edges:, nodes:)
2009
+ end
2010
+
2011
+ sig do
2012
+ override.returns(
2013
+ {
2014
+ edges: T::Array[Revox::AssistantUpdateParams::PromptFlow::Edge],
2015
+ nodes: T::Array[Revox::AssistantUpdateParams::PromptFlow::Node]
2016
+ }
2017
+ )
2018
+ end
2019
+ def to_hash
2020
+ end
2021
+
2022
+ class Edge < Revox::Internal::Type::BaseModel
669
2023
  OrHash =
670
2024
  T.type_alias do
671
2025
  T.any(
672
- Revox::AssistantUpdateParams::LlmModel::UnionMember1,
2026
+ Revox::AssistantUpdateParams::PromptFlow::Edge,
673
2027
  Revox::Internal::AnyHash
674
2028
  )
675
2029
  end
676
2030
 
677
- # The model ID to use from OpenRouter. eg: openai/gpt-4.1
678
2031
  sig { returns(String) }
679
- attr_accessor :openrouter_model_id
2032
+ attr_accessor :id
680
2033
 
681
- # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
682
2034
  sig { returns(String) }
683
- attr_accessor :openrouter_provider
2035
+ attr_accessor :source
2036
+
2037
+ sig { returns(String) }
2038
+ attr_accessor :target
2039
+
2040
+ sig do
2041
+ params(id: String, source: String, target: String).returns(
2042
+ T.attached_class
2043
+ )
2044
+ end
2045
+ def self.new(id:, source:, target:)
2046
+ end
2047
+
2048
+ sig do
2049
+ override.returns({ id: String, source: String, target: String })
2050
+ end
2051
+ def to_hash
2052
+ end
2053
+ end
2054
+
2055
+ class Node < Revox::Internal::Type::BaseModel
2056
+ OrHash =
2057
+ T.type_alias do
2058
+ T.any(
2059
+ Revox::AssistantUpdateParams::PromptFlow::Node,
2060
+ Revox::Internal::AnyHash
2061
+ )
2062
+ end
2063
+
2064
+ sig { returns(String) }
2065
+ attr_accessor :id
2066
+
2067
+ sig { returns(Revox::AssistantUpdateParams::PromptFlow::Node::Data) }
2068
+ attr_reader :data
2069
+
2070
+ sig do
2071
+ params(
2072
+ data: Revox::AssistantUpdateParams::PromptFlow::Node::Data::OrHash
2073
+ ).void
2074
+ end
2075
+ attr_writer :data
2076
+
2077
+ sig do
2078
+ returns(Revox::AssistantUpdateParams::PromptFlow::Node::Position)
2079
+ end
2080
+ attr_reader :position
2081
+
2082
+ sig do
2083
+ params(
2084
+ position:
2085
+ Revox::AssistantUpdateParams::PromptFlow::Node::Position::OrHash
2086
+ ).void
2087
+ end
2088
+ attr_writer :position
684
2089
 
685
- # Use a model from OpenRouter.
686
2090
  sig { returns(Symbol) }
687
2091
  attr_accessor :type
688
2092
 
689
2093
  sig do
690
2094
  params(
691
- openrouter_model_id: String,
692
- openrouter_provider: String,
2095
+ id: String,
2096
+ data:
2097
+ Revox::AssistantUpdateParams::PromptFlow::Node::Data::OrHash,
2098
+ position:
2099
+ Revox::AssistantUpdateParams::PromptFlow::Node::Position::OrHash,
693
2100
  type: Symbol
694
2101
  ).returns(T.attached_class)
695
2102
  end
696
- def self.new(
697
- # The model ID to use from OpenRouter. eg: openai/gpt-4.1
698
- openrouter_model_id:,
699
- # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
700
- openrouter_provider:,
701
- # Use a model from OpenRouter.
702
- type: :openrouter
703
- )
2103
+ def self.new(id:, data:, position:, type: :promptBlock)
2104
+ end
2105
+
2106
+ sig do
2107
+ override.returns(
2108
+ {
2109
+ id: String,
2110
+ data: Revox::AssistantUpdateParams::PromptFlow::Node::Data,
2111
+ position:
2112
+ Revox::AssistantUpdateParams::PromptFlow::Node::Position,
2113
+ type: Symbol
2114
+ }
2115
+ )
2116
+ end
2117
+ def to_hash
2118
+ end
2119
+
2120
+ class Data < Revox::Internal::Type::BaseModel
2121
+ OrHash =
2122
+ T.type_alias do
2123
+ T.any(
2124
+ Revox::AssistantUpdateParams::PromptFlow::Node::Data,
2125
+ Revox::Internal::AnyHash
2126
+ )
2127
+ end
2128
+
2129
+ sig { returns(String) }
2130
+ attr_accessor :body
2131
+
2132
+ sig { returns(String) }
2133
+ attr_accessor :title
2134
+
2135
+ sig do
2136
+ params(body: String, title: String).returns(T.attached_class)
2137
+ end
2138
+ def self.new(body:, title:)
2139
+ end
2140
+
2141
+ sig { override.returns({ body: String, title: String }) }
2142
+ def to_hash
2143
+ end
2144
+ end
2145
+
2146
+ class Position < Revox::Internal::Type::BaseModel
2147
+ OrHash =
2148
+ T.type_alias do
2149
+ T.any(
2150
+ Revox::AssistantUpdateParams::PromptFlow::Node::Position,
2151
+ Revox::Internal::AnyHash
2152
+ )
2153
+ end
2154
+
2155
+ sig { returns(Float) }
2156
+ attr_accessor :x
2157
+
2158
+ sig { returns(Float) }
2159
+ attr_accessor :y_
2160
+
2161
+ sig { params(x: Float, y_: Float).returns(T.attached_class) }
2162
+ def self.new(x:, y_:)
2163
+ end
2164
+
2165
+ sig { override.returns({ x: Float, y_: Float }) }
2166
+ def to_hash
2167
+ end
704
2168
  end
2169
+ end
2170
+ end
2171
+
2172
+ class Slack < Revox::Internal::Type::BaseModel
2173
+ OrHash =
2174
+ T.type_alias do
2175
+ T.any(Revox::AssistantUpdateParams::Slack, Revox::Internal::AnyHash)
2176
+ end
2177
+
2178
+ # The Slack channel ID where the notification will be posted.
2179
+ sig { returns(String) }
2180
+ attr_accessor :channel_id
2181
+
2182
+ # The Nango connection ID linking the org's Slack workspace to Revox.
2183
+ sig { returns(String) }
2184
+ attr_accessor :connection_id
2185
+
2186
+ # Which call outcomes trigger a Slack notification (e.g. ['interested', 'none']).
2187
+ # Use 'none' to notify when outcome is null.
2188
+ sig do
2189
+ returns(
2190
+ T::Array[Revox::AssistantUpdateParams::Slack::Outcome::OrSymbol]
2191
+ )
2192
+ end
2193
+ attr_accessor :outcomes
2194
+
2195
+ # Human-readable Slack channel name, cached for display in the UI.
2196
+ sig { returns(T.nilable(String)) }
2197
+ attr_accessor :channel_name
2198
+
2199
+ # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2200
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2201
+ # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2202
+ # prompt_variables and structured_output keys. When null/empty a default template
2203
+ # is used.
2204
+ sig { returns(T.nilable(String)) }
2205
+ attr_accessor :template
2206
+
2207
+ # Slack notification config. When set, posts a message to the chosen channel after
2208
+ # a call ends with one of the configured outcomes.
2209
+ sig do
2210
+ params(
2211
+ channel_id: String,
2212
+ connection_id: String,
2213
+ outcomes:
2214
+ T::Array[Revox::AssistantUpdateParams::Slack::Outcome::OrSymbol],
2215
+ channel_name: T.nilable(String),
2216
+ template: T.nilable(String)
2217
+ ).returns(T.attached_class)
2218
+ end
2219
+ def self.new(
2220
+ # The Slack channel ID where the notification will be posted.
2221
+ channel_id:,
2222
+ # The Nango connection ID linking the org's Slack workspace to Revox.
2223
+ connection_id:,
2224
+ # Which call outcomes trigger a Slack notification (e.g. ['interested', 'none']).
2225
+ # Use 'none' to notify when outcome is null.
2226
+ outcomes:,
2227
+ # Human-readable Slack channel name, cached for display in the UI.
2228
+ channel_name: nil,
2229
+ # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2230
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2231
+ # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2232
+ # prompt_variables and structured_output keys. When null/empty a default template
2233
+ # is used.
2234
+ template: nil
2235
+ )
2236
+ end
2237
+
2238
+ sig do
2239
+ override.returns(
2240
+ {
2241
+ channel_id: String,
2242
+ connection_id: String,
2243
+ outcomes:
2244
+ T::Array[
2245
+ Revox::AssistantUpdateParams::Slack::Outcome::OrSymbol
2246
+ ],
2247
+ channel_name: T.nilable(String),
2248
+ template: T.nilable(String)
2249
+ }
2250
+ )
2251
+ end
2252
+ def to_hash
2253
+ end
2254
+
2255
+ module Outcome
2256
+ extend Revox::Internal::Type::Enum
2257
+
2258
+ TaggedSymbol =
2259
+ T.type_alias do
2260
+ T.all(Symbol, Revox::AssistantUpdateParams::Slack::Outcome)
2261
+ end
2262
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2263
+
2264
+ NOT_INTERESTED =
2265
+ T.let(
2266
+ :not_interested,
2267
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2268
+ )
2269
+ INTERESTED =
2270
+ T.let(
2271
+ :interested,
2272
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2273
+ )
2274
+ COMPLETED =
2275
+ T.let(
2276
+ :completed,
2277
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2278
+ )
2279
+ REQUESTED_CALLBACK_LATER =
2280
+ T.let(
2281
+ :requested_callback_later,
2282
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2283
+ )
2284
+ REQUESTED_CALLBACK_NEW_NUMBER =
2285
+ T.let(
2286
+ :requested_callback_new_number,
2287
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2288
+ )
2289
+ DO_NOT_CONTACT =
2290
+ T.let(
2291
+ :do_not_contact,
2292
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2293
+ )
2294
+ AI_AVERSE =
2295
+ T.let(
2296
+ :ai_averse,
2297
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2298
+ )
2299
+ NONE =
2300
+ T.let(
2301
+ :none,
2302
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2303
+ )
705
2304
 
706
2305
  sig do
707
2306
  override.returns(
708
- {
709
- openrouter_model_id: String,
710
- openrouter_provider: String,
711
- type: Symbol
712
- }
2307
+ T::Array[
2308
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2309
+ ]
713
2310
  )
714
2311
  end
715
- def to_hash
2312
+ def self.values
716
2313
  end
717
2314
  end
718
-
719
- sig do
720
- override.returns(
721
- T::Array[Revox::AssistantUpdateParams::LlmModel::Variants]
722
- )
723
- end
724
- def self.variants
725
- end
726
2315
  end
727
2316
 
728
2317
  class StructuredOutputConfig < Revox::Internal::Type::BaseModel
@@ -848,6 +2437,190 @@ module Revox
848
2437
  end
849
2438
  end
850
2439
 
2440
+ class SttContext < Revox::Internal::Type::BaseModel
2441
+ OrHash =
2442
+ T.type_alias do
2443
+ T.any(
2444
+ Revox::AssistantUpdateParams::SttContext,
2445
+ Revox::Internal::AnyHash
2446
+ )
2447
+ end
2448
+
2449
+ sig do
2450
+ returns(T::Array[Revox::AssistantUpdateParams::SttContext::General])
2451
+ end
2452
+ attr_accessor :general
2453
+
2454
+ sig { returns(T::Array[String]) }
2455
+ attr_accessor :terms
2456
+
2457
+ # Assistant-level speech-to-text context: structured `general` key/value pairs
2458
+ # plus a list of domain `terms`. Prompt-derived context is merged in without
2459
+ # replacing existing entries.
2460
+ sig do
2461
+ params(
2462
+ general:
2463
+ T::Array[
2464
+ Revox::AssistantUpdateParams::SttContext::General::OrHash
2465
+ ],
2466
+ terms: T::Array[String]
2467
+ ).returns(T.attached_class)
2468
+ end
2469
+ def self.new(general:, terms:)
2470
+ end
2471
+
2472
+ sig do
2473
+ override.returns(
2474
+ {
2475
+ general:
2476
+ T::Array[Revox::AssistantUpdateParams::SttContext::General],
2477
+ terms: T::Array[String]
2478
+ }
2479
+ )
2480
+ end
2481
+ def to_hash
2482
+ end
2483
+
2484
+ class General < Revox::Internal::Type::BaseModel
2485
+ OrHash =
2486
+ T.type_alias do
2487
+ T.any(
2488
+ Revox::AssistantUpdateParams::SttContext::General,
2489
+ Revox::Internal::AnyHash
2490
+ )
2491
+ end
2492
+
2493
+ sig { returns(String) }
2494
+ attr_accessor :key
2495
+
2496
+ sig { returns(String) }
2497
+ attr_accessor :value
2498
+
2499
+ sig { params(key: String, value: String).returns(T.attached_class) }
2500
+ def self.new(key:, value:)
2501
+ end
2502
+
2503
+ sig { override.returns({ key: String, value: String }) }
2504
+ def to_hash
2505
+ end
2506
+ end
2507
+ end
2508
+
2509
+ # Transcriber (speech-to-text) model. Defaults to the newest Soniox realtime model
2510
+ # when omitted.
2511
+ module SttModel
2512
+ extend Revox::Internal::Type::Enum
2513
+
2514
+ TaggedSymbol =
2515
+ T.type_alias { T.all(Symbol, Revox::AssistantUpdateParams::SttModel) }
2516
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2517
+
2518
+ STT_RT_V4 =
2519
+ T.let(
2520
+ :"stt-rt-v4",
2521
+ Revox::AssistantUpdateParams::SttModel::TaggedSymbol
2522
+ )
2523
+ STT_RT_V5 =
2524
+ T.let(
2525
+ :"stt-rt-v5",
2526
+ Revox::AssistantUpdateParams::SttModel::TaggedSymbol
2527
+ )
2528
+
2529
+ sig do
2530
+ override.returns(
2531
+ T::Array[Revox::AssistantUpdateParams::SttModel::TaggedSymbol]
2532
+ )
2533
+ end
2534
+ def self.values
2535
+ end
2536
+ end
2537
+
2538
+ # Audio clip to play while the agent is processing a response. One of the built-in
2539
+ # LiveKit audio clips; null/omitted disables it.
2540
+ module ThinkingSound
2541
+ extend Revox::Internal::Type::Enum
2542
+
2543
+ TaggedSymbol =
2544
+ T.type_alias do
2545
+ T.all(Symbol, Revox::AssistantUpdateParams::ThinkingSound)
2546
+ end
2547
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2548
+
2549
+ CITY_AMBIENCE_OGG =
2550
+ T.let(
2551
+ :"city-ambience.ogg",
2552
+ Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol
2553
+ )
2554
+ FOREST_AMBIENCE_OGG =
2555
+ T.let(
2556
+ :"forest-ambience.ogg",
2557
+ Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol
2558
+ )
2559
+ OFFICE_AMBIENCE_OGG =
2560
+ T.let(
2561
+ :"office-ambience.ogg",
2562
+ Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol
2563
+ )
2564
+ CROWDED_ROOM_OGG =
2565
+ T.let(
2566
+ :"crowded-room.ogg",
2567
+ Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol
2568
+ )
2569
+ KEYBOARD_TYPING_OGG =
2570
+ T.let(
2571
+ :"keyboard-typing.ogg",
2572
+ Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol
2573
+ )
2574
+ KEYBOARD_TYPING2_OGG =
2575
+ T.let(
2576
+ :"keyboard-typing2.ogg",
2577
+ Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol
2578
+ )
2579
+ HOLD_MUSIC_OGG =
2580
+ T.let(
2581
+ :"hold_music.ogg",
2582
+ Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol
2583
+ )
2584
+
2585
+ sig do
2586
+ override.returns(
2587
+ T::Array[Revox::AssistantUpdateParams::ThinkingSound::TaggedSymbol]
2588
+ )
2589
+ end
2590
+ def self.values
2591
+ end
2592
+ end
2593
+
2594
+ # Assistant kind. 'standalone' (default) is a normal assistant, 'multi-step'
2595
+ # orchestrates a flow of sub-assistants, 'sub-assistant' is a step inside a
2596
+ # multi-step flow (hidden from the assistants list). Flow transitions are managed
2597
+ # via the /assistants/:id/edges endpoints, not on the assistant itself.
2598
+ module Type
2599
+ extend Revox::Internal::Type::Enum
2600
+
2601
+ TaggedSymbol =
2602
+ T.type_alias { T.all(Symbol, Revox::AssistantUpdateParams::Type) }
2603
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2604
+
2605
+ STANDALONE =
2606
+ T.let(:standalone, Revox::AssistantUpdateParams::Type::TaggedSymbol)
2607
+ MULTI_STEP =
2608
+ T.let(:"multi-step", Revox::AssistantUpdateParams::Type::TaggedSymbol)
2609
+ SUB_ASSISTANT =
2610
+ T.let(
2611
+ :"sub-assistant",
2612
+ Revox::AssistantUpdateParams::Type::TaggedSymbol
2613
+ )
2614
+
2615
+ sig do
2616
+ override.returns(
2617
+ T::Array[Revox::AssistantUpdateParams::Type::TaggedSymbol]
2618
+ )
2619
+ end
2620
+ def self.values
2621
+ end
2622
+ end
2623
+
851
2624
  class Voice < Revox::Internal::Type::BaseModel
852
2625
  OrHash =
853
2626
  T.type_alias do
@@ -862,6 +2635,22 @@ module Revox
862
2635
  sig { returns(Revox::AssistantUpdateParams::Voice::Provider::OrSymbol) }
863
2636
  attr_accessor :provider
864
2637
 
2638
+ # Cartesia TTS model (Cartesia only). Defaults to sonic-3 when omitted. Ignored
2639
+ # for other providers.
2640
+ sig do
2641
+ returns(
2642
+ T.nilable(Revox::AssistantUpdateParams::Voice::Model::OrSymbol)
2643
+ )
2644
+ end
2645
+ attr_reader :model
2646
+
2647
+ sig do
2648
+ params(
2649
+ model: Revox::AssistantUpdateParams::Voice::Model::OrSymbol
2650
+ ).void
2651
+ end
2652
+ attr_writer :model
2653
+
865
2654
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
866
2655
  # 0.7–1.2. Default is 1.0.
867
2656
  sig { returns(T.nilable(Float)) }
@@ -870,13 +2659,23 @@ module Revox
870
2659
  sig { params(speed: Float).void }
871
2660
  attr_writer :speed
872
2661
 
2662
+ # Volume of the voice (Cartesia only). 0.5–2.0, default 1.0. Ignored for other
2663
+ # providers.
2664
+ sig { returns(T.nilable(Float)) }
2665
+ attr_reader :volume
2666
+
2667
+ sig { params(volume: Float).void }
2668
+ attr_writer :volume
2669
+
873
2670
  # The voice to use for the call. You can get the list of voices using the /voices
874
2671
  # endpoint
875
2672
  sig do
876
2673
  params(
877
2674
  id: String,
878
2675
  provider: Revox::AssistantUpdateParams::Voice::Provider::OrSymbol,
879
- speed: Float
2676
+ model: Revox::AssistantUpdateParams::Voice::Model::OrSymbol,
2677
+ speed: Float,
2678
+ volume: Float
880
2679
  ).returns(T.attached_class)
881
2680
  end
882
2681
  def self.new(
@@ -884,9 +2683,15 @@ module Revox
884
2683
  id:,
885
2684
  # The provider of the voice.
886
2685
  provider:,
2686
+ # Cartesia TTS model (Cartesia only). Defaults to sonic-3 when omitted. Ignored
2687
+ # for other providers.
2688
+ model: nil,
887
2689
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
888
2690
  # 0.7–1.2. Default is 1.0.
889
- speed: nil
2691
+ speed: nil,
2692
+ # Volume of the voice (Cartesia only). 0.5–2.0, default 1.0. Ignored for other
2693
+ # providers.
2694
+ volume: nil
890
2695
  )
891
2696
  end
892
2697
 
@@ -895,7 +2700,9 @@ module Revox
895
2700
  {
896
2701
  id: String,
897
2702
  provider: Revox::AssistantUpdateParams::Voice::Provider::OrSymbol,
898
- speed: Float
2703
+ model: Revox::AssistantUpdateParams::Voice::Model::OrSymbol,
2704
+ speed: Float,
2705
+ volume: Float
899
2706
  }
900
2707
  )
901
2708
  end
@@ -933,6 +2740,234 @@ module Revox
933
2740
  def self.values
934
2741
  end
935
2742
  end
2743
+
2744
+ # Cartesia TTS model (Cartesia only). Defaults to sonic-3 when omitted. Ignored
2745
+ # for other providers.
2746
+ module Model
2747
+ extend Revox::Internal::Type::Enum
2748
+
2749
+ TaggedSymbol =
2750
+ T.type_alias do
2751
+ T.all(Symbol, Revox::AssistantUpdateParams::Voice::Model)
2752
+ end
2753
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2754
+
2755
+ SONIC_3 =
2756
+ T.let(
2757
+ :"sonic-3",
2758
+ Revox::AssistantUpdateParams::Voice::Model::TaggedSymbol
2759
+ )
2760
+ SONIC_3_5 =
2761
+ T.let(
2762
+ :"sonic-3.5",
2763
+ Revox::AssistantUpdateParams::Voice::Model::TaggedSymbol
2764
+ )
2765
+
2766
+ sig do
2767
+ override.returns(
2768
+ T::Array[Revox::AssistantUpdateParams::Voice::Model::TaggedSymbol]
2769
+ )
2770
+ end
2771
+ def self.values
2772
+ end
2773
+ end
2774
+ end
2775
+
2776
+ class Zoho < Revox::Internal::Type::BaseModel
2777
+ OrHash =
2778
+ T.type_alias do
2779
+ T.any(Revox::AssistantUpdateParams::Zoho, Revox::Internal::AnyHash)
2780
+ end
2781
+
2782
+ # The Nango connection ID linking the org's Zoho CRM account to Revox.
2783
+ sig { returns(String) }
2784
+ attr_accessor :connection_id
2785
+
2786
+ # Maps extracted call fields (structured_output / prompt variables) onto Zoho
2787
+ # field API names on the upserted record.
2788
+ sig do
2789
+ returns(T::Array[Revox::AssistantUpdateParams::Zoho::FieldMapping])
2790
+ end
2791
+ attr_accessor :field_mapping
2792
+
2793
+ # When true, also log the call as a record in Zoho's Calls module (related to the
2794
+ # upserted prospect via Who_Id).
2795
+ sig { returns(T::Boolean) }
2796
+ attr_accessor :log_call_activity
2797
+
2798
+ # Zoho module the prospect record is upserted into (e.g. 'Leads' or 'Contacts').
2799
+ sig { returns(String) }
2800
+ attr_accessor :module_
2801
+
2802
+ # Which call outcomes trigger the Zoho push (e.g. ['interested', 'none']). Use
2803
+ # 'none' to push when outcome is null.
2804
+ sig do
2805
+ returns(
2806
+ T::Array[Revox::AssistantUpdateParams::Zoho::Outcome::OrSymbol]
2807
+ )
2808
+ end
2809
+ attr_accessor :outcomes
2810
+
2811
+ # Optional Note body template. Supports {{summary}}, {{outcome}}, {{phone}},
2812
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{transcript}}, plus
2813
+ # prompt_variables and structured_output keys. When null/empty a default note
2814
+ # (outcome + summary + auto-listed extracted fields) is used.
2815
+ sig { returns(T.nilable(String)) }
2816
+ attr_accessor :template
2817
+
2818
+ # Zoho CRM integration config. When set, upserts the prospect (keyed on phone)
2819
+ # into the chosen module and attaches a Note with the call summary after a call
2820
+ # ends with one of the configured outcomes.
2821
+ sig do
2822
+ params(
2823
+ connection_id: String,
2824
+ field_mapping:
2825
+ T::Array[
2826
+ Revox::AssistantUpdateParams::Zoho::FieldMapping::OrHash
2827
+ ],
2828
+ log_call_activity: T::Boolean,
2829
+ module_: String,
2830
+ outcomes:
2831
+ T::Array[Revox::AssistantUpdateParams::Zoho::Outcome::OrSymbol],
2832
+ template: T.nilable(String)
2833
+ ).returns(T.attached_class)
2834
+ end
2835
+ def self.new(
2836
+ # The Nango connection ID linking the org's Zoho CRM account to Revox.
2837
+ connection_id:,
2838
+ # Maps extracted call fields (structured_output / prompt variables) onto Zoho
2839
+ # field API names on the upserted record.
2840
+ field_mapping:,
2841
+ # When true, also log the call as a record in Zoho's Calls module (related to the
2842
+ # upserted prospect via Who_Id).
2843
+ log_call_activity:,
2844
+ # Zoho module the prospect record is upserted into (e.g. 'Leads' or 'Contacts').
2845
+ module_:,
2846
+ # Which call outcomes trigger the Zoho push (e.g. ['interested', 'none']). Use
2847
+ # 'none' to push when outcome is null.
2848
+ outcomes:,
2849
+ # Optional Note body template. Supports {{summary}}, {{outcome}}, {{phone}},
2850
+ # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{transcript}}, plus
2851
+ # prompt_variables and structured_output keys. When null/empty a default note
2852
+ # (outcome + summary + auto-listed extracted fields) is used.
2853
+ template: nil
2854
+ )
2855
+ end
2856
+
2857
+ sig do
2858
+ override.returns(
2859
+ {
2860
+ connection_id: String,
2861
+ field_mapping:
2862
+ T::Array[Revox::AssistantUpdateParams::Zoho::FieldMapping],
2863
+ log_call_activity: T::Boolean,
2864
+ module_: String,
2865
+ outcomes:
2866
+ T::Array[Revox::AssistantUpdateParams::Zoho::Outcome::OrSymbol],
2867
+ template: T.nilable(String)
2868
+ }
2869
+ )
2870
+ end
2871
+ def to_hash
2872
+ end
2873
+
2874
+ class FieldMapping < Revox::Internal::Type::BaseModel
2875
+ OrHash =
2876
+ T.type_alias do
2877
+ T.any(
2878
+ Revox::AssistantUpdateParams::Zoho::FieldMapping,
2879
+ Revox::Internal::AnyHash
2880
+ )
2881
+ end
2882
+
2883
+ # Source key to read from the call: a structured_output field name, falling back
2884
+ # to a prompt variable of the same name.
2885
+ sig { returns(String) }
2886
+ attr_accessor :source
2887
+
2888
+ # Destination Zoho field API name on the upserted record (e.g. 'Email', 'Company',
2889
+ # or a custom 'Budget\_\_c').
2890
+ sig { returns(String) }
2891
+ attr_accessor :zoho_field
2892
+
2893
+ sig do
2894
+ params(source: String, zoho_field: String).returns(T.attached_class)
2895
+ end
2896
+ def self.new(
2897
+ # Source key to read from the call: a structured_output field name, falling back
2898
+ # to a prompt variable of the same name.
2899
+ source:,
2900
+ # Destination Zoho field API name on the upserted record (e.g. 'Email', 'Company',
2901
+ # or a custom 'Budget\_\_c').
2902
+ zoho_field:
2903
+ )
2904
+ end
2905
+
2906
+ sig { override.returns({ source: String, zoho_field: String }) }
2907
+ def to_hash
2908
+ end
2909
+ end
2910
+
2911
+ module Outcome
2912
+ extend Revox::Internal::Type::Enum
2913
+
2914
+ TaggedSymbol =
2915
+ T.type_alias do
2916
+ T.all(Symbol, Revox::AssistantUpdateParams::Zoho::Outcome)
2917
+ end
2918
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
2919
+
2920
+ NOT_INTERESTED =
2921
+ T.let(
2922
+ :not_interested,
2923
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2924
+ )
2925
+ INTERESTED =
2926
+ T.let(
2927
+ :interested,
2928
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2929
+ )
2930
+ COMPLETED =
2931
+ T.let(
2932
+ :completed,
2933
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2934
+ )
2935
+ REQUESTED_CALLBACK_LATER =
2936
+ T.let(
2937
+ :requested_callback_later,
2938
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2939
+ )
2940
+ REQUESTED_CALLBACK_NEW_NUMBER =
2941
+ T.let(
2942
+ :requested_callback_new_number,
2943
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2944
+ )
2945
+ DO_NOT_CONTACT =
2946
+ T.let(
2947
+ :do_not_contact,
2948
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2949
+ )
2950
+ AI_AVERSE =
2951
+ T.let(
2952
+ :ai_averse,
2953
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2954
+ )
2955
+ NONE =
2956
+ T.let(
2957
+ :none,
2958
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2959
+ )
2960
+
2961
+ sig do
2962
+ override.returns(
2963
+ T::Array[
2964
+ Revox::AssistantUpdateParams::Zoho::Outcome::TaggedSymbol
2965
+ ]
2966
+ )
2967
+ end
2968
+ def self.values
2969
+ end
2970
+ end
936
2971
  end
937
2972
  end
938
2973
  end