@livekit/agents 0.7.8 → 1.0.0-next.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 (627) hide show
  1. package/dist/_exceptions.cjs +109 -0
  2. package/dist/_exceptions.cjs.map +1 -0
  3. package/dist/_exceptions.d.cts +64 -0
  4. package/dist/_exceptions.d.ts +64 -0
  5. package/dist/_exceptions.d.ts.map +1 -0
  6. package/dist/_exceptions.js +80 -0
  7. package/dist/_exceptions.js.map +1 -0
  8. package/dist/audio.cjs +10 -3
  9. package/dist/audio.cjs.map +1 -1
  10. package/dist/audio.d.cts +2 -0
  11. package/dist/audio.d.ts +2 -0
  12. package/dist/audio.d.ts.map +1 -1
  13. package/dist/audio.js +8 -2
  14. package/dist/audio.js.map +1 -1
  15. package/dist/cli.cjs +25 -0
  16. package/dist/cli.cjs.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +25 -0
  19. package/dist/cli.js.map +1 -1
  20. package/dist/constants.cjs +6 -0
  21. package/dist/constants.cjs.map +1 -1
  22. package/dist/constants.d.cts +2 -0
  23. package/dist/constants.d.ts +2 -0
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +4 -0
  26. package/dist/constants.js.map +1 -1
  27. package/dist/http_server.cjs.map +1 -1
  28. package/dist/http_server.d.cts +1 -0
  29. package/dist/http_server.d.ts +1 -0
  30. package/dist/http_server.d.ts.map +1 -1
  31. package/dist/http_server.js.map +1 -1
  32. package/dist/index.cjs +27 -20
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +13 -10
  35. package/dist/index.d.ts +13 -10
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +15 -11
  38. package/dist/index.js.map +1 -1
  39. package/dist/inference_runner.cjs +0 -1
  40. package/dist/inference_runner.cjs.map +1 -1
  41. package/dist/inference_runner.d.cts +2 -3
  42. package/dist/inference_runner.d.ts +2 -3
  43. package/dist/inference_runner.d.ts.map +1 -1
  44. package/dist/inference_runner.js +0 -1
  45. package/dist/inference_runner.js.map +1 -1
  46. package/dist/ipc/inference_proc_executor.cjs +2 -2
  47. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  48. package/dist/ipc/inference_proc_executor.js +2 -2
  49. package/dist/ipc/inference_proc_executor.js.map +1 -1
  50. package/dist/ipc/job_executor.cjs.map +1 -1
  51. package/dist/ipc/job_executor.js.map +1 -1
  52. package/dist/ipc/job_proc_executor.cjs +1 -0
  53. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  54. package/dist/ipc/job_proc_executor.js +1 -0
  55. package/dist/ipc/job_proc_executor.js.map +1 -1
  56. package/dist/ipc/job_proc_lazy_main.cjs +1 -1
  57. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  58. package/dist/ipc/job_proc_lazy_main.js +1 -1
  59. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  60. package/dist/ipc/supervised_proc.d.cts +1 -1
  61. package/dist/ipc/supervised_proc.d.ts +1 -1
  62. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  63. package/dist/job.cjs +14 -2
  64. package/dist/job.cjs.map +1 -1
  65. package/dist/job.d.cts +8 -0
  66. package/dist/job.d.ts +8 -0
  67. package/dist/job.d.ts.map +1 -1
  68. package/dist/job.js +12 -1
  69. package/dist/job.js.map +1 -1
  70. package/dist/llm/chat_context.cjs +332 -82
  71. package/dist/llm/chat_context.cjs.map +1 -1
  72. package/dist/llm/chat_context.d.cts +152 -48
  73. package/dist/llm/chat_context.d.ts +152 -48
  74. package/dist/llm/chat_context.d.ts.map +1 -1
  75. package/dist/llm/chat_context.js +327 -81
  76. package/dist/llm/chat_context.js.map +1 -1
  77. package/dist/llm/chat_context.test.cjs +380 -0
  78. package/dist/llm/chat_context.test.cjs.map +1 -0
  79. package/dist/llm/chat_context.test.js +385 -0
  80. package/dist/llm/chat_context.test.js.map +1 -0
  81. package/dist/llm/index.cjs +37 -8
  82. package/dist/llm/index.cjs.map +1 -1
  83. package/dist/llm/index.d.cts +7 -3
  84. package/dist/llm/index.d.ts +7 -3
  85. package/dist/llm/index.d.ts.map +1 -1
  86. package/dist/llm/index.js +39 -9
  87. package/dist/llm/index.js.map +1 -1
  88. package/dist/llm/llm.cjs +98 -33
  89. package/dist/llm/llm.cjs.map +1 -1
  90. package/dist/llm/llm.d.cts +50 -24
  91. package/dist/llm/llm.d.ts +50 -24
  92. package/dist/llm/llm.d.ts.map +1 -1
  93. package/dist/llm/llm.js +99 -33
  94. package/dist/llm/llm.js.map +1 -1
  95. package/dist/llm/provider_format/google.cjs +128 -0
  96. package/dist/llm/provider_format/google.cjs.map +1 -0
  97. package/dist/llm/provider_format/google.d.cts +6 -0
  98. package/dist/llm/provider_format/google.d.ts +6 -0
  99. package/dist/llm/provider_format/google.d.ts.map +1 -0
  100. package/dist/llm/provider_format/google.js +104 -0
  101. package/dist/llm/provider_format/google.js.map +1 -0
  102. package/dist/llm/provider_format/google.test.cjs +676 -0
  103. package/dist/llm/provider_format/google.test.cjs.map +1 -0
  104. package/dist/llm/provider_format/google.test.js +675 -0
  105. package/dist/llm/provider_format/google.test.js.map +1 -0
  106. package/dist/llm/provider_format/index.cjs +40 -0
  107. package/dist/llm/provider_format/index.cjs.map +1 -0
  108. package/dist/llm/provider_format/index.d.cts +4 -0
  109. package/dist/llm/provider_format/index.d.ts +4 -0
  110. package/dist/llm/provider_format/index.d.ts.map +1 -0
  111. package/dist/llm/provider_format/index.js +16 -0
  112. package/dist/llm/provider_format/index.js.map +1 -0
  113. package/dist/llm/provider_format/openai.cjs +116 -0
  114. package/dist/llm/provider_format/openai.cjs.map +1 -0
  115. package/dist/llm/provider_format/openai.d.cts +3 -0
  116. package/dist/llm/provider_format/openai.d.ts +3 -0
  117. package/dist/llm/provider_format/openai.d.ts.map +1 -0
  118. package/dist/llm/provider_format/openai.js +92 -0
  119. package/dist/llm/provider_format/openai.js.map +1 -0
  120. package/dist/llm/provider_format/openai.test.cjs +490 -0
  121. package/dist/llm/provider_format/openai.test.cjs.map +1 -0
  122. package/dist/llm/provider_format/openai.test.js +489 -0
  123. package/dist/llm/provider_format/openai.test.js.map +1 -0
  124. package/dist/llm/provider_format/utils.cjs +146 -0
  125. package/dist/llm/provider_format/utils.cjs.map +1 -0
  126. package/dist/llm/provider_format/utils.d.cts +38 -0
  127. package/dist/llm/provider_format/utils.d.ts +38 -0
  128. package/dist/llm/provider_format/utils.d.ts.map +1 -0
  129. package/dist/llm/provider_format/utils.js +122 -0
  130. package/dist/llm/provider_format/utils.js.map +1 -0
  131. package/dist/llm/realtime.cjs +77 -0
  132. package/dist/llm/realtime.cjs.map +1 -0
  133. package/dist/llm/realtime.d.cts +98 -0
  134. package/dist/llm/realtime.d.ts +98 -0
  135. package/dist/llm/realtime.d.ts.map +1 -0
  136. package/dist/llm/realtime.js +52 -0
  137. package/dist/llm/realtime.js.map +1 -0
  138. package/dist/llm/remote_chat_context.cjs +112 -0
  139. package/dist/llm/remote_chat_context.cjs.map +1 -0
  140. package/dist/llm/remote_chat_context.d.cts +23 -0
  141. package/dist/llm/remote_chat_context.d.ts +23 -0
  142. package/dist/llm/remote_chat_context.d.ts.map +1 -0
  143. package/dist/llm/remote_chat_context.js +88 -0
  144. package/dist/llm/remote_chat_context.js.map +1 -0
  145. package/dist/llm/remote_chat_context.test.cjs +225 -0
  146. package/dist/llm/remote_chat_context.test.cjs.map +1 -0
  147. package/dist/llm/remote_chat_context.test.js +224 -0
  148. package/dist/llm/remote_chat_context.test.js.map +1 -0
  149. package/dist/llm/tool_context.cjs +111 -0
  150. package/dist/llm/tool_context.cjs.map +1 -0
  151. package/dist/llm/tool_context.d.cts +125 -0
  152. package/dist/llm/tool_context.d.ts +125 -0
  153. package/dist/llm/tool_context.d.ts.map +1 -0
  154. package/dist/llm/tool_context.js +80 -0
  155. package/dist/llm/tool_context.js.map +1 -0
  156. package/dist/llm/tool_context.test.cjs +162 -0
  157. package/dist/llm/tool_context.test.cjs.map +1 -0
  158. package/dist/llm/tool_context.test.js +161 -0
  159. package/dist/llm/tool_context.test.js.map +1 -0
  160. package/dist/llm/tool_context.type.test.cjs +92 -0
  161. package/dist/llm/tool_context.type.test.cjs.map +1 -0
  162. package/dist/llm/tool_context.type.test.js +91 -0
  163. package/dist/llm/tool_context.type.test.js.map +1 -0
  164. package/dist/llm/utils.cjs +260 -0
  165. package/dist/llm/utils.cjs.map +1 -0
  166. package/dist/llm/utils.d.cts +42 -0
  167. package/dist/llm/utils.d.ts +42 -0
  168. package/dist/llm/utils.d.ts.map +1 -0
  169. package/dist/llm/utils.js +223 -0
  170. package/dist/llm/utils.js.map +1 -0
  171. package/dist/llm/utils.test.cjs +513 -0
  172. package/dist/llm/utils.test.cjs.map +1 -0
  173. package/dist/llm/utils.test.js +490 -0
  174. package/dist/llm/utils.test.js.map +1 -0
  175. package/dist/metrics/base.cjs +0 -27
  176. package/dist/metrics/base.cjs.map +1 -1
  177. package/dist/metrics/base.d.cts +105 -63
  178. package/dist/metrics/base.d.ts +105 -63
  179. package/dist/metrics/base.d.ts.map +1 -1
  180. package/dist/metrics/base.js +0 -19
  181. package/dist/metrics/base.js.map +1 -1
  182. package/dist/metrics/index.cjs +0 -3
  183. package/dist/metrics/index.cjs.map +1 -1
  184. package/dist/metrics/index.d.cts +2 -3
  185. package/dist/metrics/index.d.ts +2 -3
  186. package/dist/metrics/index.d.ts.map +1 -1
  187. package/dist/metrics/index.js +0 -2
  188. package/dist/metrics/index.js.map +1 -1
  189. package/dist/metrics/usage_collector.cjs +17 -12
  190. package/dist/metrics/usage_collector.cjs.map +1 -1
  191. package/dist/metrics/usage_collector.d.cts +3 -2
  192. package/dist/metrics/usage_collector.d.ts +3 -2
  193. package/dist/metrics/usage_collector.d.ts.map +1 -1
  194. package/dist/metrics/usage_collector.js +17 -12
  195. package/dist/metrics/usage_collector.js.map +1 -1
  196. package/dist/metrics/utils.cjs +22 -59
  197. package/dist/metrics/utils.cjs.map +1 -1
  198. package/dist/metrics/utils.d.cts +1 -8
  199. package/dist/metrics/utils.d.ts +1 -8
  200. package/dist/metrics/utils.d.ts.map +1 -1
  201. package/dist/metrics/utils.js +22 -52
  202. package/dist/metrics/utils.js.map +1 -1
  203. package/dist/multimodal/index.cjs +0 -2
  204. package/dist/multimodal/index.cjs.map +1 -1
  205. package/dist/multimodal/index.d.cts +0 -1
  206. package/dist/multimodal/index.d.ts +0 -1
  207. package/dist/multimodal/index.d.ts.map +1 -1
  208. package/dist/multimodal/index.js +0 -1
  209. package/dist/multimodal/index.js.map +1 -1
  210. package/dist/plugin.cjs +24 -8
  211. package/dist/plugin.cjs.map +1 -1
  212. package/dist/plugin.d.cts +18 -4
  213. package/dist/plugin.d.ts +18 -4
  214. package/dist/plugin.d.ts.map +1 -1
  215. package/dist/plugin.js +22 -7
  216. package/dist/plugin.js.map +1 -1
  217. package/dist/stream/deferred_stream.cjs +98 -0
  218. package/dist/stream/deferred_stream.cjs.map +1 -0
  219. package/dist/stream/deferred_stream.d.cts +27 -0
  220. package/dist/stream/deferred_stream.d.ts +27 -0
  221. package/dist/stream/deferred_stream.d.ts.map +1 -0
  222. package/dist/stream/deferred_stream.js +73 -0
  223. package/dist/stream/deferred_stream.js.map +1 -0
  224. package/dist/stream/deferred_stream.test.cjs +527 -0
  225. package/dist/stream/deferred_stream.test.cjs.map +1 -0
  226. package/dist/stream/deferred_stream.test.js +526 -0
  227. package/dist/stream/deferred_stream.test.js.map +1 -0
  228. package/dist/stream/identity_transform.cjs +42 -0
  229. package/dist/stream/identity_transform.cjs.map +1 -0
  230. package/dist/stream/identity_transform.d.cts +6 -0
  231. package/dist/stream/identity_transform.d.ts +6 -0
  232. package/dist/stream/identity_transform.d.ts.map +1 -0
  233. package/dist/stream/identity_transform.js +18 -0
  234. package/dist/stream/identity_transform.js.map +1 -0
  235. package/dist/stream/identity_transform.test.cjs +125 -0
  236. package/dist/stream/identity_transform.test.cjs.map +1 -0
  237. package/dist/stream/identity_transform.test.js +124 -0
  238. package/dist/stream/identity_transform.test.js.map +1 -0
  239. package/dist/stream/index.cjs +38 -0
  240. package/dist/stream/index.cjs.map +1 -0
  241. package/dist/stream/index.d.cts +5 -0
  242. package/dist/stream/index.d.ts +5 -0
  243. package/dist/stream/index.d.ts.map +1 -0
  244. package/dist/stream/index.js +11 -0
  245. package/dist/stream/index.js.map +1 -0
  246. package/dist/stream/merge_readable_streams.cjs +59 -0
  247. package/dist/stream/merge_readable_streams.cjs.map +1 -0
  248. package/dist/stream/merge_readable_streams.d.cts +4 -0
  249. package/dist/stream/merge_readable_streams.d.ts +4 -0
  250. package/dist/stream/merge_readable_streams.d.ts.map +1 -0
  251. package/dist/stream/merge_readable_streams.js +35 -0
  252. package/dist/stream/merge_readable_streams.js.map +1 -0
  253. package/dist/stream/stream_channel.cjs +47 -0
  254. package/dist/stream/stream_channel.cjs.map +1 -0
  255. package/dist/stream/stream_channel.d.cts +9 -0
  256. package/dist/stream/stream_channel.d.ts +9 -0
  257. package/dist/stream/stream_channel.d.ts.map +1 -0
  258. package/dist/stream/stream_channel.js +23 -0
  259. package/dist/stream/stream_channel.js.map +1 -0
  260. package/dist/stream/stream_channel.test.cjs +97 -0
  261. package/dist/stream/stream_channel.test.cjs.map +1 -0
  262. package/dist/stream/stream_channel.test.js +96 -0
  263. package/dist/stream/stream_channel.test.js.map +1 -0
  264. package/dist/stt/stream_adapter.cjs +3 -4
  265. package/dist/stt/stream_adapter.cjs.map +1 -1
  266. package/dist/stt/stream_adapter.d.cts +1 -0
  267. package/dist/stt/stream_adapter.d.ts +1 -0
  268. package/dist/stt/stream_adapter.d.ts.map +1 -1
  269. package/dist/stt/stream_adapter.js +3 -4
  270. package/dist/stt/stream_adapter.js.map +1 -1
  271. package/dist/stt/stt.cjs +101 -10
  272. package/dist/stt/stt.cjs.map +1 -1
  273. package/dist/stt/stt.d.cts +26 -5
  274. package/dist/stt/stt.d.ts +26 -5
  275. package/dist/stt/stt.d.ts.map +1 -1
  276. package/dist/stt/stt.js +102 -11
  277. package/dist/stt/stt.js.map +1 -1
  278. package/dist/tokenize/basic/basic.cjs +10 -5
  279. package/dist/tokenize/basic/basic.cjs.map +1 -1
  280. package/dist/tokenize/basic/basic.d.cts +7 -1
  281. package/dist/tokenize/basic/basic.d.ts +7 -1
  282. package/dist/tokenize/basic/basic.d.ts.map +1 -1
  283. package/dist/tokenize/basic/basic.js +10 -5
  284. package/dist/tokenize/basic/basic.js.map +1 -1
  285. package/dist/tokenize/basic/sentence.cjs +14 -6
  286. package/dist/tokenize/basic/sentence.cjs.map +1 -1
  287. package/dist/tokenize/basic/sentence.d.cts +1 -1
  288. package/dist/tokenize/basic/sentence.d.ts +1 -1
  289. package/dist/tokenize/basic/sentence.d.ts.map +1 -1
  290. package/dist/tokenize/basic/sentence.js +14 -6
  291. package/dist/tokenize/basic/sentence.js.map +1 -1
  292. package/dist/tokenize/token_stream.cjs +5 -3
  293. package/dist/tokenize/token_stream.cjs.map +1 -1
  294. package/dist/tokenize/token_stream.d.cts +1 -0
  295. package/dist/tokenize/token_stream.d.ts +1 -0
  296. package/dist/tokenize/token_stream.d.ts.map +1 -1
  297. package/dist/tokenize/token_stream.js +6 -4
  298. package/dist/tokenize/token_stream.js.map +1 -1
  299. package/dist/transcription.cjs +1 -2
  300. package/dist/transcription.cjs.map +1 -1
  301. package/dist/transcription.d.ts.map +1 -1
  302. package/dist/transcription.js +2 -3
  303. package/dist/transcription.js.map +1 -1
  304. package/dist/tts/index.cjs +2 -4
  305. package/dist/tts/index.cjs.map +1 -1
  306. package/dist/tts/index.d.cts +1 -1
  307. package/dist/tts/index.d.ts +1 -1
  308. package/dist/tts/index.d.ts.map +1 -1
  309. package/dist/tts/index.js +1 -3
  310. package/dist/tts/index.js.map +1 -1
  311. package/dist/tts/stream_adapter.cjs +26 -13
  312. package/dist/tts/stream_adapter.cjs.map +1 -1
  313. package/dist/tts/stream_adapter.d.cts +1 -1
  314. package/dist/tts/stream_adapter.d.ts +1 -1
  315. package/dist/tts/stream_adapter.d.ts.map +1 -1
  316. package/dist/tts/stream_adapter.js +27 -14
  317. package/dist/tts/stream_adapter.js.map +1 -1
  318. package/dist/tts/tts.cjs +157 -25
  319. package/dist/tts/tts.cjs.map +1 -1
  320. package/dist/tts/tts.d.cts +29 -5
  321. package/dist/tts/tts.d.ts +29 -5
  322. package/dist/tts/tts.d.ts.map +1 -1
  323. package/dist/tts/tts.js +157 -24
  324. package/dist/tts/tts.js.map +1 -1
  325. package/dist/types.cjs +60 -0
  326. package/dist/types.cjs.map +1 -0
  327. package/dist/types.d.cts +13 -0
  328. package/dist/types.d.ts +13 -0
  329. package/dist/types.d.ts.map +1 -0
  330. package/dist/types.js +35 -0
  331. package/dist/types.js.map +1 -0
  332. package/dist/utils.cjs +281 -27
  333. package/dist/utils.cjs.map +1 -1
  334. package/dist/utils.d.cts +134 -9
  335. package/dist/utils.d.ts +134 -9
  336. package/dist/utils.d.ts.map +1 -1
  337. package/dist/utils.js +265 -26
  338. package/dist/utils.js.map +1 -1
  339. package/dist/utils.test.cjs +492 -0
  340. package/dist/utils.test.cjs.map +1 -0
  341. package/dist/utils.test.js +498 -0
  342. package/dist/utils.test.js.map +1 -0
  343. package/dist/vad.cjs +76 -20
  344. package/dist/vad.cjs.map +1 -1
  345. package/dist/vad.d.cts +25 -5
  346. package/dist/vad.d.ts +25 -5
  347. package/dist/vad.d.ts.map +1 -1
  348. package/dist/vad.js +76 -20
  349. package/dist/vad.js.map +1 -1
  350. package/dist/voice/agent.cjs +245 -0
  351. package/dist/voice/agent.cjs.map +1 -0
  352. package/dist/voice/agent.d.cts +78 -0
  353. package/dist/voice/agent.d.ts +78 -0
  354. package/dist/voice/agent.d.ts.map +1 -0
  355. package/dist/voice/agent.js +220 -0
  356. package/dist/voice/agent.js.map +1 -0
  357. package/dist/voice/agent.test.cjs +61 -0
  358. package/dist/voice/agent.test.cjs.map +1 -0
  359. package/dist/voice/agent.test.js +60 -0
  360. package/dist/voice/agent.test.js.map +1 -0
  361. package/dist/voice/agent_activity.cjs +1453 -0
  362. package/dist/voice/agent_activity.cjs.map +1 -0
  363. package/dist/voice/agent_activity.d.cts +94 -0
  364. package/dist/voice/agent_activity.d.ts +94 -0
  365. package/dist/voice/agent_activity.d.ts.map +1 -0
  366. package/dist/voice/agent_activity.js +1449 -0
  367. package/dist/voice/agent_activity.js.map +1 -0
  368. package/dist/voice/agent_session.cjs +312 -0
  369. package/dist/voice/agent_session.cjs.map +1 -0
  370. package/dist/voice/agent_session.d.cts +121 -0
  371. package/dist/voice/agent_session.d.ts +121 -0
  372. package/dist/voice/agent_session.d.ts.map +1 -0
  373. package/dist/voice/agent_session.js +295 -0
  374. package/dist/voice/agent_session.js.map +1 -0
  375. package/dist/voice/audio_recognition.cjs +375 -0
  376. package/dist/voice/audio_recognition.cjs.map +1 -0
  377. package/dist/voice/audio_recognition.d.cts +80 -0
  378. package/dist/voice/audio_recognition.d.ts +80 -0
  379. package/dist/voice/audio_recognition.d.ts.map +1 -0
  380. package/dist/voice/audio_recognition.js +351 -0
  381. package/dist/voice/audio_recognition.js.map +1 -0
  382. package/dist/voice/events.cjs +145 -0
  383. package/dist/voice/events.cjs.map +1 -0
  384. package/dist/voice/events.d.cts +124 -0
  385. package/dist/voice/events.d.ts +124 -0
  386. package/dist/voice/events.d.ts.map +1 -0
  387. package/dist/voice/events.js +110 -0
  388. package/dist/voice/events.js.map +1 -0
  389. package/dist/voice/generation.cjs +700 -0
  390. package/dist/voice/generation.cjs.map +1 -0
  391. package/dist/voice/generation.d.cts +115 -0
  392. package/dist/voice/generation.d.ts +115 -0
  393. package/dist/voice/generation.d.ts.map +1 -0
  394. package/dist/voice/generation.js +672 -0
  395. package/dist/voice/generation.js.map +1 -0
  396. package/dist/voice/index.cjs +40 -0
  397. package/dist/voice/index.cjs.map +1 -0
  398. package/dist/voice/index.d.cts +5 -0
  399. package/dist/voice/index.d.ts +5 -0
  400. package/dist/voice/index.d.ts.map +1 -0
  401. package/dist/voice/index.js +11 -0
  402. package/dist/voice/index.js.map +1 -0
  403. package/dist/voice/io.cjs +245 -0
  404. package/dist/voice/io.cjs.map +1 -0
  405. package/dist/voice/io.d.cts +101 -0
  406. package/dist/voice/io.d.ts +101 -0
  407. package/dist/voice/io.d.ts.map +1 -0
  408. package/dist/voice/io.js +217 -0
  409. package/dist/voice/io.js.map +1 -0
  410. package/dist/voice/room_io/_input.cjs +121 -0
  411. package/dist/voice/room_io/_input.cjs.map +1 -0
  412. package/dist/voice/room_io/_input.d.cts +24 -0
  413. package/dist/voice/room_io/_input.d.ts +24 -0
  414. package/dist/voice/room_io/_input.d.ts.map +1 -0
  415. package/dist/voice/room_io/_input.js +102 -0
  416. package/dist/voice/room_io/_input.js.map +1 -0
  417. package/dist/voice/room_io/_output.cjs +358 -0
  418. package/dist/voice/room_io/_output.cjs.map +1 -0
  419. package/dist/voice/room_io/_output.d.cts +75 -0
  420. package/dist/voice/room_io/_output.d.ts +75 -0
  421. package/dist/voice/room_io/_output.d.ts.map +1 -0
  422. package/dist/voice/room_io/_output.js +342 -0
  423. package/dist/voice/room_io/_output.js.map +1 -0
  424. package/dist/voice/room_io/index.cjs +25 -0
  425. package/dist/voice/room_io/index.cjs.map +1 -0
  426. package/dist/voice/room_io/index.d.cts +3 -0
  427. package/dist/voice/room_io/index.d.ts +3 -0
  428. package/dist/voice/room_io/index.d.ts.map +1 -0
  429. package/dist/voice/room_io/index.js +3 -0
  430. package/dist/voice/room_io/index.js.map +1 -0
  431. package/dist/voice/room_io/room_io.cjs +370 -0
  432. package/dist/voice/room_io/room_io.cjs.map +1 -0
  433. package/dist/voice/room_io/room_io.d.cts +73 -0
  434. package/dist/voice/room_io/room_io.d.ts +73 -0
  435. package/dist/voice/room_io/room_io.d.ts.map +1 -0
  436. package/dist/voice/room_io/room_io.js +361 -0
  437. package/dist/voice/room_io/room_io.js.map +1 -0
  438. package/dist/{pipeline/index.cjs → voice/run_context.cjs} +16 -11
  439. package/dist/voice/run_context.cjs.map +1 -0
  440. package/dist/voice/run_context.d.cts +12 -0
  441. package/dist/voice/run_context.d.ts +12 -0
  442. package/dist/voice/run_context.d.ts.map +1 -0
  443. package/dist/voice/run_context.js +14 -0
  444. package/dist/voice/run_context.js.map +1 -0
  445. package/dist/voice/speech_handle.cjs +105 -0
  446. package/dist/voice/speech_handle.cjs.map +1 -0
  447. package/dist/voice/speech_handle.d.cts +46 -0
  448. package/dist/voice/speech_handle.d.ts +46 -0
  449. package/dist/voice/speech_handle.d.ts.map +1 -0
  450. package/dist/voice/speech_handle.js +81 -0
  451. package/dist/voice/speech_handle.js.map +1 -0
  452. package/dist/voice/transcription/_utils.cjs +45 -0
  453. package/dist/voice/transcription/_utils.cjs.map +1 -0
  454. package/dist/voice/transcription/_utils.d.cts +3 -0
  455. package/dist/voice/transcription/_utils.d.ts +3 -0
  456. package/dist/voice/transcription/_utils.d.ts.map +1 -0
  457. package/dist/voice/transcription/_utils.js +21 -0
  458. package/dist/voice/transcription/_utils.js.map +1 -0
  459. package/dist/voice/transcription/index.cjs +23 -0
  460. package/dist/voice/transcription/index.cjs.map +1 -0
  461. package/dist/voice/transcription/index.d.cts +2 -0
  462. package/dist/voice/transcription/index.d.ts +2 -0
  463. package/dist/voice/transcription/index.d.ts.map +1 -0
  464. package/dist/voice/transcription/index.js +2 -0
  465. package/dist/voice/transcription/index.js.map +1 -0
  466. package/dist/voice/transcription/synchronizer.cjs +380 -0
  467. package/dist/voice/transcription/synchronizer.cjs.map +1 -0
  468. package/dist/voice/transcription/synchronizer.d.cts +86 -0
  469. package/dist/voice/transcription/synchronizer.d.ts +86 -0
  470. package/dist/voice/transcription/synchronizer.d.ts.map +1 -0
  471. package/dist/voice/transcription/synchronizer.js +355 -0
  472. package/dist/voice/transcription/synchronizer.js.map +1 -0
  473. package/dist/worker.cjs +22 -4
  474. package/dist/worker.cjs.map +1 -1
  475. package/dist/worker.d.cts +1 -1
  476. package/dist/worker.d.ts +1 -1
  477. package/dist/worker.d.ts.map +1 -1
  478. package/dist/worker.js +22 -4
  479. package/dist/worker.js.map +1 -1
  480. package/package.json +9 -2
  481. package/src/_exceptions.ts +137 -0
  482. package/src/audio.ts +12 -1
  483. package/src/cli.ts +37 -0
  484. package/src/constants.ts +2 -0
  485. package/src/http_server.ts +1 -0
  486. package/src/index.ts +13 -10
  487. package/src/inference_runner.ts +2 -3
  488. package/src/ipc/inference_proc_executor.ts +2 -2
  489. package/src/ipc/job_executor.ts +1 -1
  490. package/src/ipc/job_proc_executor.ts +1 -1
  491. package/src/ipc/job_proc_lazy_main.ts +1 -1
  492. package/src/job.ts +18 -0
  493. package/src/llm/__snapshots__/chat_context.test.ts.snap +527 -0
  494. package/src/llm/__snapshots__/tool_context.test.ts.snap +177 -0
  495. package/src/llm/__snapshots__/utils.test.ts.snap +65 -0
  496. package/src/llm/chat_context.test.ts +450 -0
  497. package/src/llm/chat_context.ts +501 -103
  498. package/src/llm/index.ts +53 -18
  499. package/src/llm/llm.ts +149 -50
  500. package/src/llm/provider_format/google.test.ts +772 -0
  501. package/src/llm/provider_format/google.ts +130 -0
  502. package/src/llm/provider_format/index.ts +23 -0
  503. package/src/llm/provider_format/openai.test.ts +581 -0
  504. package/src/llm/provider_format/openai.ts +118 -0
  505. package/src/llm/provider_format/utils.ts +183 -0
  506. package/src/llm/realtime.ts +151 -0
  507. package/src/llm/remote_chat_context.test.ts +290 -0
  508. package/src/llm/remote_chat_context.ts +114 -0
  509. package/src/llm/tool_context.test.ts +198 -0
  510. package/src/llm/tool_context.ts +259 -0
  511. package/src/llm/tool_context.type.test.ts +115 -0
  512. package/src/llm/utils.test.ts +670 -0
  513. package/src/llm/utils.ts +324 -0
  514. package/src/metrics/base.ts +110 -78
  515. package/src/metrics/index.ts +3 -9
  516. package/src/metrics/usage_collector.ts +19 -13
  517. package/src/metrics/utils.ts +24 -69
  518. package/src/multimodal/index.ts +0 -1
  519. package/src/plugin.ts +26 -8
  520. package/src/stream/deferred_stream.test.ts +755 -0
  521. package/src/stream/deferred_stream.ts +110 -0
  522. package/src/stream/identity_transform.test.ts +179 -0
  523. package/src/stream/identity_transform.ts +18 -0
  524. package/src/stream/index.ts +7 -0
  525. package/src/stream/merge_readable_streams.ts +40 -0
  526. package/src/stream/stream_channel.test.ts +129 -0
  527. package/src/stream/stream_channel.ts +32 -0
  528. package/src/stt/stream_adapter.ts +3 -5
  529. package/src/stt/stt.ts +135 -17
  530. package/src/tokenize/basic/basic.ts +13 -5
  531. package/src/tokenize/basic/sentence.ts +20 -6
  532. package/src/tokenize/token_stream.ts +7 -4
  533. package/src/transcription.ts +2 -3
  534. package/src/tts/index.ts +0 -1
  535. package/src/tts/stream_adapter.ts +42 -16
  536. package/src/tts/tts.ts +203 -21
  537. package/src/types.ts +42 -0
  538. package/src/utils.test.ts +658 -0
  539. package/src/utils.ts +375 -44
  540. package/src/vad.ts +90 -22
  541. package/src/voice/agent.test.ts +80 -0
  542. package/src/voice/agent.ts +332 -0
  543. package/src/voice/agent_activity.ts +1913 -0
  544. package/src/voice/agent_session.ts +460 -0
  545. package/src/voice/audio_recognition.ts +474 -0
  546. package/src/voice/events.ts +252 -0
  547. package/src/voice/generation.ts +881 -0
  548. package/src/voice/index.ts +7 -0
  549. package/src/voice/io.ts +304 -0
  550. package/src/voice/room_io/_input.ts +144 -0
  551. package/src/voice/room_io/_output.ts +436 -0
  552. package/src/voice/room_io/index.ts +5 -0
  553. package/src/voice/room_io/room_io.ts +495 -0
  554. package/src/voice/run_context.ts +20 -0
  555. package/src/voice/speech_handle.ts +104 -0
  556. package/src/voice/transcription/_utils.ts +25 -0
  557. package/src/voice/transcription/index.ts +4 -0
  558. package/src/voice/transcription/synchronizer.ts +478 -0
  559. package/src/worker.ts +22 -2
  560. package/dist/llm/function_context.cjs +0 -103
  561. package/dist/llm/function_context.cjs.map +0 -1
  562. package/dist/llm/function_context.d.cts +0 -47
  563. package/dist/llm/function_context.d.ts +0 -47
  564. package/dist/llm/function_context.d.ts.map +0 -1
  565. package/dist/llm/function_context.js +0 -78
  566. package/dist/llm/function_context.js.map +0 -1
  567. package/dist/llm/function_context.test.cjs +0 -218
  568. package/dist/llm/function_context.test.cjs.map +0 -1
  569. package/dist/llm/function_context.test.js +0 -217
  570. package/dist/llm/function_context.test.js.map +0 -1
  571. package/dist/multimodal/multimodal_agent.cjs +0 -451
  572. package/dist/multimodal/multimodal_agent.cjs.map +0 -1
  573. package/dist/multimodal/multimodal_agent.d.cts +0 -48
  574. package/dist/multimodal/multimodal_agent.d.ts +0 -48
  575. package/dist/multimodal/multimodal_agent.d.ts.map +0 -1
  576. package/dist/multimodal/multimodal_agent.js +0 -425
  577. package/dist/multimodal/multimodal_agent.js.map +0 -1
  578. package/dist/pipeline/agent_output.cjs +0 -197
  579. package/dist/pipeline/agent_output.cjs.map +0 -1
  580. package/dist/pipeline/agent_output.d.cts +0 -33
  581. package/dist/pipeline/agent_output.d.ts +0 -33
  582. package/dist/pipeline/agent_output.d.ts.map +0 -1
  583. package/dist/pipeline/agent_output.js +0 -172
  584. package/dist/pipeline/agent_output.js.map +0 -1
  585. package/dist/pipeline/agent_playout.cjs +0 -175
  586. package/dist/pipeline/agent_playout.cjs.map +0 -1
  587. package/dist/pipeline/agent_playout.d.cts +0 -40
  588. package/dist/pipeline/agent_playout.d.ts +0 -40
  589. package/dist/pipeline/agent_playout.d.ts.map +0 -1
  590. package/dist/pipeline/agent_playout.js +0 -139
  591. package/dist/pipeline/agent_playout.js.map +0 -1
  592. package/dist/pipeline/human_input.cjs +0 -171
  593. package/dist/pipeline/human_input.cjs.map +0 -1
  594. package/dist/pipeline/human_input.d.cts +0 -30
  595. package/dist/pipeline/human_input.d.ts +0 -30
  596. package/dist/pipeline/human_input.d.ts.map +0 -1
  597. package/dist/pipeline/human_input.js +0 -146
  598. package/dist/pipeline/human_input.js.map +0 -1
  599. package/dist/pipeline/index.cjs.map +0 -1
  600. package/dist/pipeline/index.d.cts +0 -2
  601. package/dist/pipeline/index.d.ts +0 -2
  602. package/dist/pipeline/index.d.ts.map +0 -1
  603. package/dist/pipeline/index.js +0 -11
  604. package/dist/pipeline/index.js.map +0 -1
  605. package/dist/pipeline/pipeline_agent.cjs +0 -849
  606. package/dist/pipeline/pipeline_agent.cjs.map +0 -1
  607. package/dist/pipeline/pipeline_agent.d.cts +0 -150
  608. package/dist/pipeline/pipeline_agent.d.ts +0 -150
  609. package/dist/pipeline/pipeline_agent.d.ts.map +0 -1
  610. package/dist/pipeline/pipeline_agent.js +0 -826
  611. package/dist/pipeline/pipeline_agent.js.map +0 -1
  612. package/dist/pipeline/speech_handle.cjs +0 -176
  613. package/dist/pipeline/speech_handle.cjs.map +0 -1
  614. package/dist/pipeline/speech_handle.d.cts +0 -37
  615. package/dist/pipeline/speech_handle.d.ts +0 -37
  616. package/dist/pipeline/speech_handle.d.ts.map +0 -1
  617. package/dist/pipeline/speech_handle.js +0 -152
  618. package/dist/pipeline/speech_handle.js.map +0 -1
  619. package/src/llm/function_context.test.ts +0 -248
  620. package/src/llm/function_context.ts +0 -142
  621. package/src/multimodal/multimodal_agent.ts +0 -555
  622. package/src/pipeline/agent_output.ts +0 -219
  623. package/src/pipeline/agent_playout.ts +0 -192
  624. package/src/pipeline/human_input.ts +0 -188
  625. package/src/pipeline/index.ts +0 -15
  626. package/src/pipeline/pipeline_agent.ts +0 -1185
  627. package/src/pipeline/speech_handle.ts +0 -201
