revox 0.2.0 → 0.4.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 (208) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/README.md +38 -38
  4. data/lib/revox/client.rb +8 -0
  5. data/lib/revox/internal/type/base_model.rb +3 -3
  6. data/lib/revox/models/assistant_clone_params.rb +20 -0
  7. data/lib/revox/models/assistant_clone_response.rb +1616 -0
  8. data/lib/revox/models/assistant_create_params.rb +90 -66
  9. data/lib/revox/models/assistant_create_response.rb +87 -65
  10. data/lib/revox/models/assistant_list_response.rb +87 -65
  11. data/lib/revox/models/assistant_retrieve_response.rb +86 -65
  12. data/lib/revox/models/assistant_update_params.rb +90 -66
  13. data/lib/revox/models/assistant_update_response.rb +87 -65
  14. data/lib/revox/models/auth_status_retrieve_params.rb +14 -0
  15. data/lib/revox/models/auth_status_retrieve_response.rb +17 -0
  16. data/lib/revox/models/call_cancel_params.rb +20 -0
  17. data/lib/revox/models/call_cancel_response.rb +16 -0
  18. data/lib/revox/models/call_create_params.rb +117 -90
  19. data/lib/revox/models/call_create_response.rb +680 -90
  20. data/lib/revox/models/call_export_params.rb +203 -0
  21. data/lib/revox/models/call_export_response.rb +22 -0
  22. data/lib/revox/models/call_pause_params.rb +20 -0
  23. data/lib/revox/models/call_pause_response.rb +16 -0
  24. data/lib/revox/models/call_phone_history_params.rb +14 -0
  25. data/lib/revox/models/call_phone_history_response.rb +95 -0
  26. data/lib/revox/models/call_resume_params.rb +20 -0
  27. data/lib/revox/models/call_resume_response.rb +16 -0
  28. data/lib/revox/models/call_retrieve_response.rb +681 -90
  29. data/lib/revox/models/call_search_params.rb +169 -0
  30. data/lib/revox/models/call_search_response.rb +3694 -0
  31. data/lib/revox/models/campaign_create_params.rb +7 -57
  32. data/lib/revox/models/campaign_create_response.rb +108 -119
  33. data/lib/revox/models/campaign_get_rows_response.rb +682 -90
  34. data/lib/revox/models/campaign_list_response.rb +108 -119
  35. data/lib/revox/models/campaign_pause_params.rb +20 -0
  36. data/lib/revox/models/campaign_pause_response.rb +16 -0
  37. data/lib/revox/models/campaign_resume_params.rb +20 -0
  38. data/lib/revox/models/campaign_resume_response.rb +16 -0
  39. data/lib/revox/models/campaign_retrieve_response.rb +108 -119
  40. data/lib/revox/models/campaign_statistics_params.rb +20 -0
  41. data/lib/revox/models/campaign_statistics_response.rb +514 -0
  42. data/lib/revox/models/campaign_update_params.rb +165 -0
  43. data/lib/revox/models/campaign_update_response.rb +2019 -0
  44. data/lib/revox/models/phone_number_delete_params.rb +20 -0
  45. data/lib/revox/models/phone_number_delete_response.rb +16 -0
  46. data/lib/revox/models/phone_number_list_params.rb +14 -0
  47. data/lib/revox/models/phone_number_list_response.rb +1799 -0
  48. data/lib/revox/models/phone_number_update_params.rb +32 -0
  49. data/lib/revox/models/phone_number_update_response.rb +1799 -0
  50. data/lib/revox/models/user_retrieve_params.rb +14 -0
  51. data/lib/revox/models/user_retrieve_response.rb +99 -0
  52. data/lib/revox/models/voice_clone_params.rb +78 -0
  53. data/lib/revox/models/voice_clone_response.rb +40 -0
  54. data/lib/revox/models/voice_delete_params.rb +20 -0
  55. data/lib/revox/models/voice_delete_response.rb +16 -0
  56. data/lib/revox/models/voice_list_response.rb +1 -0
  57. data/lib/revox/models/voice_preview_params.rb +1 -0
  58. data/lib/revox/models/voice_retrieve_params.rb +1 -0
  59. data/lib/revox/models.rb +35 -1
  60. data/lib/revox/resources/assistants.rb +31 -10
  61. data/lib/revox/resources/auth_status.rb +32 -0
  62. data/lib/revox/resources/call.rb +149 -4
  63. data/lib/revox/resources/campaigns.rb +110 -11
  64. data/lib/revox/resources/phone_numbers.rb +74 -0
  65. data/lib/revox/resources/users.rb +17 -3
  66. data/lib/revox/resources/voices.rb +50 -0
  67. data/lib/revox/version.rb +1 -1
  68. data/lib/revox.rb +38 -5
  69. data/rbi/revox/client.rbi +6 -0
  70. data/rbi/revox/models/assistant_clone_params.rbi +33 -0
  71. data/rbi/revox/models/assistant_clone_response.rbi +3351 -0
  72. data/rbi/revox/models/assistant_create_params.rbi +148 -162
  73. data/rbi/revox/models/assistant_create_response.rbi +157 -147
  74. data/rbi/revox/models/assistant_list_response.rbi +157 -147
  75. data/rbi/revox/models/assistant_retrieve_response.rbi +153 -147
  76. data/rbi/revox/models/assistant_update_params.rbi +148 -162
  77. data/rbi/revox/models/assistant_update_response.rbi +157 -147
  78. data/rbi/revox/models/auth_status_retrieve_params.rbi +27 -0
  79. data/rbi/revox/models/auth_status_retrieve_response.rbi +30 -0
  80. data/rbi/revox/models/call_cancel_params.rbi +33 -0
  81. data/rbi/revox/models/call_cancel_response.rbi +23 -0
  82. data/rbi/revox/models/call_create_params.rbi +190 -187
  83. data/rbi/revox/models/call_create_response.rbi +1150 -227
  84. data/rbi/revox/models/call_export_params.rbi +446 -0
  85. data/rbi/revox/models/call_export_response.rbi +26 -0
  86. data/rbi/revox/models/call_pause_params.rbi +31 -0
  87. data/rbi/revox/models/call_pause_response.rbi +23 -0
  88. data/rbi/revox/models/call_phone_history_params.rbi +27 -0
  89. data/rbi/revox/models/call_phone_history_response.rbi +209 -0
  90. data/rbi/revox/models/call_resume_params.rbi +33 -0
  91. data/rbi/revox/models/call_resume_response.rbi +23 -0
  92. data/rbi/revox/models/call_retrieve_response.rbi +1150 -227
  93. data/rbi/revox/models/call_search_params.rbi +281 -0
  94. data/rbi/revox/models/call_search_response.rbi +7504 -0
  95. data/rbi/revox/models/campaign_create_params.rbi +9 -87
  96. data/rbi/revox/models/campaign_create_response.rbi +188 -266
  97. data/rbi/revox/models/campaign_get_rows_response.rbi +1150 -225
  98. data/rbi/revox/models/campaign_list_response.rbi +188 -262
  99. data/rbi/revox/models/campaign_pause_params.rbi +33 -0
  100. data/rbi/revox/models/campaign_pause_response.rbi +23 -0
  101. data/rbi/revox/models/campaign_resume_params.rbi +33 -0
  102. data/rbi/revox/models/campaign_resume_response.rbi +23 -0
  103. data/rbi/revox/models/campaign_retrieve_response.rbi +188 -266
  104. data/rbi/revox/models/campaign_statistics_params.rbi +33 -0
  105. data/rbi/revox/models/campaign_statistics_response.rbi +1069 -0
  106. data/rbi/revox/models/campaign_update_params.rbi +313 -0
  107. data/rbi/revox/models/campaign_update_response.rbi +4092 -0
  108. data/rbi/revox/models/phone_number_delete_params.rbi +33 -0
  109. data/rbi/revox/models/phone_number_delete_response.rbi +26 -0
  110. data/rbi/revox/models/phone_number_list_params.rbi +27 -0
  111. data/rbi/revox/models/phone_number_list_response.rbi +3690 -0
  112. data/rbi/revox/models/phone_number_update_params.rbi +53 -0
  113. data/rbi/revox/models/phone_number_update_response.rbi +3693 -0
  114. data/rbi/revox/models/user_retrieve_params.rbi +27 -0
  115. data/rbi/revox/models/user_retrieve_response.rbi +140 -0
  116. data/rbi/revox/models/voice_clone_params.rbi +141 -0
  117. data/rbi/revox/models/voice_clone_response.rbi +53 -0
  118. data/rbi/revox/models/voice_delete_params.rbi +33 -0
  119. data/rbi/revox/models/voice_delete_response.rbi +23 -0
  120. data/rbi/revox/models/voice_list_response.rbi +5 -0
  121. data/rbi/revox/models/voice_preview_params.rbi +2 -0
  122. data/rbi/revox/models/voice_retrieve_params.rbi +2 -0
  123. data/rbi/revox/models.rbi +35 -1
  124. data/rbi/revox/resources/assistants.rbi +52 -22
  125. data/rbi/revox/resources/auth_status.rbi +21 -0
  126. data/rbi/revox/resources/call.rbi +114 -4
  127. data/rbi/revox/resources/campaigns.rbi +77 -15
  128. data/rbi/revox/resources/phone_numbers.rbi +43 -0
  129. data/rbi/revox/resources/users.rbi +8 -2
  130. data/rbi/revox/resources/voices.rbi +39 -0
  131. data/sig/revox/client.rbs +4 -0
  132. data/sig/revox/models/assistant_clone_params.rbs +20 -0
  133. data/sig/revox/models/assistant_clone_response.rbs +1310 -0
  134. data/sig/revox/models/assistant_create_params.rbs +39 -58
  135. data/sig/revox/models/assistant_create_response.rbs +46 -54
  136. data/sig/revox/models/assistant_list_response.rbs +46 -54
  137. data/sig/revox/models/assistant_retrieve_response.rbs +46 -54
  138. data/sig/revox/models/assistant_update_params.rbs +39 -58
  139. data/sig/revox/models/assistant_update_response.rbs +46 -54
  140. data/sig/revox/models/auth_status_retrieve_params.rbs +15 -0
  141. data/sig/revox/models/auth_status_retrieve_response.rbs +13 -0
  142. data/sig/revox/models/call_cancel_params.rbs +20 -0
  143. data/sig/revox/models/call_cancel_response.rbs +13 -0
  144. data/sig/revox/models/call_create_params.rbs +50 -71
  145. data/sig/revox/models/call_create_response.rbs +473 -77
  146. data/sig/revox/models/call_export_params.rbs +230 -0
  147. data/sig/revox/models/call_export_response.rbs +15 -0
  148. data/sig/revox/models/call_pause_params.rbs +20 -0
  149. data/sig/revox/models/call_pause_response.rbs +13 -0
  150. data/sig/revox/models/call_phone_history_params.rbs +15 -0
  151. data/sig/revox/models/call_phone_history_response.rbs +93 -0
  152. data/sig/revox/models/call_resume_params.rbs +20 -0
  153. data/sig/revox/models/call_resume_response.rbs +13 -0
  154. data/sig/revox/models/call_retrieve_response.rbs +473 -77
  155. data/sig/revox/models/call_search_params.rbs +194 -0
  156. data/sig/revox/models/call_search_response.rbs +3045 -0
  157. data/sig/revox/models/campaign_create_params.rbs +5 -50
  158. data/sig/revox/models/campaign_create_response.rbs +62 -98
  159. data/sig/revox/models/campaign_get_rows_response.rbs +472 -73
  160. data/sig/revox/models/campaign_list_response.rbs +62 -98
  161. data/sig/revox/models/campaign_pause_params.rbs +20 -0
  162. data/sig/revox/models/campaign_pause_response.rbs +13 -0
  163. data/sig/revox/models/campaign_resume_params.rbs +20 -0
  164. data/sig/revox/models/campaign_resume_response.rbs +13 -0
  165. data/sig/revox/models/campaign_retrieve_response.rbs +62 -98
  166. data/sig/revox/models/campaign_statistics_params.rbs +20 -0
  167. data/sig/revox/models/campaign_statistics_response.rbs +489 -0
  168. data/sig/revox/models/campaign_update_params.rbs +135 -0
  169. data/sig/revox/models/campaign_update_response.rbs +1658 -0
  170. data/sig/revox/models/phone_number_delete_params.rbs +20 -0
  171. data/sig/revox/models/phone_number_delete_response.rbs +13 -0
  172. data/sig/revox/models/phone_number_list_params.rbs +15 -0
  173. data/sig/revox/models/phone_number_list_response.rbs +1454 -0
  174. data/sig/revox/models/phone_number_update_params.rbs +32 -0
  175. data/sig/revox/models/phone_number_update_response.rbs +1452 -0
  176. data/sig/revox/models/user_retrieve_params.rbs +14 -0
  177. data/sig/revox/models/user_retrieve_response.rbs +71 -0
  178. data/sig/revox/models/voice_clone_params.rbs +79 -0
  179. data/sig/revox/models/voice_clone_response.rbs +40 -0
  180. data/sig/revox/models/voice_delete_params.rbs +20 -0
  181. data/sig/revox/models/voice_delete_response.rbs +13 -0
  182. data/sig/revox/models/voice_list_response.rbs +2 -1
  183. data/sig/revox/models/voice_preview_params.rbs +2 -1
  184. data/sig/revox/models/voice_retrieve_params.rbs +2 -1
  185. data/sig/revox/models.rbs +35 -1
  186. data/sig/revox/resources/assistants.rbs +9 -4
  187. data/sig/revox/resources/auth_status.rbs +11 -0
  188. data/sig/revox/resources/call.rbs +46 -1
  189. data/sig/revox/resources/campaigns.rbs +24 -3
  190. data/sig/revox/resources/phone_numbers.rbs +23 -0
  191. data/sig/revox/resources/users.rbs +3 -1
  192. data/sig/revox/resources/voices.rbs +13 -0
  193. metadata +116 -17
  194. data/lib/revox/models/users/me_retrieve_params.rb +0 -16
  195. data/lib/revox/models/users/me_retrieve_response.rb +0 -101
  196. data/lib/revox/models/users/me_update_params.rb +0 -22
  197. data/lib/revox/models/users/me_update_response.rb +0 -101
  198. data/lib/revox/resources/users/me.rb +0 -55
  199. data/rbi/revox/models/users/me_retrieve_params.rbi +0 -29
  200. data/rbi/revox/models/users/me_retrieve_response.rbi +0 -149
  201. data/rbi/revox/models/users/me_update_params.rbi +0 -43
  202. data/rbi/revox/models/users/me_update_response.rbi +0 -149
  203. data/rbi/revox/resources/users/me.rbi +0 -33
  204. data/sig/revox/models/users/me_retrieve_params.rbs +0 -16
  205. data/sig/revox/models/users/me_retrieve_response.rbs +0 -75
  206. data/sig/revox/models/users/me_update_params.rbs +0 -28
  207. data/sig/revox/models/users/me_update_response.rbs +0 -75
  208. data/sig/revox/resources/users/me.rbs +0 -18
