revox 0.3.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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/README.md +38 -38
  4. data/lib/revox/models/assistant_clone_response.rb +87 -65
  5. data/lib/revox/models/assistant_create_params.rb +90 -66
  6. data/lib/revox/models/assistant_create_response.rb +87 -65
  7. data/lib/revox/models/assistant_list_response.rb +87 -65
  8. data/lib/revox/models/assistant_retrieve_response.rb +86 -65
  9. data/lib/revox/models/assistant_update_params.rb +90 -66
  10. data/lib/revox/models/assistant_update_response.rb +87 -65
  11. data/lib/revox/models/call_create_params.rb +117 -90
  12. data/lib/revox/models/call_create_response.rb +670 -90
  13. data/lib/revox/models/call_export_params.rb +1 -3
  14. data/lib/revox/models/call_phone_history_response.rb +0 -3
  15. data/lib/revox/models/call_retrieve_response.rb +671 -90
  16. data/lib/revox/models/call_search_params.rb +1 -3
  17. data/lib/revox/models/call_search_response.rb +670 -90
  18. data/lib/revox/models/campaign_create_params.rb +7 -57
  19. data/lib/revox/models/campaign_create_response.rb +108 -119
  20. data/lib/revox/models/campaign_get_rows_response.rb +672 -90
  21. data/lib/revox/models/campaign_list_response.rb +108 -119
  22. data/lib/revox/models/campaign_retrieve_response.rb +108 -119
  23. data/lib/revox/models/campaign_statistics_response.rb +51 -23
  24. data/lib/revox/models/campaign_update_params.rb +9 -78
  25. data/lib/revox/models/campaign_update_response.rb +108 -119
  26. data/lib/revox/models/phone_number_list_response.rb +87 -65
  27. data/lib/revox/models/phone_number_update_response.rb +87 -65
  28. data/lib/revox/models/voice_list_response.rb +1 -0
  29. data/lib/revox/models/voice_preview_params.rb +1 -0
  30. data/lib/revox/models/voice_retrieve_params.rb +1 -0
  31. data/lib/revox/models.rb +0 -2
  32. data/lib/revox/resources/assistants.rb +10 -10
  33. data/lib/revox/resources/call.rb +4 -4
  34. data/lib/revox/resources/campaigns.rb +13 -45
  35. data/lib/revox/version.rb +1 -1
  36. data/lib/revox.rb +0 -2
  37. data/rbi/revox/models/assistant_clone_response.rbi +157 -147
  38. data/rbi/revox/models/assistant_create_params.rbi +148 -162
  39. data/rbi/revox/models/assistant_create_response.rbi +157 -147
  40. data/rbi/revox/models/assistant_list_response.rbi +157 -147
  41. data/rbi/revox/models/assistant_retrieve_response.rbi +153 -147
  42. data/rbi/revox/models/assistant_update_params.rbi +148 -162
  43. data/rbi/revox/models/assistant_update_response.rbi +157 -147
  44. data/rbi/revox/models/call_create_params.rbi +190 -187
  45. data/rbi/revox/models/call_create_response.rbi +1138 -227
  46. data/rbi/revox/models/call_export_params.rbi +5 -15
  47. data/rbi/revox/models/call_phone_history_response.rbi +0 -15
  48. data/rbi/revox/models/call_retrieve_response.rbi +1138 -227
  49. data/rbi/revox/models/call_search_params.rbi +2 -9
  50. data/rbi/revox/models/call_search_response.rbi +1138 -227
  51. data/rbi/revox/models/campaign_create_params.rbi +9 -87
  52. data/rbi/revox/models/campaign_create_response.rbi +188 -266
  53. data/rbi/revox/models/campaign_get_rows_response.rbi +1138 -225
  54. data/rbi/revox/models/campaign_list_response.rbi +188 -262
  55. data/rbi/revox/models/campaign_retrieve_response.rbi +188 -266
  56. data/rbi/revox/models/campaign_statistics_response.rbi +94 -36
  57. data/rbi/revox/models/campaign_update_params.rbi +10 -128
  58. data/rbi/revox/models/campaign_update_response.rbi +188 -266
  59. data/rbi/revox/models/phone_number_list_response.rbi +157 -147
  60. data/rbi/revox/models/phone_number_update_response.rbi +157 -147
  61. data/rbi/revox/models/voice_list_response.rbi +5 -0
  62. data/rbi/revox/models/voice_preview_params.rbi +2 -0
  63. data/rbi/revox/models/voice_retrieve_params.rbi +2 -0
  64. data/rbi/revox/models.rbi +0 -2
  65. data/rbi/revox/resources/assistants.rbi +40 -22
  66. data/rbi/revox/resources/call.rbi +7 -4
  67. data/rbi/revox/resources/campaigns.rbi +12 -44
  68. data/sig/revox/models/assistant_clone_response.rbs +46 -54
  69. data/sig/revox/models/assistant_create_params.rbs +39 -58
  70. data/sig/revox/models/assistant_create_response.rbs +46 -54
  71. data/sig/revox/models/assistant_list_response.rbs +46 -54
  72. data/sig/revox/models/assistant_retrieve_response.rbs +46 -54
  73. data/sig/revox/models/assistant_update_params.rbs +39 -58
  74. data/sig/revox/models/assistant_update_response.rbs +46 -54
  75. data/sig/revox/models/call_create_params.rbs +50 -71
  76. data/sig/revox/models/call_create_response.rbs +468 -77
  77. data/sig/revox/models/call_export_params.rbs +2 -6
  78. data/sig/revox/models/call_phone_history_response.rbs +1 -10
  79. data/sig/revox/models/call_retrieve_response.rbs +468 -77
  80. data/sig/revox/models/call_search_params.rbs +2 -6
  81. data/sig/revox/models/call_search_response.rbs +468 -77
  82. data/sig/revox/models/campaign_create_params.rbs +5 -50
  83. data/sig/revox/models/campaign_create_response.rbs +62 -98
  84. data/sig/revox/models/campaign_get_rows_response.rbs +467 -73
  85. data/sig/revox/models/campaign_list_response.rbs +62 -98
  86. data/sig/revox/models/campaign_retrieve_response.rbs +62 -98
  87. data/sig/revox/models/campaign_statistics_response.rbs +55 -24
  88. data/sig/revox/models/campaign_update_params.rbs +1 -69
  89. data/sig/revox/models/campaign_update_response.rbs +62 -98
  90. data/sig/revox/models/phone_number_list_response.rbs +46 -54
  91. data/sig/revox/models/phone_number_update_response.rbs +46 -54
  92. data/sig/revox/models/voice_list_response.rbs +2 -1
  93. data/sig/revox/models/voice_preview_params.rbs +2 -1
  94. data/sig/revox/models/voice_retrieve_params.rbs +2 -1
  95. data/sig/revox/models.rbs +0 -2
  96. data/sig/revox/resources/assistants.rbs +4 -4
  97. data/sig/revox/resources/call.rbs +1 -1
  98. data/sig/revox/resources/campaigns.rbs +0 -12
  99. metadata +2 -8
  100. data/lib/revox/models/campaign_launch_params.rb +0 -20
  101. data/lib/revox/models/campaign_launch_response.rb +0 -2030
  102. data/rbi/revox/models/campaign_launch_params.rbi +0 -33
  103. data/rbi/revox/models/campaign_launch_response.rbi +0 -4170
  104. data/sig/revox/models/campaign_launch_params.rbs +0 -20
  105. data/sig/revox/models/campaign_launch_response.rbs +0 -1694
@@ -257,6 +257,13 @@ module Revox
257
257
  sig { returns(T.nilable(String)) }
258
258
  attr_accessor :outcome_summary
259
259
 
260
+ # Slack channels resolved from the agent prompt's own routing rules, when it
261
+ # defines any. Always a subset of the channels configured on the assistant. Null
262
+ # when the prompt defines no routing rules, in which case every configured channel
263
+ # is notified.
264
+ sig { returns(T.nilable(T::Array[String])) }
265
+ attr_accessor :slack_channel_ids
266
+
260
267
  # This represent a call "order" that was requested by the user. A call order can
261
268
  # be resolved over multiple call attempts spanning up to a few days.
262
269
  sig do
@@ -314,7 +321,8 @@ module Revox
314
321
  T.nilable(
315
322
  Revox::Models::CallRetrieveResponse::Call::Outcome::OrSymbol
316
323
  ),
317
- outcome_summary: T.nilable(String)
324
+ outcome_summary: T.nilable(String),
325
+ slack_channel_ids: T.nilable(T::Array[String])
318
326
  ).returns(T.attached_class)
319
327
  end
320
328
  def self.new(
@@ -376,7 +384,12 @@ module Revox
376
384
  # Business outcome of the call. Null if not computed or no transcript.
377
385
  outcome: nil,
378
386
  # LLM explanation for the outcome, when outcome was computed from the transcript.
379
- outcome_summary: nil
387
+ outcome_summary: nil,
388
+ # Slack channels resolved from the agent prompt's own routing rules, when it
389
+ # defines any. Always a subset of the channels configured on the assistant. Null
390
+ # when the prompt defines no routing rules, in which case every configured channel
391
+ # is notified.
392
+ slack_channel_ids: nil
380
393
  )
381
394
  end
382
395
 
@@ -426,7 +439,8 @@ module Revox
426
439
  T.nilable(
427
440
  Revox::Models::CallRetrieveResponse::Call::Outcome::TaggedSymbol
428
441
  ),
429
- outcome_summary: T.nilable(String)
442
+ outcome_summary: T.nilable(String),
443
+ slack_channel_ids: T.nilable(T::Array[String])
430
444
  }
431
445
  )
432
446
  end
@@ -595,14 +609,6 @@ module Revox
595
609
  sig { returns(T.nilable(String)) }
596
610
  attr_accessor :email_notification_address
597
611
 
