@livekit/agents 1.0.48 → 1.1.0-dev.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 (373) hide show
  1. package/dist/constants.cjs +27 -0
  2. package/dist/constants.cjs.map +1 -1
  3. package/dist/constants.d.cts +9 -0
  4. package/dist/constants.d.ts +9 -0
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +18 -0
  7. package/dist/constants.js.map +1 -1
  8. package/dist/inference/api_protos.d.cts +71 -71
  9. package/dist/inference/api_protos.d.ts +71 -71
  10. package/dist/inference/interruption/defaults.cjs +81 -0
  11. package/dist/inference/interruption/defaults.cjs.map +1 -0
  12. package/dist/inference/interruption/defaults.d.cts +19 -0
  13. package/dist/inference/interruption/defaults.d.ts +19 -0
  14. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  15. package/dist/inference/interruption/defaults.js +46 -0
  16. package/dist/inference/interruption/defaults.js.map +1 -0
  17. package/dist/inference/interruption/errors.cjs +44 -0
  18. package/dist/inference/interruption/errors.cjs.map +1 -0
  19. package/dist/inference/interruption/errors.d.cts +12 -0
  20. package/dist/inference/interruption/errors.d.ts +12 -0
  21. package/dist/inference/interruption/errors.d.ts.map +1 -0
  22. package/dist/inference/interruption/errors.js +20 -0
  23. package/dist/inference/interruption/errors.js.map +1 -0
  24. package/dist/inference/interruption/http_transport.cjs +147 -0
  25. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  26. package/dist/inference/interruption/http_transport.d.cts +63 -0
  27. package/dist/inference/interruption/http_transport.d.ts +63 -0
  28. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  29. package/dist/inference/interruption/http_transport.js +121 -0
  30. package/dist/inference/interruption/http_transport.js.map +1 -0
  31. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  32. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  33. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  34. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  35. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  36. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  37. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  38. package/dist/inference/interruption/interruption_detector.cjs +181 -0
  39. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  40. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  41. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  42. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  43. package/dist/inference/interruption/interruption_detector.js +147 -0
  44. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  45. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  46. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  47. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  48. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  49. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  50. package/dist/inference/interruption/interruption_stream.js +344 -0
  51. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  52. package/dist/inference/interruption/types.cjs +17 -0
  53. package/dist/inference/interruption/types.cjs.map +1 -0
  54. package/dist/inference/interruption/types.d.cts +66 -0
  55. package/dist/inference/interruption/types.d.ts +66 -0
  56. package/dist/inference/interruption/types.d.ts.map +1 -0
  57. package/dist/inference/interruption/types.js +1 -0
  58. package/dist/inference/interruption/types.js.map +1 -0
  59. package/dist/inference/interruption/utils.cjs +130 -0
  60. package/dist/inference/interruption/utils.cjs.map +1 -0
  61. package/dist/inference/interruption/utils.d.cts +41 -0
  62. package/dist/inference/interruption/utils.d.ts +41 -0
  63. package/dist/inference/interruption/utils.d.ts.map +1 -0
  64. package/dist/inference/interruption/utils.js +105 -0
  65. package/dist/inference/interruption/utils.js.map +1 -0
  66. package/dist/inference/interruption/utils.test.cjs +105 -0
  67. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  68. package/dist/inference/interruption/utils.test.js +104 -0
  69. package/dist/inference/interruption/utils.test.js.map +1 -0
  70. package/dist/inference/interruption/ws_transport.cjs +329 -0
  71. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  72. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  73. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  74. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  75. package/dist/inference/interruption/ws_transport.js +295 -0
  76. package/dist/inference/interruption/ws_transport.js.map +1 -0
  77. package/dist/inference/llm.cjs +14 -10
  78. package/dist/inference/llm.cjs.map +1 -1
  79. package/dist/inference/llm.d.cts +2 -1
  80. package/dist/inference/llm.d.ts +2 -1
  81. package/dist/inference/llm.d.ts.map +1 -1
  82. package/dist/inference/llm.js +8 -10
  83. package/dist/inference/llm.js.map +1 -1
  84. package/dist/inference/stt.cjs +7 -2
  85. package/dist/inference/stt.cjs.map +1 -1
  86. package/dist/inference/stt.d.cts +2 -0
  87. package/dist/inference/stt.d.ts +2 -0
  88. package/dist/inference/stt.d.ts.map +1 -1
  89. package/dist/inference/stt.js +8 -3
  90. package/dist/inference/stt.js.map +1 -1
  91. package/dist/inference/tts.cjs +7 -2
  92. package/dist/inference/tts.cjs.map +1 -1
  93. package/dist/inference/tts.d.cts +2 -0
  94. package/dist/inference/tts.d.ts +2 -0
  95. package/dist/inference/tts.d.ts.map +1 -1
  96. package/dist/inference/tts.js +8 -3
  97. package/dist/inference/tts.js.map +1 -1
  98. package/dist/inference/utils.cjs +26 -7
  99. package/dist/inference/utils.cjs.map +1 -1
  100. package/dist/inference/utils.d.cts +13 -0
  101. package/dist/inference/utils.d.ts +13 -0
  102. package/dist/inference/utils.d.ts.map +1 -1
  103. package/dist/inference/utils.js +18 -2
  104. package/dist/inference/utils.js.map +1 -1
  105. package/dist/llm/chat_context.cjs +20 -2
  106. package/dist/llm/chat_context.cjs.map +1 -1
  107. package/dist/llm/chat_context.d.cts +19 -1
  108. package/dist/llm/chat_context.d.ts +19 -1
  109. package/dist/llm/chat_context.d.ts.map +1 -1
  110. package/dist/llm/chat_context.js +20 -2
  111. package/dist/llm/chat_context.js.map +1 -1
  112. package/dist/llm/index.cjs.map +1 -1
  113. package/dist/llm/index.d.cts +1 -1
  114. package/dist/llm/index.d.ts +1 -1
  115. package/dist/llm/index.d.ts.map +1 -1
  116. package/dist/llm/index.js.map +1 -1
  117. package/dist/llm/llm.cjs +16 -1
  118. package/dist/llm/llm.cjs.map +1 -1
  119. package/dist/llm/llm.d.cts +9 -0
  120. package/dist/llm/llm.d.ts +9 -0
  121. package/dist/llm/llm.d.ts.map +1 -1
  122. package/dist/llm/llm.js +16 -1
  123. package/dist/llm/llm.js.map +1 -1
  124. package/dist/llm/realtime.cjs +3 -0
  125. package/dist/llm/realtime.cjs.map +1 -1
  126. package/dist/llm/realtime.d.cts +1 -0
  127. package/dist/llm/realtime.d.ts +1 -0
  128. package/dist/llm/realtime.d.ts.map +1 -1
  129. package/dist/llm/realtime.js +3 -0
  130. package/dist/llm/realtime.js.map +1 -1
  131. package/dist/metrics/base.cjs.map +1 -1
  132. package/dist/metrics/base.d.cts +45 -1
  133. package/dist/metrics/base.d.ts +45 -1
  134. package/dist/metrics/base.d.ts.map +1 -1
  135. package/dist/metrics/index.cjs +5 -0
  136. package/dist/metrics/index.cjs.map +1 -1
  137. package/dist/metrics/index.d.cts +2 -1
  138. package/dist/metrics/index.d.ts +2 -1
  139. package/dist/metrics/index.d.ts.map +1 -1
  140. package/dist/metrics/index.js +6 -0
  141. package/dist/metrics/index.js.map +1 -1
  142. package/dist/metrics/model_usage.cjs +189 -0
  143. package/dist/metrics/model_usage.cjs.map +1 -0
  144. package/dist/metrics/model_usage.d.cts +92 -0
  145. package/dist/metrics/model_usage.d.ts +92 -0
  146. package/dist/metrics/model_usage.d.ts.map +1 -0
  147. package/dist/metrics/model_usage.js +164 -0
  148. package/dist/metrics/model_usage.js.map +1 -0
  149. package/dist/metrics/model_usage.test.cjs +474 -0
  150. package/dist/metrics/model_usage.test.cjs.map +1 -0
  151. package/dist/metrics/model_usage.test.js +476 -0
  152. package/dist/metrics/model_usage.test.js.map +1 -0
  153. package/dist/metrics/usage_collector.cjs +3 -0
  154. package/dist/metrics/usage_collector.cjs.map +1 -1
  155. package/dist/metrics/usage_collector.d.cts +9 -0
  156. package/dist/metrics/usage_collector.d.ts +9 -0
  157. package/dist/metrics/usage_collector.d.ts.map +1 -1
  158. package/dist/metrics/usage_collector.js +3 -0
  159. package/dist/metrics/usage_collector.js.map +1 -1
  160. package/dist/metrics/utils.cjs +9 -0
  161. package/dist/metrics/utils.cjs.map +1 -1
  162. package/dist/metrics/utils.d.ts.map +1 -1
  163. package/dist/metrics/utils.js +9 -0
  164. package/dist/metrics/utils.js.map +1 -1
  165. package/dist/stream/multi_input_stream.test.cjs +4 -0
  166. package/dist/stream/multi_input_stream.test.cjs.map +1 -1
  167. package/dist/stream/multi_input_stream.test.js +5 -1
  168. package/dist/stream/multi_input_stream.test.js.map +1 -1
  169. package/dist/stream/stream_channel.cjs +31 -0
  170. package/dist/stream/stream_channel.cjs.map +1 -1
  171. package/dist/stream/stream_channel.d.cts +4 -2
  172. package/dist/stream/stream_channel.d.ts +4 -2
  173. package/dist/stream/stream_channel.d.ts.map +1 -1
  174. package/dist/stream/stream_channel.js +31 -0
  175. package/dist/stream/stream_channel.js.map +1 -1
  176. package/dist/stt/stt.cjs +34 -2
  177. package/dist/stt/stt.cjs.map +1 -1
  178. package/dist/stt/stt.d.cts +22 -0
  179. package/dist/stt/stt.d.ts +22 -0
  180. package/dist/stt/stt.d.ts.map +1 -1
  181. package/dist/stt/stt.js +34 -2
  182. package/dist/stt/stt.js.map +1 -1
  183. package/dist/telemetry/otel_http_exporter.cjs +24 -5
  184. package/dist/telemetry/otel_http_exporter.cjs.map +1 -1
  185. package/dist/telemetry/otel_http_exporter.d.cts +1 -0
  186. package/dist/telemetry/otel_http_exporter.d.ts +1 -0
  187. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -1
  188. package/dist/telemetry/otel_http_exporter.js +24 -5
  189. package/dist/telemetry/otel_http_exporter.js.map +1 -1
  190. package/dist/telemetry/trace_types.cjs +5 -5
  191. package/dist/telemetry/trace_types.cjs.map +1 -1
  192. package/dist/telemetry/trace_types.d.cts +9 -5
  193. package/dist/telemetry/trace_types.d.ts +9 -5
  194. package/dist/telemetry/trace_types.d.ts.map +1 -1
  195. package/dist/telemetry/trace_types.js +5 -5
  196. package/dist/telemetry/trace_types.js.map +1 -1
  197. package/dist/telemetry/traces.cjs +47 -8
  198. package/dist/telemetry/traces.cjs.map +1 -1
  199. package/dist/telemetry/traces.d.ts.map +1 -1
  200. package/dist/telemetry/traces.js +47 -8
  201. package/dist/telemetry/traces.js.map +1 -1
  202. package/dist/tts/tts.cjs +64 -2
  203. package/dist/tts/tts.cjs.map +1 -1
  204. package/dist/tts/tts.d.cts +34 -0
  205. package/dist/tts/tts.d.ts +34 -0
  206. package/dist/tts/tts.d.ts.map +1 -1
  207. package/dist/tts/tts.js +64 -2
  208. package/dist/tts/tts.js.map +1 -1
  209. package/dist/version.cjs +1 -1
  210. package/dist/version.js +1 -1
  211. package/dist/voice/agent.cjs +25 -4
  212. package/dist/voice/agent.cjs.map +1 -1
  213. package/dist/voice/agent.d.cts +10 -2
  214. package/dist/voice/agent.d.ts +10 -2
  215. package/dist/voice/agent.d.ts.map +1 -1
  216. package/dist/voice/agent.js +25 -4
  217. package/dist/voice/agent.js.map +1 -1
  218. package/dist/voice/agent_activity.cjs +261 -36
  219. package/dist/voice/agent_activity.cjs.map +1 -1
  220. package/dist/voice/agent_activity.d.cts +20 -6
  221. package/dist/voice/agent_activity.d.ts +20 -6
  222. package/dist/voice/agent_activity.d.ts.map +1 -1
  223. package/dist/voice/agent_activity.js +262 -37
  224. package/dist/voice/agent_activity.js.map +1 -1
  225. package/dist/voice/agent_session.cjs +105 -48
  226. package/dist/voice/agent_session.cjs.map +1 -1
  227. package/dist/voice/agent_session.d.cts +90 -20
  228. package/dist/voice/agent_session.d.ts +90 -20
  229. package/dist/voice/agent_session.d.ts.map +1 -1
  230. package/dist/voice/agent_session.js +105 -46
  231. package/dist/voice/agent_session.js.map +1 -1
  232. package/dist/voice/audio_recognition.cjs +287 -6
  233. package/dist/voice/audio_recognition.cjs.map +1 -1
  234. package/dist/voice/audio_recognition.d.cts +42 -3
  235. package/dist/voice/audio_recognition.d.ts +42 -3
  236. package/dist/voice/audio_recognition.d.ts.map +1 -1
  237. package/dist/voice/audio_recognition.js +289 -7
  238. package/dist/voice/audio_recognition.js.map +1 -1
  239. package/dist/voice/client_events.cjs +554 -0
  240. package/dist/voice/client_events.cjs.map +1 -0
  241. package/dist/voice/client_events.d.cts +195 -0
  242. package/dist/voice/client_events.d.ts +195 -0
  243. package/dist/voice/client_events.d.ts.map +1 -0
  244. package/dist/voice/client_events.js +548 -0
  245. package/dist/voice/client_events.js.map +1 -0
  246. package/dist/voice/events.cjs +1 -0
  247. package/dist/voice/events.cjs.map +1 -1
  248. package/dist/voice/events.d.cts +8 -5
  249. package/dist/voice/events.d.ts +8 -5
  250. package/dist/voice/events.d.ts.map +1 -1
  251. package/dist/voice/events.js +1 -0
  252. package/dist/voice/events.js.map +1 -1
  253. package/dist/voice/generation.cjs +43 -8
  254. package/dist/voice/generation.cjs.map +1 -1
  255. package/dist/voice/generation.d.cts +3 -3
  256. package/dist/voice/generation.d.ts +3 -3
  257. package/dist/voice/generation.d.ts.map +1 -1
  258. package/dist/voice/generation.js +43 -8
  259. package/dist/voice/generation.js.map +1 -1
  260. package/dist/voice/index.cjs +1 -0
  261. package/dist/voice/index.cjs.map +1 -1
  262. package/dist/voice/index.d.cts +1 -0
  263. package/dist/voice/index.d.ts +1 -0
  264. package/dist/voice/index.d.ts.map +1 -1
  265. package/dist/voice/index.js +1 -0
  266. package/dist/voice/index.js.map +1 -1
  267. package/dist/voice/report.cjs +20 -8
  268. package/dist/voice/report.cjs.map +1 -1
  269. package/dist/voice/report.d.cts +5 -0
  270. package/dist/voice/report.d.ts +5 -0
  271. package/dist/voice/report.d.ts.map +1 -1
  272. package/dist/voice/report.js +20 -8
  273. package/dist/voice/report.js.map +1 -1
  274. package/dist/voice/report.test.cjs +106 -0
  275. package/dist/voice/report.test.cjs.map +1 -0
  276. package/dist/voice/report.test.js +105 -0
  277. package/dist/voice/report.test.js.map +1 -0
  278. package/dist/voice/room_io/room_io.cjs +5 -39
  279. package/dist/voice/room_io/room_io.cjs.map +1 -1
  280. package/dist/voice/room_io/room_io.d.cts +4 -9
  281. package/dist/voice/room_io/room_io.d.ts +4 -9
  282. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  283. package/dist/voice/room_io/room_io.js +5 -40
  284. package/dist/voice/room_io/room_io.js.map +1 -1
  285. package/dist/voice/turn_config/endpointing.cjs +33 -0
  286. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  287. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  288. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  289. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  290. package/dist/voice/turn_config/endpointing.js +9 -0
  291. package/dist/voice/turn_config/endpointing.js.map +1 -0
  292. package/dist/voice/turn_config/interruption.cjs +37 -0
  293. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  294. package/dist/voice/turn_config/interruption.d.cts +53 -0
  295. package/dist/voice/turn_config/interruption.d.ts +53 -0
  296. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  297. package/dist/voice/turn_config/interruption.js +13 -0
  298. package/dist/voice/turn_config/interruption.js.map +1 -0
  299. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  300. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  301. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  302. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  303. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  304. package/dist/voice/turn_config/turn_handling.js +11 -0
  305. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  306. package/dist/voice/turn_config/utils.cjs +97 -0
  307. package/dist/voice/turn_config/utils.cjs.map +1 -0
  308. package/dist/voice/turn_config/utils.d.cts +25 -0
  309. package/dist/voice/turn_config/utils.d.ts +25 -0
  310. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  311. package/dist/voice/turn_config/utils.js +73 -0
  312. package/dist/voice/turn_config/utils.js.map +1 -0
  313. package/dist/voice/turn_config/utils.test.cjs +86 -0
  314. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  315. package/dist/voice/turn_config/utils.test.js +85 -0
  316. package/dist/voice/turn_config/utils.test.js.map +1 -0
  317. package/dist/voice/wire_format.cjs +798 -0
  318. package/dist/voice/wire_format.cjs.map +1 -0
  319. package/dist/voice/wire_format.d.cts +5503 -0
  320. package/dist/voice/wire_format.d.ts +5503 -0
  321. package/dist/voice/wire_format.d.ts.map +1 -0
  322. package/dist/voice/wire_format.js +728 -0
  323. package/dist/voice/wire_format.js.map +1 -0
  324. package/package.json +2 -1
  325. package/src/constants.ts +13 -0
  326. package/src/inference/interruption/defaults.ts +51 -0
  327. package/src/inference/interruption/errors.ts +25 -0
  328. package/src/inference/interruption/http_transport.ts +187 -0
  329. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  330. package/src/inference/interruption/interruption_detector.ts +188 -0
  331. package/src/inference/interruption/interruption_stream.ts +467 -0
  332. package/src/inference/interruption/types.ts +84 -0
  333. package/src/inference/interruption/utils.test.ts +132 -0
  334. package/src/inference/interruption/utils.ts +137 -0
  335. package/src/inference/interruption/ws_transport.ts +402 -0
  336. package/src/inference/llm.ts +9 -12
  337. package/src/inference/stt.ts +10 -3
  338. package/src/inference/tts.ts +10 -3
  339. package/src/inference/utils.ts +29 -1
  340. package/src/llm/chat_context.ts +40 -2
  341. package/src/llm/index.ts +1 -0
  342. package/src/llm/llm.ts +16 -0
  343. package/src/llm/realtime.ts +4 -0
  344. package/src/metrics/base.ts +48 -1
  345. package/src/metrics/index.ts +11 -0
  346. package/src/metrics/model_usage.test.ts +545 -0
  347. package/src/metrics/model_usage.ts +262 -0
  348. package/src/metrics/usage_collector.ts +11 -0
  349. package/src/metrics/utils.ts +11 -0
  350. package/src/stream/multi_input_stream.test.ts +6 -1
  351. package/src/stream/stream_channel.ts +34 -2
  352. package/src/stt/stt.ts +38 -0
  353. package/src/telemetry/otel_http_exporter.ts +28 -5
  354. package/src/telemetry/trace_types.ts +11 -8
  355. package/src/telemetry/traces.ts +111 -54
  356. package/src/tts/tts.ts +69 -1
  357. package/src/voice/agent.ts +30 -3
  358. package/src/voice/agent_activity.ts +327 -28
  359. package/src/voice/agent_session.ts +207 -59
  360. package/src/voice/audio_recognition.ts +385 -9
  361. package/src/voice/client_events.ts +838 -0
  362. package/src/voice/events.ts +14 -4
  363. package/src/voice/generation.ts +52 -9
  364. package/src/voice/index.ts +1 -0
  365. package/src/voice/report.test.ts +117 -0
  366. package/src/voice/report.ts +29 -6
  367. package/src/voice/room_io/room_io.ts +7 -61
  368. package/src/voice/turn_config/endpointing.ts +33 -0
  369. package/src/voice/turn_config/interruption.ts +56 -0
  370. package/src/voice/turn_config/turn_handling.ts +45 -0
  371. package/src/voice/turn_config/utils.test.ts +100 -0
  372. package/src/voice/turn_config/utils.ts +103 -0
  373. package/src/voice/wire_format.ts +827 -0