@@ -30,7 +30,9 @@ module Revox
30
30
  sig { params(assistant_id: String).void }
31
31
  attr_writer :assistant_id
32
32
 
33
- # Limit the number of concurrent calls for a given concurrency key.
33
+ # Limit the number of concurrent calls for a given concurrency key. The limit
34
+ # itself is set server-side; omit this to leave the call ungrouped (bounded only
35
+ # by your organization's limit).
34
36
  sig { returns(T.nilable(Revox::CallCreateParams::Concurrency)) }
35
37
  attr_reader :concurrency
36
38
 
@@ -39,13 +41,6 @@ module Revox
39
41
  end
40
42
  attr_writer :concurrency
41
43
 
42
- # The prompt to use for the call. This will be given to the LLM (gpt-4.1)
43
- sig { returns(T.nilable(T::Boolean)) }
44
- attr_reader :force_now
45
-
46
- sig { params(force_now: T::Boolean).void }
47
- attr_writer :force_now
48
-
49
44
  # The phone number to use for making the call (e.g., +1234567890). If not
50
45
  # provided, uses the default trunk.
51
46
  sig { returns(T.nilable(String)) }
@@ -82,17 +77,25 @@ module Revox
82
77
  end
83
78
  attr_writer :scheduled_at
84
79
 
