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
@@ -313,6 +313,12 @@ module Revox
313
313
  sig { returns(T.anything) }
314
314
  attr_accessor :updated_at
315
315
 
316
+ # Extra notification recipients resolved from the agent prompt's own routing
317
+ # rules, when it defines any. Added to the assistant's configured notification
318
+ # recipients; never replaces them. Null when the prompt defines no routing rules.
319
+ sig { returns(T.nilable(T::Array[String])) }
320
+ attr_accessor :follow_up_emails
321
+
316
322
  # Business outcome of the call. Null if not computed or no transcript.
317
323
  sig do
318
324
  returns(
@@ -327,6 +333,13 @@ module Revox
327
333
  sig { returns(T.nilable(String)) }
328
334
  attr_accessor :outcome_summary
329
335
 
336
+ # Slack channels resolved from the agent prompt's own routing rules, when it
337
+ # defines any. Always a subset of the channels configured on the assistant. Null
338
+ # when the prompt defines no routing rules, in which case every configured channel
339
+ # is notified.
340
+ sig { returns(T.nilable(T::Array[String])) }
341
+ attr_accessor :slack_channel_ids
342
+
330
343
  # This represent a call "order" that was requested by the user. A call order can
331
344
  # be resolved over multiple call attempts spanning up to a few days.
332
345
  sig do
@@ -381,11 +394,13 @@ module Revox
381
394
  Revox::Models::CampaignGetRowsResponse::Row::Call::Status::OrSymbol,
382
395
  to_phone_number: String,
383
396
  updated_at: T.anything,
397
+ follow_up_emails: T.nilable(T::Array[String]),
384
398
  outcome:
385
399
  T.nilable(
386
400
  Revox::Models::CampaignGetRowsResponse::Row::Call::Outcome::OrSymbol
387
401
  ),
388
- outcome_summary: T.nilable(String)
402
+ outcome_summary: T.nilable(String),
403
+ slack_channel_ids: T.nilable(T::Array[String])
389
404
  ).returns(T.attached_class)
390
405
  end
391
406
  def self.new(
@@ -440,10 +455,19 @@ module Revox
440
455
  # The time the call order was last updated (any state change, retry, or analysis
441
456
  # result).
442
457
  updated_at:,
458
+ # Extra notification recipients resolved from the agent prompt's own routing
459
+ # rules, when it defines any. Added to the assistant's configured notification
460
+ # recipients; never replaces them. Null when the prompt defines no routing rules.
461
+ follow_up_emails: nil,
443
462
  # Business outcome of the call. Null if not computed or no transcript.
444
463
  outcome: nil,
445
464
  # LLM explanation for the outcome, when outcome was computed from the transcript.
446
- outcome_summary: nil
465
+ outcome_summary: nil,
466
+ # Slack channels resolved from the agent prompt's own routing rules, when it
467
+ # defines any. Always a subset of the channels configured on the assistant. Null
468
+ # when the prompt defines no routing rules, in which case every configured channel
469
+ # is notified.
470
+ slack_channel_ids: nil
447
471
  )
448
472
  end
449
473
 
@@ -495,11 +519,13 @@ module Revox
495
519
  Revox::Models::CampaignGetRowsResponse::Row::Call::Status::TaggedSymbol,
496
520
  to_phone_number: String,
497
521
  updated_at: T.anything,
522
+ follow_up_emails: T.nilable(T::Array[String]),
498
523
  outcome:
499
524
  T.nilable(
500
525
  Revox::Models::CampaignGetRowsResponse::Row::Call::Outcome::TaggedSymbol
501
526
  ),
502
- outcome_summary: T.nilable(String)
527
+ outcome_summary: T.nilable(String),
528
+ slack_channel_ids: T.nilable(T::Array[String])
503
529
  }
504
530
  )
505
531
  end
@@ -668,14 +694,6 @@ module Revox
668
694
  sig { returns(T.nilable(String)) }
669
695
  attr_accessor :email_notification_address
670
696
 
671
- # The language used for the notification email content. One of "en" or "fr".
672
- sig do
673
- returns(
674
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
675
- )
676
- end
677
- attr_accessor :email_notification_language
678
-
679
697
  # Which call outcomes trigger an email notification. E.g. ["interested",
680
698
  # "completed", "none"]. Use "none" when outcome is null.
681
699
  sig do
@@ -711,8 +729,8 @@ module Revox
711
729
  sig { returns(T.nilable(String)) }
712
730
  attr_accessor :from_phone_number
713
731
 
714
- # Warm or cold transfer when transfer_phone_number is set; null when transfer is
715
- # not configured.
732
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
733
+ # transfer is not configured.
716
734
  sig do
717
735
  returns(
718
736
  T.nilable(
@@ -775,6 +793,11 @@ module Revox
775
793
  end
776
794
  attr_writer :position
777
795
 
796
+ # URL fetched before an inbound call is answered to resolve the assistant's prompt
797
+ # variables. Null when no lookup is configured.
798
+ sig { returns(T.nilable(String)) }
799
+ attr_accessor :precall_lookup_url
800
+
778
801
  sig { returns(String) }
779
802
  attr_accessor :prompt
780
803
 
@@ -896,9 +919,18 @@ module Revox
896
919
  sig { returns(Float) }
897
920
  attr_accessor :thinking_sound_volume
898
921
 
899
- # Phone number to transfer calls to when users request to speak to a human agent.
900
- sig { returns(T.nilable(String)) }
901
- attr_accessor :transfer_phone_number
922
+ # Where calls can be transferred to when users ask to speak to a human. Null or
923
+ # empty when transfer is not configured.
924
+ sig do
925
+ returns(
926
+ T.nilable(
927
+ T::Array[
928
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::TransferDestination
929
+ ]
930
+ )
931
+ )
932
+ end
933
+ attr_accessor :transfer_destinations
902
934
 
903
935
  sig do
904
936
  returns(
@@ -1008,6 +1040,12 @@ module Revox
1008
1040
  end
1009
1041
  attr_writer :faq_items
1010
1042
 
1043
+ sig { returns(T.nilable(T::Boolean)) }
1044
+ attr_reader :is_inbound_receptionist
1045
+
1046
+ sig { params(is_inbound_receptionist: T::Boolean).void }
1047
+ attr_writer :is_inbound_receptionist
1048
+
1011
1049
  sig { returns(T.nilable(T::Boolean)) }
1012
1050
  attr_reader :is_realestate_assistant
1013
1051
 
@@ -1052,8 +1090,6 @@ module Revox
1052
1090
  ]
1053
1091
  ),
1054
1092
  email_notification_address: T.nilable(String),
1055
- email_notification_language:
1056
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationLanguage::OrSymbol,
1057
1093
  email_notification_outcomes:
1058
1094
  T.nilable(
1059
1095
  T::Array[
@@ -1087,6 +1123,7 @@ module Revox
1087
1123
  T.nilable(
1088
1124
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Position::OrHash
1089
1125
  ),
1126
+ precall_lookup_url: T.nilable(String),
1090
1127
  prompt: String,
1091
1128
  prompt_flow:
1092
1129
  T.nilable(
@@ -1117,7 +1154,12 @@ module Revox
1117
1154
  ),
1118
1155
  thinking_sound_probability: Float,
1119
1156
  thinking_sound_volume: Float,
1120
- transfer_phone_number: T.nilable(String),
1157
+ transfer_destinations:
1158
+ T.nilable(
1159
+ T::Array[
1160
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::TransferDestination::OrHash
1161
+ ]
1162
+ ),
1121
1163
  type:
1122
1164
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Type::OrSymbol,
1123
1165
  updated_at: T.anything,
@@ -1141,6 +1183,7 @@ module Revox
1141
1183
  T::Array[
1142
1184
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::FaqItem::OrHash
1143
1185
  ],
1186
+ is_inbound_receptionist: T::Boolean,
1144
1187
  is_realestate_assistant: T::Boolean,
1145
1188
  pending_faq_count: Float
1146
1189
  ).returns(T.attached_class)
@@ -1169,8 +1212,6 @@ module Revox
1169
1212
  # outcome. Accepts a single email or a comma-separated list (e.g. "alice@x.com,
1170
1213
  # bob@y.com").
1171
1214
  email_notification_address:,
1172
- # The language used for the notification email content. One of "en" or "fr".
1173
- email_notification_language:,
1174
1215
  # Which call outcomes trigger an email notification. E.g. ["interested",
1175
1216
  # "completed", "none"]. Use "none" when outcome is null.
1176
1217
  email_notification_outcomes:,
@@ -1182,8 +1223,8 @@ module Revox
1182
1223
  # Override the default outbound phone number for calls placed with this assistant.
1183
1224
  # When null, the organization's default phone number is used.
1184
1225
  from_phone_number:,
1185
- # Warm or cold transfer when transfer_phone_number is set; null when transfer is
1186
- # not configured.
1226
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
1227
+ # transfer is not configured.
1187
1228
  human_transfer_mode:,
1188
1229
  # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
1189
1230
  # skip turns to navigate phone menus.
@@ -1202,6 +1243,9 @@ module Revox
1202
1243
  name:,
1203
1244
  organization_id:,
1204
1245
  position:,
1246
+ # URL fetched before an inbound call is answered to resolve the assistant's prompt
1247
+ # variables. Null when no lookup is configured.
1248
+ precall_lookup_url:,
1205
1249
  prompt:,
1206
1250
  prompt_flow:,
1207
1251
  slack:,
@@ -1233,8 +1277,9 @@ module Revox
1233
1277
  thinking_sound_probability:,
1234
1278
  # Volume of the thinking sound (0 = silent, 1 = max).
1235
1279
  thinking_sound_volume:,
1236
- # Phone number to transfer calls to when users request to speak to a human agent.
1237
- transfer_phone_number:,
1280
+ # Where calls can be transferred to when users ask to speak to a human. Null or
1281
+ # empty when transfer is not configured.
1282
+ transfer_destinations:,
1238
1283
  type:,
1239
1284
  updated_at:,
1240
1285
  voice:,
@@ -1253,6 +1298,7 @@ module Revox
1253
1298
  # The user who created the assistant.
1254
1299
  created_by: nil,
1255
1300
  faq_items: nil,
1301
+ is_inbound_receptionist: nil,
1256
1302
  is_realestate_assistant: nil,
1257
1303
  pending_faq_count: nil
1258
1304
  )
@@ -1291,8 +1337,6 @@ module Revox
1291
1337
  ]
