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
@@ -11,8 +11,29 @@ module Revox
11
11
  T.any(Revox::AssistantUpdateParams, Revox::Internal::AnyHash)
12
12
  end
13
13
 
14
- # The background sound to play during the call. Useful to give the impression that
15
- # your AI agent is in an office, in the street, or anywhere else you want.
14
+ sig { returns(String) }
15
+ attr_accessor :id
16
+
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.
16
37
  sig do
17
38
  returns(
18
39
  T.nilable(Revox::AssistantUpdateParams::BackgroundSound::OrSymbol)
@@ -20,6 +41,13 @@ module Revox
20
41
  end
21
42
  attr_accessor :background_sound
22
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
+
23
51
  sig { returns(T.nilable(Revox::AssistantUpdateParams::Calendly)) }
24
52
  attr_reader :calendly
25
53
 
@@ -43,6 +71,56 @@ module Revox
43
71
  end
44
72
  attr_writer :call_retry_config
45
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
+
46
124
  # Optional message to say when the agent decides to end the call.
47
125
  sig { returns(T.nilable(String)) }
48
126
  attr_reader :end_of_call_sentence
@@ -97,6 +175,21 @@ module Revox
97
175
  end
98
176
  attr_writer :first_sentence_mode
99
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
+
100
193
  # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
101
194
  # skip turns to navigate phone menus.
102
195
  sig { returns(T.nilable(T::Boolean)) }
@@ -110,7 +203,9 @@ module Revox
110
203
  T.nilable(
111
204
  T.any(
112
205
  Revox::AssistantUpdateParams::LlmModel::UnionMember0,
113
- Revox::AssistantUpdateParams::LlmModel::UnionMember1
206
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1,
207
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2,
208
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3
114
209
  )
115
210
  )
116
211
  )
@@ -122,12 +217,19 @@ module Revox
122
217
  llm_model:
123
218
  T.any(
124
219
  Revox::AssistantUpdateParams::LlmModel::UnionMember0::OrHash,
125
- Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash
220
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash,
221
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2::OrHash,
222
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::OrHash
126
223
  )
127
224
  ).void
128
225
  end
129
226
  attr_writer :llm_model
130
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
+
131
233
  # The maximum duration of the call in seconds. This is the maximum time the call
132
234
  # will be allowed to run.
133
235
  sig { returns(T.nilable(Float)) }
@@ -136,12 +238,29 @@ module Revox
136
238
  sig { params(max_call_duration_secs: Float).void }
137
239
  attr_writer :max_call_duration_secs
138
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
+
139
247
  sig { returns(T.nilable(String)) }
140
248
  attr_reader :name
141
249
 
142
250
  sig { params(name: String).void }
143
251
  attr_writer :name
144
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
+
145
264
  # The prompt to use for the call. This will be given to the LLM (gpt-4.1)
146
265
  sig { returns(T.nilable(String)) }
147
266
  attr_reader :prompt
@@ -149,6 +268,46 @@ module Revox
149
268
  sig { params(prompt: String).void }
150
269
  attr_writer :prompt
151
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
+
152
311
  # The structured output config to use for the call. This is used to extract the
153
312
  # data from the call (like email, name, company name, etc.).
154
313
  sig do
@@ -170,11 +329,77 @@ module Revox
170
329
  end
171
330
  attr_writer :structured_output_config
172
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
+
173
388
  # Phone number to transfer calls to when users request to speak to a human agent
174
389
  # in E.164 format (e.g. +1234567890).
175
390
  sig { returns(T.nilable(String)) }
176
391
  attr_accessor :transfer_phone_number
177
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
+
178
403
  # The voice to use for the call. You can get the list of voices using the /voices
179
404
  # endpoint
180
405
  sig { returns(T.nilable(Revox::AssistantUpdateParams::Voice)) }
@@ -188,6 +413,17 @@ module Revox
188
413
  sig { returns(T.nilable(String)) }
189
414
  attr_accessor :voicemail_message
190
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
+
191
427
  # The webhook URL to call when the call is completed.
192
428
  sig { returns(T.nilable(String)) }
193
429
  attr_reader :webhook_url
@@ -195,47 +431,133 @@ module Revox
195
431
  sig { params(webhook_url: String).void }
196
432
  attr_writer :webhook_url
197
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
+
198
445
  sig do
199
446
  params(
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),
200
455
  background_sound:
201
456
  T.nilable(Revox::AssistantUpdateParams::BackgroundSound::OrSymbol),
457
+ background_sound_volume: Float,
202
458
  calendly: T.nilable(Revox::AssistantUpdateParams::Calendly::OrHash),
