@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
package/src/inference/tts.ts
CHANGED
|
@@ -5,96 +5,169 @@ import type { AudioFrame } from '@livekit/rtc-node';
|
|
|
5
5
|
import { WebSocket } from 'ws';
|
|
6
6
|
import { APIError, APIStatusError } from '../_exceptions.js';
|
|
7
7
|
import { AudioByteStream } from '../audio.js';
|
|
8
|
+
import { ConnectionPool } from '../connection_pool.js';
|
|
9
|
+
import { type LanguageCode, normalizeLanguage } from '../language.js';
|
|
8
10
|
import { log } from '../log.js';
|
|
9
11
|
import { createStreamChannel } from '../stream/stream_channel.js';
|
|
10
12
|
import { basic as tokenizeBasic } from '../tokenize/index.js';
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
TTS as BaseTTS,
|
|
14
|
-
ChunkedStream,
|
|
15
|
-
} from '../tts/index.js';
|
|
13
|
+
import type { ChunkedStream } from '../tts/index.js';
|
|
14
|
+
import { SynthesizeStream as BaseSynthesizeStream, TTS as BaseTTS } from '../tts/index.js';
|
|
16
15
|
import { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS } from '../types.js';
|
|
17
|
-
import { shortuuid } from '../utils.js';
|
|
16
|
+
import { Event, Future, Task, cancelAndWait, combineSignals, shortuuid } from '../utils.js';
|
|
18
17
|
import {
|
|
19
18
|
type TtsClientEvent,
|
|
20
19
|
type TtsServerEvent,
|
|
21
|
-
type TtsSessionCreateEvent,
|
|
22
20
|
ttsClientEventSchema,
|
|
23
21
|
ttsServerEventSchema,
|
|
24
22
|
} from './api_protos.js';
|
|
25
|
-
import { type
|
|
23
|
+
import { type AnyString, connectWs, createAccessToken, getDefaultInferenceUrl } from './utils.js';
|
|
26
24
|
|
|
27
|
-
type
|
|
25
|
+
export type CartesiaModels =
|
|
26
|
+
| 'cartesia/sonic-3'
|
|
27
|
+
| 'cartesia/sonic-2'
|
|
28
|
+
| 'cartesia/sonic-turbo'
|
|
29
|
+
| 'cartesia/sonic';
|
|
28
30
|
|
|
29
|
-
export type
|
|
31
|
+
export type DeepgramTTSModels = 'deepgram/aura' | 'deepgram/aura-2';
|
|
30
32
|
|
|
31
|
-
type
|
|
32
|
-
| 'elevenlabs'
|
|
33
|
+
export type ElevenlabsModels =
|
|
33
34
|
| 'elevenlabs/eleven_flash_v2'
|
|
34
35
|
| 'elevenlabs/eleven_flash_v2_5'
|
|
35
36
|
| 'elevenlabs/eleven_turbo_v2'
|
|
36
37
|
| 'elevenlabs/eleven_turbo_v2_5'
|
|
37
38
|
| 'elevenlabs/eleven_multilingual_v2';
|
|
38
39
|
|
|
39
|
-
export type
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
export type _InworldModels = 'inworld' | 'inworld/inworld-tts-1';
|
|
40
|
+
export type InworldModels =
|
|
41
|
+
| 'inworld/inworld-tts-1.5-max'
|
|
42
|
+
| 'inworld/inworld-tts-1.5-mini'
|
|
43
|
+
| 'inworld/inworld-tts-1-max'
|
|
44
|
+
| 'inworld/inworld-tts-1';
|
|
46
45
|
|
|
47
|
-
export type
|
|
46
|
+
export type RimeModels = 'rime/arcana' | 'rime/mistv2';
|
|
48
47
|
|
|
49
48
|
export interface CartesiaOptions {
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
/** Maximum duration of audio in seconds. */
|
|
50
|
+
duration?: number;
|
|
51
|
+
/** Speech speed. Default: not specified. */
|
|
52
|
+
speed?: 'slow' | 'normal' | 'fast';
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
export interface ElevenlabsOptions {
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
/** Inactivity timeout in seconds. Default: 60. */
|
|
57
|
+
inactivity_timeout?: number;
|
|
58
|
+
/** Text normalization mode. Default: "auto". */
|
|
59
|
+
apply_text_normalization?: 'auto' | 'off' | 'on';
|
|
57
60
|
}
|
|
58
61
|
|
|
62
|
+
export interface DeepgramTTSOptions {}
|
|
63
|
+
|
|
59
64
|
export interface RimeOptions {}
|
|
60
65
|
|
|
61
|
-
export interface InworldOptions {
|
|
66
|
+
export interface InworldOptions {
|
|
67
|
+
/** Controls how fast the voice speaks. 1.0 is normal speed, 0.5 is half, 1.5 is 1.5x. Default: 1.0. */
|
|
68
|
+
speaking_rate?: number;
|
|
69
|
+
/** Controls randomness in the output. Recommended between 0.6 and 1.1. Default: 1.1. */
|
|
70
|
+
temperature?: number;
|
|
71
|
+
/** Controls text normalization. "ON" expands numbers, dates, abbreviations. "OFF" reads text as written. Default: "ON". */
|
|
72
|
+
text_normalization?: 'ON' | 'OFF';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
type _TTSModels =
|
|
76
|
+
| CartesiaModels
|
|
77
|
+
| DeepgramTTSModels
|
|
78
|
+
| ElevenlabsModels
|
|
79
|
+
| RimeModels
|
|
80
|
+
| InworldModels;
|
|
81
|
+
|
|
82
|
+
export type TTSModels =
|
|
83
|
+
| CartesiaModels
|
|
84
|
+
| DeepgramTTSModels
|
|
85
|
+
| ElevenlabsModels
|
|
86
|
+
| RimeModels
|
|
87
|
+
| InworldModels
|
|
88
|
+
| AnyString;
|
|
62
89
|
|
|
63
|
-
export type
|
|
90
|
+
export type ModelWithVoice = `${_TTSModels}:${string}` | TTSModels;
|
|
64
91
|
|
|
65
92
|
export type TTSOptions<TModel extends TTSModels> = TModel extends CartesiaModels
|
|
66
93
|
? CartesiaOptions
|
|
67
|
-
: TModel extends
|
|
68
|
-
?
|
|
69
|
-
: TModel extends
|
|
70
|
-
?
|
|
71
|
-
: TModel extends
|
|
72
|
-
?
|
|
73
|
-
:
|
|
94
|
+
: TModel extends DeepgramTTSModels
|
|
95
|
+
? DeepgramTTSOptions
|
|
96
|
+
: TModel extends ElevenlabsModels
|
|
97
|
+
? ElevenlabsOptions
|
|
98
|
+
: TModel extends RimeModels
|
|
99
|
+
? RimeOptions
|
|
100
|
+
: TModel extends InworldModels
|
|
101
|
+
? InworldOptions
|
|
102
|
+
: Record<string, unknown>;
|
|
103
|
+
|
|
104
|
+
/** Parse a model string into [model, voice]. Voice is undefined if not specified. */
|
|
105
|
+
export function parseTTSModelString(model: string): [string, string | undefined] {
|
|
106
|
+
const idx = model.lastIndexOf(':');
|
|
107
|
+
if (idx !== -1) {
|
|
108
|
+
return [model.slice(0, idx), model.slice(idx + 1)];
|
|
109
|
+
}
|
|
110
|
+
return [model, undefined];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** A fallback model with optional extra configuration. Extra fields are passed through to the provider. */
|
|
114
|
+
export interface TTSFallbackModel {
|
|
115
|
+
/** Model name (e.g. "cartesia/sonic", "elevenlabs/eleven_flash_v2", "rime/arcana"). */
|
|
116
|
+
model: string;
|
|
117
|
+
/** Voice to use for the model. */
|
|
118
|
+
voice: string;
|
|
119
|
+
/** Extra configuration for the model. */
|
|
120
|
+
extraKwargs?: Record<string, unknown>;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type TTSFallbackModelType = TTSFallbackModel | string;
|
|
124
|
+
|
|
125
|
+
/** Normalize a single or list of FallbackModelType into TTSFallbackModel[]. */
|
|
126
|
+
export function normalizeTTSFallback(
|
|
127
|
+
fallback: TTSFallbackModelType | TTSFallbackModelType[],
|
|
128
|
+
): TTSFallbackModel[] {
|
|
129
|
+
const makeFallback = (model: TTSFallbackModelType): TTSFallbackModel => {
|
|
130
|
+
if (typeof model === 'string') {
|
|
131
|
+
const [name, voice] = parseTTSModelString(model);
|
|
132
|
+
return { model: name, voice: voice ?? '' };
|
|
133
|
+
}
|
|
134
|
+
return model;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
if (Array.isArray(fallback)) {
|
|
138
|
+
return fallback.map(makeFallback);
|
|
139
|
+
}
|
|
140
|
+
return [makeFallback(fallback)];
|
|
141
|
+
}
|
|
74
142
|
|
|
75
143
|
type TTSEncoding = 'pcm_s16le';
|
|
76
144
|
|
|
77
145
|
const DEFAULT_ENCODING: TTSEncoding = 'pcm_s16le';
|
|
78
146
|
const DEFAULT_SAMPLE_RATE = 16000;
|
|
79
|
-
const DEFAULT_BASE_URL = 'https://agent-gateway.livekit.cloud/v1';
|
|
80
147
|
const NUM_CHANNELS = 1;
|
|
81
148
|
const DEFAULT_LANGUAGE = 'en';
|
|
82
149
|
|
|
83
150
|
export interface InferenceTTSOptions<TModel extends TTSModels> {
|
|
84
151
|
model?: TModel;
|
|
85
152
|
voice?: string;
|
|
86
|
-
language?:
|
|
153
|
+
language?: LanguageCode;
|
|
87
154
|
encoding: TTSEncoding;
|
|
88
155
|
sampleRate: number;
|
|
89
156
|
baseURL: string;
|
|
90
157
|
apiKey: string;
|
|
91
158
|
apiSecret: string;
|
|
92
|
-
|
|
159
|
+
modelOptions: TTSOptions<TModel>;
|
|
160
|
+
fallback?: TTSFallbackModel[];
|
|
161
|
+
connOptions?: APIConnectOptions;
|
|
93
162
|
}
|
|
94
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Livekit Cloud Inference TTS
|
|
166
|
+
*/
|
|
95
167
|
export class TTS<TModel extends TTSModels> extends BaseTTS {
|
|
96
168
|
private opts: InferenceTTSOptions<TModel>;
|
|
97
169
|
private streams: Set<SynthesizeStream<TModel>> = new Set();
|
|
170
|
+
pool: ConnectionPool<WebSocket>;
|
|
98
171
|
|
|
99
172
|
#logger = log();
|
|
100
173
|
|
|
@@ -107,7 +180,9 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
|
|
|
107
180
|
sampleRate?: number;
|
|
108
181
|
apiKey?: string;
|
|
109
182
|
apiSecret?: string;
|
|
110
|
-
|
|
183
|
+
modelOptions?: TTSOptions<TModel>;
|
|
184
|
+
fallback?: TTSFallbackModelType | TTSFallbackModelType[];
|
|
185
|
+
connOptions?: APIConnectOptions;
|
|
111
186
|
}) {
|
|
112
187
|
const sampleRate = opts?.sampleRate ?? DEFAULT_SAMPLE_RATE;
|
|
113
188
|
super(sampleRate, 1, { streaming: true });
|
|
@@ -120,10 +195,12 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
|
|
|
120
195
|
encoding = DEFAULT_ENCODING,
|
|
121
196
|
apiKey,
|
|
122
197
|
apiSecret,
|
|
123
|
-
|
|
198
|
+
modelOptions = {} as TTSOptions<TModel>,
|
|
199
|
+
fallback,
|
|
200
|
+
connOptions,
|
|
124
201
|
} = opts || {};
|
|
125
202
|
|
|
126
|
-
const lkBaseURL = baseURL ||
|
|
203
|
+
const lkBaseURL = baseURL || getDefaultInferenceUrl();
|
|
127
204
|
const lkApiKey = apiKey || process.env.LIVEKIT_INFERENCE_API_KEY || process.env.LIVEKIT_API_KEY;
|
|
128
205
|
if (!lkApiKey) {
|
|
129
206
|
throw new Error('apiKey is required: pass apiKey or set LIVEKIT_API_KEY');
|
|
@@ -154,27 +231,57 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
|
|
|
154
231
|
}
|
|
155
232
|
}
|
|
156
233
|
|
|
234
|
+
const normalizedFallback = fallback ? normalizeTTSFallback(fallback) : undefined;
|
|
235
|
+
|
|
157
236
|
this.opts = {
|
|
158
237
|
model: nextModel,
|
|
159
238
|
voice: nextVoice,
|
|
160
|
-
language,
|
|
239
|
+
language: normalizeLanguage(language),
|
|
161
240
|
encoding,
|
|
162
241
|
sampleRate,
|
|
163
242
|
baseURL: lkBaseURL,
|
|
164
243
|
apiKey: lkApiKey,
|
|
165
244
|
apiSecret: lkApiSecret,
|
|
166
|
-
|
|
245
|
+
modelOptions,
|
|
246
|
+
fallback: normalizedFallback,
|
|
247
|
+
connOptions: connOptions ?? DEFAULT_API_CONNECT_OPTIONS,
|
|
167
248
|
};
|
|
249
|
+
|
|
250
|
+
// Initialize connection pool
|
|
251
|
+
this.pool = new ConnectionPool<WebSocket>({
|
|
252
|
+
connectCb: (timeout) => this.connectWs(timeout),
|
|
253
|
+
closeCb: (ws) => this.closeWs(ws),
|
|
254
|
+
maxSessionDuration: 300_000,
|
|
255
|
+
markRefreshedOnGet: true,
|
|
256
|
+
connectTimeout: 10_000, // 10 seconds default
|
|
257
|
+
});
|
|
168
258
|
}
|
|
169
259
|
|
|
170
260
|
get label() {
|
|
171
261
|
return 'inference.TTS';
|
|
172
262
|
}
|
|
173
263
|
|
|
264
|
+
get model(): string {
|
|
265
|
+
return this.opts.model ?? 'unknown';
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
get provider(): string {
|
|
269
|
+
return 'livekit';
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
static fromModelString(modelString: string): TTS<AnyString> {
|
|
273
|
+
const [model, voice] = parseTTSModelString(modelString);
|
|
274
|
+
return new TTS({ model, voice: voice || undefined });
|
|
275
|
+
}
|
|
276
|
+
|
|
174
277
|
updateOptions(opts: Partial<Pick<InferenceTTSOptions<TModel>, 'model' | 'voice' | 'language'>>) {
|
|
175
|
-
this.opts = {
|
|
278
|
+
this.opts = {
|
|
279
|
+
...this.opts,
|
|
280
|
+
...opts,
|
|
281
|
+
language: opts.language !== undefined ? normalizeLanguage(opts.language) : this.opts.language,
|
|
282
|
+
};
|
|
176
283
|
for (const stream of this.streams) {
|
|
177
|
-
stream.updateOptions(opts);
|
|
284
|
+
stream.updateOptions(this.opts);
|
|
178
285
|
}
|
|
179
286
|
}
|
|
180
287
|
|
|
@@ -183,7 +290,7 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
|
|
|
183
290
|
}
|
|
184
291
|
|
|
185
292
|
stream(options?: { connOptions?: APIConnectOptions }): SynthesizeStream<TModel> {
|
|
186
|
-
const { connOptions = DEFAULT_API_CONNECT_OPTIONS } = options || {};
|
|
293
|
+
const { connOptions = this.opts.connOptions ?? DEFAULT_API_CONNECT_OPTIONS } = options || {};
|
|
187
294
|
const stream = new SynthesizeStream(this, { ...this.opts }, connOptions);
|
|
188
295
|
this.streams.add(stream);
|
|
189
296
|
return stream;
|
|
@@ -203,13 +310,31 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
|
|
|
203
310
|
type: 'session.create',
|
|
204
311
|
sample_rate: String(this.opts.sampleRate),
|
|
205
312
|
encoding: this.opts.encoding,
|
|
206
|
-
extra: this.opts.
|
|
207
|
-
} as
|
|
313
|
+
extra: this.opts.modelOptions,
|
|
314
|
+
} as Record<string, unknown>;
|
|
315
|
+
|
|
316
|
+
if (this.opts.voice) (params as Record<string, unknown>).voice = this.opts.voice;
|
|
317
|
+
if (this.opts.model) (params as Record<string, unknown>).model = this.opts.model;
|
|
318
|
+
if (this.opts.language) (params as Record<string, unknown>).language = this.opts.language;
|
|
319
|
+
|
|
320
|
+
if (this.opts.fallback?.length) {
|
|
321
|
+
params.fallback = {
|
|
322
|
+
models: this.opts.fallback.map((m) => ({
|
|
323
|
+
model: m.model,
|
|
324
|
+
voice: m.voice,
|
|
325
|
+
extra: m.extraKwargs ?? {},
|
|
326
|
+
})),
|
|
327
|
+
};
|
|
328
|
+
}
|
|
208
329
|
|
|
209
|
-
if (this.opts.
|
|
210
|
-
|
|
211
|
-
|
|
330
|
+
if (this.opts.connOptions) {
|
|
331
|
+
params.connection = {
|
|
332
|
+
timeout: this.opts.connOptions.timeoutMs / 1000,
|
|
333
|
+
retries: this.opts.connOptions.maxRetry,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
212
336
|
|
|
337
|
+
this.#logger.debug({ url }, 'inference.TTS creating new websocket connection (pool miss)');
|
|
213
338
|
const socket = await connectWs(url, headers, timeout);
|
|
214
339
|
socket.send(JSON.stringify(params));
|
|
215
340
|
return socket;
|
|
@@ -219,18 +344,22 @@ export class TTS<TModel extends TTSModels> extends BaseTTS {
|
|
|
219
344
|
await ws.close();
|
|
220
345
|
}
|
|
221
346
|
|
|
347
|
+
prewarm(): void {
|
|
348
|
+
this.pool.prewarm();
|
|
349
|
+
}
|
|
350
|
+
|
|
222
351
|
async close() {
|
|
223
352
|
for (const stream of this.streams) {
|
|
224
353
|
await stream.close();
|
|
225
354
|
}
|
|
226
355
|
this.streams.clear();
|
|
356
|
+
await this.pool.close();
|
|
227
357
|
}
|
|
228
358
|
}
|
|
229
359
|
|
|
230
360
|
export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeStream {
|
|
231
361
|
private opts: InferenceTTSOptions<TModel>;
|
|
232
362
|
private tts: TTS<TModel>;
|
|
233
|
-
private connOptions: APIConnectOptions;
|
|
234
363
|
|
|
235
364
|
#logger = log();
|
|
236
365
|
|
|
@@ -238,7 +367,6 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
|
|
|
238
367
|
super(tts, connOptions);
|
|
239
368
|
this.opts = opts;
|
|
240
369
|
this.tts = tts;
|
|
241
|
-
this.connOptions = connOptions;
|
|
242
370
|
}
|
|
243
371
|
|
|
244
372
|
get label() {
|
|
@@ -246,31 +374,39 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
|
|
|
246
374
|
}
|
|
247
375
|
|
|
248
376
|
updateOptions(opts: Partial<Pick<InferenceTTSOptions<TModel>, 'model' | 'voice' | 'language'>>) {
|
|
249
|
-
this.opts = {
|
|
377
|
+
this.opts = {
|
|
378
|
+
...this.opts,
|
|
379
|
+
...opts,
|
|
380
|
+
language: opts.language !== undefined ? normalizeLanguage(opts.language) : this.opts.language,
|
|
381
|
+
};
|
|
250
382
|
}
|
|
251
383
|
|
|
252
384
|
protected async run(): Promise<void> {
|
|
253
|
-
let ws: WebSocket | null = null;
|
|
254
385
|
let closing = false;
|
|
255
|
-
let finalReceived = false;
|
|
256
386
|
let lastFrame: AudioFrame | undefined;
|
|
257
387
|
|
|
258
388
|
const sendTokenizerStream = new tokenizeBasic.SentenceTokenizer().stream();
|
|
259
389
|
const eventChannel = createStreamChannel<TtsServerEvent>();
|
|
260
390
|
const requestId = shortuuid('tts_request_');
|
|
391
|
+
const inputSentEvent = new Event();
|
|
261
392
|
|
|
262
|
-
|
|
393
|
+
// Signal for protocol-driven completion (when 'done' message is received)
|
|
394
|
+
const completionFuture = new Future<void>();
|
|
395
|
+
|
|
396
|
+
const resourceCleanup = async () => {
|
|
263
397
|
if (closing) return;
|
|
264
398
|
closing = true;
|
|
265
399
|
sendTokenizerStream.close();
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
ws?.close();
|
|
400
|
+
// close() returns a promise; don't leak it
|
|
401
|
+
await eventChannel.close();
|
|
269
402
|
};
|
|
270
403
|
|
|
271
|
-
const sendClientEvent = async (event: TtsClientEvent) => {
|
|
404
|
+
const sendClientEvent = async (event: TtsClientEvent, ws: WebSocket, signal: AbortSignal) => {
|
|
405
|
+
// Don't send events to a closed WebSocket or aborted controller
|
|
406
|
+
if (signal.aborted || closing) return;
|
|
407
|
+
|
|
272
408
|
const validatedEvent = await ttsClientEventSchema.parseAsync(event);
|
|
273
|
-
if (
|
|
409
|
+
if (ws.readyState !== WebSocket.OPEN) {
|
|
274
410
|
this.#logger.warn('Trying to send client TTS event to a closed WebSocket');
|
|
275
411
|
return;
|
|
276
412
|
}
|
|
@@ -284,67 +420,123 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
|
|
|
284
420
|
}
|
|
285
421
|
};
|
|
286
422
|
|
|
287
|
-
const createInputTask = async () => {
|
|
423
|
+
const createInputTask = async (signal: AbortSignal) => {
|
|
288
424
|
for await (const data of this.input) {
|
|
289
|
-
if (
|
|
425
|
+
if (signal.aborted || closing) break;
|
|
290
426
|
if (data === SynthesizeStream.FLUSH_SENTINEL) {
|
|
291
427
|
sendTokenizerStream.flush();
|
|
292
428
|
continue;
|
|
293
429
|
}
|
|
294
430
|
sendTokenizerStream.pushText(data);
|
|
295
431
|
}
|
|
296
|
-
|
|
432
|
+
// Only call endInput if the stream hasn't been closed by cleanup
|
|
433
|
+
if (!closing) {
|
|
434
|
+
sendTokenizerStream.endInput();
|
|
435
|
+
}
|
|
297
436
|
};
|
|
298
437
|
|
|
299
|
-
const createSentenceStreamTask = async () => {
|
|
438
|
+
const createSentenceStreamTask = async (ws: WebSocket, signal: AbortSignal) => {
|
|
300
439
|
for await (const ev of sendTokenizerStream) {
|
|
301
|
-
if (
|
|
302
|
-
|
|
303
|
-
sendClientEvent(
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
440
|
+
if (signal.aborted || closing) break;
|
|
441
|
+
|
|
442
|
+
await sendClientEvent(
|
|
443
|
+
{
|
|
444
|
+
type: 'input_transcript',
|
|
445
|
+
transcript: ev.token + ' ',
|
|
446
|
+
},
|
|
447
|
+
ws,
|
|
448
|
+
signal,
|
|
449
|
+
);
|
|
450
|
+
inputSentEvent.set();
|
|
307
451
|
}
|
|
308
452
|
|
|
309
|
-
sendClientEvent({ type: 'session.flush' });
|
|
453
|
+
await sendClientEvent({ type: 'session.flush' }, ws, signal);
|
|
454
|
+
// needed in case empty input is sent
|
|
455
|
+
inputSentEvent.set();
|
|
310
456
|
};
|
|
311
457
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
ws.on('message', async (data) => {
|
|
458
|
+
// Handles WebSocket message routing and error handling
|
|
459
|
+
// Completes based on protocol messages, NOT on ws.close()
|
|
460
|
+
const createWsListenerTask = async (ws: WebSocket, signal: AbortSignal) => {
|
|
461
|
+
const onMessage = (data: Buffer) => {
|
|
462
|
+
try {
|
|
320
463
|
const eventJson = JSON.parse(data.toString()) as Record<string, unknown>;
|
|
321
464
|
const validatedEvent = ttsServerEventSchema.parse(eventJson);
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
})
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
if (!closing) return this.#logger.error('WebSocket closed unexpectedly');
|
|
335
|
-
if (finalReceived) return resolve();
|
|
465
|
+
// writer.write returns a promise; avoid unhandled rejections if stream is closed
|
|
466
|
+
void eventChannel.write(validatedEvent).catch((error) => {
|
|
467
|
+
this.#logger.debug(
|
|
468
|
+
{ error },
|
|
469
|
+
'Failed writing TTS event to stream channel (likely closed)',
|
|
470
|
+
);
|
|
471
|
+
});
|
|
472
|
+
} catch (e) {
|
|
473
|
+
this.#logger.error({ error: e }, 'Error parsing WebSocket message');
|
|
474
|
+
}
|
|
475
|
+
};
|
|
336
476
|
|
|
337
|
-
|
|
477
|
+
const onError = (e: Error) => {
|
|
478
|
+
this.#logger.error({ error: e }, 'WebSocket error');
|
|
479
|
+
void resourceCleanup();
|
|
480
|
+
try {
|
|
481
|
+
// If the ws is misbehaving, hard-stop it immediately to avoid buffering.
|
|
482
|
+
ws.terminate?.();
|
|
483
|
+
} catch {
|
|
484
|
+
// ignore
|
|
485
|
+
}
|
|
486
|
+
// Ensure this ws is not reused
|
|
487
|
+
this.tts.pool.remove(ws);
|
|
488
|
+
completionFuture.reject(e);
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
const onClose = () => {
|
|
492
|
+
// WebSocket closed unexpectedly (not by us)
|
|
493
|
+
if (!closing) {
|
|
494
|
+
this.#logger.error('WebSocket closed unexpectedly');
|
|
495
|
+
void resourceCleanup();
|
|
496
|
+
// Ensure this ws is not reused
|
|
497
|
+
this.tts.pool.remove(ws);
|
|
498
|
+
completionFuture.reject(
|
|
338
499
|
new APIStatusError({
|
|
339
500
|
message: 'Gateway connection closed unexpectedly',
|
|
340
501
|
options: { requestId },
|
|
341
502
|
}),
|
|
342
503
|
);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
const onAbort = () => {
|
|
508
|
+
void resourceCleanup();
|
|
509
|
+
try {
|
|
510
|
+
// On interruption/abort, close the websocket immediately so the server stops streaming
|
|
511
|
+
// and the ws library doesn't buffer unread frames in memory.
|
|
512
|
+
ws.terminate?.();
|
|
513
|
+
} catch {
|
|
514
|
+
// ignore
|
|
515
|
+
}
|
|
516
|
+
this.tts.pool.remove(ws);
|
|
517
|
+
inputSentEvent.set();
|
|
518
|
+
completionFuture.resolve();
|
|
519
|
+
};
|
|
520
|
+
|
|
521
|
+
// Attach listeners
|
|
522
|
+
ws.on('message', onMessage);
|
|
523
|
+
ws.on('error', onError);
|
|
524
|
+
ws.on('close', onClose);
|
|
525
|
+
signal.addEventListener('abort', onAbort);
|
|
526
|
+
|
|
527
|
+
try {
|
|
528
|
+
// Wait for protocol-driven completion or error
|
|
529
|
+
await completionFuture.await;
|
|
530
|
+
} finally {
|
|
531
|
+
// IMPORTANT: Remove listeners so connection can be reused
|
|
532
|
+
ws.off('message', onMessage);
|
|
533
|
+
ws.off('error', onError);
|
|
534
|
+
ws.off('close', onClose);
|
|
535
|
+
signal.removeEventListener('abort', onAbort);
|
|
536
|
+
}
|
|
345
537
|
};
|
|
346
538
|
|
|
347
|
-
const createRecvTask = async () => {
|
|
539
|
+
const createRecvTask = async (signal: AbortSignal) => {
|
|
348
540
|
let currentSessionId: string | null = null;
|
|
349
541
|
|
|
350
542
|
const bstream = new AudioByteStream(this.opts.sampleRate, NUM_CHANNELS);
|
|
@@ -352,9 +544,11 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
|
|
|
352
544
|
const reader = serverEventStream.getReader();
|
|
353
545
|
|
|
354
546
|
try {
|
|
355
|
-
|
|
547
|
+
await inputSentEvent.wait();
|
|
548
|
+
|
|
549
|
+
while (!this.closed && !signal.aborted) {
|
|
356
550
|
const result = await reader.read();
|
|
357
|
-
if (
|
|
551
|
+
if (signal.aborted) return;
|
|
358
552
|
if (result.done) return;
|
|
359
553
|
|
|
360
554
|
const serverEvent = result.value;
|
|
@@ -370,24 +564,29 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
|
|
|
370
564
|
}
|
|
371
565
|
break;
|
|
372
566
|
case 'done':
|
|
373
|
-
finalReceived = true;
|
|
374
567
|
for (const frame of bstream.flush()) {
|
|
375
568
|
sendLastFrame(currentSessionId!, false);
|
|
376
569
|
lastFrame = frame;
|
|
377
570
|
}
|
|
378
571
|
sendLastFrame(currentSessionId!, true);
|
|
379
572
|
this.queue.put(SynthesizeStream.END_OF_STREAM);
|
|
380
|
-
|
|
573
|
+
await resourceCleanup();
|
|
574
|
+
completionFuture.resolve();
|
|
575
|
+
return;
|
|
381
576
|
case 'session.closed':
|
|
382
|
-
resourceCleanup();
|
|
383
|
-
|
|
577
|
+
await resourceCleanup();
|
|
578
|
+
completionFuture.resolve();
|
|
579
|
+
return;
|
|
384
580
|
case 'error':
|
|
385
581
|
this.#logger.error(
|
|
386
582
|
{ serverEvent },
|
|
387
583
|
'Received error message from LiveKit TTS WebSocket',
|
|
388
584
|
);
|
|
389
|
-
resourceCleanup();
|
|
390
|
-
|
|
585
|
+
await resourceCleanup();
|
|
586
|
+
completionFuture.reject(
|
|
587
|
+
new APIError(`LiveKit TTS returned error: ${serverEvent.message}`),
|
|
588
|
+
);
|
|
589
|
+
return;
|
|
391
590
|
default:
|
|
392
591
|
this.#logger.warn('Unexpected message %s', serverEvent);
|
|
393
592
|
break;
|
|
@@ -404,18 +603,81 @@ export class SynthesizeStream<TModel extends TTSModels> extends BaseSynthesizeSt
|
|
|
404
603
|
};
|
|
405
604
|
|
|
406
605
|
try {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
606
|
+
await this.tts.pool.withConnection(
|
|
607
|
+
async (ws: WebSocket) => {
|
|
608
|
+
try {
|
|
609
|
+
// IMPORTANT: don't cancel the stream's controller on normal completion,
|
|
610
|
+
// otherwise the pool will remove+close the ws and every run becomes a pool miss.
|
|
611
|
+
const runController = new AbortController();
|
|
612
|
+
const onStreamAbort = () => runController.abort(this.abortController.signal.reason);
|
|
613
|
+
this.abortController.signal.addEventListener('abort', onStreamAbort, { once: true });
|
|
614
|
+
|
|
615
|
+
const tasks = [
|
|
616
|
+
Task.from(
|
|
617
|
+
async (controller) => {
|
|
618
|
+
const combined = combineSignals(runController.signal, controller.signal);
|
|
619
|
+
await createInputTask(combined);
|
|
620
|
+
},
|
|
621
|
+
undefined,
|
|
622
|
+
'inference-tts-input',
|
|
623
|
+
),
|
|
624
|
+
Task.from(
|
|
625
|
+
async (controller) => {
|
|
626
|
+
const combined = combineSignals(runController.signal, controller.signal);
|
|
627
|
+
await createSentenceStreamTask(ws, combined);
|
|
628
|
+
},
|
|
629
|
+
undefined,
|
|
630
|
+
'inference-tts-sentence',
|
|
631
|
+
),
|
|
632
|
+
Task.from(
|
|
633
|
+
async (controller) => {
|
|
634
|
+
const combined = combineSignals(runController.signal, controller.signal);
|
|
635
|
+
await createWsListenerTask(ws, combined);
|
|
636
|
+
},
|
|
637
|
+
undefined,
|
|
638
|
+
'inference-tts-ws-listener',
|
|
639
|
+
),
|
|
640
|
+
Task.from(
|
|
641
|
+
async (controller) => {
|
|
642
|
+
const combined = combineSignals(runController.signal, controller.signal);
|
|
643
|
+
await createRecvTask(combined);
|
|
644
|
+
},
|
|
645
|
+
undefined,
|
|
646
|
+
'inference-tts-recv',
|
|
647
|
+
),
|
|
648
|
+
];
|
|
649
|
+
|
|
650
|
+
try {
|
|
651
|
+
await Promise.all(tasks.map((t) => t.result));
|
|
652
|
+
} finally {
|
|
653
|
+
// Mirror python finally: unblock recv and cancel all tasks.
|
|
654
|
+
inputSentEvent.set();
|
|
655
|
+
await resourceCleanup();
|
|
656
|
+
await cancelAndWait(tasks, 5000);
|
|
657
|
+
this.abortController.signal.removeEventListener('abort', onStreamAbort);
|
|
658
|
+
}
|
|
659
|
+
} catch (e) {
|
|
660
|
+
// If aborted, don't throw - let cleanup handle it
|
|
661
|
+
if (e instanceof Error && e.name === 'AbortError') {
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
throw e;
|
|
665
|
+
}
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
timeout: this.connOptions.timeoutMs,
|
|
669
|
+
},
|
|
670
|
+
);
|
|
415
671
|
} catch (e) {
|
|
416
|
-
|
|
672
|
+
// Handle connection errors
|
|
673
|
+
if (e instanceof Error && e.name === 'AbortError') {
|
|
674
|
+
// Abort is expected during normal shutdown
|
|
675
|
+
return;
|
|
676
|
+
}
|
|
677
|
+
throw e;
|
|
417
678
|
} finally {
|
|
418
|
-
|
|
679
|
+
// Ensure cleanup always runs (and don't leak the promise)
|
|
680
|
+
await resourceCleanup();
|
|
419
681
|
}
|
|
420
682
|
}
|
|
421
683
|
}
|