80
+ # Bypass the calling-window check for this call so it dials even outside the
81
+ # assistant's configured window. Use for immediate 'call now' dials.
82
+ sig { returns(T.nilable(T::Boolean)) }
83
+ attr_reader :skip_calling_window
84
+
85
+ sig { params(skip_calling_window: T::Boolean).void }
86
+ attr_writer :skip_calling_window
87
+
85
88
  sig do
86
89
  params(
87
90
  phone_number: String,
88
91
  assistant: Revox::CallCreateParams::Assistant::OrHash,
89
92
  assistant_id: String,
90
93
  concurrency: Revox::CallCreateParams::Concurrency::OrHash,
91
- force_now: T::Boolean,
92
94
  from_phone_number: String,
93
95
  metadata: T::Hash[Symbol, String],
94
96
  prompt_variables: T::Hash[Symbol, String],
95
97
  scheduled_at: Revox::CallCreateParams::ScheduledAt::Variants,
98
+ skip_calling_window: T::Boolean,
96
99
  request_options: Revox::RequestOptions::OrHash
97
100
  ).returns(T.attached_class)
98
101
  end
@@ -104,10 +107,10 @@ module Revox
104
107
  assistant: nil,
105
108
  # The ID of the assistant to use for this call.
106
109
  assistant_id: nil,