203
459
  call_retry_config:
204
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
+ ),
205
475
  end_of_call_sentence: String,
206
476
  faq_items: T::Array[Revox::AssistantUpdateParams::FaqItem::OrHash],
207
477
  first_sentence: String,
208
478
  first_sentence_delay_ms: Integer,
209
479
  first_sentence_mode:
210
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
+ ),
211
486
  ivr_navigation_enabled: T::Boolean,
212
487
  llm_model:
213
488
  T.any(
214
489
  Revox::AssistantUpdateParams::LlmModel::UnionMember0::OrHash,
215
- Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash
490
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1::OrHash,
491
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2::OrHash,
492
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::OrHash
216
493
  ),
494
+ logo_url: T.nilable(String),
217
495
  max_call_duration_secs: Float,
496
+ max_duration_end_message: T.nilable(String),
218
497
  name: String,
498
+ position: T.nilable(Revox::AssistantUpdateParams::Position::OrHash),
219
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),
220
505
  structured_output_config:
221
506
  T::Array[
222
507
  Revox::AssistantUpdateParams::StructuredOutputConfig::OrHash
223
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,
224
517
  transfer_phone_number: T.nilable(String),
518
+ type: Revox::AssistantUpdateParams::Type::OrSymbol,
225
519
  voice: Revox::AssistantUpdateParams::Voice::OrHash,
226
520
  voicemail_message: T.nilable(String),
521
+ voicemail_sms_prompt: T.nilable(String),
522
+ warm_transfer_summary_instructions: T.nilable(String),
227
523
  webhook_url: String,
524
+ zoho: T.nilable(Revox::AssistantUpdateParams::Zoho::OrHash),
228
525
  request_options: Revox::RequestOptions::OrHash
229
526
  ).returns(T.attached_class)
230
527
  end
231
528
  def self.new(
232
- # The background sound to play during the call. Useful to give the impression that
233
- # your AI agent is in an office, in the street, or anywhere else you want.
529
+ id:,
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.
234
538
  background_sound: nil,
539
+ # Volume of the ambient background sound (0 = silent, 1 = max).
540
+ background_sound_volume: nil,
235
541
  calendly: nil,
236
542
  # Configuration for call retry behavior including time windows, delays, and max
237
543
  # iterations. If not provided, defaults will be used.
238
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,
239
561
  # Optional message to say when the agent decides to end the call.
240
562
  end_of_call_sentence: nil,
241
563
  # FAQ items to associate with this assistant. When provided, replaces all existing
@@ -250,30 +572,95 @@ module Revox
250
572
  # first_sentence will be spoken exactly as provided. "none" means the agent will
251
573
  # not speak first and will wait for the user.
252
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,
253
582
  # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
254
583
  # skip turns to navigate phone menus.
255
584
  ivr_navigation_enabled: nil,
256
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,
257
589
  # The maximum duration of the call in seconds. This is the maximum time the call
258
590
  # will be allowed to run.
259
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,
260
596
  name: nil,
597
+ # Canvas position of this assistant's node in its multi-step flow editor.
598
+ position: nil,
261
599
  # The prompt to use for the call. This will be given to the LLM (gpt-4.1)
262
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,
263
615
  # The structured output config to use for the call. This is used to extract the
264
616
  # data from the call (like email, name, company name, etc.).
265
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,
266
637
  # Phone number to transfer calls to when users request to speak to a human agent
267
638
  # in E.164 format (e.g. +1234567890).
268
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,
269
645
  # The voice to use for the call. You can get the list of voices using the /voices
270
646
  # endpoint
271
647
  voice: nil,
272
648
  # If set, when voicemail is detected the agent will speak this message then hang
273
649
  # up; if null, hang up immediately.
274
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,
275
658
  # The webhook URL to call when the call is completed.
276
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,
277
664
  request_options: {}
278
665
  )
279
666
  end
@@ -281,33 +668,79 @@ module Revox
281
668
  sig do
282
669
  override.returns(
283
670
  {
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),
284
679
  background_sound:
285
680
  T.nilable(
286
681
  Revox::AssistantUpdateParams::BackgroundSound::OrSymbol
287
682
  ),
683
+ background_sound_volume: Float,
288
684
  calendly: T.nilable(Revox::AssistantUpdateParams::Calendly),
289
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
+ ),
290
698
  end_of_call_sentence: String,
291
699
  faq_items: T::Array[Revox::AssistantUpdateParams::FaqItem],
292
700
  first_sentence: String,
293
701
  first_sentence_delay_ms: Integer,
294
702
  first_sentence_mode:
295
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
+ ),
296
709
  ivr_navigation_enabled: T::Boolean,