1292
1338
  ),
1293
1339
  email_notification_address: T.nilable(String),
1294
- email_notification_language:
1295
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationLanguage::TaggedSymbol,
1296
1340
  email_notification_outcomes:
1297
1341
  T.nilable(
1298
1342
  T::Array[
@@ -1321,6 +1365,7 @@ module Revox
1321
1365
  T.nilable(
1322
1366
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Position
1323
1367
  ),
1368
+ precall_lookup_url: T.nilable(String),
1324
1369
  prompt: String,
1325
1370
  prompt_flow:
1326
1371
  T.nilable(
@@ -1351,7 +1396,12 @@ module Revox
1351
1396
  ),
1352
1397
  thinking_sound_probability: Float,
1353
1398
  thinking_sound_volume: Float,
1354
- transfer_phone_number: T.nilable(String),
1399
+ transfer_destinations:
1400
+ T.nilable(
1401
+ T::Array[
1402
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::TransferDestination
1403
+ ]
1404
+ ),
1355
1405
  type:
1356
1406
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Type::TaggedSymbol,
1357
1407
  updated_at: T.anything,
@@ -1375,6 +1425,7 @@ module Revox
1375
1425
  T::Array[
1376
1426
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::FaqItem
1377
1427
  ],
1428
+ is_inbound_receptionist: T::Boolean,
1378
1429
  is_realestate_assistant: T::Boolean,
1379
1430
  pending_faq_count: Float
1380
1431
  }
@@ -1415,21 +1466,6 @@ module Revox
1415
1466
  :requested_callback_later,
1416
1467
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1417
1468
  )
1418
- REQUESTED_CALLBACK_NEW_NUMBER =
1419
- T.let(
1420
- :requested_callback_new_number,
1421
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1422
- )
1423
- DO_NOT_CONTACT =
1424
- T.let(
1425
- :do_not_contact,
1426
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1427
- )
1428
- AI_AVERSE =
1429
- T.let(
1430
- :ai_averse,
1431
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1432
- )
1433
1469
  NONE =
1434
1470
  T.let(
1435
1471
  :none,
@@ -1700,7 +1736,8 @@ module Revox
1700
1736
  sig { returns(String) }
1701
1737
  attr_accessor :calling_window_start_time
1702
1738
 
1703
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
1739
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1740
+ # allows. Default: 7200 (2 hours).
1704
1741
  sig { returns(Integer) }
1705
1742
  attr_accessor :retry_delay_seconds
1706
1743
 
@@ -1720,7 +1757,8 @@ module Revox
1720
1757
  # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
1721
1758
  # Examples: '09:00', '10am'. Default: '10:00'.
1722
1759
  calling_window_start_time:,
1723
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
1760
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1761
+ # allows. Default: 7200 (2 hours).
1724
1762
  retry_delay_seconds:
1725
1763
  )
1726
1764
  end
@@ -2107,41 +2145,6 @@ module Revox
2107
2145
  end
2108
2146
  end
2109
2147
 
2110
- # The language used for the notification email content. One of "en" or "fr".
2111
- module EmailNotificationLanguage
2112
- extend Revox::Internal::Type::Enum
2113
-
2114
- TaggedSymbol =
2115
- T.type_alias do
2116
- T.all(
2117
- Symbol,
2118
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationLanguage
2119
- )
2120
- end
2121
- OrSymbol = T.type_alias { T.any(Symbol, String) }
2122
-
2123
- EN =
2124
- T.let(
2125
- :en,
2126
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
2127
- )
2128
- FR =
2129
- T.let(
2130
- :fr,
2131
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
2132
- )
2133
-
2134
- sig do
2135
- override.returns(
2136
- T::Array[
2137
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
2138
- ]
2139
- )
2140
- end
2141
- def self.values
2142
- end
2143
- end
2144
-
2145
2148
  module EmailNotificationOutcome
2146
2149
  extend Revox::Internal::Type::Enum
2147
2150
 
@@ -2174,21 +2177,6 @@ module Revox
2174
2177
  :requested_callback_later,
2175
2178
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2176
2179
  )
2177
- REQUESTED_CALLBACK_NEW_NUMBER =
2178
- T.let(
2179
- :requested_callback_new_number,
2180
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2181
- )
2182
- DO_NOT_CONTACT =
2183
- T.let(
2184
- :do_not_contact,
2185
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2186
- )
2187
- AI_AVERSE =
2188
- T.let(
2189
- :ai_averse,
2190
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2191
- )
2192
2180
  NONE =
2193
2181
  T.let(
2194
2182
  :none,
@@ -2245,8 +2233,8 @@ module Revox
2245
2233
  end
2246
2234
  end
2247
2235
 
2248
- # Warm or cold transfer when transfer_phone_number is set; null when transfer is
2249
- # not configured.
2236
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
2237
+ # transfer is not configured.
2250
2238
  module HumanTransferMode
2251
2239
  extend Revox::Internal::Type::Enum
2252
2240
 
@@ -2848,9 +2836,17 @@ module Revox
2848
2836
  )
2849
2837
  end
2850
2838
 
2851
- # The Slack channel ID where the notification will be posted.
2852
- sig { returns(String) }
2853
- attr_accessor :channel_id
2839
+ # The Slack channels eligible to receive the notification. When more than one is
2840
+ # configured, the agent prompt may define routing rules to narrow it down per
2841
+ # call; with no such rules every channel here is notified.
2842
+ sig do
2843
+ returns(
2844
+ T::Array[
2845
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Channel
2846
+ ]
2847
+ )
2848
+ end
2849
+ attr_accessor :channels
2854
2850
 
2855
2851
  # The Nango connection ID linking the org's Slack workspace to Revox.
2856
2852
  sig { returns(String) }
@@ -2867,45 +2863,43 @@ module Revox
2867
2863
  end
2868
2864
  attr_accessor :outcomes
2869
2865
 
2870
- # Human-readable Slack channel name, cached for display in the UI.
2871
- sig { returns(T.nilable(String)) }
2872
- attr_accessor :channel_name
2873
-
2874
2866
  # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2875
2867
  # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2876
- # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2877
- # prompt_variables and structured_output keys. When null/empty a default template
2878
- # is used.
2868
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2869
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2870
+ # null/empty a default template is used.
2879
2871
  sig { returns(T.nilable(String)) }
2880
2872
  attr_accessor :template
2881
2873
 
2882
2874
  sig do
2883
2875
  params(
2884
- channel_id: String,
2876
+ channels:
2877
+ T::Array[
2878
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Channel::OrHash
2879
+ ],
2885
2880
  connection_id: String,
2886
2881
  outcomes:
2887
2882
  T::Array[
2888
2883
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Outcome::OrSymbol
2889
2884
  ],
2890
- channel_name: T.nilable(String),
2891
2885
  template: T.nilable(String)
2892
2886
  ).returns(T.attached_class)
2893
2887
  end