598
- # The language used for the notification email content. One of "en" or "fr".
599
- sig do
600
- returns(
601
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
602
- )
603
- end
604
- attr_accessor :email_notification_language
605
-
606
612
  # Which call outcomes trigger an email notification. E.g. ["interested",
607
613
  # "completed", "none"]. Use "none" when outcome is null.
608
614
  sig do
@@ -638,8 +644,8 @@ module Revox
638
644
  sig { returns(T.nilable(String)) }
639
645
  attr_accessor :from_phone_number
640
646
 
641
- # Warm or cold transfer when transfer_phone_number is set; null when transfer is
642
- # not configured.
647
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
648
+ # transfer is not configured.
643
649
  sig do
644
650
  returns(
645
651
  T.nilable(
@@ -702,6 +708,11 @@ module Revox
702
708
  end
703
709
  attr_writer :position
704
710
 
711
+ # URL fetched before an inbound call is answered to resolve the assistant's prompt
712
+ # variables. Null when no lookup is configured.
713
+ sig { returns(T.nilable(String)) }
714
+ attr_accessor :precall_lookup_url
715
+
705
716
  sig { returns(String) }
706
717
  attr_accessor :prompt
707
718
 
@@ -823,9 +834,18 @@ module Revox
823
834
  sig { returns(Float) }
824
835
  attr_accessor :thinking_sound_volume
825
836
 
826
- # Phone number to transfer calls to when users request to speak to a human agent.
827
- sig { returns(T.nilable(String)) }
828
- attr_accessor :transfer_phone_number
837
+ # Where calls can be transferred to when users ask to speak to a human. Null or
838
+ # empty when transfer is not configured.
839
+ sig do
840
+ returns(
841
+ T.nilable(
842
+ T::Array[
843
+ Revox::Models::CallRetrieveResponse::Call::Assistant::TransferDestination
844
+ ]
845
+ )
846
+ )
847
+ end
848
+ attr_accessor :transfer_destinations
829
849
 
830
850
  sig do
831
851
  returns(
@@ -935,6 +955,12 @@ module Revox
935
955
  end
936
956
  attr_writer :faq_items
937
957
 
958
+ sig { returns(T.nilable(T::Boolean)) }
959
+ attr_reader :is_inbound_receptionist
960
+
961
+ sig { params(is_inbound_receptionist: T::Boolean).void }
962
+ attr_writer :is_inbound_receptionist
963
+
938
964
  sig { returns(T.nilable(T::Boolean)) }
939
965
  attr_reader :is_realestate_assistant
940
966
 
@@ -979,8 +1005,6 @@ module Revox
979
1005
  ]
980
1006
  ),
981
1007
  email_notification_address: T.nilable(String),
982
- email_notification_language:
983
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationLanguage::OrSymbol,
984
1008
  email_notification_outcomes:
985
1009
  T.nilable(
986
1010
  T::Array[
@@ -1014,6 +1038,7 @@ module Revox
1014
1038
  T.nilable(
1015
1039
  Revox::Models::CallRetrieveResponse::Call::Assistant::Position::OrHash
1016
1040
  ),
1041
+ precall_lookup_url: T.nilable(String),
1017
1042
  prompt: String,
1018
1043
  prompt_flow:
1019
1044
  T.nilable(
@@ -1044,7 +1069,12 @@ module Revox
1044
1069
  ),
1045
1070
  thinking_sound_probability: Float,
1046
1071
  thinking_sound_volume: Float,
1047
- transfer_phone_number: T.nilable(String),
1072
+ transfer_destinations:
1073
+ T.nilable(
1074
+ T::Array[
1075
+ Revox::Models::CallRetrieveResponse::Call::Assistant::TransferDestination::OrHash
1076
+ ]
1077
+ ),
1048
1078
  type:
1049
1079
  Revox::Models::CallRetrieveResponse::Call::Assistant::Type::OrSymbol,
1050
1080
  updated_at: T.anything,
@@ -1068,6 +1098,7 @@ module Revox
1068
1098
  T::Array[
1069
1099
  Revox::Models::CallRetrieveResponse::Call::Assistant::FaqItem::OrHash
1070
1100
  ],
1101
+ is_inbound_receptionist: T::Boolean,
1071
1102
  is_realestate_assistant: T::Boolean,
1072
1103
  pending_faq_count: Float
1073
1104
  ).returns(T.attached_class)
@@ -1096,8 +1127,6 @@ module Revox
1096
1127
  # outcome. Accepts a single email or a comma-separated list (e.g. "alice@x.com,
1097
1128
  # bob@y.com").
1098
1129
  email_notification_address:,
1099
- # The language used for the notification email content. One of "en" or "fr".
1100
- email_notification_language:,
1101
1130
  # Which call outcomes trigger an email notification. E.g. ["interested",
1102
1131
  # "completed", "none"]. Use "none" when outcome is null.
1103
1132
  email_notification_outcomes:,
@@ -1109,8 +1138,8 @@ module Revox
1109
1138
  # Override the default outbound phone number for calls placed with this assistant.
1110
1139
  # When null, the organization's default phone number is used.
1111
1140
  from_phone_number:,
1112
- # Warm or cold transfer when transfer_phone_number is set; null when transfer is
1113
- # not configured.
1141
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
1142
+ # transfer is not configured.
1114
1143
  human_transfer_mode:,
1115
1144
  # Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and
1116
1145
  # skip turns to navigate phone menus.
@@ -1129,6 +1158,9 @@ module Revox
1129
1158
  name:,
1130
1159
  organization_id:,
1131
1160
  position:,
1161
+ # URL fetched before an inbound call is answered to resolve the assistant's prompt
1162
+ # variables. Null when no lookup is configured.
1163
+ precall_lookup_url:,
1132
1164
  prompt:,
1133
1165
  prompt_flow:,
1134
1166
  slack:,
@@ -1160,8 +1192,9 @@ module Revox
1160
1192
  thinking_sound_probability:,
1161
1193
  # Volume of the thinking sound (0 = silent, 1 = max).
1162
1194
  thinking_sound_volume:,
1163
- # Phone number to transfer calls to when users request to speak to a human agent.
1164
- transfer_phone_number:,
1195
+ # Where calls can be transferred to when users ask to speak to a human. Null or
1196
+ # empty when transfer is not configured.
1197
+ transfer_destinations:,
1165
1198
  type:,
1166
1199
  updated_at:,
1167
1200
  voice:,
@@ -1180,6 +1213,7 @@ module Revox
1180
1213
  # The user who created the assistant.
1181
1214
  created_by: nil,
1182
1215
  faq_items: nil,
1216
+ is_inbound_receptionist: nil,
1183
1217
  is_realestate_assistant: nil,
1184
1218
  pending_faq_count: nil
1185
1219
  )
@@ -1218,8 +1252,6 @@ module Revox
1218
1252
  ]
1219
1253
  ),
1220
1254
  email_notification_address: T.nilable(String),
1221
- email_notification_language:
1222
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationLanguage::TaggedSymbol,
1223
1255
  email_notification_outcomes:
1224
1256
  T.nilable(
1225
1257
  T::Array[
@@ -1248,6 +1280,7 @@ module Revox
1248
1280
  T.nilable(
1249
1281
  Revox::Models::CallRetrieveResponse::Call::Assistant::Position
1250
1282
  ),
1283
+ precall_lookup_url: T.nilable(String),
1251
1284
  prompt: String,
1252
1285
  prompt_flow:
1253
1286
  T.nilable(
@@ -1278,7 +1311,12 @@ module Revox
1278
1311
  ),
1279
1312
  thinking_sound_probability: Float,
1280
1313
  thinking_sound_volume: Float,
1281
- transfer_phone_number: T.nilable(String),
1314
+ transfer_destinations:
1315
+ T.nilable(
1316
+ T::Array[
1317
+ Revox::Models::CallRetrieveResponse::Call::Assistant::TransferDestination
1318
+ ]
1319
+ ),
1282
1320
  type:
1283
1321
  Revox::Models::CallRetrieveResponse::Call::Assistant::Type::TaggedSymbol,
1284
1322
  updated_at: T.anything,
@@ -1302,6 +1340,7 @@ module Revox
1302
1340
  T::Array[
1303
1341
  Revox::Models::CallRetrieveResponse::Call::Assistant::FaqItem
1304
1342
  ],
1343
+ is_inbound_receptionist: T::Boolean,
1305
1344
  is_realestate_assistant: T::Boolean,
1306
1345
  pending_faq_count: Float
1307
1346
  }
@@ -1342,21 +1381,6 @@ module Revox
1342
1381
  :requested_callback_later,
1343
1382
  Revox::Models::CallRetrieveResponse::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1344
1383
  )
1345
- REQUESTED_CALLBACK_NEW_NUMBER =
1346
- T.let(
1347
- :requested_callback_new_number,
1348
- Revox::Models::CallRetrieveResponse::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1349
- )
1350
- DO_NOT_CONTACT =
1351
- T.let(
1352
- :do_not_contact,
1353
- Revox::Models::CallRetrieveResponse::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1354
- )
1355
- AI_AVERSE =
1356
- T.let(
1357
- :ai_averse,
1358
- Revox::Models::CallRetrieveResponse::Call::Assistant::AfterCallSMSOutcome::TaggedSymbol
1359
- )
1360
1384
  NONE =
1361
1385
  T.let(
1362
1386
  :none,
@@ -1625,7 +1649,8 @@ module Revox
1625
1649
  sig { returns(String) }
1626
1650
  attr_accessor :calling_window_start_time
1627
1651
 
1628
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
1652
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1653
+ # allows. Default: 7200 (2 hours).
1629
1654
  sig { returns(Integer) }
1630
1655
  attr_accessor :retry_delay_seconds
1631
1656
 
@@ -1645,7 +1670,8 @@ module Revox
1645
1670
  # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
1646
1671
  # Examples: '09:00', '10am'. Default: '10:00'.
1647
1672
  calling_window_start_time:,
1648
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
1673
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
1674
+ # allows. Default: 7200 (2 hours).
1649
1675
  retry_delay_seconds:
1650
1676
  )