297
710
  llm_model:
298
711
  T.any(
299
712
  Revox::AssistantUpdateParams::LlmModel::UnionMember0,
300
- Revox::AssistantUpdateParams::LlmModel::UnionMember1
713
+ Revox::AssistantUpdateParams::LlmModel::UnionMember1,
714
+ Revox::AssistantUpdateParams::LlmModel::UnionMember2,
715
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3
301
716
  ),
717
+ logo_url: T.nilable(String),
302
718
  max_call_duration_secs: Float,
719
+ max_duration_end_message: T.nilable(String),
303
720
  name: String,
721
+ position: T.nilable(Revox::AssistantUpdateParams::Position),
304
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),
305
727
  structured_output_config:
306
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,
307
736
  transfer_phone_number: T.nilable(String),
737
+ type: Revox::AssistantUpdateParams::Type::OrSymbol,
308
738
  voice: Revox::AssistantUpdateParams::Voice,
309
739
  voicemail_message: T.nilable(String),
740
+ voicemail_sms_prompt: T.nilable(String),
741
+ warm_transfer_summary_instructions: T.nilable(String),
310
742
  webhook_url: String,
743
+ zoho: T.nilable(Revox::AssistantUpdateParams::Zoho),
311
744
  request_options: Revox::RequestOptions
312
745
  }
313
746
  )
@@ -315,8 +748,68 @@ module Revox
315
748
  def to_hash
316
749
  end
317
750
 
318
- # The background sound to play during the call. Useful to give the impression that
319
- # 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.
320
813
  module BackgroundSound
321
814
  extend Revox::Internal::Type::Enum
322
815
 
@@ -391,6 +884,24 @@ module Revox
391
884
  )
392
885
  end
393
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
+
394
905
  sig do