2894
2888
  def self.new(
2895
- # The Slack channel ID where the notification will be posted.
2896
- channel_id:,
2889
+ # The Slack channels eligible to receive the notification. When more than one is
2890
+ # configured, the agent prompt may define routing rules to narrow it down per
2891
+ # call; with no such rules every channel here is notified.
2892
+ channels:,
2897
2893
  # The Nango connection ID linking the org's Slack workspace to Revox.
2898
2894
  connection_id:,
2899
2895
  # Which call outcomes trigger a Slack notification (e.g. ['interested', 'none']).
2900
2896
  # Use 'none' to notify when outcome is null.
2901
2897
  outcomes:,
2902
- # Human-readable Slack channel name, cached for display in the UI.
2903
- channel_name: nil,
2904
2898
  # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2905
2899
  # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2906
- # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2907
- # prompt_variables and structured_output keys. When null/empty a default template
2908
- # is used.
2900
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2901
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2902
+ # null/empty a default template is used.
2909
2903
  template: nil
2910
2904
  )
2911
2905
  end
@@ -2913,13 +2907,15 @@ module Revox
2913
2907
  sig do
2914
2908
  override.returns(
2915
2909
  {
2916
- channel_id: String,
2910
+ channels:
2911
+ T::Array[
2912
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Channel
2913
+ ],
2917
2914
  connection_id: String,
2918
2915
  outcomes:
2919
2916
  T::Array[
2920
2917
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Outcome::TaggedSymbol
2921
2918
  ],
2922
- channel_name: T.nilable(String),
2923
2919
  template: T.nilable(String)
2924
2920
  }
2925
2921
  )
@@ -2927,6 +2923,45 @@ module Revox
2927
2923
  def to_hash
2928
2924
  end
2929
2925
 
2926
+ class Channel < Revox::Internal::Type::BaseModel
2927
+ OrHash =
2928
+ T.type_alias do
2929
+ T.any(
2930
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Channel,
2931
+ Revox::Internal::AnyHash
2932
+ )
2933
+ end
2934
+
2935
+ # The Slack channel ID (e.g. 'C01234567').
2936
+ sig { returns(String) }
2937
+ attr_accessor :id
2938
+
2939
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2940
+ # LLM when the agent prompt routes by channel name.
2941
+ sig { returns(T.nilable(String)) }
2942
+ attr_accessor :name
2943
+
2944
+ sig do
2945
+ params(id: String, name: T.nilable(String)).returns(
2946
+ T.attached_class
2947
+ )
2948
+ end
2949
+ def self.new(
2950
+ # The Slack channel ID (e.g. 'C01234567').
2951
+ id:,
2952
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2953
+ # LLM when the agent prompt routes by channel name.
2954
+ name: nil
2955
+ )
2956
+ end
2957
+
2958
+ sig do
2959
+ override.returns({ id: String, name: T.nilable(String) })
2960
+ end
2961
+ def to_hash
2962
+ end
2963
+ end
2964
+
2930
2965
  module Outcome
2931
2966
  extend Revox::Internal::Type::Enum
2932
2967
 
@@ -2959,21 +2994,6 @@ module Revox
2959
2994
  :requested_callback_later,
2960
2995
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Outcome::TaggedSymbol
2961
2996
  )
2962
- REQUESTED_CALLBACK_NEW_NUMBER =
2963
- T.let(
2964
- :requested_callback_new_number,
2965
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Outcome::TaggedSymbol
2966
- )
2967
- DO_NOT_CONTACT =
2968
- T.let(
2969
- :do_not_contact,
2970
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Outcome::TaggedSymbol
2971
- )
2972
- AI_AVERSE =
2973
- T.let(
2974
- :ai_averse,
2975
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Slack::Outcome::TaggedSymbol
2976
- )
2977
2997
  NONE =
2978
2998
  T.let(
2979
2999
  :none,
@@ -3288,6 +3308,34 @@ module Revox
3288
3308
  end
3289
3309
  end
3290
3310
 
3311
+ class TransferDestination < Revox::Internal::Type::BaseModel
3312
+ OrHash =
3313
+ T.type_alias do
3314
+ T.any(
3315
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::TransferDestination,
3316
+ Revox::Internal::AnyHash
3317
+ )
3318
+ end
3319
+
3320
+ sig { returns(String) }
3321
+ attr_accessor :label
3322
+
3323
+ sig { returns(String) }
3324
+ attr_accessor :phone_number
3325
+
3326
+ sig do
3327
+ params(label: String, phone_number: String).returns(
3328
+ T.attached_class
3329
+ )
3330
+ end
3331
+ def self.new(label:, phone_number:)
3332
+ end
3333
+
3334
+ sig { override.returns({ label: String, phone_number: String }) }
3335
+ def to_hash
3336
+ end
3337
+ end
3338
+
3291
3339
  module Type
3292
3340
  extend Revox::Internal::Type::Enum
3293
3341
 
@@ -3368,7 +3416,7 @@ module Revox
3368
3416
  attr_writer :model
3369
3417
 
3370
3418
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
3371
- # 0.7–1.2. Default is 1.0.
3419
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
3372
3420
  sig { returns(T.nilable(Float)) }
3373
3421
  attr_reader :speed
3374
3422
 
@@ -3403,7 +3451,7 @@ module Revox
3403
3451
  # for other providers.
3404
3452
  model: nil,
3405
3453
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
3406
- # 0.7–1.2. Default is 1.0.
3454
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
3407
3455
  speed: nil,
3408
3456
  # Volume of the voice (Cartesia only). 0.5–2.0, default 1.0. Ignored for other
3409
3457
  # providers.
@@ -3450,6 +3498,11 @@ module Revox
3450
3498
  :elevenlabs,
3451
3499
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Voice::Provider::TaggedSymbol
3452
3500
  )
3501
+ GRADIUM =
3502
+ T.let(
3503
+ :gradium,
3504
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Voice::Provider::TaggedSymbol
3505
+ )
3453
3506
 
3454
3507
  sig do
3455
3508
  override.returns(
@@ -3680,21 +3733,6 @@ module Revox
3680
3733
  :requested_callback_later,
3681
3734
  Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Zoho::Outcome::TaggedSymbol
3682
3735
  )
3683
- REQUESTED_CALLBACK_NEW_NUMBER =
3684
- T.let(
3685
- :requested_callback_new_number,
3686
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Zoho::Outcome::TaggedSymbol
3687
- )
3688
- DO_NOT_CONTACT =
3689
- T.let(
3690
- :do_not_contact,
3691
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Zoho::Outcome::TaggedSymbol
3692
- )
3693
- AI_AVERSE =
3694
- T.let(
3695
- :ai_averse,
3696
- Revox::Models::CampaignGetRowsResponse::Row::Call::Assistant::Zoho::Outcome::TaggedSymbol
3697
- )
3698
3736
  NONE =
3699
3737
  T.let(
3700
3738
  :none,
@@ -3912,6 +3950,37 @@ module Revox
3912
3950
  sig { returns(T.anything) }
3913
3951
  attr_accessor :ended_at
3914
3952
 
3953
+ # Whether the AI agent conducted the conversation on this attempt. False for a
3954
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
3955
+ # were never answered.
3956
+ sig { returns(T::Boolean) }
3957
+ attr_accessor :handled_by_ai
3958
+
3959
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
3960
+ # or a speed-dial operator connection (both stamp human_takeover_at).
3961
+ sig { returns(T::Boolean) }
3962
+ attr_accessor :handled_by_human
3963
+
3964
+ # The team member responsible for following up on this call.
3965
+ sig do
3966
+ returns(
3967
+ T.nilable(
3968
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::HandledByUser
3969
+ )
3970
+ )
3971
+ end
3972
+ attr_reader :handled_by_user
3973
+
3974
+ sig do
3975
+ params(
3976
+ handled_by_user:
3977
+ T.nilable(
3978
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::HandledByUser::OrHash
3979
+ )
3980
+ ).void
3981
+ end
3982
+ attr_writer :handled_by_user
3983
+
3915
3984
  # The phone number that was called. Formatted in E.164 format. Example:
3916
3985
  # +1234567890
3917
3986
  sig { returns(String) }
@@ -3946,6 +4015,19 @@ module Revox
3946
4015
  sig { returns(T.nilable(T::Array[String])) }
3947
4016
  attr_accessor :assistants_used
3948
4017
 
4018
+ # Notification emails sent in connection with the call, ordered oldest first
4019
+ # (from/to addresses, subject, sent time).
4020
+ sig do
4021
+ returns(
4022
+ T.nilable(
4023
+ T::Array[
4024
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::EmailLog
4025
+ ]
4026
+ )
4027
+ )
4028
+ end
4029
+ attr_accessor :email_log
4030
+
3949
4031
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
3950
4032
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
3951
4033
  sig do
@@ -3995,6 +4077,20 @@ module Revox
3995
4077
  end
3996
4078
  attr_accessor :sms_log
3997
4079
 
4080
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
4081
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
4082
+ # tracked or for realtime sessions that don't emit them.
4083
+ sig do
4084
+ returns(
4085
+ T.nilable(
4086
+ T::Array[
4087
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent
4088
+ ]
4089
+ )
4090
+ )
4091
+ end
4092
+ attr_accessor :speech_events
4093
+
3998
4094
  # The data extracted from the call, using the structured output config from the
3999
4095
  # parent call object.
4000
4096
  sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
@@ -4023,6 +4119,12 @@ module Revox
4023
4119
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::DialError::OrSymbol
4024
4120
  ),