107
- # Limit the number of concurrent calls for a given concurrency key.
110
+ # Limit the number of concurrent calls for a given concurrency key. The limit
111
+ # itself is set server-side; omit this to leave the call ungrouped (bounded only
112
+ # by your organization's limit).
108
113
  concurrency: nil,
109
- # The prompt to use for the call. This will be given to the LLM (gpt-4.1)
110
- force_now: nil,
111
114
  # The phone number to use for making the call (e.g., +1234567890). If not
112
115
  # provided, uses the default trunk.
113
116
  from_phone_number: nil,
@@ -120,6 +123,9 @@ module Revox
120
123
  # Schedule the call to start at a specific date and time (ISO 8601 format). If not
121
124
  # provided, the call will start immediately.
122
125
  scheduled_at: nil,
126
+ # Bypass the calling-window check for this call so it dials even outside the
127
+ # assistant's configured window. Use for immediate 'call now' dials.
128
+ skip_calling_window: nil,
123
129
  request_options: {}
124
130
  )
125
131
  end
@@ -131,11 +137,11 @@ module Revox
131
137
  assistant: Revox::CallCreateParams::Assistant,
132
138
  assistant_id: String,
133
139
  concurrency: Revox::CallCreateParams::Concurrency,
134
- force_now: T::Boolean,
135
140
  from_phone_number: String,
136
141
  metadata: T::Hash[Symbol, String],
137
142
  prompt_variables: T::Hash[Symbol, String],
138
143
  scheduled_at: Revox::CallCreateParams::ScheduledAt::Variants,
144
+ skip_calling_window: T::Boolean,
139
145
  request_options: Revox::RequestOptions
140
146
  }
141
147
  )
@@ -237,25 +243,6 @@ module Revox
237
243
  sig { returns(T.nilable(String)) }
238
244
  attr_accessor :email_notification_address
239
245
 
240
- # The language used for the notification email content. One of "en" or "fr".
241
- # Defaults to "en".
242
- sig do
243
- returns(
244
- T.nilable(
245
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage::OrSymbol
246
- )
247
- )
248
- end
249
- attr_reader :email_notification_language
250
-
251
- sig do
252
- params(
253
- email_notification_language:
254
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage::OrSymbol
255
- ).void
256
- end
257
- attr_writer :email_notification_language
258
-
259
246
  # Which call outcomes trigger an email notification. E.g. ["interested",
260
247
  # "completed", "none"]. Use "none" when outcome is null.
261
248
  sig do
@@ -334,8 +321,8 @@ module Revox
334
321
  sig { returns(T.nilable(String)) }
335
322
  attr_accessor :from_phone_number
336
323
 
337
- # When transfer_phone_number is set: "warm" (AI bridges) or "cold" (SIP REFER;
338
- # trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
324
+ # When transfer_destinations is non-empty: "warm" (AI bridges) or "cold" (SIP
325
+ # REFER; trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
339
326
  sig do