@@ -0,0 +1,262 @@
1
+ // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ import type {
5
+ AgentMetrics,
6
+ InterruptionMetrics,
7
+ LLMMetrics,
8
+ RealtimeModelMetrics,
9
+ STTMetrics,
10
+ TTSMetrics,
11
+ } from './base.js';
12
+
13
+ export type LLMModelUsage = {
14
+ type: 'llm_usage';
15
+ /** The provider name (e.g., 'openai', 'anthropic'). */
16
+ provider: string;
17
+ /** The model name (e.g., 'gpt-4o', 'claude-3-5-sonnet'). */
18
+ model: string;
19
+ /** Total input tokens. */
20
+ inputTokens: number;
21
+ /** Input tokens served from cache. */
22
+ inputCachedTokens: number;
23
+ /** Input audio tokens (for multimodal models). */
24
+ inputAudioTokens: number;
25
+ /** Cached input audio tokens. */
26
+ inputCachedAudioTokens: number;
27
+ /** Input text tokens. */
28
+ inputTextTokens: number;
29
+ /** Cached input text tokens. */
30
+ inputCachedTextTokens: number;
31
+ /** Input image tokens (for multimodal models). */
32
+ inputImageTokens: number;
33
+ /** Cached input image tokens. */
34
+ inputCachedImageTokens: number;
35
+ /** Total output tokens. */
36
+ outputTokens: number;
37
+ /** Output audio tokens (for multimodal models). */
38
+ outputAudioTokens: number;
39
+ /** Output text tokens. */
40
+ outputTextTokens: number;
41
+ /** Total session connection duration in milliseconds (for session-based billing like xAI). */
42
+ sessionDurationMs: number;
43
+ };
44
+
45
+ export type TTSModelUsage = {
46
+ type: 'tts_usage';
47
+ /** The provider name (e.g., 'elevenlabs', 'cartesia'). */
48
+ provider: string;
49
+ /** The model name (e.g., 'eleven_turbo_v2', 'sonic'). */
50
+ model: string;
51
+ /** Input text tokens (for token-based TTS billing, e.g., OpenAI TTS). */
52
+ inputTokens: number;
53
+ /** Output audio tokens (for token-based TTS billing, e.g., OpenAI TTS). */
54
+ outputTokens: number;
55
+ /** Number of characters synthesized (for character-based TTS billing). */
56
+ charactersCount: number;
57
+ /**
58
+ * Duration of generated audio in milliseconds.
59
+ */
60
+ audioDurationMs: number;
61
+ };
62
+
63
+ export type STTModelUsage = {
64
+ type: 'stt_usage';
65
+ /** The provider name (e.g., 'deepgram', 'assemblyai'). */
66
+ provider: string;
67
+ /** The model name (e.g., 'nova-2', 'best'). */
68
+ model: string;
69
+ /** Input audio tokens (for token-based STT billing). */
70
+ inputTokens: number;
71
+ /** Output text tokens (for token-based STT billing). */
72
+ outputTokens: number;
73
+ /** Duration of processed audio in milliseconds. */
74
+ audioDurationMs: number;
75
+ };
76
+
77
+ export type InterruptionModelUsage = {
78
+ type: 'interruption_usage';
79
+ /** The provider name (e.g., 'livekit'). */
80
+ provider: string;
81
+ /** The model name (e.g., 'adaptive interruption'). */
82
+ model: string;
83
+ /** Total number of requests sent. */
84
+ totalRequests: number;
85
+ };
86
+
87
+ export type ModelUsage = LLMModelUsage | TTSModelUsage | STTModelUsage | InterruptionModelUsage;
88
+
89
+ export function filterZeroValues<T extends ModelUsage>(usage: T): Partial<T> {
90
+ const result: Partial<T> = {} as Partial<T>;
91
+ for (const [key, value] of Object.entries(usage)) {
92
+ if (value !== 0 && value !== 0.0) {
93
+ (result as Record<string, unknown>)[key] = value;
94
+ }
95
+ }
96
+ return result;
97
+ }
98
+
99
+ export class ModelUsageCollector {
100
+ private llmUsage: Map<string, LLMModelUsage> = new Map();
101
+ private ttsUsage: Map<string, TTSModelUsage> = new Map();
102
+ private sttUsage: Map<string, STTModelUsage> = new Map();
103
+
104
+ private interruptionUsage: Map<string, InterruptionModelUsage> = new Map();
105
+
106
+ /** Extract provider and model from metrics metadata. */
107
+ private extractProviderModel(
108
+ metrics: LLMMetrics | STTMetrics | TTSMetrics | RealtimeModelMetrics | InterruptionMetrics,
109
+ ): [string, string] {
110
+ let provider = '';
111
+ let model = '';
112
+ if (metrics.metadata) {
113
+ provider = metrics.metadata.modelProvider || '';
114
+ model = metrics.metadata.modelName || '';
115
+ }
116
+ return [provider, model];
117
+ }
118
+
119
+ /** Get or create an LLMModelUsage for the given provider/model combination. */
120
+ private getLLMUsage(provider: string, model: string): LLMModelUsage {
121
+ const key = `${provider}:${model}`;
122
+ let usage = this.llmUsage.get(key);
123
+ if (!usage) {
124
+ usage = {
125
+ type: 'llm_usage',
126
+ provider,
127
+ model,
128
+ inputTokens: 0,
129
+ inputCachedTokens: 0,
130
+ inputAudioTokens: 0,
131
+ inputCachedAudioTokens: 0,
132
+ inputTextTokens: 0,
133
+ inputCachedTextTokens: 0,
134
+ inputImageTokens: 0,
135
+ inputCachedImageTokens: 0,
136
+ outputTokens: 0,
137
+ outputAudioTokens: 0,
138
+ outputTextTokens: 0,
139
+ sessionDurationMs: 0,
140
+ };
141
+ this.llmUsage.set(key, usage);
142
+ }
143
+ return usage;
144
+ }
145
+
146
+ /** Get or create a TTSModelUsage for the given provider/model combination. */
147
+ private getTTSUsage(provider: string, model: string): TTSModelUsage {
148
+ const key = `${provider}:${model}`;
149
+ let usage = this.ttsUsage.get(key);
150
+ if (!usage) {
151
+ usage = {
152
+ type: 'tts_usage',
153
+ provider,
154
+ model,
155
+ inputTokens: 0,
156
+ outputTokens: 0,
157
+ charactersCount: 0,
158
+ audioDurationMs: 0,
159
+ };
160
+ this.ttsUsage.set(key, usage);
161
+ }
162
+ return usage;
163
+ }
164
+
165
+ /** Get or create an STTModelUsage for the given provider/model combination. */
166
+ private getSTTUsage(provider: string, model: string): STTModelUsage {
167
+ const key = `${provider}:${model}`;
168
+ let usage = this.sttUsage.get(key);
169
+ if (!usage) {
170
+ usage = {
171
+ type: 'stt_usage',
172
+ provider,
173
+ model,
174
+ inputTokens: 0,
175
+ outputTokens: 0,
176
+ audioDurationMs: 0,
177
+ };
178
+ this.sttUsage.set(key, usage);
179
+ }
180
+ return usage;
181
+ }
182
+
183
+ private getInterruptionUsage(provider: string, model: string): InterruptionModelUsage {
184
+ const key = `${provider}:${model}`;
185
+ let usage = this.interruptionUsage.get(key);
186
+ if (!usage) {
187
+ usage = {
188
+ type: 'interruption_usage',
189
+ provider,
190
+ model,
191
+ totalRequests: 0,
192
+ };
193
+ this.interruptionUsage.set(key, usage);
194
+ }
195
+ return usage;
196
+ }
197
+
198
+ /** Collect metrics and aggregate usage by model/provider. */
199
+ collect(metrics: AgentMetrics): void {
200
+ if (metrics.type === 'llm_metrics') {
201
+ const [provider, model] = this.extractProviderModel(metrics);
202
+ const usage = this.getLLMUsage(provider, model);
203
+ usage.inputTokens += metrics.promptTokens;
204
+ usage.inputCachedTokens += metrics.promptCachedTokens;
205
+ usage.outputTokens += metrics.completionTokens;
206
+ } else if (metrics.type === 'realtime_model_metrics') {
207
+ const [provider, model] = this.extractProviderModel(metrics);
208
+ const usage = this.getLLMUsage(provider, model);
209
+ usage.inputTokens += metrics.inputTokens;
210
+ usage.inputCachedTokens += metrics.inputTokenDetails.cachedTokens;
211
+
212
+ usage.inputTextTokens += metrics.inputTokenDetails.textTokens;
213
+ usage.inputCachedTextTokens += metrics.inputTokenDetails.cachedTokensDetails?.textTokens ?? 0;
214
+ usage.inputImageTokens += metrics.inputTokenDetails.imageTokens;
215
+ usage.inputCachedImageTokens +=
216
+ metrics.inputTokenDetails.cachedTokensDetails?.imageTokens ?? 0;
217
+ usage.inputAudioTokens += metrics.inputTokenDetails.audioTokens;
218
+ usage.inputCachedAudioTokens +=
219
+ metrics.inputTokenDetails.cachedTokensDetails?.audioTokens ?? 0;
220
+
221
+ usage.outputTextTokens += metrics.outputTokenDetails.textTokens;
222
+ usage.outputAudioTokens += metrics.outputTokenDetails.audioTokens;
223
+ usage.outputTokens += metrics.outputTokens;
224
+ usage.sessionDurationMs += metrics.sessionDurationMs ?? 0;
225
+ } else if (metrics.type === 'tts_metrics') {
226
+ const [provider, model] = this.extractProviderModel(metrics);
227
+ const ttsUsage = this.getTTSUsage(provider, model);
228
+ ttsUsage.inputTokens += metrics.inputTokens ?? 0;
229
+ ttsUsage.outputTokens += metrics.outputTokens ?? 0;
230
+ ttsUsage.charactersCount += metrics.charactersCount;
231
+ ttsUsage.audioDurationMs += metrics.audioDurationMs;
232
+ } else if (metrics.type === 'stt_metrics') {
233
+ const [provider, model] = this.extractProviderModel(metrics);
234
+ const sttUsage = this.getSTTUsage(provider, model);
235
+ sttUsage.inputTokens += metrics.inputTokens ?? 0;
236
+ sttUsage.outputTokens += metrics.outputTokens ?? 0;
237
+ sttUsage.audioDurationMs += metrics.audioDurationMs;
238
+ } else if (metrics.type === 'interruption_metrics') {
239
+ const [provider, model] = this.extractProviderModel(metrics);
240
+ const usage = this.getInterruptionUsage(provider, model);
241
+ usage.totalRequests += metrics.numRequests;
242
+ }
243
+ // VAD and EOU metrics are not aggregated for usage tracking.
244
+ }
245
+
246
+ flatten(): ModelUsage[] {
247
+ const result: ModelUsage[] = [];
248
+ for (const u of this.llmUsage.values()) {
249
+ result.push({ ...u });
250
+ }
251
+ for (const u of this.ttsUsage.values()) {
252
+ result.push({ ...u });
253
+ }
254
+ for (const u of this.sttUsage.values()) {
255
+ result.push({ ...u });
256
+ }
257
+ for (const u of this.interruptionUsage.values()) {
258
+ result.push({ ...u });
259
+ }
260
+ return result;
261
+ }
262
+ }
@@ -1,8 +1,13 @@
1
1
  // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