1651
1677
  end
@@ -2032,41 +2058,6 @@ module Revox
2032
2058
  end
2033
2059
  end
2034
2060
 
2035
- # The language used for the notification email content. One of "en" or "fr".
2036
- module EmailNotificationLanguage
2037
- extend Revox::Internal::Type::Enum
2038
-
2039
- TaggedSymbol =
2040
- T.type_alias do
2041
- T.all(
2042
- Symbol,
2043
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationLanguage
2044
- )
2045
- end
2046
- OrSymbol = T.type_alias { T.any(Symbol, String) }
2047
-
2048
- EN =
2049
- T.let(
2050
- :en,
2051
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
2052
- )
2053
- FR =
2054
- T.let(
2055
- :fr,
2056
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
2057
- )
2058
-
2059
- sig do
2060
- override.returns(
2061
- T::Array[
2062
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationLanguage::TaggedSymbol
2063
- ]
2064
- )
2065
- end
2066
- def self.values
2067
- end
2068
- end
2069
-
2070
2061
  module EmailNotificationOutcome
2071
2062
  extend Revox::Internal::Type::Enum
2072
2063
 
@@ -2099,21 +2090,6 @@ module Revox
2099
2090
  :requested_callback_later,
2100
2091
  Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2101
2092
  )
2102
- REQUESTED_CALLBACK_NEW_NUMBER =
2103
- T.let(
2104
- :requested_callback_new_number,
2105
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2106
- )
2107
- DO_NOT_CONTACT =
2108
- T.let(
2109
- :do_not_contact,
2110
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2111
- )
2112
- AI_AVERSE =
2113
- T.let(
2114
- :ai_averse,
2115
- Revox::Models::CallRetrieveResponse::Call::Assistant::EmailNotificationOutcome::TaggedSymbol
2116
- )
2117
2093
  NONE =
2118
2094
  T.let(
2119
2095
  :none,
@@ -2170,8 +2146,8 @@ module Revox
2170
2146
  end
2171
2147
  end
2172
2148
 
2173
- # Warm or cold transfer when transfer_phone_number is set; null when transfer is
2174
- # not configured.
2149
+ # Warm or cold transfer when transfer_destinations is non-empty; null when
2150
+ # transfer is not configured.
2175
2151
  module HumanTransferMode
2176
2152
  extend Revox::Internal::Type::Enum
2177
2153
 
@@ -2769,9 +2745,17 @@ module Revox
2769
2745
  )
2770
2746
  end
2771
2747
 
2772
- # The Slack channel ID where the notification will be posted.
2773
- sig { returns(String) }
2774
- attr_accessor :channel_id
2748
+ # The Slack channels eligible to receive the notification. When more than one is
2749
+ # configured, the agent prompt may define routing rules to narrow it down per
2750
+ # call; with no such rules every channel here is notified.
2751
+ sig do
2752
+ returns(
2753
+ T::Array[
2754
+ Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Channel
2755
+ ]
2756
+ )
2757
+ end
2758
+ attr_accessor :channels
2775
2759
 
2776
2760
  # The Nango connection ID linking the org's Slack workspace to Revox.
2777
2761
  sig { returns(String) }
@@ -2788,45 +2772,43 @@ module Revox
2788
2772
  end
2789
2773
  attr_accessor :outcomes
2790
2774
 
2791
- # Human-readable Slack channel name, cached for display in the UI.
2792
- sig { returns(T.nilable(String)) }
2793
- attr_accessor :channel_name
2794
-
2795
2775
  # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2796
2776
  # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2797
- # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2798
- # prompt_variables and structured_output keys. When null/empty a default template
2799
- # is used.
2777
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2778
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2779
+ # null/empty a default template is used.
2800
2780
  sig { returns(T.nilable(String)) }
2801
2781
  attr_accessor :template
2802
2782
 
2803
2783
  sig do
2804
2784
  params(
2805
- channel_id: String,
2785
+ channels:
2786
+ T::Array[
2787
+ Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Channel::OrHash
2788
+ ],
2806
2789
  connection_id: String,
2807
2790
  outcomes:
2808
2791
  T::Array[
2809
2792
  Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Outcome::OrSymbol
2810
2793
  ],
2811
- channel_name: T.nilable(String),
2812
2794
  template: T.nilable(String)
2813
2795
  ).returns(T.attached_class)
2814
2796
  end
2815
2797
  def self.new(
2816
- # The Slack channel ID where the notification will be posted.
2817
- channel_id:,
2798
+ # The Slack channels eligible to receive the notification. When more than one is
2799
+ # configured, the agent prompt may define routing rules to narrow it down per
2800
+ # call; with no such rules every channel here is notified.
2801
+ channels:,
2818
2802
  # The Nango connection ID linking the org's Slack workspace to Revox.
2819
2803
  connection_id:,
2820
2804
  # Which call outcomes trigger a Slack notification (e.g. ['interested', 'none']).
2821
2805
  # Use 'none' to notify when outcome is null.
2822
2806
  outcomes:,
2823
- # Human-readable Slack channel name, cached for display in the UI.
2824
- channel_name: nil,
2825
2807
  # Optional message template. Supports {{summary}}, {{outcome}}, {{phone}},
2826
2808
  # {{call_url}}, {{assistant_name}}, {{campaign_name}}, {{first_name}},
2827
- # {{last_name}}, {{email}}, {{company}}, {{contact_name}}, {{contact_line}}, plus
2828
- # prompt_variables and structured_output keys. When null/empty a default template
2829
- # is used.
2809
+ # {{last_name}}, {{email}}, {{company}}, {{job_title}}, {{contact_name}},
2810
+ # {{contact_line}}, plus prompt_variables and structured_output keys. When
2811
+ # null/empty a default template is used.
2830
2812
  template: nil
2831
2813
  )
2832
2814
  end
@@ -2834,13 +2816,15 @@ module Revox
2834
2816
  sig do
2835
2817
  override.returns(
2836
2818
  {
2837
- channel_id: String,
2819
+ channels:
2820
+ T::Array[
2821
+ Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Channel
2822
+ ],
2838
2823
  connection_id: String,
2839
2824
  outcomes:
2840
2825
  T::Array[
2841
2826
  Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Outcome::TaggedSymbol
2842
2827
  ],
2843
- channel_name: T.nilable(String),
2844
2828
  template: T.nilable(String)
2845
2829
  }
2846
2830
  )
@@ -2848,6 +2832,43 @@ module Revox
2848
2832
  def to_hash
2849
2833
  end
2850
2834
 
2835
+ class Channel < Revox::Internal::Type::BaseModel
2836
+ OrHash =
2837
+ T.type_alias do
2838
+ T.any(
2839
+ Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Channel,
2840
+ Revox::Internal::AnyHash
2841
+ )
2842
+ end
2843
+
2844
+ # The Slack channel ID (e.g. 'C01234567').
2845
+ sig { returns(String) }
2846
+ attr_accessor :id
2847
+
2848
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2849
+ # LLM when the agent prompt routes by channel name.
2850
+ sig { returns(T.nilable(String)) }
2851
+ attr_accessor :name
2852
+
2853
+ sig do
2854
+ params(id: String, name: T.nilable(String)).returns(
2855
+ T.attached_class
2856
+ )
2857
+ end
2858
+ def self.new(
2859
+ # The Slack channel ID (e.g. 'C01234567').
2860
+ id:,
2861
+ # Human-readable Slack channel name, cached for display in the UI and given to the
2862
+ # LLM when the agent prompt routes by channel name.
2863
+ name: nil
2864
+ )
2865
+ end
2866
+
2867
+ sig { override.returns({ id: String, name: T.nilable(String) }) }
2868
+ def to_hash
2869
+ end
2870
+ end
2871
+
2851
2872
  module Outcome
2852
2873
  extend Revox::Internal::Type::Enum
2853
2874
 
@@ -2880,21 +2901,6 @@ module Revox
2880
2901
  :requested_callback_later,
2881
2902
  Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Outcome::TaggedSymbol
2882
2903
  )
2883
- REQUESTED_CALLBACK_NEW_NUMBER =
2884
- T.let(
2885
- :requested_callback_new_number,
2886
- Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Outcome::TaggedSymbol
2887
- )
2888
- DO_NOT_CONTACT =
2889
- T.let(
2890
- :do_not_contact,
2891
- Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Outcome::TaggedSymbol
2892
- )
2893
- AI_AVERSE =
2894
- T.let(
2895
- :ai_averse,
2896
- Revox::Models::CallRetrieveResponse::Call::Assistant::Slack::Outcome::TaggedSymbol
2897
- )
2898
2904
  NONE =
2899
2905
  T.let(
2900
2906
  :none,
@@ -3209,6 +3215,34 @@ module Revox
3209
3215
  end
3210
3216
  end
3211
3217
 
3218
+ class TransferDestination < Revox::Internal::Type::BaseModel
3219
+ OrHash =
3220
+ T.type_alias do
3221
+ T.any(
3222
+ Revox::Models::CallRetrieveResponse::Call::Assistant::TransferDestination,
3223
+ Revox::Internal::AnyHash
3224
+ )
3225
+ end
3226
+
3227
+ sig { returns(String) }
3228
+ attr_accessor :label
3229
+
3230
+ sig { returns(String) }
3231
+ attr_accessor :phone_number
3232
+
3233
+ sig do
3234
+ params(label: String, phone_number: String).returns(
3235
+ T.attached_class
3236
+ )
3237
+ end
3238
+ def self.new(label:, phone_number:)
3239
+ end
3240
+
3241
+ sig { override.returns({ label: String, phone_number: String }) }
3242
+ def to_hash
3243
+ end
3244
+ end
3245
+
3212
3246
  module Type
3213
3247
  extend Revox::Internal::Type::Enum
3214
3248
 
@@ -3289,7 +3323,7 @@ module Revox
3289
3323
  attr_writer :model
3290
3324
 
3291
3325
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
3292
- # 0.7–1.2. Default is 1.0.
3326
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
3293
3327
  sig { returns(T.nilable(Float)) }
3294
3328
  attr_reader :speed
3295
3329
 
@@ -3324,7 +3358,7 @@ module Revox
3324
3358
  # for other providers.
3325
3359
  model: nil,
3326
3360
  # The speed of the voice. Range depends on provider: Cartesia 0.6–1.5, ElevenLabs
3327
- # 0.7–1.2. Default is 1.0.
3361
+ # 0.7–1.2, Gradium 0.6–1.5. Default is 1.0.
3328
3362
  speed: nil,
3329
3363
  # Volume of the voice (Cartesia only). 0.5–2.0, default 1.0. Ignored for other
3330
3364
  # providers.
@@ -3371,6 +3405,11 @@ module Revox
3371
3405
  :elevenlabs,
3372
3406
  Revox::Models::CallRetrieveResponse::Call::Assistant::Voice::Provider::TaggedSymbol
3373
3407
  )