340
327
  returns(
341
328
  T.nilable(
@@ -411,6 +398,14 @@ module Revox
411
398
  end
412
399
  attr_writer :position
413
400
 
401
+ # Inbound calls only. URL fetched over HTTP GET right before the call is answered,
402
+ # with `{{phone}}` replaced by the caller's number in E.164 format (URL-encoded).
403
+ # It must return `{"prompt_variables": {...}}` covering every `{{variable}}` the
404
+ # assistant declares, otherwise the call is errored. Must be an http(s) URL
405
+ # containing `{{phone}}`. When null, no lookup is performed.
406
+ sig { returns(T.nilable(String)) }
407
+ attr_accessor :precall_lookup_url
408
+
414
409
  # Visual prompt constructor data (nodes, edges, positions). Used by the UI to
415
410
  # re-open the visual editor. Does not affect call behavior — the flattened prompt
416
411
  # field is what the LLM receives.
@@ -540,10 +535,18 @@ module Revox
540
535
  sig { params(thinking_sound_volume: Float).void }
541
536
  attr_writer :thinking_sound_volume
542
537
 
543
- # Phone number to transfer calls to when users request to speak to a human agent
544
- # in E.164 format (e.g. +1234567890).
545
- sig { returns(T.nilable(String)) }
546
- attr_accessor :transfer_phone_number
538
+ # Where calls can be transferred to when users ask to speak to a human. With a
539
+ # single entry the assistant always transfers there; with several, it picks one at
540
+ # transfer time by applying the routing rules written in the assistant's own
541
+ # prompt (which refer to the destination labels). Empty or null disables transfer.
542
+ sig do
543
+ returns(
544
+ T.nilable(
545
+ T::Array[Revox::CallCreateParams::Assistant::TransferDestination]
546
+ )
547
+ )
548
+ end
549
+ attr_accessor :transfer_destinations
547
550
 
548
551
  # Assistant kind. 'standalone' (default) is a normal assistant, 'multi-step'
549
552
  # orchestrates a flow of sub-assistants, 'sub-assistant' is a step inside a
@@ -632,8 +635,6 @@ module Revox
632
635
  T::Array[Revox::CallCreateParams::Assistant::CustomTool::OrHash]
633
636
  ),
634
637
  email_notification_address: T.nilable(String),
635
- email_notification_language:
636
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage::OrSymbol,
637
638
  email_notification_outcomes:
638
639
  T.nilable(
639
640
  T::Array[
@@ -665,6 +666,7 @@ module Revox
665
666
  max_duration_end_message: T.nilable(String),
666
667
  position:
667
668
  T.nilable(Revox::CallCreateParams::Assistant::Position::OrHash),
669
+ precall_lookup_url: T.nilable(String),
668
670
  prompt_flow:
669
671
  T.nilable(Revox::CallCreateParams::Assistant::PromptFlow::OrHash),
670
672
  slack: T.nilable(Revox::CallCreateParams::Assistant::Slack::OrHash),
@@ -684,7 +686,12 @@ module Revox
684
686
  ),
685
687
  thinking_sound_probability: Float,
686
688
  thinking_sound_volume: Float,
687
- transfer_phone_number: T.nilable(String),
689
+ transfer_destinations:
690
+ T.nilable(
691
+ T::Array[
692
+ Revox::CallCreateParams::Assistant::TransferDestination::OrHash
693
+ ]
694
+ ),
688
695
  type: Revox::CallCreateParams::Assistant::Type::OrSymbol,
689
696
  voice: Revox::CallCreateParams::Assistant::Voice::OrHash,
690
697
  voicemail_message: T.nilable(String),
@@ -722,9 +729,6 @@ module Revox
722
729
  # outcome. Accepts a single email or a comma-separated list (e.g. "alice@x.com,
723
730
  # bob@y.com").
724
731
  email_notification_address: nil,
725
- # The language used for the notification email content. One of "en" or "fr".
726
- # Defaults to "en".
727
- email_notification_language: nil,
728
732
  # Which call outcomes trigger an email notification. E.g. ["interested",
729
733
  # "completed", "none"]. Use "none" when outcome is null.
730
734
  email_notification_outcomes: nil,
@@ -746,8 +750,8 @@ module Revox
746
750
  # Must be a phone number owned by the organization in E.164 format (e.g.
747
751
  # +1234567890). When null, the organization's default phone number is used.
748
752
  from_phone_number: nil,
749
- # When transfer_phone_number is set: "warm" (AI bridges) or "cold" (SIP REFER;
750
- # trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
753
+ # When transfer_destinations is non-empty: "warm" (AI bridges) or "cold" (SIP
754
+ # REFER; trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
751
755
  human_transfer_mode: nil,
752
756
  # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
753
757
  # skip turns to navigate phone menus.
@@ -765,6 +769,12 @@ module Revox
765
769
  max_duration_end_message: nil,
766
770
  # Canvas position of this assistant's node in its multi-step flow editor.
767
771
  position: nil,
772
+ # Inbound calls only. URL fetched over HTTP GET right before the call is answered,
773
+ # with `{{phone}}` replaced by the caller's number in E.164 format (URL-encoded).
774
+ # It must return `{"prompt_variables": {...}}` covering every `{{variable}}` the
775
+ # assistant declares, otherwise the call is errored. Must be an http(s) URL
776
+ # containing `{{phone}}`. When null, no lookup is performed.
777
+ precall_lookup_url: nil,
768
778
  # Visual prompt constructor data (nodes, edges, positions). Used by the UI to
769
779
  # re-open the visual editor. Does not affect call behavior — the flattened prompt
770
780
  # field is what the LLM receives.
@@ -801,9 +811,11 @@ module Revox
801
811
  thinking_sound_probability: nil,
802
812
  # Volume of the thinking sound (0 = silent, 1 = max).
803
813
  thinking_sound_volume: nil,
804
- # Phone number to transfer calls to when users request to speak to a human agent
805
- # in E.164 format (e.g. +1234567890).
806
- transfer_phone_number: nil,
814
+ # Where calls can be transferred to when users ask to speak to a human. With a
815
+ # single entry the assistant always transfers there; with several, it picks one at
816
+ # transfer time by applying the routing rules written in the assistant's own
817
+ # prompt (which refer to the destination labels). Empty or null disables transfer.
818
+ transfer_destinations: nil,
807
819
  # Assistant kind. 'standalone' (default) is a normal assistant, 'multi-step'
808
820
  # orchestrates a flow of sub-assistants, 'sub-assistant' is a step inside a
809
821
  # multi-step flow (hidden from the assistants list). Flow transitions are managed
@@ -856,8 +868,6 @@ module Revox
856
868
  T::Array[Revox::CallCreateParams::Assistant::CustomTool]
857
869
  ),
858
870
  email_notification_address: T.nilable(String),
859
- email_notification_language:
860
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage::OrSymbol,
861
871
  email_notification_outcomes:
862
872
  T.nilable(
863
873
  T::Array[
@@ -887,6 +897,7 @@ module Revox
887
897
  max_call_duration_secs: Float,
888
898
  max_duration_end_message: T.nilable(String),
889
899
  position: T.nilable(Revox::CallCreateParams::Assistant::Position),
900
+ precall_lookup_url: T.nilable(String),
890
901
  prompt_flow:
891
902
  T.nilable(Revox::CallCreateParams::Assistant::PromptFlow),
892
903
  slack: T.nilable(Revox::CallCreateParams::Assistant::Slack),
@@ -906,7 +917,12 @@ module Revox
906
917
  ),
907
918
  thinking_sound_probability: Float,
908
919
  thinking_sound_volume: Float,
909
- transfer_phone_number: T.nilable(String),
920
+ transfer_destinations:
921
+ T.nilable(
922
+ T::Array[
923
+ Revox::CallCreateParams::Assistant::TransferDestination
924
+ ]
925
+ ),
910
926
  type: Revox::CallCreateParams::Assistant::Type::OrSymbol,
911
927
  voice: Revox::CallCreateParams::Assistant::Voice,
912
928
  voicemail_message: T.nilable(String),
@@ -952,21 +968,6 @@ module Revox
952
968
  :requested_callback_later,
953
969
  Revox::CallCreateParams::Assistant::AfterCallSMSOutcome::TaggedSymbol
954
970
  )
955
- REQUESTED_CALLBACK_NEW_NUMBER =
956
- T.let(
957
- :requested_callback_new_number,
958
- Revox::CallCreateParams::Assistant::AfterCallSMSOutcome::TaggedSymbol
959
- )
960
- DO_NOT_CONTACT =
961
- T.let(
962
- :do_not_contact,
963
- Revox::CallCreateParams::Assistant::AfterCallSMSOutcome::TaggedSymbol
964
- )
965
- AI_AVERSE =
966
- T.let(
967
- :ai_averse,
968
- Revox::CallCreateParams::Assistant::AfterCallSMSOutcome::TaggedSymbol
969
- )
970
971
  NONE =
971
972
  T.let(
972
973
  :none,
@@ -1232,7 +1233,8 @@ module Revox
1232
1233
  sig { returns(String) }
1233
1234
  attr_accessor :calling_window_start_time
1234
1235
 
1235
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
1236
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1237
+ # allows. Default: 7200 (2 hours).
1236
1238
  sig { returns(Integer) }
1237
1239
  attr_accessor :retry_delay_seconds
1238
1240
 
@@ -1252,7 +1254,8 @@ module Revox
1252
1254
  # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
1253
1255
  # Examples: '09:00', '10am'. Default: '10:00'.
1254
1256
  calling_window_start_time:,
1255
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
1257
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1258
+ # allows. Default: 7200 (2 hours).
1256
1259
  retry_delay_seconds:
1257
1260
  )
1258
1261
  end
@@ -1633,42 +1636,6 @@ module Revox
1633
1636
  end
1634
1637
  end
1635
1638
 
1636
- # The language used for the notification email content. One of "en" or "fr".
1637
- # Defaults to "en".
1638
- module EmailNotificationLanguage
1639
- extend Revox::Internal::Type::Enum
1640
-
1641
- TaggedSymbol =
1642
- T.type_alias do
1643
- T.all(
1644
- Symbol,
1645
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage
1646
- )
1647
- end
1648
- OrSymbol = T.type_alias { T.any(Symbol, String) }
1649
-
1650
- EN =
1651
- T.let(
1652
- :en,
1653
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage::TaggedSymbol
1654
- )
1655
- FR =
1656
- T.let(
1657
- :fr,
1658
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage::TaggedSymbol
1659
- )
1660
-
1661
- sig do
1662
- override.returns(
1663
- T::Array[
1664
- Revox::CallCreateParams::Assistant::EmailNotificationLanguage::TaggedSymbol
1665
- ]
1666
- )
1667
- end
1668
- def self.values
1669
- end
1670
- end
1671
-
1672
1639
  module EmailNotificationOutcome
1673
1640
  extend Revox::Internal::Type::Enum
1674
1641
 
@@ -1701,21 +1668,6 @@ module Revox
1701
1668
  :requested_callback_later,
1702
1669
  Revox::CallCreateParams::Assistant::EmailNotificationOutcome::TaggedSymbol
1703
1670
  )
