@livekit/agents 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +162 -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 +138 -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 +63 -0
- package/dist/inference/interruption/http_transport.d.ts +63 -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 +342 -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 +308 -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 +55 -16
- package/dist/inference/tts.d.ts +55 -16
- 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 +233 -0
- package/dist/inference/tts.test.cjs.map +1 -0
- package/dist/inference/tts.test.js +232 -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 +274 -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 +273 -3
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/chat_context.test.cjs +574 -0
- package/dist/llm/chat_context.test.cjs.map +1 -1
- package/dist/llm/chat_context.test.js +574 -0
- package/dist/llm/chat_context.test.js.map +1 -1
- package/dist/llm/fallback_adapter.cjs +278 -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 +254 -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 +9 -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 +11 -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 +18 -12
- package/dist/llm/utils.cjs.map +1 -1
- package/dist/llm/utils.d.cts +2 -3
- package/dist/llm/utils.d.ts +2 -3
- package/dist/llm/utils.d.ts.map +1 -1
- package/dist/llm/utils.js +18 -12
- package/dist/llm/utils.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 +86 -19
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.cts +60 -5
- package/dist/stt/stt.d.ts +60 -5
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +88 -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 +466 -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 +442 -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/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 +122 -26
- 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 +117 -25
- 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 +32 -12
- 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/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 +194 -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 +206 -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 +406 -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 +267 -0
- package/src/inference/tts.ts +377 -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 +655 -0
- package/src/llm/chat_context.ts +412 -2
- package/src/llm/fallback_adapter.test.ts +238 -0
- package/src/llm/fallback_adapter.ts +391 -0
- package/src/llm/index.ts +11 -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.ts +24 -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 +131 -22
- 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 +579 -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/types.ts +62 -33
- package/src/utils.test.ts +90 -10
- package/src/utils.ts +176 -31
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/usage_collector.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AgentMetrics } from './base.js';\n\nexport interface UsageSummary {\n llmPromptTokens: number;\n llmPromptCachedTokens: number;\n llmCompletionTokens: number;\n ttsCharactersCount: number;\n
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/usage_collector.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../log.js';\nimport type { AgentMetrics } from './base.js';\n\n/**\n * @deprecated Use LLMModelUsage, TTSModelUsage, or STTModelUsage instead.\n * These new types provide per-model/provider usage aggregation for more detailed tracking.\n */\nexport interface UsageSummary {\n llmPromptTokens: number;\n llmPromptCachedTokens: number;\n llmCompletionTokens: number;\n ttsCharactersCount: number;\n sttAudioDurationMs: number;\n}\n\n/**\n * @deprecated Use ModelUsageCollector instead.\n * ModelUsageCollector provides per-model/provider usage aggregation for more detailed tracking.\n */\nexport class UsageCollector {\n private summary: UsageSummary;\n private logger = log();\n\n constructor() {\n this.logger.warn('UsageCollector is deprecated. Use ModelUsageCollector instead.');\n this.summary = {\n llmPromptTokens: 0,\n llmPromptCachedTokens: 0,\n llmCompletionTokens: 0,\n ttsCharactersCount: 0,\n sttAudioDurationMs: 0,\n };\n }\n\n collect(metrics: AgentMetrics): void {\n if (metrics.type === 'llm_metrics') {\n this.summary.llmPromptTokens += metrics.promptTokens;\n this.summary.llmPromptCachedTokens += metrics.promptCachedTokens;\n this.summary.llmCompletionTokens += metrics.completionTokens;\n } else if (metrics.type === 'realtime_model_metrics') {\n this.summary.llmPromptTokens += metrics.inputTokens;\n this.summary.llmPromptCachedTokens += metrics.inputTokenDetails.cachedTokens;\n this.summary.llmCompletionTokens += metrics.outputTokens;\n } else if (metrics.type === 'tts_metrics') {\n this.summary.ttsCharactersCount += metrics.charactersCount;\n } else if (metrics.type === 'stt_metrics') {\n this.summary.sttAudioDurationMs += metrics.audioDurationMs;\n }\n }\n\n getSummary(): UsageSummary {\n return { ...this.summary };\n }\n}\n"],"mappings":"AAGA,SAAS,WAAW;AAmBb,MAAM,eAAe;AAAA,EAClB;AAAA,EACA,SAAS,IAAI;AAAA,EAErB,cAAc;AACZ,SAAK,OAAO,KAAK,gEAAgE;AACjF,SAAK,UAAU;AAAA,MACb,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,QAAQ,SAA6B;AACnC,QAAI,QAAQ,SAAS,eAAe;AAClC,WAAK,QAAQ,mBAAmB,QAAQ;AACxC,WAAK,QAAQ,yBAAyB,QAAQ;AAC9C,WAAK,QAAQ,uBAAuB,QAAQ;AAAA,IAC9C,WAAW,QAAQ,SAAS,0BAA0B;AACpD,WAAK,QAAQ,mBAAmB,QAAQ;AACxC,WAAK,QAAQ,yBAAyB,QAAQ,kBAAkB;AAChE,WAAK,QAAQ,uBAAuB,QAAQ;AAAA,IAC9C,WAAW,QAAQ,SAAS,eAAe;AACzC,WAAK,QAAQ,sBAAsB,QAAQ;AAAA,IAC7C,WAAW,QAAQ,SAAS,eAAe;AACzC,WAAK,QAAQ,sBAAsB,QAAQ;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,aAA2B;AACzB,WAAO,EAAE,GAAG,KAAK,QAAQ;AAAA,EAC3B;AACF;","names":[]}
|
package/dist/metrics/utils.cjs
CHANGED
|
@@ -29,7 +29,7 @@ const logMetrics = (metrics) => {
|
|
|
29
29
|
const logger = (0, import_log.log)();
|
|
30
30
|
if (metrics.type === "llm_metrics") {
|
|
31
31
|
logger.child({
|
|
32
|
-
|
|
32
|
+
ttftMs: roundTwoDecimals(metrics.ttftMs),
|
|
33
33
|
inputTokens: metrics.promptTokens,
|
|
34
34
|
promptCachedTokens: metrics.promptCachedTokens,
|
|
35
35
|
outputTokens: metrics.completionTokens,
|
|
@@ -37,7 +37,7 @@ const logMetrics = (metrics) => {
|
|
|
37
37
|
}).info("LLM metrics");
|
|
38
38
|
} else if (metrics.type === "realtime_model_metrics") {
|
|
39
39
|
logger.child({
|
|
40
|
-
|
|
40
|
+
ttftMs: roundTwoDecimals(metrics.ttftMs),
|
|
41
41
|
input_tokens: metrics.inputTokens,
|
|
42
42
|
cached_input_tokens: metrics.inputTokenDetails.cachedTokens,
|
|
43
43
|
output_tokens: metrics.outputTokens,
|
|
@@ -46,18 +46,34 @@ const logMetrics = (metrics) => {
|
|
|
46
46
|
}).info("RealtimeModel metrics");
|
|
47
47
|
} else if (metrics.type === "tts_metrics") {
|
|
48
48
|
logger.child({
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
ttfbMs: roundTwoDecimals(metrics.ttfbMs),
|
|
50
|
+
audioDurationMs: Math.round(metrics.audioDurationMs)
|
|
51
51
|
}).info("TTS metrics");
|
|
52
52
|
} else if (metrics.type === "eou_metrics") {
|
|
53
53
|
logger.child({
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
endOfUtteranceDelayMs: roundTwoDecimals(metrics.endOfUtteranceDelayMs),
|
|
55
|
+
transcriptionDelayMs: roundTwoDecimals(metrics.transcriptionDelayMs),
|
|
56
|
+
onUserTurnCompletedDelayMs: roundTwoDecimals(metrics.onUserTurnCompletedDelayMs)
|
|
56
57
|
}).info("EOU metrics");
|
|
58
|
+
} else if (metrics.type === "vad_metrics") {
|
|
59
|
+
logger.child({
|
|
60
|
+
idleTimeMs: Math.round(metrics.idleTimeMs),
|
|
61
|
+
inferenceDurationTotalMs: Math.round(metrics.inferenceDurationTotalMs),
|
|
62
|
+
inferenceCount: metrics.inferenceCount
|
|
63
|
+
}).info("VAD metrics");
|
|
57
64
|
} else if (metrics.type === "stt_metrics") {
|
|
58
65
|
logger.child({
|
|
59
|
-
|
|
66
|
+
audioDurationMs: Math.round(metrics.audioDurationMs)
|
|
60
67
|
}).info("STT metrics");
|
|
68
|
+
} else if (metrics.type === "interruption_metrics") {
|
|
69
|
+
logger.child({
|
|
70
|
+
totalDurationMs: roundTwoDecimals(metrics.totalDuration),
|
|
71
|
+
predictionDurationMs: roundTwoDecimals(metrics.predictionDuration),
|
|
72
|
+
detectionDelayMs: roundTwoDecimals(metrics.detectionDelay),
|
|
73
|
+
numInterruptions: metrics.numInterruptions,
|
|
74
|
+
numBackchannels: metrics.numBackchannels,
|
|
75
|
+
numRequests: metrics.numRequests
|
|
76
|
+
}).info("Interruption metrics");
|
|
61
77
|
}
|
|
62
78
|
};
|
|
63
79
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../log.js';\nimport type { AgentMetrics } from './base.js';\n\nfunction roundTwoDecimals(value: number) {\n return Math.round(value * 100) / 100;\n}\n\nexport const logMetrics = (metrics: AgentMetrics) => {\n const logger = log();\n if (metrics.type === 'llm_metrics') {\n logger\n .child({\n
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../log.js';\nimport type { AgentMetrics } from './base.js';\n\nfunction roundTwoDecimals(value: number) {\n return Math.round(value * 100) / 100;\n}\n\nexport const logMetrics = (metrics: AgentMetrics) => {\n const logger = log();\n if (metrics.type === 'llm_metrics') {\n logger\n .child({\n ttftMs: roundTwoDecimals(metrics.ttftMs),\n inputTokens: metrics.promptTokens,\n promptCachedTokens: metrics.promptCachedTokens,\n outputTokens: metrics.completionTokens,\n tokensPerSecond: roundTwoDecimals(metrics.tokensPerSecond),\n })\n .info('LLM metrics');\n } else if (metrics.type === 'realtime_model_metrics') {\n logger\n .child({\n ttftMs: roundTwoDecimals(metrics.ttftMs),\n input_tokens: metrics.inputTokens,\n cached_input_tokens: metrics.inputTokenDetails.cachedTokens,\n output_tokens: metrics.outputTokens,\n total_tokens: metrics.totalTokens,\n tokens_per_second: roundTwoDecimals(metrics.tokensPerSecond),\n })\n .info('RealtimeModel metrics');\n } else if (metrics.type === 'tts_metrics') {\n logger\n .child({\n ttfbMs: roundTwoDecimals(metrics.ttfbMs),\n audioDurationMs: Math.round(metrics.audioDurationMs),\n })\n .info('TTS metrics');\n } else if (metrics.type === 'eou_metrics') {\n logger\n .child({\n endOfUtteranceDelayMs: roundTwoDecimals(metrics.endOfUtteranceDelayMs),\n transcriptionDelayMs: roundTwoDecimals(metrics.transcriptionDelayMs),\n onUserTurnCompletedDelayMs: roundTwoDecimals(metrics.onUserTurnCompletedDelayMs),\n })\n .info('EOU metrics');\n } else if (metrics.type === 'vad_metrics') {\n logger\n .child({\n idleTimeMs: Math.round(metrics.idleTimeMs),\n inferenceDurationTotalMs: Math.round(metrics.inferenceDurationTotalMs),\n inferenceCount: metrics.inferenceCount,\n })\n .info('VAD metrics');\n } else if (metrics.type === 'stt_metrics') {\n logger\n .child({\n audioDurationMs: Math.round(metrics.audioDurationMs),\n })\n .info('STT metrics');\n } else if (metrics.type === 'interruption_metrics') {\n logger\n .child({\n totalDurationMs: roundTwoDecimals(metrics.totalDuration),\n predictionDurationMs: roundTwoDecimals(metrics.predictionDuration),\n detectionDelayMs: roundTwoDecimals(metrics.detectionDelay),\n numInterruptions: metrics.numInterruptions,\n numBackchannels: metrics.numBackchannels,\n numRequests: metrics.numRequests,\n })\n .info('Interruption metrics');\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAAoB;AAGpB,SAAS,iBAAiB,OAAe;AACvC,SAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;AACnC;AAEO,MAAM,aAAa,CAAC,YAA0B;AACnD,QAAM,aAAS,gBAAI;AACnB,MAAI,QAAQ,SAAS,eAAe;AAClC,WACG,MAAM;AAAA,MACL,QAAQ,iBAAiB,QAAQ,MAAM;AAAA,MACvC,aAAa,QAAQ;AAAA,MACrB,oBAAoB,QAAQ;AAAA,MAC5B,cAAc,QAAQ;AAAA,MACtB,iBAAiB,iBAAiB,QAAQ,eAAe;AAAA,IAC3D,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,0BAA0B;AACpD,WACG,MAAM;AAAA,MACL,QAAQ,iBAAiB,QAAQ,MAAM;AAAA,MACvC,cAAc,QAAQ;AAAA,MACtB,qBAAqB,QAAQ,kBAAkB;AAAA,MAC/C,eAAe,QAAQ;AAAA,MACvB,cAAc,QAAQ;AAAA,MACtB,mBAAmB,iBAAiB,QAAQ,eAAe;AAAA,IAC7D,CAAC,EACA,KAAK,uBAAuB;AAAA,EACjC,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,QAAQ,iBAAiB,QAAQ,MAAM;AAAA,MACvC,iBAAiB,KAAK,MAAM,QAAQ,eAAe;AAAA,IACrD,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,uBAAuB,iBAAiB,QAAQ,qBAAqB;AAAA,MACrE,sBAAsB,iBAAiB,QAAQ,oBAAoB;AAAA,MACnE,4BAA4B,iBAAiB,QAAQ,0BAA0B;AAAA,IACjF,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,YAAY,KAAK,MAAM,QAAQ,UAAU;AAAA,MACzC,0BAA0B,KAAK,MAAM,QAAQ,wBAAwB;AAAA,MACrE,gBAAgB,QAAQ;AAAA,IAC1B,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,iBAAiB,KAAK,MAAM,QAAQ,eAAe;AAAA,IACrD,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,wBAAwB;AAClD,WACG,MAAM;AAAA,MACL,iBAAiB,iBAAiB,QAAQ,aAAa;AAAA,MACvD,sBAAsB,iBAAiB,QAAQ,kBAAkB;AAAA,MACjE,kBAAkB,iBAAiB,QAAQ,cAAc;AAAA,MACzD,kBAAkB,QAAQ;AAAA,MAC1B,iBAAiB,QAAQ;AAAA,MACzB,aAAa,QAAQ;AAAA,IACvB,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/metrics/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAM9C,eAAO,MAAM,UAAU,YAAa,YAAY,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/metrics/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAM9C,eAAO,MAAM,UAAU,YAAa,YAAY,SAgE/C,CAAC"}
|
package/dist/metrics/utils.js
CHANGED
|
@@ -6,7 +6,7 @@ const logMetrics = (metrics) => {
|
|
|
6
6
|
const logger = log();
|
|
7
7
|
if (metrics.type === "llm_metrics") {
|
|
8
8
|
logger.child({
|
|
9
|
-
|
|
9
|
+
ttftMs: roundTwoDecimals(metrics.ttftMs),
|
|
10
10
|
inputTokens: metrics.promptTokens,
|
|
11
11
|
promptCachedTokens: metrics.promptCachedTokens,
|
|
12
12
|
outputTokens: metrics.completionTokens,
|
|
@@ -14,7 +14,7 @@ const logMetrics = (metrics) => {
|
|
|
14
14
|
}).info("LLM metrics");
|
|
15
15
|
} else if (metrics.type === "realtime_model_metrics") {
|
|
16
16
|
logger.child({
|
|
17
|
-
|
|
17
|
+
ttftMs: roundTwoDecimals(metrics.ttftMs),
|
|
18
18
|
input_tokens: metrics.inputTokens,
|
|
19
19
|
cached_input_tokens: metrics.inputTokenDetails.cachedTokens,
|
|
20
20
|
output_tokens: metrics.outputTokens,
|
|
@@ -23,18 +23,34 @@ const logMetrics = (metrics) => {
|
|
|
23
23
|
}).info("RealtimeModel metrics");
|
|
24
24
|
} else if (metrics.type === "tts_metrics") {
|
|
25
25
|
logger.child({
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
ttfbMs: roundTwoDecimals(metrics.ttfbMs),
|
|
27
|
+
audioDurationMs: Math.round(metrics.audioDurationMs)
|
|
28
28
|
}).info("TTS metrics");
|
|
29
29
|
} else if (metrics.type === "eou_metrics") {
|
|
30
30
|
logger.child({
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
endOfUtteranceDelayMs: roundTwoDecimals(metrics.endOfUtteranceDelayMs),
|
|
32
|
+
transcriptionDelayMs: roundTwoDecimals(metrics.transcriptionDelayMs),
|
|
33
|
+
onUserTurnCompletedDelayMs: roundTwoDecimals(metrics.onUserTurnCompletedDelayMs)
|
|
33
34
|
}).info("EOU metrics");
|
|
35
|
+
} else if (metrics.type === "vad_metrics") {
|
|
36
|
+
logger.child({
|
|
37
|
+
idleTimeMs: Math.round(metrics.idleTimeMs),
|
|
38
|
+
inferenceDurationTotalMs: Math.round(metrics.inferenceDurationTotalMs),
|
|
39
|
+
inferenceCount: metrics.inferenceCount
|
|
40
|
+
}).info("VAD metrics");
|
|
34
41
|
} else if (metrics.type === "stt_metrics") {
|
|
35
42
|
logger.child({
|
|
36
|
-
|
|
43
|
+
audioDurationMs: Math.round(metrics.audioDurationMs)
|
|
37
44
|
}).info("STT metrics");
|
|
45
|
+
} else if (metrics.type === "interruption_metrics") {
|
|
46
|
+
logger.child({
|
|
47
|
+
totalDurationMs: roundTwoDecimals(metrics.totalDuration),
|
|
48
|
+
predictionDurationMs: roundTwoDecimals(metrics.predictionDuration),
|
|
49
|
+
detectionDelayMs: roundTwoDecimals(metrics.detectionDelay),
|
|
50
|
+
numInterruptions: metrics.numInterruptions,
|
|
51
|
+
numBackchannels: metrics.numBackchannels,
|
|
52
|
+
numRequests: metrics.numRequests
|
|
53
|
+
}).info("Interruption metrics");
|
|
38
54
|
}
|
|
39
55
|
};
|
|
40
56
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../log.js';\nimport type { AgentMetrics } from './base.js';\n\nfunction roundTwoDecimals(value: number) {\n return Math.round(value * 100) / 100;\n}\n\nexport const logMetrics = (metrics: AgentMetrics) => {\n const logger = log();\n if (metrics.type === 'llm_metrics') {\n logger\n .child({\n
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../log.js';\nimport type { AgentMetrics } from './base.js';\n\nfunction roundTwoDecimals(value: number) {\n return Math.round(value * 100) / 100;\n}\n\nexport const logMetrics = (metrics: AgentMetrics) => {\n const logger = log();\n if (metrics.type === 'llm_metrics') {\n logger\n .child({\n ttftMs: roundTwoDecimals(metrics.ttftMs),\n inputTokens: metrics.promptTokens,\n promptCachedTokens: metrics.promptCachedTokens,\n outputTokens: metrics.completionTokens,\n tokensPerSecond: roundTwoDecimals(metrics.tokensPerSecond),\n })\n .info('LLM metrics');\n } else if (metrics.type === 'realtime_model_metrics') {\n logger\n .child({\n ttftMs: roundTwoDecimals(metrics.ttftMs),\n input_tokens: metrics.inputTokens,\n cached_input_tokens: metrics.inputTokenDetails.cachedTokens,\n output_tokens: metrics.outputTokens,\n total_tokens: metrics.totalTokens,\n tokens_per_second: roundTwoDecimals(metrics.tokensPerSecond),\n })\n .info('RealtimeModel metrics');\n } else if (metrics.type === 'tts_metrics') {\n logger\n .child({\n ttfbMs: roundTwoDecimals(metrics.ttfbMs),\n audioDurationMs: Math.round(metrics.audioDurationMs),\n })\n .info('TTS metrics');\n } else if (metrics.type === 'eou_metrics') {\n logger\n .child({\n endOfUtteranceDelayMs: roundTwoDecimals(metrics.endOfUtteranceDelayMs),\n transcriptionDelayMs: roundTwoDecimals(metrics.transcriptionDelayMs),\n onUserTurnCompletedDelayMs: roundTwoDecimals(metrics.onUserTurnCompletedDelayMs),\n })\n .info('EOU metrics');\n } else if (metrics.type === 'vad_metrics') {\n logger\n .child({\n idleTimeMs: Math.round(metrics.idleTimeMs),\n inferenceDurationTotalMs: Math.round(metrics.inferenceDurationTotalMs),\n inferenceCount: metrics.inferenceCount,\n })\n .info('VAD metrics');\n } else if (metrics.type === 'stt_metrics') {\n logger\n .child({\n audioDurationMs: Math.round(metrics.audioDurationMs),\n })\n .info('STT metrics');\n } else if (metrics.type === 'interruption_metrics') {\n logger\n .child({\n totalDurationMs: roundTwoDecimals(metrics.totalDuration),\n predictionDurationMs: roundTwoDecimals(metrics.predictionDuration),\n detectionDelayMs: roundTwoDecimals(metrics.detectionDelay),\n numInterruptions: metrics.numInterruptions,\n numBackchannels: metrics.numBackchannels,\n numRequests: metrics.numRequests,\n })\n .info('Interruption metrics');\n }\n};\n"],"mappings":"AAGA,SAAS,WAAW;AAGpB,SAAS,iBAAiB,OAAe;AACvC,SAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;AACnC;AAEO,MAAM,aAAa,CAAC,YAA0B;AACnD,QAAM,SAAS,IAAI;AACnB,MAAI,QAAQ,SAAS,eAAe;AAClC,WACG,MAAM;AAAA,MACL,QAAQ,iBAAiB,QAAQ,MAAM;AAAA,MACvC,aAAa,QAAQ;AAAA,MACrB,oBAAoB,QAAQ;AAAA,MAC5B,cAAc,QAAQ;AAAA,MACtB,iBAAiB,iBAAiB,QAAQ,eAAe;AAAA,IAC3D,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,0BAA0B;AACpD,WACG,MAAM;AAAA,MACL,QAAQ,iBAAiB,QAAQ,MAAM;AAAA,MACvC,cAAc,QAAQ;AAAA,MACtB,qBAAqB,QAAQ,kBAAkB;AAAA,MAC/C,eAAe,QAAQ;AAAA,MACvB,cAAc,QAAQ;AAAA,MACtB,mBAAmB,iBAAiB,QAAQ,eAAe;AAAA,IAC7D,CAAC,EACA,KAAK,uBAAuB;AAAA,EACjC,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,QAAQ,iBAAiB,QAAQ,MAAM;AAAA,MACvC,iBAAiB,KAAK,MAAM,QAAQ,eAAe;AAAA,IACrD,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,uBAAuB,iBAAiB,QAAQ,qBAAqB;AAAA,MACrE,sBAAsB,iBAAiB,QAAQ,oBAAoB;AAAA,MACnE,4BAA4B,iBAAiB,QAAQ,0BAA0B;AAAA,IACjF,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,YAAY,KAAK,MAAM,QAAQ,UAAU;AAAA,MACzC,0BAA0B,KAAK,MAAM,QAAQ,wBAAwB;AAAA,MACrE,gBAAgB,QAAQ;AAAA,IAC1B,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,eAAe;AACzC,WACG,MAAM;AAAA,MACL,iBAAiB,KAAK,MAAM,QAAQ,eAAe;AAAA,IACrD,CAAC,EACA,KAAK,aAAa;AAAA,EACvB,WAAW,QAAQ,SAAS,wBAAwB;AAClD,WACG,MAAM;AAAA,MACL,iBAAiB,iBAAiB,QAAQ,aAAa;AAAA,MACvD,sBAAsB,iBAAiB,QAAQ,kBAAkB;AAAA,MACjE,kBAAkB,iBAAiB,QAAQ,cAAc;AAAA,MACzD,kBAAkB,QAAQ;AAAA,MAC1B,iBAAiB,QAAQ;AAAA,MACzB,aAAa,QAAQ;AAAA,IACvB,CAAC,EACA,KAAK,sBAAsB;AAAA,EAChC;AACF;","names":[]}
|
|
@@ -26,9 +26,15 @@ var import_identity_transform = require("./identity_transform.cjs");
|
|
|
26
26
|
function isStreamReaderReleaseError(e) {
|
|
27
27
|
const allowedMessages = [
|
|
28
28
|
"Invalid state: Releasing reader",
|
|
29
|
-
"Invalid state: The reader is not attached to a stream"
|
|
29
|
+
"Invalid state: The reader is not attached to a stream",
|
|
30
|
+
"Controller is already closed",
|
|
31
|
+
"WritableStream is closed",
|
|
32
|
+
// bun
|
|
33
|
+
"Stream reader cancelled via releaseLock()",
|
|
34
|
+
// deno
|
|
35
|
+
"The reader was released."
|
|
30
36
|
];
|
|
31
|
-
if (e instanceof TypeError) {
|
|
37
|
+
if (e instanceof TypeError || e instanceof Error && e.name === "AbortError") {
|
|
32
38
|
return allowedMessages.some((message) => e.message.includes(message));
|
|
33
39
|
}
|
|
34
40
|
return false;
|
|
@@ -54,14 +60,15 @@ class DeferredReadableStream {
|
|
|
54
60
|
if (this.isSourceSet) {
|
|
55
61
|
throw new Error("Stream source already set");
|
|
56
62
|
}
|
|
57
|
-
|
|
58
|
-
this.
|
|
63
|
+
const sourceReader = source.getReader();
|
|
64
|
+
this.sourceReader = sourceReader;
|
|
65
|
+
void this.pump(sourceReader);
|
|
59
66
|
}
|
|
60
|
-
async pump() {
|
|
67
|
+
async pump(sourceReader) {
|
|
61
68
|
let sourceError;
|
|
62
69
|
try {
|
|
63
70
|
while (true) {
|
|
64
|
-
const { done, value } = await
|
|
71
|
+
const { done, value } = await sourceReader.read();
|
|
65
72
|
if (done) break;
|
|
66
73
|
await this.writer.write(value);
|
|
67
74
|
}
|
|
@@ -70,10 +77,16 @@ class DeferredReadableStream {
|
|
|
70
77
|
sourceError = e;
|
|
71
78
|
} finally {
|
|
72
79
|
if (sourceError) {
|
|
73
|
-
|
|
80
|
+
try {
|
|
81
|
+
await this.writer.abort(sourceError);
|
|
82
|
+
} catch (e) {
|
|
83
|
+
}
|
|
74
84
|
return;
|
|
75
85
|
}
|
|
76
|
-
|
|
86
|
+
try {
|
|
87
|
+
this.writer.releaseLock();
|
|
88
|
+
} catch (e) {
|
|
89
|
+
}
|
|
77
90
|
try {
|
|
78
91
|
await this.transform.writable.close();
|
|
79
92
|
} catch (e) {
|
|
@@ -85,9 +98,17 @@ class DeferredReadableStream {
|
|
|
85
98
|
*/
|
|
86
99
|
async detachSource() {
|
|
87
100
|
if (!this.isSourceSet) {
|
|
88
|
-
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const sourceReader = this.sourceReader;
|
|
104
|
+
this.sourceReader = void 0;
|
|
105
|
+
try {
|
|
106
|
+
sourceReader.releaseLock();
|
|
107
|
+
} catch (e) {
|
|
108
|
+
if (!isStreamReaderReleaseError(e)) {
|
|
109
|
+
throw e;
|
|
110
|
+
}
|
|
89
111
|
}
|
|
90
|
-
this.sourceReader.releaseLock();
|
|
91
112
|
}
|
|
92
113
|
}
|
|
93
114
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stream/deferred_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n ReadableStream,\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to reader.read after
|
|
1
|
+
{"version":3,"sources":["../../src/stream/deferred_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n ReadableStream,\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to stream cleanup operations.\n *\n * These errors are expected when calling reader.read() after releaseLock()\n * or when writing to already closed streams during cleanup:\n *\n * Invalid state: Releasing reader\n * Invalid state: The reader is not attached to a stream\n * Invalid state: Controller is already closed\n * Invalid state: WritableStream is closed\n */\nexport function isStreamReaderReleaseError(e: unknown) {\n const allowedMessages = [\n 'Invalid state: Releasing reader',\n 'Invalid state: The reader is not attached to a stream',\n 'Controller is already closed',\n 'WritableStream is closed',\n // bun\n 'Stream reader cancelled via releaseLock()',\n // deno\n 'The reader was released.',\n ];\n\n if (e instanceof TypeError || (e instanceof Error && e.name === 'AbortError')) {\n return allowedMessages.some((message) => e.message.includes(message));\n }\n\n return false;\n}\nexport class DeferredReadableStream<T> {\n private transform: IdentityTransform<T>;\n private writer: WritableStreamDefaultWriter<T>;\n private sourceReader?: ReadableStreamDefaultReader<T>;\n\n constructor() {\n this.transform = new IdentityTransform<T>();\n this.writer = this.transform.writable.getWriter();\n }\n\n get stream() {\n return this.transform.readable;\n }\n\n get isSourceSet() {\n return !!this.sourceReader;\n }\n\n /**\n * Call once the actual source is ready.\n */\n setSource(source: ReadableStream<T>) {\n if (this.isSourceSet) {\n throw new Error('Stream source already set');\n }\n\n const sourceReader = source.getReader();\n this.sourceReader = sourceReader;\n void this.pump(sourceReader);\n }\n\n private async pump(sourceReader: ReadableStreamDefaultReader<T>) {\n let sourceError: unknown;\n\n try {\n while (true) {\n const { done, value } = await sourceReader.read();\n if (done) break;\n await this.writer.write(value);\n }\n } catch (e) {\n // skip stream cleanup related errors\n if (isStreamReaderReleaseError(e)) return;\n\n sourceError = e;\n } finally {\n // any other error from source will be propagated to the consumer\n if (sourceError) {\n try {\n await this.writer.abort(sourceError);\n } catch (e) {\n // ignore if writer is already closed\n }\n return;\n }\n\n // release lock so this.stream.getReader().read() will terminate with done: true\n try {\n this.writer.releaseLock();\n } catch (e) {\n // ignore if writer lock is already released\n }\n\n // we only close the writable stream after done\n try {\n await this.transform.writable.close();\n // NOTE: we do not cancel this.transform.readable as there might be access to\n // this.transform.readable.getReader() outside that blocks this cancellation\n // hence, user is responsible for canceling reader on their own\n } catch (e) {\n // ignore TypeError: Invalid state: WritableStream is closed\n // in case stream reader is already closed, this will throw\n // but we ignore it as we are closing the stream anyway\n }\n }\n }\n\n /**\n * Detach the source stream and clean up resources.\n */\n async detachSource() {\n if (!this.isSourceSet) {\n // No-op if source was never set - this is a common case during cleanup\n return;\n }\n\n const sourceReader = this.sourceReader!;\n // Clear source first so future setSource() calls can reattach cleanly.\n this.sourceReader = undefined;\n\n // release lock will make any pending read() throw TypeError\n // which are expected, and we intentionally catch those error\n // using isStreamReaderReleaseError\n // this will unblock any pending read() inside the async for loop\n try {\n sourceReader.releaseLock();\n } catch (e) {\n if (!isStreamReaderReleaseError(e)) {\n throw e;\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,gCAAkC;AAa3B,SAAS,2BAA2B,GAAY;AACrD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACF;AAEA,MAAI,aAAa,aAAc,aAAa,SAAS,EAAE,SAAS,cAAe;AAC7E,WAAO,gBAAgB,KAAK,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AACT;AACO,MAAM,uBAA0B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,YAAY,IAAI,4CAAqB;AAC1C,SAAK,SAAS,KAAK,UAAU,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA2B;AACnC,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,eAAe,OAAO,UAAU;AACtC,SAAK,eAAe;AACpB,SAAK,KAAK,KAAK,YAAY;AAAA,EAC7B;AAAA,EAEA,MAAc,KAAK,cAA8C;AAC/D,QAAI;AAEJ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AAChD,YAAI,KAAM;AACV,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,SAAS,GAAG;AAEV,UAAI,2BAA2B,CAAC,EAAG;AAEnC,oBAAc;AAAA,IAChB,UAAE;AAEA,UAAI,aAAa;AACf,YAAI;AACF,gBAAM,KAAK,OAAO,MAAM,WAAW;AAAA,QACrC,SAAS,GAAG;AAAA,QAEZ;AACA;AAAA,MACF;AAGA,UAAI;AACF,aAAK,OAAO,YAAY;AAAA,MAC1B,SAAS,GAAG;AAAA,MAEZ;AAGA,UAAI;AACF,cAAM,KAAK,UAAU,SAAS,MAAM;AAAA,MAItC,SAAS,GAAG;AAAA,MAIZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe;AACnB,QAAI,CAAC,KAAK,aAAa;AAErB;AAAA,IACF;AAEA,UAAM,eAAe,KAAK;AAE1B,SAAK,eAAe;AAMpB,QAAI;AACF,mBAAa,YAAY;AAAA,IAC3B,SAAS,GAAG;AACV,UAAI,CAAC,2BAA2B,CAAC,GAAG;AAClC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import type { ReadableStream } from 'node:stream/web';
|
|
3
3
|
/**
|
|
4
|
-
* Check if error is related to
|
|
4
|
+
* Check if error is related to stream cleanup operations.
|
|
5
|
+
*
|
|
6
|
+
* These errors are expected when calling reader.read() after releaseLock()
|
|
7
|
+
* or when writing to already closed streams during cleanup:
|
|
5
8
|
*
|
|
6
9
|
* Invalid state: Releasing reader
|
|
7
10
|
* Invalid state: The reader is not attached to a stream
|
|
11
|
+
* Invalid state: Controller is already closed
|
|
12
|
+
* Invalid state: WritableStream is closed
|
|
8
13
|
*/
|
|
9
14
|
export declare function isStreamReaderReleaseError(e: unknown): boolean;
|
|
10
15
|
export declare class DeferredReadableStream<T> {
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import type { ReadableStream } from 'node:stream/web';
|
|
3
3
|
/**
|
|
4
|
-
* Check if error is related to
|
|
4
|
+
* Check if error is related to stream cleanup operations.
|
|
5
|
+
*
|
|
6
|
+
* These errors are expected when calling reader.read() after releaseLock()
|
|
7
|
+
* or when writing to already closed streams during cleanup:
|
|
5
8
|
*
|
|
6
9
|
* Invalid state: Releasing reader
|
|
7
10
|
* Invalid state: The reader is not attached to a stream
|
|
11
|
+
* Invalid state: Controller is already closed
|
|
12
|
+
* Invalid state: WritableStream is closed
|
|
8
13
|
*/
|
|
9
14
|
export declare function isStreamReaderReleaseError(e: unknown): boolean;
|
|
10
15
|
export declare class DeferredReadableStream<T> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred_stream.d.ts","sourceRoot":"","sources":["../../src/stream/deferred_stream.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAGzB
|
|
1
|
+
{"version":3,"file":"deferred_stream.d.ts","sourceRoot":"","sources":["../../src/stream/deferred_stream.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,WAiBpD;AACD,qBAAa,sBAAsB,CAAC,CAAC;IACnC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,YAAY,CAAC,CAAiC;;IAOtD,IAAI,MAAM,sBAET;IAED,IAAI,WAAW,YAEd;IAED;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YAUrB,IAAI;IA8ClB;;OAEG;IACG,YAAY;CAsBnB"}
|
|
@@ -2,9 +2,15 @@ import { IdentityTransform } from "./identity_transform.js";
|
|
|
2
2
|
function isStreamReaderReleaseError(e) {
|
|
3
3
|
const allowedMessages = [
|
|
4
4
|
"Invalid state: Releasing reader",
|
|
5
|
-
"Invalid state: The reader is not attached to a stream"
|
|
5
|
+
"Invalid state: The reader is not attached to a stream",
|
|
6
|
+
"Controller is already closed",
|
|
7
|
+
"WritableStream is closed",
|
|
8
|
+
// bun
|
|
9
|
+
"Stream reader cancelled via releaseLock()",
|
|
10
|
+
// deno
|
|
11
|
+
"The reader was released."
|
|
6
12
|
];
|
|
7
|
-
if (e instanceof TypeError) {
|
|
13
|
+
if (e instanceof TypeError || e instanceof Error && e.name === "AbortError") {
|
|
8
14
|
return allowedMessages.some((message) => e.message.includes(message));
|
|
9
15
|
}
|
|
10
16
|
return false;
|
|
@@ -30,14 +36,15 @@ class DeferredReadableStream {
|
|
|
30
36
|
if (this.isSourceSet) {
|
|
31
37
|
throw new Error("Stream source already set");
|
|
32
38
|
}
|
|
33
|
-
|
|
34
|
-
this.
|
|
39
|
+
const sourceReader = source.getReader();
|
|
40
|
+
this.sourceReader = sourceReader;
|
|
41
|
+
void this.pump(sourceReader);
|
|
35
42
|
}
|
|
36
|
-
async pump() {
|
|
43
|
+
async pump(sourceReader) {
|
|
37
44
|
let sourceError;
|
|
38
45
|
try {
|
|
39
46
|
while (true) {
|
|
40
|
-
const { done, value } = await
|
|
47
|
+
const { done, value } = await sourceReader.read();
|
|
41
48
|
if (done) break;
|
|
42
49
|
await this.writer.write(value);
|
|
43
50
|
}
|
|
@@ -46,10 +53,16 @@ class DeferredReadableStream {
|
|
|
46
53
|
sourceError = e;
|
|
47
54
|
} finally {
|
|
48
55
|
if (sourceError) {
|
|
49
|
-
|
|
56
|
+
try {
|
|
57
|
+
await this.writer.abort(sourceError);
|
|
58
|
+
} catch (e) {
|
|
59
|
+
}
|
|
50
60
|
return;
|
|
51
61
|
}
|
|
52
|
-
|
|
62
|
+
try {
|
|
63
|
+
this.writer.releaseLock();
|
|
64
|
+
} catch (e) {
|
|
65
|
+
}
|
|
53
66
|
try {
|
|
54
67
|
await this.transform.writable.close();
|
|
55
68
|
} catch (e) {
|
|
@@ -61,9 +74,17 @@ class DeferredReadableStream {
|
|
|
61
74
|
*/
|
|
62
75
|
async detachSource() {
|
|
63
76
|
if (!this.isSourceSet) {
|
|
64
|
-
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const sourceReader = this.sourceReader;
|
|
80
|
+
this.sourceReader = void 0;
|
|
81
|
+
try {
|
|
82
|
+
sourceReader.releaseLock();
|
|
83
|
+
} catch (e) {
|
|
84
|
+
if (!isStreamReaderReleaseError(e)) {
|
|
85
|
+
throw e;
|
|
86
|
+
}
|
|
65
87
|
}
|
|
66
|
-
this.sourceReader.releaseLock();
|
|
67
88
|
}
|
|
68
89
|
}
|
|
69
90
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/stream/deferred_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n ReadableStream,\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to reader.read after
|
|
1
|
+
{"version":3,"sources":["../../src/stream/deferred_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n ReadableStream,\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to stream cleanup operations.\n *\n * These errors are expected when calling reader.read() after releaseLock()\n * or when writing to already closed streams during cleanup:\n *\n * Invalid state: Releasing reader\n * Invalid state: The reader is not attached to a stream\n * Invalid state: Controller is already closed\n * Invalid state: WritableStream is closed\n */\nexport function isStreamReaderReleaseError(e: unknown) {\n const allowedMessages = [\n 'Invalid state: Releasing reader',\n 'Invalid state: The reader is not attached to a stream',\n 'Controller is already closed',\n 'WritableStream is closed',\n // bun\n 'Stream reader cancelled via releaseLock()',\n // deno\n 'The reader was released.',\n ];\n\n if (e instanceof TypeError || (e instanceof Error && e.name === 'AbortError')) {\n return allowedMessages.some((message) => e.message.includes(message));\n }\n\n return false;\n}\nexport class DeferredReadableStream<T> {\n private transform: IdentityTransform<T>;\n private writer: WritableStreamDefaultWriter<T>;\n private sourceReader?: ReadableStreamDefaultReader<T>;\n\n constructor() {\n this.transform = new IdentityTransform<T>();\n this.writer = this.transform.writable.getWriter();\n }\n\n get stream() {\n return this.transform.readable;\n }\n\n get isSourceSet() {\n return !!this.sourceReader;\n }\n\n /**\n * Call once the actual source is ready.\n */\n setSource(source: ReadableStream<T>) {\n if (this.isSourceSet) {\n throw new Error('Stream source already set');\n }\n\n const sourceReader = source.getReader();\n this.sourceReader = sourceReader;\n void this.pump(sourceReader);\n }\n\n private async pump(sourceReader: ReadableStreamDefaultReader<T>) {\n let sourceError: unknown;\n\n try {\n while (true) {\n const { done, value } = await sourceReader.read();\n if (done) break;\n await this.writer.write(value);\n }\n } catch (e) {\n // skip stream cleanup related errors\n if (isStreamReaderReleaseError(e)) return;\n\n sourceError = e;\n } finally {\n // any other error from source will be propagated to the consumer\n if (sourceError) {\n try {\n await this.writer.abort(sourceError);\n } catch (e) {\n // ignore if writer is already closed\n }\n return;\n }\n\n // release lock so this.stream.getReader().read() will terminate with done: true\n try {\n this.writer.releaseLock();\n } catch (e) {\n // ignore if writer lock is already released\n }\n\n // we only close the writable stream after done\n try {\n await this.transform.writable.close();\n // NOTE: we do not cancel this.transform.readable as there might be access to\n // this.transform.readable.getReader() outside that blocks this cancellation\n // hence, user is responsible for canceling reader on their own\n } catch (e) {\n // ignore TypeError: Invalid state: WritableStream is closed\n // in case stream reader is already closed, this will throw\n // but we ignore it as we are closing the stream anyway\n }\n }\n }\n\n /**\n * Detach the source stream and clean up resources.\n */\n async detachSource() {\n if (!this.isSourceSet) {\n // No-op if source was never set - this is a common case during cleanup\n return;\n }\n\n const sourceReader = this.sourceReader!;\n // Clear source first so future setSource() calls can reattach cleanly.\n this.sourceReader = undefined;\n\n // release lock will make any pending read() throw TypeError\n // which are expected, and we intentionally catch those error\n // using isStreamReaderReleaseError\n // this will unblock any pending read() inside the async for loop\n try {\n sourceReader.releaseLock();\n } catch (e) {\n if (!isStreamReaderReleaseError(e)) {\n throw e;\n }\n }\n }\n}\n"],"mappings":"AAQA,SAAS,yBAAyB;AAa3B,SAAS,2BAA2B,GAAY;AACrD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACF;AAEA,MAAI,aAAa,aAAc,aAAa,SAAS,EAAE,SAAS,cAAe;AAC7E,WAAO,gBAAgB,KAAK,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AACT;AACO,MAAM,uBAA0B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,YAAY,IAAI,kBAAqB;AAC1C,SAAK,SAAS,KAAK,UAAU,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA2B;AACnC,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,eAAe,OAAO,UAAU;AACtC,SAAK,eAAe;AACpB,SAAK,KAAK,KAAK,YAAY;AAAA,EAC7B;AAAA,EAEA,MAAc,KAAK,cAA8C;AAC/D,QAAI;AAEJ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AAChD,YAAI,KAAM;AACV,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,SAAS,GAAG;AAEV,UAAI,2BAA2B,CAAC,EAAG;AAEnC,oBAAc;AAAA,IAChB,UAAE;AAEA,UAAI,aAAa;AACf,YAAI;AACF,gBAAM,KAAK,OAAO,MAAM,WAAW;AAAA,QACrC,SAAS,GAAG;AAAA,QAEZ;AACA;AAAA,MACF;AAGA,UAAI;AACF,aAAK,OAAO,YAAY;AAAA,MAC1B,SAAS,GAAG;AAAA,MAEZ;AAGA,UAAI;AACF,cAAM,KAAK,UAAU,SAAS,MAAM;AAAA,MAItC,SAAS,GAAG;AAAA,MAIZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe;AACnB,QAAI,CAAC,KAAK,aAAa;AAErB;AAAA,IACF;AAEA,UAAM,eAAe,KAAK;AAE1B,SAAK,eAAe;AAMpB,QAAI;AACF,mBAAa,YAAY;AAAA,IAC3B,SAAS,GAAG;AACV,UAAI,CAAC,2BAA2B,CAAC,GAAG;AAClC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -360,9 +360,9 @@ var import_deferred_stream = require("./deferred_stream.cjs");
|
|
|
360
360
|
deferred.setSource(source1);
|
|
361
361
|
(0, import_vitest.expect)(() => deferred.setSource(source2)).toThrow("Stream source already set");
|
|
362
362
|
});
|
|
363
|
-
(0, import_vitest.it)("should
|
|
363
|
+
(0, import_vitest.it)("should safely detach source before setting it (no-op)", async () => {
|
|
364
364
|
const deferred = new import_deferred_stream.DeferredReadableStream();
|
|
365
|
-
await (0, import_vitest.expect)(deferred.detachSource()).
|
|
365
|
+
await (0, import_vitest.expect)(deferred.detachSource()).resolves.toBeUndefined();
|
|
366
366
|
});
|
|
367
367
|
(0, import_vitest.it)("read returns undefined as soon as reader is cancelled", async () => {
|
|
368
368
|
const deferred = new import_deferred_stream.DeferredReadableStream();
|