@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.
- package/dist/_exceptions.cjs.map +1 -1
- package/dist/_exceptions.d.ts.map +1 -1
- package/dist/_exceptions.js.map +1 -1
- package/dist/audio.cjs +89 -3
- package/dist/audio.cjs.map +1 -1
- package/dist/audio.d.cts +36 -1
- package/dist/audio.d.ts +36 -1
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +76 -2
- package/dist/audio.js.map +1 -1
- package/dist/beta/index.cjs +29 -0
- package/dist/beta/index.cjs.map +1 -0
- package/dist/beta/index.d.cts +2 -0
- package/dist/beta/index.d.ts +2 -0
- package/dist/beta/index.d.ts.map +1 -0
- package/dist/beta/index.js +7 -0
- package/dist/beta/index.js.map +1 -0
- package/dist/beta/workflows/index.cjs +29 -0
- package/dist/beta/workflows/index.cjs.map +1 -0
- package/dist/beta/workflows/index.d.cts +2 -0
- package/dist/beta/workflows/index.d.ts +2 -0
- package/dist/beta/workflows/index.d.ts.map +1 -0
- package/dist/beta/workflows/index.js +7 -0
- package/dist/beta/workflows/index.js.map +1 -0
- package/dist/beta/workflows/task_group.cjs +165 -0
- package/dist/beta/workflows/task_group.cjs.map +1 -0
- package/dist/beta/workflows/task_group.d.cts +32 -0
- package/dist/beta/workflows/task_group.d.ts +32 -0
- package/dist/beta/workflows/task_group.d.ts.map +1 -0
- package/dist/beta/workflows/task_group.js +141 -0
- package/dist/beta/workflows/task_group.js.map +1 -0
- package/dist/cli.cjs +44 -46
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.cts +3 -3
- package/dist/cli.d.ts +3 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -47
- package/dist/cli.js.map +1 -1
- package/dist/connection_pool.cjs +242 -0
- package/dist/connection_pool.cjs.map +1 -0
- package/dist/connection_pool.d.cts +123 -0
- package/dist/connection_pool.d.ts +123 -0
- package/dist/connection_pool.d.ts.map +1 -0
- package/dist/connection_pool.js +218 -0
- package/dist/connection_pool.js.map +1 -0
- package/dist/connection_pool.test.cjs +256 -0
- package/dist/connection_pool.test.cjs.map +1 -0
- package/dist/connection_pool.test.js +255 -0
- package/dist/connection_pool.test.js.map +1 -0
- package/dist/constants.cjs +30 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +10 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +20 -0
- package/dist/constants.js.map +1 -1
- package/dist/cpu.cjs +189 -0
- package/dist/cpu.cjs.map +1 -0
- package/dist/cpu.d.cts +24 -0
- package/dist/cpu.d.ts +24 -0
- package/dist/cpu.d.ts.map +1 -0
- package/dist/cpu.js +152 -0
- package/dist/cpu.js.map +1 -0
- package/dist/cpu.test.cjs +227 -0
- package/dist/cpu.test.cjs.map +1 -0
- package/dist/cpu.test.js +204 -0
- package/dist/cpu.test.js.map +1 -0
- package/dist/http_server.cjs +9 -6
- package/dist/http_server.cjs.map +1 -1
- package/dist/http_server.d.cts +5 -1
- package/dist/http_server.d.ts +5 -1
- package/dist/http_server.d.ts.map +1 -1
- package/dist/http_server.js +9 -6
- package/dist/http_server.js.map +1 -1
- package/dist/index.cjs +24 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -11
- package/dist/index.d.ts +15 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/inference/api_protos.cjs +70 -2
- package/dist/inference/api_protos.cjs.map +1 -1
- package/dist/inference/api_protos.d.cts +373 -32
- package/dist/inference/api_protos.d.ts +373 -32
- package/dist/inference/api_protos.d.ts.map +1 -1
- package/dist/inference/api_protos.js +62 -2
- package/dist/inference/api_protos.js.map +1 -1
- package/dist/inference/index.cjs +8 -0
- package/dist/inference/index.cjs.map +1 -1
- package/dist/inference/index.d.cts +3 -4
- package/dist/inference/index.d.ts +3 -4
- package/dist/inference/index.d.ts.map +1 -1
- package/dist/inference/index.js +18 -3
- package/dist/inference/index.js.map +1 -1
- package/dist/inference/interruption/defaults.cjs +81 -0
- package/dist/inference/interruption/defaults.cjs.map +1 -0
- package/dist/inference/interruption/defaults.d.cts +19 -0
- package/dist/inference/interruption/defaults.d.ts +19 -0
- package/dist/inference/interruption/defaults.d.ts.map +1 -0
- package/dist/inference/interruption/defaults.js +46 -0
- package/dist/inference/interruption/defaults.js.map +1 -0
- package/dist/inference/interruption/errors.cjs +44 -0
- package/dist/inference/interruption/errors.cjs.map +1 -0
- package/dist/inference/interruption/errors.d.cts +12 -0
- package/dist/inference/interruption/errors.d.ts +12 -0
- package/dist/inference/interruption/errors.d.ts.map +1 -0
- package/dist/inference/interruption/errors.js +20 -0
- package/dist/inference/interruption/errors.js.map +1 -0
- package/dist/inference/interruption/http_transport.cjs +163 -0
- package/dist/inference/interruption/http_transport.cjs.map +1 -0
- package/dist/inference/interruption/http_transport.d.cts +65 -0
- package/dist/inference/interruption/http_transport.d.ts +65 -0
- package/dist/inference/interruption/http_transport.d.ts.map +1 -0
- package/dist/inference/interruption/http_transport.js +137 -0
- package/dist/inference/interruption/http_transport.js.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
- package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
- package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
- package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.js +34 -0
- package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
- package/dist/inference/interruption/interruption_detector.cjs +198 -0
- package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
- package/dist/inference/interruption/interruption_detector.d.cts +59 -0
- package/dist/inference/interruption/interruption_detector.d.ts +59 -0
- package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_detector.js +164 -0
- package/dist/inference/interruption/interruption_detector.js.map +1 -0
- package/dist/inference/interruption/interruption_stream.cjs +368 -0
- package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
- package/dist/inference/interruption/interruption_stream.d.cts +46 -0
- package/dist/inference/interruption/interruption_stream.d.ts +46 -0
- package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_stream.js +344 -0
- package/dist/inference/interruption/interruption_stream.js.map +1 -0
- package/dist/inference/interruption/types.cjs +17 -0
- package/dist/inference/interruption/types.cjs.map +1 -0
- package/dist/inference/interruption/types.d.cts +66 -0
- package/dist/inference/interruption/types.d.ts +66 -0
- package/dist/inference/interruption/types.d.ts.map +1 -0
- package/dist/inference/interruption/types.js +1 -0
- package/dist/inference/interruption/types.js.map +1 -0
- package/dist/inference/interruption/utils.cjs +130 -0
- package/dist/inference/interruption/utils.cjs.map +1 -0
- package/dist/inference/interruption/utils.d.cts +41 -0
- package/dist/inference/interruption/utils.d.ts +41 -0
- package/dist/inference/interruption/utils.d.ts.map +1 -0
- package/dist/inference/interruption/utils.js +105 -0
- package/dist/inference/interruption/utils.js.map +1 -0
- package/dist/inference/interruption/utils.test.cjs +105 -0
- package/dist/inference/interruption/utils.test.cjs.map +1 -0
- package/dist/inference/interruption/utils.test.js +104 -0
- package/dist/inference/interruption/utils.test.js.map +1 -0
- package/dist/inference/interruption/ws_transport.cjs +347 -0
- package/dist/inference/interruption/ws_transport.cjs.map +1 -0
- package/dist/inference/interruption/ws_transport.d.cts +33 -0
- package/dist/inference/interruption/ws_transport.d.ts +33 -0
- package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
- package/dist/inference/interruption/ws_transport.js +313 -0
- package/dist/inference/interruption/ws_transport.js.map +1 -0
- package/dist/inference/llm.cjs +106 -66
- package/dist/inference/llm.cjs.map +1 -1
- package/dist/inference/llm.d.cts +65 -43
- package/dist/inference/llm.d.ts +65 -43
- package/dist/inference/llm.d.ts.map +1 -1
- package/dist/inference/llm.js +100 -66
- package/dist/inference/llm.js.map +1 -1
- package/dist/inference/stt.cjs +319 -170
- package/dist/inference/stt.cjs.map +1 -1
- package/dist/inference/stt.d.cts +64 -15
- package/dist/inference/stt.d.ts +64 -15
- package/dist/inference/stt.d.ts.map +1 -1
- package/dist/inference/stt.js +319 -170
- package/dist/inference/stt.js.map +1 -1
- package/dist/inference/stt.test.cjs +218 -0
- package/dist/inference/stt.test.cjs.map +1 -0
- package/dist/inference/stt.test.js +217 -0
- package/dist/inference/stt.test.js.map +1 -0
- package/dist/inference/tts.cjs +249 -71
- package/dist/inference/tts.cjs.map +1 -1
- package/dist/inference/tts.d.cts +94 -17
- package/dist/inference/tts.d.ts +94 -17
- package/dist/inference/tts.d.ts.map +1 -1
- package/dist/inference/tts.js +249 -77
- package/dist/inference/tts.js.map +1 -1
- package/dist/inference/tts.test.cjs +305 -0
- package/dist/inference/tts.test.cjs.map +1 -0
- package/dist/inference/tts.test.js +304 -0
- package/dist/inference/tts.test.js.map +1 -0
- package/dist/inference/utils.cjs +26 -7
- package/dist/inference/utils.cjs.map +1 -1
- package/dist/inference/utils.d.cts +14 -1
- package/dist/inference/utils.d.ts +14 -1
- package/dist/inference/utils.d.ts.map +1 -1
- package/dist/inference/utils.js +18 -2
- package/dist/inference/utils.js.map +1 -1
- package/dist/ipc/inference_proc_executor.cjs +6 -3
- package/dist/ipc/inference_proc_executor.cjs.map +1 -1
- package/dist/ipc/inference_proc_executor.d.ts.map +1 -1
- package/dist/ipc/inference_proc_executor.js +6 -3
- package/dist/ipc/inference_proc_executor.js.map +1 -1
- package/dist/ipc/inference_proc_lazy_main.cjs +13 -1
- package/dist/ipc/inference_proc_lazy_main.cjs.map +1 -1
- package/dist/ipc/inference_proc_lazy_main.js +13 -1
- package/dist/ipc/inference_proc_lazy_main.js.map +1 -1
- package/dist/ipc/job_proc_executor.cjs +6 -1
- package/dist/ipc/job_proc_executor.cjs.map +1 -1
- package/dist/ipc/job_proc_executor.d.ts.map +1 -1
- package/dist/ipc/job_proc_executor.js +6 -1
- package/dist/ipc/job_proc_executor.js.map +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs +89 -17
- package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
- package/dist/ipc/job_proc_lazy_main.js +68 -18
- package/dist/ipc/job_proc_lazy_main.js.map +1 -1
- package/dist/ipc/supervised_proc.cjs +34 -8
- package/dist/ipc/supervised_proc.cjs.map +1 -1
- package/dist/ipc/supervised_proc.d.cts +8 -0
- package/dist/ipc/supervised_proc.d.ts +8 -0
- package/dist/ipc/supervised_proc.d.ts.map +1 -1
- package/dist/ipc/supervised_proc.js +34 -8
- package/dist/ipc/supervised_proc.js.map +1 -1
- package/dist/ipc/supervised_proc.test.cjs +145 -0
- package/dist/ipc/supervised_proc.test.cjs.map +1 -0
- package/dist/ipc/supervised_proc.test.js +122 -0
- package/dist/ipc/supervised_proc.test.js.map +1 -0
- package/dist/job.cjs +109 -1
- package/dist/job.cjs.map +1 -1
- package/dist/job.d.cts +14 -0
- package/dist/job.d.ts +14 -0
- package/dist/job.d.ts.map +1 -1
- package/dist/job.js +99 -1
- package/dist/job.js.map +1 -1
- package/dist/language.cjs +394 -0
- package/dist/language.cjs.map +1 -0
- package/dist/language.d.cts +15 -0
- package/dist/language.d.ts +15 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +363 -0
- package/dist/language.js.map +1 -0
- package/dist/language.test.cjs +43 -0
- package/dist/language.test.cjs.map +1 -0
- package/dist/language.test.js +49 -0
- package/dist/language.test.js.map +1 -0
- package/dist/llm/chat_context.cjs +345 -3
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +86 -2
- package/dist/llm/chat_context.d.ts +86 -2
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +344 -3
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/chat_context.test.cjs +692 -0
- package/dist/llm/chat_context.test.cjs.map +1 -1
- package/dist/llm/chat_context.test.js +692 -0
- package/dist/llm/chat_context.test.js.map +1 -1
- package/dist/llm/fallback_adapter.cjs +280 -0
- package/dist/llm/fallback_adapter.cjs.map +1 -0
- package/dist/llm/fallback_adapter.d.cts +73 -0
- package/dist/llm/fallback_adapter.d.ts +73 -0
- package/dist/llm/fallback_adapter.d.ts.map +1 -0
- package/dist/llm/fallback_adapter.js +256 -0
- package/dist/llm/fallback_adapter.js.map +1 -0
- package/dist/llm/fallback_adapter.test.cjs +176 -0
- package/dist/llm/fallback_adapter.test.cjs.map +1 -0
- package/dist/llm/fallback_adapter.test.js +175 -0
- package/dist/llm/fallback_adapter.test.js.map +1 -0
- package/dist/llm/index.cjs +11 -0
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +4 -3
- package/dist/llm/index.d.ts +4 -3
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +13 -1
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +65 -11
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.cts +13 -2
- package/dist/llm/llm.d.ts +13 -2
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +65 -11
- package/dist/llm/llm.js.map +1 -1
- package/dist/llm/provider_format/google.cjs +6 -2
- package/dist/llm/provider_format/google.cjs.map +1 -1
- package/dist/llm/provider_format/google.d.cts +1 -1
- package/dist/llm/provider_format/google.d.ts +1 -1
- package/dist/llm/provider_format/google.d.ts.map +1 -1
- package/dist/llm/provider_format/google.js +6 -2
- package/dist/llm/provider_format/google.js.map +1 -1
- package/dist/llm/provider_format/google.test.cjs +48 -0
- package/dist/llm/provider_format/google.test.cjs.map +1 -1
- package/dist/llm/provider_format/google.test.js +54 -1
- package/dist/llm/provider_format/google.test.js.map +1 -1
- package/dist/llm/provider_format/index.cjs +2 -0
- package/dist/llm/provider_format/index.cjs.map +1 -1
- package/dist/llm/provider_format/index.d.cts +2 -2
- package/dist/llm/provider_format/index.d.ts +2 -2
- package/dist/llm/provider_format/index.d.ts.map +1 -1
- package/dist/llm/provider_format/index.js +6 -1
- package/dist/llm/provider_format/index.js.map +1 -1
- package/dist/llm/provider_format/openai.cjs +126 -24
- package/dist/llm/provider_format/openai.cjs.map +1 -1
- package/dist/llm/provider_format/openai.d.cts +1 -0
- package/dist/llm/provider_format/openai.d.ts +1 -0
- package/dist/llm/provider_format/openai.d.ts.map +1 -1
- package/dist/llm/provider_format/openai.js +124 -23
- package/dist/llm/provider_format/openai.js.map +1 -1
- package/dist/llm/provider_format/openai.test.cjs +393 -0
- package/dist/llm/provider_format/openai.test.cjs.map +1 -1
- package/dist/llm/provider_format/openai.test.js +400 -2
- package/dist/llm/provider_format/openai.test.js.map +1 -1
- package/dist/llm/provider_format/utils.cjs +5 -4
- package/dist/llm/provider_format/utils.cjs.map +1 -1
- package/dist/llm/provider_format/utils.d.ts.map +1 -1
- package/dist/llm/provider_format/utils.js +5 -4
- package/dist/llm/provider_format/utils.js.map +1 -1
- package/dist/llm/realtime.cjs +3 -0
- package/dist/llm/realtime.cjs.map +1 -1
- package/dist/llm/realtime.d.cts +15 -1
- package/dist/llm/realtime.d.ts +15 -1
- package/dist/llm/realtime.d.ts.map +1 -1
- package/dist/llm/realtime.js +3 -0
- package/dist/llm/realtime.js.map +1 -1
- package/dist/llm/remote_chat_context.cjs.map +1 -1
- package/dist/llm/remote_chat_context.d.cts +2 -0
- package/dist/llm/remote_chat_context.d.ts +2 -0
- package/dist/llm/remote_chat_context.d.ts.map +1 -1
- package/dist/llm/remote_chat_context.js.map +1 -1
- package/dist/llm/tool_context.cjs +50 -2
- package/dist/llm/tool_context.cjs.map +1 -1
- package/dist/llm/tool_context.d.cts +47 -11
- package/dist/llm/tool_context.d.ts +47 -11
- package/dist/llm/tool_context.d.ts.map +1 -1
- package/dist/llm/tool_context.js +48 -3
- package/dist/llm/tool_context.js.map +1 -1
- package/dist/llm/tool_context.test.cjs +197 -0
- package/dist/llm/tool_context.test.cjs.map +1 -1
- package/dist/llm/tool_context.test.js +175 -0
- package/dist/llm/tool_context.test.js.map +1 -1
- package/dist/llm/utils.cjs +107 -12
- package/dist/llm/utils.cjs.map +1 -1
- package/dist/llm/utils.d.cts +10 -3
- package/dist/llm/utils.d.ts +10 -3
- package/dist/llm/utils.d.ts.map +1 -1
- package/dist/llm/utils.js +106 -12
- package/dist/llm/utils.js.map +1 -1
- package/dist/llm/utils.test.cjs +90 -0
- package/dist/llm/utils.test.cjs.map +1 -1
- package/dist/llm/utils.test.js +98 -2
- package/dist/llm/utils.test.js.map +1 -1
- package/dist/llm/zod-utils.cjs +102 -0
- package/dist/llm/zod-utils.cjs.map +1 -0
- package/dist/llm/zod-utils.d.cts +65 -0
- package/dist/llm/zod-utils.d.ts +65 -0
- package/dist/llm/zod-utils.d.ts.map +1 -0
- package/dist/llm/zod-utils.js +64 -0
- package/dist/llm/zod-utils.js.map +1 -0
- package/dist/llm/zod-utils.test.cjs +472 -0
- package/dist/llm/zod-utils.test.cjs.map +1 -0
- package/dist/llm/zod-utils.test.js +455 -0
- package/dist/llm/zod-utils.test.js.map +1 -0
- package/dist/log.cjs +45 -14
- package/dist/log.cjs.map +1 -1
- package/dist/log.d.cts +8 -1
- package/dist/log.d.ts +8 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +45 -15
- package/dist/log.js.map +1 -1
- package/dist/metrics/base.cjs.map +1 -1
- package/dist/metrics/base.d.cts +75 -19
- package/dist/metrics/base.d.ts +75 -19
- package/dist/metrics/base.d.ts.map +1 -1
- package/dist/metrics/index.cjs +5 -0
- package/dist/metrics/index.cjs.map +1 -1
- package/dist/metrics/index.d.cts +2 -1
- package/dist/metrics/index.d.ts +2 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +6 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/model_usage.cjs +189 -0
- package/dist/metrics/model_usage.cjs.map +1 -0
- package/dist/metrics/model_usage.d.cts +92 -0
- package/dist/metrics/model_usage.d.ts +92 -0
- package/dist/metrics/model_usage.d.ts.map +1 -0
- package/dist/metrics/model_usage.js +164 -0
- package/dist/metrics/model_usage.js.map +1 -0
- package/dist/metrics/model_usage.test.cjs +474 -0
- package/dist/metrics/model_usage.test.cjs.map +1 -0
- package/dist/metrics/model_usage.test.js +476 -0
- package/dist/metrics/model_usage.test.js.map +1 -0
- package/dist/metrics/usage_collector.cjs +5 -2
- package/dist/metrics/usage_collector.cjs.map +1 -1
- package/dist/metrics/usage_collector.d.cts +10 -1
- package/dist/metrics/usage_collector.d.ts +10 -1
- package/dist/metrics/usage_collector.d.ts.map +1 -1
- package/dist/metrics/usage_collector.js +5 -2
- package/dist/metrics/usage_collector.js.map +1 -1
- package/dist/metrics/utils.cjs +23 -7
- package/dist/metrics/utils.cjs.map +1 -1
- package/dist/metrics/utils.d.ts.map +1 -1
- package/dist/metrics/utils.js +23 -7
- package/dist/metrics/utils.js.map +1 -1
- package/dist/stream/deferred_stream.cjs +31 -10
- package/dist/stream/deferred_stream.cjs.map +1 -1
- package/dist/stream/deferred_stream.d.cts +6 -1
- package/dist/stream/deferred_stream.d.ts +6 -1
- package/dist/stream/deferred_stream.d.ts.map +1 -1
- package/dist/stream/deferred_stream.js +31 -10
- package/dist/stream/deferred_stream.js.map +1 -1
- package/dist/stream/deferred_stream.test.cjs +2 -2
- package/dist/stream/deferred_stream.test.cjs.map +1 -1
- package/dist/stream/deferred_stream.test.js +2 -2
- package/dist/stream/deferred_stream.test.js.map +1 -1
- package/dist/stream/index.cjs +3 -0
- package/dist/stream/index.cjs.map +1 -1
- package/dist/stream/index.d.cts +1 -0
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +2 -0
- package/dist/stream/index.js.map +1 -1
- package/dist/stream/multi_input_stream.cjs +139 -0
- package/dist/stream/multi_input_stream.cjs.map +1 -0
- package/dist/stream/multi_input_stream.d.cts +55 -0
- package/dist/stream/multi_input_stream.d.ts +55 -0
- package/dist/stream/multi_input_stream.d.ts.map +1 -0
- package/dist/stream/multi_input_stream.js +115 -0
- package/dist/stream/multi_input_stream.js.map +1 -0
- package/dist/stream/multi_input_stream.test.cjs +344 -0
- package/dist/stream/multi_input_stream.test.cjs.map +1 -0
- package/dist/stream/multi_input_stream.test.js +343 -0
- package/dist/stream/multi_input_stream.test.js.map +1 -0
- package/dist/stream/stream_channel.cjs +39 -1
- package/dist/stream/stream_channel.cjs.map +1 -1
- package/dist/stream/stream_channel.d.cts +5 -2
- package/dist/stream/stream_channel.d.ts +5 -2
- package/dist/stream/stream_channel.d.ts.map +1 -1
- package/dist/stream/stream_channel.js +39 -1
- package/dist/stream/stream_channel.js.map +1 -1
- package/dist/stream/stream_channel.test.cjs +27 -0
- package/dist/stream/stream_channel.test.cjs.map +1 -1
- package/dist/stream/stream_channel.test.js +27 -0
- package/dist/stream/stream_channel.test.js.map +1 -1
- package/dist/stt/stream_adapter.cjs +24 -9
- package/dist/stt/stream_adapter.cjs.map +1 -1
- package/dist/stt/stream_adapter.d.cts +7 -3
- package/dist/stt/stream_adapter.d.ts +7 -3
- package/dist/stt/stream_adapter.d.ts.map +1 -1
- package/dist/stt/stream_adapter.js +24 -9
- package/dist/stt/stream_adapter.js.map +1 -1
- package/dist/stt/stt.cjs +94 -19
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.cts +68 -5
- package/dist/stt/stt.d.ts +68 -5
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +96 -21
- package/dist/stt/stt.js.map +1 -1
- package/dist/telemetry/index.cjs +72 -0
- package/dist/telemetry/index.cjs.map +1 -0
- package/dist/telemetry/index.d.cts +7 -0
- package/dist/telemetry/index.d.ts +7 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +37 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/logging.cjs +65 -0
- package/dist/telemetry/logging.cjs.map +1 -0
- package/dist/telemetry/logging.d.cts +21 -0
- package/dist/telemetry/logging.d.ts +21 -0
- package/dist/telemetry/logging.d.ts.map +1 -0
- package/dist/telemetry/logging.js +40 -0
- package/dist/telemetry/logging.js.map +1 -0
- package/dist/telemetry/otel_http_exporter.cjs +166 -0
- package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
- package/dist/telemetry/otel_http_exporter.d.cts +63 -0
- package/dist/telemetry/otel_http_exporter.d.ts +63 -0
- package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
- package/dist/telemetry/otel_http_exporter.js +142 -0
- package/dist/telemetry/otel_http_exporter.js.map +1 -0
- package/dist/telemetry/pino_otel_transport.cjs +217 -0
- package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
- package/dist/telemetry/pino_otel_transport.d.cts +58 -0
- package/dist/telemetry/pino_otel_transport.d.ts +58 -0
- package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
- package/dist/telemetry/pino_otel_transport.js +189 -0
- package/dist/telemetry/pino_otel_transport.js.map +1 -0
- package/dist/telemetry/trace_types.cjs +233 -0
- package/dist/telemetry/trace_types.cjs.map +1 -0
- package/dist/telemetry/trace_types.d.cts +74 -0
- package/dist/telemetry/trace_types.d.ts +74 -0
- package/dist/telemetry/trace_types.d.ts.map +1 -0
- package/dist/telemetry/trace_types.js +141 -0
- package/dist/telemetry/trace_types.js.map +1 -0
- package/dist/telemetry/traces.cjs +484 -0
- package/dist/telemetry/traces.cjs.map +1 -0
- package/dist/telemetry/traces.d.cts +116 -0
- package/dist/telemetry/traces.d.ts +116 -0
- package/dist/telemetry/traces.d.ts.map +1 -0
- package/dist/telemetry/traces.js +449 -0
- package/dist/telemetry/traces.js.map +1 -0
- package/dist/telemetry/utils.cjs +86 -0
- package/dist/telemetry/utils.cjs.map +1 -0
- package/dist/telemetry/utils.d.cts +5 -0
- package/dist/telemetry/utils.d.ts +5 -0
- package/dist/telemetry/utils.d.ts.map +1 -0
- package/dist/telemetry/utils.js +51 -0
- package/dist/telemetry/utils.js.map +1 -0
- package/dist/tokenize/basic/sentence.cjs +3 -3
- package/dist/tokenize/basic/sentence.cjs.map +1 -1
- package/dist/tokenize/basic/sentence.js +3 -3
- package/dist/tokenize/basic/sentence.js.map +1 -1
- package/dist/tokenize/tokenizer.test.cjs +3 -1
- package/dist/tokenize/tokenizer.test.cjs.map +1 -1
- package/dist/tokenize/tokenizer.test.js +3 -1
- package/dist/tokenize/tokenizer.test.js.map +1 -1
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.cts +6 -0
- package/dist/transcription.d.ts +6 -0
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js.map +1 -1
- package/dist/tts/fallback_adapter.cjs +472 -0
- package/dist/tts/fallback_adapter.cjs.map +1 -0
- package/dist/tts/fallback_adapter.d.cts +110 -0
- package/dist/tts/fallback_adapter.d.ts +110 -0
- package/dist/tts/fallback_adapter.d.ts.map +1 -0
- package/dist/tts/fallback_adapter.js +448 -0
- package/dist/tts/fallback_adapter.js.map +1 -0
- package/dist/tts/index.cjs +3 -0
- package/dist/tts/index.cjs.map +1 -1
- package/dist/tts/index.d.cts +1 -0
- package/dist/tts/index.d.ts +1 -0
- package/dist/tts/index.d.ts.map +1 -1
- package/dist/tts/index.js +2 -0
- package/dist/tts/index.js.map +1 -1
- package/dist/tts/stream_adapter.cjs +25 -8
- package/dist/tts/stream_adapter.cjs.map +1 -1
- package/dist/tts/stream_adapter.d.cts +6 -3
- package/dist/tts/stream_adapter.d.ts +6 -3
- package/dist/tts/stream_adapter.d.ts.map +1 -1
- package/dist/tts/stream_adapter.js +25 -8
- package/dist/tts/stream_adapter.js.map +1 -1
- package/dist/tts/tts.cjs +189 -57
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.cts +58 -6
- package/dist/tts/tts.d.ts +58 -6
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +191 -59
- package/dist/tts/tts.js.map +1 -1
- package/dist/typed_promise.cjs +48 -0
- package/dist/typed_promise.cjs.map +1 -0
- package/dist/typed_promise.d.cts +24 -0
- package/dist/typed_promise.d.ts +24 -0
- package/dist/typed_promise.d.ts.map +1 -0
- package/dist/typed_promise.js +28 -0
- package/dist/typed_promise.js.map +1 -0
- package/dist/types.cjs +24 -32
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +45 -10
- package/dist/types.d.ts +45 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -30
- package/dist/types.js.map +1 -1
- package/dist/utils.cjs +124 -28
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +41 -1
- package/dist/utils.d.ts +41 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +119 -27
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.cjs +73 -1
- package/dist/utils.test.cjs.map +1 -1
- package/dist/utils.test.js +74 -10
- package/dist/utils.test.js.map +1 -1
- package/dist/vad.cjs +35 -15
- package/dist/vad.cjs.map +1 -1
- package/dist/vad.d.cts +15 -5
- package/dist/vad.d.ts +15 -5
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js +35 -15
- package/dist/vad.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice/agent.cjs +258 -35
- package/dist/voice/agent.cjs.map +1 -1
- package/dist/voice/agent.d.cts +54 -13
- package/dist/voice/agent.d.ts +54 -13
- package/dist/voice/agent.d.ts.map +1 -1
- package/dist/voice/agent.js +254 -34
- package/dist/voice/agent.js.map +1 -1
- package/dist/voice/agent.test.cjs +314 -0
- package/dist/voice/agent.test.cjs.map +1 -1
- package/dist/voice/agent.test.js +316 -2
- package/dist/voice/agent.test.js.map +1 -1
- package/dist/voice/agent_activity.cjs +1116 -385
- package/dist/voice/agent_activity.cjs.map +1 -1
- package/dist/voice/agent_activity.d.cts +72 -11
- package/dist/voice/agent_activity.d.ts +72 -11
- package/dist/voice/agent_activity.d.ts.map +1 -1
- package/dist/voice/agent_activity.js +1119 -383
- package/dist/voice/agent_activity.js.map +1 -1
- package/dist/voice/agent_activity.test.cjs +135 -0
- package/dist/voice/agent_activity.test.cjs.map +1 -0
- package/dist/voice/agent_activity.test.js +134 -0
- package/dist/voice/agent_activity.test.js.map +1 -0
- package/dist/voice/agent_session.cjs +550 -90
- package/dist/voice/agent_session.cjs.map +1 -1
- package/dist/voice/agent_session.d.cts +185 -25
- package/dist/voice/agent_session.d.ts +185 -25
- package/dist/voice/agent_session.d.ts.map +1 -1
- package/dist/voice/agent_session.js +556 -91
- package/dist/voice/agent_session.js.map +1 -1
- package/dist/voice/audio_recognition.cjs +605 -46
- package/dist/voice/audio_recognition.cjs.map +1 -1
- package/dist/voice/audio_recognition.d.cts +96 -4
- package/dist/voice/audio_recognition.d.ts +96 -4
- package/dist/voice/audio_recognition.d.ts.map +1 -1
- package/dist/voice/audio_recognition.js +611 -47
- package/dist/voice/audio_recognition.js.map +1 -1
- package/dist/voice/audio_recognition_span.test.cjs +295 -0
- package/dist/voice/audio_recognition_span.test.cjs.map +1 -0
- package/dist/voice/audio_recognition_span.test.js +299 -0
- package/dist/voice/audio_recognition_span.test.js.map +1 -0
- package/dist/voice/avatar/datastream_io.cjs +7 -1
- package/dist/voice/avatar/datastream_io.cjs.map +1 -1
- package/dist/voice/avatar/datastream_io.d.cts +1 -0
- package/dist/voice/avatar/datastream_io.d.ts +1 -0
- package/dist/voice/avatar/datastream_io.d.ts.map +1 -1
- package/dist/voice/avatar/datastream_io.js +7 -1
- package/dist/voice/avatar/datastream_io.js.map +1 -1
- package/dist/voice/background_audio.cjs +367 -0
- package/dist/voice/background_audio.cjs.map +1 -0
- package/dist/voice/background_audio.d.cts +123 -0
- package/dist/voice/background_audio.d.ts +123 -0
- package/dist/voice/background_audio.d.ts.map +1 -0
- package/dist/voice/background_audio.js +343 -0
- package/dist/voice/background_audio.js.map +1 -0
- package/dist/voice/events.cjs +3 -0
- package/dist/voice/events.cjs.map +1 -1
- package/dist/voice/events.d.cts +16 -9
- package/dist/voice/events.d.ts +16 -9
- package/dist/voice/events.d.ts.map +1 -1
- package/dist/voice/events.js +3 -0
- package/dist/voice/events.js.map +1 -1
- package/dist/voice/generation.cjs +205 -41
- package/dist/voice/generation.cjs.map +1 -1
- package/dist/voice/generation.d.cts +21 -5
- package/dist/voice/generation.d.ts +21 -5
- package/dist/voice/generation.d.ts.map +1 -1
- package/dist/voice/generation.js +215 -43
- package/dist/voice/generation.js.map +1 -1
- package/dist/voice/generation_tools.test.cjs +236 -0
- package/dist/voice/generation_tools.test.cjs.map +1 -0
- package/dist/voice/generation_tools.test.js +235 -0
- package/dist/voice/generation_tools.test.js.map +1 -0
- package/dist/voice/index.cjs +33 -2
- package/dist/voice/index.cjs.map +1 -1
- package/dist/voice/index.d.cts +8 -2
- package/dist/voice/index.d.ts +8 -2
- package/dist/voice/index.d.ts.map +1 -1
- package/dist/voice/index.js +19 -2
- package/dist/voice/index.js.map +1 -1
- package/dist/voice/interruption_detection.test.cjs +114 -0
- package/dist/voice/interruption_detection.test.cjs.map +1 -0
- package/dist/voice/interruption_detection.test.js +113 -0
- package/dist/voice/interruption_detection.test.js.map +1 -0
- package/dist/voice/io.cjs +66 -6
- package/dist/voice/io.cjs.map +1 -1
- package/dist/voice/io.d.cts +67 -7
- package/dist/voice/io.d.ts +67 -7
- package/dist/voice/io.d.ts.map +1 -1
- package/dist/voice/io.js +62 -5
- package/dist/voice/io.js.map +1 -1
- package/dist/voice/recorder_io/index.cjs +23 -0
- package/dist/voice/recorder_io/index.cjs.map +1 -0
- package/dist/voice/recorder_io/index.d.cts +2 -0
- package/dist/voice/recorder_io/index.d.ts +2 -0
- package/dist/voice/recorder_io/index.d.ts.map +1 -0
- package/dist/voice/recorder_io/index.js +2 -0
- package/dist/voice/recorder_io/index.js.map +1 -0
- package/dist/voice/recorder_io/recorder_io.cjs +607 -0
- package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
- package/dist/voice/recorder_io/recorder_io.d.cts +106 -0
- package/dist/voice/recorder_io/recorder_io.d.ts +106 -0
- package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
- package/dist/voice/recorder_io/recorder_io.js +573 -0
- package/dist/voice/recorder_io/recorder_io.js.map +1 -0
- package/dist/voice/remote_session.cjs +922 -0
- package/dist/voice/remote_session.cjs.map +1 -0
- package/dist/voice/remote_session.d.cts +108 -0
- package/dist/voice/remote_session.d.ts +108 -0
- package/dist/voice/remote_session.d.ts.map +1 -0
- package/dist/voice/remote_session.js +887 -0
- package/dist/voice/remote_session.js.map +1 -0
- package/dist/voice/report.cjs +88 -0
- package/dist/voice/report.cjs.map +1 -0
- package/dist/voice/report.d.cts +49 -0
- package/dist/voice/report.d.ts +49 -0
- package/dist/voice/report.d.ts.map +1 -0
- package/dist/voice/report.js +63 -0
- package/dist/voice/report.js.map +1 -0
- package/dist/voice/report.test.cjs +121 -0
- package/dist/voice/report.test.cjs.map +1 -0
- package/dist/voice/report.test.js +120 -0
- package/dist/voice/report.test.js.map +1 -0
- package/dist/voice/room_io/_input.cjs +40 -7
- package/dist/voice/room_io/_input.cjs.map +1 -1
- package/dist/voice/room_io/_input.d.cts +5 -2
- package/dist/voice/room_io/_input.d.ts +5 -2
- package/dist/voice/room_io/_input.d.ts.map +1 -1
- package/dist/voice/room_io/_input.js +41 -8
- package/dist/voice/room_io/_input.js.map +1 -1
- package/dist/voice/room_io/_output.cjs +19 -11
- package/dist/voice/room_io/_output.cjs.map +1 -1
- package/dist/voice/room_io/_output.d.cts +7 -4
- package/dist/voice/room_io/_output.d.ts +7 -4
- package/dist/voice/room_io/_output.d.ts.map +1 -1
- package/dist/voice/room_io/_output.js +20 -12
- package/dist/voice/room_io/_output.js.map +1 -1
- package/dist/voice/room_io/room_io.cjs +33 -6
- package/dist/voice/room_io/room_io.cjs.map +1 -1
- package/dist/voice/room_io/room_io.d.cts +29 -9
- package/dist/voice/room_io/room_io.d.ts +29 -9
- package/dist/voice/room_io/room_io.d.ts.map +1 -1
- package/dist/voice/room_io/room_io.js +33 -7
- package/dist/voice/room_io/room_io.js.map +1 -1
- package/dist/voice/speech_handle.cjs +22 -4
- package/dist/voice/speech_handle.cjs.map +1 -1
- package/dist/voice/speech_handle.d.cts +17 -2
- package/dist/voice/speech_handle.d.ts +17 -2
- package/dist/voice/speech_handle.d.ts.map +1 -1
- package/dist/voice/speech_handle.js +21 -4
- package/dist/voice/speech_handle.js.map +1 -1
- package/dist/voice/testing/fake_llm.cjs +127 -0
- package/dist/voice/testing/fake_llm.cjs.map +1 -0
- package/dist/voice/testing/fake_llm.d.cts +30 -0
- package/dist/voice/testing/fake_llm.d.ts +30 -0
- package/dist/voice/testing/fake_llm.d.ts.map +1 -0
- package/dist/voice/testing/fake_llm.js +103 -0
- package/dist/voice/testing/fake_llm.js.map +1 -0
- package/dist/voice/testing/index.cjs +57 -0
- package/dist/voice/testing/index.cjs.map +1 -0
- package/dist/voice/testing/index.d.cts +21 -0
- package/dist/voice/testing/index.d.ts +21 -0
- package/dist/voice/testing/index.d.ts.map +1 -0
- package/dist/voice/testing/index.js +35 -0
- package/dist/voice/testing/index.js.map +1 -0
- package/dist/voice/testing/run_result.cjs +817 -0
- package/dist/voice/testing/run_result.cjs.map +1 -0
- package/dist/voice/testing/run_result.d.cts +385 -0
- package/dist/voice/testing/run_result.d.ts +385 -0
- package/dist/voice/testing/run_result.d.ts.map +1 -0
- package/dist/voice/testing/run_result.js +790 -0
- package/dist/voice/testing/run_result.js.map +1 -0
- package/dist/voice/testing/types.cjs +46 -0
- package/dist/voice/testing/types.cjs.map +1 -0
- package/dist/voice/testing/types.d.cts +83 -0
- package/dist/voice/testing/types.d.ts +83 -0
- package/dist/voice/testing/types.d.ts.map +1 -0
- package/dist/voice/testing/types.js +19 -0
- package/dist/voice/testing/types.js.map +1 -0
- package/dist/voice/transcription/synchronizer.cjs +139 -15
- package/dist/voice/transcription/synchronizer.cjs.map +1 -1
- package/dist/voice/transcription/synchronizer.d.cts +35 -4
- package/dist/voice/transcription/synchronizer.d.ts +35 -4
- package/dist/voice/transcription/synchronizer.d.ts.map +1 -1
- package/dist/voice/transcription/synchronizer.js +143 -16
- package/dist/voice/transcription/synchronizer.js.map +1 -1
- package/dist/voice/transcription/synchronizer.test.cjs +151 -0
- package/dist/voice/transcription/synchronizer.test.cjs.map +1 -0
- package/dist/voice/transcription/synchronizer.test.js +150 -0
- package/dist/voice/transcription/synchronizer.test.js.map +1 -0
- package/dist/voice/turn_config/endpointing.cjs +33 -0
- package/dist/voice/turn_config/endpointing.cjs.map +1 -0
- package/dist/voice/turn_config/endpointing.d.cts +30 -0
- package/dist/voice/turn_config/endpointing.d.ts +30 -0
- package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
- package/dist/voice/turn_config/endpointing.js +9 -0
- package/dist/voice/turn_config/endpointing.js.map +1 -0
- package/dist/voice/turn_config/interruption.cjs +37 -0
- package/dist/voice/turn_config/interruption.cjs.map +1 -0
- package/dist/voice/turn_config/interruption.d.cts +53 -0
- package/dist/voice/turn_config/interruption.d.ts +53 -0
- package/dist/voice/turn_config/interruption.d.ts.map +1 -0
- package/dist/voice/turn_config/interruption.js +13 -0
- package/dist/voice/turn_config/interruption.js.map +1 -0
- package/dist/voice/turn_config/turn_handling.cjs +35 -0
- package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
- package/dist/voice/turn_config/turn_handling.d.cts +36 -0
- package/dist/voice/turn_config/turn_handling.d.ts +36 -0
- package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
- package/dist/voice/turn_config/turn_handling.js +11 -0
- package/dist/voice/turn_config/turn_handling.js.map +1 -0
- package/dist/voice/turn_config/utils.cjs +157 -0
- package/dist/voice/turn_config/utils.cjs.map +1 -0
- package/dist/voice/turn_config/utils.d.cts +37 -0
- package/dist/voice/turn_config/utils.d.ts +37 -0
- package/dist/voice/turn_config/utils.d.ts.map +1 -0
- package/dist/voice/turn_config/utils.js +131 -0
- package/dist/voice/turn_config/utils.js.map +1 -0
- package/dist/voice/turn_config/utils.test.cjs +128 -0
- package/dist/voice/turn_config/utils.test.cjs.map +1 -0
- package/dist/voice/turn_config/utils.test.js +127 -0
- package/dist/voice/turn_config/utils.test.js.map +1 -0
- package/dist/voice/utils.cjs +47 -0
- package/dist/voice/utils.cjs.map +1 -0
- package/dist/voice/utils.d.cts +4 -0
- package/dist/voice/utils.d.ts +4 -0
- package/dist/voice/utils.d.ts.map +1 -0
- package/dist/voice/utils.js +23 -0
- package/dist/voice/utils.js.map +1 -0
- package/dist/worker.cjs +44 -52
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +18 -8
- package/dist/worker.d.ts +18 -8
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +43 -43
- package/dist/worker.js.map +1 -1
- package/package.json +35 -13
- package/resources/NOTICE +2 -0
- package/resources/keyboard-typing.ogg +0 -0
- package/resources/keyboard-typing2.ogg +0 -0
- package/resources/office-ambience.ogg +0 -0
- package/src/_exceptions.ts +5 -0
- package/src/audio.ts +132 -1
- package/src/beta/index.ts +9 -0
- package/src/beta/workflows/index.ts +9 -0
- package/src/beta/workflows/task_group.ts +203 -0
- package/src/cli.ts +57 -66
- package/src/connection_pool.test.ts +346 -0
- package/src/connection_pool.ts +307 -0
- package/src/constants.ts +14 -0
- package/src/cpu.test.ts +239 -0
- package/src/cpu.ts +173 -0
- package/src/http_server.ts +18 -6
- package/src/index.ts +15 -13
- package/src/inference/api_protos.ts +85 -2
- package/src/inference/index.ts +32 -4
- package/src/inference/interruption/defaults.ts +51 -0
- package/src/inference/interruption/errors.ts +25 -0
- package/src/inference/interruption/http_transport.ts +207 -0
- package/src/inference/interruption/interruption_cache_entry.ts +50 -0
- package/src/inference/interruption/interruption_detector.ts +204 -0
- package/src/inference/interruption/interruption_stream.ts +467 -0
- package/src/inference/interruption/types.ts +84 -0
- package/src/inference/interruption/utils.test.ts +132 -0
- package/src/inference/interruption/utils.ts +137 -0
- package/src/inference/interruption/ws_transport.ts +416 -0
- package/src/inference/llm.ts +214 -163
- package/src/inference/stt.test.ts +253 -0
- package/src/inference/stt.ts +449 -208
- package/src/inference/tts.test.ts +354 -0
- package/src/inference/tts.ts +417 -115
- package/src/inference/utils.ts +30 -2
- package/src/ipc/inference_proc_executor.ts +11 -3
- package/src/ipc/inference_proc_lazy_main.ts +13 -1
- package/src/ipc/job_proc_executor.ts +11 -1
- package/src/ipc/job_proc_lazy_main.ts +86 -20
- package/src/ipc/supervised_proc.test.ts +153 -0
- package/src/ipc/supervised_proc.ts +39 -10
- package/src/job.ts +120 -1
- package/src/language.test.ts +62 -0
- package/src/language.ts +380 -0
- package/src/llm/__snapshots__/zod-utils.test.ts.snap +559 -0
- package/src/llm/chat_context.test.ts +787 -0
- package/src/llm/chat_context.ts +493 -2
- package/src/llm/fallback_adapter.test.ts +238 -0
- package/src/llm/fallback_adapter.ts +394 -0
- package/src/llm/index.ts +13 -0
- package/src/llm/llm.ts +77 -12
- package/src/llm/provider_format/google.test.ts +72 -1
- package/src/llm/provider_format/google.ts +10 -6
- package/src/llm/provider_format/index.ts +7 -2
- package/src/llm/provider_format/openai.test.ts +480 -2
- package/src/llm/provider_format/openai.ts +152 -21
- package/src/llm/provider_format/utils.ts +11 -5
- package/src/llm/realtime.ts +23 -2
- package/src/llm/remote_chat_context.ts +2 -2
- package/src/llm/tool_context.test.ts +210 -1
- package/src/llm/tool_context.ts +115 -17
- package/src/llm/utils.test.ts +103 -2
- package/src/llm/utils.ts +152 -16
- package/src/llm/zod-utils.test.ts +577 -0
- package/src/llm/zod-utils.ts +153 -0
- package/src/log.ts +71 -19
- package/src/metrics/base.ts +78 -19
- package/src/metrics/index.ts +12 -0
- package/src/metrics/model_usage.test.ts +545 -0
- package/src/metrics/model_usage.ts +262 -0
- package/src/metrics/usage_collector.ts +14 -3
- package/src/metrics/utils.ts +27 -7
- package/src/stream/deferred_stream.test.ts +3 -3
- package/src/stream/deferred_stream.ts +43 -11
- package/src/stream/index.ts +1 -0
- package/src/stream/multi_input_stream.test.ts +545 -0
- package/src/stream/multi_input_stream.ts +172 -0
- package/src/stream/stream_channel.test.ts +37 -0
- package/src/stream/stream_channel.ts +43 -3
- package/src/stt/stream_adapter.ts +30 -9
- package/src/stt/stt.ts +140 -23
- package/src/telemetry/index.ts +28 -0
- package/src/telemetry/logging.ts +55 -0
- package/src/telemetry/otel_http_exporter.ts +218 -0
- package/src/telemetry/pino_otel_transport.ts +265 -0
- package/src/telemetry/trace_types.ts +109 -0
- package/src/telemetry/traces.ts +673 -0
- package/src/telemetry/utils.ts +61 -0
- package/src/tokenize/basic/sentence.ts +3 -3
- package/src/tokenize/tokenizer.test.ts +4 -0
- package/src/transcription.ts +6 -0
- package/src/tts/fallback_adapter.ts +586 -0
- package/src/tts/index.ts +1 -0
- package/src/tts/stream_adapter.ts +38 -8
- package/src/tts/tts.ts +245 -62
- package/src/typed_promise.ts +67 -0
- package/src/types.ts +62 -33
- package/src/utils.test.ts +90 -10
- package/src/utils.ts +178 -33
- package/src/vad.ts +42 -18
- package/src/version.ts +1 -1
- package/src/voice/agent.test.ts +347 -2
- package/src/voice/agent.ts +346 -44
- package/src/voice/agent_activity.test.ts +194 -0
- package/src/voice/agent_activity.ts +1457 -388
- package/src/voice/agent_session.ts +817 -112
- package/src/voice/audio_recognition.ts +845 -70
- package/src/voice/audio_recognition_span.test.ts +341 -0
- package/src/voice/avatar/datastream_io.ts +9 -1
- package/src/voice/background_audio.ts +494 -0
- package/src/voice/events.ts +27 -7
- package/src/voice/generation.ts +310 -56
- package/src/voice/generation_tools.test.ts +268 -0
- package/src/voice/index.ts +17 -3
- package/src/voice/interruption_detection.test.ts +151 -0
- package/src/voice/io.ts +115 -12
- package/src/voice/recorder_io/index.ts +4 -0
- package/src/voice/recorder_io/recorder_io.ts +783 -0
- package/src/voice/remote_session.ts +1083 -0
- package/src/voice/report.test.ts +136 -0
- package/src/voice/report.ts +140 -0
- package/src/voice/room_io/_input.ts +45 -10
- package/src/voice/room_io/_output.ts +26 -14
- package/src/voice/room_io/room_io.ts +67 -22
- package/src/voice/speech_handle.ts +38 -6
- package/src/voice/testing/fake_llm.ts +138 -0
- package/src/voice/testing/index.ts +52 -0
- package/src/voice/testing/run_result.ts +995 -0
- package/src/voice/testing/types.ts +118 -0
- package/src/voice/transcription/synchronizer.test.ts +206 -0
- package/src/voice/transcription/synchronizer.ts +204 -19
- package/src/voice/turn_config/endpointing.ts +33 -0
- package/src/voice/turn_config/interruption.ts +56 -0
- package/src/voice/turn_config/turn_handling.ts +45 -0
- package/src/voice/turn_config/utils.test.ts +148 -0
- package/src/voice/turn_config/utils.ts +167 -0
- package/src/voice/utils.ts +29 -0
- package/src/worker.ts +92 -78
- package/src/llm/__snapshots__/utils.test.ts.snap +0 -65
package/dist/llm/utils.test.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { VideoBufferType, VideoFrame } from "@livekit/rtc-node";
|
|
2
2
|
import sharp from "sharp";
|
|
3
3
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
AgentHandoffItem,
|
|
6
|
+
ChatContext,
|
|
7
|
+
ChatMessage,
|
|
8
|
+
FunctionCall,
|
|
9
|
+
FunctionCallOutput
|
|
10
|
+
} from "./chat_context.js";
|
|
11
|
+
import { computeChatCtxDiff, formatChatHistory, serializeImage } from "./utils.js";
|
|
6
12
|
function createChatMessage(id, content, role = "user") {
|
|
7
13
|
return ChatMessage.create({
|
|
8
14
|
id,
|
|
@@ -243,6 +249,96 @@ describe("computeChatCtxDiff", () => {
|
|
|
243
249
|
]);
|
|
244
250
|
});
|
|
245
251
|
});
|
|
252
|
+
describe("formatChatHistory", () => {
|
|
253
|
+
it("should format mixed chat history items for logging", () => {
|
|
254
|
+
const ctx = new ChatContext([
|
|
255
|
+
ChatMessage.create({
|
|
256
|
+
id: "msg_system",
|
|
257
|
+
role: "system",
|
|
258
|
+
content: "You are helpful.",
|
|
259
|
+
createdAt: 1
|
|
260
|
+
}),
|
|
261
|
+
ChatMessage.create({
|
|
262
|
+
id: "msg_user",
|
|
263
|
+
role: "user",
|
|
264
|
+
content: [
|
|
265
|
+
"Show me my order",
|
|
266
|
+
createImageContent("https://example.com/receipt.png"),
|
|
267
|
+
{ type: "audio_content", frame: [], transcript: "order 123" }
|
|
268
|
+
],
|
|
269
|
+
createdAt: 2
|
|
270
|
+
}),
|
|
271
|
+
FunctionCall.create({
|
|
272
|
+
id: "fn_call",
|
|
273
|
+
callId: "call_1",
|
|
274
|
+
name: "lookup_order",
|
|
275
|
+
args: '{"orderId":"123"}',
|
|
276
|
+
createdAt: 3
|
|
277
|
+
}),
|
|
278
|
+
FunctionCallOutput.create({
|
|
279
|
+
id: "fn_output",
|
|
280
|
+
callId: "call_1",
|
|
281
|
+
name: "lookup_order",
|
|
282
|
+
output: '{"status":"shipped","ok":true}',
|
|
283
|
+
isError: false,
|
|
284
|
+
createdAt: 4
|
|
285
|
+
}),
|
|
286
|
+
AgentHandoffItem.create({
|
|
287
|
+
id: "handoff",
|
|
288
|
+
oldAgentId: "support",
|
|
289
|
+
newAgentId: "returns",
|
|
290
|
+
createdAt: 5
|
|
291
|
+
})
|
|
292
|
+
]);
|
|
293
|
+
expect(formatChatHistory(ctx)).toBe(
|
|
294
|
+
[
|
|
295
|
+
"Chat history (5 items)",
|
|
296
|
+
"",
|
|
297
|
+
"[0] message system",
|
|
298
|
+
" You are helpful.",
|
|
299
|
+
"",
|
|
300
|
+
"[1] message user",
|
|
301
|
+
" Show me my order",
|
|
302
|
+
" [image url=https://example.com/receipt.png]",
|
|
303
|
+
' [audio transcript="order 123"]',
|
|
304
|
+
"",
|
|
305
|
+
"[2] function_call lookup_order call_id=call_1",
|
|
306
|
+
" {",
|
|
307
|
+
' "orderId": "123"',
|
|
308
|
+
" }",
|
|
309
|
+
"",
|
|
310
|
+
"[3] function_call_output lookup_order call_id=call_1",
|
|
311
|
+
" {",
|
|
312
|
+
' "status": "shipped",',
|
|
313
|
+
' "ok": true',
|
|
314
|
+
" }",
|
|
315
|
+
"",
|
|
316
|
+
"[4] agent_handoff",
|
|
317
|
+
" support -> returns"
|
|
318
|
+
].join("\n")
|
|
319
|
+
);
|
|
320
|
+
});
|
|
321
|
+
it("should optionally include ids and timestamps", () => {
|
|
322
|
+
const ctx = new ChatContext([
|
|
323
|
+
FunctionCallOutput.create({
|
|
324
|
+
id: "fn_output",
|
|
325
|
+
callId: "call_1",
|
|
326
|
+
name: "lookup_order",
|
|
327
|
+
output: "plain text error",
|
|
328
|
+
isError: true,
|
|
329
|
+
createdAt: 123.456
|
|
330
|
+
})
|
|
331
|
+
]);
|
|
332
|
+
expect(formatChatHistory(ctx, { includeIds: true, includeTimestamps: true })).toBe(
|
|
333
|
+
[
|
|
334
|
+
"Chat history (1 items)",
|
|
335
|
+
"",
|
|
336
|
+
"[0] function_call_output lookup_order call_id=call_1 error=true id=fn_output created_at=123.456",
|
|
337
|
+
" plain text error"
|
|
338
|
+
].join("\n")
|
|
339
|
+
);
|
|
340
|
+
});
|
|
341
|
+
});
|
|
246
342
|
describe("serializeImage", () => {
|
|
247
343
|
let consoleWarnSpy;
|
|
248
344
|
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":"AAGA,SAAS,iBAAiB,kBAAkB;AAC5C,OAAO,WAAW;AAClB,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AACrD,SAAS,aAAa,mBAAsC;AAC5D,SAAS,oBAAoB,sBAAsB;AAEnD,SAAS,kBACP,IACA,SACA,OAAwC,QAC3B;AACb,SAAO,YAAY,OAAO;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAkB,UAAsC;AAC/D,QAAM,MAAM,IAAI,YAAY;AAC5B,aAAW,WAAW,UAAU;AAC9B,QAAI,MAAM,KAAK,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,mBACP,OACA,kBAA2C,QAC3C,SAKc;AACd,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,mCAAS;AAAA,IACnB,gBAAgB,mCAAS;AAAA,IACzB,iBAAiB,mCAAS;AAAA,IAC1B,QAAQ,CAAC;AAAA,EACX;AACF;AAEA,eAAe,iBAAiB,YAAoB;AAClD,QAAM,cAAc,OAAO,KAAK,YAAY,QAAQ;AACpD,QAAM,eAAe,MAAM,MAAM,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,KAAK,CAAC;AACxF,SAAO,EAAE,aAAa,aAAa;AACrC;AAEA,SAAS,sBACP,OACA,QACA,OACA,aAA8B,gBAAgB,MAClC;AACZ,QAAM,WAAW,eAAe,gBAAgB,QAAQ,IAAI;AAC5D,QAAM,YAAY,IAAI,WAAW,QAAQ,SAAS,QAAQ;AAE1D,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,UAAU;AACnD,cAAU,CAAC,IAAI,MAAM;AACrB,cAAU,IAAI,CAAC,IAAI,MAAM;AACzB,cAAU,IAAI,CAAC,IAAI,MAAM;AACzB,QAAI,aAAa,KAAK,MAAM,MAAM,QAAW;AAC3C,gBAAU,IAAI,CAAC,IAAI,MAAM;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,IAAI,WAAW,WAAW,OAAO,QAAQ,UAAU;AAC5D;AAEA,SAAS,oBAAoB,OAAe,QAA4B;AACtE,QAAM,WAAW;AACjB,QAAM,YAAY,IAAI,WAAW,QAAQ,SAAS,QAAQ;AAE1D,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,OAAO,IAAI,QAAQ,KAAK;AAC9B,gBAAU,GAAG,IAAI,KAAK,MAAO,KAAK,QAAQ,KAAM,GAAG;AACnD,gBAAU,MAAM,CAAC,IAAI,KAAK,MAAO,KAAK,SAAS,KAAM,GAAG;AACxD,gBAAU,MAAM,CAAC,IAAI;AACrB,gBAAU,MAAM,CAAC,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,IAAI,WAAW,WAAW,OAAO,QAAQ,gBAAgB,IAAI;AACtE;AAEA,SAAS,mBAAmB,OAAe,QAAgB,UAAkC;AAC3F,QAAM,WAAW;AACjB,QAAM,YAAY,IAAI,WAAW,QAAQ,SAAS,QAAQ;AAE1D,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,SAAS,IAAI;AACnB,UAAM,UAAU,SAAS,CAAC;AAC1B,cAAU,MAAM,IAAI,QAAQ,CAAC;AAC7B,cAAU,SAAS,CAAC,IAAI,QAAQ,CAAC;AACjC,cAAU,SAAS,CAAC,IAAI,QAAQ,CAAC;AACjC,cAAU,SAAS,CAAC,IAAI,QAAQ,CAAC;AAAA,EACnC;AAEA,SAAO,IAAI,WAAW,WAAW,OAAO,QAAQ,gBAAgB,IAAI;AACtE;AAEA,SAAS,gBAAgB,aAAqB;AAC5C,SAAO,YAAY,CAAC,CAAC,EAAE,KAAK,GAAI;AAChC,SAAO,YAAY,CAAC,CAAC,EAAE,KAAK,EAAI;AAChC,SAAO,YAAY,CAAC,CAAC,EAAE,KAAK,EAAI;AAChC,SAAO,YAAY,CAAC,CAAC,EAAE,KAAK,EAAI;AAClC;AAEA,SAAS,YACP,MACA,OACA,UACA;AACA,SAAO,KAAK,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC;AACnC,SAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AACvC,SAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AACvC,SAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AACzC;AAEA,SAAS,sBAAsB,MAAM;AACnC,KAAG,yDAAyD,MAAM;AAChE,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAE3D,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAC7C,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAE7C,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC;AAED,KAAG,mCAAmC,MAAM;AAC1C,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAE3D,UAAM,SAAS,kBAAkB,CAAC,CAAC;AACnC,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAE7C,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,WAAO,OAAO,QAAQ,EAAE,QAAQ;AAAA,MAC9B,CAAC,MAAM,GAAG;AAAA;AAAA,MACV,CAAC,KAAK,GAAG;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AAED,KAAG,mCAAmC,MAAM;AAC1C,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAE3D,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAC7C,UAAM,SAAS,kBAAkB,CAAC,CAAC;AAEnC,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAC1C,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC;AAED,KAAG,yCAAyC,MAAM;AAChD,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAE1D,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAC7C,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AAEnD,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9C,CAAC;AAED,KAAG,6CAA6C,MAAM;AACpD,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAE1D,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AACnD,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAE7C,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC;AACrC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC;AAED,KAAG,+CAA+C,MAAM;AACtD,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAE1D,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAC7C,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AAEnD,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAAA,EAC/C,CAAC;AAED,KAAG,mDAAmD,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAE1D,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AACnD,UAAM,SAAS,kBAAkB,CAAC,MAAM,IAAI,CAAC;AAE7C,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC;AACrC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC;AAED,KAAG,4CAA4C,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,eAAe,WAAW;AAE9D,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AACnD,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC;AAEzD,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9C,CAAC;AAED,KAAG,gDAAgD,MAAM;AACvD,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,eAAe,WAAW;AAE9D,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC;AACzD,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AAEnD,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC;AACrC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC;AAED,KAAG,0CAA0C,MAAM;AACjD,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,eAAe,WAAW;AAC9D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,kBAAkB,WAAW;AAOjE,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC;AACzD,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC;AAEzD,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAC1C,WAAO,OAAO,QAAQ,EAAE,QAAQ;AAAA,MAC9B,CAAC,KAAK,GAAG;AAAA,MACT,CAAC,KAAK,GAAG;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AAED,KAAG,kCAAkC,MAAM;AACzC,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAM1D,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AACnD,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AAEnD,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAGhD,WAAO,OAAO,SAAS,SAAS,OAAO,SAAS,MAAM,EAAE,gBAAgB,CAAC;AAAA,EAC3E,CAAC;AAED,KAAG,gDAAgD,MAAM;AACvD,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AAEnD,UAAM,SAAS,kBAAkB,CAAC,IAAI,CAAC;AACvC,UAAM,SAAS,kBAAkB,CAAC,IAAI,CAAC;AAEvC,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC;AAED,KAAG,sDAAsD,MAAM;AAC7D,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,eAAe,WAAW;AAC9D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAM1D,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAC/D,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AAEnD,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAC1C,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC;AAED,KAAG,8DAA8D,MAAM;AACrE,UAAM,OAAO,kBAAkB,KAAK,SAAS,MAAM;AACnD,UAAM,OAAO,kBAAkB,KAAK,YAAY,WAAW;AAC3D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,eAAe,WAAW;AAC9D,UAAM,OAAO,kBAAkB,KAAK,gBAAgB,MAAM;AAC1D,UAAM,OAAO,kBAAkB,KAAK,kBAAkB,WAAW;AAMjE,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,IAAI,CAAC;AACnD,UAAM,SAAS,kBAAkB,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAErE,UAAM,SAAS,mBAAmB,QAAQ,MAAM;AAEhD,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,WAAO,OAAO,QAAQ,EAAE,QAAQ;AAAA,MAC9B,CAAC,KAAK,GAAG;AAAA,MACT,CAAC,KAAK,GAAG;AAAA,MACT,CAAC,KAAK,GAAG;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,MAAM;AAC/B,MAAI;AAEJ,aAAW,MAAM;AACf,qBAAiB,GAAG,MAAM,SAAS,MAAM,EAAE,mBAAmB,MAAM;AAAA,IAAC,CAAC;AACtE,OAAG,cAAc;AAAA,EACnB,CAAC;AAED,WAAS,qBAAqB,MAAM;AAClC,OAAG,0CAA0C,YAAY;AACvD,YAAM,iBAAiB;AACvB,YAAM,eAAe,mBAAmB,0BAA0B,cAAc,IAAI,MAAM;AAE1F,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,QAAQ;AAAA,QACrB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAED,aAAO,OAAO,UAAU,EAAE,KAAK,cAAc;AAAA,IAC/C,CAAC;AAED,OAAG,yCAAyC,YAAY;AACtD,YAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,QAAQ;AAAA,QACrB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAED,OAAG,0CAA0C,YAAY;AACvD,YAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,QAAQ;AAAA,QACrB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAED,OAAG,yCAAyC,YAAY;AACtD,YAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,QAAQ;AAAA,QACrB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAED,OAAG,iFAAiF,YAAY;AAC9F,YAAM,eAAe,mBAAmB,2CAA2C,QAAQ;AAAA,QACzF,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,cAAc,EAAE;AAAA,QACrB;AAAA,MACF;AACA,aAAO,MAAM,EAAE,QAAQ;AAAA,QACrB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAED,OAAG,kDAAkD,YAAY;AAC/D,YAAM,eAAe,mBAAmB,iCAAiC,MAAM;AAE/E,YAAM,OAAO,eAAe,YAAY,CAAC,EAAE,QAAQ,QAAQ,yBAAyB;AAAA,IACtF,CAAC;AAED,OAAG,gDAAgD,YAAY;AAC7D,YAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,OAAO,eAAe,YAAY,CAAC,EAAE,QAAQ;AAAA,QACjD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,yBAAyB,MAAM;AACtC,OAAG,qDAAqD,YAAY;AAClE,YAAM,eAAe,mBAAmB,iCAAiC,MAAM;AAE/E,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,QAAQ;AAAA,QACrB,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,aAAa;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAED,OAAG,kDAAkD,YAAY;AAC/D,YAAM,eAAe,mBAAmB,iCAAiC,OAAO;AAAA,QAC9E,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,QAAQ;AAAA,QACrB,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,aAAa;AAAA,MACf,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,WAAS,uBAAuB,MAAM;AACpC,OAAG,2DAA2D,YAAY;AACxE,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,aAAa,sBAAsB,OAAO,QAAQ,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AACtF,YAAM,eAAe,mBAAmB,YAAY,MAAM;AAE1D,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,cAAc;AAAA,QAC3B,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AACD,aAAO,OAAO,UAAU,EAAE,YAAY;AACtC,aAAO,OAAO,UAAU,EAAE,QAAQ,oBAAoB;AACtD,aAAO,OAAO,WAAW,EAAE,cAAc;AAEzC,YAAM,EAAE,aAAa,aAAa,IAAI,MAAM,iBAAiB,OAAO,UAAW;AAE/E,sBAAgB,WAAW;AAE3B,aAAO,aAAa,KAAK,KAAK,EAAE,KAAK,KAAK;AAC1C,aAAO,aAAa,KAAK,MAAM,EAAE,KAAK,MAAM;AAC5C,aAAO,aAAa,KAAK,QAAQ,EAAE,KAAK,CAAC;AAEzC,YAAM,cAAc,aAAa;AACjC,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,oBAAY,aAAa,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,OAAG,yDAAyD,YAAY;AACtE,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,aAAa,oBAAoB,OAAO,MAAM;AACpD,YAAM,eAAe,mBAAmB,YAAY,MAAM;AAE1D,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,MAAM,EAAE,cAAc;AAAA,QAC3B,UAAU;AAAA,QACV,iBAAiB;AAAA,MACnB,CAAC;AAED,YAAM,EAAE,aAAa,IAAI,MAAM,iBAAiB,OAAO,UAAW;AAElE,aAAO,aAAa,KAAK,KAAK,EAAE,KAAK,KAAK;AAC1C,aAAO,aAAa,KAAK,MAAM,EAAE,KAAK,MAAM;AAE5C,YAAM,cAAc,aAAa;AAEjC,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,iBAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,gBAAM,OAAO,IAAI,QAAQ,KAAK;AAC9B,gBAAM,YAAY,KAAK,MAAO,KAAK,QAAQ,KAAM,GAAG;AACpD,gBAAM,YAAY,KAAK,MAAO,KAAK,SAAS,KAAM,GAAG;AAErD,sBAAY,aAAa,KAAK,EAAE,GAAG,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,QAC9E;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,0DAA0D,YAAY;AACvE,YAAM,QAAQ;AACd,YAAM,SAAS;AAEf,YAAM,WAAW;AAAA,QACf,CAAC,KAAK,GAAG,GAAG,GAAG;AAAA,QACf,CAAC,GAAG,KAAK,GAAG,GAAG;AAAA,QACf,CAAC,GAAG,GAAG,KAAK,GAAG;AAAA,QACf,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,MACrB;AAEA,YAAM,aAAa,mBAAmB,OAAO,QAAQ,QAAQ;AAC7D,YAAM,eAAe,mBAAmB,YAAY,KAAK;AAEzD,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,YAAM,EAAE,aAAa,IAAI,MAAM,iBAAiB,OAAO,UAAW;AAClE,YAAM,UAAU,aAAa;AAE7B,kBAAY,SAAS,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AACtD,kBAAY,SAAS,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;AACtD,kBAAY,SAAS,QAAQ,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;AAC9D,kBAAY,UAAU,QAAQ,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,IAC1E,CAAC;AAED,OAAG,6CAA6C,YAAY;AAC1D,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,aAAa,sBAAsB,OAAO,QAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;AAE1F,YAAM,eAAe,mBAAmB,YAAY,QAAQ;AAAA,QAC1D,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB,CAAC;AAED,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,YAAM,EAAE,aAAa,IAAI,MAAM,iBAAiB,OAAO,UAAW;AAElE,aAAO,aAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AACtC,aAAO,aAAa,KAAK,MAAM,EAAE,KAAK,CAAC;AAEvC,YAAM,cAAc,aAAa;AACjC,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,eAAO,YAAY,CAAC,CAAC,EAAE,YAAY,KAAK,EAAE;AAC1C,eAAO,YAAY,IAAI,CAAC,CAAC,EAAE,YAAY,KAAK,EAAE;AAC9C,eAAO,YAAY,IAAI,CAAC,CAAC,EAAE,YAAY,KAAK,EAAE;AAC9C,eAAO,YAAY,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,MACrC;AAAA,IACF,CAAC;AAED,OAAG,iDAAiD,YAAY;AAC9D,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,WAAW;AACjB,YAAM,YAAY,IAAI,WAAW,QAAQ,SAAS,QAAQ;AAE1D,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,UAAU;AACnD,kBAAU,CAAC,IAAI;AACf,kBAAU,IAAI,CAAC,IAAI;AACnB,kBAAU,IAAI,CAAC,IAAI;AAAA,MACrB;AAEA,YAAM,aAAa,IAAI,WAAW,WAAW,OAAO,QAAQ,gBAAgB,KAAK;AACjF,YAAM,eAAe,mBAAmB,YAAY,MAAM;AAE1D,YAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,aAAO,OAAO,QAAQ,EAAE,KAAK,WAAW;AAExC,YAAM,EAAE,aAAa,IAAI,MAAM,iBAAiB,OAAO,UAAW;AAElE,aAAO,aAAa,KAAK,QAAQ,EAAE,uBAAuB,CAAC;AAE3D,YAAM,cAAc,aAAa;AACjC,YAAM,kBAAkB,aAAa,KAAK;AAE1C,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,iBAAiB;AAC5D,eAAO,YAAY,CAAC,CAAC,EAAE,KAAK,GAAG;AAC/B,eAAO,YAAY,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG;AACnC,eAAO,YAAY,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;AAClC,YAAI,oBAAoB,GAAG;AACzB,iBAAO,YAAY,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,QACrC;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,uDAAuD,YAAY;AACpE,YAAM,QAAQ;AACd,YAAM,SAAS;AACf,YAAM,cAAc;AAAA,QAClB,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,MAClB;AAEA,iBAAW,UAAU,aAAa;AAChC,cAAM,YAAY,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC;AACrD,cAAM,aAAa,IAAI,WAAW,WAAW,OAAO,QAAQ,MAAM;AAClE,cAAM,eAAe,mBAAmB,YAAY,MAAM;AAE1D,cAAM,SAAS,MAAM,eAAe,YAAY;AAEhD,eAAO,OAAO,QAAQ,EAAE,KAAK,WAAW;AACxC,eAAO,OAAO,UAAU,EAAE,YAAY;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,WAAS,kBAAkB,MAAM;AAC/B,OAAG,iDAAiD,YAAY;AAC9D,YAAM,eAAe,mBAAmB,KAAY,MAAM;AAE1D,YAAM,OAAO,eAAe,YAAY,CAAC,EAAE,QAAQ,QAAQ,wBAAwB;AAAA,IACrF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;","names":[]}
|
|
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":[]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var zod_utils_exports = {};
|
|
30
|
+
__export(zod_utils_exports, {
|
|
31
|
+
isZod4Schema: () => isZod4Schema,
|
|
32
|
+
isZodObjectSchema: () => isZodObjectSchema,
|
|
33
|
+
isZodSchema: () => isZodSchema,
|
|
34
|
+
parseZodSchema: () => parseZodSchema,
|
|
35
|
+
zodSchemaToJsonSchema: () => zodSchemaToJsonSchema
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(zod_utils_exports);
|
|
38
|
+
var import_transform = require("openai/lib/transform");
|
|
39
|
+
var import_zod_to_json_schema = require("zod-to-json-schema");
|
|
40
|
+
var z4 = __toESM(require("zod/v4"), 1);
|
|
41
|
+
function isZod4Schema(schema) {
|
|
42
|
+
return "_zod" in schema;
|
|
43
|
+
}
|
|
44
|
+
function isZodSchema(value) {
|
|
45
|
+
if (typeof value !== "object" || value === null) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if ("_zod" in value) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
if ("_def" in value && typeof value._def === "object" && value._def !== null) {
|
|
52
|
+
const def = value._def;
|
|
53
|
+
if ("typeName" in def) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
function isZodObjectSchema(schema) {
|
|
60
|
+
var _a, _b, _c, _d;
|
|
61
|
+
const schemaWithInternals = schema;
|
|
62
|
+
if (isZod4Schema(schema)) {
|
|
63
|
+
return ((_a = schemaWithInternals._def) == null ? void 0 : _a.type) === "object" || ((_c = (_b = schemaWithInternals._zod) == null ? void 0 : _b.traits) == null ? void 0 : _c.has("ZodObject")) || false;
|
|
64
|
+
}
|
|
65
|
+
return ((_d = schemaWithInternals._def) == null ? void 0 : _d.typeName) === "ZodObject";
|
|
66
|
+
}
|
|
67
|
+
function zodSchemaToJsonSchema(schema, isOpenai = true, strict = false) {
|
|
68
|
+
let result;
|
|
69
|
+
if (isZod4Schema(schema)) {
|
|
70
|
+
result = z4.toJSONSchema(schema, {
|
|
71
|
+
target: "draft-7",
|
|
72
|
+
io: "output",
|
|
73
|
+
reused: "inline"
|
|
74
|
+
// Don't use references by default (to support openapi conversion for google)
|
|
75
|
+
});
|
|
76
|
+
} else {
|
|
77
|
+
result = (0, import_zod_to_json_schema.zodToJsonSchema)(schema, {
|
|
78
|
+
target: isOpenai ? "openAi" : "jsonSchema7",
|
|
79
|
+
$refStrategy: "none"
|
|
80
|
+
// Don't use references by default (to support openapi conversion for google)
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return strict ? (0, import_transform.toStrictJsonSchema)(result) : result;
|
|
84
|
+
}
|
|
85
|
+
async function parseZodSchema(schema, value) {
|
|
86
|
+
if (isZod4Schema(schema)) {
|
|
87
|
+
const result = await z4.safeParseAsync(schema, value);
|
|
88
|
+
return result;
|
|
89
|
+
} else {
|
|
90
|
+
const result = await schema.safeParseAsync(value);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
95
|
+
0 && (module.exports = {
|
|
96
|
+
isZod4Schema,
|
|
97
|
+
isZodObjectSchema,
|
|
98
|
+
isZodSchema,
|
|
99
|
+
parseZodSchema,
|
|
100
|
+
zodSchemaToJsonSchema
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=zod-utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/llm/zod-utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { toStrictJsonSchema } from 'openai/lib/transform';\nimport { zodToJsonSchema as zodToJsonSchemaV3 } from 'zod-to-json-schema';\nimport type * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\n\n/**\n * Result type from Zod schema parsing.\n */\nexport type ZodParseResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; error: unknown };\n\n/**\n * Type definition for Zod schemas that works with both v3 and v4.\n * Uses a union type of both Zod v3 and v4 schema types.\n *\n * Adapted from Vercel AI SDK's zodSchema function signature.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L278-L281\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ZodSchema = z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>;\n\n/**\n * Detects if a schema is a Zod v4 schema.\n * Zod v4 schemas have a `_zod` property that v3 schemas don't have.\n *\n * @param schema - The schema to check\n * @returns True if the schema is a Zod v4 schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Required to match Zod v4's type signature\nexport function isZod4Schema(schema: ZodSchema): schema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in schema;\n}\n\n/**\n * Checks if a value is a Zod schema (either v3 or v4).\n *\n * @param value - The value to check\n * @returns True if the value is a Zod schema\n */\nexport function isZodSchema(value: unknown): value is ZodSchema {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n // Check for v4 schema (_zod property)\n if ('_zod' in value) {\n return true;\n }\n\n // Check for v3 schema (_def property with typeName)\n if ('_def' in value && typeof value._def === 'object' && value._def !== null) {\n const def = value._def as Record<string, unknown>;\n if ('typeName' in def) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Checks if a Zod schema is an object schema.\n *\n * @param schema - The schema to check\n * @returns True if the schema is an object schema\n */\nexport function isZodObjectSchema(schema: ZodSchema): boolean {\n // Need to access internal Zod properties to check schema type\n const schemaWithInternals = schema as {\n _def?: { type?: string; typeName?: string };\n _zod?: { traits?: Set<string> };\n };\n\n // Check for v4 schema first\n if (isZod4Schema(schema)) {\n // v4 uses _def.type and _zod.traits\n return (\n schemaWithInternals._def?.type === 'object' ||\n schemaWithInternals._zod?.traits?.has('ZodObject') ||\n false\n );\n }\n\n // v3 uses _def.typeName\n return schemaWithInternals._def?.typeName === 'ZodObject';\n}\n\n/**\n * Converts a Zod schema to JSON Schema format.\n * Handles both Zod v3 and v4 schemas automatically.\n *\n * Adapted from Vercel AI SDK's zod3Schema and zod4Schema functions.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L237-L269\n *\n * @param schema - The Zod schema to convert\n * @param isOpenai - Whether to use OpenAI-specific formatting (default: true)\n * @returns A JSON Schema representation of the Zod schema\n */\nexport function zodSchemaToJsonSchema(\n schema: ZodSchema,\n isOpenai: boolean = true,\n strict: boolean = false,\n): JSONSchema7 {\n let result: JSONSchema7;\n\n if (isZod4Schema(schema)) {\n // Zod v4 has native toJSONSchema support\n // Configuration adapted from Vercel AI SDK to support OpenAPI conversion for Google\n // Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L255-L258\n result = z4.toJSONSchema(schema, {\n target: 'draft-7',\n io: 'output',\n reused: 'inline', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n } else {\n // Zod v3 requires the zod-to-json-schema library\n // Configuration adapted from Vercel AI SDK\n // $refStrategy: 'none' is equivalent to v4's reused: 'inline'\n result = zodToJsonSchemaV3(schema, {\n target: isOpenai ? 'openAi' : 'jsonSchema7',\n $refStrategy: 'none', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n }\n\n return strict ? (toStrictJsonSchema(result) as JSONSchema7) : result;\n}\n\n/**\n * Parses a value against a Zod schema.\n * Handles both Zod v3 and v4 parse APIs automatically.\n *\n * @param schema - The Zod schema to parse against\n * @param value - The value to parse\n * @returns A promise that resolves to the parse result\n */\nexport async function parseZodSchema<T = unknown>(\n schema: ZodSchema,\n value: unknown,\n): Promise<ZodParseResult<T>> {\n if (isZod4Schema(schema)) {\n const result = await z4.safeParseAsync(schema, value);\n return result as ZodParseResult<T>;\n } else {\n const result = await schema.safeParseAsync(value);\n return result as ZodParseResult<T>;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,uBAAmC;AACnC,gCAAqD;AAErD,SAAoB;AA2Bb,SAAS,aAAa,QAAyD;AAEpF,SAAO,UAAU;AACnB;AAQO,SAAS,YAAY,OAAoC;AAC9D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,SAAS,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,MAAM;AAC5E,UAAM,MAAM,MAAM;AAClB,QAAI,cAAc,KAAK;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,kBAAkB,QAA4B;AAxE9D;AA0EE,QAAM,sBAAsB;AAM5B,MAAI,aAAa,MAAM,GAAG;AAExB,aACE,yBAAoB,SAApB,mBAA0B,UAAS,cACnC,+BAAoB,SAApB,mBAA0B,WAA1B,mBAAkC,IAAI,iBACtC;AAAA,EAEJ;AAGA,WAAO,yBAAoB,SAApB,mBAA0B,cAAa;AAChD;AAaO,SAAS,sBACd,QACA,WAAoB,MACpB,SAAkB,OACL;AACb,MAAI;AAEJ,MAAI,aAAa,MAAM,GAAG;AAIxB,aAAS,GAAG,aAAa,QAAQ;AAAA,MAC/B,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AAIL,iBAAS,0BAAAA,iBAAkB,QAAQ;AAAA,MACjC,QAAQ,WAAW,WAAW;AAAA,MAC9B,cAAc;AAAA;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO,aAAU,qCAAmB,MAAM,IAAoB;AAChE;AAUA,eAAsB,eACpB,QACA,OAC4B;AAC5B,MAAI,aAAa,MAAM,GAAG;AACxB,UAAM,SAAS,MAAM,GAAG,eAAe,QAAQ,KAAK;AACpD,WAAO;AAAA,EACT,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,eAAe,KAAK;AAChD,WAAO;AAAA,EACT;AACF;","names":["zodToJsonSchemaV3"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { JSONSchema7 } from 'json-schema';
|
|
2
|
+
import type * as z3 from 'zod/v3';
|
|
3
|
+
import * as z4 from 'zod/v4';
|
|
4
|
+
/**
|
|
5
|
+
* Result type from Zod schema parsing.
|
|
6
|
+
*/
|
|
7
|
+
export type ZodParseResult<T = unknown> = {
|
|
8
|
+
success: true;
|
|
9
|
+
data: T;
|
|
10
|
+
} | {
|
|
11
|
+
success: false;
|
|
12
|
+
error: unknown;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Type definition for Zod schemas that works with both v3 and v4.
|
|
16
|
+
* Uses a union type of both Zod v3 and v4 schema types.
|
|
17
|
+
*
|
|
18
|
+
* Adapted from Vercel AI SDK's zodSchema function signature.
|
|
19
|
+
* Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L278-L281
|
|
20
|
+
*/
|
|
21
|
+
export type ZodSchema = z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>;
|
|
22
|
+
/**
|
|
23
|
+
* Detects if a schema is a Zod v4 schema.
|
|
24
|
+
* Zod v4 schemas have a `_zod` property that v3 schemas don't have.
|
|
25
|
+
*
|
|
26
|
+
* @param schema - The schema to check
|
|
27
|
+
* @returns True if the schema is a Zod v4 schema
|
|
28
|
+
*/
|
|
29
|
+
export declare function isZod4Schema(schema: ZodSchema): schema is z4.core.$ZodType<any, any>;
|
|
30
|
+
/**
|
|
31
|
+
* Checks if a value is a Zod schema (either v3 or v4).
|
|
32
|
+
*
|
|
33
|
+
* @param value - The value to check
|
|
34
|
+
* @returns True if the value is a Zod schema
|
|
35
|
+
*/
|
|
36
|
+
export declare function isZodSchema(value: unknown): value is ZodSchema;
|
|
37
|
+
/**
|
|
38
|
+
* Checks if a Zod schema is an object schema.
|
|
39
|
+
*
|
|
40
|
+
* @param schema - The schema to check
|
|
41
|
+
* @returns True if the schema is an object schema
|
|
42
|
+
*/
|
|
43
|
+
export declare function isZodObjectSchema(schema: ZodSchema): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Converts a Zod schema to JSON Schema format.
|
|
46
|
+
* Handles both Zod v3 and v4 schemas automatically.
|
|
47
|
+
*
|
|
48
|
+
* Adapted from Vercel AI SDK's zod3Schema and zod4Schema functions.
|
|
49
|
+
* Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L237-L269
|
|
50
|
+
*
|
|
51
|
+
* @param schema - The Zod schema to convert
|
|
52
|
+
* @param isOpenai - Whether to use OpenAI-specific formatting (default: true)
|
|
53
|
+
* @returns A JSON Schema representation of the Zod schema
|
|
54
|
+
*/
|
|
55
|
+
export declare function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai?: boolean, strict?: boolean): JSONSchema7;
|
|
56
|
+
/**
|
|
57
|
+
* Parses a value against a Zod schema.
|
|
58
|
+
* Handles both Zod v3 and v4 parse APIs automatically.
|
|
59
|
+
*
|
|
60
|
+
* @param schema - The Zod schema to parse against
|
|
61
|
+
* @param value - The value to parse
|
|
62
|
+
* @returns A promise that resolves to the parse result
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseZodSchema<T = unknown>(schema: ZodSchema, value: unknown): Promise<ZodParseResult<T>>;
|
|
65
|
+
//# sourceMappingURL=zod-utils.d.ts.map
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { JSONSchema7 } from 'json-schema';
|
|
2
|
+
import type * as z3 from 'zod/v3';
|
|
3
|
+
import * as z4 from 'zod/v4';
|
|
4
|
+
/**
|
|
5
|
+
* Result type from Zod schema parsing.
|
|
6
|
+
*/
|
|
7
|
+
export type ZodParseResult<T = unknown> = {
|
|
8
|
+
success: true;
|
|
9
|
+
data: T;
|
|
10
|
+
} | {
|
|
11
|
+
success: false;
|
|
12
|
+
error: unknown;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Type definition for Zod schemas that works with both v3 and v4.
|
|
16
|
+
* Uses a union type of both Zod v3 and v4 schema types.
|
|
17
|
+
*
|
|
18
|
+
* Adapted from Vercel AI SDK's zodSchema function signature.
|
|
19
|
+
* Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L278-L281
|
|
20
|
+
*/
|
|
21
|
+
export type ZodSchema = z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>;
|
|
22
|
+
/**
|
|
23
|
+
* Detects if a schema is a Zod v4 schema.
|
|
24
|
+
* Zod v4 schemas have a `_zod` property that v3 schemas don't have.
|
|
25
|
+
*
|
|
26
|
+
* @param schema - The schema to check
|
|
27
|
+
* @returns True if the schema is a Zod v4 schema
|
|
28
|
+
*/
|
|
29
|
+
export declare function isZod4Schema(schema: ZodSchema): schema is z4.core.$ZodType<any, any>;
|
|
30
|
+
/**
|
|
31
|
+
* Checks if a value is a Zod schema (either v3 or v4).
|
|
32
|
+
*
|
|
33
|
+
* @param value - The value to check
|
|
34
|
+
* @returns True if the value is a Zod schema
|
|
35
|
+
*/
|
|
36
|
+
export declare function isZodSchema(value: unknown): value is ZodSchema;
|
|
37
|
+
/**
|
|
38
|
+
* Checks if a Zod schema is an object schema.
|
|
39
|
+
*
|
|
40
|
+
* @param schema - The schema to check
|
|
41
|
+
* @returns True if the schema is an object schema
|
|
42
|
+
*/
|
|
43
|
+
export declare function isZodObjectSchema(schema: ZodSchema): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Converts a Zod schema to JSON Schema format.
|
|
46
|
+
* Handles both Zod v3 and v4 schemas automatically.
|
|
47
|
+
*
|
|
48
|
+
* Adapted from Vercel AI SDK's zod3Schema and zod4Schema functions.
|
|
49
|
+
* Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L237-L269
|
|
50
|
+
*
|
|
51
|
+
* @param schema - The Zod schema to convert
|
|
52
|
+
* @param isOpenai - Whether to use OpenAI-specific formatting (default: true)
|
|
53
|
+
* @returns A JSON Schema representation of the Zod schema
|
|
54
|
+
*/
|
|
55
|
+
export declare function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai?: boolean, strict?: boolean): JSONSchema7;
|
|
56
|
+
/**
|
|
57
|
+
* Parses a value against a Zod schema.
|
|
58
|
+
* Handles both Zod v3 and v4 parse APIs automatically.
|
|
59
|
+
*
|
|
60
|
+
* @param schema - The Zod schema to parse against
|
|
61
|
+
* @param value - The value to parse
|
|
62
|
+
* @returns A promise that resolves to the parse result
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseZodSchema<T = unknown>(schema: ZodSchema, value: unknown): Promise<ZodParseResult<T>>;
|
|
65
|
+
//# sourceMappingURL=zod-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-utils.d.ts","sourceRoot":"","sources":["../../src/llm/zod-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAClC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvC;;;;;;GAMG;AAEH,MAAM,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAExF;;;;;;GAMG;AAEH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAGpF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAmB9D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAmB5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,QAAQ,GAAE,OAAc,EACxB,MAAM,GAAE,OAAe,GACtB,WAAW,CAuBb;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAQ5B"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { toStrictJsonSchema } from "openai/lib/transform";
|
|
2
|
+
import { zodToJsonSchema as zodToJsonSchemaV3 } from "zod-to-json-schema";
|
|
3
|
+
import * as z4 from "zod/v4";
|
|
4
|
+
function isZod4Schema(schema) {
|
|
5
|
+
return "_zod" in schema;
|
|
6
|
+
}
|
|
7
|
+
function isZodSchema(value) {
|
|
8
|
+
if (typeof value !== "object" || value === null) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if ("_zod" in value) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
if ("_def" in value && typeof value._def === "object" && value._def !== null) {
|
|
15
|
+
const def = value._def;
|
|
16
|
+
if ("typeName" in def) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
function isZodObjectSchema(schema) {
|
|
23
|
+
var _a, _b, _c, _d;
|
|
24
|
+
const schemaWithInternals = schema;
|
|
25
|
+
if (isZod4Schema(schema)) {
|
|
26
|
+
return ((_a = schemaWithInternals._def) == null ? void 0 : _a.type) === "object" || ((_c = (_b = schemaWithInternals._zod) == null ? void 0 : _b.traits) == null ? void 0 : _c.has("ZodObject")) || false;
|
|
27
|
+
}
|
|
28
|
+
return ((_d = schemaWithInternals._def) == null ? void 0 : _d.typeName) === "ZodObject";
|
|
29
|
+
}
|
|
30
|
+
function zodSchemaToJsonSchema(schema, isOpenai = true, strict = false) {
|
|
31
|
+
let result;
|
|
32
|
+
if (isZod4Schema(schema)) {
|
|
33
|
+
result = z4.toJSONSchema(schema, {
|
|
34
|
+
target: "draft-7",
|
|
35
|
+
io: "output",
|
|
36
|
+
reused: "inline"
|
|
37
|
+
// Don't use references by default (to support openapi conversion for google)
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
result = zodToJsonSchemaV3(schema, {
|
|
41
|
+
target: isOpenai ? "openAi" : "jsonSchema7",
|
|
42
|
+
$refStrategy: "none"
|
|
43
|
+
// Don't use references by default (to support openapi conversion for google)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return strict ? toStrictJsonSchema(result) : result;
|
|
47
|
+
}
|
|
48
|
+
async function parseZodSchema(schema, value) {
|
|
49
|
+
if (isZod4Schema(schema)) {
|
|
50
|
+
const result = await z4.safeParseAsync(schema, value);
|
|
51
|
+
return result;
|
|
52
|
+
} else {
|
|
53
|
+
const result = await schema.safeParseAsync(value);
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
isZod4Schema,
|
|
59
|
+
isZodObjectSchema,
|
|
60
|
+
isZodSchema,
|
|
61
|
+
parseZodSchema,
|
|
62
|
+
zodSchemaToJsonSchema
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=zod-utils.js.map
|