3408
+ GRADIUM =
3409
+ T.let(
3410
+ :gradium,
3411
+ Revox::Models::CallRetrieveResponse::Call::Assistant::Voice::Provider::TaggedSymbol
3412
+ )
3374
3413
 
3375
3414
  sig do
3376
3415
  override.returns(
@@ -3601,21 +3640,6 @@ module Revox
3601
3640
  :requested_callback_later,
3602
3641
  Revox::Models::CallRetrieveResponse::Call::Assistant::Zoho::Outcome::TaggedSymbol
3603
3642
  )
3604
- REQUESTED_CALLBACK_NEW_NUMBER =
3605
- T.let(
3606
- :requested_callback_new_number,
3607
- Revox::Models::CallRetrieveResponse::Call::Assistant::Zoho::Outcome::TaggedSymbol
3608
- )
3609
- DO_NOT_CONTACT =
3610
- T.let(
3611
- :do_not_contact,
3612
- Revox::Models::CallRetrieveResponse::Call::Assistant::Zoho::Outcome::TaggedSymbol
3613
- )
3614
- AI_AVERSE =
3615
- T.let(
3616
- :ai_averse,
3617
- Revox::Models::CallRetrieveResponse::Call::Assistant::Zoho::Outcome::TaggedSymbol
3618
- )
3619
3643
  NONE =
3620
3644
  T.let(
3621
3645
  :none,
@@ -3833,6 +3857,37 @@ module Revox
3833
3857
  sig { returns(T.anything) }
3834
3858
  attr_accessor :ended_at
3835
3859
 
3860
+ # Whether the AI agent conducted the conversation on this attempt. False for a
3861
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
3862
+ # were never answered.
3863
+ sig { returns(T::Boolean) }
3864
+ attr_accessor :handled_by_ai
3865
+
3866
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
3867
+ # or a speed-dial operator connection (both stamp human_takeover_at).
3868
+ sig { returns(T::Boolean) }
3869
+ attr_accessor :handled_by_human
3870
+
3871
+ # The team member responsible for following up on this call.
3872
+ sig do
3873
+ returns(
3874
+ T.nilable(
3875
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::HandledByUser
3876
+ )
3877
+ )
3878
+ end
3879
+ attr_reader :handled_by_user
3880
+
3881
+ sig do
3882
+ params(
3883
+ handled_by_user:
3884
+ T.nilable(
3885
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::HandledByUser::OrHash
3886
+ )
3887
+ ).void
3888
+ end
3889
+ attr_writer :handled_by_user
3890
+
3836
3891
  # The phone number that was called. Formatted in E.164 format. Example:
3837
3892
  # +1234567890
3838
3893
  sig { returns(String) }
@@ -3867,6 +3922,19 @@ module Revox
3867
3922
  sig { returns(T.nilable(T::Array[String])) }
3868
3923
  attr_accessor :assistants_used
3869
3924
 
3925
+ # Notification emails sent in connection with the call, ordered oldest first
3926
+ # (from/to addresses, subject, sent time).
3927
+ sig do
3928
+ returns(
3929
+ T.nilable(
3930
+ T::Array[
3931
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::EmailLog
3932
+ ]
3933
+ )
3934
+ )
3935
+ end
3936
+ attr_accessor :email_log
3937
+
3870
3938
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
3871
3939
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
3872
3940
  sig do
@@ -3916,6 +3984,20 @@ module Revox
3916
3984
  end
3917
3985
  attr_accessor :sms_log
3918
3986
 
3987
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
3988
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
3989
+ # tracked or for realtime sessions that don't emit them.
3990
+ sig do
3991
+ returns(
3992
+ T.nilable(
3993
+ T::Array[
3994
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent
3995
+ ]
3996
+ )
3997
+ )
3998
+ end
3999
+ attr_accessor :speech_events
4000
+
3919
4001
  # The data extracted from the call, using the structured output config from the
3920
4002
  # parent call object.
3921
4003
  sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
@@ -3944,6 +4026,12 @@ module Revox
3944
4026
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::DialError::OrSymbol
3945
4027
  ),
3946
4028
  ended_at: T.anything,
4029
+ handled_by_ai: T::Boolean,
4030
+ handled_by_human: T::Boolean,
4031
+ handled_by_user:
4032
+ T.nilable(
4033
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::HandledByUser::OrHash
4034
+ ),
3947
4035
  phone_number: String,
3948
4036
  recording_url: T.nilable(String),
3949
4037
  result:
@@ -3954,6 +4042,12 @@ module Revox
3954
4042
  status:
3955
4043
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::Status::OrSymbol,
3956
4044
  assistants_used: T.nilable(T::Array[String]),
4045
+ email_log:
4046
+ T.nilable(
4047
+ T::Array[
4048
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::EmailLog::OrHash
4049
+ ]
4050
+ ),
3957
4051
  end_reason:
3958
4052
  T.nilable(
3959
4053
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::EndReason::OrSymbol
@@ -3974,6 +4068,12 @@ module Revox
3974
4068
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::OrHash
3975
4069
  ]
3976
4070
  ),
4071
+ speech_events:
4072
+ T.nilable(
4073
+ T::Array[
4074
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::OrHash
4075
+ ]
4076
+ ),
3977
4077
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
3978
4078
  transcript:
3979
4079
  T.nilable(
@@ -3992,6 +4092,15 @@ module Revox
3992
4092
  dial_error:,
3993
4093
  # The time the call ended.
3994
4094
  ended_at:,
4095
+ # Whether the AI agent conducted the conversation on this attempt. False for a
4096
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
4097
+ # were never answered.
4098
+ handled_by_ai:,
4099
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
4100
+ # or a speed-dial operator connection (both stamp human_takeover_at).
4101
+ handled_by_human:,
4102
+ # The team member responsible for following up on this call.
4103
+ handled_by_user:,
3995
4104
  # The phone number that was called. Formatted in E.164 format. Example:
3996
4105
  # +1234567890
3997
4106
  phone_number:,
@@ -4004,6 +4113,9 @@ module Revox
4004
4113
  status:,
4005
4114
  # Assistant node ids entered during this attempt, in traversal order.
4006
4115
  assistants_used: nil,
4116
+ # Notification emails sent in connection with the call, ordered oldest first
4117
+ # (from/to addresses, subject, sent time).
4118
+ email_log: nil,
4007
4119
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
4008
4120
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
4009
4121
  end_reason: nil,
@@ -4017,6 +4129,10 @@ module Revox
4017
4129
  # first. The in-call `send_sms` is excluded — it already appears in the transcript
4018
4130
  # as a tool call.
4019
4131
  sms_log: nil,
4132
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
4133
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
4134
+ # tracked or for realtime sessions that don't emit them.
4135
+ speech_events: nil,
4020
4136
  # The data extracted from the call, using the structured output config from the
4021
4137
  # parent call object.
4022
4138
  structured_output: nil,
@@ -4035,6 +4151,12 @@ module Revox
4035
4151
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::DialError::TaggedSymbol
4036
4152
  ),
4037
4153
  ended_at: T.anything,
4154
+ handled_by_ai: T::Boolean,
4155
+ handled_by_human: T::Boolean,
4156
+ handled_by_user:
4157
+ T.nilable(
4158
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::HandledByUser
4159
+ ),
4038
4160
  phone_number: String,
4039
4161
  recording_url: T.nilable(String),
4040
4162
  result:
@@ -4045,6 +4167,12 @@ module Revox
4045
4167
  status:
4046
4168
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::Status::TaggedSymbol,
4047
4169
  assistants_used: T.nilable(T::Array[String]),
4170
+ email_log:
4171
+ T.nilable(
4172
+ T::Array[
4173
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::EmailLog
4174
+ ]
4175
+ ),
4048
4176
  end_reason:
4049
4177
  T.nilable(
4050
4178
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::EndReason::TaggedSymbol
@@ -4065,6 +4193,12 @@ module Revox
4065
4193
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog
4066
4194
  ]
4067
4195
  ),
4196
+ speech_events:
4197
+ T.nilable(
4198
+ T::Array[
4199
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent
4200
+ ]
4201
+ ),
4068
4202
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
4069
4203
  transcript:
4070
4204
  T.nilable(
@@ -4143,52 +4277,106 @@ module Revox
4143
4277
  end
4144
4278
  end
4145
4279
 
4146
- module Result
4147
- extend Revox::Internal::Type::Enum
4148
-
4149
- TaggedSymbol =
4280
+ class HandledByUser < Revox::Internal::Type::BaseModel
4281
+ OrHash =
4150
4282
  T.type_alias do
4151
- T.all(
4152
- Symbol,
4153
- Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result
4283
+ T.any(
4284
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::HandledByUser,
4285
+ Revox::Internal::AnyHash
4154
4286
  )
4155
4287
  end
4156
- OrSymbol = T.type_alias { T.any(Symbol, String) }
4157
4288
 
4158
- IVR =
4159
- T.let(
4160
- :IVR,
4161
- Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4162
- )
4163
- VOICEMAIL =
4164
- T.let(
4165
- :voicemail,
4166
- Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4167
- )
4168
- HUMAN =
4169
- T.let(
4170
- :human,
4171
- Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4172
- )
4173
- UNKNOWN =
4174
- T.let(
4175
- :unknown,
4176
- Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4177
- )
4178
- IOS_SCREENING_FILTER =
4179
- T.let(
4180
- :"ios-screening-filter",
4181
- Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4182
- )
4289
+ # The database user id of the assignee.
4290
+ sig { returns(String) }
4291
+ attr_accessor :id
4183
4292
 
4184
- sig do
4185
- override.returns(
4186
- T::Array[
4187
- Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4188
- ]
4189
- )
4190
- end
4191
- def self.values
4293
+ sig { returns(String) }
4294
+ attr_accessor :email
4295
+
4296
+ sig { returns(T.nilable(String)) }
4297
+ attr_accessor :first_name
4298
+
4299
+ sig { returns(T.nilable(String)) }
4300
+ attr_accessor :last_name
4301
+
4302
+ # The team member responsible for following up on this call.
4303
+ sig do
4304
+ params(
4305
+ id: String,
4306
+ email: String,
4307
+ first_name: T.nilable(String),
4308
+ last_name: T.nilable(String)
4309
+ ).returns(T.attached_class)
4310
+ end
4311
+ def self.new(
4312
+ # The database user id of the assignee.
4313
+ id:,
4314
+ email:,
4315
+ first_name:,
4316
+ last_name:
4317
+ )
4318
+ end
4319
+
4320
+ sig do
4321
+ override.returns(
4322
+ {
4323
+ id: String,
4324
+ email: String,
4325
+ first_name: T.nilable(String),
4326
+ last_name: T.nilable(String)
4327
+ }
4328
+ )
4329
+ end
4330
+ def to_hash
4331
+ end
4332
+ end
4333
+
4334
+ module Result
4335
+ extend Revox::Internal::Type::Enum
4336
+
4337
+ TaggedSymbol =
4338
+ T.type_alias do
4339
+ T.all(
4340
+ Symbol,
4341
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result
4342
+ )
4343
+ end
4344
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
4345
+
4346
+ IVR =
4347
+ T.let(
4348
+ :IVR,
4349
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4350
+ )
4351
+ VOICEMAIL =
4352
+ T.let(
4353
+ :voicemail,
4354
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4355
+ )
4356
+ HUMAN =
4357
+ T.let(
4358
+ :human,
4359
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4360
+ )
4361
+ UNKNOWN =
4362
+ T.let(
4363
+ :unknown,
4364
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4365
+ )
4366
+ IOS_SCREENING_FILTER =
4367
+ T.let(
4368
+ :"ios-screening-filter",
4369
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4370
+ )
4371
+
4372
+ sig do
4373
+ override.returns(
4374
+ T::Array[
4375
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::Result::TaggedSymbol
4376
+ ]
4377
+ )
4378
+ end
4379
+ def self.values
4192
4380
  end
4193
4381
  end
4194
4382
 
@@ -4242,6 +4430,71 @@ module Revox
4242
4430
  end
4243
4431
  end
4244
4432
 
4433
+ class EmailLog < Revox::Internal::Type::BaseModel
4434
+ OrHash =
4435
+ T.type_alias do
4436
+ T.any(
4437
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::EmailLog,
4438
+ Revox::Internal::AnyHash
4439
+ )
4440
+ end
4441
+
4442
+ sig { returns(String) }
4443
+ attr_accessor :id
4444
+
4445
+ # When the email was sent.
4446
+ sig { returns(T.anything) }
4447
+ attr_accessor :created_at
4448
+
4449
+ sig { returns(String) }
4450
+ attr_accessor :from_address
4451
+
4452
+ sig { returns(T.nilable(String)) }
4453
+ attr_accessor :resend_message_id
4454
+
4455
+ sig { returns(String) }
4456
+ attr_accessor :subject
4457
+
4458
+ sig { returns(T::Array[String]) }
4459
+ attr_accessor :to_emails
4460
+
4461
+ sig do
4462
+ params(
4463
+ id: String,
4464
+ created_at: T.anything,
4465
+ from_address: String,
4466
+ resend_message_id: T.nilable(String),
4467
+ subject: String,
4468
+ to_emails: T::Array[String]
4469
+ ).returns(T.attached_class)
4470
+ end
4471
+ def self.new(
4472
+ id:,
4473
+ # When the email was sent.
4474
+ created_at:,
4475
+ from_address:,
4476
+ resend_message_id:,
4477
+ subject:,
4478
+ to_emails:
4479
+ )
4480
+ end
4481
+
4482
+ sig do
4483
+ override.returns(
4484
+ {
4485
+ id: String,
4486
+ created_at: T.anything,
4487
+ from_address: String,
4488
+ resend_message_id: T.nilable(String),
4489
+ subject: String,
4490
+ to_emails: T::Array[String]
4491
+ }
4492
+ )
4493
+ end
4494
+ def to_hash
4495
+ end
4496
+ end
4497
+
4245
4498
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
4246
4499
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
4247
4500
  module EndReason
@@ -4569,11 +4822,18 @@ module Revox
4569
4822
  sig { returns(String) }
4570
4823
  attr_accessor :message_body
4571
4824
 
4572
- sig { returns(String) }
4573
- attr_accessor :to_phone_number
4825
+ sig do
4826
+ returns(
4827
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
4828
+ )
4829
+ end
4830
+ attr_accessor :provider
4574
4831
 
4575
4832
  sig { returns(T.nilable(String)) }
4576
- attr_accessor :twilio_message_sid
4833
+ attr_accessor :provider_message_id
4834
+
4835
+ sig { returns(String) }
4836
+ attr_accessor :to_phone_number
4577
4837
 
4578
4838
  sig do
4579
4839
  returns(
@@ -4587,8 +4847,10 @@ module Revox
4587
4847
  id: String,
4588
4848
  created_at: T.anything,
4589
4849
  message_body: String,
4850
+ provider:
4851
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Provider::OrSymbol,
4852
+ provider_message_id: T.nilable(String),
4590
4853
  to_phone_number: String,
4591
- twilio_message_sid: T.nilable(String),
4592
4854
  type:
4593
4855
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Type::OrSymbol
4594
4856
  ).returns(T.attached_class)
@@ -4598,8 +4860,9 @@ module Revox
4598
4860
  # When the SMS was sent.
4599
4861
  created_at:,
4600
4862
  message_body:,
4863
+ provider:,
4864
+ provider_message_id:,
4601
4865
  to_phone_number:,
4602
- twilio_message_sid:,
4603
4866
  type:
4604
4867
  )
4605
4868
  end
@@ -4610,8 +4873,10 @@ module Revox
4610
4873
  id: String,
4611
4874
  created_at: T.anything,
4612
4875
  message_body: String,
4876
+ provider:
4877
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Provider::TaggedSymbol,
4878
+ provider_message_id: T.nilable(String),
4613
4879
  to_phone_number: String,
4614
- twilio_message_sid: T.nilable(String),
4615
4880
  type:
4616
4881
  Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Type::TaggedSymbol
4617
4882
  }
@@ -4620,6 +4885,40 @@ module Revox
4620
4885
  def to_hash
4621
4886
  end
4622
4887
 
4888
+ module Provider
4889
+ extend Revox::Internal::Type::Enum
4890
+
4891
+ TaggedSymbol =
4892
+ T.type_alias do
4893
+ T.all(
4894
+ Symbol,
4895
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Provider
4896
+ )
4897
+ end
4898
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
4899
+
4900
+ TWILIO =
4901
+ T.let(
4902
+ :twilio,
4903
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
4904
+ )
4905
+ VONAGE =
4906
+ T.let(
4907
+ :vonage,
4908
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
4909
+ )
4910
+
4911
+ sig do
4912
+ override.returns(
4913
+ T::Array[
4914
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SMSLog::Provider::TaggedSymbol
4915
+ ]
4916
+ )
4917
+ end
4918
+ def self.values
4919
+ end
4920
+ end
4921
+
4623
4922
  module Type
4624
4923
  extend Revox::Internal::Type::Enum
4625
4924
 
@@ -4660,6 +4959,176 @@ module Revox
4660
4959
  end
4661
4960
  end
4662
4961
 