1704
- REQUESTED_CALLBACK_NEW_NUMBER =
1705
- T.let(
1706
- :requested_callback_new_number,
1707
- Revox::CallCreateParams::Assistant::EmailNotificationOutcome::TaggedSymbol
1708
- )
1709
- DO_NOT_CONTACT =
1710
- T.let(
1711
- :do_not_contact,
1712
- Revox::CallCreateParams::Assistant::EmailNotificationOutcome::TaggedSymbol
1713
- )
1714
- AI_AVERSE =
1715
- T.let(
1716
- :ai_averse,
1717
- Revox::CallCreateParams::Assistant::EmailNotificationOutcome::TaggedSymbol
1718
- )
1719
1671
  NONE =
1720
1672
  T.let(
1721
1673
  :none,
@@ -1802,8 +1754,8 @@ module Revox
1802
1754
  end
1803
1755
  end
1804
1756
 
1805
- # When transfer_phone_number is set: "warm" (AI bridges) or "cold" (SIP REFER;
1806
- # trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
1757
+ # When transfer_destinations is non-empty: "warm" (AI bridges) or "cold" (SIP
1758
+ # REFER; trunk must allow REFER/PSTN). Omit or null when transfer is disabled.
1807
1759
  module HumanTransferMode
1808
1760
  extend Revox::Internal::Type::Enum
1809
1761
 
@@ -2397,9 +2349,15 @@ module Revox
2397
2349
  )
2398
2350
  end
2399
2351
 
2400
- # The Slack channel ID where the notification will be posted.
2401
- sig { returns(String) }
2402
- attr_accessor :channel_id
2352
+ # The Slack channels eligible to receive the notification. When more than one is
2353
+ # configured, the agent prompt may define routing rules to narrow it down per
2354
+ # call; with no such rules every channel here is notified.
2355
+ sig do
2356
+ returns(
2357
+ T::Array[Revox::CallCreateParams::Assistant::Slack::Channel]
2358
+ )
2359
+ end
2360
+ attr_accessor :channels
2403
2361
 