4025
4121
  ended_at: T.anything,
4122
+ handled_by_ai: T::Boolean,
4123
+ handled_by_human: T::Boolean,
4124
+ handled_by_user:
4125
+ T.nilable(
4126
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::HandledByUser::OrHash
4127
+ ),
4026
4128
  phone_number: String,
4027
4129
  recording_url: T.nilable(String),
4028
4130
  result:
@@ -4033,6 +4135,12 @@ module Revox
4033
4135
  status:
4034
4136
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Status::OrSymbol,
4035
4137
  assistants_used: T.nilable(T::Array[String]),
4138
+ email_log:
4139
+ T.nilable(
4140
+ T::Array[
4141
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::EmailLog::OrHash
4142
+ ]
4143
+ ),
4036
4144
  end_reason:
4037
4145
  T.nilable(
4038
4146
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::EndReason::OrSymbol
@@ -4053,6 +4161,12 @@ module Revox
4053
4161
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::OrHash
4054
4162
  ]
4055
4163
  ),
4164
+ speech_events:
4165
+ T.nilable(
4166
+ T::Array[
4167
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::OrHash
4168
+ ]
4169
+ ),
4056
4170
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
4057
4171
  transcript:
4058
4172
  T.nilable(
@@ -4071,6 +4185,15 @@ module Revox
4071
4185
  dial_error:,
4072
4186
  # The time the call ended.
4073
4187
  ended_at:,
4188
+ # Whether the AI agent conducted the conversation on this attempt. False for a
4189
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
4190
+ # were never answered.
4191
+ handled_by_ai:,
4192
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
4193
+ # or a speed-dial operator connection (both stamp human_takeover_at).
4194
+ handled_by_human:,
4195
+ # The team member responsible for following up on this call.
4196
+ handled_by_user:,
4074
4197
  # The phone number that was called. Formatted in E.164 format. Example:
4075
4198
  # +1234567890
4076
4199
  phone_number:,
@@ -4083,6 +4206,9 @@ module Revox
4083
4206
  status:,
4084
4207
  # Assistant node ids entered during this attempt, in traversal order.
4085
4208
  assistants_used: nil,
4209
+ # Notification emails sent in connection with the call, ordered oldest first
4210
+ # (from/to addresses, subject, sent time).
4211
+ email_log: nil,
4086
4212
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
4087
4213
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
4088
4214
  end_reason: nil,
@@ -4096,6 +4222,10 @@ module Revox
4096
4222
  # first. The in-call `send_sms` is excluded — it already appears in the transcript
4097
4223
  # as a tool call.
4098
4224
  sms_log: nil,
4225
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
4226
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
4227
+ # tracked or for realtime sessions that don't emit them.
4228
+ speech_events: nil,
4099
4229
  # The data extracted from the call, using the structured output config from the
4100
4230
  # parent call object.
4101
4231
  structured_output: nil,
@@ -4114,6 +4244,12 @@ module Revox
4114
4244
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::DialError::TaggedSymbol
4115
4245
  ),
4116
4246
  ended_at: T.anything,
4247
+ handled_by_ai: T::Boolean,
4248
+ handled_by_human: T::Boolean,
4249
+ handled_by_user:
4250
+ T.nilable(
4251
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::HandledByUser
4252
+ ),
4117
4253
  phone_number: String,
4118
4254
  recording_url: T.nilable(String),
4119
4255
  result:
@@ -4124,6 +4260,12 @@ module Revox
4124
4260
  status:
4125
4261
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Status::TaggedSymbol,
4126
4262
  assistants_used: T.nilable(T::Array[String]),
4263
+ email_log:
4264
+ T.nilable(
4265
+ T::Array[
4266
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::EmailLog
4267
+ ]
4268
+ ),
4127
4269
  end_reason:
4128
4270
  T.nilable(
4129
4271
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::EndReason::TaggedSymbol
@@ -4144,6 +4286,12 @@ module Revox
4144
4286
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog
4145
4287
  ]
4146
4288
  ),
4289
+ speech_events:
4290
+ T.nilable(
4291
+ T::Array[
4292
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent
4293
+ ]
4294
+ ),
4147
4295
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
4148
4296
  transcript:
4149
4297
  T.nilable(
@@ -4222,50 +4370,104 @@ module Revox
4222
4370
  end
4223
4371
  end
4224
4372
 
4225
- module Result
4226
- extend Revox::Internal::Type::Enum
4227
-
4228
- TaggedSymbol =
4373
+ class HandledByUser < Revox::Internal::Type::BaseModel
4374
+ OrHash =
4229
4375
  T.type_alias do
4230
- T.all(
4231
- Symbol,
4232
- Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result
4376
+ T.any(
4377
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::HandledByUser,
4378
+ Revox::Internal::AnyHash
4233
4379
  )
4234
4380
  end
4235
- OrSymbol = T.type_alias { T.any(Symbol, String) }
4236
4381
 
4237
- IVR =
4238
- T.let(
4239
- :IVR,
4240
- Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4241
- )
4242
- VOICEMAIL =
4243
- T.let(
4244
- :voicemail,
4245
- Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4246
- )
4247
- HUMAN =
4248
- T.let(
4249
- :human,
4250
- Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4251
- )
4252
- UNKNOWN =
4253
- T.let(
4254
- :unknown,
4255
- Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4256
- )
4257
- IOS_SCREENING_FILTER =
4258
- T.let(
4259
- :"ios-screening-filter",
4260
- Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4261
- )
4382
+ # The database user id of the assignee.
4383
+ sig { returns(String) }
4384
+ attr_accessor :id
4262
4385
 
4263
- sig do
4264
- override.returns(
4265
- T::Array[
4266
- Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4267
- ]
4268
- )
4386
+ sig { returns(String) }
4387
+ attr_accessor :email
4388
+
4389
+ sig { returns(T.nilable(String)) }
4390
+ attr_accessor :first_name
4391
+
4392
+ sig { returns(T.nilable(String)) }
4393
+ attr_accessor :last_name
4394
+
4395
+ # The team member responsible for following up on this call.
4396
+ sig do
4397
+ params(
4398
+ id: String,
4399
+ email: String,
4400
+ first_name: T.nilable(String),
4401
+ last_name: T.nilable(String)
4402
+ ).returns(T.attached_class)
4403
+ end
4404
+ def self.new(
4405
+ # The database user id of the assignee.
4406
+ id:,
4407
+ email:,
4408
+ first_name:,
4409
+ last_name:
4410
+ )
4411
+ end
4412
+
4413
+ sig do
4414
+ override.returns(
4415
+ {
4416
+ id: String,
4417
+ email: String,
4418
+ first_name: T.nilable(String),
4419
+ last_name: T.nilable(String)
4420
+ }
4421
+ )
4422
+ end
4423
+ def to_hash
4424
+ end
4425
+ end
4426
+
4427
+ module Result
4428
+ extend Revox::Internal::Type::Enum
4429
+
4430
+ TaggedSymbol =
4431
+ T.type_alias do
4432
+ T.all(
4433
+ Symbol,
4434
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result
4435
+ )
4436
+ end
4437
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
4438
+
4439
+ IVR =
4440
+ T.let(
4441
+ :IVR,
4442
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4443
+ )
4444
+ VOICEMAIL =
4445
+ T.let(
4446
+ :voicemail,
4447
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4448
+ )
4449
+ HUMAN =
4450
+ T.let(
4451
+ :human,
4452
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4453
+ )
4454
+ UNKNOWN =
4455
+ T.let(
4456
+ :unknown,
4457
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4458
+ )
4459
+ IOS_SCREENING_FILTER =
4460
+ T.let(
4461
+ :"ios-screening-filter",
4462
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4463
+ )
4464
+
4465
+ sig do
4466
+ override.returns(
4467
+ T::Array[
4468
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::Result::TaggedSymbol
4469
+ ]
4470
+ )
4269
4471
  end
4270
4472
  def self.values
4271
4473
  end
@@ -4321,6 +4523,71 @@ module Revox
4321
4523
  end
4322
4524
  end
4323
4525
 
4526
+ class EmailLog < Revox::Internal::Type::BaseModel
4527
+ OrHash =
4528
+ T.type_alias do
4529
+ T.any(
4530
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::EmailLog,
4531
+ Revox::Internal::AnyHash
4532
+ )
4533
+ end
4534
+
4535
+ sig { returns(String) }
4536
+ attr_accessor :id
4537
+
4538
+ # When the email was sent.
4539
+ sig { returns(T.anything) }
4540
+ attr_accessor :created_at
4541
+
4542
+ sig { returns(String) }
4543
+ attr_accessor :from_address
4544
+
4545
+ sig { returns(T.nilable(String)) }
4546
+ attr_accessor :resend_message_id
4547
+
4548
+ sig { returns(String) }
4549
+ attr_accessor :subject
4550
+
4551
+ sig { returns(T::Array[String]) }
4552
+ attr_accessor :to_emails
4553
+
4554
+ sig do
4555
+ params(
4556
+ id: String,
4557
+ created_at: T.anything,
4558
+ from_address: String,
4559
+ resend_message_id: T.nilable(String),
4560
+ subject: String,
4561
+ to_emails: T::Array[String]
4562
+ ).returns(T.attached_class)
4563
+ end
4564
+ def self.new(
4565
+ id:,
4566
+ # When the email was sent.
4567
+ created_at:,
4568
+ from_address:,
4569
+ resend_message_id:,
4570
+ subject:,
4571
+ to_emails:
4572
+ )
4573
+ end
4574
+
4575
+ sig do
4576
+ override.returns(
4577
+ {
4578
+ id: String,
4579
+ created_at: T.anything,
4580
+ from_address: String,
4581
+ resend_message_id: T.nilable(String),
4582
+ subject: String,
4583
+ to_emails: T::Array[String]
4584
+ }
4585
+ )
4586
+ end
4587
+ def to_hash
4588
+ end
4589
+ end
4590
+
4324
4591
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
4325
4592
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
4326
4593
  module EndReason
@@ -4650,11 +4917,18 @@ module Revox
4650
4917
  sig { returns(String) }
4651
4918
  attr_accessor :message_body
4652
4919
 
4653
- sig { returns(String) }
4654
- attr_accessor :to_phone_number
4920
+ sig do
4921
+ returns(
4922
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
4923
+ )
4924
+ end
4925
+ attr_accessor :provider
4655
4926
 
4656
4927
  sig { returns(T.nilable(String)) }
4657
- attr_accessor :twilio_message_sid
4928
+ attr_accessor :provider_message_id
4929
+
4930
+ sig { returns(String) }
4931
+ attr_accessor :to_phone_number
4658
4932
 
4659
4933
  sig do
4660
4934
  returns(
@@ -4668,8 +4942,10 @@ module Revox
4668
4942
  id: String,
4669
4943
  created_at: T.anything,
4670
4944
  message_body: String,
4945
+ provider:
4946
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Provider::OrSymbol,
4947
+ provider_message_id: T.nilable(String),
4671
4948
  to_phone_number: String,
4672
- twilio_message_sid: T.nilable(String),
4673
4949
  type:
4674
4950
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Type::OrSymbol
4675
4951
  ).returns(T.attached_class)
@@ -4679,8 +4955,9 @@ module Revox
4679
4955
  # When the SMS was sent.
4680
4956
  created_at:,
4681
4957
  message_body:,
4958
+ provider:,
4959
+ provider_message_id:,
4682
4960
  to_phone_number:,
4683
- twilio_message_sid:,
4684
4961
  type:
4685
4962
  )
4686
4963
  end
@@ -4691,8 +4968,10 @@ module Revox
4691
4968
  id: String,
4692
4969
  created_at: T.anything,
4693
4970
  message_body: String,
4971
+ provider:
4972
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Provider::TaggedSymbol,
4973
+ provider_message_id: T.nilable(String),
4694
4974
  to_phone_number: String,
4695
- twilio_message_sid: T.nilable(String),
4696
4975
  type:
4697
4976
  Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Type::TaggedSymbol
4698
4977
  }