395
906
  returns(
396
907
  T::Array[
@@ -414,6 +925,11 @@ module Revox
414
925
  # iterations. If not provided, defaults will be used.
415
926
  sig do
416
927
  params(
928
+ allowed_days:
929
+ T::Array[
930
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::OrSymbol
931
+ ],
932
+ call_twice_in_a_row: T::Boolean,
417
933
  calling_windows:
418
934
  T::Array[
419
935
  Revox::AssistantUpdateParams::CallRetryConfig::CallingWindow::OrHash
@@ -423,6 +939,14 @@ module Revox
423
939
  ).returns(T.attached_class)
424
940
  end
425
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:,
426
950
  calling_windows:,
427
951
  # Maximum number of call retry attempts. Default: 3.
428
952
  max_retry_attempts:,
@@ -436,6 +960,11 @@ module Revox
436
960
  sig do
437
961
  override.returns(
438
962
  {
963
+ allowed_days:
964
+ T::Array[
965
+ Revox::AssistantUpdateParams::CallRetryConfig::AllowedDay::OrSymbol
966
+ ],
967
+ call_twice_in_a_row: T::Boolean,
439
968
  calling_windows:
440
969
  T::Array[
441
970
  Revox::AssistantUpdateParams::CallRetryConfig::CallingWindow
@@ -448,6 +977,65 @@ module Revox
448
977
  def to_hash
449
978
  end
450
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
+
451
1039
  class CallingWindow < Revox::Internal::Type::BaseModel
452
1040
  OrHash =
453
1041
  T.type_alias do
@@ -508,54 +1096,498 @@ module Revox
508
1096
  end
509
1097
  end
510
1098
 
511
- class FaqItem < Revox::Internal::Type::BaseModel
1099
+ class CustomTool < Revox::Internal::Type::BaseModel
512
1100
  OrHash =
513
1101
  T.type_alias do
514
1102
  T.any(
515
- Revox::AssistantUpdateParams::FaqItem,
1103
+ Revox::AssistantUpdateParams::CustomTool,
516
1104
  Revox::Internal::AnyHash
517
1105
  )
518
1106
  end
519
1107
 
520
- sig { returns(String) }
521
- 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
522
1112
 
1113
+ # Human-readable description of what the tool does, used by the LLM to decide when
1114
+ # to call it
523
1115
  sig { returns(String) }
524
- attr_accessor :question
1116
+ attr_accessor :description
525
1117
 
1118
+ # HTTP headers to include in the request. Values support {{variable}} placeholders
526
1119
  sig do
527
- params(answer: String, question: String).returns(T.attached_class)
528
- end
529
- def self.new(answer:, question:)
1120
+ returns(T::Array[Revox::AssistantUpdateParams::CustomTool::Header])
530
1121
  end
1122
+ attr_accessor :headers
531
1123
 
532
- sig { override.returns({ answer: String, question: String }) }
533
- 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
+ )
534
1130
  end
535
- end
1131
+ attr_accessor :input_schema
536
1132
 
537
- # How the first sentence should be handled. "generated" means the LLM will
538
- # generate a response based on the first_sentence instruction. "static" means the
539
- # first_sentence will be spoken exactly as provided. "none" means the agent will
540
- # not speak first and will wait for the user.
541
- module FirstSentenceMode
542
- 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_
543
1138
 
544
- TaggedSymbol =
545
- T.type_alias do
546
- T.all(Symbol, Revox::AssistantUpdateParams::FirstSentenceMode)
547
- end
548
- 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
549
1142
 
550
- GENERATED =
551
- T.let(
552
- :generated,
553
- 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]
554
1148
  )
555
- STATIC =
556
- T.let(
557
- :static,
558
- 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
559
1591
  )
560
1592
  NONE =
561
1593
  T.let(
@@ -574,85 +1606,333 @@ module Revox
574
1606
  end
575
1607
  end
576
1608
 
577
- module LlmModel
578
- 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
579
1798
 
580
- Variants =
581
- T.type_alias do
582
- T.any(
583
- Revox::AssistantUpdateParams::LlmModel::UnionMember0,
584
- 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
+ }
585
1835
  )
586
1836
  end
1837
+ def to_hash
1838
+ end
1839
+ end
587
1840
 
588
- class UnionMember0 < Revox::Internal::Type::BaseModel
1841
+ class UnionMember3 < Revox::Internal::Type::BaseModel
589
1842
  OrHash =
590
1843
  T.type_alias do
591
1844
  T.any(
592
- Revox::AssistantUpdateParams::LlmModel::UnionMember0,
1845
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3,
593
1846
  Revox::Internal::AnyHash
594
1847
  )
595
1848
  end
596
1849
 
1850
+ # The provider to use from Realtime. eg: openai, google.
597
1851
  sig do
598
1852
  returns(
599
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol
1853
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::OrSymbol
600
1854
  )
601
1855
  end
602
- 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
603
1861
 
1862
+ # Use a model from Realtime.
604
1863
  sig { returns(Symbol) }
605
1864
  attr_accessor :type
606
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
+
607
1873
  sig do
608
1874
  params(
609
- name:
610
- 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,
611
1879
  type: Symbol
612
1880
  ).returns(T.attached_class)
613
1881
  end
614
- 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
+ )
615
1892
  end
616
1893
 
617
1894
  sig do
618
1895
  override.returns(
619
1896
  {
620
- name:
621
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::OrSymbol,
622
- type: Symbol
1897
+ provider:
1898
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::OrSymbol,
1899
+ realtime_model_id: String,
1900
+ type: Symbol,
1901
+ realtime_voice_id: String
623
1902
  }
624
1903
  )
625
1904
  end
626
1905
  def to_hash
627
1906
  end
628
1907
 
629
- module Name
1908
+ # The provider to use from Realtime. eg: openai, google.
1909
+ module Provider
630
1910
  extend Revox::Internal::Type::Enum
631
1911
 
632
1912
  TaggedSymbol =
633
1913
  T.type_alias do
634
1914
  T.all(
635
1915
  Symbol,
636
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name
1916
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider
637
1917
  )
638
1918
  end
639
1919
  OrSymbol = T.type_alias { T.any(Symbol, String) }
640
1920
 
641
- GPT_4_1 =
1921
+ OPENAI =
642
1922
  T.let(
643
- :"gpt-4.1",
644
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1923
+ :openai,
1924
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::TaggedSymbol
645
1925
  )
646
- MINISTRAL_3_8B_INSTRUCT =
1926
+ GOOGLE =
647
1927
  T.let(
648
- :"ministral-3-8b-instruct",
649
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1928
+ :google,
1929
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::TaggedSymbol
650
1930
  )
651
1931
 
652
1932
  sig do
653
1933
  override.returns(
654
1934
  T::Array[
655
- Revox::AssistantUpdateParams::LlmModel::UnionMember0::Name::TaggedSymbol
1935
+ Revox::AssistantUpdateParams::LlmModel::UnionMember3::Provider::TaggedSymbol
656
1936
  ]
657
1937
  )
658
1938
  end
@@ -661,64 +1941,377 @@ module Revox
661
1941
  end
662
1942
  end
663
1943
 
664
- 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
665
2023
  OrHash =
666
2024
  T.type_alias do
667
2025
  T.any(
668
- Revox::AssistantUpdateParams::LlmModel::UnionMember1,
2026
+ Revox::AssistantUpdateParams::PromptFlow::Edge,
669
2027
  Revox::Internal::AnyHash
670
2028
  )
671
2029
  end
672
2030
 
673
- # The model ID to use from OpenRouter. eg: openai/gpt-4.1
674
2031
  sig { returns(String) }
675
- attr_accessor :openrouter_model_id
2032
+ attr_accessor :id
676
2033
 
677
- # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
678
2034
  sig { returns(String) }
679
- 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
680
2089
 
681
- # Use a model from OpenRouter.
682
2090
  sig { returns(Symbol) }
683
2091
  attr_accessor :type
684
2092
 
685
2093
  sig do
686
2094
  params(
687
- openrouter_model_id: String,
688
- openrouter_provider: String,
2095
+ id: String,
2096
+ data:
2097
+ Revox::AssistantUpdateParams::PromptFlow::Node::Data::OrHash,
2098
+ position:
2099
+ Revox::AssistantUpdateParams::PromptFlow::Node::Position::OrHash,
689
2100
  type: Symbol
690
2101
  ).returns(T.attached_class)
691
2102
  end
692
- def self.new(
693
- # The model ID to use from OpenRouter. eg: openai/gpt-4.1
694
- openrouter_model_id:,
695
- # The provider to use from OpenRouter. eg: nebius, openai, azure, etc.
696
- openrouter_provider:,
697
- # Use a model from OpenRouter.
698
- type: :openrouter
699
- )
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
700
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
+ )
701
2304
 
702
2305
  sig do
703
2306
  override.returns(
704
- {
705
- openrouter_model_id: String,
706
- openrouter_provider: String,
707
- type: Symbol
708
- }
2307
+ T::Array[
2308
+ Revox::AssistantUpdateParams::Slack::Outcome::TaggedSymbol
2309
+ ]
709
2310
  )
710
2311
  end
711
- def to_hash
2312
+ def self.values
712
2313
  end
713
2314
  end
714
-
715
- sig do
716
- override.returns(
717
- T::Array[Revox::AssistantUpdateParams::LlmModel::Variants]
718
- )
719
- end
720
- def self.variants
721
- end
722
2315
  end
723
2316
 
724
2317
  class StructuredOutputConfig < Revox::Internal::Type::BaseModel
@@ -844,6 +2437,190 @@ module Revox
844
2437
  end
845
2438
  end
846
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
+
847
2624
  class Voice < Revox::Internal::Type::BaseModel
848
2625
  OrHash =
849
2626
  T.type_alias do
@@ -858,6 +2635,22 @@ module Revox
858
2635
  sig { returns(Revox::AssistantUpdateParams::Voice::Provider::OrSymbol) }
859
2636
  attr_accessor :provider
860
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
+
861
2654
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
862
2655
  # 0.7–1.2. Default is 1.0.
863
2656
  sig { returns(T.nilable(Float)) }
@@ -866,13 +2659,23 @@ module Revox
866
2659
  sig { params(speed: Float).void }
867
2660
  attr_writer :speed
868
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
+
869
2670
  # The voice to use for the call. You can get the list of voices using the /voices
870
2671
  # endpoint
871
2672
  sig do
872
2673
  params(
873
2674
  id: String,
874
2675
  provider: Revox::AssistantUpdateParams::Voice::Provider::OrSymbol,
875
- speed: Float
2676
+ model: Revox::AssistantUpdateParams::Voice::Model::OrSymbol,
2677
+ speed: Float,
2678
+ volume: Float
876
2679
  ).returns(T.attached_class)
877
2680
  end
878
2681
  def self.new(
@@ -880,9 +2683,15 @@ module Revox
880
2683
  id:,
881
2684
  # The provider of the voice.
882
2685
  provider:,
2686
+ # Cartesia TTS model (Cartesia only). Defaults to sonic-3 when omitted. Ignored
2687
+ # for other providers.
2688
+ model: nil,
883
2689
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
884
2690
  # 0.7–1.2. Default is 1.0.
885
- 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
886
2695
  )
887
2696
  end
888
2697
 
@@ -891,7 +2700,9 @@ module Revox
891
2700
  {
892
2701
  id: String,
893
2702
  provider: Revox::AssistantUpdateParams::Voice::Provider::OrSymbol,
894
- speed: Float
2703
+ model: Revox::AssistantUpdateParams::Voice::Model::OrSymbol,
2704
+ speed: Float,
2705
+ volume: Float
895
2706
  }
896
2707
  )
897
2708
  end
@@ -929,6 +2740,234 @@ module Revox
929
2740
  def self.values
930
2741
  end
931
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
932
2971
  end
933
2972
  end
934
2973
  end