4962
+ class SpeechEvent < Revox::Internal::Type::BaseModel
4963
+ OrHash =
4964
+ T.type_alias do
4965
+ T.any(
4966
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent,
4967
+ Revox::Internal::AnyHash
4968
+ )
4969
+ end
4970
+
4971
+ sig { returns(String) }
4972
+ attr_accessor :id
4973
+
4974
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
4975
+ sig { returns(T::Boolean) }
4976
+ attr_accessor :is_real_turn
4977
+
4978
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
4979
+ # system instructions plus conversation history — as JSON.
4980
+ sig { returns(T.nilable(String)) }
4981
+ attr_accessor :llm_system_prompt
4982
+
4983
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
4984
+ sig { returns(T.nilable(Float)) }
4985
+ attr_accessor :llm_ttft_ms
4986
+
4987
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
4988
+ # a race, which is also the model `llm_ttft_ms` describes.
4989
+ sig { returns(T.nilable(String)) }
4990
+ attr_accessor :llm_winner_model
4991
+
4992
+ # Who was speaking during this segment.
4993
+ sig do
4994
+ returns(
4995
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
4996
+ )
4997
+ end
4998
+ attr_accessor :speaker
4999
+
5000
+ # Milliseconds since session start when speech began.
5001
+ sig { returns(Float) }
5002
+ attr_accessor :started_speaking_at_ms
5003
+
5004
+ # Milliseconds since session start when speech ended. Null when the session ended
5005
+ # before the turn closed.
5006
+ sig { returns(T.nilable(Float)) }
5007
+ attr_accessor :stopped_speaking_at_ms
5008
+
5009
+ # User-only: time from end-of-speech to final transcript, in ms.
5010
+ sig { returns(T.nilable(Float)) }
5011
+ attr_accessor :stt_transcription_delay_ms
5012
+
5013
+ # Recognized text for this segment, when available.
5014
+ sig { returns(T.nilable(String)) }
5015
+ attr_accessor :transcript
5016
+
5017
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
5018
+ sig { returns(T.nilable(Float)) }
5019
+ attr_accessor :tts_ttfb_ms
5020
+
5021
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
5022
+ # Null on user segments.
5023
+ sig { returns(T.nilable(T::Boolean)) }
5024
+ attr_accessor :was_cut
5025
+
5026
+ sig do
5027
+ params(
5028
+ id: String,
5029
+ is_real_turn: T::Boolean,
5030
+ llm_system_prompt: T.nilable(String),
5031
+ llm_ttft_ms: T.nilable(Float),
5032
+ llm_winner_model: T.nilable(String),
5033
+ speaker:
5034
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::Speaker::OrSymbol,
5035
+ started_speaking_at_ms: Float,
5036
+ stopped_speaking_at_ms: T.nilable(Float),
5037
+ stt_transcription_delay_ms: T.nilable(Float),
5038
+ transcript: T.nilable(String),
5039
+ tts_ttfb_ms: T.nilable(Float),
5040
+ was_cut: T.nilable(T::Boolean)
5041
+ ).returns(T.attached_class)
5042
+ end
5043
+ def self.new(
5044
+ id:,
5045
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
5046
+ is_real_turn:,
5047
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
5048
+ # system instructions plus conversation history — as JSON.
5049
+ llm_system_prompt:,
5050
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
5051
+ llm_ttft_ms:,
5052
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
5053
+ # a race, which is also the model `llm_ttft_ms` describes.
5054
+ llm_winner_model:,
5055
+ # Who was speaking during this segment.
5056
+ speaker:,
5057
+ # Milliseconds since session start when speech began.
5058
+ started_speaking_at_ms:,
5059
+ # Milliseconds since session start when speech ended. Null when the session ended
5060
+ # before the turn closed.
5061
+ stopped_speaking_at_ms:,
5062
+ # User-only: time from end-of-speech to final transcript, in ms.
5063
+ stt_transcription_delay_ms:,
5064
+ # Recognized text for this segment, when available.
5065
+ transcript:,
5066
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
5067
+ tts_ttfb_ms:,
5068
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
5069
+ # Null on user segments.
5070
+ was_cut:
5071
+ )
5072
+ end
5073
+
5074
+ sig do
5075
+ override.returns(
5076
+ {
5077
+ id: String,
5078
+ is_real_turn: T::Boolean,
5079
+ llm_system_prompt: T.nilable(String),
5080
+ llm_ttft_ms: T.nilable(Float),
5081
+ llm_winner_model: T.nilable(String),
5082
+ speaker:
5083
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol,
5084
+ started_speaking_at_ms: Float,
5085
+ stopped_speaking_at_ms: T.nilable(Float),
5086
+ stt_transcription_delay_ms: T.nilable(Float),
5087
+ transcript: T.nilable(String),
5088
+ tts_ttfb_ms: T.nilable(Float),
5089
+ was_cut: T.nilable(T::Boolean)
5090
+ }
5091
+ )
5092
+ end
5093
+ def to_hash
5094
+ end
5095
+
5096
+ # Who was speaking during this segment.
5097
+ module Speaker
5098
+ extend Revox::Internal::Type::Enum
5099
+
5100
+ TaggedSymbol =
5101
+ T.type_alias do
5102
+ T.all(
5103
+ Symbol,
5104
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::Speaker
5105
+ )
5106
+ end
5107
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
5108
+
5109
+ USER =
5110
+ T.let(
5111
+ :user,
5112
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
5113
+ )
5114
+ AGENT =
5115
+ T.let(
5116
+ :agent,
5117
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
5118
+ )
5119
+
5120
+ sig do
5121
+ override.returns(
5122
+ T::Array[
5123
+ Revox::Models::CallRetrieveResponse::Call::CallAttempt::SpeechEvent::Speaker::TaggedSymbol
5124
+ ]
5125
+ )
5126
+ end
5127
+ def self.values
5128
+ end
5129
+ end
5130
+ end
5131
+
4663
5132
  class Transcript < Revox::Internal::Type::BaseModel
4664
5133
  OrHash =
4665
5134
  T.type_alias do
@@ -5004,7 +5473,8 @@ module Revox
5004
5473
  sig { returns(String) }
5005
5474
  attr_accessor :calling_window_start_time
5006
5475
 
5007
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
5476
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
5477
+ # allows. Default: 7200 (2 hours).
5008
5478
  sig { returns(Integer) }
5009
5479
  attr_accessor :retry_delay_seconds
5010
5480
 
@@ -5024,7 +5494,8 @@ module Revox
5024
5494
  # timezone_override if provided). Format: 'HH:mm' (24-hour) or 'H:mma' (12-hour).
5025
5495
  # Examples: '09:00', '10am'. Default: '10:00'.
5026
5496
  calling_window_start_time:,
5027
- # Delay between retry attempts in seconds. Default: 7200 (2 hours).
5497
+ # Delay between retry attempts in seconds. 0 retries as soon as the calling window
5498
+ # allows. Default: 7200 (2 hours).
5028
5499
  retry_delay_seconds:
5029
5500
  )
5030
5501
  end
@@ -5085,6 +5556,9 @@ module Revox
5085
5556
  sig { returns(T.nilable(String)) }
5086
5557
  attr_accessor :first_name
5087
5558
 
5559
+ sig { returns(T.nilable(String)) }
5560
+ attr_accessor :job_title
5561
+
5088
5562
  sig { returns(T.nilable(String)) }
5089
5563
  attr_accessor :last_name
5090
5564
 
@@ -5095,10 +5569,11 @@ module Revox
5095
5569
  company: T.nilable(String),
5096
5570
  email: T.nilable(String),
5097
5571
  first_name: T.nilable(String),
5572
+ job_title: T.nilable(String),
5098
5573
  last_name: T.nilable(String)
5099
5574
  ).returns(T.attached_class)
5100
5575
  end
5101
- def self.new(company:, email:, first_name:, last_name:)
5576
+ def self.new(company:, email:, first_name:, job_title:, last_name:)
5102
5577
  end
5103
5578
 
5104
5579
  sig do
@@ -5107,6 +5582,7 @@ module Revox
5107
5582
  company: T.nilable(String),
5108
5583
  email: T.nilable(String),
5109
5584
  first_name: T.nilable(String),
5585
+ job_title: T.nilable(String),
5110
5586
  last_name: T.nilable(String)
5111
5587
  }
5112
5588
  )
@@ -5181,6 +5657,37 @@ module Revox
5181
5657
  sig { returns(T.anything) }
5182
5658
  attr_accessor :ended_at
5183
5659
 
5660
+ # Whether the AI agent conducted the conversation on this attempt. False for a
5661
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
5662
+ # were never answered.
5663
+ sig { returns(T::Boolean) }
5664
+ attr_accessor :handled_by_ai
5665
+
5666
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
5667
+ # or a speed-dial operator connection (both stamp human_takeover_at).
5668
+ sig { returns(T::Boolean) }
5669
+ attr_accessor :handled_by_human
5670
+
5671
+ # The team member responsible for following up on this call.
5672
+ sig do
5673
+ returns(
5674
+ T.nilable(
5675
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::HandledByUser
5676
+ )
5677
+ )
5678
+ end
5679
+ attr_reader :handled_by_user
5680
+
5681
+ sig do
5682
+ params(
5683
+ handled_by_user:
5684
+ T.nilable(
5685
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::HandledByUser::OrHash
5686
+ )
5687
+ ).void
5688
+ end
5689
+ attr_writer :handled_by_user
5690
+
5184
5691
  # The phone number that was called. Formatted in E.164 format. Example:
5185
5692
  # +1234567890
5186
5693
  sig { returns(String) }
@@ -5215,6 +5722,19 @@ module Revox
5215
5722
  sig { returns(T.nilable(T::Array[String])) }
5216
5723
  attr_accessor :assistants_used
5217
5724
 
5725
+ # Notification emails sent in connection with the call, ordered oldest first
5726
+ # (from/to addresses, subject, sent time).
5727
+ sig do
5728
+ returns(
5729
+ T.nilable(
5730
+ T::Array[
5731
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::EmailLog
5732
+ ]
5733
+ )
5734
+ )
5735
+ end
5736
+ attr_accessor :email_log
5737
+
5218
5738
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
5219
5739
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
5220
5740
  sig do
@@ -5248,21 +5768,35 @@ module Revox
5248
5768
  )
5249
5769
  )
5250
5770
  end
5251
- attr_accessor :post_call_transcript
5771
+ attr_accessor :post_call_transcript
5772
+
5773
+ # Automatic SMS sent after the call (voicemail and after-call), ordered oldest
5774
+ # first. The in-call `send_sms` is excluded — it already appears in the transcript
5775
+ # as a tool call.
5776
+ sig do
5777
+ returns(
5778
+ T.nilable(
5779
+ T::Array[
5780
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog
5781
+ ]
5782
+ )
5783
+ )
5784
+ end
5785
+ attr_accessor :sms_log
5252
5786
 
5253
- # Automatic SMS sent after the call (voicemail and after-call), ordered oldest
5254
- # first. The in-call `send_sms` is excluded it already appears in the transcript
5255
- # as a tool call.
5787
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
5788
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
5789
+ # tracked or for realtime sessions that don't emit them.
5256
5790
  sig do
5257
5791
  returns(
5258
5792
  T.nilable(
5259
5793
  T::Array[
5260
- Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog
5794
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent
5261
5795
  ]
5262
5796
  )
5263
5797
  )
5264
5798
  end
5265
- attr_accessor :sms_log
5799
+ attr_accessor :speech_events
5266
5800
 