@@ -4701,6 +4980,40 @@ module Revox
4701
4980
  def to_hash
4702
4981
  end
4703
4982
 
4983
+ module Provider
4984
+ extend Revox::Internal::Type::Enum
4985
+
4986
+ TaggedSymbol =
4987
+ T.type_alias do
4988
+ T.all(
4989
+ Symbol,
4990
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Provider
4991
+ )
4992
+ end
4993
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
4994
+
4995
+ TWILIO =
4996
+ T.let(
4997
+ :twilio,
4998
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
4999
+ )
5000
+ VONAGE =
5001
+ T.let(
5002
+ :vonage,
5003
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
5004
+ )
5005
+
5006
+ sig do
5007
+ override.returns(
5008
+ T::Array[
5009
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
5010
+ ]
5011
+ )
5012
+ end
5013
+ def self.values
5014
+ end
5015
+ end
5016
+
4704
5017
  module Type
4705
5018
  extend Revox::Internal::Type::Enum
4706
5019
 
@@ -4741,6 +5054,176 @@ module Revox
4741
5054
  end
4742
5055
  end
4743
5056
 
5057
+ class SpeechEvent < Revox::Internal::Type::BaseModel
5058
+ OrHash =
5059
+ T.type_alias do
5060
+ T.any(
5061
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent,
5062
+ Revox::Internal::AnyHash
5063
+ )
5064
+ end
5065
+
5066
+ sig { returns(String) }
5067
+ attr_accessor :id
5068
+
5069
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
5070
+ sig { returns(T::Boolean) }
5071
+ attr_accessor :is_real_turn
5072
+
5073
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
5074
+ # system instructions plus conversation history — as JSON.
5075
+ sig { returns(T.nilable(String)) }
5076
+ attr_accessor :llm_system_prompt
5077
+
5078
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
5079
+ sig { returns(T.nilable(Float)) }
5080
+ attr_accessor :llm_ttft_ms
5081
+
5082
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
5083
+ # a race, which is also the model `llm_ttft_ms` describes.
5084
+ sig { returns(T.nilable(String)) }
5085
+ attr_accessor :llm_winner_model
5086
+
5087
+ # Who was speaking during this segment.
5088
+ sig do
5089
+ returns(
5090
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
5091
+ )
5092
+ end
5093
+ attr_accessor :speaker
5094
+
5095
+ # Milliseconds since session start when speech began.
5096
+ sig { returns(Float) }
5097
+ attr_accessor :started_speaking_at_ms
5098
+
5099
+ # Milliseconds since session start when speech ended. Null when the session ended
5100
+ # before the turn closed.
5101
+ sig { returns(T.nilable(Float)) }
5102
+ attr_accessor :stopped_speaking_at_ms
5103
+
5104
+ # User-only: time from end-of-speech to final transcript, in ms.
5105
+ sig { returns(T.nilable(Float)) }
5106
+ attr_accessor :stt_transcription_delay_ms
5107
+
5108
+ # Recognized text for this segment, when available.
5109
+ sig { returns(T.nilable(String)) }
5110
+ attr_accessor :transcript
5111
+
5112
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
5113
+ sig { returns(T.nilable(Float)) }
5114
+ attr_accessor :tts_ttfb_ms
5115
+
5116
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
5117
+ # Null on user segments.
5118
+ sig { returns(T.nilable(T::Boolean)) }
5119
+ attr_accessor :was_cut
5120
+
5121
+ sig do
5122
+ params(
5123
+ id: String,
5124
+ is_real_turn: T::Boolean,
5125
+ llm_system_prompt: T.nilable(String),
5126
+ llm_ttft_ms: T.nilable(Float),
5127
+ llm_winner_model: T.nilable(String),
5128
+ speaker:
5129
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::Speaker::OrSymbol,
5130
+ started_speaking_at_ms: Float,
5131
+ stopped_speaking_at_ms: T.nilable(Float),
5132
+ stt_transcription_delay_ms: T.nilable(Float),
5133
+ transcript: T.nilable(String),
5134
+ tts_ttfb_ms: T.nilable(Float),
5135
+ was_cut: T.nilable(T::Boolean)
5136
+ ).returns(T.attached_class)
5137
+ end
5138
+ def self.new(
5139
+ id:,
5140
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
5141
+ is_real_turn:,
5142
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
5143
+ # system instructions plus conversation history — as JSON.
5144
+ llm_system_prompt:,
5145
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
5146
+ llm_ttft_ms:,
5147
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
5148
+ # a race, which is also the model `llm_ttft_ms` describes.
5149
+ llm_winner_model:,
5150
+ # Who was speaking during this segment.
5151
+ speaker:,
5152
+ # Milliseconds since session start when speech began.
5153
+ started_speaking_at_ms:,
5154
+ # Milliseconds since session start when speech ended. Null when the session ended
5155
+ # before the turn closed.
5156
+ stopped_speaking_at_ms:,
5157
+ # User-only: time from end-of-speech to final transcript, in ms.
5158
+ stt_transcription_delay_ms:,
5159
+ # Recognized text for this segment, when available.
5160
+ transcript:,
5161
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
5162
+ tts_ttfb_ms:,
5163
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
5164
+ # Null on user segments.
5165
+ was_cut:
5166
+ )
5167
+ end
5168
+
5169
+ sig do
5170
+ override.returns(
5171
+ {
5172
+ id: String,
5173
+ is_real_turn: T::Boolean,
5174
+ llm_system_prompt: T.nilable(String),
5175
+ llm_ttft_ms: T.nilable(Float),
5176
+ llm_winner_model: T.nilable(String),
5177
+ speaker:
5178
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol,
5179
+ started_speaking_at_ms: Float,
5180
+ stopped_speaking_at_ms: T.nilable(Float),
5181
+ stt_transcription_delay_ms: T.nilable(Float),
5182
+ transcript: T.nilable(String),
5183
+ tts_ttfb_ms: T.nilable(Float),
5184
+ was_cut: T.nilable(T::Boolean)
5185
+ }
5186
+ )
5187
+ end
5188
+ def to_hash
5189
+ end
5190
+
5191
+ # Who was speaking during this segment.
5192
+ module Speaker
5193
+ extend Revox::Internal::Type::Enum
5194
+
5195
+ TaggedSymbol =
5196
+ T.type_alias do
5197
+ T.all(
5198
+ Symbol,
5199
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::Speaker
5200
+ )
5201
+ end
5202
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
5203
+
5204
+ USER =
5205
+ T.let(
5206
+ :user,
5207
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
5208
+ )
5209
+ AGENT =
5210
+ T.let(
5211
+ :agent,
5212
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
5213
+ )
5214
+
5215
+ sig do
5216
+ override.returns(
5217
+ T::Array[
5218
+ Revox::Models::CampaignGetRowsResponse::Row::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
5219
+ ]
5220
+ )
5221
+ end
5222
+ def self.values
5223
+ end
5224
+ end
5225
+ end
5226
+
4744
5227
  class Transcript < Revox::Internal::Type::BaseModel
