@livekit/agents 1.1.0 → 1.2.1

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 (959) hide show
  1. package/dist/_exceptions.cjs.map +1 -1
  2. package/dist/_exceptions.d.ts.map +1 -1
  3. package/dist/_exceptions.js.map +1 -1
  4. package/dist/audio.cjs +89 -3
  5. package/dist/audio.cjs.map +1 -1
  6. package/dist/audio.d.cts +36 -1
  7. package/dist/audio.d.ts +36 -1
  8. package/dist/audio.d.ts.map +1 -1
  9. package/dist/audio.js +76 -2
  10. package/dist/audio.js.map +1 -1
  11. package/dist/beta/index.cjs +29 -0
  12. package/dist/beta/index.cjs.map +1 -0
  13. package/dist/beta/index.d.cts +2 -0
  14. package/dist/beta/index.d.ts +2 -0
  15. package/dist/beta/index.d.ts.map +1 -0
  16. package/dist/beta/index.js +7 -0
  17. package/dist/beta/index.js.map +1 -0
  18. package/dist/beta/workflows/index.cjs +29 -0
  19. package/dist/beta/workflows/index.cjs.map +1 -0
  20. package/dist/beta/workflows/index.d.cts +2 -0
  21. package/dist/beta/workflows/index.d.ts +2 -0
  22. package/dist/beta/workflows/index.d.ts.map +1 -0
  23. package/dist/beta/workflows/index.js +7 -0
  24. package/dist/beta/workflows/index.js.map +1 -0
  25. package/dist/beta/workflows/task_group.cjs +165 -0
  26. package/dist/beta/workflows/task_group.cjs.map +1 -0
  27. package/dist/beta/workflows/task_group.d.cts +32 -0
  28. package/dist/beta/workflows/task_group.d.ts +32 -0
  29. package/dist/beta/workflows/task_group.d.ts.map +1 -0
  30. package/dist/beta/workflows/task_group.js +141 -0
  31. package/dist/beta/workflows/task_group.js.map +1 -0
  32. package/dist/cli.cjs +44 -46
  33. package/dist/cli.cjs.map +1 -1
  34. package/dist/cli.d.cts +3 -3
  35. package/dist/cli.d.ts +3 -3
  36. package/dist/cli.d.ts.map +1 -1
  37. package/dist/cli.js +45 -47
  38. package/dist/cli.js.map +1 -1
  39. package/dist/connection_pool.cjs +242 -0
  40. package/dist/connection_pool.cjs.map +1 -0
  41. package/dist/connection_pool.d.cts +123 -0
  42. package/dist/connection_pool.d.ts +123 -0
  43. package/dist/connection_pool.d.ts.map +1 -0
  44. package/dist/connection_pool.js +218 -0
  45. package/dist/connection_pool.js.map +1 -0
  46. package/dist/connection_pool.test.cjs +256 -0
  47. package/dist/connection_pool.test.cjs.map +1 -0
  48. package/dist/connection_pool.test.js +255 -0
  49. package/dist/connection_pool.test.js.map +1 -0
  50. package/dist/constants.cjs +30 -0
  51. package/dist/constants.cjs.map +1 -1
  52. package/dist/constants.d.cts +10 -0
  53. package/dist/constants.d.ts +10 -0
  54. package/dist/constants.d.ts.map +1 -1
  55. package/dist/constants.js +20 -0
  56. package/dist/constants.js.map +1 -1
  57. package/dist/cpu.cjs +189 -0
  58. package/dist/cpu.cjs.map +1 -0
  59. package/dist/cpu.d.cts +24 -0
  60. package/dist/cpu.d.ts +24 -0
  61. package/dist/cpu.d.ts.map +1 -0
  62. package/dist/cpu.js +152 -0
  63. package/dist/cpu.js.map +1 -0
  64. package/dist/cpu.test.cjs +227 -0
  65. package/dist/cpu.test.cjs.map +1 -0
  66. package/dist/cpu.test.js +204 -0
  67. package/dist/cpu.test.js.map +1 -0
  68. package/dist/http_server.cjs +9 -6
  69. package/dist/http_server.cjs.map +1 -1
  70. package/dist/http_server.d.cts +5 -1
  71. package/dist/http_server.d.ts +5 -1
  72. package/dist/http_server.d.ts.map +1 -1
  73. package/dist/http_server.js +9 -6
  74. package/dist/http_server.js.map +1 -1
  75. package/dist/index.cjs +24 -9
  76. package/dist/index.cjs.map +1 -1
  77. package/dist/index.d.cts +15 -11
  78. package/dist/index.d.ts +15 -11
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +18 -9
  81. package/dist/index.js.map +1 -1
  82. package/dist/inference/api_protos.cjs +70 -2
  83. package/dist/inference/api_protos.cjs.map +1 -1
  84. package/dist/inference/api_protos.d.cts +373 -32
  85. package/dist/inference/api_protos.d.ts +373 -32
  86. package/dist/inference/api_protos.d.ts.map +1 -1
  87. package/dist/inference/api_protos.js +62 -2
  88. package/dist/inference/api_protos.js.map +1 -1
  89. package/dist/inference/index.cjs +8 -0
  90. package/dist/inference/index.cjs.map +1 -1
  91. package/dist/inference/index.d.cts +3 -4
  92. package/dist/inference/index.d.ts +3 -4
  93. package/dist/inference/index.d.ts.map +1 -1
  94. package/dist/inference/index.js +18 -3
  95. package/dist/inference/index.js.map +1 -1
  96. package/dist/inference/interruption/defaults.cjs +81 -0
  97. package/dist/inference/interruption/defaults.cjs.map +1 -0
  98. package/dist/inference/interruption/defaults.d.cts +19 -0
  99. package/dist/inference/interruption/defaults.d.ts +19 -0
  100. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  101. package/dist/inference/interruption/defaults.js +46 -0
  102. package/dist/inference/interruption/defaults.js.map +1 -0
  103. package/dist/inference/interruption/errors.cjs +44 -0
  104. package/dist/inference/interruption/errors.cjs.map +1 -0
  105. package/dist/inference/interruption/errors.d.cts +12 -0
  106. package/dist/inference/interruption/errors.d.ts +12 -0
  107. package/dist/inference/interruption/errors.d.ts.map +1 -0
  108. package/dist/inference/interruption/errors.js +20 -0
  109. package/dist/inference/interruption/errors.js.map +1 -0
  110. package/dist/inference/interruption/http_transport.cjs +163 -0
  111. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  112. package/dist/inference/interruption/http_transport.d.cts +65 -0
  113. package/dist/inference/interruption/http_transport.d.ts +65 -0
  114. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  115. package/dist/inference/interruption/http_transport.js +137 -0
  116. package/dist/inference/interruption/http_transport.js.map +1 -0
  117. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  118. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  119. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  120. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  121. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  122. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  123. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  124. package/dist/inference/interruption/interruption_detector.cjs +198 -0
  125. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  126. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  127. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  128. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  129. package/dist/inference/interruption/interruption_detector.js +164 -0
  130. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  131. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  132. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  133. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  134. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  135. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  136. package/dist/inference/interruption/interruption_stream.js +344 -0
  137. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  138. package/dist/inference/interruption/types.cjs +17 -0
  139. package/dist/inference/interruption/types.cjs.map +1 -0
  140. package/dist/inference/interruption/types.d.cts +66 -0
  141. package/dist/inference/interruption/types.d.ts +66 -0
  142. package/dist/inference/interruption/types.d.ts.map +1 -0
  143. package/dist/inference/interruption/types.js +1 -0
  144. package/dist/inference/interruption/types.js.map +1 -0
  145. package/dist/inference/interruption/utils.cjs +130 -0
  146. package/dist/inference/interruption/utils.cjs.map +1 -0
  147. package/dist/inference/interruption/utils.d.cts +41 -0
  148. package/dist/inference/interruption/utils.d.ts +41 -0
  149. package/dist/inference/interruption/utils.d.ts.map +1 -0
  150. package/dist/inference/interruption/utils.js +105 -0
  151. package/dist/inference/interruption/utils.js.map +1 -0
  152. package/dist/inference/interruption/utils.test.cjs +105 -0
  153. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  154. package/dist/inference/interruption/utils.test.js +104 -0
  155. package/dist/inference/interruption/utils.test.js.map +1 -0
  156. package/dist/inference/interruption/ws_transport.cjs +347 -0
  157. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  158. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  159. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  160. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  161. package/dist/inference/interruption/ws_transport.js +313 -0
  162. package/dist/inference/interruption/ws_transport.js.map +1 -0
  163. package/dist/inference/llm.cjs +106 -66
  164. package/dist/inference/llm.cjs.map +1 -1
  165. package/dist/inference/llm.d.cts +65 -43
  166. package/dist/inference/llm.d.ts +65 -43
  167. package/dist/inference/llm.d.ts.map +1 -1
  168. package/dist/inference/llm.js +100 -66
  169. package/dist/inference/llm.js.map +1 -1
  170. package/dist/inference/stt.cjs +319 -170
  171. package/dist/inference/stt.cjs.map +1 -1
  172. package/dist/inference/stt.d.cts +64 -15
  173. package/dist/inference/stt.d.ts +64 -15
  174. package/dist/inference/stt.d.ts.map +1 -1
  175. package/dist/inference/stt.js +319 -170
  176. package/dist/inference/stt.js.map +1 -1
  177. package/dist/inference/stt.test.cjs +218 -0
  178. package/dist/inference/stt.test.cjs.map +1 -0
  179. package/dist/inference/stt.test.js +217 -0
  180. package/dist/inference/stt.test.js.map +1 -0
  181. package/dist/inference/tts.cjs +249 -71
  182. package/dist/inference/tts.cjs.map +1 -1
  183. package/dist/inference/tts.d.cts +94 -17
  184. package/dist/inference/tts.d.ts +94 -17
  185. package/dist/inference/tts.d.ts.map +1 -1
  186. package/dist/inference/tts.js +249 -77
  187. package/dist/inference/tts.js.map +1 -1
  188. package/dist/inference/tts.test.cjs +305 -0
  189. package/dist/inference/tts.test.cjs.map +1 -0
  190. package/dist/inference/tts.test.js +304 -0
  191. package/dist/inference/tts.test.js.map +1 -0
  192. package/dist/inference/utils.cjs +26 -7
  193. package/dist/inference/utils.cjs.map +1 -1
  194. package/dist/inference/utils.d.cts +14 -1
  195. package/dist/inference/utils.d.ts +14 -1
  196. package/dist/inference/utils.d.ts.map +1 -1
  197. package/dist/inference/utils.js +18 -2
  198. package/dist/inference/utils.js.map +1 -1
  199. package/dist/ipc/inference_proc_executor.cjs +6 -3
  200. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  201. package/dist/ipc/inference_proc_executor.d.ts.map +1 -1
  202. package/dist/ipc/inference_proc_executor.js +6 -3
  203. package/dist/ipc/inference_proc_executor.js.map +1 -1
  204. package/dist/ipc/inference_proc_lazy_main.cjs +13 -1
  205. package/dist/ipc/inference_proc_lazy_main.cjs.map +1 -1
  206. package/dist/ipc/inference_proc_lazy_main.js +13 -1
  207. package/dist/ipc/inference_proc_lazy_main.js.map +1 -1
  208. package/dist/ipc/job_proc_executor.cjs +6 -1
  209. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  210. package/dist/ipc/job_proc_executor.d.ts.map +1 -1
  211. package/dist/ipc/job_proc_executor.js +6 -1
  212. package/dist/ipc/job_proc_executor.js.map +1 -1
  213. package/dist/ipc/job_proc_lazy_main.cjs +89 -17
  214. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  215. package/dist/ipc/job_proc_lazy_main.js +68 -18
  216. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  217. package/dist/ipc/supervised_proc.cjs +34 -8
  218. package/dist/ipc/supervised_proc.cjs.map +1 -1
  219. package/dist/ipc/supervised_proc.d.cts +8 -0
  220. package/dist/ipc/supervised_proc.d.ts +8 -0
  221. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  222. package/dist/ipc/supervised_proc.js +34 -8
  223. package/dist/ipc/supervised_proc.js.map +1 -1
  224. package/dist/ipc/supervised_proc.test.cjs +145 -0
  225. package/dist/ipc/supervised_proc.test.cjs.map +1 -0
  226. package/dist/ipc/supervised_proc.test.js +122 -0
  227. package/dist/ipc/supervised_proc.test.js.map +1 -0
  228. package/dist/job.cjs +109 -1
  229. package/dist/job.cjs.map +1 -1
  230. package/dist/job.d.cts +14 -0
  231. package/dist/job.d.ts +14 -0
  232. package/dist/job.d.ts.map +1 -1
  233. package/dist/job.js +99 -1
  234. package/dist/job.js.map +1 -1
  235. package/dist/language.cjs +394 -0
  236. package/dist/language.cjs.map +1 -0
  237. package/dist/language.d.cts +15 -0
  238. package/dist/language.d.ts +15 -0
  239. package/dist/language.d.ts.map +1 -0
  240. package/dist/language.js +363 -0
  241. package/dist/language.js.map +1 -0
  242. package/dist/language.test.cjs +43 -0
  243. package/dist/language.test.cjs.map +1 -0
  244. package/dist/language.test.js +49 -0
  245. package/dist/language.test.js.map +1 -0
  246. package/dist/llm/chat_context.cjs +345 -3
  247. package/dist/llm/chat_context.cjs.map +1 -1
  248. package/dist/llm/chat_context.d.cts +86 -2
  249. package/dist/llm/chat_context.d.ts +86 -2
  250. package/dist/llm/chat_context.d.ts.map +1 -1
  251. package/dist/llm/chat_context.js +344 -3
  252. package/dist/llm/chat_context.js.map +1 -1
  253. package/dist/llm/chat_context.test.cjs +692 -0
  254. package/dist/llm/chat_context.test.cjs.map +1 -1
  255. package/dist/llm/chat_context.test.js +692 -0
  256. package/dist/llm/chat_context.test.js.map +1 -1
  257. package/dist/llm/fallback_adapter.cjs +280 -0
  258. package/dist/llm/fallback_adapter.cjs.map +1 -0
  259. package/dist/llm/fallback_adapter.d.cts +73 -0
  260. package/dist/llm/fallback_adapter.d.ts +73 -0
  261. package/dist/llm/fallback_adapter.d.ts.map +1 -0
  262. package/dist/llm/fallback_adapter.js +256 -0
  263. package/dist/llm/fallback_adapter.js.map +1 -0
  264. package/dist/llm/fallback_adapter.test.cjs +176 -0
  265. package/dist/llm/fallback_adapter.test.cjs.map +1 -0
  266. package/dist/llm/fallback_adapter.test.js +175 -0
  267. package/dist/llm/fallback_adapter.test.js.map +1 -0
  268. package/dist/llm/index.cjs +11 -0
  269. package/dist/llm/index.cjs.map +1 -1
  270. package/dist/llm/index.d.cts +4 -3
  271. package/dist/llm/index.d.ts +4 -3
  272. package/dist/llm/index.d.ts.map +1 -1
  273. package/dist/llm/index.js +13 -1
  274. package/dist/llm/index.js.map +1 -1
  275. package/dist/llm/llm.cjs +65 -11
  276. package/dist/llm/llm.cjs.map +1 -1
  277. package/dist/llm/llm.d.cts +13 -2
  278. package/dist/llm/llm.d.ts +13 -2
  279. package/dist/llm/llm.d.ts.map +1 -1
  280. package/dist/llm/llm.js +65 -11
  281. package/dist/llm/llm.js.map +1 -1
  282. package/dist/llm/provider_format/google.cjs +6 -2
  283. package/dist/llm/provider_format/google.cjs.map +1 -1
  284. package/dist/llm/provider_format/google.d.cts +1 -1
  285. package/dist/llm/provider_format/google.d.ts +1 -1
  286. package/dist/llm/provider_format/google.d.ts.map +1 -1
  287. package/dist/llm/provider_format/google.js +6 -2
  288. package/dist/llm/provider_format/google.js.map +1 -1
  289. package/dist/llm/provider_format/google.test.cjs +48 -0
  290. package/dist/llm/provider_format/google.test.cjs.map +1 -1
  291. package/dist/llm/provider_format/google.test.js +54 -1
  292. package/dist/llm/provider_format/google.test.js.map +1 -1
  293. package/dist/llm/provider_format/index.cjs +2 -0
  294. package/dist/llm/provider_format/index.cjs.map +1 -1
  295. package/dist/llm/provider_format/index.d.cts +2 -2
  296. package/dist/llm/provider_format/index.d.ts +2 -2
  297. package/dist/llm/provider_format/index.d.ts.map +1 -1
  298. package/dist/llm/provider_format/index.js +6 -1
  299. package/dist/llm/provider_format/index.js.map +1 -1
  300. package/dist/llm/provider_format/openai.cjs +126 -24
  301. package/dist/llm/provider_format/openai.cjs.map +1 -1
  302. package/dist/llm/provider_format/openai.d.cts +1 -0
  303. package/dist/llm/provider_format/openai.d.ts +1 -0
  304. package/dist/llm/provider_format/openai.d.ts.map +1 -1
  305. package/dist/llm/provider_format/openai.js +124 -23
  306. package/dist/llm/provider_format/openai.js.map +1 -1
  307. package/dist/llm/provider_format/openai.test.cjs +393 -0
  308. package/dist/llm/provider_format/openai.test.cjs.map +1 -1
  309. package/dist/llm/provider_format/openai.test.js +400 -2
  310. package/dist/llm/provider_format/openai.test.js.map +1 -1
  311. package/dist/llm/provider_format/utils.cjs +5 -4
  312. package/dist/llm/provider_format/utils.cjs.map +1 -1
  313. package/dist/llm/provider_format/utils.d.ts.map +1 -1
  314. package/dist/llm/provider_format/utils.js +5 -4
  315. package/dist/llm/provider_format/utils.js.map +1 -1
  316. package/dist/llm/realtime.cjs +3 -0
  317. package/dist/llm/realtime.cjs.map +1 -1
  318. package/dist/llm/realtime.d.cts +15 -1
  319. package/dist/llm/realtime.d.ts +15 -1
  320. package/dist/llm/realtime.d.ts.map +1 -1
  321. package/dist/llm/realtime.js +3 -0
  322. package/dist/llm/realtime.js.map +1 -1
  323. package/dist/llm/remote_chat_context.cjs.map +1 -1
  324. package/dist/llm/remote_chat_context.d.cts +2 -0
  325. package/dist/llm/remote_chat_context.d.ts +2 -0
  326. package/dist/llm/remote_chat_context.d.ts.map +1 -1
  327. package/dist/llm/remote_chat_context.js.map +1 -1
  328. package/dist/llm/tool_context.cjs +50 -2
  329. package/dist/llm/tool_context.cjs.map +1 -1
  330. package/dist/llm/tool_context.d.cts +47 -11
  331. package/dist/llm/tool_context.d.ts +47 -11
  332. package/dist/llm/tool_context.d.ts.map +1 -1
  333. package/dist/llm/tool_context.js +48 -3
  334. package/dist/llm/tool_context.js.map +1 -1
  335. package/dist/llm/tool_context.test.cjs +197 -0
  336. package/dist/llm/tool_context.test.cjs.map +1 -1
  337. package/dist/llm/tool_context.test.js +175 -0
  338. package/dist/llm/tool_context.test.js.map +1 -1
  339. package/dist/llm/utils.cjs +107 -12
  340. package/dist/llm/utils.cjs.map +1 -1
  341. package/dist/llm/utils.d.cts +10 -3
  342. package/dist/llm/utils.d.ts +10 -3
  343. package/dist/llm/utils.d.ts.map +1 -1
  344. package/dist/llm/utils.js +106 -12
  345. package/dist/llm/utils.js.map +1 -1
  346. package/dist/llm/utils.test.cjs +90 -0
  347. package/dist/llm/utils.test.cjs.map +1 -1
  348. package/dist/llm/utils.test.js +98 -2
  349. package/dist/llm/utils.test.js.map +1 -1
  350. package/dist/llm/zod-utils.cjs +102 -0
  351. package/dist/llm/zod-utils.cjs.map +1 -0
  352. package/dist/llm/zod-utils.d.cts +65 -0
  353. package/dist/llm/zod-utils.d.ts +65 -0
  354. package/dist/llm/zod-utils.d.ts.map +1 -0
  355. package/dist/llm/zod-utils.js +64 -0
  356. package/dist/llm/zod-utils.js.map +1 -0
  357. package/dist/llm/zod-utils.test.cjs +472 -0
  358. package/dist/llm/zod-utils.test.cjs.map +1 -0
  359. package/dist/llm/zod-utils.test.js +455 -0
  360. package/dist/llm/zod-utils.test.js.map +1 -0
  361. package/dist/log.cjs +45 -14
  362. package/dist/log.cjs.map +1 -1
  363. package/dist/log.d.cts +8 -1
  364. package/dist/log.d.ts +8 -1
  365. package/dist/log.d.ts.map +1 -1
  366. package/dist/log.js +45 -15
  367. package/dist/log.js.map +1 -1
  368. package/dist/metrics/base.cjs.map +1 -1
  369. package/dist/metrics/base.d.cts +75 -19
  370. package/dist/metrics/base.d.ts +75 -19
  371. package/dist/metrics/base.d.ts.map +1 -1
  372. package/dist/metrics/index.cjs +5 -0
  373. package/dist/metrics/index.cjs.map +1 -1
  374. package/dist/metrics/index.d.cts +2 -1
  375. package/dist/metrics/index.d.ts +2 -1
  376. package/dist/metrics/index.d.ts.map +1 -1
  377. package/dist/metrics/index.js +6 -0
  378. package/dist/metrics/index.js.map +1 -1
  379. package/dist/metrics/model_usage.cjs +189 -0
  380. package/dist/metrics/model_usage.cjs.map +1 -0
  381. package/dist/metrics/model_usage.d.cts +92 -0
  382. package/dist/metrics/model_usage.d.ts +92 -0
  383. package/dist/metrics/model_usage.d.ts.map +1 -0
  384. package/dist/metrics/model_usage.js +164 -0
  385. package/dist/metrics/model_usage.js.map +1 -0
  386. package/dist/metrics/model_usage.test.cjs +474 -0
  387. package/dist/metrics/model_usage.test.cjs.map +1 -0
  388. package/dist/metrics/model_usage.test.js +476 -0
  389. package/dist/metrics/model_usage.test.js.map +1 -0
  390. package/dist/metrics/usage_collector.cjs +5 -2
  391. package/dist/metrics/usage_collector.cjs.map +1 -1
  392. package/dist/metrics/usage_collector.d.cts +10 -1
  393. package/dist/metrics/usage_collector.d.ts +10 -1
  394. package/dist/metrics/usage_collector.d.ts.map +1 -1
  395. package/dist/metrics/usage_collector.js +5 -2
  396. package/dist/metrics/usage_collector.js.map +1 -1
  397. package/dist/metrics/utils.cjs +23 -7
  398. package/dist/metrics/utils.cjs.map +1 -1
  399. package/dist/metrics/utils.d.ts.map +1 -1
  400. package/dist/metrics/utils.js +23 -7
  401. package/dist/metrics/utils.js.map +1 -1
  402. package/dist/stream/deferred_stream.cjs +31 -10
  403. package/dist/stream/deferred_stream.cjs.map +1 -1
  404. package/dist/stream/deferred_stream.d.cts +6 -1
  405. package/dist/stream/deferred_stream.d.ts +6 -1
  406. package/dist/stream/deferred_stream.d.ts.map +1 -1
  407. package/dist/stream/deferred_stream.js +31 -10
  408. package/dist/stream/deferred_stream.js.map +1 -1
  409. package/dist/stream/deferred_stream.test.cjs +2 -2
  410. package/dist/stream/deferred_stream.test.cjs.map +1 -1
  411. package/dist/stream/deferred_stream.test.js +2 -2
  412. package/dist/stream/deferred_stream.test.js.map +1 -1
  413. package/dist/stream/index.cjs +3 -0
  414. package/dist/stream/index.cjs.map +1 -1
  415. package/dist/stream/index.d.cts +1 -0
  416. package/dist/stream/index.d.ts +1 -0
  417. package/dist/stream/index.d.ts.map +1 -1
  418. package/dist/stream/index.js +2 -0
  419. package/dist/stream/index.js.map +1 -1
  420. package/dist/stream/multi_input_stream.cjs +139 -0
  421. package/dist/stream/multi_input_stream.cjs.map +1 -0
  422. package/dist/stream/multi_input_stream.d.cts +55 -0
  423. package/dist/stream/multi_input_stream.d.ts +55 -0
  424. package/dist/stream/multi_input_stream.d.ts.map +1 -0
  425. package/dist/stream/multi_input_stream.js +115 -0
  426. package/dist/stream/multi_input_stream.js.map +1 -0
  427. package/dist/stream/multi_input_stream.test.cjs +344 -0
  428. package/dist/stream/multi_input_stream.test.cjs.map +1 -0
  429. package/dist/stream/multi_input_stream.test.js +343 -0
  430. package/dist/stream/multi_input_stream.test.js.map +1 -0
  431. package/dist/stream/stream_channel.cjs +39 -1
  432. package/dist/stream/stream_channel.cjs.map +1 -1
  433. package/dist/stream/stream_channel.d.cts +5 -2
  434. package/dist/stream/stream_channel.d.ts +5 -2
  435. package/dist/stream/stream_channel.d.ts.map +1 -1
  436. package/dist/stream/stream_channel.js +39 -1
  437. package/dist/stream/stream_channel.js.map +1 -1
  438. package/dist/stream/stream_channel.test.cjs +27 -0
  439. package/dist/stream/stream_channel.test.cjs.map +1 -1
  440. package/dist/stream/stream_channel.test.js +27 -0
  441. package/dist/stream/stream_channel.test.js.map +1 -1
  442. package/dist/stt/stream_adapter.cjs +24 -9
  443. package/dist/stt/stream_adapter.cjs.map +1 -1
  444. package/dist/stt/stream_adapter.d.cts +7 -3
  445. package/dist/stt/stream_adapter.d.ts +7 -3
  446. package/dist/stt/stream_adapter.d.ts.map +1 -1
  447. package/dist/stt/stream_adapter.js +24 -9
  448. package/dist/stt/stream_adapter.js.map +1 -1
  449. package/dist/stt/stt.cjs +94 -19
  450. package/dist/stt/stt.cjs.map +1 -1
  451. package/dist/stt/stt.d.cts +68 -5
  452. package/dist/stt/stt.d.ts +68 -5
  453. package/dist/stt/stt.d.ts.map +1 -1
  454. package/dist/stt/stt.js +96 -21
  455. package/dist/stt/stt.js.map +1 -1
  456. package/dist/telemetry/index.cjs +72 -0
  457. package/dist/telemetry/index.cjs.map +1 -0
  458. package/dist/telemetry/index.d.cts +7 -0
  459. package/dist/telemetry/index.d.ts +7 -0
  460. package/dist/telemetry/index.d.ts.map +1 -0
  461. package/dist/telemetry/index.js +37 -0
  462. package/dist/telemetry/index.js.map +1 -0
  463. package/dist/telemetry/logging.cjs +65 -0
  464. package/dist/telemetry/logging.cjs.map +1 -0
  465. package/dist/telemetry/logging.d.cts +21 -0
  466. package/dist/telemetry/logging.d.ts +21 -0
  467. package/dist/telemetry/logging.d.ts.map +1 -0
  468. package/dist/telemetry/logging.js +40 -0
  469. package/dist/telemetry/logging.js.map +1 -0
  470. package/dist/telemetry/otel_http_exporter.cjs +166 -0
  471. package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
  472. package/dist/telemetry/otel_http_exporter.d.cts +63 -0
  473. package/dist/telemetry/otel_http_exporter.d.ts +63 -0
  474. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
  475. package/dist/telemetry/otel_http_exporter.js +142 -0
  476. package/dist/telemetry/otel_http_exporter.js.map +1 -0
  477. package/dist/telemetry/pino_otel_transport.cjs +217 -0
  478. package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
  479. package/dist/telemetry/pino_otel_transport.d.cts +58 -0
  480. package/dist/telemetry/pino_otel_transport.d.ts +58 -0
  481. package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
  482. package/dist/telemetry/pino_otel_transport.js +189 -0
  483. package/dist/telemetry/pino_otel_transport.js.map +1 -0
  484. package/dist/telemetry/trace_types.cjs +233 -0
  485. package/dist/telemetry/trace_types.cjs.map +1 -0
  486. package/dist/telemetry/trace_types.d.cts +74 -0
  487. package/dist/telemetry/trace_types.d.ts +74 -0
  488. package/dist/telemetry/trace_types.d.ts.map +1 -0
  489. package/dist/telemetry/trace_types.js +141 -0
  490. package/dist/telemetry/trace_types.js.map +1 -0
  491. package/dist/telemetry/traces.cjs +484 -0
  492. package/dist/telemetry/traces.cjs.map +1 -0
  493. package/dist/telemetry/traces.d.cts +116 -0
  494. package/dist/telemetry/traces.d.ts +116 -0
  495. package/dist/telemetry/traces.d.ts.map +1 -0
  496. package/dist/telemetry/traces.js +449 -0
  497. package/dist/telemetry/traces.js.map +1 -0
  498. package/dist/telemetry/utils.cjs +86 -0
  499. package/dist/telemetry/utils.cjs.map +1 -0
  500. package/dist/telemetry/utils.d.cts +5 -0
  501. package/dist/telemetry/utils.d.ts +5 -0
  502. package/dist/telemetry/utils.d.ts.map +1 -0
  503. package/dist/telemetry/utils.js +51 -0
  504. package/dist/telemetry/utils.js.map +1 -0
  505. package/dist/tokenize/basic/sentence.cjs +3 -3
  506. package/dist/tokenize/basic/sentence.cjs.map +1 -1
  507. package/dist/tokenize/basic/sentence.js +3 -3
  508. package/dist/tokenize/basic/sentence.js.map +1 -1
  509. package/dist/tokenize/tokenizer.test.cjs +3 -1
  510. package/dist/tokenize/tokenizer.test.cjs.map +1 -1
  511. package/dist/tokenize/tokenizer.test.js +3 -1
  512. package/dist/tokenize/tokenizer.test.js.map +1 -1
  513. package/dist/transcription.cjs.map +1 -1
  514. package/dist/transcription.d.cts +6 -0
  515. package/dist/transcription.d.ts +6 -0
  516. package/dist/transcription.d.ts.map +1 -1
  517. package/dist/transcription.js.map +1 -1
  518. package/dist/tts/fallback_adapter.cjs +472 -0
  519. package/dist/tts/fallback_adapter.cjs.map +1 -0
  520. package/dist/tts/fallback_adapter.d.cts +110 -0
  521. package/dist/tts/fallback_adapter.d.ts +110 -0
  522. package/dist/tts/fallback_adapter.d.ts.map +1 -0
  523. package/dist/tts/fallback_adapter.js +448 -0
  524. package/dist/tts/fallback_adapter.js.map +1 -0
  525. package/dist/tts/index.cjs +3 -0
  526. package/dist/tts/index.cjs.map +1 -1
  527. package/dist/tts/index.d.cts +1 -0
  528. package/dist/tts/index.d.ts +1 -0
  529. package/dist/tts/index.d.ts.map +1 -1
  530. package/dist/tts/index.js +2 -0
  531. package/dist/tts/index.js.map +1 -1
  532. package/dist/tts/stream_adapter.cjs +25 -8
  533. package/dist/tts/stream_adapter.cjs.map +1 -1
  534. package/dist/tts/stream_adapter.d.cts +6 -3
  535. package/dist/tts/stream_adapter.d.ts +6 -3
  536. package/dist/tts/stream_adapter.d.ts.map +1 -1
  537. package/dist/tts/stream_adapter.js +25 -8
  538. package/dist/tts/stream_adapter.js.map +1 -1
  539. package/dist/tts/tts.cjs +189 -57
  540. package/dist/tts/tts.cjs.map +1 -1
  541. package/dist/tts/tts.d.cts +58 -6
  542. package/dist/tts/tts.d.ts +58 -6
  543. package/dist/tts/tts.d.ts.map +1 -1
  544. package/dist/tts/tts.js +191 -59
  545. package/dist/tts/tts.js.map +1 -1
  546. package/dist/typed_promise.cjs +48 -0
  547. package/dist/typed_promise.cjs.map +1 -0
  548. package/dist/typed_promise.d.cts +24 -0
  549. package/dist/typed_promise.d.ts +24 -0
  550. package/dist/typed_promise.d.ts.map +1 -0
  551. package/dist/typed_promise.js +28 -0
  552. package/dist/typed_promise.js.map +1 -0
  553. package/dist/types.cjs +24 -32
  554. package/dist/types.cjs.map +1 -1
  555. package/dist/types.d.cts +45 -10
  556. package/dist/types.d.ts +45 -10
  557. package/dist/types.d.ts.map +1 -1
  558. package/dist/types.js +20 -30
  559. package/dist/types.js.map +1 -1
  560. package/dist/utils.cjs +124 -28
  561. package/dist/utils.cjs.map +1 -1
  562. package/dist/utils.d.cts +41 -1
  563. package/dist/utils.d.ts +41 -1
  564. package/dist/utils.d.ts.map +1 -1
  565. package/dist/utils.js +119 -27
  566. package/dist/utils.js.map +1 -1
  567. package/dist/utils.test.cjs +73 -1
  568. package/dist/utils.test.cjs.map +1 -1
  569. package/dist/utils.test.js +74 -10
  570. package/dist/utils.test.js.map +1 -1
  571. package/dist/vad.cjs +35 -15
  572. package/dist/vad.cjs.map +1 -1
  573. package/dist/vad.d.cts +15 -5
  574. package/dist/vad.d.ts +15 -5
  575. package/dist/vad.d.ts.map +1 -1
  576. package/dist/vad.js +35 -15
  577. package/dist/vad.js.map +1 -1
  578. package/dist/version.cjs +1 -1
  579. package/dist/version.cjs.map +1 -1
  580. package/dist/version.d.cts +1 -1
  581. package/dist/version.d.ts +1 -1
  582. package/dist/version.d.ts.map +1 -1
  583. package/dist/version.js +1 -1
  584. package/dist/version.js.map +1 -1
  585. package/dist/voice/agent.cjs +258 -35
  586. package/dist/voice/agent.cjs.map +1 -1
  587. package/dist/voice/agent.d.cts +54 -13
  588. package/dist/voice/agent.d.ts +54 -13
  589. package/dist/voice/agent.d.ts.map +1 -1
  590. package/dist/voice/agent.js +254 -34
  591. package/dist/voice/agent.js.map +1 -1
  592. package/dist/voice/agent.test.cjs +314 -0
  593. package/dist/voice/agent.test.cjs.map +1 -1
  594. package/dist/voice/agent.test.js +316 -2
  595. package/dist/voice/agent.test.js.map +1 -1
  596. package/dist/voice/agent_activity.cjs +1116 -385
  597. package/dist/voice/agent_activity.cjs.map +1 -1
  598. package/dist/voice/agent_activity.d.cts +72 -11
  599. package/dist/voice/agent_activity.d.ts +72 -11
  600. package/dist/voice/agent_activity.d.ts.map +1 -1
  601. package/dist/voice/agent_activity.js +1119 -383
  602. package/dist/voice/agent_activity.js.map +1 -1
  603. package/dist/voice/agent_activity.test.cjs +135 -0
  604. package/dist/voice/agent_activity.test.cjs.map +1 -0
  605. package/dist/voice/agent_activity.test.js +134 -0
  606. package/dist/voice/agent_activity.test.js.map +1 -0
  607. package/dist/voice/agent_session.cjs +550 -90
  608. package/dist/voice/agent_session.cjs.map +1 -1
  609. package/dist/voice/agent_session.d.cts +185 -25
  610. package/dist/voice/agent_session.d.ts +185 -25
  611. package/dist/voice/agent_session.d.ts.map +1 -1
  612. package/dist/voice/agent_session.js +556 -91
  613. package/dist/voice/agent_session.js.map +1 -1
  614. package/dist/voice/audio_recognition.cjs +605 -46
  615. package/dist/voice/audio_recognition.cjs.map +1 -1
  616. package/dist/voice/audio_recognition.d.cts +96 -4
  617. package/dist/voice/audio_recognition.d.ts +96 -4
  618. package/dist/voice/audio_recognition.d.ts.map +1 -1
  619. package/dist/voice/audio_recognition.js +611 -47
  620. package/dist/voice/audio_recognition.js.map +1 -1
  621. package/dist/voice/audio_recognition_span.test.cjs +295 -0
  622. package/dist/voice/audio_recognition_span.test.cjs.map +1 -0
  623. package/dist/voice/audio_recognition_span.test.js +299 -0
  624. package/dist/voice/audio_recognition_span.test.js.map +1 -0
  625. package/dist/voice/avatar/datastream_io.cjs +7 -1
  626. package/dist/voice/avatar/datastream_io.cjs.map +1 -1
  627. package/dist/voice/avatar/datastream_io.d.cts +1 -0
  628. package/dist/voice/avatar/datastream_io.d.ts +1 -0
  629. package/dist/voice/avatar/datastream_io.d.ts.map +1 -1
  630. package/dist/voice/avatar/datastream_io.js +7 -1
  631. package/dist/voice/avatar/datastream_io.js.map +1 -1
  632. package/dist/voice/background_audio.cjs +367 -0
  633. package/dist/voice/background_audio.cjs.map +1 -0
  634. package/dist/voice/background_audio.d.cts +123 -0
  635. package/dist/voice/background_audio.d.ts +123 -0
  636. package/dist/voice/background_audio.d.ts.map +1 -0
  637. package/dist/voice/background_audio.js +343 -0
  638. package/dist/voice/background_audio.js.map +1 -0
  639. package/dist/voice/events.cjs +3 -0
  640. package/dist/voice/events.cjs.map +1 -1
  641. package/dist/voice/events.d.cts +16 -9
  642. package/dist/voice/events.d.ts +16 -9
  643. package/dist/voice/events.d.ts.map +1 -1
  644. package/dist/voice/events.js +3 -0
  645. package/dist/voice/events.js.map +1 -1
  646. package/dist/voice/generation.cjs +205 -41
  647. package/dist/voice/generation.cjs.map +1 -1
  648. package/dist/voice/generation.d.cts +21 -5
  649. package/dist/voice/generation.d.ts +21 -5
  650. package/dist/voice/generation.d.ts.map +1 -1
  651. package/dist/voice/generation.js +215 -43
  652. package/dist/voice/generation.js.map +1 -1
  653. package/dist/voice/generation_tools.test.cjs +236 -0
  654. package/dist/voice/generation_tools.test.cjs.map +1 -0
  655. package/dist/voice/generation_tools.test.js +235 -0
  656. package/dist/voice/generation_tools.test.js.map +1 -0
  657. package/dist/voice/index.cjs +33 -2
  658. package/dist/voice/index.cjs.map +1 -1
  659. package/dist/voice/index.d.cts +8 -2
  660. package/dist/voice/index.d.ts +8 -2
  661. package/dist/voice/index.d.ts.map +1 -1
  662. package/dist/voice/index.js +19 -2
  663. package/dist/voice/index.js.map +1 -1
  664. package/dist/voice/interruption_detection.test.cjs +114 -0
  665. package/dist/voice/interruption_detection.test.cjs.map +1 -0
  666. package/dist/voice/interruption_detection.test.js +113 -0
  667. package/dist/voice/interruption_detection.test.js.map +1 -0
  668. package/dist/voice/io.cjs +66 -6
  669. package/dist/voice/io.cjs.map +1 -1
  670. package/dist/voice/io.d.cts +67 -7
  671. package/dist/voice/io.d.ts +67 -7
  672. package/dist/voice/io.d.ts.map +1 -1
  673. package/dist/voice/io.js +62 -5
  674. package/dist/voice/io.js.map +1 -1
  675. package/dist/voice/recorder_io/index.cjs +23 -0
  676. package/dist/voice/recorder_io/index.cjs.map +1 -0
  677. package/dist/voice/recorder_io/index.d.cts +2 -0
  678. package/dist/voice/recorder_io/index.d.ts +2 -0
  679. package/dist/voice/recorder_io/index.d.ts.map +1 -0
  680. package/dist/voice/recorder_io/index.js +2 -0
  681. package/dist/voice/recorder_io/index.js.map +1 -0
  682. package/dist/voice/recorder_io/recorder_io.cjs +607 -0
  683. package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
  684. package/dist/voice/recorder_io/recorder_io.d.cts +106 -0
  685. package/dist/voice/recorder_io/recorder_io.d.ts +106 -0
  686. package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
  687. package/dist/voice/recorder_io/recorder_io.js +573 -0
  688. package/dist/voice/recorder_io/recorder_io.js.map +1 -0
  689. package/dist/voice/remote_session.cjs +922 -0
  690. package/dist/voice/remote_session.cjs.map +1 -0
  691. package/dist/voice/remote_session.d.cts +108 -0
  692. package/dist/voice/remote_session.d.ts +108 -0
  693. package/dist/voice/remote_session.d.ts.map +1 -0
  694. package/dist/voice/remote_session.js +887 -0
  695. package/dist/voice/remote_session.js.map +1 -0
  696. package/dist/voice/report.cjs +88 -0
  697. package/dist/voice/report.cjs.map +1 -0
  698. package/dist/voice/report.d.cts +49 -0
  699. package/dist/voice/report.d.ts +49 -0
  700. package/dist/voice/report.d.ts.map +1 -0
  701. package/dist/voice/report.js +63 -0
  702. package/dist/voice/report.js.map +1 -0
  703. package/dist/voice/report.test.cjs +121 -0
  704. package/dist/voice/report.test.cjs.map +1 -0
  705. package/dist/voice/report.test.js +120 -0
  706. package/dist/voice/report.test.js.map +1 -0
  707. package/dist/voice/room_io/_input.cjs +40 -7
  708. package/dist/voice/room_io/_input.cjs.map +1 -1
  709. package/dist/voice/room_io/_input.d.cts +5 -2
  710. package/dist/voice/room_io/_input.d.ts +5 -2
  711. package/dist/voice/room_io/_input.d.ts.map +1 -1
  712. package/dist/voice/room_io/_input.js +41 -8
  713. package/dist/voice/room_io/_input.js.map +1 -1
  714. package/dist/voice/room_io/_output.cjs +19 -11
  715. package/dist/voice/room_io/_output.cjs.map +1 -1
  716. package/dist/voice/room_io/_output.d.cts +7 -4
  717. package/dist/voice/room_io/_output.d.ts +7 -4
  718. package/dist/voice/room_io/_output.d.ts.map +1 -1
  719. package/dist/voice/room_io/_output.js +20 -12
  720. package/dist/voice/room_io/_output.js.map +1 -1
  721. package/dist/voice/room_io/room_io.cjs +33 -6
  722. package/dist/voice/room_io/room_io.cjs.map +1 -1
  723. package/dist/voice/room_io/room_io.d.cts +29 -9
  724. package/dist/voice/room_io/room_io.d.ts +29 -9
  725. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  726. package/dist/voice/room_io/room_io.js +33 -7
  727. package/dist/voice/room_io/room_io.js.map +1 -1
  728. package/dist/voice/speech_handle.cjs +22 -4
  729. package/dist/voice/speech_handle.cjs.map +1 -1
  730. package/dist/voice/speech_handle.d.cts +17 -2
  731. package/dist/voice/speech_handle.d.ts +17 -2
  732. package/dist/voice/speech_handle.d.ts.map +1 -1
  733. package/dist/voice/speech_handle.js +21 -4
  734. package/dist/voice/speech_handle.js.map +1 -1
  735. package/dist/voice/testing/fake_llm.cjs +127 -0
  736. package/dist/voice/testing/fake_llm.cjs.map +1 -0
  737. package/dist/voice/testing/fake_llm.d.cts +30 -0
  738. package/dist/voice/testing/fake_llm.d.ts +30 -0
  739. package/dist/voice/testing/fake_llm.d.ts.map +1 -0
  740. package/dist/voice/testing/fake_llm.js +103 -0
  741. package/dist/voice/testing/fake_llm.js.map +1 -0
  742. package/dist/voice/testing/index.cjs +57 -0
  743. package/dist/voice/testing/index.cjs.map +1 -0
  744. package/dist/voice/testing/index.d.cts +21 -0
  745. package/dist/voice/testing/index.d.ts +21 -0
  746. package/dist/voice/testing/index.d.ts.map +1 -0
  747. package/dist/voice/testing/index.js +35 -0
  748. package/dist/voice/testing/index.js.map +1 -0
  749. package/dist/voice/testing/run_result.cjs +817 -0
  750. package/dist/voice/testing/run_result.cjs.map +1 -0
  751. package/dist/voice/testing/run_result.d.cts +385 -0
  752. package/dist/voice/testing/run_result.d.ts +385 -0
  753. package/dist/voice/testing/run_result.d.ts.map +1 -0
  754. package/dist/voice/testing/run_result.js +790 -0
  755. package/dist/voice/testing/run_result.js.map +1 -0
  756. package/dist/voice/testing/types.cjs +46 -0
  757. package/dist/voice/testing/types.cjs.map +1 -0
  758. package/dist/voice/testing/types.d.cts +83 -0
  759. package/dist/voice/testing/types.d.ts +83 -0
  760. package/dist/voice/testing/types.d.ts.map +1 -0
  761. package/dist/voice/testing/types.js +19 -0
  762. package/dist/voice/testing/types.js.map +1 -0
  763. package/dist/voice/transcription/synchronizer.cjs +139 -15
  764. package/dist/voice/transcription/synchronizer.cjs.map +1 -1
  765. package/dist/voice/transcription/synchronizer.d.cts +35 -4
  766. package/dist/voice/transcription/synchronizer.d.ts +35 -4
  767. package/dist/voice/transcription/synchronizer.d.ts.map +1 -1
  768. package/dist/voice/transcription/synchronizer.js +143 -16
  769. package/dist/voice/transcription/synchronizer.js.map +1 -1
  770. package/dist/voice/transcription/synchronizer.test.cjs +151 -0
  771. package/dist/voice/transcription/synchronizer.test.cjs.map +1 -0
  772. package/dist/voice/transcription/synchronizer.test.js +150 -0
  773. package/dist/voice/transcription/synchronizer.test.js.map +1 -0
  774. package/dist/voice/turn_config/endpointing.cjs +33 -0
  775. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  776. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  777. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  778. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  779. package/dist/voice/turn_config/endpointing.js +9 -0
  780. package/dist/voice/turn_config/endpointing.js.map +1 -0
  781. package/dist/voice/turn_config/interruption.cjs +37 -0
  782. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  783. package/dist/voice/turn_config/interruption.d.cts +53 -0
  784. package/dist/voice/turn_config/interruption.d.ts +53 -0
  785. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  786. package/dist/voice/turn_config/interruption.js +13 -0
  787. package/dist/voice/turn_config/interruption.js.map +1 -0
  788. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  789. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  790. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  791. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  792. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  793. package/dist/voice/turn_config/turn_handling.js +11 -0
  794. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  795. package/dist/voice/turn_config/utils.cjs +157 -0
  796. package/dist/voice/turn_config/utils.cjs.map +1 -0
  797. package/dist/voice/turn_config/utils.d.cts +37 -0
  798. package/dist/voice/turn_config/utils.d.ts +37 -0
  799. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  800. package/dist/voice/turn_config/utils.js +131 -0
  801. package/dist/voice/turn_config/utils.js.map +1 -0
  802. package/dist/voice/turn_config/utils.test.cjs +128 -0
  803. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  804. package/dist/voice/turn_config/utils.test.js +127 -0
  805. package/dist/voice/turn_config/utils.test.js.map +1 -0
  806. package/dist/voice/utils.cjs +47 -0
  807. package/dist/voice/utils.cjs.map +1 -0
  808. package/dist/voice/utils.d.cts +4 -0
  809. package/dist/voice/utils.d.ts +4 -0
  810. package/dist/voice/utils.d.ts.map +1 -0
  811. package/dist/voice/utils.js +23 -0
  812. package/dist/voice/utils.js.map +1 -0
  813. package/dist/worker.cjs +44 -52
  814. package/dist/worker.cjs.map +1 -1
  815. package/dist/worker.d.cts +18 -8
  816. package/dist/worker.d.ts +18 -8
  817. package/dist/worker.d.ts.map +1 -1
  818. package/dist/worker.js +43 -43
  819. package/dist/worker.js.map +1 -1
  820. package/package.json +35 -13
  821. package/resources/NOTICE +2 -0
  822. package/resources/keyboard-typing.ogg +0 -0
  823. package/resources/keyboard-typing2.ogg +0 -0
  824. package/resources/office-ambience.ogg +0 -0
  825. package/src/_exceptions.ts +5 -0
  826. package/src/audio.ts +132 -1
  827. package/src/beta/index.ts +9 -0
  828. package/src/beta/workflows/index.ts +9 -0
  829. package/src/beta/workflows/task_group.ts +203 -0
  830. package/src/cli.ts +57 -66
  831. package/src/connection_pool.test.ts +346 -0
  832. package/src/connection_pool.ts +307 -0
  833. package/src/constants.ts +14 -0
  834. package/src/cpu.test.ts +239 -0
  835. package/src/cpu.ts +173 -0
  836. package/src/http_server.ts +18 -6
  837. package/src/index.ts +15 -13
  838. package/src/inference/api_protos.ts +85 -2
  839. package/src/inference/index.ts +32 -4
  840. package/src/inference/interruption/defaults.ts +51 -0
  841. package/src/inference/interruption/errors.ts +25 -0
  842. package/src/inference/interruption/http_transport.ts +207 -0
  843. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  844. package/src/inference/interruption/interruption_detector.ts +204 -0
  845. package/src/inference/interruption/interruption_stream.ts +467 -0
  846. package/src/inference/interruption/types.ts +84 -0
  847. package/src/inference/interruption/utils.test.ts +132 -0
  848. package/src/inference/interruption/utils.ts +137 -0
  849. package/src/inference/interruption/ws_transport.ts +416 -0
  850. package/src/inference/llm.ts +214 -163
  851. package/src/inference/stt.test.ts +253 -0
  852. package/src/inference/stt.ts +449 -208
  853. package/src/inference/tts.test.ts +354 -0
  854. package/src/inference/tts.ts +417 -115
  855. package/src/inference/utils.ts +30 -2
  856. package/src/ipc/inference_proc_executor.ts +11 -3
  857. package/src/ipc/inference_proc_lazy_main.ts +13 -1
  858. package/src/ipc/job_proc_executor.ts +11 -1
  859. package/src/ipc/job_proc_lazy_main.ts +86 -20
  860. package/src/ipc/supervised_proc.test.ts +153 -0
  861. package/src/ipc/supervised_proc.ts +39 -10
  862. package/src/job.ts +120 -1
  863. package/src/language.test.ts +62 -0
  864. package/src/language.ts +380 -0
  865. package/src/llm/__snapshots__/zod-utils.test.ts.snap +559 -0
  866. package/src/llm/chat_context.test.ts +787 -0
  867. package/src/llm/chat_context.ts +493 -2
  868. package/src/llm/fallback_adapter.test.ts +238 -0
  869. package/src/llm/fallback_adapter.ts +394 -0
  870. package/src/llm/index.ts +13 -0
  871. package/src/llm/llm.ts +77 -12
  872. package/src/llm/provider_format/google.test.ts +72 -1
  873. package/src/llm/provider_format/google.ts +10 -6
  874. package/src/llm/provider_format/index.ts +7 -2
  875. package/src/llm/provider_format/openai.test.ts +480 -2
  876. package/src/llm/provider_format/openai.ts +152 -21
  877. package/src/llm/provider_format/utils.ts +11 -5
  878. package/src/llm/realtime.ts +23 -2
  879. package/src/llm/remote_chat_context.ts +2 -2
  880. package/src/llm/tool_context.test.ts +210 -1
  881. package/src/llm/tool_context.ts +115 -17
  882. package/src/llm/utils.test.ts +103 -2
  883. package/src/llm/utils.ts +152 -16
  884. package/src/llm/zod-utils.test.ts +577 -0
  885. package/src/llm/zod-utils.ts +153 -0
  886. package/src/log.ts +71 -19
  887. package/src/metrics/base.ts +78 -19
  888. package/src/metrics/index.ts +12 -0
  889. package/src/metrics/model_usage.test.ts +545 -0
  890. package/src/metrics/model_usage.ts +262 -0
  891. package/src/metrics/usage_collector.ts +14 -3
  892. package/src/metrics/utils.ts +27 -7
  893. package/src/stream/deferred_stream.test.ts +3 -3
  894. package/src/stream/deferred_stream.ts +43 -11
  895. package/src/stream/index.ts +1 -0
  896. package/src/stream/multi_input_stream.test.ts +545 -0
  897. package/src/stream/multi_input_stream.ts +172 -0
  898. package/src/stream/stream_channel.test.ts +37 -0
  899. package/src/stream/stream_channel.ts +43 -3
  900. package/src/stt/stream_adapter.ts +30 -9
  901. package/src/stt/stt.ts +140 -23
  902. package/src/telemetry/index.ts +28 -0
  903. package/src/telemetry/logging.ts +55 -0
  904. package/src/telemetry/otel_http_exporter.ts +218 -0
  905. package/src/telemetry/pino_otel_transport.ts +265 -0
  906. package/src/telemetry/trace_types.ts +109 -0
  907. package/src/telemetry/traces.ts +673 -0
  908. package/src/telemetry/utils.ts +61 -0
  909. package/src/tokenize/basic/sentence.ts +3 -3
  910. package/src/tokenize/tokenizer.test.ts +4 -0
  911. package/src/transcription.ts +6 -0
  912. package/src/tts/fallback_adapter.ts +586 -0
  913. package/src/tts/index.ts +1 -0
  914. package/src/tts/stream_adapter.ts +38 -8
  915. package/src/tts/tts.ts +245 -62
  916. package/src/typed_promise.ts +67 -0
  917. package/src/types.ts +62 -33
  918. package/src/utils.test.ts +90 -10
  919. package/src/utils.ts +178 -33
  920. package/src/vad.ts +42 -18
  921. package/src/version.ts +1 -1
  922. package/src/voice/agent.test.ts +347 -2
  923. package/src/voice/agent.ts +346 -44
  924. package/src/voice/agent_activity.test.ts +194 -0
  925. package/src/voice/agent_activity.ts +1457 -388
  926. package/src/voice/agent_session.ts +817 -112
  927. package/src/voice/audio_recognition.ts +845 -70
  928. package/src/voice/audio_recognition_span.test.ts +341 -0
  929. package/src/voice/avatar/datastream_io.ts +9 -1
  930. package/src/voice/background_audio.ts +494 -0
  931. package/src/voice/events.ts +27 -7
  932. package/src/voice/generation.ts +310 -56
  933. package/src/voice/generation_tools.test.ts +268 -0
  934. package/src/voice/index.ts +17 -3
  935. package/src/voice/interruption_detection.test.ts +151 -0
  936. package/src/voice/io.ts +115 -12
  937. package/src/voice/recorder_io/index.ts +4 -0
  938. package/src/voice/recorder_io/recorder_io.ts +783 -0
  939. package/src/voice/remote_session.ts +1083 -0
  940. package/src/voice/report.test.ts +136 -0
  941. package/src/voice/report.ts +140 -0
  942. package/src/voice/room_io/_input.ts +45 -10
  943. package/src/voice/room_io/_output.ts +26 -14
  944. package/src/voice/room_io/room_io.ts +67 -22
  945. package/src/voice/speech_handle.ts +38 -6
  946. package/src/voice/testing/fake_llm.ts +138 -0
  947. package/src/voice/testing/index.ts +52 -0
  948. package/src/voice/testing/run_result.ts +995 -0
  949. package/src/voice/testing/types.ts +118 -0
  950. package/src/voice/transcription/synchronizer.test.ts +206 -0
  951. package/src/voice/transcription/synchronizer.ts +204 -19
  952. package/src/voice/turn_config/endpointing.ts +33 -0
  953. package/src/voice/turn_config/interruption.ts +56 -0
  954. package/src/voice/turn_config/turn_handling.ts +45 -0
  955. package/src/voice/turn_config/utils.test.ts +148 -0
  956. package/src/voice/turn_config/utils.ts +167 -0
  957. package/src/voice/utils.ts +29 -0
  958. package/src/worker.ts +92 -78
  959. package/src/llm/__snapshots__/utils.test.ts.snap +0 -65
