@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/src/tts/tts.ts
CHANGED
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
import type { AudioFrame } from '@livekit/rtc-node';
|
|
5
5
|
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
|
|
6
|
+
import type { Span } from '@opentelemetry/api';
|
|
6
7
|
import { EventEmitter } from 'node:events';
|
|
7
8
|
import type { ReadableStream } from 'node:stream/web';
|
|
8
|
-
import { APIConnectionError,
|
|
9
|
+
import { APIConnectionError, APIError } from '../_exceptions.js';
|
|
9
10
|
import { log } from '../log.js';
|
|
10
11
|
import type { TTSMetrics } from '../metrics/base.js';
|
|
11
12
|
import { DeferredReadableStream } from '../stream/deferred_stream.js';
|
|
12
|
-
import {
|
|
13
|
+
import { recordException, traceTypes, tracer } from '../telemetry/index.js';
|
|
14
|
+
import { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS, intervalForRetry } from '../types.js';
|
|
13
15
|
import { AsyncIterableQueue, delay, mergeFrames, startSoon, toError } from '../utils.js';
|
|
16
|
+
import type { TimedString } from '../voice/io.js';
|
|
14
17
|
|
|
15
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* SynthesizedAudio is a packet of speech synthesis as returned by the TTS.
|
|
20
|
+
*/
|
|
16
21
|
export interface SynthesizedAudio {
|
|
17
22
|
/** Request ID (one segment could be made up of multiple requests) */
|
|
18
23
|
requestId: string;
|
|
@@ -24,6 +29,10 @@ export interface SynthesizedAudio {
|
|
|
24
29
|
deltaText?: string;
|
|
25
30
|
/** Whether this is the last frame of the segment (streaming only) */
|
|
26
31
|
final: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Timed transcripts associated with this audio packet (word-level timestamps).
|
|
34
|
+
*/
|
|
35
|
+
timedTranscripts?: TimedString[];
|
|
27
36
|
}
|
|
28
37
|
|
|
29
38
|
/**
|
|
@@ -35,6 +44,8 @@ export interface SynthesizedAudio {
|
|
|
35
44
|
*/
|
|
36
45
|
export interface TTSCapabilities {
|
|
37
46
|
streaming: boolean;
|
|
47
|
+
// Whether this TTS supports aligned transcripts (word-level timestamps).
|
|
48
|
+
alignedTranscript?: boolean;
|
|
38
49
|
}
|
|
39
50
|
|
|
40
51
|
export interface TTSError {
|
|
@@ -85,15 +96,49 @@ export abstract class TTS extends (EventEmitter as new () => TypedEmitter<TTSCal
|
|
|
85
96
|
return this.#numChannels;
|
|
86
97
|
}
|
|
87
98
|
|
|
99
|
+
/**
|
|
100
|
+
* Get the model name/identifier for this TTS instance.
|
|
101
|
+
*
|
|
102
|
+
* @returns The model name if available, "unknown" otherwise.
|
|
103
|
+
*
|
|
104
|
+
* @remarks
|
|
105
|
+
* Plugins should override this property to provide their model information.
|
|
106
|
+
*/
|
|
107
|
+
get model(): string {
|
|
108
|
+
return 'unknown';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Get the provider name for this TTS instance.
|
|
113
|
+
*
|
|
114
|
+
* @returns The provider name if available, "unknown" otherwise.
|
|
115
|
+
*
|
|
116
|
+
* @remarks
|
|
117
|
+
* Plugins should override this property to provide their provider information.
|
|
118
|
+
*/
|
|
119
|
+
get provider(): string {
|
|
120
|
+
return 'unknown';
|
|
121
|
+
}
|
|
122
|
+
|
|
88
123
|
/**
|
|
89
124
|
* Receives text and returns synthesis in the form of a {@link ChunkedStream}
|
|
90
125
|
*/
|
|
91
|
-
abstract synthesize(
|
|
126
|
+
abstract synthesize(
|
|
127
|
+
text: string,
|
|
128
|
+
connOptions?: APIConnectOptions,
|
|
129
|
+
abortSignal?: AbortSignal,
|
|
130
|
+
): ChunkedStream;
|
|
92
131
|
|
|
93
132
|
/**
|
|
94
133
|
* Returns a {@link SynthesizeStream} that can be used to push text and receive audio data
|
|
134
|
+
*
|
|
135
|
+
* @param options - Optional configuration including connection options
|
|
95
136
|
*/
|
|
96
|
-
abstract stream(): SynthesizeStream;
|
|
137
|
+
abstract stream(options?: { connOptions?: APIConnectOptions }): SynthesizeStream;
|
|
138
|
+
|
|
139
|
+
async close(): Promise<void> {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
97
142
|
}
|
|
98
143
|
|
|
99
144
|
/**
|
|
@@ -123,12 +168,7 @@ export abstract class SynthesizeStream
|
|
|
123
168
|
SynthesizedAudio | typeof SynthesizeStream.END_OF_STREAM
|
|
124
169
|
>();
|
|
125
170
|
protected closed = false;
|
|
126
|
-
|
|
127
|
-
#tts: TTS;
|
|
128
|
-
#metricsPendingTexts: string[] = [];
|
|
129
|
-
#metricsText = '';
|
|
130
|
-
#monitorMetricsTask?: Promise<void>;
|
|
131
|
-
private _connOptions: APIConnectOptions;
|
|
171
|
+
protected connOptions: APIConnectOptions;
|
|
132
172
|
protected abortController = new AbortController();
|
|
133
173
|
|
|
134
174
|
private deferredInputStream: DeferredReadableStream<
|
|
@@ -136,16 +176,27 @@ export abstract class SynthesizeStream
|
|
|
136
176
|
>;
|
|
137
177
|
private logger = log();
|
|
138
178
|
|
|
179
|
+
abstract label: string;
|
|
180
|
+
|
|
181
|
+
#tts: TTS;
|
|
182
|
+
#metricsPendingTexts: string[] = [];
|
|
183
|
+
#metricsText = '';
|
|
184
|
+
#monitorMetricsTask?: Promise<void>;
|
|
185
|
+
#ttsRequestSpan?: Span;
|
|
186
|
+
#inputTokens = 0;
|
|
187
|
+
#outputTokens = 0;
|
|
188
|
+
|
|
139
189
|
constructor(tts: TTS, connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS) {
|
|
140
190
|
this.#tts = tts;
|
|
141
|
-
this.
|
|
191
|
+
this.connOptions = connOptions;
|
|
142
192
|
this.deferredInputStream = new DeferredReadableStream();
|
|
143
193
|
this.pumpInput();
|
|
194
|
+
|
|
144
195
|
this.abortController.signal.addEventListener('abort', () => {
|
|
145
196
|
this.deferredInputStream.detachSource();
|
|
146
197
|
// TODO (AJS-36) clean this up when we refactor with streams
|
|
147
|
-
this.input.close();
|
|
148
|
-
this.output.close();
|
|
198
|
+
if (!this.input.closed) this.input.close();
|
|
199
|
+
if (!this.output.closed) this.output.close();
|
|
149
200
|
this.closed = true;
|
|
150
201
|
});
|
|
151
202
|
|
|
@@ -153,31 +204,49 @@ export abstract class SynthesizeStream
|
|
|
153
204
|
// is run **after** the constructor has finished. Otherwise we get
|
|
154
205
|
// runtime error when trying to access class variables in the
|
|
155
206
|
// `run` method.
|
|
156
|
-
startSoon(() => this.mainTask().
|
|
207
|
+
startSoon(() => this.mainTask().finally(() => this.queue.close()));
|
|
157
208
|
}
|
|
158
209
|
|
|
159
|
-
private async
|
|
160
|
-
|
|
210
|
+
private _mainTaskImpl = async (span: Span) => {
|
|
211
|
+
this.#ttsRequestSpan = span;
|
|
212
|
+
span.setAttributes({
|
|
213
|
+
[traceTypes.ATTR_TTS_STREAMING]: true,
|
|
214
|
+
[traceTypes.ATTR_TTS_LABEL]: this.#tts.label,
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
for (let i = 0; i < this.connOptions.maxRetry + 1; i++) {
|
|
161
218
|
try {
|
|
162
|
-
return await
|
|
219
|
+
return await tracer.startActiveSpan(
|
|
220
|
+
async (attemptSpan) => {
|
|
221
|
+
attemptSpan.setAttribute(traceTypes.ATTR_RETRY_COUNT, i);
|
|
222
|
+
try {
|
|
223
|
+
return await this.run();
|
|
224
|
+
} catch (error) {
|
|
225
|
+
recordException(attemptSpan, toError(error));
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
{ name: 'tts_request_run' },
|
|
230
|
+
);
|
|
163
231
|
} catch (error) {
|
|
164
|
-
if (error instanceof
|
|
165
|
-
const retryInterval = this.
|
|
232
|
+
if (error instanceof APIError) {
|
|
233
|
+
const retryInterval = intervalForRetry(this.connOptions, i);
|
|
166
234
|
|
|
167
|
-
if (this.
|
|
235
|
+
if (this.connOptions.maxRetry === 0 || !error.retryable) {
|
|
168
236
|
this.emitError({ error, recoverable: false });
|
|
169
237
|
throw error;
|
|
170
|
-
} else if (i === this.
|
|
238
|
+
} else if (i === this.connOptions.maxRetry) {
|
|
171
239
|
this.emitError({ error, recoverable: false });
|
|
172
240
|
throw new APIConnectionError({
|
|
173
|
-
message: `failed to generate TTS completion after ${this.
|
|
241
|
+
message: `failed to generate TTS completion after ${this.connOptions.maxRetry + 1} attempts`,
|
|
174
242
|
options: { retryable: false },
|
|
175
243
|
});
|
|
176
244
|
} else {
|
|
177
|
-
|
|
245
|
+
// Don't emit error event for recoverable errors during retry loop
|
|
246
|
+
// to avoid ERR_UNHANDLED_ERROR or premature session termination
|
|
178
247
|
this.logger.warn(
|
|
179
248
|
{ tts: this.#tts.label, attempt: i + 1, error },
|
|
180
|
-
`failed to synthesize speech, retrying in
|
|
249
|
+
`failed to synthesize speech, retrying in ${retryInterval}ms`,
|
|
181
250
|
);
|
|
182
251
|
}
|
|
183
252
|
|
|
@@ -190,7 +259,13 @@ export abstract class SynthesizeStream
|
|
|
190
259
|
}
|
|
191
260
|
}
|
|
192
261
|
}
|
|
193
|
-
}
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
private mainTask = async () =>
|
|
265
|
+
tracer.startActiveSpan(async (span) => this._mainTaskImpl(span), {
|
|
266
|
+
name: 'tts_request',
|
|
267
|
+
endOnExit: false,
|
|
268
|
+
});
|
|
194
269
|
|
|
195
270
|
private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
|
|
196
271
|
this.#tts.emit('error', {
|
|
@@ -202,7 +277,16 @@ export abstract class SynthesizeStream
|
|
|
202
277
|
});
|
|
203
278
|
}
|
|
204
279
|
|
|
205
|
-
//
|
|
280
|
+
// NOTE(AJS-37): The implementation below uses an AsyncIterableQueue (`this.input`)
|
|
281
|
+
// bridged from a DeferredReadableStream (`this.deferredInputStream`) rather than
|
|
282
|
+
// consuming the stream directly.
|
|
283
|
+
//
|
|
284
|
+
// A full refactor to native Web Streams was considered but is currently deferred.
|
|
285
|
+
// The primary reason is to maintain architectural parity with the Python SDK,
|
|
286
|
+
// which is a key design goal for the project. This ensures a consistent developer
|
|
287
|
+
// experience across both platforms.
|
|
288
|
+
//
|
|
289
|
+
// For more context, see the discussion in GitHub issue # 844.
|
|
206
290
|
protected async pumpInput() {
|
|
207
291
|
const reader = this.deferredInputStream.stream.getReader();
|
|
208
292
|
try {
|
|
@@ -226,9 +310,21 @@ export abstract class SynthesizeStream
|
|
|
226
310
|
}
|
|
227
311
|
}
|
|
228
312
|
|
|
313
|
+
/**
|
|
314
|
+
* Set token usage for token-based TTS billing (e.g., OpenAI TTS).
|
|
315
|
+
* Plugins should call this method to report token usage.
|
|
316
|
+
*/
|
|
317
|
+
protected setTokenUsage({
|
|
318
|
+
inputTokens = 0,
|
|
319
|
+
outputTokens = 0,
|
|
320
|
+
}: { inputTokens?: number; outputTokens?: number } = {}): void {
|
|
321
|
+
this.#inputTokens = inputTokens;
|
|
322
|
+
this.#outputTokens = outputTokens;
|
|
323
|
+
}
|
|
324
|
+
|
|
229
325
|
protected async monitorMetrics() {
|
|
230
326
|
const startTime = process.hrtime.bigint();
|
|
231
|
-
let
|
|
327
|
+
let audioDurationMs = 0;
|
|
232
328
|
let ttfb: bigint = BigInt(-1);
|
|
233
329
|
let requestId = '';
|
|
234
330
|
|
|
@@ -236,19 +332,33 @@ export abstract class SynthesizeStream
|
|
|
236
332
|
if (this.#metricsPendingTexts.length) {
|
|
237
333
|
const text = this.#metricsPendingTexts.shift()!;
|
|
238
334
|
const duration = process.hrtime.bigint() - startTime;
|
|
335
|
+
const roundedAudioDurationMs = Math.round(audioDurationMs);
|
|
239
336
|
const metrics: TTSMetrics = {
|
|
240
337
|
type: 'tts_metrics',
|
|
241
338
|
timestamp: Date.now(),
|
|
242
339
|
requestId,
|
|
243
|
-
|
|
244
|
-
|
|
340
|
+
ttfbMs: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
|
|
341
|
+
durationMs: Math.trunc(Number(duration / BigInt(1000000))),
|
|
245
342
|
charactersCount: text.length,
|
|
246
|
-
|
|
343
|
+
audioDurationMs: roundedAudioDurationMs,
|
|
247
344
|
cancelled: this.abortController.signal.aborted,
|
|
248
345
|
label: this.#tts.label,
|
|
249
|
-
|
|
346
|
+
inputTokens: this.#inputTokens,
|
|
347
|
+
outputTokens: this.#outputTokens,
|
|
348
|
+
streamed: true,
|
|
349
|
+
metadata: {
|
|
350
|
+
modelProvider: this.#tts.provider,
|
|
351
|
+
modelName: this.#tts.model,
|
|
352
|
+
},
|
|
250
353
|
};
|
|
354
|
+
if (this.#ttsRequestSpan) {
|
|
355
|
+
this.#ttsRequestSpan.setAttribute(traceTypes.ATTR_TTS_METRICS, JSON.stringify(metrics));
|
|
356
|
+
}
|
|
251
357
|
this.#tts.emit('metrics_collected', metrics);
|
|
358
|
+
|
|
359
|
+
// Reset token usage after emitting metrics for the next segment
|
|
360
|
+
this.#inputTokens = 0;
|
|
361
|
+
this.#outputTokens = 0;
|
|
252
362
|
}
|
|
253
363
|
};
|
|
254
364
|
|
|
@@ -263,7 +373,7 @@ export abstract class SynthesizeStream
|
|
|
263
373
|
ttfb = process.hrtime.bigint() - startTime;
|
|
264
374
|
}
|
|
265
375
|
// TODO(AJS-102): use frame.durationMs once available in rtc-node
|
|
266
|
-
|
|
376
|
+
audioDurationMs += (audio.frame.samplesPerChannel / audio.frame.sampleRate) * 1000;
|
|
267
377
|
if (audio.final) {
|
|
268
378
|
emit();
|
|
269
379
|
}
|
|
@@ -272,6 +382,11 @@ export abstract class SynthesizeStream
|
|
|
272
382
|
if (requestId) {
|
|
273
383
|
emit();
|
|
274
384
|
}
|
|
385
|
+
|
|
386
|
+
if (this.#ttsRequestSpan) {
|
|
387
|
+
this.#ttsRequestSpan.end();
|
|
388
|
+
this.#ttsRequestSpan = undefined;
|
|
389
|
+
}
|
|
275
390
|
}
|
|
276
391
|
|
|
277
392
|
protected abstract run(): Promise<void>;
|
|
@@ -290,12 +405,11 @@ export abstract class SynthesizeStream
|
|
|
290
405
|
}
|
|
291
406
|
this.#metricsText += text;
|
|
292
407
|
|
|
293
|
-
if (this.input.closed) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
if (this.closed) {
|
|
297
|
-
throw new Error('Stream is closed');
|
|
408
|
+
if (this.input.closed || this.closed) {
|
|
409
|
+
// Stream was aborted/closed, silently skip
|
|
410
|
+
return;
|
|
298
411
|
}
|
|
412
|
+
|
|
299
413
|
this.input.put(text);
|
|
300
414
|
}
|
|
301
415
|
|
|
@@ -305,24 +419,24 @@ export abstract class SynthesizeStream
|
|
|
305
419
|
this.#metricsPendingTexts.push(this.#metricsText);
|
|
306
420
|
this.#metricsText = '';
|
|
307
421
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
throw new Error('Stream is closed');
|
|
422
|
+
|
|
423
|
+
if (this.input.closed || this.closed) {
|
|
424
|
+
// Stream was aborted/closed, silently skip
|
|
425
|
+
return;
|
|
313
426
|
}
|
|
427
|
+
|
|
314
428
|
this.input.put(SynthesizeStream.FLUSH_SENTINEL);
|
|
315
429
|
}
|
|
316
430
|
|
|
317
431
|
/** Mark the input as ended and forbid additional pushes */
|
|
318
432
|
endInput() {
|
|
319
433
|
this.flush();
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
throw new Error('Stream is closed');
|
|
434
|
+
|
|
435
|
+
if (this.input.closed || this.closed) {
|
|
436
|
+
// Stream was aborted/closed, silently skip
|
|
437
|
+
return;
|
|
325
438
|
}
|
|
439
|
+
|
|
326
440
|
this.input.close();
|
|
327
441
|
}
|
|
328
442
|
|
|
@@ -330,6 +444,10 @@ export abstract class SynthesizeStream
|
|
|
330
444
|
return this.output.next();
|
|
331
445
|
}
|
|
332
446
|
|
|
447
|
+
get abortSignal(): AbortSignal {
|
|
448
|
+
return this.abortController.signal;
|
|
449
|
+
}
|
|
450
|
+
|
|
333
451
|
/** Close both the input and output of the TTS stream */
|
|
334
452
|
close() {
|
|
335
453
|
this.abortController.abort();
|
|
@@ -361,34 +479,61 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
361
479
|
abstract label: string;
|
|
362
480
|
#text: string;
|
|
363
481
|
#tts: TTS;
|
|
482
|
+
#ttsRequestSpan?: Span;
|
|
364
483
|
private _connOptions: APIConnectOptions;
|
|
365
484
|
private logger = log();
|
|
485
|
+
#inputTokens = 0;
|
|
486
|
+
#outputTokens = 0;
|
|
487
|
+
|
|
488
|
+
protected abortController = new AbortController();
|
|
366
489
|
|
|
367
490
|
constructor(
|
|
368
491
|
text: string,
|
|
369
492
|
tts: TTS,
|
|
370
493
|
connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS,
|
|
494
|
+
abortSignal?: AbortSignal,
|
|
371
495
|
) {
|
|
372
496
|
this.#text = text;
|
|
373
497
|
this.#tts = tts;
|
|
374
498
|
this._connOptions = connOptions;
|
|
375
499
|
|
|
500
|
+
if (abortSignal) {
|
|
501
|
+
abortSignal.addEventListener('abort', () => this.abortController.abort(), { once: true });
|
|
502
|
+
}
|
|
503
|
+
|
|
376
504
|
this.monitorMetrics();
|
|
377
505
|
|
|
378
506
|
// this is a hack to immitate asyncio.create_task so that mainTask
|
|
379
507
|
// is run **after** the constructor has finished. Otherwise we get
|
|
380
508
|
// runtime error when trying to access class variables in the
|
|
381
509
|
// `run` method.
|
|
382
|
-
Promise.resolve().then(() => this.mainTask().
|
|
510
|
+
Promise.resolve().then(() => this.mainTask().finally(() => this.queue.close()));
|
|
383
511
|
}
|
|
384
512
|
|
|
385
|
-
private async
|
|
513
|
+
private _mainTaskImpl = async (span: Span) => {
|
|
514
|
+
this.#ttsRequestSpan = span;
|
|
515
|
+
span.setAttributes({
|
|
516
|
+
[traceTypes.ATTR_TTS_STREAMING]: false,
|
|
517
|
+
[traceTypes.ATTR_TTS_LABEL]: this.#tts.label,
|
|
518
|
+
});
|
|
519
|
+
|
|
386
520
|
for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
|
|
387
521
|
try {
|
|
388
|
-
return await
|
|
522
|
+
return await tracer.startActiveSpan(
|
|
523
|
+
async (attemptSpan) => {
|
|
524
|
+
attemptSpan.setAttribute(traceTypes.ATTR_RETRY_COUNT, i);
|
|
525
|
+
try {
|
|
526
|
+
return await this.run();
|
|
527
|
+
} catch (error) {
|
|
528
|
+
recordException(attemptSpan, toError(error));
|
|
529
|
+
throw error;
|
|
530
|
+
}
|
|
531
|
+
},
|
|
532
|
+
{ name: 'tts_request_run' },
|
|
533
|
+
);
|
|
389
534
|
} catch (error) {
|
|
390
|
-
if (error instanceof
|
|
391
|
-
const retryInterval = this._connOptions
|
|
535
|
+
if (error instanceof APIError) {
|
|
536
|
+
const retryInterval = intervalForRetry(this._connOptions, i);
|
|
392
537
|
|
|
393
538
|
if (this._connOptions.maxRetry === 0 || !error.retryable) {
|
|
394
539
|
this.emitError({ error, recoverable: false });
|
|
@@ -400,10 +545,11 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
400
545
|
options: { retryable: false },
|
|
401
546
|
});
|
|
402
547
|
} else {
|
|
403
|
-
|
|
548
|
+
// Don't emit error event for recoverable errors during retry loop
|
|
549
|
+
// to avoid ERR_UNHANDLED_ERROR or premature session termination
|
|
404
550
|
this.logger.warn(
|
|
405
551
|
{ tts: this.#tts.label, attempt: i + 1, error },
|
|
406
|
-
`failed to generate TTS completion, retrying in ${retryInterval}
|
|
552
|
+
`failed to generate TTS completion, retrying in ${retryInterval}ms`,
|
|
407
553
|
);
|
|
408
554
|
}
|
|
409
555
|
|
|
@@ -416,6 +562,13 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
416
562
|
}
|
|
417
563
|
}
|
|
418
564
|
}
|
|
565
|
+
};
|
|
566
|
+
|
|
567
|
+
private async mainTask() {
|
|
568
|
+
return tracer.startActiveSpan(async (span) => this._mainTaskImpl(span), {
|
|
569
|
+
name: 'tts_request',
|
|
570
|
+
endOnExit: false,
|
|
571
|
+
});
|
|
419
572
|
}
|
|
420
573
|
|
|
421
574
|
private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
|
|
@@ -434,9 +587,25 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
434
587
|
return this.#text;
|
|
435
588
|
}
|
|
436
589
|
|
|
590
|
+
get abortSignal(): AbortSignal {
|
|
591
|
+
return this.abortController.signal;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Set token usage for token-based TTS billing (e.g., OpenAI TTS).
|
|
596
|
+
* Plugins should call this method to report token usage.
|
|
597
|
+
*/
|
|
598
|
+
protected setTokenUsage({
|
|
599
|
+
inputTokens = 0,
|
|
600
|
+
outputTokens = 0,
|
|
601
|
+
}: { inputTokens?: number; outputTokens?: number } = {}): void {
|
|
602
|
+
this.#inputTokens = inputTokens;
|
|
603
|
+
this.#outputTokens = outputTokens;
|
|
604
|
+
}
|
|
605
|
+
|
|
437
606
|
protected async monitorMetrics() {
|
|
438
607
|
const startTime = process.hrtime.bigint();
|
|
439
|
-
let
|
|
608
|
+
let audioDurationMs = 0;
|
|
440
609
|
let ttfb: bigint = BigInt(-1);
|
|
441
610
|
let requestId = '';
|
|
442
611
|
|
|
@@ -446,7 +615,7 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
446
615
|
if (ttfb === BigInt(-1)) {
|
|
447
616
|
ttfb = process.hrtime.bigint() - startTime;
|
|
448
617
|
}
|
|
449
|
-
|
|
618
|
+
audioDurationMs += (audio.frame.samplesPerChannel / audio.frame.sampleRate) * 1000;
|
|
450
619
|
}
|
|
451
620
|
this.output.close();
|
|
452
621
|
|
|
@@ -455,14 +624,27 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
455
624
|
type: 'tts_metrics',
|
|
456
625
|
timestamp: Date.now(),
|
|
457
626
|
requestId,
|
|
458
|
-
|
|
459
|
-
|
|
627
|
+
ttfbMs: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
|
|
628
|
+
durationMs: Math.trunc(Number(duration / BigInt(1000000))),
|
|
460
629
|
charactersCount: this.#text.length,
|
|
461
|
-
|
|
630
|
+
audioDurationMs: Math.round(audioDurationMs),
|
|
462
631
|
cancelled: false, // TODO(AJS-186): support ChunkedStream with 1.0 - add this.abortController.signal.aborted here
|
|
463
632
|
label: this.#tts.label,
|
|
633
|
+
inputTokens: this.#inputTokens,
|
|
634
|
+
outputTokens: this.#outputTokens,
|
|
464
635
|
streamed: false,
|
|
636
|
+
metadata: {
|
|
637
|
+
modelProvider: this.#tts.provider,
|
|
638
|
+
modelName: this.#tts.model,
|
|
639
|
+
},
|
|
465
640
|
};
|
|
641
|
+
|
|
642
|
+
if (this.#ttsRequestSpan) {
|
|
643
|
+
this.#ttsRequestSpan.setAttribute(traceTypes.ATTR_TTS_METRICS, JSON.stringify(metrics));
|
|
644
|
+
this.#ttsRequestSpan.end();
|
|
645
|
+
this.#ttsRequestSpan = undefined;
|
|
646
|
+
}
|
|
647
|
+
|
|
466
648
|
this.#tts.emit('metrics_collected', metrics);
|
|
467
649
|
}
|
|
468
650
|
|
|
@@ -481,8 +663,9 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
481
663
|
|
|
482
664
|
/** Close both the input and output of the TTS stream */
|
|
483
665
|
close() {
|
|
484
|
-
this.queue.close();
|
|
485
|
-
this.output.close();
|
|
666
|
+
if (!this.queue.closed) this.queue.close();
|
|
667
|
+
if (!this.output.closed) this.output.close();
|
|
668
|
+
if (!this.abortController.signal.aborted) this.abortController.abort();
|
|
486
669
|
this.closed = true;
|
|
487
670
|
}
|
|
488
671
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 LiveKit, Inc.
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
type InferErrors<T> = T extends TypedPromise<any, infer E> ? E : never;
|
|
5
|
+
|
|
6
|
+
interface PromiseRejectedResult<E> {
|
|
7
|
+
status: 'rejected';
|
|
8
|
+
reason: E;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type SettledResult<T> =
|
|
12
|
+
T extends TypedPromise<infer U, infer E>
|
|
13
|
+
? PromiseFulfilledResult<U> | PromiseRejectedResult<E>
|
|
14
|
+
: T extends PromiseLike<infer U>
|
|
15
|
+
? PromiseFulfilledResult<U> | PromiseRejectedResult<unknown>
|
|
16
|
+
: PromiseFulfilledResult<T> | PromiseRejectedResult<unknown>;
|
|
17
|
+
|
|
18
|
+
export default class TypedPromise<T, E extends Error> extends Promise<T> {
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-useless-constructor
|
|
20
|
+
constructor(
|
|
21
|
+
executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason: E) => void) => void,
|
|
22
|
+
) {
|
|
23
|
+
super(executor);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
catch<TResult = never>(
|
|
27
|
+
onrejected?: ((reason: E) => TResult | PromiseLike<TResult>) | null | undefined,
|
|
28
|
+
): TypedPromise<T | TResult, E> {
|
|
29
|
+
return super.catch(onrejected);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static resolve: {
|
|
33
|
+
(): TypedPromise<void, never>;
|
|
34
|
+
<V>(value: V): TypedPromise<Awaited<V>, never>;
|
|
35
|
+
} = <V>(value?: V): TypedPromise<Awaited<V>, never> => {
|
|
36
|
+
return super.resolve(value) as TypedPromise<Awaited<V>, never>;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
static reject<E extends Error>(reason: E): TypedPromise<never, E> {
|
|
40
|
+
return super.reject(reason);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static all<T extends readonly unknown[] | []>(
|
|
44
|
+
values: T,
|
|
45
|
+
): TypedPromise<{ -readonly [P in keyof T]: Awaited<T[P]> }, InferErrors<T[number]>> {
|
|
46
|
+
return super.all(values) as any;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static allSettled<T extends readonly unknown[] | []>(
|
|
50
|
+
values: T,
|
|
51
|
+
): TypedPromise<{ -readonly [P in keyof T]: SettledResult<T[P]> }, never> {
|
|
52
|
+
return super.allSettled(values) as any;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static race<T extends readonly (TypedPromise<any, any> | any)[]>(
|
|
56
|
+
values: T,
|
|
57
|
+
): TypedPromise<
|
|
58
|
+
T[number] extends TypedPromise<infer U, any>
|
|
59
|
+
? U
|
|
60
|
+
: T[number] extends PromiseLike<infer U>
|
|
61
|
+
? U
|
|
62
|
+
: Awaited<T[number]>,
|
|
63
|
+
InferErrors<T[number]>
|
|
64
|
+
> {
|
|
65
|
+
return super.race(values);
|
|
66
|
+
}
|
|
67
|
+
}
|