@@ -0,0 +1,490 @@
1
+ import { VideoBufferType, VideoFrame } from "@livekit/rtc-node";
2
+ import sharp from "sharp";
3
+ import { beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { ChatContext, ChatMessage } from "./chat_context.js";
5
+ import { computeChatCtxDiff, serializeImage } from "./utils.js";
6
+ function createChatMessage(id, content, role = "user") {
7
+ return ChatMessage.create({
8
+ id,
9
+ content,
10
+ role
11
+ });
12
+ }
13
+ function createChatContext(messages) {
14
+ const ctx = new ChatContext();
15
+ for (const message of messages) {
16
+ ctx.items.push(message);
17
+ }
18
+ return ctx;
19
+ }
20
+ function createImageContent(image, inferenceDetail = "auto", options) {
21
+ return {
22
+ id: "test-id",
23
+ type: "image_content",
24
+ image,
25
+ inferenceDetail,
26
+ mimeType: options == null ? void 0 : options.mimeType,
27
+ inferenceWidth: options == null ? void 0 : options.inferenceWidth,
28
+ inferenceHeight: options == null ? void 0 : options.inferenceHeight,
29
+ _cache: {}
30
+ };
31
+ }
32
+ async function decodeImageToRaw(base64Data) {
33
+ const imageBuffer = Buffer.from(base64Data, "base64");
34
+ const decodedImage = await sharp(imageBuffer).raw().toBuffer({ resolveWithObject: true });
35
+ return { imageBuffer, decodedImage };
36
+ }
37
+ function createSolidColorFrame(width, height, color, bufferType = VideoBufferType.RGBA) {
38
+ const channels = bufferType === VideoBufferType.RGB24 ? 3 : 4;
39
+ const frameData = new Uint8Array(width * height * channels);
40
+ for (let i = 0; i < frameData.length; i += channels) {
41
+ frameData[i] = color.r;
42
+ frameData[i + 1] = color.g;
43
+ frameData[i + 2] = color.b;
44
+ if (channels === 4 && color.a !== void 0) {
45
+ frameData[i + 3] = color.a;
46
+ }
47
+ }
48
+ return new VideoFrame(frameData, width, height, bufferType);
49
+ }
50
+ function createGradientFrame(width, height) {
51
+ const channels = 4;
52
+ const frameData = new Uint8Array(width * height * channels);
53
+ for (let y = 0; y < height; y++) {
54
+ for (let x = 0; x < width; x++) {
55
+ const idx = (y * width + x) * channels;
56
+ frameData[idx] = Math.floor(x / (width - 1) * 255);
57
+ frameData[idx + 1] = Math.floor(y / (height - 1) * 255);
58
+ frameData[idx + 2] = 128;
59
+ frameData[idx + 3] = 255;
60
+ }
61
+ }
62
+ return new VideoFrame(frameData, width, height, VideoBufferType.RGBA);
63
+ }
64
+ function createPatternFrame(width, height, patterns) {
65
+ const channels = 4;
66
+ const frameData = new Uint8Array(width * height * channels);
67
+ for (let i = 0; i < patterns.length; i++) {
68
+ const offset = i * 4;
69
+ const pattern = patterns[i];
70
+ frameData[offset] = pattern[0];
71
+ frameData[offset + 1] = pattern[1];
72
+ frameData[offset + 2] = pattern[2];
73
+ frameData[offset + 3] = pattern[3];
74
+ }
75
+ return new VideoFrame(frameData, width, height, VideoBufferType.RGBA);
76
+ }
77
+ function verifyPngHeader(imageBuffer) {
78
+ expect(imageBuffer[0]).toBe(137);
79
+ expect(imageBuffer[1]).toBe(80);
80
+ expect(imageBuffer[2]).toBe(78);
81
+ expect(imageBuffer[3]).toBe(71);
82
+ }
83
+ function expectPixel(data, index, expected) {
84
+ expect(data[index]).toBe(expected.r);
85
+ expect(data[index + 1]).toBe(expected.g);
86
+ expect(data[index + 2]).toBe(expected.b);
87
+ expect(data[index + 3]).toBe(expected.a);
88
+ }
89
+ describe("computeChatCtxDiff", () => {
90
+ it("should return empty operations for identical contexts", () => {
91
+ const msg1 = createChatMessage("1", "Hello", "user");
92
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
93
+ const oldCtx = createChatContext([msg1, msg2]);
94
+ const newCtx = createChatContext([msg1, msg2]);
95
+ const result = computeChatCtxDiff(oldCtx, newCtx);
96
+ expect(result.toRemove).toEqual([]);
97
+ expect(result.toCreate).toEqual([]);
98
+ });
99
+ it("should handle empty old context", () => {
100
+ const msg1 = createChatMessage("1", "Hello", "user");
101
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
102
+ const oldCtx = createChatContext([]);
103
+ const newCtx = createChatContext([msg1, msg2]);
104
+ const result = computeChatCtxDiff(oldCtx, newCtx);
105
+ expect(result.toRemove).toEqual([]);
106
+ expect(result.toCreate).toEqual([
107
+ [null, "1"],
108
+ // first item goes to root
109
+ ["1", "2"]
110
+ ]);
111
+ });
112
+ it("should handle empty new context", () => {
113
+ const msg1 = createChatMessage("1", "Hello", "user");
114
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
115
+ const oldCtx = createChatContext([msg1, msg2]);
116
+ const newCtx = createChatContext([]);
117
+ const result = computeChatCtxDiff(oldCtx, newCtx);
118
+ expect(result.toRemove).toEqual(["1", "2"]);
119
+ expect(result.toCreate).toEqual([]);
120
+ });
121
+ it("should handle adding items to the end", () => {
122
+ const msg1 = createChatMessage("1", "Hello", "user");
123
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
124
+ const msg3 = createChatMessage("3", "How are you?", "user");
125
+ const oldCtx = createChatContext([msg1, msg2]);
126
+ const newCtx = createChatContext([msg1, msg2, msg3]);
127
+ const result = computeChatCtxDiff(oldCtx, newCtx);
128
+ expect(result.toRemove).toEqual([]);
129
+ expect(result.toCreate).toEqual([["2", "3"]]);
130
+ });
131
+ it("should handle removing items from the end", () => {
132
+ const msg1 = createChatMessage("1", "Hello", "user");
133
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
134
+ const msg3 = createChatMessage("3", "How are you?", "user");
135
+ const oldCtx = createChatContext([msg1, msg2, msg3]);
136
+ const newCtx = createChatContext([msg1, msg2]);
137
+ const result = computeChatCtxDiff(oldCtx, newCtx);
138
+ expect(result.toRemove).toEqual(["3"]);
139
+ expect(result.toCreate).toEqual([]);
140
+ });
141
+ it("should handle adding items to the beginning", () => {
142
+ const msg1 = createChatMessage("1", "Hello", "user");
143
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
144
+ const msg3 = createChatMessage("3", "How are you?", "user");
145
+ const oldCtx = createChatContext([msg2, msg3]);
146
+ const newCtx = createChatContext([msg1, msg2, msg3]);
147
+ const result = computeChatCtxDiff(oldCtx, newCtx);
148
+ expect(result.toRemove).toEqual([]);
149
+ expect(result.toCreate).toEqual([[null, "1"]]);
150
+ });
151
+ it("should handle removing items from the beginning", () => {
152
+ const msg1 = createChatMessage("1", "Hello", "user");
153
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
154
+ const msg3 = createChatMessage("3", "How are you?", "user");
155
+ const oldCtx = createChatContext([msg1, msg2, msg3]);
156
+ const newCtx = createChatContext([msg2, msg3]);
157
+ const result = computeChatCtxDiff(oldCtx, newCtx);
158
+ expect(result.toRemove).toEqual(["1"]);
159
+ expect(result.toCreate).toEqual([]);
160
+ });
161
+ it("should handle adding items in the middle", () => {
162
+ const msg1 = createChatMessage("1", "Hello", "user");
163
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
164
+ const msg3 = createChatMessage("3", "How are you?", "user");
165
+ const msg4 = createChatMessage("4", "Fine thanks", "assistant");
166
+ const oldCtx = createChatContext([msg1, msg3, msg4]);
167
+ const newCtx = createChatContext([msg1, msg2, msg3, msg4]);
168
+ const result = computeChatCtxDiff(oldCtx, newCtx);
169
+ expect(result.toRemove).toEqual([]);
170
+ expect(result.toCreate).toEqual([["1", "2"]]);
171
+ });
172
+ it("should handle removing items from the middle", () => {
173
+ const msg1 = createChatMessage("1", "Hello", "user");
174
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
175
+ const msg3 = createChatMessage("3", "How are you?", "user");
176
+ const msg4 = createChatMessage("4", "Fine thanks", "assistant");
177
+ const oldCtx = createChatContext([msg1, msg2, msg3, msg4]);
178
+ const newCtx = createChatContext([msg1, msg3, msg4]);
179
+ const result = computeChatCtxDiff(oldCtx, newCtx);
180
+ expect(result.toRemove).toEqual(["2"]);
181
+ expect(result.toCreate).toEqual([]);
182
+ });
183
+ it("should handle complex mixed operations", () => {
184
+ const msg1 = createChatMessage("1", "Hello", "user");
185
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
186
+ const msg3 = createChatMessage("3", "How are you?", "user");
187
+ const msg4 = createChatMessage("4", "Fine thanks", "assistant");
188
+ const msg5 = createChatMessage("5", "Good to hear", "user");
189
+ const msg6 = createChatMessage("6", "Anything else?", "assistant");
190
+ const oldCtx = createChatContext([msg1, msg2, msg3, msg4]);
191
+ const newCtx = createChatContext([msg1, msg5, msg3, msg6]);
192
+ const result = computeChatCtxDiff(oldCtx, newCtx);
193
+ expect(result.toRemove).toEqual(["2", "4"]);
194
+ expect(result.toCreate).toEqual([
195
+ ["1", "5"],
196
+ ["3", "6"]
197
+ ]);
198
+ });
199
+ it("should handle reordering items", () => {
200
+ const msg1 = createChatMessage("1", "Hello", "user");
201
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
202
+ const msg3 = createChatMessage("3", "How are you?", "user");
203
+ const oldCtx = createChatContext([msg1, msg2, msg3]);
204
+ const newCtx = createChatContext([msg3, msg1, msg2]);
205
+ const result = computeChatCtxDiff(oldCtx, newCtx);
206
+ expect(result.toRemove.length + result.toCreate.length).toBeGreaterThan(0);
207
+ });
208
+ it("should handle identical single item contexts", () => {
209
+ const msg1 = createChatMessage("1", "Hello", "user");
210
+ const oldCtx = createChatContext([msg1]);
211
+ const newCtx = createChatContext([msg1]);
212
+ const result = computeChatCtxDiff(oldCtx, newCtx);
213
+ expect(result.toRemove).toEqual([]);
214
+ expect(result.toCreate).toEqual([]);
215
+ });
216
+ it("should handle longest common subsequence correctly", () => {
217
+ const msg1 = createChatMessage("1", "Hello", "user");
218
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
219
+ const msg3 = createChatMessage("3", "How are you?", "user");
220
+ const msg4 = createChatMessage("4", "Fine thanks", "assistant");
221
+ const msg5 = createChatMessage("5", "Good to hear", "user");
222
+ const oldCtx = createChatContext([msg1, msg2, msg3, msg4, msg5]);
223
+ const newCtx = createChatContext([msg1, msg3, msg5]);
224
+ const result = computeChatCtxDiff(oldCtx, newCtx);
225
+ expect(result.toRemove).toEqual(["2", "4"]);
226
+ expect(result.toCreate).toEqual([]);
227
+ });
228
+ it("should handle interleaved additions and common subsequence", () => {
229
+ const msg1 = createChatMessage("1", "Hello", "user");
230
+ const msg2 = createChatMessage("2", "Hi there", "assistant");
231
+ const msg3 = createChatMessage("3", "How are you?", "user");
232
+ const msg4 = createChatMessage("4", "Fine thanks", "assistant");
233
+ const msg5 = createChatMessage("5", "Good to hear", "user");
234
+ const msg6 = createChatMessage("6", "Anything else?", "assistant");
235
+ const oldCtx = createChatContext([msg1, msg3, msg5]);
236
+ const newCtx = createChatContext([msg1, msg2, msg3, msg4, msg5, msg6]);
237
+ const result = computeChatCtxDiff(oldCtx, newCtx);
238
+ expect(result.toRemove).toEqual([]);
239
+ expect(result.toCreate).toEqual([
240
+ ["1", "2"],
241
+ ["3", "4"],
242
+ ["5", "6"]
243
+ ]);
244
+ });
245
+ });
246
+ describe("serializeImage", () => {
247
+ let consoleWarnSpy;
248
+ beforeEach(() => {
249
+ consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {
250
+ });
251
+ vi.clearAllMocks();
252
+ });
253
+ describe("Data URL handling", () => {
254
+ it("should serialize a valid JPEG data URL", async () => {
255
+ const originalBase64 = "/9j/4AAQSkZJRg==";
256
+ const imageContent = createImageContent(`data:image/jpeg;base64,${originalBase64}`, "high");
257
+ const result = await serializeImage(imageContent);
258
+ expect(result).toEqual({
259
+ base64Data: originalBase64,
260
+ mimeType: "image/jpeg",
261
+ inferenceDetail: "high"
262
+ });
263
+ expect(result.base64Data).toBe(originalBase64);
264
+ });
265
+ it("should serialize a valid PNG data URL", async () => {
266
+ const imageContent = createImageContent(
267
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB",
268
+ "low"
269
+ );
270
+ const result = await serializeImage(imageContent);
271
+ expect(result).toEqual({
272
+ base64Data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB",
273
+ mimeType: "image/png",
274
+ inferenceDetail: "low"
275
+ });
276
+ });
277
+ it("should serialize a valid WebP data URL", async () => {
278
+ const imageContent = createImageContent(
279
+ "data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAA",
280
+ "auto"
281
+ );
282
+ const result = await serializeImage(imageContent);
283
+ expect(result).toEqual({
284
+ base64Data: "UklGRiQAAABXRUJQVlA4IBgAAAA",
285
+ mimeType: "image/webp",
286
+ inferenceDetail: "auto"
287
+ });
288
+ });
289
+ it("should serialize a valid GIF data URL", async () => {
290
+ const imageContent = createImageContent(
291
+ "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",
292
+ "auto"
293
+ );
294
+ const result = await serializeImage(imageContent);
295
+ expect(result).toEqual({
296
+ base64Data: "R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",
297
+ mimeType: "image/gif",
298
+ inferenceDetail: "auto"
299
+ });
300
+ });
301
+ it("should warn and use provided mimeType when it differs from data URL mime type", async () => {
302
+ const imageContent = createImageContent("data:image/jpeg;base64,/9j/4AAQSkZJRg==", "auto", {
303
+ mimeType: "image/png"
304
+ });
305
+ const result = await serializeImage(imageContent);
306
+ expect(consoleWarnSpy).toHaveBeenCalledWith(
307
+ "Provided mimeType 'image/png' does not match data URL mime type 'image/jpeg'. Using provided mimeType."
308
+ );
309
+ expect(result).toEqual({
310
+ base64Data: "/9j/4AAQSkZJRg==",
311
+ mimeType: "image/png",
312
+ inferenceDetail: "auto"
313
+ });
314
+ });
315
+ it("should throw error for invalid data URL format", async () => {
316
+ const imageContent = createImageContent("data:;base64,/9j/4AAQSkZJRg==", "auto");
317
+ await expect(serializeImage(imageContent)).rejects.toThrow("Invalid data URL format");
318
+ });
319
+ it("should throw error for unsupported mime type", async () => {
320
+ const imageContent = createImageContent(
321
+ "data:image/bmp;base64,Qk06AAAAAAAAADYAAAAoAAAA",
322
+ "auto"
323
+ );
324
+ await expect(serializeImage(imageContent)).rejects.toThrow(
325
+ "Unsupported mimeType image/bmp. Must be jpeg, png, webp, or gif"
326
+ );
327
+ });
328
+ });
329
+ describe("External URL handling", () => {
330
+ it("should serialize an external URL without mimeType", async () => {
331
+ const imageContent = createImageContent("https://example.com/image.jpg", "high");
332
+ const result = await serializeImage(imageContent);
333
+ expect(result).toEqual({
334
+ mimeType: void 0,
335
+ inferenceDetail: "high",
336
+ externalUrl: "https://example.com/image.jpg"
337
+ });
338
+ });
339
+ it("should serialize an external URL with mimeType", async () => {
340
+ const imageContent = createImageContent("https://example.com/image.jpg", "low", {
341
+ mimeType: "image/jpeg"
342
+ });
343
+ const result = await serializeImage(imageContent);
344
+ expect(result).toEqual({
345
+ mimeType: "image/jpeg",
346
+ inferenceDetail: "low",
347
+ externalUrl: "https://example.com/image.jpg"
348
+ });
349
+ });
350
+ });
351
+ describe("VideoFrame handling", () => {
352
+ it("should serialize a VideoFrame without resize parameters", async () => {
353
+ const width = 4;
354
+ const height = 4;
355
+ const videoFrame = createSolidColorFrame(width, height, { r: 255, g: 0, b: 0, a: 255 });
356
+ const imageContent = createImageContent(videoFrame, "auto");
357
+ const result = await serializeImage(imageContent);
358
+ expect(result).toMatchObject({
359
+ mimeType: "image/png",
360
+ inferenceDetail: "auto"
361
+ });
362
+ expect(result.base64Data).toBeDefined();
363
+ expect(result.base64Data).toMatch(/^[A-Za-z0-9+/]+=*$/);
364
+ expect(result.externalUrl).toBeUndefined();
365
+ const { imageBuffer, decodedImage } = await decodeImageToRaw(result.base64Data);
366
+ verifyPngHeader(imageBuffer);
367
+ expect(decodedImage.info.width).toBe(width);
368
+ expect(decodedImage.info.height).toBe(height);
369
+ expect(decodedImage.info.channels).toBe(4);
370
+ const decodedData = decodedImage.data;
371
+ for (let i = 0; i < decodedData.length; i += 4) {
372
+ expectPixel(decodedData, i, { r: 255, g: 0, b: 0, a: 255 });
373
+ }
374
+ });
375
+ it("should serialize a VideoFrame with a gradient pattern", async () => {
376
+ const width = 8;
377
+ const height = 8;
378
+ const videoFrame = createGradientFrame(width, height);
379
+ const imageContent = createImageContent(videoFrame, "high");
380
+ const result = await serializeImage(imageContent);
381
+ expect(result).toMatchObject({
382
+ mimeType: "image/png",
383
+ inferenceDetail: "high"
384
+ });
385
+ const { decodedImage } = await decodeImageToRaw(result.base64Data);
386
+ expect(decodedImage.info.width).toBe(width);
387
+ expect(decodedImage.info.height).toBe(height);
388
+ const decodedData = decodedImage.data;
389
+ for (let y = 0; y < height; y++) {
390
+ for (let x = 0; x < width; x++) {
391
+ const idx = (y * width + x) * 4;
392
+ const expectedR = Math.floor(x / (width - 1) * 255);
393
+ const expectedG = Math.floor(y / (height - 1) * 255);
394
+ expectPixel(decodedData, idx, { r: expectedR, g: expectedG, b: 128, a: 255 });
395
+ }
396
+ }
397
+ });
398
+ it("should preserve exact pixel data through serialization", async () => {
399
+ const width = 2;
400
+ const height = 2;
401
+ const patterns = [
402
+ [255, 0, 0, 255],
403
+ [0, 255, 0, 255],
404
+ [0, 0, 255, 255],
405
+ [255, 255, 255, 255]
406
+ ];
407
+ const videoFrame = createPatternFrame(width, height, patterns);
408
+ const imageContent = createImageContent(videoFrame, "low");
409
+ const result = await serializeImage(imageContent);
410
+ const { decodedImage } = await decodeImageToRaw(result.base64Data);
411
+ const decoded = decodedImage.data;
412
+ expectPixel(decoded, 0, { r: 255, g: 0, b: 0, a: 255 });
413
+ expectPixel(decoded, 4, { r: 0, g: 255, b: 0, a: 255 });
414
+ expectPixel(decoded, width * 4, { r: 0, g: 0, b: 255, a: 255 });
415
+ expectPixel(decoded, (width + 1) * 4, { r: 255, g: 255, b: 255, a: 255 });
416
+ });
417
+ it("should handle resize parameters correctly", async () => {
418
+ const width = 2;
419
+ const height = 2;
420
+ const videoFrame = createSolidColorFrame(width, height, { r: 100, g: 100, b: 100, a: 255 });
421
+ const imageContent = createImageContent(videoFrame, "auto", {
422
+ inferenceWidth: 4,
423
+ inferenceHeight: 4
424
+ });
425
+ const result = await serializeImage(imageContent);
426
+ const { decodedImage } = await decodeImageToRaw(result.base64Data);
427
+ expect(decodedImage.info.width).toBe(4);
428
+ expect(decodedImage.info.height).toBe(4);
429
+ const decodedData = decodedImage.data;
430
+ for (let i = 0; i < decodedData.length; i += 4) {
431
+ expect(decodedData[i]).toBeCloseTo(100, -1);
432
+ expect(decodedData[i + 1]).toBeCloseTo(100, -1);
433
+ expect(decodedData[i + 2]).toBeCloseTo(100, -1);
434
+ expect(decodedData[i + 3]).toBe(255);
435
+ }
436
+ });
437
+ it("should handle RGB24 VideoBufferType correctly", async () => {
438
+ const width = 2;
439
+ const height = 2;
440
+ const channels = 3;
441
+ const frameData = new Uint8Array(width * height * channels);
442
+ for (let i = 0; i < frameData.length; i += channels) {
443
+ frameData[i] = 255;
444
+ frameData[i + 1] = 128;
445
+ frameData[i + 2] = 64;
446
+ }
447
+ const videoFrame = new VideoFrame(frameData, width, height, VideoBufferType.RGB24);
448
+ const imageContent = createImageContent(videoFrame, "auto");
449
+ const result = await serializeImage(imageContent);
450
+ expect(result.mimeType).toBe("image/png");
451
+ const { decodedImage } = await decodeImageToRaw(result.base64Data);
452
+ expect(decodedImage.info.channels).toBeGreaterThanOrEqual(3);
453
+ const decodedData = decodedImage.data;
454
+ const decodedChannels = decodedImage.info.channels;
455
+ for (let i = 0; i < decodedData.length; i += decodedChannels) {
456
+ expect(decodedData[i]).toBe(255);
457
+ expect(decodedData[i + 1]).toBe(128);
458
+ expect(decodedData[i + 2]).toBe(64);
459
+ if (decodedChannels === 4) {
460
+ expect(decodedData[i + 3]).toBe(255);
461
+ }
462
+ }
463
+ });
464
+ it("should handle different RGBA-like formats correctly", async () => {
465
+ const width = 1;
466
+ const height = 1;
467
+ const testFormats = [
468
+ VideoBufferType.RGBA,
469
+ VideoBufferType.BGRA,
470
+ VideoBufferType.ARGB,
471
+ VideoBufferType.ABGR
472
+ ];
473
+ for (const format of testFormats) {
474
+ const frameData = new Uint8Array([100, 150, 200, 250]);
475
+ const videoFrame = new VideoFrame(frameData, width, height, format);
476
+ const imageContent = createImageContent(videoFrame, "auto");
477
+ const result = await serializeImage(imageContent);
478
+ expect(result.mimeType).toBe("image/png");
479
+ expect(result.base64Data).toBeDefined();
480
+ }
481
+ });
482
+ });
483
+ describe("Error handling", () => {
484
+ it("should throw error for unsupported image type", async () => {
485
+ const imageContent = createImageContent(123, "auto");
486
+ await expect(serializeImage(imageContent)).rejects.toThrow("Unsupported image type");
487
+ });
488
+ });
489
+ });
490
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/llm/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { VideoBufferType, VideoFrame } from '@livekit/rtc-node';\nimport sharp from 'sharp';\nimport { beforeEach, describe, expect, it, vi } from 'vitest';\nimport { ChatContext, ChatMessage, type ImageContent } from './chat_context.js';\nimport { computeChatCtxDiff, serializeImage } from './utils.js';\n\nfunction createChatMessage(\n id: string,\n content: string,\n role: 'user' | 'assistant' | 'system' = 'user',\n): ChatMessage {\n return ChatMessage.create({\n id,\n content,\n role,\n });\n}\n\nfunction createChatContext(messages: ChatMessage[]): ChatContext {\n const ctx = new ChatContext();\n for (const message of messages) {\n ctx.items.push(message);\n }\n return ctx;\n}\n\nfunction createImageContent(\n image: string | VideoFrame,\n inferenceDetail: 'auto' | 'high' | 'low' = 'auto',\n options?: {\n mimeType?: string;\n inferenceWidth?: number;\n inferenceHeight?: number;\n },\n): ImageContent {\n return {\n id: 'test-id',\n type: 'image_content',\n image,\n inferenceDetail,\n mimeType: options?.mimeType,\n inferenceWidth: options?.inferenceWidth,\n inferenceHeight: options?.inferenceHeight,\n _cache: {},\n };\n}\n\nasync function decodeImageToRaw(base64Data: string) {\n const imageBuffer = Buffer.from(base64Data, 'base64');\n const decodedImage = await sharp(imageBuffer).raw().toBuffer({ resolveWithObject: true });\n return { imageBuffer, decodedImage };\n}\n\nfunction createSolidColorFrame(\n width: number,\n height: number,\n color: { r: number; g: number; b: number; a?: number },\n bufferType: VideoBufferType = VideoBufferType.RGBA,\n): VideoFrame {\n const channels = bufferType === VideoBufferType.RGB24 ? 3 : 4;\n const frameData = new Uint8Array(width * height * channels);\n\n for (let i = 0; i < frameData.length; i += channels) {\n frameData[i] = color.r;\n frameData[i + 1] = color.g;\n frameData[i + 2] = color.b;\n if (channels === 4 && color.a !== undefined) {\n frameData[i + 3] = color.a;\n }\n }\n\n return new VideoFrame(frameData, width, height, bufferType);\n}\n\nfunction createGradientFrame(width: number, height: number): VideoFrame {\n const channels = 4;\n const frameData = new Uint8Array(width * height * channels);\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * channels;\n frameData[idx] = Math.floor((x / (width - 1)) * 255);\n frameData[idx + 1] = Math.floor((y / (height - 1)) * 255);\n frameData[idx + 2] = 128;\n frameData[idx + 3] = 255;\n }\n }\n\n return new VideoFrame(frameData, width, height, VideoBufferType.RGBA);\n}\n\nfunction createPatternFrame(width: number, height: number, patterns: number[][]): VideoFrame {\n const channels = 4;\n const frameData = new Uint8Array(width * height * channels);\n\n for (let i = 0; i < patterns.length; i++) {\n const offset = i * 4;\n const pattern = patterns[i]!;\n frameData[offset] = pattern[0]!;\n frameData[offset + 1] = pattern[1]!;\n frameData[offset + 2] = pattern[2]!;\n frameData[offset + 3] = pattern[3]!;\n }\n\n return new VideoFrame(frameData, width, height, VideoBufferType.RGBA);\n}\n\nfunction verifyPngHeader(imageBuffer: Buffer) {\n expect(imageBuffer[0]).toBe(0x89);\n expect(imageBuffer[1]).toBe(0x50);\n expect(imageBuffer[2]).toBe(0x4e);\n expect(imageBuffer[3]).toBe(0x47);\n}\n\nfunction expectPixel(\n data: Buffer,\n index: number,\n expected: { r: number; g: number; b: number; a: number },\n) {\n expect(data[index]).toBe(expected.r);\n expect(data[index + 1]).toBe(expected.g);\n expect(data[index + 2]).toBe(expected.b);\n expect(data[index + 3]).toBe(expected.a);\n}\n\ndescribe('computeChatCtxDiff', () => {\n it('should return empty operations for identical contexts', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n\n const oldCtx = createChatContext([msg1, msg2]);\n const newCtx = createChatContext([msg1, msg2]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual([]);\n expect(result.toCreate).toEqual([]);\n });\n\n it('should handle empty old context', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n\n const oldCtx = createChatContext([]);\n const newCtx = createChatContext([msg1, msg2]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual([]);\n expect(result.toCreate).toEqual([\n [null, '1'], // first item goes to root\n ['1', '2'],\n ]);\n });\n\n it('should handle empty new context', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n\n const oldCtx = createChatContext([msg1, msg2]);\n const newCtx = createChatContext([]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual(['1', '2']);\n expect(result.toCreate).toEqual([]);\n });\n\n it('should handle adding items to the end', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n\n const oldCtx = createChatContext([msg1, msg2]);\n const newCtx = createChatContext([msg1, msg2, msg3]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual([]);\n expect(result.toCreate).toEqual([['2', '3']]);\n });\n\n it('should handle removing items from the end', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n\n const oldCtx = createChatContext([msg1, msg2, msg3]);\n const newCtx = createChatContext([msg1, msg2]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual(['3']);\n expect(result.toCreate).toEqual([]);\n });\n\n it('should handle adding items to the beginning', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n\n const oldCtx = createChatContext([msg2, msg3]);\n const newCtx = createChatContext([msg1, msg2, msg3]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual([]);\n expect(result.toCreate).toEqual([[null, '1']]);\n });\n\n it('should handle removing items from the beginning', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n\n const oldCtx = createChatContext([msg1, msg2, msg3]);\n const newCtx = createChatContext([msg2, msg3]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual(['1']);\n expect(result.toCreate).toEqual([]);\n });\n\n it('should handle adding items in the middle', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n const msg4 = createChatMessage('4', 'Fine thanks', 'assistant');\n\n const oldCtx = createChatContext([msg1, msg3, msg4]);\n const newCtx = createChatContext([msg1, msg2, msg3, msg4]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual([]);\n expect(result.toCreate).toEqual([['1', '2']]);\n });\n\n it('should handle removing items from the middle', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n const msg4 = createChatMessage('4', 'Fine thanks', 'assistant');\n\n const oldCtx = createChatContext([msg1, msg2, msg3, msg4]);\n const newCtx = createChatContext([msg1, msg3, msg4]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual(['2']);\n expect(result.toCreate).toEqual([]);\n });\n\n it('should handle complex mixed operations', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n const msg4 = createChatMessage('4', 'Fine thanks', 'assistant');\n const msg5 = createChatMessage('5', 'Good to hear', 'user');\n const msg6 = createChatMessage('6', 'Anything else?', 'assistant');\n\n // Old: [1, 2, 3, 4]\n // New: [1, 5, 3, 6]\n // Remove: [2, 4]\n // Create: [5 after 1, 6 after 3]\n\n const oldCtx = createChatContext([msg1, msg2, msg3, msg4]);\n const newCtx = createChatContext([msg1, msg5, msg3, msg6]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual(['2', '4']);\n expect(result.toCreate).toEqual([\n ['1', '5'],\n ['3', '6'],\n ]);\n });\n\n it('should handle reordering items', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n\n // Old: [1, 2, 3]\n // New: [3, 1, 2]\n // This should remove all and recreate in new order\n\n const oldCtx = createChatContext([msg1, msg2, msg3]);\n const newCtx = createChatContext([msg3, msg1, msg2]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n // Since order changed completely, should have some operations\n expect(result.toRemove.length + result.toCreate.length).toBeGreaterThan(0);\n });\n\n it('should handle identical single item contexts', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n\n const oldCtx = createChatContext([msg1]);\n const newCtx = createChatContext([msg1]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual([]);\n expect(result.toCreate).toEqual([]);\n });\n\n it('should handle longest common subsequence correctly', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n const msg4 = createChatMessage('4', 'Fine thanks', 'assistant');\n const msg5 = createChatMessage('5', 'Good to hear', 'user');\n\n // Old: [1, 2, 3, 4, 5]\n // New: [1, 3, 5]\n // LCS should be [1, 3, 5], remove [2, 4]\n\n const oldCtx = createChatContext([msg1, msg2, msg3, msg4, msg5]);\n const newCtx = createChatContext([msg1, msg3, msg5]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual(['2', '4']);\n expect(result.toCreate).toEqual([]);\n });\n\n it('should handle interleaved additions and common subsequence', () => {\n const msg1 = createChatMessage('1', 'Hello', 'user');\n const msg2 = createChatMessage('2', 'Hi there', 'assistant');\n const msg3 = createChatMessage('3', 'How are you?', 'user');\n const msg4 = createChatMessage('4', 'Fine thanks', 'assistant');\n const msg5 = createChatMessage('5', 'Good to hear', 'user');\n const msg6 = createChatMessage('6', 'Anything else?', 'assistant');\n\n // Old: [1, 3, 5]\n // New: [1, 2, 3, 4, 5, 6]\n // LCS: [1, 3, 5], add [2 after 1, 4 after 3, 6 after 5]\n\n const oldCtx = createChatContext([msg1, msg3, msg5]);\n const newCtx = createChatContext([msg1, msg2, msg3, msg4, msg5, msg6]);\n\n const result = computeChatCtxDiff(oldCtx, newCtx);\n\n expect(result.toRemove).toEqual([]);\n expect(result.toCreate).toEqual([\n ['1', '2'],\n ['3', '4'],\n ['5', '6'],\n ]);\n });\n});\n\ndescribe('serializeImage', () => {\n let consoleWarnSpy: ReturnType<typeof vi.spyOn>;\n\n beforeEach(() => {\n consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n vi.clearAllMocks();\n });\n\n describe('Data URL handling', () => {\n it('should serialize a valid JPEG data URL', async () => {\n const originalBase64 = '/9j/4AAQSkZJRg==';\n const imageContent = createImageContent(`data:image/jpeg;base64,${originalBase64}`, 'high');\n\n const result = await serializeImage(imageContent);\n\n expect(result).toEqual({\n base64Data: originalBase64,\n mimeType: 'image/jpeg',\n inferenceDetail: 'high',\n });\n\n expect(result.base64Data).toBe(originalBase64);\n });\n\n it('should serialize a valid PNG data URL', async () => {\n const imageContent = createImageContent(\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB',\n 'low',\n );\n\n const result = await serializeImage(imageContent);\n\n expect(result).toEqual({\n base64Data: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB',\n mimeType: 'image/png',\n inferenceDetail: 'low',\n });\n });\n\n it('should serialize a valid WebP data URL', async () => {\n const imageContent = createImageContent(\n 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAA',\n 'auto',\n );\n\n const result = await serializeImage(imageContent);\n\n expect(result).toEqual({\n base64Data: 'UklGRiQAAABXRUJQVlA4IBgAAAA',\n mimeType: 'image/webp',\n inferenceDetail: 'auto',\n });\n });\n\n it('should serialize a valid GIF data URL', async () => {\n const imageContent = createImageContent(\n 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',\n 'auto',\n );\n\n const result = await serializeImage(imageContent);\n\n expect(result).toEqual({\n base64Data: 'R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',\n mimeType: 'image/gif',\n inferenceDetail: 'auto',\n });\n });\n\n it('should warn and use provided mimeType when it differs from data URL mime type', async () => {\n const imageContent = createImageContent('data:image/jpeg;base64,/9j/4AAQSkZJRg==', 'auto', {\n mimeType: 'image/png',\n });\n\n const result = await serializeImage(imageContent);\n\n expect(consoleWarnSpy).toHaveBeenCalledWith(\n \"Provided mimeType 'image/png' does not match data URL mime type 'image/jpeg'. Using provided mimeType.\",\n );\n expect(result).toEqual({\n base64Data: '/9j/4AAQSkZJRg==',\n mimeType: 'image/png',\n inferenceDetail: 'auto',\n });\n });\n\n it('should throw error for invalid data URL format', async () => {\n const imageContent = createImageContent('data:;base64,/9j/4AAQSkZJRg==', 'auto');\n\n await expect(serializeImage(imageContent)).rejects.toThrow('Invalid data URL format');\n });\n\n it('should throw error for unsupported mime type', async () => {\n const imageContent = createImageContent(\n 'data:image/bmp;base64,Qk06AAAAAAAAADYAAAAoAAAA',\n 'auto',\n );\n\n await expect(serializeImage(imageContent)).rejects.toThrow(\n 'Unsupported mimeType image/bmp. Must be jpeg, png, webp, or gif',\n );\n });\n });\n\n describe('External URL handling', () => {\n it('should serialize an external URL without mimeType', async () => {\n const imageContent = createImageContent('https://example.com/image.jpg', 'high');\n\n const result = await serializeImage(imageContent);\n\n expect(result).toEqual({\n mimeType: undefined,\n inferenceDetail: 'high',\n externalUrl: 'https://example.com/image.jpg',\n });\n });\n\n it('should serialize an external URL with mimeType', async () => {\n const imageContent = createImageContent('https://example.com/image.jpg', 'low', {\n mimeType: 'image/jpeg',\n });\n\n const result = await serializeImage(imageContent);\n\n expect(result).toEqual({\n mimeType: 'image/jpeg',\n inferenceDetail: 'low',\n externalUrl: 'https://example.com/image.jpg',\n });\n });\n });\n\n describe('VideoFrame handling', () => {\n it('should serialize a VideoFrame without resize parameters', async () => {\n const width = 4;\n const height = 4;\n const videoFrame = createSolidColorFrame(width, height, { r: 255, g: 0, b: 0, a: 255 });\n const imageContent = createImageContent(videoFrame, 'auto');\n\n const result = await serializeImage(imageContent);\n\n expect(result).toMatchObject({\n mimeType: 'image/png',\n inferenceDetail: 'auto',\n });\n expect(result.base64Data).toBeDefined();\n expect(result.base64Data).toMatch(/^[A-Za-z0-9+/]+=*$/);\n expect(result.externalUrl).toBeUndefined();\n\n const { imageBuffer, decodedImage } = await decodeImageToRaw(result.base64Data!);\n\n verifyPngHeader(imageBuffer);\n\n expect(decodedImage.info.width).toBe(width);\n expect(decodedImage.info.height).toBe(height);\n expect(decodedImage.info.channels).toBe(4);\n\n const decodedData = decodedImage.data;\n for (let i = 0; i < decodedData.length; i += 4) {\n expectPixel(decodedData, i, { r: 255, g: 0, b: 0, a: 255 });\n }\n });\n\n it('should serialize a VideoFrame with a gradient pattern', async () => {\n const width = 8;\n const height = 8;\n const videoFrame = createGradientFrame(width, height);\n const imageContent = createImageContent(videoFrame, 'high');\n\n const result = await serializeImage(imageContent);\n\n expect(result).toMatchObject({\n mimeType: 'image/png',\n inferenceDetail: 'high',\n });\n\n const { decodedImage } = await decodeImageToRaw(result.base64Data!);\n\n expect(decodedImage.info.width).toBe(width);\n expect(decodedImage.info.height).toBe(height);\n\n const decodedData = decodedImage.data;\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * 4;\n const expectedR = Math.floor((x / (width - 1)) * 255);\n const expectedG = Math.floor((y / (height - 1)) * 255);\n\n expectPixel(decodedData, idx, { r: expectedR, g: expectedG, b: 128, a: 255 });\n }\n }\n });\n\n it('should preserve exact pixel data through serialization', async () => {\n const width = 2;\n const height = 2;\n\n const patterns = [\n [255, 0, 0, 255],\n [0, 255, 0, 255],\n [0, 0, 255, 255],\n [255, 255, 255, 255],\n ];\n\n const videoFrame = createPatternFrame(width, height, patterns);\n const imageContent = createImageContent(videoFrame, 'low');\n\n const result = await serializeImage(imageContent);\n\n const { decodedImage } = await decodeImageToRaw(result.base64Data!);\n const decoded = decodedImage.data;\n\n expectPixel(decoded, 0, { r: 255, g: 0, b: 0, a: 255 });\n expectPixel(decoded, 4, { r: 0, g: 255, b: 0, a: 255 });\n expectPixel(decoded, width * 4, { r: 0, g: 0, b: 255, a: 255 });\n expectPixel(decoded, (width + 1) * 4, { r: 255, g: 255, b: 255, a: 255 });\n });\n\n it('should handle resize parameters correctly', async () => {\n const width = 2;\n const height = 2;\n const videoFrame = createSolidColorFrame(width, height, { r: 100, g: 100, b: 100, a: 255 });\n\n const imageContent = createImageContent(videoFrame, 'auto', {\n inferenceWidth: 4,\n inferenceHeight: 4,\n });\n\n const result = await serializeImage(imageContent);\n\n const { decodedImage } = await decodeImageToRaw(result.base64Data!);\n\n expect(decodedImage.info.width).toBe(4);\n expect(decodedImage.info.height).toBe(4);\n\n const decodedData = decodedImage.data;\n for (let i = 0; i < decodedData.length; i += 4) {\n expect(decodedData[i]).toBeCloseTo(100, -1);\n expect(decodedData[i + 1]).toBeCloseTo(100, -1);\n expect(decodedData[i + 2]).toBeCloseTo(100, -1);\n expect(decodedData[i + 3]).toBe(255);\n }\n });\n\n it('should handle RGB24 VideoBufferType correctly', async () => {\n const width = 2;\n const height = 2;\n const channels = 3;\n const frameData = new Uint8Array(width * height * channels);\n\n for (let i = 0; i < frameData.length; i += channels) {\n frameData[i] = 255;\n frameData[i + 1] = 128;\n frameData[i + 2] = 64;\n }\n\n const videoFrame = new VideoFrame(frameData, width, height, VideoBufferType.RGB24);\n const imageContent = createImageContent(videoFrame, 'auto');\n\n const result = await serializeImage(imageContent);\n\n expect(result.mimeType).toBe('image/png');\n\n const { decodedImage } = await decodeImageToRaw(result.base64Data!);\n\n expect(decodedImage.info.channels).toBeGreaterThanOrEqual(3);\n\n const decodedData = decodedImage.data;\n const decodedChannels = decodedImage.info.channels;\n\n for (let i = 0; i < decodedData.length; i += decodedChannels) {\n expect(decodedData[i]).toBe(255);\n expect(decodedData[i + 1]).toBe(128);\n expect(decodedData[i + 2]).toBe(64);\n if (decodedChannels === 4) {\n expect(decodedData[i + 3]).toBe(255);\n }\n }\n });\n\n it('should handle different RGBA-like formats correctly', async () => {\n const width = 1;\n const height = 1;\n const testFormats = [\n VideoBufferType.RGBA,\n VideoBufferType.BGRA,\n VideoBufferType.ARGB,\n VideoBufferType.ABGR,\n ];\n\n for (const format of testFormats) {\n const frameData = new Uint8Array([100, 150, 200, 250]);\n const videoFrame = new VideoFrame(frameData, width, height, format);\n const imageContent = createImageContent(videoFrame, 'auto');\n\n const result = await serializeImage(imageContent);\n\n expect(result.mimeType).toBe('image/png');\n expect(result.base64Data).toBeDefined();\n }\n });\n });\n\n describe('Error handling', () => {\n it('should throw error for unsupported image type', async () => {\n const imageContent = createImageContent(123 as any, 'auto'); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n await expect(serializeImage(imageContent)).rejects.toThrow('Unsupported image type');\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -3,10 +3,6 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
6
  var __copyProps = (to, from, except, desc) => {
11
7
  if (from && typeof from === "object" || typeof from === "function") {
12
8
  for (let key of __getOwnPropNames(from))
@@ -17,28 +13,5 @@ var __copyProps = (to, from, except, desc) => {
17
13
  };
18
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
15
  var base_exports = {};
20
- __export(base_exports, {
21
- MultimodalLLMError: () => MultimodalLLMError
22
- });
23
16
  module.exports = __toCommonJS(base_exports);
24
- class MultimodalLLMError extends Error {
25
- type;
26
- reason;
27
- code;
28
- constructor({
29
- type,
30
- reason,
31
- code,
32
- message
33
- } = {}) {
34
- super(message);
35
- this.type = type;
36
- this.reason = reason;
37
- this.code = code;
38
- }
39
- }
40
- // Annotate the CommonJS export names for ESM import in node:
41
- 0 && (module.exports = {
42
- MultimodalLLMError
43
- });
44
17
  //# sourceMappingURL=base.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/metrics/base.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport interface LLMMetrics {\n requestId: string;\n timestamp: number;\n ttft: number;\n duration: number;\n label: string;\n cancelled: boolean;\n completionTokens: number;\n promptTokens: number;\n totalTokens: number;\n tokensPerSecond: number;\n error?: Error;\n}\n\nexport interface STTMetrics {\n requestId: string;\n timestamp: number;\n duration: number;\n label: string;\n audioDuration: number;\n streamed: boolean;\n error?: Error;\n}\n\nexport interface TTSMetrics {\n requestId: string;\n timestamp: number;\n ttfb: number;\n duration: number;\n label: string;\n audioDuration: number;\n cancelled: boolean;\n charactersCount: number;\n streamed: boolean;\n error?: Error;\n}\n\nexport interface VADMetrics {\n timestamp: number;\n idleTime: number;\n inferenceDurationTotal: number;\n inferenceCount: number;\n label: string;\n}\n\nexport interface PipelineEOUMetrics {\n /**\n * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics\n */\n sequenceId: string;\n /** Timestamp of when the event was recorded */\n timestamp: number;\n /** Amount of time between the end of speech from VAD and the decision to end the user's turn */\n endOfUtteranceDelay: number;\n /**\n * Time taken to obtain the transcript after the end of the user's speech.\n *\n * @remarks\n * May be 0 if the transcript was already available.\n */\n transcriptionDelay: number;\n}\n\nexport interface PipelineLLMMetrics extends LLMMetrics {\n /**\n * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics\n */\n sequenceId: string;\n}\n\nexport interface PipelineTTSMetrics extends TTSMetrics {\n /**\n * Unique identifier shared across different metrics to combine related STT, LLM, and TTS metrics\n */\n sequenceId: string;\n}\n\nexport type PipelineSTTMetrics = STTMetrics;\nexport type PipelineVADMetrics = VADMetrics;\n\nexport class MultimodalLLMError extends Error {\n type?: string;\n reason?: string;\n code?: string;\n constructor({\n type,\n reason,\n code,\n message,\n }: { type?: string; reason?: string; code?: string; message?: string } = {}) {\n super(message);\n this.type = type;\n this.reason = reason;\n this.code = code;\n }\n}\n\nexport interface MultimodalLLMMetrics extends LLMMetrics {\n inputTokenDetails: {\n cachedTokens: number;\n textTokens: number;\n audioTokens: number;\n };\n outputTokenDetails: {\n textTokens: number;\n audioTokens: number;\n };\n}\n\nexport type AgentMetrics =\n | STTMetrics\n | LLMMetrics\n | TTSMetrics\n | VADMetrics\n | PipelineSTTMetrics\n | PipelineEOUMetrics\n | PipelineLLMMetrics\n | PipelineTTSMetrics\n | PipelineVADMetrics\n | MultimodalLLMMetrics;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoFO,MAAM,2BAA2B,MAAM;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAyE,CAAC,GAAG;AAC3E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/metrics/base.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type AgentMetrics =\n | STTMetrics\n | LLMMetrics\n | TTSMetrics\n | VADMetrics\n | EOUMetrics\n | RealtimeModelMetrics;\n\nexport type LLMMetrics = {\n type: 'llm_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n duration: number;\n ttft: number;\n cancelled: boolean;\n completionTokens: number;\n promptTokens: number;\n promptCachedTokens: number;\n totalTokens: number;\n tokensPerSecond: number;\n speechId?: string;\n};\n\nexport type STTMetrics = {\n type: 'stt_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n /**\n * The request duration in seconds, 0.0 if the STT is streaming.\n */\n duration: number;\n /**\n * The duration of the pushed audio in seconds.\n */\n audioDuration: number;\n /**\n * Whether the STT is streaming (e.g using websocket).\n */\n streamed: boolean;\n};\n\nexport type TTSMetrics = {\n type: 'tts_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n ttfb: number;\n duration: number;\n audioDuration: number;\n cancelled: boolean;\n charactersCount: number;\n streamed: boolean;\n segmentId?: string;\n speechId?: string;\n};\n\nexport type VADMetrics = {\n type: 'vad_metrics';\n label: string;\n timestamp: number;\n idleTime: number;\n inferenceDurationTotal: number;\n inferenceCount: number;\n};\n\nexport type EOUMetrics = {\n type: 'eou_metrics';\n timestamp: number;\n /**\n * Amount of time between the end of speech from VAD and the decision to end the user's turn.\n * Set to 0.0 if the end of speech was not detected.\n */\n endOfUtteranceDelay: number;\n /**\n * Time taken to obtain the transcript after the end of the user's speech.\n * Set to 0.0 if the end of speech was not detected.\n */\n transcriptionDelay: number;\n /**\n * Time taken to invoke the user's `Agent.onUserTurnCompleted` callback.\n */\n onUserTurnCompletedDelay: number;\n speechId?: string;\n};\n\nexport type RealtimeModelMetricsCachedTokenDetails = {\n audioTokens: number;\n textTokens: number;\n imageTokens: number;\n};\n\nexport type RealtimeModelMetricsInputTokenDetails = {\n audioTokens: number;\n textTokens: number;\n imageTokens: number;\n cachedTokens: number;\n cachedTokensDetails?: RealtimeModelMetricsCachedTokenDetails;\n};\n\nexport type RealtimeModelMetricsOutputTokenDetails = {\n textTokens: number;\n audioTokens: number;\n imageTokens: number;\n};\n\nexport type RealtimeModelMetrics = {\n type: 'realtime_model_metrics';\n label: string;\n requestId: string;\n /**\n * The timestamp of the response creation.\n */\n timestamp: number;\n /**\n * The duration of the response from created to done in seconds.\n */\n duration: number;\n /**\n * Time to first audio token in seconds. -1 if no audio token was sent.\n */\n ttft: number;\n /**\n * Whether the request was cancelled.\n */\n cancelled: boolean;\n /**\n * The number of input tokens used in the Response, including text and audio tokens.\n */\n inputTokens: number;\n /**\n * The number of output tokens sent in the Response, including text and audio tokens.\n */\n outputTokens: number;\n /**\n * The total number of tokens in the Response.\n */\n totalTokens: number;\n /**\n * The number of tokens per second.\n */\n tokensPerSecond: number;\n /**\n * Details about the input tokens used in the Response.\n */\n inputTokenDetails: RealtimeModelMetricsInputTokenDetails;\n /**\n * Details about the output tokens used in the Response.\n */\n outputTokenDetails: RealtimeModelMetricsOutputTokenDetails;\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}