4745
5228
  OrHash =
4746
5229
  T.type_alias do
@@ -5087,7 +5570,8 @@ module Revox
5087
5570
  sig { returns(String) }
5088
5571
  attr_accessor :calling_window_start_time
5089
5572
 
5090
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
5573
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
5574
+ # allows. Default: 7200 (2 hours).
5091
5575
  sig { returns(Integer) }
5092
5576
  attr_accessor :retry_delay_seconds
5093
5577
 
@@ -5107,7 +5591,8 @@ module Revox
5107
5591
  # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
5108
5592
  # Examples: '09:00', '10am'. Default: '10:00'.
5109
5593
  calling_window_start_time:,
5110
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
5594
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
5595
+ # allows. Default: 7200 (2 hours).
5111
5596
  retry_delay_seconds:
5112
5597
  )
5113
5598
  end
@@ -5168,6 +5653,9 @@ module Revox
5168
5653
  sig { returns(T.nilable(String)) }
5169
5654
  attr_accessor :first_name
5170
5655
 
5656
+ sig { returns(T.nilable(String)) }
5657
+ attr_accessor :job_title
5658
+
5171
5659
  sig { returns(T.nilable(String)) }
5172
5660
  attr_accessor :last_name
5173
5661
 
@@ -5178,10 +5666,11 @@ module Revox
5178
5666
  company: T.nilable(String),
5179
5667
  email: T.nilable(String),
5180
5668
  first_name: T.nilable(String),
5669
+ job_title: T.nilable(String),
5181
5670
  last_name: T.nilable(String)
5182
5671
  ).returns(T.attached_class)
5183
5672
  end
5184
- def self.new(company:, email:, first_name:, last_name:)
5673
+ def self.new(company:, email:, first_name:, job_title:, last_name:)
5185
5674
  end
5186
5675
 
5187
5676
  sig do
@@ -5190,6 +5679,7 @@ module Revox
5190
5679
  company: T.nilable(String),
5191
5680
  email: T.nilable(String),
5192
5681
  first_name: T.nilable(String),
5682
+ job_title: T.nilable(String),
5193
5683
  last_name: T.nilable(String)
5194
5684
  }
5195
5685
  )
@@ -5264,6 +5754,37 @@ module Revox
5264
5754
  sig { returns(T.anything) }
5265
5755
  attr_accessor :ended_at
5266
5756
 
5757
+ # Whether the AI agent conducted the conversation on this attempt. False for a
5758
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
5759
+ # were never answered.
5760
+ sig { returns(T::Boolean) }
5761
+ attr_accessor :handled_by_ai
5762
+
5763
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
5764
+ # or a speed-dial operator connection (both stamp human_takeover_at).
5765
+ sig { returns(T::Boolean) }
5766
+ attr_accessor :handled_by_human
5767
+
5768
+ # The team member responsible for following up on this call.
5769
+ sig do
5770
+ returns(
5771
+ T.nilable(
5772
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::HandledByUser
5773
+ )
5774
+ )
5775
+ end
5776
+ attr_reader :handled_by_user
5777
+
5778
+ sig do
5779
+ params(
5780
+ handled_by_user:
5781
+ T.nilable(
5782
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::HandledByUser::OrHash
5783
+ )
5784
+ ).void
5785
+ end
5786
+ attr_writer :handled_by_user
5787
+
5267
5788
  # The phone number that was called. Formatted in E.164 format. Example:
5268
5789
  # +1234567890
5269
5790
  sig { returns(String) }
@@ -5298,6 +5819,19 @@ module Revox
5298
5819
  sig { returns(T.nilable(T::Array[String])) }
5299
5820
  attr_accessor :assistants_used
5300
5821
 
5822
+ # Notification emails sent in connection with the call, ordered oldest first
5823
+ # (from/to addresses, subject, sent time).
5824
+ sig do
5825
+ returns(
5826
+ T.nilable(
5827
+ T::Array[
5828
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::EmailLog
5829
+ ]
5830
+ )
5831
+ )
5832
+ end
5833
+ attr_accessor :email_log
5834
+
5301
5835
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
5302
5836
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
5303
5837
  sig do
@@ -5331,21 +5865,35 @@ module Revox
5331
5865
  )
5332
5866
  )
5333
5867
  end
5334
- attr_accessor :post_call_transcript
5868
+ attr_accessor :post_call_transcript
5869
+
5870
+ # Automatic SMS sent after the call (voicemail and after-call), ordered oldest
5871
+ # first. The in-call `send_sms` is excluded — it already appears in the transcript
5872
+ # as a tool call.
5873
+ sig do
5874
+ returns(
5875
+ T.nilable(
5876
+ T::Array[
5877
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog
5878
+ ]
5879
+ )
5880
+ )
5881
+ end
5882
+ attr_accessor :sms_log
5335
5883
 
5336
- # Automatic SMS sent after the call (voicemail and after-call), ordered oldest
5337
- # first. The in-call `send_sms` is excluded it already appears in the transcript
5338
- # as a tool call.
5884
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
5885
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
5886
+ # tracked or for realtime sessions that don't emit them.
5339
5887
  sig do
5340
5888
  returns(
5341
5889
  T.nilable(
5342
5890
  T::Array[
5343
- Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog
5891
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent
5344
5892
  ]
5345
5893
  )
5346
5894
  )
5347
5895
  end
5348
- attr_accessor :sms_log
5896
+ attr_accessor :speech_events
5349
5897
 
5350
5898
  # The data extracted from the call, using the structured output config from the
5351
5899
  # parent call object.
@@ -5375,6 +5923,12 @@ module Revox
5375
5923
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::DialError::OrSymbol
5376
5924
  ),
5377
5925
  ended_at: T.anything,
5926
+ handled_by_ai: T::Boolean,
5927
+ handled_by_human: T::Boolean,
5928
+ handled_by_user:
5929
+ T.nilable(
5930
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::HandledByUser::OrHash
5931
+ ),
5378
5932
  phone_number: String,
5379
5933
  recording_url: T.nilable(String),
5380
5934
  result:
@@ -5385,6 +5939,12 @@ module Revox
5385
5939
  status:
5386
5940
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::Status::OrSymbol,
5387
5941
  assistants_used: T.nilable(T::Array[String]),
5942
+ email_log:
5943
+ T.nilable(
5944
+ T::Array[
5945
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::EmailLog::OrHash
5946
+ ]
5947
+ ),
5388
5948
  end_reason:
5389
5949
  T.nilable(
5390
5950
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::EndReason::OrSymbol
@@ -5405,6 +5965,12 @@ module Revox
5405
5965
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::OrHash
5406
5966
  ]
5407
5967
  ),
5968
+ speech_events:
5969
+ T.nilable(
5970
+ T::Array[
5971
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::OrHash
5972
+ ]
5973
+ ),
5408
5974
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
5409
5975
  transcript:
5410
5976
  T.nilable(
@@ -5423,6 +5989,15 @@ module Revox
5423
5989
  dial_error:,
5424
5990
  # The time the call ended.
5425
5991
  ended_at:,
5992
+ # Whether the AI agent conducted the conversation on this attempt. False for a
5993
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
5994
+ # were never answered.
5995
+ handled_by_ai:,
5996
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
5997
+ # or a speed-dial operator connection (both stamp human_takeover_at).
5998
+ handled_by_human:,
5999
+ # The team member responsible for following up on this call.
6000
+ handled_by_user:,
5426
6001
  # The phone number that was called. Formatted in E.164 format. Example:
5427
6002
  # +1234567890
5428
6003
  phone_number:,
@@ -5435,6 +6010,9 @@ module Revox
5435
6010
  status:,
5436
6011
  # Assistant node ids entered during this attempt, in traversal order.
5437
6012
  assistants_used: nil,
6013
+ # Notification emails sent in connection with the call, ordered oldest first
6014
+ # (from/to addresses, subject, sent time).
6015
+ email_log: nil,
5438
6016
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
5439
6017
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
5440
6018
  end_reason: nil,
@@ -5448,6 +6026,10 @@ module Revox
5448
6026
  # first. The in-call `send_sms` is excluded — it already appears in the transcript
5449
6027
  # as a tool call.
5450
6028
  sms_log: nil,
6029
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
6030
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
6031
+ # tracked or for realtime sessions that don't emit them.
6032
+ speech_events: nil,
5451
6033
  # The data extracted from the call, using the structured output config from the
5452
6034
  # parent call object.
5453
6035
  structured_output: nil,
@@ -5466,6 +6048,12 @@ module Revox
5466
6048
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::DialError::TaggedSymbol
5467
6049
  ),
5468
6050
  ended_at: T.anything,
6051
+ handled_by_ai: T::Boolean,
6052
+ handled_by_human: T::Boolean,
6053
+ handled_by_user:
6054
+ T.nilable(
6055
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::HandledByUser
6056
+ ),
5469
6057
  phone_number: String,
5470
6058
  recording_url: T.nilable(String),
5471
6059
  result:
@@ -5476,6 +6064,12 @@ module Revox
5476
6064
  status:
5477
6065
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::Status::TaggedSymbol,
5478
6066
  assistants_used: T.nilable(T::Array[String]),
6067
+ email_log:
6068
+ T.nilable(
6069
+ T::Array[
6070
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::EmailLog
6071
+ ]
6072
+ ),
5479
6073
  end_reason:
5480
6074
  T.nilable(
5481
6075
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::EndReason::TaggedSymbol
@@ -5496,6 +6090,12 @@ module Revox
5496
6090
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog
5497
6091
  ]
5498
6092
  ),
6093
+ speech_events:
6094
+ T.nilable(
6095
+ T::Array[
6096
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent
6097
+ ]
6098
+ ),
5499
6099
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
5500
6100
  transcript:
5501
6101
  T.nilable(
@@ -5574,6 +6174,60 @@ module Revox
5574
6174
  end
5575
6175
  end
5576
6176
 
6177
+ class HandledByUser < Revox::Internal::Type::BaseModel
6178
+ OrHash =
6179
+ T.type_alias do
6180
+ T.any(
6181
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::HandledByUser,
6182
+ Revox::Internal::AnyHash
6183
+ )
6184
+ end
6185
+
6186
+ # The database user id of the assignee.
6187
+ sig { returns(String) }
6188
+ attr_accessor :id
6189
+
6190
+ sig { returns(String) }
6191
+ attr_accessor :email
6192
+
6193
+ sig { returns(T.nilable(String)) }
6194
+ attr_accessor :first_name
6195
+
6196
+ sig { returns(T.nilable(String)) }
6197
+ attr_accessor :last_name
6198
+
6199
+ # The team member responsible for following up on this call.
6200
+ sig do
6201
+ params(
6202
+ id: String,
6203
+ email: String,
6204
+ first_name: T.nilable(String),
6205
+ last_name: T.nilable(String)
6206
+ ).returns(T.attached_class)
6207
+ end
6208
+ def self.new(
6209
+ # The database user id of the assignee.
6210
+ id:,
6211
+ email:,
6212
+ first_name:,
6213
+ last_name:
6214
+ )
6215
+ end
6216
+
6217
+ sig do
6218
+ override.returns(
6219
+ {
6220
+ id: String,
6221
+ email: String,
6222
+ first_name: T.nilable(String),
6223
+ last_name: T.nilable(String)
6224
+ }
6225
+ )
6226
+ end
6227
+ def to_hash
6228
+ end
6229
+ end
6230
+
5577
6231
  module Result
5578
6232
  extend Revox::Internal::Type::Enum
5579
6233
 
@@ -5673,6 +6327,71 @@ module Revox
5673
6327
  end
5674
6328
  end
5675
6329
 
6330
+ class EmailLog < Revox::Internal::Type::BaseModel
6331
+ OrHash =
6332
+ T.type_alias do
6333
+ T.any(
6334
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::EmailLog,
6335
+ Revox::Internal::AnyHash
6336
+ )
6337
+ end
6338
+
6339
+ sig { returns(String) }
6340
+ attr_accessor :id
6341
+
6342
+ # When the email was sent.
6343
+ sig { returns(T.anything) }
6344
+ attr_accessor :created_at
6345
+
6346
+ sig { returns(String) }
6347
+ attr_accessor :from_address
6348
+
6349
+ sig { returns(T.nilable(String)) }
6350
+ attr_accessor :resend_message_id
6351
+
6352
+ sig { returns(String) }
6353
+ attr_accessor :subject
6354
+
6355
+ sig { returns(T::Array[String]) }
6356
+ attr_accessor :to_emails
6357
+
6358
+ sig do
6359
+ params(
6360
+ id: String,
6361
+ created_at: T.anything,
6362
+ from_address: String,
6363
+ resend_message_id: T.nilable(String),
6364
+ subject: String,
6365
+ to_emails: T::Array[String]
6366
+ ).returns(T.attached_class)
6367
+ end
6368
+ def self.new(
6369
+ id:,
6370
+ # When the email was sent.
6371
+ created_at:,
6372
+ from_address:,
6373
+ resend_message_id:,
6374
+ subject:,
6375
+ to_emails:
6376
+ )
6377
+ end
6378
+
6379
+ sig do
6380
+ override.returns(
6381
+ {
6382
+ id: String,
6383
+ created_at: T.anything,
6384
+ from_address: String,
6385
+ resend_message_id: T.nilable(String),
6386
+ subject: String,
6387
+ to_emails: T::Array[String]
6388
+ }
6389
+ )
6390
+ end
6391
+ def to_hash
6392
+ end
6393
+ end
6394
+
5676
6395
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
5677
6396
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
5678
6397
  module EndReason
@@ -6002,11 +6721,18 @@ module Revox
6002
6721
  sig { returns(String) }
6003
6722
  attr_accessor :message_body
6004
6723
 
6005
- sig { returns(String) }
6006
- attr_accessor :to_phone_number
6724
+ sig do
6725
+ returns(
6726
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6727
+ )
6728
+ end
6729
+ attr_accessor :provider
6007
6730
 
6008
6731
  sig { returns(T.nilable(String)) }
6009
- attr_accessor :twilio_message_sid
6732
+ attr_accessor :provider_message_id
6733
+
6734
+ sig { returns(String) }
6735
+ attr_accessor :to_phone_number
6010
6736
 
6011
6737
  sig do
6012
6738
  returns(
@@ -6020,8 +6746,10 @@ module Revox
6020
6746
  id: String,
6021
6747
  created_at: T.anything,
6022
6748
  message_body: String,
6749
+ provider:
6750
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Provider::OrSymbol,
6751
+ provider_message_id: T.nilable(String),
6023
6752
  to_phone_number: String,
6024
- twilio_message_sid: T.nilable(String),
6025
6753
  type:
6026
6754
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Type::OrSymbol
6027
6755
  ).returns(T.attached_class)
@@ -6031,8 +6759,9 @@ module Revox
6031
6759
  # When the SMS was sent.
6032
6760
  created_at:,
6033
6761
  message_body:,
6762
+ provider:,
6763
+ provider_message_id:,
6034
6764
  to_phone_number:,
6035
- twilio_message_sid:,
6036
6765
  type:
6037
6766
  )
6038
6767
  end
@@ -6043,8 +6772,10 @@ module Revox
6043
6772
  id: String,
6044
6773
  created_at: T.anything,
6045
6774
  message_body: String,
6775
+ provider:
6776
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol,
6777
+ provider_message_id: T.nilable(String),
6046
6778
  to_phone_number: String,