2404
2362
  # The Nango connection ID linking the org's Slack workspace to Revox.
2405
2363
  sig { returns(String) }
@@ -2416,15 +2374,11 @@ module Revox
2416
2374
  end
2417
2375
  attr_accessor :outcomes
2418
2376
 
2419
- # Human-readable Slack channel name, cached for display in the UI.
2420
- sig { returns(T.nilable(String)) }
2421
- attr_accessor :channel_name
2422
-
2423
2377
  # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2424
2378
  # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2425
- # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2426
- # prompt_variables and structured_output keys. When null/empty a default template
2427
- # is used.
2379
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2380
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2381
+ # null/empty a default template is used.
2428
2382
  sig { returns(T.nilable(String)) }
2429
2383
  attr_accessor :template
2430
2384
 
@@ -2432,31 +2386,33 @@ module Revox
2432
2386
  # a call ends with one of the configured outcomes.
2433
2387
  sig do
2434
2388
  params(
2435
- channel_id: String,
2389
+ channels:
2390
+ T::Array[
2391
+ Revox::CallCreateParams::Assistant::Slack::Channel::OrHash
2392
+ ],
2436
2393
  connection_id: String,
2437
2394
  outcomes:
2438
2395
  T::Array[
2439
2396
  Revox::CallCreateParams::Assistant::Slack::Outcome::OrSymbol
2440
2397
  ],
2441
- channel_name: T.nilable(String),
2442
2398
  template: T.nilable(String)
2443
2399
  ).returns(T.attached_class)
2444
2400
  end
2445
2401
  def self.new(
2446
- # The Slack channel ID where the notification will be posted.
2447
- channel_id:,
2402
+ # The Slack channels eligible to receive the notification. When more than one is
2403
+ # configured, the agent prompt may define routing rules to narrow it down per
2404
+ # call; with no such rules every channel here is notified.
2405
+ channels:,
2448
2406
  # The Nango connection ID linking the org's Slack workspace to Revox.
2449
2407
  connection_id:,
2450
2408
  # Which call outcomes trigger a Slack notification (e.g. ['interested', 'none']).
2451
2409
  # Use 'none' to notify when outcome is null.
2452
2410
  outcomes:,
2453
- # Human-readable Slack channel name, cached for display in the UI.
2454
- channel_name: nil,
2455
2411
  # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2456
2412
  # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2457
- # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2458
- # prompt_variables and structured_output keys. When null/empty a default template
2459
- # is used.
2413
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2414
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2415
+ # null/empty a default template is used.
2460
2416
  template: nil
2461
2417
  )
2462
2418
  end
@@ -2464,13 +2420,13 @@ module Revox
2464
2420
  sig do
2465
2421
  override.returns(
2466
2422
  {
2467
- channel_id: String,
2423
+ channels:
2424
+ T::Array[Revox::CallCreateParams::Assistant::Slack::Channel],
2468
2425
  connection_id: String,
2469
2426
  outcomes:
2470
2427
  T::Array[
2471
2428
  Revox::CallCreateParams::Assistant::Slack::Outcome::OrSymbol
2472
2429
  ],
2473
- channel_name: T.nilable(String),
2474
2430
  template: T.nilable(String)
2475
2431
  }
2476
2432
  )
@@ -2478,6 +2434,43 @@ module Revox
2478
2434
  def to_hash
2479
2435
  end
2480
2436
 
2437
+ class Channel < Revox::Internal::Type::BaseModel
2438
+ OrHash =
2439
+ T.type_alias do
2440
+ T.any(
2441
+ Revox::CallCreateParams::Assistant::Slack::Channel,
2442
+ Revox::Internal::AnyHash
2443
+ )
2444
+ end
2445
+
2446
+ # The Slack channel ID (e.g. 'C01234567').
2447
+ sig { returns(String) }
2448
+ attr_accessor :id
2449
+
2450
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2451
+ # LLM when the agent prompt routes by channel name.
2452
+ sig { returns(T.nilable(String)) }
2453
+ attr_accessor :name
2454
+
2455
+ sig do
2456
+ params(id: String, name: T.nilable(String)).returns(
2457
+ T.attached_class
2458
+ )
2459
+ end
2460
+ def self.new(
2461
+ # The Slack channel ID (e.g. 'C01234567').
2462
+ id:,
2463
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2464
+ # LLM when the agent prompt routes by channel name.
2465
+ name: nil
2466
+ )
2467
+ end
2468
+
2469
+ sig { override.returns({ id: String, name: T.nilable(String) }) }
2470
+ def to_hash
2471
+ end
2472
+ end
2473
+
2481
2474
  module Outcome
2482
2475
  extend Revox::Internal::Type::Enum
2483
2476
 
@@ -2510,21 +2503,6 @@ module Revox
2510
2503
  :requested_callback_later,
2511
2504
  Revox::CallCreateParams::Assistant::Slack::Outcome::TaggedSymbol
2512
2505
  )
2513
- REQUESTED_CALLBACK_NEW_NUMBER =
2514
- T.let(
2515
- :requested_callback_new_number,
2516
- Revox::CallCreateParams::Assistant::Slack::Outcome::TaggedSymbol
2517
- )
2518
- DO_NOT_CONTACT =
2519
- T.let(
2520
- :do_not_contact,
2521
- Revox::CallCreateParams::Assistant::Slack::Outcome::TaggedSymbol
2522
- )
2523
- AI_AVERSE =
2524
- T.let(
2525
- :ai_averse,
2526
- Revox::CallCreateParams::Assistant::Slack::Outcome::TaggedSymbol
2527
- )
2528
2506
  NONE =