5267
5801
  # The data extracted from the call, using the structured output config from the
5268
5802
  # parent call object.
@@ -5292,6 +5826,12 @@ module Revox
5292
5826
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::DialError::OrSymbol
5293
5827
  ),
5294
5828
  ended_at: T.anything,
5829
+ handled_by_ai: T::Boolean,
5830
+ handled_by_human: T::Boolean,
5831
+ handled_by_user:
5832
+ T.nilable(
5833
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::HandledByUser::OrHash
5834
+ ),
5295
5835
  phone_number: String,
5296
5836
  recording_url: T.nilable(String),
5297
5837
  result:
@@ -5302,6 +5842,12 @@ module Revox
5302
5842
  status:
5303
5843
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::Status::OrSymbol,
5304
5844
  assistants_used: T.nilable(T::Array[String]),
5845
+ email_log:
5846
+ T.nilable(
5847
+ T::Array[
5848
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::EmailLog::OrHash
5849
+ ]
5850
+ ),
5305
5851
  end_reason:
5306
5852
  T.nilable(
5307
5853
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::EndReason::OrSymbol
@@ -5322,6 +5868,12 @@ module Revox
5322
5868
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::OrHash
5323
5869
  ]
5324
5870
  ),
5871
+ speech_events:
5872
+ T.nilable(
5873
+ T::Array[
5874
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::OrHash
5875
+ ]
5876
+ ),
5325
5877
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
5326
5878
  transcript:
5327
5879
  T.nilable(
@@ -5340,6 +5892,15 @@ module Revox
5340
5892
  dial_error:,
5341
5893
  # The time the call ended.
5342
5894
  ended_at:,
5895
+ # Whether the AI agent conducted the conversation on this attempt. False for a
5896
+ # silent speed-dial probe (whose agent only detects a human) and for attempts that
5897
+ # were never answered.
5898
+ handled_by_ai:,
5899
+ # Whether a human operator conducted (part of) this attempt — a jump-in takeover
5900
+ # or a speed-dial operator connection (both stamp human_takeover_at).
5901
+ handled_by_human:,
5902
+ # The team member responsible for following up on this call.
5903
+ handled_by_user:,
5343
5904
  # The phone number that was called. Formatted in E.164 format. Example:
5344
5905
  # +1234567890
5345
5906
  phone_number:,
@@ -5352,6 +5913,9 @@ module Revox
5352
5913
  status:,
5353
5914
  # Assistant node ids entered during this attempt, in traversal order.
5354
5915
  assistants_used: nil,
5916
+ # Notification emails sent in connection with the call, ordered oldest first
5917
+ # (from/to addresses, subject, sent time).
5918
+ email_log: nil,
5355
5919
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
5356
5920
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
5357
5921
  end_reason: nil,
@@ -5365,6 +5929,10 @@ module Revox
5365
5929
  # first. The in-call `send_sms` is excluded — it already appears in the transcript
5366
5930
  # as a tool call.
5367
5931
  sms_log: nil,
5932
+ # Per-turn speech segments (VAD-derived) with timing and pipeline latencies,
5933
+ # ordered by started_speaking_at_ms. Empty for calls recorded before this was
5934
+ # tracked or for realtime sessions that don't emit them.
5935
+ speech_events: nil,
5368
5936
  # The data extracted from the call, using the structured output config from the
5369
5937
  # parent call object.
5370
5938
  structured_output: nil,
@@ -5383,6 +5951,12 @@ module Revox
5383
5951
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::DialError::TaggedSymbol
5384
5952
  ),
5385
5953
  ended_at: T.anything,
5954
+ handled_by_ai: T::Boolean,
5955
+ handled_by_human: T::Boolean,
5956
+ handled_by_user:
5957
+ T.nilable(
5958
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::HandledByUser
5959
+ ),
5386
5960
  phone_number: String,
5387
5961
  recording_url: T.nilable(String),
5388
5962
  result:
@@ -5393,6 +5967,12 @@ module Revox
5393
5967
  status:
5394
5968
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::Status::TaggedSymbol,
5395
5969
  assistants_used: T.nilable(T::Array[String]),
5970
+ email_log:
5971
+ T.nilable(
5972
+ T::Array[
5973
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::EmailLog
5974
+ ]
5975
+ ),
5396
5976
  end_reason:
5397
5977
  T.nilable(
5398
5978
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::EndReason::TaggedSymbol
@@ -5413,6 +5993,12 @@ module Revox
5413
5993
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog
5414
5994
  ]
5415
5995
  ),
5996
+ speech_events:
5997
+ T.nilable(
5998
+ T::Array[
5999
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent
6000
+ ]
6001
+ ),
5416
6002
  structured_output: T.nilable(T::Hash[Symbol, T.anything]),
5417
6003
  transcript:
5418
6004
  T.nilable(
@@ -5491,6 +6077,60 @@ module Revox
5491
6077
  end
5492
6078
  end
5493
6079
 
6080
+ class HandledByUser < Revox::Internal::Type::BaseModel
6081
+ OrHash =
6082
+ T.type_alias do
6083
+ T.any(
6084
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::HandledByUser,
6085
+ Revox::Internal::AnyHash
6086
+ )
6087
+ end
6088
+
6089
+ # The database user id of the assignee.
6090
+ sig { returns(String) }
6091
+ attr_accessor :id
6092
+
6093
+ sig { returns(String) }
6094
+ attr_accessor :email
6095
+
6096
+ sig { returns(T.nilable(String)) }
6097
+ attr_accessor :first_name
6098
+
6099
+ sig { returns(T.nilable(String)) }
6100
+ attr_accessor :last_name
6101
+
6102
+ # The team member responsible for following up on this call.
6103
+ sig do
6104
+ params(
6105
+ id: String,
6106
+ email: String,
6107
+ first_name: T.nilable(String),
6108
+ last_name: T.nilable(String)
6109
+ ).returns(T.attached_class)
6110
+ end
6111
+ def self.new(
6112
+ # The database user id of the assignee.
6113
+ id:,
6114
+ email:,
6115
+ first_name:,
6116
+ last_name:
6117
+ )
6118
+ end
6119
+
6120
+ sig do
6121
+ override.returns(
6122
+ {
6123
+ id: String,
6124
+ email: String,
6125
+ first_name: T.nilable(String),
6126
+ last_name: T.nilable(String)
6127
+ }
6128
+ )
6129
+ end
6130
+ def to_hash
6131
+ end
6132
+ end
6133
+
5494
6134
  module Result
5495
6135
  extend Revox::Internal::Type::Enum
5496
6136
 
@@ -5590,6 +6230,71 @@ module Revox
5590
6230
  end
5591
6231
  end
5592
6232
 
6233
+ class EmailLog < Revox::Internal::Type::BaseModel
6234
+ OrHash =
6235
+ T.type_alias do
6236
+ T.any(
6237
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::EmailLog,
6238
+ Revox::Internal::AnyHash
6239
+ )
6240
+ end
6241
+
6242
+ sig { returns(String) }
6243
+ attr_accessor :id
6244
+
6245
+ # When the email was sent.
6246
+ sig { returns(T.anything) }
6247
+ attr_accessor :created_at
6248
+
6249
+ sig { returns(String) }
6250
+ attr_accessor :from_address
6251
+
6252
+ sig { returns(T.nilable(String)) }
6253
+ attr_accessor :resend_message_id
6254
+
6255
+ sig { returns(String) }
6256
+ attr_accessor :subject
6257
+
6258
+ sig { returns(T::Array[String]) }
6259
+ attr_accessor :to_emails
6260
+
6261
+ sig do
6262
+ params(
6263
+ id: String,
6264
+ created_at: T.anything,
6265
+ from_address: String,
6266
+ resend_message_id: T.nilable(String),
6267
+ subject: String,
6268
+ to_emails: T::Array[String]
6269
+ ).returns(T.attached_class)
6270
+ end
6271
+ def self.new(
6272
+ id:,
6273
+ # When the email was sent.
6274
+ created_at:,
6275
+ from_address:,
6276
+ resend_message_id:,
6277
+ subject:,
6278
+ to_emails:
6279
+ )
6280
+ end
6281
+
6282
+ sig do
6283
+ override.returns(
6284
+ {
6285
+ id: String,
6286
+ created_at: T.anything,
6287
+ from_address: String,
6288
+ resend_message_id: T.nilable(String),
6289
+ subject: String,
6290
+ to_emails: T::Array[String]
6291
+ }
6292
+ )
6293
+ end
6294
+ def to_hash
6295
+ end
6296
+ end
6297
+
5593
6298
  # Reason for ending the call when ended_by is 'agent'. E.g. 'tool_end_call',
5594
6299
  # 'voicemail', 'transfer', 'ivr_no_navigate'.
5595
6300
  module EndReason
@@ -5917,11 +6622,18 @@ module Revox
5917
6622
  sig { returns(String) }
5918
6623
  attr_accessor :message_body
5919
6624
 
5920
- sig { returns(String) }
5921
- attr_accessor :to_phone_number
6625
+ sig do
6626
+ returns(
6627
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6628
+ )
6629
+ end
6630
+ attr_accessor :provider
5922
6631
 
5923
6632
  sig { returns(T.nilable(String)) }
5924
- attr_accessor :twilio_message_sid
6633
+ attr_accessor :provider_message_id
6634
+
6635
+ sig { returns(String) }
6636
+ attr_accessor :to_phone_number
5925
6637
 
5926
6638
  sig do
5927
6639
  returns(
@@ -5935,8 +6647,10 @@ module Revox
5935
6647
  id: String,
5936
6648
  created_at: T.anything,
5937
6649
  message_body: String,
6650
+ provider:
6651
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Provider::OrSymbol,
6652
+ provider_message_id: T.nilable(String),
5938
6653
  to_phone_number: String,
5939
- twilio_message_sid: T.nilable(String),
5940
6654
  type:
5941
6655
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Type::OrSymbol
5942
6656
  ).returns(T.attached_class)
@@ -5946,8 +6660,9 @@ module Revox
5946
6660
  # When the SMS was sent.
5947
6661
  created_at:,
5948
6662
  message_body:,
6663
+ provider:,
6664
+ provider_message_id:,
5949
6665
  to_phone_number:,
5950
- twilio_message_sid:,
5951
6666
  type:
5952
6667
  )