6047
- twilio_message_sid: T.nilable(String),
6048
6779
  type:
6049
6780
  Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Type::TaggedSymbol
6050
6781
  }
@@ -6053,6 +6784,40 @@ module Revox
6053
6784
  def to_hash
6054
6785
  end
6055
6786
 
6787
+ module Provider
6788
+ extend Revox::Internal::Type::Enum
6789
+
6790
+ TaggedSymbol =
6791
+ T.type_alias do
6792
+ T.all(
6793
+ Symbol,
6794
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Provider
6795
+ )
6796
+ end
6797
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
6798
+
6799
+ TWILIO =
6800
+ T.let(
6801
+ :twilio,
6802
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6803
+ )
6804
+ VONAGE =
6805
+ T.let(
6806
+ :vonage,
6807
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6808
+ )
6809
+
6810
+ sig do
6811
+ override.returns(
6812
+ T::Array[
6813
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6814
+ ]
6815
+ )
6816
+ end
6817
+ def self.values
6818
+ end
6819
+ end
6820
+
6056
6821
  module Type
6057
6822
  extend Revox::Internal::Type::Enum
6058
6823
 
@@ -6093,6 +6858,176 @@ module Revox
6093
6858
  end
6094
6859
  end
6095
6860
 
6861
+ class SpeechEvent < Revox::Internal::Type::BaseModel
6862
+ OrHash =
6863
+ T.type_alias do
6864
+ T.any(
6865
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent,
6866
+ Revox::Internal::AnyHash
6867
+ )
6868
+ end
6869
+
6870
+ sig { returns(String) }
6871
+ attr_accessor :id
6872
+
6873
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
6874
+ sig { returns(T::Boolean) }
6875
+ attr_accessor :is_real_turn
6876
+
6877
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
6878
+ # system instructions plus conversation history — as JSON.
6879
+ sig { returns(T.nilable(String)) }
6880
+ attr_accessor :llm_system_prompt
6881
+
6882
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
6883
+ sig { returns(T.nilable(Float)) }
6884
+ attr_accessor :llm_ttft_ms
6885
+
6886
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
6887
+ # a race, which is also the model `llm_ttft_ms` describes.
6888
+ sig { returns(T.nilable(String)) }
6889
+ attr_accessor :llm_winner_model
6890
+
6891
+ # Who was speaking during this segment.
6892
+ sig do
6893
+ returns(
6894
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
6895
+ )
6896
+ end
6897
+ attr_accessor :speaker
6898
+
6899
+ # Milliseconds since session start when speech began.
6900
+ sig { returns(Float) }
6901
+ attr_accessor :started_speaking_at_ms
6902
+
6903
+ # Milliseconds since session start when speech ended. Null when the session ended
6904
+ # before the turn closed.
6905
+ sig { returns(T.nilable(Float)) }
6906
+ attr_accessor :stopped_speaking_at_ms
6907
+
6908
+ # User-only: time from end-of-speech to final transcript, in ms.
6909
+ sig { returns(T.nilable(Float)) }
6910
+ attr_accessor :stt_transcription_delay_ms
6911
+
6912
+ # Recognized text for this segment, when available.
6913
+ sig { returns(T.nilable(String)) }
6914
+ attr_accessor :transcript
6915
+
6916
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
6917
+ sig { returns(T.nilable(Float)) }
6918
+ attr_accessor :tts_ttfb_ms
6919
+
6920
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
6921
+ # Null on user segments.
6922
+ sig { returns(T.nilable(T::Boolean)) }
6923
+ attr_accessor :was_cut
6924
+
6925
+ sig do
6926
+ params(
6927
+ id: String,
6928
+ is_real_turn: T::Boolean,
6929
+ llm_system_prompt: T.nilable(String),
6930
+ llm_ttft_ms: T.nilable(Float),
6931
+ llm_winner_model: T.nilable(String),
6932
+ speaker:
6933
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::Speaker::OrSymbol,
6934
+ started_speaking_at_ms: Float,
6935
+ stopped_speaking_at_ms: T.nilable(Float),
6936
+ stt_transcription_delay_ms: T.nilable(Float),
6937
+ transcript: T.nilable(String),
6938
+ tts_ttfb_ms: T.nilable(Float),
6939
+ was_cut: T.nilable(T::Boolean)
6940
+ ).returns(T.attached_class)
6941
+ end
6942
+ def self.new(
6943
+ id:,
6944
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
6945
+ is_real_turn:,
6946
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
6947
+ # system instructions plus conversation history — as JSON.
6948
+ llm_system_prompt:,
6949
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
6950
+ llm_ttft_ms:,
6951
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
6952
+ # a race, which is also the model `llm_ttft_ms` describes.
6953
+ llm_winner_model:,
6954
+ # Who was speaking during this segment.
6955
+ speaker:,
6956
+ # Milliseconds since session start when speech began.
6957
+ started_speaking_at_ms:,
6958
+ # Milliseconds since session start when speech ended. Null when the session ended
6959
+ # before the turn closed.
6960
+ stopped_speaking_at_ms:,
6961
+ # User-only: time from end-of-speech to final transcript, in ms.
6962
+ stt_transcription_delay_ms:,
6963
+ # Recognized text for this segment, when available.
6964
+ transcript:,
6965
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
6966
+ tts_ttfb_ms:,
6967
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
6968
+ # Null on user segments.
6969
+ was_cut:
6970
+ )
6971
+ end
6972
+
6973
+ sig do
6974
+ override.returns(
6975
+ {
6976
+ id: String,
6977
+ is_real_turn: T::Boolean,
6978
+ llm_system_prompt: T.nilable(String),
6979
+ llm_ttft_ms: T.nilable(Float),
6980
+ llm_winner_model: T.nilable(String),
6981
+ speaker:
6982
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol,
6983
+ started_speaking_at_ms: Float,
6984
+ stopped_speaking_at_ms: T.nilable(Float),
6985
+ stt_transcription_delay_ms: T.nilable(Float),
6986
+ transcript: T.nilable(String),
6987
+ tts_ttfb_ms: T.nilable(Float),
6988
+ was_cut: T.nilable(T::Boolean)
6989
+ }
6990
+ )
6991
+ end
6992
+ def to_hash
6993
+ end
6994
+
6995
+ # Who was speaking during this segment.
6996
+ module Speaker
6997
+ extend Revox::Internal::Type::Enum
6998
+
6999
+ TaggedSymbol =
7000
+ T.type_alias do
7001
+ T.all(
7002
+ Symbol,
7003
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::Speaker
7004
+ )
7005
+ end
7006
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
7007
+
7008
+ USER =
7009
+ T.let(
7010
+ :user,
7011
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
7012
+ )
7013
+ AGENT =
7014
+ T.let(
7015
+ :agent,
7016
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
7017
+ )
7018
+
7019
+ sig do
7020
+ override.returns(
7021
+ T::Array[
7022
+ Revox::Models::CampaignGetRowsResponse::Row::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
7023
+ ]
7024
+ )
7025
+ end
7026
+ def self.values
7027
+ end
7028
+ end
7029
+ end
7030
+
6096
7031
  class Transcript < Revox::Internal::Type::BaseModel
6097
7032
  OrHash =
6098
7033
  T.type_alias do
@@ -6603,6 +7538,11 @@ module Revox
6603
7538
  :post_processing,
6604
7539
  Revox::Models::CampaignGetRowsResponse::Row::Call::Status::TaggedSymbol
6605
7540
  )
7541
+ NOT_LAUNCHED =
7542
+ T.let(
7543
+ :not_launched,
7544
+ Revox::Models::CampaignGetRowsResponse::Row::Call::Status::TaggedSymbol
7545
+ )
6606
7546
  SCHEDULED =
6607
7547
  T.let(
6608
7548
  :scheduled,
@@ -6673,21 +7613,6 @@ module Revox
6673
7613
  :requested_callback_later,
6674
7614
  Revox::Models::CampaignGetRowsResponse::Row::Call::Outcome::TaggedSymbol
6675
7615
  )
6676
- REQUESTED_CALLBACK_NEW_NUMBER =
6677
- T.let(
6678
- :requested_callback_new_number,
6679
- Revox::Models::CampaignGetRowsResponse::Row::Call::Outcome::TaggedSymbol
6680
- )
6681
- DO_NOT_CONTACT =
6682
- T.let(
6683
- :do_not_contact,
6684
- Revox::Models::CampaignGetRowsResponse::Row::Call::Outcome::TaggedSymbol
6685
- )
6686
- AI_AVERSE =
6687
- T.let(
6688
- :ai_averse,
6689
- Revox::Models::CampaignGetRowsResponse::Row::Call::Outcome::TaggedSymbol
6690
- )
6691
7616
 
6692
7617
  sig do
6693
7618
  override.returns(