@@ -1,5 +1,4 @@
1
1
  import type { JSONSchema7 } from 'json-schema';
2
- import { ZodObject } from 'zod';
3
2
  import type { ChatContext } from './chat_context.js';
4
3
  import { FunctionCall, FunctionCallOutput, type ImageContent } from './chat_context.js';
5
4
  import type { ToolContext, ToolInputSchema, ToolOptions } from './tool_context.js';
@@ -21,10 +20,18 @@ export type OpenAIFunctionParameters = {
21
20
  };
22
21
  export declare const createToolOptions: <UserData extends unknown>(toolCallId: string, userData?: UserData) => ToolOptions<UserData>;
23
22
  /** @internal */
24
- export declare const oaiParams: (p: ZodObject<any>, isOpenai?: boolean) => OpenAIFunctionParameters;
23
+ export declare const oaiParams: (schema: any, isOpenai?: boolean) => OpenAIFunctionParameters;
25
24
  /** @internal */
26
25
  export declare const oaiBuildFunctionInfo: (toolCtx: ToolContext, toolCallId: string, toolName: string, rawArgs: string) => FunctionCall;
27
26
  export declare function executeToolCall(toolCall: FunctionCall, toolCtx: ToolContext): Promise<FunctionCallOutput>;
27
+ export interface FormatChatHistoryOptions {
28
+ includeIds?: boolean;
29
+ includeTimestamps?: boolean;
30
+ }
31
+ /**
32
+ * Render a chat context into a readable multiline string for debugging and logging.
33
+ */
34
+ export declare function formatChatHistory(chatCtx: ChatContext, options?: FormatChatHistoryOptions): string;
28
35
  interface DiffOps {
29
36
  toRemove: string[];
30
37
  toCreate: Array<[string | null, string]>;
@@ -37,6 +44,6 @@ interface DiffOps {
37
44
  * @returns The minimal list of create/remove operations to transform oldCtx into newCtx.
38
45
  */
39
46
  export declare function computeChatCtxDiff(oldCtx: ChatContext, newCtx: ChatContext): DiffOps;
40
- export declare function toJsonSchema(schema: ToolInputSchema<any>, isOpenai?: boolean): JSONSchema7;
47
+ export declare function toJsonSchema(schema: ToolInputSchema<any>, isOpenai?: boolean, strict?: boolean): JSONSchema7;
41
48
  export {};
42
49
  //# sourceMappingURL=utils.d.ts.map
@@ -1,5 +1,4 @@
1
1
  import type { JSONSchema7 } from 'json-schema';
2
- import { ZodObject } from 'zod';
3
2
  import type { ChatContext } from './chat_context.js';
4
3
  import { FunctionCall, FunctionCallOutput, type ImageContent } from './chat_context.js';
5
4
  import type { ToolContext, ToolInputSchema, ToolOptions } from './tool_context.js';
@@ -21,10 +20,18 @@ export type OpenAIFunctionParameters = {
21
20
  };
22
21
  export declare const createToolOptions: <UserData extends unknown>(toolCallId: string, userData?: UserData) => ToolOptions<UserData>;
23
22
  /** @internal */
24
- export declare const oaiParams: (p: ZodObject<any>, isOpenai?: boolean) => OpenAIFunctionParameters;
23
+ export declare const oaiParams: (schema: any, isOpenai?: boolean) => OpenAIFunctionParameters;
25
24
  /** @internal */
26
25
  export declare const oaiBuildFunctionInfo: (toolCtx: ToolContext, toolCallId: string, toolName: string, rawArgs: string) => FunctionCall;
27
26
  export declare function executeToolCall(toolCall: FunctionCall, toolCtx: ToolContext): Promise<FunctionCallOutput>;
27
+ export interface FormatChatHistoryOptions {
28
+ includeIds?: boolean;
29
+ includeTimestamps?: boolean;
30
+ }
31
+ /**
32
+ * Render a chat context into a readable multiline string for debugging and logging.
33
+ */
34
+ export declare function formatChatHistory(chatCtx: ChatContext, options?: FormatChatHistoryOptions): string;
28
35
  interface DiffOps {
29
36
  toRemove: string[];
30
37
  toCreate: Array<[string | null, string]>;
@@ -37,6 +44,6 @@ interface DiffOps {
37
44
  * @returns The minimal list of create/remove operations to transform oldCtx into newCtx.
38
45
  */
39
46
  export declare function computeChatCtxDiff(oldCtx: ChatContext, newCtx: ChatContext): DiffOps;
40
- export declare function toJsonSchema(schema: ToolInputSchema<any>, isOpenai?: boolean): JSONSchema7;
47
+ export declare function toJsonSchema(schema: ToolInputSchema<any>, isOpenai?: boolean, strict?: boolean): JSONSchema7;
41
48
  export {};
42
49
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/llm/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAGhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAEL,YAAY,EACZ,kBAAkB,EAClB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnF,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAwCD,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAsElF;AAED,+CAA+C;AAC/C,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE;QAAE,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAGF,eAAO,MAAM,iBAAiB,yCAChB,MAAM,aACR,QAAQ,KACjB,YAAY,QAAQ,CAEtB,CAAC;AAEF,gBAAgB;AAEhB,eAAO,MAAM,SAAS,MACjB,UAAU,GAAG,CAAC,aACP,OAAO,KAChB,wBAaF,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,oBAAoB,YACtB,WAAW,cACR,MAAM,YACR,MAAM,WACP,MAAM,KACd,YAWF,CAAC;AAEF,wBAAsB,eAAe,CACnC,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,CA6C7B;AA+CD,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAuBpF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,QAAQ,GAAE,OAAc,GAAG,WAAW,CAKhG"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/llm/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAGL,YAAY,EACZ,kBAAkB,EAClB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGnF,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAwCD,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAsElF;AAED,+CAA+C;AAC/C,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE;QAAE,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAGF,eAAO,MAAM,iBAAiB,yCAChB,MAAM,aACR,QAAQ,KACjB,YAAY,QAAQ,CAEtB,CAAC;AAEF,gBAAgB;AAEhB,eAAO,MAAM,SAAS,WAAY,GAAG,aAAY,OAAO,KAAU,wBAWjE,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,oBAAoB,YACtB,WAAW,cACR,MAAM,YACR,MAAM,WACP,MAAM,KACd,YAWF,CAAC;AAEF,wBAAsB,eAAe,CACnC,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,CAsD7B;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAkBR;AA+ID,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAuBpF;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAC5B,QAAQ,GAAE,OAAc,EACxB,MAAM,GAAE,OAAe,GACtB,WAAW,CAMb"}
package/dist/llm/utils.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import { VideoBufferType, VideoFrame } from "@livekit/rtc-node";
2
2
  import sharp from "sharp";
3
- import { ZodObject } from "zod";
4
- import { zodToJsonSchema } from "zod-to-json-schema";
5
3
  import {
6
4
  FunctionCall,
7
5
  FunctionCallOutput
8
6
  } from "./chat_context.js";
7
+ import { isZodSchema, parseZodSchema, zodSchemaToJsonSchema } from "./zod-utils.js";
9
8
  function getChannelsFromVideoBufferType(type) {
10
9
  switch (type) {
11
10
  case VideoBufferType.RGBA:
@@ -92,11 +91,9 @@ async function serializeImage(image) {
92
91
  const createToolOptions = (toolCallId, userData = {}) => {
93
92
  return { ctx: { userData }, toolCallId };
94
93
  };
95
- const oaiParams = (p, isOpenai = true) => {
96
- const { properties, required, additionalProperties } = zodToJsonSchema(p, {
97
- // note: openai mode breaks various gemini conversions
98
- target: isOpenai ? "openAi" : "jsonSchema7"
99
- });
94
+ const oaiParams = (schema, isOpenai = true) => {
95
+ const jsonSchema = zodSchemaToJsonSchema(schema, isOpenai);
96
+ const { properties, required, additionalProperties } = jsonSchema;
100
97
  return {
101
98
  type: "object",
102
99
  properties,
@@ -129,8 +126,17 @@ async function executeToolCall(toolCall, toolCtx) {
129
126
  });
130
127
  }
131
128
  try {
132
- if (tool.parameters instanceof ZodObject) {
133
- params = tool.parameters.parse(args);
129
+ if (isZodSchema(tool.parameters)) {
130
+ const result = await parseZodSchema(tool.parameters, args);
131
+ if (result.success) {
132
+ params = result.data;
133
+ } else {
134
+ return FunctionCallOutput.create({
135
+ callId: toolCall.callId,
136
+ output: `Arguments parsing failed: ${result.error}`,
137
+ isError: true
138
+ });
139
+ }
134
140
  } else {
135
141
  params = args;
136
142
  }
@@ -156,6 +162,93 @@ async function executeToolCall(toolCall, toolCtx) {
156
162
  });
157
163
  }
158
164
  }
165
+ function formatChatHistory(chatCtx, options = {}) {
166
+ const { includeIds = false, includeTimestamps = false } = options;
167
+ if (chatCtx.items.length === 0) {
168
+ return "Chat history (0 items)";
169
+ }
170
+ const formattedItems = chatCtx.items.map(
171
+ (item, index) => formatChatHistoryItem(item, index, {
172
+ includeIds,
173
+ includeTimestamps
174
+ })
175
+ );
176
+ return [
177
+ `Chat history (${chatCtx.items.length} items)`,
178
+ ...formattedItems.flatMap((item) => ["", item])
179
+ ].join("\n");
180
+ }
181
+ function formatChatHistoryItem(item, index, options) {
182
+ const headerParts = [`[${index}]`];
183
+ if (item.type === "message") {
184
+ headerParts.push("message", item.role);
185
+ } else if (item.type === "function_call") {
186
+ headerParts.push("function_call", item.name, `call_id=${item.callId}`);
187
+ } else if (item.type === "function_call_output") {
188
+ headerParts.push("function_call_output", item.name || "(unnamed)", `call_id=${item.callId}`);
189
+ if (item.isError) {
190
+ headerParts.push("error=true");
191
+ }
192
+ } else {
193
+ headerParts.push("agent_handoff");
194
+ }
195
+ if (options.includeIds) {
196
+ headerParts.push(`id=${item.id}`);
197
+ }
198
+ if (options.includeTimestamps) {
199
+ headerParts.push(`created_at=${item.createdAt.toFixed(3)}`);
200
+ }
201
+ const body = formatChatHistoryItemBody(item);
202
+ if (!body) {
203
+ return headerParts.join(" ");
204
+ }
205
+ return `${headerParts.join(" ")}
206
+ ${indentBlock(body, " ")}`;
207
+ }
208
+ function formatChatHistoryItemBody(item) {
209
+ if (item.type === "message") {
210
+ const content = item.content.map((part) => formatMessageContentPart(part)).join("\n");
211
+ return content.trim() ? content : "(empty)";
212
+ }
213
+ if (item.type === "function_call") {
214
+ return prettyJsonText(item.args);
215
+ }
216
+ if (item.type === "function_call_output") {
217
+ return prettyJsonText(item.output);
218
+ }
219
+ return `${item.oldAgentId ?? "(none)"} -> ${item.newAgentId}`;
220
+ }
221
+ function formatMessageContentPart(part) {
222
+ if (typeof part === "string") {
223
+ return part;
224
+ }
225
+ if (part.type === "image_content") {
226
+ if (typeof part.image === "string") {
227
+ return `[image url=${truncateText(part.image, 120)}]`;
228
+ }
229
+ return `[image frame=${part.image.width}x${part.image.height}]`;
230
+ }
231
+ if (part.transcript) {
232
+ return `[audio transcript=${JSON.stringify(truncateText(part.transcript, 120))}]`;
233
+ }
234
+ return `[audio frames=${part.frame.length}]`;
235
+ }
236
+ function prettyJsonText(text) {
237
+ try {
238
+ return JSON.stringify(JSON.parse(text), null, 2);
239
+ } catch {
240
+ return text;
241
+ }
242
+ }
243
+ function truncateText(text, maxLength) {
244
+ if (text.length <= maxLength) {
245
+ return text;
246
+ }
247
+ return `${text.slice(0, Math.max(0, maxLength - 3))}...`;
248
+ }
249
+ function indentBlock(text, indent) {
250
+ return text.split("\n").map((line) => `${indent}${line}`).join("\n");
251
+ }
159
252
  function computeLCS(oldIds, newIds) {
160
253
  const n = oldIds.length;
161
254
  const m = newIds.length;
@@ -206,9 +299,9 @@ function computeChatCtxDiff(oldCtx, newCtx) {
206
299
  toCreate
207
300
  };
208
301
  }
209
- function toJsonSchema(schema, isOpenai = true) {
210
- if (schema instanceof ZodObject) {
211
- return oaiParams(schema, isOpenai);
302
+ function toJsonSchema(schema, isOpenai = true, strict = false) {
303
+ if (isZodSchema(schema)) {
304
+ return zodSchemaToJsonSchema(schema, isOpenai, strict);
212
305
  }
213
306
  return schema;
214
307
  }
@@ -216,6 +309,7 @@ export {
216
309
  computeChatCtxDiff,
217
310
  createToolOptions,
218
311
  executeToolCall,
312
+ formatChatHistory,
219
313
  oaiBuildFunctionInfo,
220
314
  oaiParams,
221
315
  serializeImage,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/llm/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { VideoBufferType, VideoFrame } from '@livekit/rtc-node';\nimport type { JSONSchema7 } from 'json-schema';\nimport sharp from 'sharp';\nimport { ZodObject } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport type { UnknownUserData } from '../voice/run_context.js';\nimport type { ChatContext } from './chat_context.js';\nimport {\n type ChatItem,\n FunctionCall,\n FunctionCallOutput,\n type ImageContent,\n} from './chat_context.js';\nimport type { ToolContext, ToolInputSchema, ToolOptions } from './tool_context.js';\n\nexport interface SerializedImage {\n inferenceDetail: 'auto' | 'high' | 'low';\n mimeType?: string;\n base64Data?: string;\n externalUrl?: string;\n}\n\nfunction getChannelsFromVideoBufferType(type: VideoBufferType): 3 | 4 {\n switch (type) {\n case VideoBufferType.RGBA:\n case VideoBufferType.ABGR:\n case VideoBufferType.ARGB:\n case VideoBufferType.BGRA:\n return 4;\n case VideoBufferType.RGB24:\n return 3;\n default:\n // YUV formats (I420, I420A, I422, I444, I010, NV12) need conversion\n throw new Error(`Unsupported VideoBufferType: ${type}. Only RGB/RGBA formats are supported.`);\n }\n}\n\nfunction ensureRGBCompatible(frame: VideoFrame): VideoFrame {\n // If the frame is already in an RGB/RGBA-compatible format, return it directly\n if (\n frame.type === VideoBufferType.RGBA ||\n frame.type === VideoBufferType.BGRA ||\n frame.type === VideoBufferType.ARGB ||\n frame.type === VideoBufferType.ABGR ||\n frame.type === VideoBufferType.RGB24\n ) {\n return frame;\n }\n\n // Otherwise, attempt conversion for other formats (like YUV)\n try {\n return frame.convert(VideoBufferType.RGBA);\n } catch (error) {\n throw new Error(\n `Failed to convert format ${frame.type} to RGB: ${error}. ` +\n `Consider using RGB/RGBA formats or converting on the client side.`,\n );\n }\n}\n\nexport async function serializeImage(image: ImageContent): Promise<SerializedImage> {\n if (typeof image.image === 'string') {\n if (image.image.startsWith('data:')) {\n const [header, base64Data] = image.image.split(',', 2) as [string, string];\n const headerParts = header.split(';');\n const mimeParts = headerParts[0]?.split(':');\n const headerMime = mimeParts?.[1];\n\n if (!headerMime) {\n throw new Error('Invalid data URL format');\n }\n\n let mimeType: string;\n if (image.mimeType && image.mimeType !== headerMime) {\n console.warn(\n `Provided mimeType '${image.mimeType}' does not match data URL mime type '${headerMime}'. Using provided mimeType.`,\n );\n mimeType = image.mimeType;\n } else {\n mimeType = headerMime;\n }\n\n const supportedTypes = new Set(['image/jpeg', 'image/png', 'image/webp', 'image/gif']);\n if (!supportedTypes.has(mimeType)) {\n throw new Error(`Unsupported mimeType ${mimeType}. Must be jpeg, png, webp, or gif`);\n }\n\n return {\n base64Data,\n mimeType: mimeType,\n inferenceDetail: image.inferenceDetail,\n };\n }\n\n // External URL\n return {\n mimeType: image.mimeType,\n inferenceDetail: image.inferenceDetail,\n externalUrl: image.image,\n };\n } else if (image.image instanceof VideoFrame) {\n const frame = ensureRGBCompatible(image.image);\n const channels = getChannelsFromVideoBufferType(frame.type);\n\n // Sharp needs to know the format of raw pixel data\n let encoded = sharp(frame.data, {\n raw: {\n width: frame.width,\n height: frame.height,\n channels,\n },\n });\n\n if (image.inferenceWidth && image.inferenceHeight) {\n encoded = encoded.resize(image.inferenceWidth, image.inferenceHeight);\n }\n\n const base64Data = await encoded\n .png()\n .toBuffer()\n .then((buffer) => buffer.toString('base64'));\n\n return {\n base64Data,\n mimeType: 'image/png',\n inferenceDetail: image.inferenceDetail,\n };\n } else {\n throw new Error('Unsupported image type');\n }\n}\n\n/** Raw OpenAI-adherent function parameters. */\nexport type OpenAIFunctionParameters = {\n type: 'object';\n properties: { [id: string]: any }; // eslint-disable-line @typescript-eslint/no-explicit-any\n required: string[];\n additionalProperties?: boolean;\n};\n\n// TODO(brian): remove this helper once we have the real RunContext user data\nexport const createToolOptions = <UserData extends UnknownUserData>(\n toolCallId: string,\n userData: UserData = {} as UserData,\n): ToolOptions<UserData> => {\n return { ctx: { userData }, toolCallId } as unknown as ToolOptions<UserData>;\n};\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const oaiParams = (\n p: ZodObject<any>,\n isOpenai: boolean = true,\n): OpenAIFunctionParameters => {\n // Adapted from https://github.com/vercel/ai/blob/56eb0ee9/packages/provider-utils/src/zod-schema.ts\n const { properties, required, additionalProperties } = zodToJsonSchema(p, {\n // note: openai mode breaks various gemini conversions\n target: isOpenai ? 'openAi' : 'jsonSchema7',\n }) as OpenAIFunctionParameters;\n\n return {\n type: 'object',\n properties,\n required,\n additionalProperties,\n };\n};\n\n/** @internal */\nexport const oaiBuildFunctionInfo = (\n toolCtx: ToolContext,\n toolCallId: string,\n toolName: string,\n rawArgs: string,\n): FunctionCall => {\n const tool = toolCtx[toolName];\n if (!tool) {\n throw new Error(`AI tool ${toolName} not found`);\n }\n\n return FunctionCall.create({\n callId: toolCallId,\n name: toolName,\n args: rawArgs,\n });\n};\n\nexport async function executeToolCall(\n toolCall: FunctionCall,\n toolCtx: ToolContext,\n): Promise<FunctionCallOutput> {\n const tool = toolCtx[toolCall.name]!;\n let args: object | undefined;\n let params: object | undefined;\n\n // Ensure valid JSON\n try {\n args = JSON.parse(toolCall.args);\n } catch (error) {\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: `Invalid JSON: ${error}`,\n isError: true,\n });\n }\n\n // Ensure valid arguments schema\n try {\n if (tool.parameters instanceof ZodObject) {\n params = tool.parameters.parse(args);\n } else {\n params = args;\n }\n } catch (error) {\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: `Arguments parsing failed: ${error}`,\n isError: true,\n });\n }\n\n try {\n const result = await tool.execute(params, createToolOptions(toolCall.callId));\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: JSON.stringify(result),\n isError: false,\n });\n } catch (error) {\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: `Tool execution failed: ${error}`,\n isError: true,\n });\n }\n}\n\n/**\n * Standard dynamic-programming LCS to get the common subsequence\n * of IDs (in order) that appear in both old_ids and new_ids.\n *\n * @param oldIds - The old list of IDs.\n * @param newIds - The new list of IDs.\n * @returns The longest common subsequence of the two lists of IDs.\n */\nfunction computeLCS(oldIds: string[], newIds: string[]): string[] {\n const n = oldIds.length;\n const m = newIds.length;\n const dp: number[][] = Array(n + 1)\n .fill(null)\n .map(() => Array(m + 1).fill(0));\n\n // Fill DP table\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (oldIds[i - 1] === newIds[j - 1]) {\n dp[i]![j] = dp[i - 1]![j - 1]! + 1;\n } else {\n dp[i]![j] = Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!);\n }\n }\n }\n\n // Backtrack to find the actual LCS sequence\n const lcsIds: string[] = [];\n let i = n;\n let j = m;\n while (i > 0 && j > 0) {\n if (oldIds[i - 1] === newIds[j - 1]) {\n lcsIds.push(oldIds[i - 1]!);\n i--;\n j--;\n } else if (dp[i - 1]![j]! > dp[i]![j - 1]!) {\n i--;\n } else {\n j--;\n }\n }\n\n return lcsIds.reverse();\n}\n\ninterface DiffOps {\n toRemove: string[];\n toCreate: Array<[string | null, string]>; // (previous_item_id, id), if previous_item_id is null, add to the root\n}\n\n/**\n * Compute the minimal list of create/remove operations to transform oldCtx into newCtx.\n *\n * @param oldCtx - The old chat context.\n * @param newCtx - The new chat context.\n * @returns The minimal list of create/remove operations to transform oldCtx into newCtx.\n */\nexport function computeChatCtxDiff(oldCtx: ChatContext, newCtx: ChatContext): DiffOps {\n const oldIds = oldCtx.items.map((item: ChatItem) => item.id);\n const newIds = newCtx.items.map((item: ChatItem) => item.id);\n const lcsIds = new Set(computeLCS(oldIds, newIds));\n\n const toRemove = oldCtx.items.filter((msg) => !lcsIds.has(msg.id)).map((msg) => msg.id);\n const toCreate: Array<[string | null, string]> = [];\n\n let lastIdInSequence: string | null = null;\n for (const newItem of newCtx.items) {\n if (lcsIds.has(newItem.id)) {\n lastIdInSequence = newItem.id;\n } else {\n const prevId = lastIdInSequence; // null if root\n toCreate.push([prevId, newItem.id]);\n lastIdInSequence = newItem.id;\n }\n }\n\n return {\n toRemove,\n toCreate,\n };\n}\n\nexport function toJsonSchema(schema: ToolInputSchema<any>, isOpenai: boolean = true): JSONSchema7 {\n if (schema instanceof ZodObject) {\n return oaiParams(schema, isOpenai);\n }\n return schema;\n}\n"],"mappings":"AAGA,SAAS,iBAAiB,kBAAkB;AAE5C,OAAO,WAAW;AAClB,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAGhC;AAAA,EAEE;AAAA,EACA;AAAA,OAEK;AAUP,SAAS,+BAA+B,MAA8B;AACpE,UAAQ,MAAM;AAAA,IACZ,KAAK,gBAAgB;AAAA,IACrB,KAAK,gBAAgB;AAAA,IACrB,KAAK,gBAAgB;AAAA,IACrB,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT,KAAK,gBAAgB;AACnB,aAAO;AAAA,IACT;AAEE,YAAM,IAAI,MAAM,gCAAgC,IAAI,wCAAwC;AAAA,EAChG;AACF;AAEA,SAAS,oBAAoB,OAA+B;AAE1D,MACE,MAAM,SAAS,gBAAgB,QAC/B,MAAM,SAAS,gBAAgB,QAC/B,MAAM,SAAS,gBAAgB,QAC/B,MAAM,SAAS,gBAAgB,QAC/B,MAAM,SAAS,gBAAgB,OAC/B;AACA,WAAO;AAAA,EACT;AAGA,MAAI;AACF,WAAO,MAAM,QAAQ,gBAAgB,IAAI;AAAA,EAC3C,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,4BAA4B,MAAM,IAAI,YAAY,KAAK;AAAA,IAEzD;AAAA,EACF;AACF;AAEA,eAAsB,eAAe,OAA+C;AA/DpF;AAgEE,MAAI,OAAO,MAAM,UAAU,UAAU;AACnC,QAAI,MAAM,MAAM,WAAW,OAAO,GAAG;AACnC,YAAM,CAAC,QAAQ,UAAU,IAAI,MAAM,MAAM,MAAM,KAAK,CAAC;AACrD,YAAM,cAAc,OAAO,MAAM,GAAG;AACpC,YAAM,aAAY,iBAAY,CAAC,MAAb,mBAAgB,MAAM;AACxC,YAAM,aAAa,uCAAY;AAE/B,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAEA,UAAI;AACJ,UAAI,MAAM,YAAY,MAAM,aAAa,YAAY;AACnD,gBAAQ;AAAA,UACN,sBAAsB,MAAM,QAAQ,wCAAwC,UAAU;AAAA,QACxF;AACA,mBAAW,MAAM;AAAA,MACnB,OAAO;AACL,mBAAW;AAAA,MACb;AAEA,YAAM,iBAAiB,oBAAI,IAAI,CAAC,cAAc,aAAa,cAAc,WAAW,CAAC;AACrF,UAAI,CAAC,eAAe,IAAI,QAAQ,GAAG;AACjC,cAAM,IAAI,MAAM,wBAAwB,QAAQ,mCAAmC;AAAA,MACrF;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,iBAAiB,MAAM;AAAA,MACzB;AAAA,IACF;AAGA,WAAO;AAAA,MACL,UAAU,MAAM;AAAA,MAChB,iBAAiB,MAAM;AAAA,MACvB,aAAa,MAAM;AAAA,IACrB;AAAA,EACF,WAAW,MAAM,iBAAiB,YAAY;AAC5C,UAAM,QAAQ,oBAAoB,MAAM,KAAK;AAC7C,UAAM,WAAW,+BAA+B,MAAM,IAAI;AAG1D,QAAI,UAAU,MAAM,MAAM,MAAM;AAAA,MAC9B,KAAK;AAAA,QACH,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,MAAM,kBAAkB,MAAM,iBAAiB;AACjD,gBAAU,QAAQ,OAAO,MAAM,gBAAgB,MAAM,eAAe;AAAA,IACtE;AAEA,UAAM,aAAa,MAAM,QACtB,IAAI,EACJ,SAAS,EACT,KAAK,CAAC,WAAW,OAAO,SAAS,QAAQ,CAAC;AAE7C,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,iBAAiB,MAAM;AAAA,IACzB;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AACF;AAWO,MAAM,oBAAoB,CAC/B,YACA,WAAqB,CAAC,MACI;AAC1B,SAAO,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW;AACzC;AAIO,MAAM,YAAY,CACvB,GACA,WAAoB,SACS;AAE7B,QAAM,EAAE,YAAY,UAAU,qBAAqB,IAAI,gBAAgB,GAAG;AAAA;AAAA,IAExE,QAAQ,WAAW,WAAW;AAAA,EAChC,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGO,MAAM,uBAAuB,CAClC,SACA,YACA,UACA,YACiB;AACjB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,WAAW,QAAQ,YAAY;AAAA,EACjD;AAEA,SAAO,aAAa,OAAO;AAAA,IACzB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAsB,gBACpB,UACA,SAC6B;AAC7B,QAAM,OAAO,QAAQ,SAAS,IAAI;AAClC,MAAI;AACJ,MAAI;AAGJ,MAAI;AACF,WAAO,KAAK,MAAM,SAAS,IAAI;AAAA,EACjC,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO;AAAA,MAC/B,QAAQ,SAAS;AAAA,MACjB,QAAQ,iBAAiB,KAAK;AAAA,MAC9B,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI;AACF,QAAI,KAAK,sBAAsB,WAAW;AACxC,eAAS,KAAK,WAAW,MAAM,IAAI;AAAA,IACrC,OAAO;AACL,eAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO;AAAA,MAC/B,QAAQ,SAAS;AAAA,MACjB,QAAQ,6BAA6B,KAAK;AAAA,MAC1C,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,kBAAkB,SAAS,MAAM,CAAC;AAC5E,WAAO,mBAAmB,OAAO;AAAA,MAC/B,QAAQ,SAAS;AAAA,MACjB,QAAQ,KAAK,UAAU,MAAM;AAAA,MAC7B,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,mBAAmB,OAAO;AAAA,MAC/B,QAAQ,SAAS;AAAA,MACjB,QAAQ,0BAA0B,KAAK;AAAA,MACvC,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAUA,SAAS,WAAW,QAAkB,QAA4B;AAChE,QAAM,IAAI,OAAO;AACjB,QAAM,IAAI,OAAO;AACjB,QAAM,KAAiB,MAAM,IAAI,CAAC,EAC/B,KAAK,IAAI,EACT,IAAI,MAAM,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAGjC,WAASA,KAAI,GAAGA,MAAK,GAAGA,MAAK;AAC3B,aAASC,KAAI,GAAGA,MAAK,GAAGA,MAAK;AAC3B,UAAI,OAAOD,KAAI,CAAC,MAAM,OAAOC,KAAI,CAAC,GAAG;AACnC,WAAGD,EAAC,EAAGC,EAAC,IAAI,GAAGD,KAAI,CAAC,EAAGC,KAAI,CAAC,IAAK;AAAA,MACnC,OAAO;AACL,WAAGD,EAAC,EAAGC,EAAC,IAAI,KAAK,IAAI,GAAGD,KAAI,CAAC,EAAGC,EAAC,GAAI,GAAGD,EAAC,EAAGC,KAAI,CAAC,CAAE;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAmB,CAAC;AAC1B,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,IAAI,GAAG;AACrB,QAAI,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,GAAG;AACnC,aAAO,KAAK,OAAO,IAAI,CAAC,CAAE;AAC1B;AACA;AAAA,IACF,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,IAAK,GAAG,CAAC,EAAG,IAAI,CAAC,GAAI;AAC1C;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,QAAQ;AACxB;AAcO,SAAS,mBAAmB,QAAqB,QAA8B;AACpF,QAAM,SAAS,OAAO,MAAM,IAAI,CAAC,SAAmB,KAAK,EAAE;AAC3D,QAAM,SAAS,OAAO,MAAM,IAAI,CAAC,SAAmB,KAAK,EAAE;AAC3D,QAAM,SAAS,IAAI,IAAI,WAAW,QAAQ,MAAM,CAAC;AAEjD,QAAM,WAAW,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;AACtF,QAAM,WAA2C,CAAC;AAElD,MAAI,mBAAkC;AACtC,aAAW,WAAW,OAAO,OAAO;AAClC,QAAI,OAAO,IAAI,QAAQ,EAAE,GAAG;AAC1B,yBAAmB,QAAQ;AAAA,IAC7B,OAAO;AACL,YAAM,SAAS;AACf,eAAS,KAAK,CAAC,QAAQ,QAAQ,EAAE,CAAC;AAClC,yBAAmB,QAAQ;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,aAAa,QAA8B,WAAoB,MAAmB;AAChG,MAAI,kBAAkB,WAAW;AAC/B,WAAO,UAAU,QAAQ,QAAQ;AAAA,EACnC;AACA,SAAO;AACT;","names":["i","j"]}
1
+ {"version":3,"sources":["../../src/llm/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { VideoBufferType, VideoFrame } from '@livekit/rtc-node';\nimport type { JSONSchema7 } from 'json-schema';\nimport sharp from 'sharp';\nimport type { UnknownUserData } from '../voice/run_context.js';\nimport type { ChatContext } from './chat_context.js';\nimport {\n type ChatContent,\n type ChatItem,\n FunctionCall,\n FunctionCallOutput,\n type ImageContent,\n} from './chat_context.js';\nimport type { ToolContext, ToolInputSchema, ToolOptions } from './tool_context.js';\nimport { isZodSchema, parseZodSchema, zodSchemaToJsonSchema } from './zod-utils.js';\n\nexport interface SerializedImage {\n inferenceDetail: 'auto' | 'high' | 'low';\n mimeType?: string;\n base64Data?: string;\n externalUrl?: string;\n}\n\nfunction getChannelsFromVideoBufferType(type: VideoBufferType): 3 | 4 {\n switch (type) {\n case VideoBufferType.RGBA:\n case VideoBufferType.ABGR:\n case VideoBufferType.ARGB:\n case VideoBufferType.BGRA:\n return 4;\n case VideoBufferType.RGB24:\n return 3;\n default:\n // YUV formats (I420, I420A, I422, I444, I010, NV12) need conversion\n throw new Error(`Unsupported VideoBufferType: ${type}. Only RGB/RGBA formats are supported.`);\n }\n}\n\nfunction ensureRGBCompatible(frame: VideoFrame): VideoFrame {\n // If the frame is already in an RGB/RGBA-compatible format, return it directly\n if (\n frame.type === VideoBufferType.RGBA ||\n frame.type === VideoBufferType.BGRA ||\n frame.type === VideoBufferType.ARGB ||\n frame.type === VideoBufferType.ABGR ||\n frame.type === VideoBufferType.RGB24\n ) {\n return frame;\n }\n\n // Otherwise, attempt conversion for other formats (like YUV)\n try {\n return frame.convert(VideoBufferType.RGBA);\n } catch (error) {\n throw new Error(\n `Failed to convert format ${frame.type} to RGB: ${error}. ` +\n `Consider using RGB/RGBA formats or converting on the client side.`,\n );\n }\n}\n\nexport async function serializeImage(image: ImageContent): Promise<SerializedImage> {\n if (typeof image.image === 'string') {\n if (image.image.startsWith('data:')) {\n const [header, base64Data] = image.image.split(',', 2) as [string, string];\n const headerParts = header.split(';');\n const mimeParts = headerParts[0]?.split(':');\n const headerMime = mimeParts?.[1];\n\n if (!headerMime) {\n throw new Error('Invalid data URL format');\n }\n\n let mimeType: string;\n if (image.mimeType && image.mimeType !== headerMime) {\n console.warn(\n `Provided mimeType '${image.mimeType}' does not match data URL mime type '${headerMime}'. Using provided mimeType.`,\n );\n mimeType = image.mimeType;\n } else {\n mimeType = headerMime;\n }\n\n const supportedTypes = new Set(['image/jpeg', 'image/png', 'image/webp', 'image/gif']);\n if (!supportedTypes.has(mimeType)) {\n throw new Error(`Unsupported mimeType ${mimeType}. Must be jpeg, png, webp, or gif`);\n }\n\n return {\n base64Data,\n mimeType: mimeType,\n inferenceDetail: image.inferenceDetail,\n };\n }\n\n // External URL\n return {\n mimeType: image.mimeType,\n inferenceDetail: image.inferenceDetail,\n externalUrl: image.image,\n };\n } else if (image.image instanceof VideoFrame) {\n const frame = ensureRGBCompatible(image.image);\n const channels = getChannelsFromVideoBufferType(frame.type);\n\n // Sharp needs to know the format of raw pixel data\n let encoded = sharp(frame.data, {\n raw: {\n width: frame.width,\n height: frame.height,\n channels,\n },\n });\n\n if (image.inferenceWidth && image.inferenceHeight) {\n encoded = encoded.resize(image.inferenceWidth, image.inferenceHeight);\n }\n\n const base64Data = await encoded\n .png()\n .toBuffer()\n .then((buffer) => buffer.toString('base64'));\n\n return {\n base64Data,\n mimeType: 'image/png',\n inferenceDetail: image.inferenceDetail,\n };\n } else {\n throw new Error('Unsupported image type');\n }\n}\n\n/** Raw OpenAI-adherent function parameters. */\nexport type OpenAIFunctionParameters = {\n type: 'object';\n properties: { [id: string]: any }; // eslint-disable-line @typescript-eslint/no-explicit-any\n required: string[];\n additionalProperties?: boolean;\n};\n\n// TODO(brian): remove this helper once we have the real RunContext user data\nexport const createToolOptions = <UserData extends UnknownUserData>(\n toolCallId: string,\n userData: UserData = {} as UserData,\n): ToolOptions<UserData> => {\n return { ctx: { userData }, toolCallId } as unknown as ToolOptions<UserData>;\n};\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const oaiParams = (schema: any, isOpenai: boolean = true): OpenAIFunctionParameters => {\n // Adapted from https://github.com/vercel/ai/blob/56eb0ee9/packages/provider-utils/src/zod-schema.ts\n const jsonSchema = zodSchemaToJsonSchema(schema, isOpenai);\n const { properties, required, additionalProperties } = jsonSchema as OpenAIFunctionParameters;\n\n return {\n type: 'object',\n properties,\n required,\n additionalProperties,\n };\n};\n\n/** @internal */\nexport const oaiBuildFunctionInfo = (\n toolCtx: ToolContext,\n toolCallId: string,\n toolName: string,\n rawArgs: string,\n): FunctionCall => {\n const tool = toolCtx[toolName];\n if (!tool) {\n throw new Error(`AI tool ${toolName} not found`);\n }\n\n return FunctionCall.create({\n callId: toolCallId,\n name: toolName,\n args: rawArgs,\n });\n};\n\nexport async function executeToolCall(\n toolCall: FunctionCall,\n toolCtx: ToolContext,\n): Promise<FunctionCallOutput> {\n const tool = toolCtx[toolCall.name]!;\n let args: object | undefined;\n let params: object | undefined;\n\n // Ensure valid JSON\n try {\n args = JSON.parse(toolCall.args);\n } catch (error) {\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: `Invalid JSON: ${error}`,\n isError: true,\n });\n }\n\n // Ensure valid arguments schema\n try {\n if (isZodSchema(tool.parameters)) {\n const result = await parseZodSchema<object>(tool.parameters, args);\n if (result.success) {\n params = result.data;\n } else {\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: `Arguments parsing failed: ${result.error}`,\n isError: true,\n });\n }\n } else {\n params = args;\n }\n } catch (error) {\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: `Arguments parsing failed: ${error}`,\n isError: true,\n });\n }\n\n try {\n const result = await tool.execute(params, createToolOptions(toolCall.callId));\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: JSON.stringify(result),\n isError: false,\n });\n } catch (error) {\n return FunctionCallOutput.create({\n callId: toolCall.callId,\n output: `Tool execution failed: ${error}`,\n isError: true,\n });\n }\n}\n\nexport interface FormatChatHistoryOptions {\n includeIds?: boolean;\n includeTimestamps?: boolean;\n}\n\n/**\n * Render a chat context into a readable multiline string for debugging and logging.\n */\nexport function formatChatHistory(\n chatCtx: ChatContext,\n options: FormatChatHistoryOptions = {},\n): string {\n const { includeIds = false, includeTimestamps = false } = options;\n\n if (chatCtx.items.length === 0) {\n return 'Chat history (0 items)';\n }\n\n const formattedItems = chatCtx.items.map((item, index) =>\n formatChatHistoryItem(item, index, {\n includeIds,\n includeTimestamps,\n }),\n );\n\n return [\n `Chat history (${chatCtx.items.length} items)`,\n ...formattedItems.flatMap((item) => ['', item]),\n ].join('\\n');\n}\n\nfunction formatChatHistoryItem(\n item: ChatItem,\n index: number,\n options: Required<FormatChatHistoryOptions>,\n): string {\n const headerParts = [`[${index}]`];\n\n if (item.type === 'message') {\n headerParts.push('message', item.role);\n } else if (item.type === 'function_call') {\n headerParts.push('function_call', item.name, `call_id=${item.callId}`);\n } else if (item.type === 'function_call_output') {\n headerParts.push('function_call_output', item.name || '(unnamed)', `call_id=${item.callId}`);\n if (item.isError) {\n headerParts.push('error=true');\n }\n } else {\n headerParts.push('agent_handoff');\n }\n\n if (options.includeIds) {\n headerParts.push(`id=${item.id}`);\n }\n\n if (options.includeTimestamps) {\n headerParts.push(`created_at=${item.createdAt.toFixed(3)}`);\n }\n\n const body = formatChatHistoryItemBody(item);\n if (!body) {\n return headerParts.join(' ');\n }\n\n return `${headerParts.join(' ')}\\n${indentBlock(body, ' ')}`;\n}\n\nfunction formatChatHistoryItemBody(item: ChatItem): string {\n if (item.type === 'message') {\n const content = item.content.map((part) => formatMessageContentPart(part)).join('\\n');\n return content.trim() ? content : '(empty)';\n }\n\n if (item.type === 'function_call') {\n return prettyJsonText(item.args);\n }\n\n if (item.type === 'function_call_output') {\n return prettyJsonText(item.output);\n }\n\n return `${item.oldAgentId ?? '(none)'} -> ${item.newAgentId}`;\n}\n\nfunction formatMessageContentPart(part: ChatContent): string {\n if (typeof part === 'string') {\n return part;\n }\n\n if (part.type === 'image_content') {\n if (typeof part.image === 'string') {\n return `[image url=${truncateText(part.image, 120)}]`;\n }\n\n return `[image frame=${part.image.width}x${part.image.height}]`;\n }\n\n if (part.transcript) {\n return `[audio transcript=${JSON.stringify(truncateText(part.transcript, 120))}]`;\n }\n\n return `[audio frames=${part.frame.length}]`;\n}\n\nfunction prettyJsonText(text: string): string {\n try {\n return JSON.stringify(JSON.parse(text), null, 2);\n } catch {\n return text;\n }\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) {\n return text;\n }\n\n return `${text.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n\nfunction indentBlock(text: string, indent: string): string {\n return text\n .split('\\n')\n .map((line) => `${indent}${line}`)\n .join('\\n');\n}\n\n/**\n * Standard dynamic-programming LCS to get the common subsequence\n * of IDs (in order) that appear in both old_ids and new_ids.\n *\n * @param oldIds - The old list of IDs.\n * @param newIds - The new list of IDs.\n * @returns The longest common subsequence of the two lists of IDs.\n */\nfunction computeLCS(oldIds: string[], newIds: string[]): string[] {\n const n = oldIds.length;\n const m = newIds.length;\n const dp: number[][] = Array(n + 1)\n .fill(null)\n .map(() => Array(m + 1).fill(0));\n\n // Fill DP table\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (oldIds[i - 1] === newIds[j - 1]) {\n dp[i]![j] = dp[i - 1]![j - 1]! + 1;\n } else {\n dp[i]![j] = Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!);\n }\n }\n }\n\n // Backtrack to find the actual LCS sequence\n const lcsIds: string[] = [];\n let i = n;\n let j = m;\n while (i > 0 && j > 0) {\n if (oldIds[i - 1] === newIds[j - 1]) {\n lcsIds.push(oldIds[i - 1]!);\n i--;\n j--;\n } else if (dp[i - 1]![j]! > dp[i]![j - 1]!) {\n i--;\n } else {\n j--;\n }\n }\n\n return lcsIds.reverse();\n}\n\ninterface DiffOps {\n toRemove: string[];\n toCreate: Array<[string | null, string]>; // (previous_item_id, id), if previous_item_id is null, add to the root\n}\n\n/**\n * Compute the minimal list of create/remove operations to transform oldCtx into newCtx.\n *\n * @param oldCtx - The old chat context.\n * @param newCtx - The new chat context.\n * @returns The minimal list of create/remove operations to transform oldCtx into newCtx.\n */\nexport function computeChatCtxDiff(oldCtx: ChatContext, newCtx: ChatContext): DiffOps {\n const oldIds = oldCtx.items.map((item: ChatItem) => item.id);\n const newIds = newCtx.items.map((item: ChatItem) => item.id);\n const lcsIds = new Set(computeLCS(oldIds, newIds));\n\n const toRemove = oldCtx.items.filter((msg) => !lcsIds.has(msg.id)).map((msg) => msg.id);\n const toCreate: Array<[string | null, string]> = [];\n\n let lastIdInSequence: string | null = null;\n for (const newItem of newCtx.items) {\n if (lcsIds.has(newItem.id)) {\n lastIdInSequence = newItem.id;\n } else {\n const prevId = lastIdInSequence; // null if root\n toCreate.push([prevId, newItem.id]);\n lastIdInSequence = newItem.id;\n }\n }\n\n return {\n toRemove,\n toCreate,\n };\n}\n\nexport function toJsonSchema(\n schema: ToolInputSchema<any>,\n isOpenai: boolean = true,\n strict: boolean = false,\n): JSONSchema7 {\n if (isZodSchema(schema)) {\n return zodSchemaToJsonSchema(schema, isOpenai, strict);\n }\n\n return schema as JSONSchema7;\n}\n"],"mappings":"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","names":["i","j"]}
@@ -266,6 +266,96 @@ function expectPixel(data, index, expected) {
266
266
  ]);
267
267
  });
268
268
  });
269
+ (0, import_vitest.describe)("formatChatHistory", () => {
270
+ (0, import_vitest.it)("should format mixed chat history items for logging", () => {
271
+ const ctx = new import_chat_context.ChatContext([
272
+ import_chat_context.ChatMessage.create({
273
+ id: "msg_system",
274
+ role: "system",
275
+ content: "You are helpful.",
276
+ createdAt: 1
277
+ }),
278
+ import_chat_context.ChatMessage.create({
279
+ id: "msg_user",
280
+ role: "user",
281
+ content: [
282
+ "Show me my order",
283
+ createImageContent("https://example.com/receipt.png"),
284
+ { type: "audio_content", frame: [], transcript: "order 123" }
285
+ ],
286
+ createdAt: 2
287
+ }),
288
+ import_chat_context.FunctionCall.create({
289
+ id: "fn_call",
290
+ callId: "call_1",
291
+ name: "lookup_order",
292
+ args: '{"orderId":"123"}',
293
+ createdAt: 3
294
+ }),
295
+ import_chat_context.FunctionCallOutput.create({
296
+ id: "fn_output",
297
+ callId: "call_1",
298
+ name: "lookup_order",
299
+ output: '{"status":"shipped","ok":true}',
300
+ isError: false,
301
+ createdAt: 4
302
+ }),
303
+ import_chat_context.AgentHandoffItem.create({
304
+ id: "handoff",
305
+ oldAgentId: "support",
306
+ newAgentId: "returns",
307
+ createdAt: 5
308
+ })
309
+ ]);
310
+ (0, import_vitest.expect)((0, import_utils.formatChatHistory)(ctx)).toBe(
311
+ [
312
+ "Chat history (5 items)",
313
+ "",
314
+ "[0] message system",
315
+ " You are helpful.",
316
+ "",
317
+ "[1] message user",
318
+ " Show me my order",
319
+ " [image url=https://example.com/receipt.png]",
320
+ ' [audio transcript="order 123"]',
321
+ "",
322
+ "[2] function_call lookup_order call_id=call_1",
323
+ " {",
324
+ ' "orderId": "123"',
325
+ " }",
326
+ "",
327
+ "[3] function_call_output lookup_order call_id=call_1",
328
+ " {",
329
+ ' "status": "shipped",',
330
+ ' "ok": true',
331
+ " }",
332
+ "",
333
+ "[4] agent_handoff",
334
+ " support -> returns"
335
+ ].join("\n")
336
+ );
337
+ });
338
+ (0, import_vitest.it)("should optionally include ids and timestamps", () => {
339
+ const ctx = new import_chat_context.ChatContext([
340
+ import_chat_context.FunctionCallOutput.create({
341
+ id: "fn_output",
342
+ callId: "call_1",
343
+ name: "lookup_order",
344
+ output: "plain text error",
345
+ isError: true,
346
+ createdAt: 123.456
347
+ })
348
+ ]);
349
+ (0, import_vitest.expect)((0, import_utils.formatChatHistory)(ctx, { includeIds: true, includeTimestamps: true })).toBe(
350
+ [
351
+ "Chat history (1 items)",
352
+ "",
353
+ "[0] function_call_output lookup_order call_id=call_1 error=true id=fn_output created_at=123.456",
354
+ " plain text error"
355
+ ].join("\n")
356
+ );
357
+ });
358
+ });
269
359
  (0, import_vitest.describe)("serializeImage", () => {
270
360
  let consoleWarnSpy;
271
361
  (0, import_vitest.beforeEach)(() => {
@@ -1 +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":["sharp"]}
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 {\n AgentHandoffItem,\n ChatContext,\n ChatMessage,\n FunctionCall,\n FunctionCallOutput,\n type ImageContent,\n} from './chat_context.js';\nimport { computeChatCtxDiff, formatChatHistory, 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('formatChatHistory', () => {\n it('should format mixed chat history items for logging', () => {\n const ctx = new ChatContext([\n ChatMessage.create({\n id: 'msg_system',\n role: 'system',\n content: 'You are helpful.',\n createdAt: 1,\n }),\n ChatMessage.create({\n id: 'msg_user',\n role: 'user',\n content: [\n 'Show me my order',\n createImageContent('https://example.com/receipt.png'),\n { type: 'audio_content', frame: [], transcript: 'order 123' },\n ],\n createdAt: 2,\n }),\n FunctionCall.create({\n id: 'fn_call',\n callId: 'call_1',\n name: 'lookup_order',\n args: '{\"orderId\":\"123\"}',\n createdAt: 3,\n }),\n FunctionCallOutput.create({\n id: 'fn_output',\n callId: 'call_1',\n name: 'lookup_order',\n output: '{\"status\":\"shipped\",\"ok\":true}',\n isError: false,\n createdAt: 4,\n }),\n AgentHandoffItem.create({\n id: 'handoff',\n oldAgentId: 'support',\n newAgentId: 'returns',\n createdAt: 5,\n }),\n ]);\n\n expect(formatChatHistory(ctx)).toBe(\n [\n 'Chat history (5 items)',\n '',\n '[0] message system',\n ' You are helpful.',\n '',\n '[1] message user',\n ' Show me my order',\n ' [image url=https://example.com/receipt.png]',\n ' [audio transcript=\"order 123\"]',\n '',\n '[2] function_call lookup_order call_id=call_1',\n ' {',\n ' \"orderId\": \"123\"',\n ' }',\n '',\n '[3] function_call_output lookup_order call_id=call_1',\n ' {',\n ' \"status\": \"shipped\",',\n ' \"ok\": true',\n ' }',\n '',\n '[4] agent_handoff',\n ' support -> returns',\n ].join('\\n'),\n );\n });\n\n it('should optionally include ids and timestamps', () => {\n const ctx = new ChatContext([\n FunctionCallOutput.create({\n id: 'fn_output',\n callId: 'call_1',\n name: 'lookup_order',\n output: 'plain text error',\n isError: true,\n createdAt: 123.456,\n }),\n ]);\n\n expect(formatChatHistory(ctx, { includeIds: true, includeTimestamps: true })).toBe(\n [\n 'Chat history (1 items)',\n '',\n '[0] function_call_output lookup_order call_id=call_1 error=true id=fn_output created_at=123.456',\n ' plain text error',\n ].join('\\n'),\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":["sharp"]}