5953
6668
  end
@@ -5958,8 +6673,10 @@ module Revox
5958
6673
  id: String,
5959
6674
  created_at: T.anything,
5960
6675
  message_body: String,
6676
+ provider:
6677
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol,
6678
+ provider_message_id: T.nilable(String),
5961
6679
  to_phone_number: String,
5962
- twilio_message_sid: T.nilable(String),
5963
6680
  type:
5964
6681
  Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Type::TaggedSymbol
5965
6682
  }
@@ -5968,6 +6685,40 @@ module Revox
5968
6685
  def to_hash
5969
6686
  end
5970
6687
 
6688
+ module Provider
6689
+ extend Revox::Internal::Type::Enum
6690
+
6691
+ TaggedSymbol =
6692
+ T.type_alias do
6693
+ T.all(
6694
+ Symbol,
6695
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Provider
6696
+ )
6697
+ end
6698
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
6699
+
6700
+ TWILIO =
6701
+ T.let(
6702
+ :twilio,
6703
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6704
+ )
6705
+ VONAGE =
6706
+ T.let(
6707
+ :vonage,
6708
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6709
+ )
6710
+
6711
+ sig do
6712
+ override.returns(
6713
+ T::Array[
6714
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SMSLog::Provider::TaggedSymbol
6715
+ ]
6716
+ )
6717
+ end
6718
+ def self.values
6719
+ end
6720
+ end
6721
+
5971
6722
  module Type
5972
6723
  extend Revox::Internal::Type::Enum
5973
6724
 
@@ -6008,6 +6759,176 @@ module Revox
6008
6759
  end
6009
6760
  end
6010
6761
 
6762
+ class SpeechEvent < Revox::Internal::Type::BaseModel
6763
+ OrHash =
6764
+ T.type_alias do
6765
+ T.any(
6766
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent,
6767
+ Revox::Internal::AnyHash
6768
+ )
6769
+ end
6770
+
6771
+ sig { returns(String) }
6772
+ attr_accessor :id
6773
+
6774
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
6775
+ sig { returns(T::Boolean) }
6776
+ attr_accessor :is_real_turn
6777
+
6778
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
6779
+ # system instructions plus conversation history — as JSON.
6780
+ sig { returns(T.nilable(String)) }
6781
+ attr_accessor :llm_system_prompt
6782
+
6783
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
6784
+ sig { returns(T.nilable(Float)) }
6785
+ attr_accessor :llm_ttft_ms
6786
+
6787
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
6788
+ # a race, which is also the model `llm_ttft_ms` describes.
6789
+ sig { returns(T.nilable(String)) }
6790
+ attr_accessor :llm_winner_model
6791
+
6792
+ # Who was speaking during this segment.
6793
+ sig do
6794
+ returns(
6795
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
6796
+ )
6797
+ end
6798
+ attr_accessor :speaker
6799
+
6800
+ # Milliseconds since session start when speech began.
6801
+ sig { returns(Float) }
6802
+ attr_accessor :started_speaking_at_ms
6803
+
6804
+ # Milliseconds since session start when speech ended. Null when the session ended
6805
+ # before the turn closed.
6806
+ sig { returns(T.nilable(Float)) }
6807
+ attr_accessor :stopped_speaking_at_ms
6808
+
6809
+ # User-only: time from end-of-speech to final transcript, in ms.
6810
+ sig { returns(T.nilable(Float)) }
6811
+ attr_accessor :stt_transcription_delay_ms
6812
+
6813
+ # Recognized text for this segment, when available.
6814
+ sig { returns(T.nilable(String)) }
6815
+ attr_accessor :transcript
6816
+
6817
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
6818
+ sig { returns(T.nilable(Float)) }
6819
+ attr_accessor :tts_ttfb_ms
6820
+
6821
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
6822
+ # Null on user segments.
6823
+ sig { returns(T.nilable(T::Boolean)) }
6824
+ attr_accessor :was_cut
6825
+
6826
+ sig do
6827
+ params(
6828
+ id: String,
6829
+ is_real_turn: T::Boolean,
6830
+ llm_system_prompt: T.nilable(String),
6831
+ llm_ttft_ms: T.nilable(Float),
6832
+ llm_winner_model: T.nilable(String),
6833
+ speaker:
6834
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::Speaker::OrSymbol,
6835
+ started_speaking_at_ms: Float,
6836
+ stopped_speaking_at_ms: T.nilable(Float),
6837
+ stt_transcription_delay_ms: T.nilable(Float),
6838
+ transcript: T.nilable(String),
6839
+ tts_ttfb_ms: T.nilable(Float),
6840
+ was_cut: T.nilable(T::Boolean)
6841
+ ).returns(T.attached_class)
6842
+ end
6843
+ def self.new(
6844
+ id:,
6845
+ # False when the segment was flagged as noise/blip rather than a meaningful turn.
6846
+ is_real_turn:,
6847
+ # Agent-only: despite the name, the whole prompt the LLM was given for this turn —
6848
+ # system instructions plus conversation history — as JSON.
6849
+ llm_system_prompt:,
6850
+ # Agent-only: LLM time-to-first-token for the reply, in ms.
6851
+ llm_ttft_ms:,
6852
+ # Agent-only: the model that produced the reply — the winning leg when the LLM is
6853
+ # a race, which is also the model `llm_ttft_ms` describes.
6854
+ llm_winner_model:,
6855
+ # Who was speaking during this segment.
6856
+ speaker:,
6857
+ # Milliseconds since session start when speech began.
6858
+ started_speaking_at_ms:,
6859
+ # Milliseconds since session start when speech ended. Null when the session ended
6860
+ # before the turn closed.
6861
+ stopped_speaking_at_ms:,
6862
+ # User-only: time from end-of-speech to final transcript, in ms.
6863
+ stt_transcription_delay_ms:,
6864
+ # Recognized text for this segment, when available.
6865
+ transcript:,
6866
+ # Agent-only: TTS time-to-first-audio-byte for the reply, in ms.
6867
+ tts_ttfb_ms:,
6868
+ # Agent-only: true when the agent's audio was interrupted (real or auto-resumed).
6869
+ # Null on user segments.
6870
+ was_cut:
6871
+ )
6872
+ end
6873
+
6874
+ sig do
6875
+ override.returns(
6876
+ {
6877
+ id: String,
6878
+ is_real_turn: T::Boolean,
6879
+ llm_system_prompt: T.nilable(String),
6880
+ llm_ttft_ms: T.nilable(Float),
6881
+ llm_winner_model: T.nilable(String),
6882
+ speaker:
6883
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol,
6884
+ started_speaking_at_ms: Float,
6885
+ stopped_speaking_at_ms: T.nilable(Float),
6886
+ stt_transcription_delay_ms: T.nilable(Float),
6887
+ transcript: T.nilable(String),
6888
+ tts_ttfb_ms: T.nilable(Float),
6889
+ was_cut: T.nilable(T::Boolean)
6890
+ }
6891
+ )
6892
+ end
6893
+ def to_hash
6894
+ end
6895
+
6896
+ # Who was speaking during this segment.
6897
+ module Speaker
6898
+ extend Revox::Internal::Type::Enum
6899
+
6900
+ TaggedSymbol =
6901
+ T.type_alias do
6902
+ T.all(
6903
+ Symbol,
6904
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::Speaker
6905
+ )
6906
+ end
6907
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
6908
+
6909
+ USER =
6910
+ T.let(
6911
+ :user,
6912
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
6913
+ )
6914
+ AGENT =
6915
+ T.let(
6916
+ :agent,
6917
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
6918
+ )
6919
+
6920
+ sig do
6921
+ override.returns(
6922
+ T::Array[
6923
+ Revox::Models::CallRetrieveResponse::Call::LastCallAttempt::SpeechEvent::Speaker::TaggedSymbol
6924
+ ]
6925
+ )
6926
+ end
6927
+ def self.values
6928
+ end
6929
+ end
6930
+ end
6931
+
6011
6932
  class Transcript < Revox::Internal::Type::BaseModel
6012
6933
  OrHash =
6013
6934
  T.type_alias do
@@ -6513,6 +7434,11 @@ module Revox
6513
7434
  :post_processing,
6514
7435
  Revox::Models::CallRetrieveResponse::Call::Status::TaggedSymbol
6515
7436
  )
7437
+ NOT_LAUNCHED =
7438
+ T.let(
7439
+ :not_launched,
7440
+ Revox::Models::CallRetrieveResponse::Call::Status::TaggedSymbol
7441
+ )
6516
7442
  SCHEDULED =
6517
7443
  T.let(
6518
7444
  :scheduled,
@@ -6580,21 +7506,6 @@ module Revox
6580
7506
  :requested_callback_later,
6581
7507
  Revox::Models::CallRetrieveResponse::Call::Outcome::TaggedSymbol
6582
7508
  )
6583
- REQUESTED_CALLBACK_NEW_NUMBER =
6584
- T.let(
6585
- :requested_callback_new_number,
6586
- Revox::Models::CallRetrieveResponse::Call::Outcome::TaggedSymbol
6587
- )
6588
- DO_NOT_CONTACT =
6589
- T.let(
6590
- :do_not_contact,
6591
- Revox::Models::CallRetrieveResponse::Call::Outcome::TaggedSymbol
6592
- )
6593
- AI_AVERSE =
6594
- T.let(
6595
- :ai_averse,
6596
- Revox::Models::CallRetrieveResponse::Call::Outcome::TaggedSymbol
6597
- )
6598
7509
 
6599
7510
  sig do
6600
7511
  override.returns(