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