2
  //
3
3
  // SPDX-License-Identifier: Apache-2.0
4
+ import { log } from '../log.js';
4
5
  import type { AgentMetrics } from './base.js';
5
6
 
7
+ /**
8
+ * @deprecated Use LLMModelUsage, TTSModelUsage, or STTModelUsage instead.
9
+ * These new types provide per-model/provider usage aggregation for more detailed tracking.
10
+ */
6
11
  export interface UsageSummary {
7
12
  llmPromptTokens: number;
8
13
  llmPromptCachedTokens: number;
@@ -11,10 +16,16 @@ export interface UsageSummary {
11
16
  sttAudioDurationMs: number;
12
17
  }
13
18
 
19
+ /**
20
+ * @deprecated Use ModelUsageCollector instead.
21
+ * ModelUsageCollector provides per-model/provider usage aggregation for more detailed tracking.
22
+ */
14
23
  export class UsageCollector {
15
24
  private summary: UsageSummary;
25
+ private logger = log();
16
26
 
17
27
  constructor() {
28
+ this.logger.warn('UsageCollector is deprecated. Use ModelUsageCollector instead.');
18
29
  this.summary = {
19
30
  llmPromptTokens: 0,
20
31
  llmPromptCachedTokens: 0,
@@ -60,5 +60,16 @@ export const logMetrics = (metrics: AgentMetrics) => {
60
60
  audioDurationMs: Math.round(metrics.audioDurationMs),
61
61
  })
62
62
  .info('STT metrics');
63
+ } else if (metrics.type === 'interruption_metrics') {
64
+ logger
65
+ .child({
66
+ totalDurationMs: roundTwoDecimals(metrics.totalDuration),
67
+ predictionDurationMs: roundTwoDecimals(metrics.predictionDuration),
68
+ detectionDelayMs: roundTwoDecimals(metrics.detectionDelay),
69
+ numInterruptions: metrics.numInterruptions,
70
+ numBackchannels: metrics.numBackchannels,
71
+ numRequests: metrics.numRequests,
72
+ })
73
+ .info('Interruption metrics');
63
74
  }
64
75
  };
@@ -2,7 +2,8 @@
2
2
  //
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  import { ReadableStream } from 'node:stream/web';
5
- import { describe, expect, it } from 'vitest';
5
+ import { beforeAll, describe, expect, it } from 'vitest';
6
+ import { initializeLogger } from '../log.js';
6
7
  import { delay } from '../utils.js';
7
8
  import { MultiInputStream } from './multi_input_stream.js';
8
9
 
@@ -16,6 +17,10 @@ function streamFrom<T>(values: T[]): ReadableStream<T> {
16
17
  }
17
18
 
18
19
  describe('MultiInputStream', () => {
20
+ beforeAll(() => {
21
+ initializeLogger({ pretty: false });
22
+ });
23
+
19
24
  // ---------------------------------------------------------------------------
20
25
  // Basic functionality
21
26
  // ---------------------------------------------------------------------------
@@ -4,14 +4,16 @@
4
4
  import type { ReadableStream } from 'node:stream/web';
5
5
  import { IdentityTransform } from './identity_transform.js';
6
6
 
7
- export interface StreamChannel<T> {
7
+ export interface StreamChannel<T, E extends Error = Error> {
8
8
  write(chunk: T): Promise<void>;
9
9
  close(): Promise<void>;
10
10
  stream(): ReadableStream<T>;
11
+ abort(error: E): Promise<void>;
11
12
  readonly closed: boolean;
13
+ addStreamInput(stream: ReadableStream<T>): void;
12
14
  }
13
15
 
14
- export function createStreamChannel<T>(): StreamChannel<T> {
16
+ export function createStreamChannel<T, E extends Error = Error>(): StreamChannel<T, E> {
15
17
  const transform = new IdentityTransform<T>();
16
18
  const writer = transform.writable.getWriter();
17
19
  let isClosed = false;
@@ -19,6 +21,36 @@ export function createStreamChannel<T>(): StreamChannel<T> {
19
21
  return {
20
22
  write: (chunk: T) => writer.write(chunk),
21
23
  stream: () => transform.readable,
24
+ abort: async (error: E) => {
25
+ if (isClosed) return;
26
+ isClosed = true;
27
+ try {
28
+ await writer.abort(error);
29
+ } catch (e) {
30
+ if (e instanceof Error && e.name === 'TypeError') return;
31
+ throw e;
32
+ }
33
+ },
34
+ addStreamInput: (newInputStream) => {
35
+ if (isClosed) return;
36
+ const reader = newInputStream.getReader();
37
+ (async () => {
38
+ try {
39
+ while (!isClosed) {
40
+ const { done, value } = await reader.read();
41
+ if (done) break;
42
+ await writer.write(value);
43
+ }
44
+ } catch (err) {
45
+ if (!isClosed) {
46
+ isClosed = true;
47
+ await writer.abort(err as E);
48
+ }
49
+ } finally {
50
+ reader.releaseLock();
51
+ }
52
+ })().catch(() => {});
53
+ },
22
54
  close: async () => {
23
55
  try {
24
56
  const result = await writer.close();
package/src/stt/stt.ts CHANGED
@@ -66,6 +66,10 @@ export interface SpeechData {
66
66
  export interface RecognitionUsage {
67
67
  /** Duration of the audio that was recognized in seconds. */
68
68
  audioDuration: number;
69
+ /** Input audio tokens (for token-based STT billing). */
70
+ inputTokens?: number;
71
+ /** Output text tokens (for token-based STT billing). */
72
+ outputTokens?: number;
69
73
  }
70
74
 
71
75
  /** SpeechEvent is a packet of speech-to-text data. */
@@ -128,6 +132,30 @@ export abstract class STT extends (EventEmitter as new () => TypedEmitter<STTCal
128
132
  return this.#capabilities;
129
133
  }
130
134
 
135
+ /**
136
+ * Get the model name/identifier for this STT instance.
137
+ *
138
+ * @returns The model name if available, "unknown" otherwise.
139
+ *
140
+ * @remarks
141
+ * Plugins should override this property to provide their model information.
142
+ */
143
+ get model(): string {
144
+ return 'unknown';
145
+ }
146
+
147
+ /**
148
+ * Get the provider name for this STT instance.
149
+ *
150
+ * @returns The provider name if available, "unknown" otherwise.
151
+ *
152
+ * @remarks
153
+ * Plugins should override this property to provide their provider information.
154
+ */
155
+ get provider(): string {
156
+ return 'unknown';
157
+ }
158
+
131
159
  /** Receives an audio buffer and returns transcription in the form of a {@link SpeechEvent} */
132
160
  async recognize(frame: AudioBuffer, abortSignal?: AbortSignal): Promise<SpeechEvent> {
133
161
  const startTime = process.hrtime.bigint();
@@ -141,6 +169,10 @@ export abstract class STT extends (EventEmitter as new () => TypedEmitter<STTCal
141
169
  label: this.label,
142
170
  audioDurationMs: Math.round(calculateAudioDurationSeconds(frame) * 1000),
143
171
  streamed: false,
172
+ metadata: {
173
+ modelProvider: this.provider,
174
+ modelName: this.model,
175
+ },
144
176
  });
145
177
  return event;
146
178
  }
@@ -302,7 +334,13 @@ export abstract class SpeechStream implements AsyncIterableIterator<SpeechEvent>
302
334
  durationMs: 0,
303
335
  label: this.#stt.label,
304
336
  audioDurationMs: Math.round(event.recognitionUsage!.audioDuration * 1000),
337
+ inputTokens: event.recognitionUsage!.inputTokens ?? 0,
338
+ outputTokens: event.recognitionUsage!.outputTokens ?? 0,
305
339
  streamed: true,
340
+ metadata: {
341
+ modelProvider: this.#stt.provider,
342
+ modelName: this.#stt.model,
343
+ },
306
344
  };
307
345
  this.#stt.emit('metrics_collected', metrics);
308
346
  }
@@ -58,6 +58,16 @@ export class SimpleOTLPHttpLogExporter {
58
58
  private readonly config: SimpleOTLPHttpLogExporterConfig;
59
59
  private jwt: string | null = null;
60
60
 
61
+ private static readonly FORCE_DOUBLE_KEYS = new Set([
62
+ 'transcriptConfidence',
63
+ 'transcriptionDelay',
64
+ 'endOfTurnDelay',
65
+ 'onUserTurnCompletedDelay',
66
+ 'llmNodeTtft',
67
+ 'ttsNodeTtfb',
68
+ 'e2eLatency',
69
+ ]);
70
+
61
71
  constructor(config: SimpleOTLPHttpLogExporterConfig) {
62
72
  this.config = config;
63
73
  }
@@ -72,6 +82,7 @@ export class SimpleOTLPHttpLogExporter {
72
82
 
73
83
  const endpoint = `https://${this.config.cloudHostname}/observability/logs/otlp/v0`;
74
84
  const payload = this.buildPayload(records);
85
+ const payloadJson = JSON.stringify(payload);
75
86
 
76
87
  const response = await fetch(endpoint, {
77
88
  method: 'POST',
@@ -79,7 +90,7 @@ export class SimpleOTLPHttpLogExporter {
79
90
  Authorization: `Bearer ${this.jwt}`,
80
91
  'Content-Type': 'application/json',
81
92
  },
82
- body: JSON.stringify(payload),
93
+ body: payloadJson,
83
94
  });
84
95
 
85
96
  if (!response.ok) {
@@ -160,11 +171,11 @@ export class SimpleOTLPHttpLogExporter {
160
171
  ): Array<{ key: string; value: unknown }> {
161
172
  return Object.entries(attrs).map(([key, value]) => ({
162
173
  key,
163
- value: this.convertValue(value),
174
+ value: this.convertValue(value, key),
164
175
  }));
165
176
  }
166
177
 
167
- private convertValue(value: unknown): unknown {
178
+ private convertValue(value: unknown, path: string = ''): unknown {
168
179
  if (value === null || value === undefined) {
169
180
  return { stringValue: '' };
170
181
  }
@@ -172,20 +183,32 @@ export class SimpleOTLPHttpLogExporter {
172
183
  return { stringValue: value };
173
184
  }
174
185
  if (typeof value === 'number') {
186
+ const leafKey =
187
+ path
188
+ .split('.')
189
+ .pop()
190
+ ?.replace(/\[\d+\]$/, '') ?? path;
191
+ if (SimpleOTLPHttpLogExporter.FORCE_DOUBLE_KEYS.has(leafKey)) {
192
+ return { doubleValue: value };
193
+ }
175
194
  return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
176
195
  }
177
196
  if (typeof value === 'boolean') {
178
197
  return { boolValue: value };
179
198
  }
180
199
  if (Array.isArray(value)) {
181
- return { arrayValue: { values: value.map((v) => this.convertValue(v)) } };
200
+ return {
201
+ arrayValue: {
202
+ values: value.map((v, i) => this.convertValue(v, `${path}[${i}]`)),
203
+ },
204
+ };
182
205
  }
183
206
  if (typeof value === 'object') {
184
207
  return {
185
208
  kvlistValue: {
186
209
  values: Object.entries(value as Record<string, unknown>).map(([k, v]) => ({
187
210
  key: k,
188
- value: this.convertValue(v),
211
+ value: this.convertValue(v, path ? `${path}.${k}` : k),
189
212
  })),
190
213
  },
191
214
  };
@@ -33,6 +33,7 @@ export const ATTR_PROVIDER_TOOLS = 'lk.provider_tools';
33
33
  export const ATTR_TOOL_SETS = 'lk.tool_sets';
34
34
  export const ATTR_RESPONSE_TEXT = 'lk.response.text';
35
35
  export const ATTR_RESPONSE_FUNCTION_CALLS = 'lk.response.function_calls';
36
+ /** Time to first token in seconds. */
36
37
  export const ATTR_RESPONSE_TTFT = 'lk.response.ttft';
37
38
 
38
39
  // function tool
@@ -46,6 +47,7 @@ export const ATTR_FUNCTION_TOOL_OUTPUT = 'lk.function_tool.output';
46
47
  export const ATTR_TTS_INPUT_TEXT = 'lk.input_text';
47
48
  export const ATTR_TTS_STREAMING = 'lk.tts.streaming';
48
49
  export const ATTR_TTS_LABEL = 'lk.tts.label';
50
+ /** Time to first byte in seconds. */
49
51
  export const ATTR_RESPONSE_TTFB = 'lk.response.ttfb';
50
52
 
51
53
  // eou detection
@@ -58,18 +60,26 @@ export const ATTR_TRANSCRIPT_CONFIDENCE = 'lk.transcript_confidence';
58
60
  export const ATTR_TRANSCRIPTION_DELAY = 'lk.transcription_delay';
59
61
  export const ATTR_END_OF_TURN_DELAY = 'lk.end_of_turn_delay';
60
62
 
63
+ // Adaptive Interruption attributes
64
+ export const ATTR_IS_INTERRUPTION = 'lk.is_interruption';
65
+ export const ATTR_INTERRUPTION_PROBABILITY = 'lk.interruption.probability';
66
+ export const ATTR_INTERRUPTION_TOTAL_DURATION = 'lk.interruption.total_duration';
67
+ export const ATTR_INTERRUPTION_PREDICTION_DURATION = 'lk.interruption.prediction_duration';
68
+ export const ATTR_INTERRUPTION_DETECTION_DELAY = 'lk.interruption.detection_delay';
69
+
61
70
  // metrics
62
71
  export const ATTR_LLM_METRICS = 'lk.llm_metrics';
63
72
  export const ATTR_TTS_METRICS = 'lk.tts_metrics';
64
73
  export const ATTR_REALTIME_MODEL_METRICS = 'lk.realtime_model_metrics';
65
74
 
66
- // latency span attributes
75
+ /** End-to-end latency in seconds. */
67
76
  export const ATTR_E2E_LATENCY = 'lk.e2e_latency';
68
77
 
69
78
  // OpenTelemetry GenAI attributes
70
79
  // OpenTelemetry specification: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/
71
80
  export const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';
72
81
  export const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';
82
+ /** The provider name (e.g., 'openai', 'anthropic'). */
73
83
  export const ATTR_GEN_AI_PROVIDER_NAME = 'gen_ai.provider.name';
74
84
  export const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';
75
85
  export const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';
@@ -97,10 +107,3 @@ export const ATTR_EXCEPTION_MESSAGE = 'exception.message';
97
107
 
98
108
  // Platform-specific attributes
99
109
  export const ATTR_LANGFUSE_COMPLETION_START_TIME = 'langfuse.observation.completion_start_time';
100
-
101
- // Adaptive Interruption attributes
102
- export const ATTR_IS_INTERRUPTION = 'lk.is_interruption';
103
- export const ATTR_INTERRUPTION_PROBABILITY = 'lk.interruption.probability';
104
- export const ATTR_INTERRUPTION_TOTAL_DURATION = 'lk.interruption.total_duration';
105
- export const ATTR_INTERRUPTION_PREDICTION_DURATION = 'lk.interruption.prediction_duration';
106
- export const ATTR_INTERRUPTION_DETECTION_DELAY = 'lk.interruption.detection_delay';