2529
2507
  T.let(
2530
2508
  :none,
@@ -2830,6 +2808,43 @@ module Revox
2830
2808
  end
2831
2809
  end
2832
2810
 
2811
+ class TransferDestination < Revox::Internal::Type::BaseModel
2812
+ OrHash =
2813
+ T.type_alias do
2814
+ T.any(
2815
+ Revox::CallCreateParams::Assistant::TransferDestination,
2816
+ Revox::Internal::AnyHash
2817
+ )
2818
+ end
2819
+
2820
+ # Human-meaningful name for this destination (e.g. "Sales"). The assistant's
2821
+ # prompt refers to these labels when describing who to transfer to.
2822
+ sig { returns(String) }
2823
+ attr_accessor :label
2824
+
2825
+ # Destination phone number in E.164 format (e.g. +1234567890).
2826
+ sig { returns(String) }
2827
+ attr_accessor :phone_number
2828
+
2829
+ sig do
2830
+ params(label: String, phone_number: String).returns(
2831
+ T.attached_class
2832
+ )
2833
+ end
2834
+ def self.new(
2835
+ # Human-meaningful name for this destination (e.g. "Sales"). The assistant's
2836
+ # prompt refers to these labels when describing who to transfer to.
2837
+ label:,
2838
+ # Destination phone number in E.164 format (e.g. +1234567890).
2839
+ phone_number:
2840
+ )
2841
+ end
2842
+
2843
+ sig { override.returns({ label: String, phone_number: String }) }
2844
+ def to_hash
2845
+ end
2846
+ end
2847
+
2833
2848
  # Assistant kind. 'standalone' (default) is a normal assistant, 'multi-step'
2834
2849
  # orchestrates a flow of sub-assistants, 'sub-assistant' is a step inside a
2835
2850
  # multi-step flow (hidden from the assistants list). Flow transitions are managed
@@ -2908,7 +2923,7 @@ module Revox
2908
2923
  attr_writer :model
2909
2924
 
2910
2925
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
2911
- # 0.7–1.2. Default is 1.0.
2926
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
2912
2927
  sig { returns(T.nilable(Float)) }
2913
2928
  attr_reader :speed
2914
2929
 
@@ -2944,7 +2959,7 @@ module Revox
2944
2959
  # for other providers.
2945
2960
  model: nil,
2946
2961
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
2947
- # 0.7–1.2. Default is 1.0.
2962
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
2948
2963
  speed: nil,
2949
2964
  # Volume of the voice (Cartesia only). 0.5–2.0, default 1.0. Ignored for other
2950
2965
  # providers.
@@ -2991,6 +3006,11 @@ module Revox
2991
3006
  :elevenlabs,
2992
3007
  Revox::CallCreateParams::Assistant::Voice::Provider::TaggedSymbol
2993
3008
  )
3009
+ GRADIUM =
3010
+ T.let(
3011
+ :gradium,
3012
+ Revox::CallCreateParams::Assistant::Voice::Provider::TaggedSymbol
3013
+ )
2994
3014
 
2995
3015
  sig do
2996
3016
  override.returns(
@@ -3216,21 +3236,6 @@ module Revox
3216
3236
  :requested_callback_later,
3217
3237
  Revox::CallCreateParams::Assistant::Zoho::Outcome::TaggedSymbol
3218
3238
  )
3219
- REQUESTED_CALLBACK_NEW_NUMBER =
3220
- T.let(
3221
- :requested_callback_new_number,
3222
- Revox::CallCreateParams::Assistant::Zoho::Outcome::TaggedSymbol
3223
- )
3224
- DO_NOT_CONTACT =
3225
- T.let(
3226
- :do_not_contact,
3227
- Revox::CallCreateParams::Assistant::Zoho::Outcome::TaggedSymbol
3228
- )
3229
- AI_AVERSE =
3230
- T.let(
3231
- :ai_averse,
3232
- Revox::CallCreateParams::Assistant::Zoho::Outcome::TaggedSymbol
3233
- )
3234
3239
  NONE =
3235
3240
  T.let(
3236
3241
  :none,
@@ -3259,25 +3264,23 @@ module Revox
3259
3264
  )
3260
3265
  end
3261
3266
 
3262
- # The key for which you want to limit the number of concurrent calls.
3267
+ # Groups this call with every other call sharing the same key, for concurrency
3268
+ # purposes.
3263
3269
  sig { returns(String) }
3264
3270
  attr_accessor :key
3265
3271
 
3266
- # The maximum number of concurrent calls to allow for the given concurrency key.
3267
- sig { returns(Float) }
3268
- attr_accessor :max
3269
-
3270
- # Limit the number of concurrent calls for a given concurrency key.
3271
- sig { params(key: String, max: Float).returns(T.attached_class) }
3272
+ # Limit the number of concurrent calls for a given concurrency key. The limit
3273
+ # itself is set server-side; omit this to leave the call ungrouped (bounded only
3274
+ # by your organization's limit).
3275
+ sig { params(key: String).returns(T.attached_class) }
3272
3276
  def self.new(
3273
- # The key for which you want to limit the number of concurrent calls.
3274
- key:,
3275
- # The maximum number of concurrent calls to allow for the given concurrency key.
3276
- max:
3277
+ # Groups this call with every other call sharing the same key, for concurrency
3278
+ # purposes.
3279
+ key:
3277
3280
  )
3278
3281
  end
3279
3282
 
3280
- sig { override.returns({ key: String, max: Float }) }
3283
+ sig { override.returns({ key: String }) }
3281
3284
  def to_hash
3282
3285
  end
3283
3286
  end