@livekit/agents 0.7.9 → 1.0.0-next.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/_exceptions.cjs +109 -0
- package/dist/_exceptions.cjs.map +1 -0
- package/dist/_exceptions.d.cts +64 -0
- package/dist/_exceptions.d.ts +64 -0
- package/dist/_exceptions.d.ts.map +1 -0
- package/dist/_exceptions.js +80 -0
- package/dist/_exceptions.js.map +1 -0
- package/dist/audio.cjs +10 -3
- package/dist/audio.cjs.map +1 -1
- package/dist/audio.d.cts +2 -0
- package/dist/audio.d.ts +2 -0
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +8 -2
- package/dist/audio.js.map +1 -1
- package/dist/cli.cjs +25 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -1
- package/dist/constants.cjs +6 -3
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +2 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -2
- package/dist/constants.js.map +1 -1
- package/dist/http_server.cjs.map +1 -1
- package/dist/http_server.d.cts +1 -0
- package/dist/http_server.d.ts +1 -0
- package/dist/http_server.d.ts.map +1 -1
- package/dist/http_server.js.map +1 -1
- package/dist/index.cjs +27 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -10
- package/dist/index.d.ts +13 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -11
- package/dist/index.js.map +1 -1
- package/dist/inference_runner.cjs +0 -1
- package/dist/inference_runner.cjs.map +1 -1
- package/dist/inference_runner.d.cts +2 -3
- package/dist/inference_runner.d.ts +2 -3
- package/dist/inference_runner.d.ts.map +1 -1
- package/dist/inference_runner.js +0 -1
- package/dist/inference_runner.js.map +1 -1
- package/dist/ipc/inference_proc_executor.cjs +2 -2
- package/dist/ipc/inference_proc_executor.cjs.map +1 -1
- package/dist/ipc/inference_proc_executor.js +2 -2
- package/dist/ipc/inference_proc_executor.js.map +1 -1
- package/dist/ipc/job_executor.cjs.map +1 -1
- package/dist/ipc/job_executor.js.map +1 -1
- package/dist/ipc/job_proc_executor.cjs +1 -0
- package/dist/ipc/job_proc_executor.cjs.map +1 -1
- package/dist/ipc/job_proc_executor.js +1 -0
- package/dist/ipc/job_proc_executor.js.map +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
- package/dist/ipc/job_proc_lazy_main.js +1 -1
- package/dist/ipc/job_proc_lazy_main.js.map +1 -1
- package/dist/ipc/supervised_proc.d.cts +1 -1
- package/dist/ipc/supervised_proc.d.ts +1 -1
- package/dist/ipc/supervised_proc.d.ts.map +1 -1
- package/dist/job.cjs +14 -2
- package/dist/job.cjs.map +1 -1
- package/dist/job.d.cts +8 -0
- package/dist/job.d.ts +8 -0
- package/dist/job.d.ts.map +1 -1
- package/dist/job.js +12 -1
- package/dist/job.js.map +1 -1
- package/dist/llm/chat_context.cjs +332 -82
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +152 -48
- package/dist/llm/chat_context.d.ts +152 -48
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +327 -81
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/chat_context.test.cjs +380 -0
- package/dist/llm/chat_context.test.cjs.map +1 -0
- package/dist/llm/chat_context.test.js +385 -0
- package/dist/llm/chat_context.test.js.map +1 -0
- package/dist/llm/index.cjs +37 -8
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +7 -3
- package/dist/llm/index.d.ts +7 -3
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +39 -9
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +98 -33
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.cts +50 -24
- package/dist/llm/llm.d.ts +50 -24
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +99 -33
- package/dist/llm/llm.js.map +1 -1
- package/dist/llm/provider_format/google.cjs +128 -0
- package/dist/llm/provider_format/google.cjs.map +1 -0
- package/dist/llm/provider_format/google.d.cts +6 -0
- package/dist/llm/provider_format/google.d.ts +6 -0
- package/dist/llm/provider_format/google.d.ts.map +1 -0
- package/dist/llm/provider_format/google.js +104 -0
- package/dist/llm/provider_format/google.js.map +1 -0
- package/dist/llm/provider_format/google.test.cjs +676 -0
- package/dist/llm/provider_format/google.test.cjs.map +1 -0
- package/dist/llm/provider_format/google.test.js +675 -0
- package/dist/llm/provider_format/google.test.js.map +1 -0
- package/dist/llm/provider_format/index.cjs +40 -0
- package/dist/llm/provider_format/index.cjs.map +1 -0
- package/dist/llm/provider_format/index.d.cts +4 -0
- package/dist/llm/provider_format/index.d.ts +4 -0
- package/dist/llm/provider_format/index.d.ts.map +1 -0
- package/dist/llm/provider_format/index.js +16 -0
- package/dist/llm/provider_format/index.js.map +1 -0
- package/dist/llm/provider_format/openai.cjs +116 -0
- package/dist/llm/provider_format/openai.cjs.map +1 -0
- package/dist/llm/provider_format/openai.d.cts +3 -0
- package/dist/llm/provider_format/openai.d.ts +3 -0
- package/dist/llm/provider_format/openai.d.ts.map +1 -0
- package/dist/llm/provider_format/openai.js +92 -0
- package/dist/llm/provider_format/openai.js.map +1 -0
- package/dist/llm/provider_format/openai.test.cjs +490 -0
- package/dist/llm/provider_format/openai.test.cjs.map +1 -0
- package/dist/llm/provider_format/openai.test.js +489 -0
- package/dist/llm/provider_format/openai.test.js.map +1 -0
- package/dist/llm/provider_format/utils.cjs +146 -0
- package/dist/llm/provider_format/utils.cjs.map +1 -0
- package/dist/llm/provider_format/utils.d.cts +38 -0
- package/dist/llm/provider_format/utils.d.ts +38 -0
- package/dist/llm/provider_format/utils.d.ts.map +1 -0
- package/dist/llm/provider_format/utils.js +122 -0
- package/dist/llm/provider_format/utils.js.map +1 -0
- package/dist/llm/realtime.cjs +77 -0
- package/dist/llm/realtime.cjs.map +1 -0
- package/dist/llm/realtime.d.cts +98 -0
- package/dist/llm/realtime.d.ts +98 -0
- package/dist/llm/realtime.d.ts.map +1 -0
- package/dist/llm/realtime.js +52 -0
- package/dist/llm/realtime.js.map +1 -0
- package/dist/llm/remote_chat_context.cjs +112 -0
- package/dist/llm/remote_chat_context.cjs.map +1 -0
- package/dist/llm/remote_chat_context.d.cts +23 -0
- package/dist/llm/remote_chat_context.d.ts +23 -0
- package/dist/llm/remote_chat_context.d.ts.map +1 -0
- package/dist/llm/remote_chat_context.js +88 -0
- package/dist/llm/remote_chat_context.js.map +1 -0
- package/dist/llm/remote_chat_context.test.cjs +225 -0
- package/dist/llm/remote_chat_context.test.cjs.map +1 -0
- package/dist/llm/remote_chat_context.test.js +224 -0
- package/dist/llm/remote_chat_context.test.js.map +1 -0
- package/dist/llm/tool_context.cjs +111 -0
- package/dist/llm/tool_context.cjs.map +1 -0
- package/dist/llm/tool_context.d.cts +125 -0
- package/dist/llm/tool_context.d.ts +125 -0
- package/dist/llm/tool_context.d.ts.map +1 -0
- package/dist/llm/tool_context.js +80 -0
- package/dist/llm/tool_context.js.map +1 -0
- package/dist/llm/tool_context.test.cjs +162 -0
- package/dist/llm/tool_context.test.cjs.map +1 -0
- package/dist/llm/tool_context.test.js +161 -0
- package/dist/llm/tool_context.test.js.map +1 -0
- package/dist/llm/tool_context.type.test.cjs +92 -0
- package/dist/llm/tool_context.type.test.cjs.map +1 -0
- package/dist/llm/tool_context.type.test.js +91 -0
- package/dist/llm/tool_context.type.test.js.map +1 -0
- package/dist/llm/utils.cjs +260 -0
- package/dist/llm/utils.cjs.map +1 -0
- package/dist/llm/utils.d.cts +42 -0
- package/dist/llm/utils.d.ts +42 -0
- package/dist/llm/utils.d.ts.map +1 -0
- package/dist/llm/utils.js +223 -0
- package/dist/llm/utils.js.map +1 -0
- package/dist/llm/utils.test.cjs +513 -0
- package/dist/llm/utils.test.cjs.map +1 -0
- package/dist/llm/utils.test.js +490 -0
- package/dist/llm/utils.test.js.map +1 -0
- package/dist/metrics/base.cjs +0 -27
- package/dist/metrics/base.cjs.map +1 -1
- package/dist/metrics/base.d.cts +105 -63
- package/dist/metrics/base.d.ts +105 -63
- package/dist/metrics/base.d.ts.map +1 -1
- package/dist/metrics/base.js +0 -19
- package/dist/metrics/base.js.map +1 -1
- package/dist/metrics/index.cjs +0 -3
- package/dist/metrics/index.cjs.map +1 -1
- package/dist/metrics/index.d.cts +2 -3
- package/dist/metrics/index.d.ts +2 -3
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +0 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/usage_collector.cjs +17 -12
- package/dist/metrics/usage_collector.cjs.map +1 -1
- package/dist/metrics/usage_collector.d.cts +3 -2
- package/dist/metrics/usage_collector.d.ts +3 -2
- package/dist/metrics/usage_collector.d.ts.map +1 -1
- package/dist/metrics/usage_collector.js +17 -12
- package/dist/metrics/usage_collector.js.map +1 -1
- package/dist/metrics/utils.cjs +22 -59
- package/dist/metrics/utils.cjs.map +1 -1
- package/dist/metrics/utils.d.cts +1 -8
- package/dist/metrics/utils.d.ts +1 -8
- package/dist/metrics/utils.d.ts.map +1 -1
- package/dist/metrics/utils.js +22 -52
- package/dist/metrics/utils.js.map +1 -1
- package/dist/multimodal/index.cjs +0 -2
- package/dist/multimodal/index.cjs.map +1 -1
- package/dist/multimodal/index.d.cts +0 -1
- package/dist/multimodal/index.d.ts +0 -1
- package/dist/multimodal/index.d.ts.map +1 -1
- package/dist/multimodal/index.js +0 -1
- package/dist/multimodal/index.js.map +1 -1
- package/dist/plugin.cjs +24 -8
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +18 -4
- package/dist/plugin.d.ts +18 -4
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +22 -7
- package/dist/plugin.js.map +1 -1
- package/dist/stream/deferred_stream.cjs +98 -0
- package/dist/stream/deferred_stream.cjs.map +1 -0
- package/dist/stream/deferred_stream.d.cts +27 -0
- package/dist/stream/deferred_stream.d.ts +27 -0
- package/dist/stream/deferred_stream.d.ts.map +1 -0
- package/dist/stream/deferred_stream.js +73 -0
- package/dist/stream/deferred_stream.js.map +1 -0
- package/dist/stream/deferred_stream.test.cjs +527 -0
- package/dist/stream/deferred_stream.test.cjs.map +1 -0
- package/dist/stream/deferred_stream.test.js +526 -0
- package/dist/stream/deferred_stream.test.js.map +1 -0
- package/dist/stream/identity_transform.cjs +42 -0
- package/dist/stream/identity_transform.cjs.map +1 -0
- package/dist/stream/identity_transform.d.cts +6 -0
- package/dist/stream/identity_transform.d.ts +6 -0
- package/dist/stream/identity_transform.d.ts.map +1 -0
- package/dist/stream/identity_transform.js +18 -0
- package/dist/stream/identity_transform.js.map +1 -0
- package/dist/stream/identity_transform.test.cjs +125 -0
- package/dist/stream/identity_transform.test.cjs.map +1 -0
- package/dist/stream/identity_transform.test.js +124 -0
- package/dist/stream/identity_transform.test.js.map +1 -0
- package/dist/stream/index.cjs +38 -0
- package/dist/stream/index.cjs.map +1 -0
- package/dist/stream/index.d.cts +5 -0
- package/dist/stream/index.d.ts +5 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +11 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/merge_readable_streams.cjs +59 -0
- package/dist/stream/merge_readable_streams.cjs.map +1 -0
- package/dist/stream/merge_readable_streams.d.cts +4 -0
- package/dist/stream/merge_readable_streams.d.ts +4 -0
- package/dist/stream/merge_readable_streams.d.ts.map +1 -0
- package/dist/stream/merge_readable_streams.js +35 -0
- package/dist/stream/merge_readable_streams.js.map +1 -0
- package/dist/stream/stream_channel.cjs +47 -0
- package/dist/stream/stream_channel.cjs.map +1 -0
- package/dist/stream/stream_channel.d.cts +9 -0
- package/dist/stream/stream_channel.d.ts +9 -0
- package/dist/stream/stream_channel.d.ts.map +1 -0
- package/dist/stream/stream_channel.js +23 -0
- package/dist/stream/stream_channel.js.map +1 -0
- package/dist/stream/stream_channel.test.cjs +97 -0
- package/dist/stream/stream_channel.test.cjs.map +1 -0
- package/dist/stream/stream_channel.test.js +96 -0
- package/dist/stream/stream_channel.test.js.map +1 -0
- package/dist/stt/stream_adapter.cjs +3 -4
- package/dist/stt/stream_adapter.cjs.map +1 -1
- package/dist/stt/stream_adapter.d.cts +1 -0
- package/dist/stt/stream_adapter.d.ts +1 -0
- package/dist/stt/stream_adapter.d.ts.map +1 -1
- package/dist/stt/stream_adapter.js +3 -4
- package/dist/stt/stream_adapter.js.map +1 -1
- package/dist/stt/stt.cjs +101 -10
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.cts +26 -5
- package/dist/stt/stt.d.ts +26 -5
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +102 -11
- package/dist/stt/stt.js.map +1 -1
- package/dist/tokenize/basic/basic.cjs +10 -5
- package/dist/tokenize/basic/basic.cjs.map +1 -1
- package/dist/tokenize/basic/basic.d.cts +7 -1
- package/dist/tokenize/basic/basic.d.ts +7 -1
- package/dist/tokenize/basic/basic.d.ts.map +1 -1
- package/dist/tokenize/basic/basic.js +10 -5
- package/dist/tokenize/basic/basic.js.map +1 -1
- package/dist/tokenize/basic/sentence.cjs +14 -6
- package/dist/tokenize/basic/sentence.cjs.map +1 -1
- package/dist/tokenize/basic/sentence.d.cts +1 -1
- package/dist/tokenize/basic/sentence.d.ts +1 -1
- package/dist/tokenize/basic/sentence.d.ts.map +1 -1
- package/dist/tokenize/basic/sentence.js +14 -6
- package/dist/tokenize/basic/sentence.js.map +1 -1
- package/dist/tokenize/token_stream.cjs +5 -3
- package/dist/tokenize/token_stream.cjs.map +1 -1
- package/dist/tokenize/token_stream.d.cts +1 -0
- package/dist/tokenize/token_stream.d.ts +1 -0
- package/dist/tokenize/token_stream.d.ts.map +1 -1
- package/dist/tokenize/token_stream.js +6 -4
- package/dist/tokenize/token_stream.js.map +1 -1
- package/dist/transcription.cjs +1 -2
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js +2 -3
- package/dist/transcription.js.map +1 -1
- package/dist/tts/index.cjs +2 -4
- package/dist/tts/index.cjs.map +1 -1
- package/dist/tts/index.d.cts +1 -1
- package/dist/tts/index.d.ts +1 -1
- package/dist/tts/index.d.ts.map +1 -1
- package/dist/tts/index.js +1 -3
- package/dist/tts/index.js.map +1 -1
- package/dist/tts/stream_adapter.cjs +26 -13
- package/dist/tts/stream_adapter.cjs.map +1 -1
- package/dist/tts/stream_adapter.d.cts +1 -1
- package/dist/tts/stream_adapter.d.ts +1 -1
- package/dist/tts/stream_adapter.d.ts.map +1 -1
- package/dist/tts/stream_adapter.js +27 -14
- package/dist/tts/stream_adapter.js.map +1 -1
- package/dist/tts/tts.cjs +157 -25
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.cts +29 -5
- package/dist/tts/tts.d.ts +29 -5
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +157 -24
- package/dist/tts/tts.js.map +1 -1
- package/dist/types.cjs +60 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +13 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +35 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.cjs +281 -27
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +134 -9
- package/dist/utils.d.ts +134 -9
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +265 -26
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.cjs +492 -0
- package/dist/utils.test.cjs.map +1 -0
- package/dist/utils.test.js +498 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/vad.cjs +76 -20
- package/dist/vad.cjs.map +1 -1
- package/dist/vad.d.cts +25 -5
- package/dist/vad.d.ts +25 -5
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js +76 -20
- package/dist/vad.js.map +1 -1
- package/dist/voice/agent.cjs +245 -0
- package/dist/voice/agent.cjs.map +1 -0
- package/dist/voice/agent.d.cts +78 -0
- package/dist/voice/agent.d.ts +78 -0
- package/dist/voice/agent.d.ts.map +1 -0
- package/dist/voice/agent.js +220 -0
- package/dist/voice/agent.js.map +1 -0
- package/dist/voice/agent.test.cjs +61 -0
- package/dist/voice/agent.test.cjs.map +1 -0
- package/dist/voice/agent.test.js +60 -0
- package/dist/voice/agent.test.js.map +1 -0
- package/dist/voice/agent_activity.cjs +1453 -0
- package/dist/voice/agent_activity.cjs.map +1 -0
- package/dist/voice/agent_activity.d.cts +94 -0
- package/dist/voice/agent_activity.d.ts +94 -0
- package/dist/voice/agent_activity.d.ts.map +1 -0
- package/dist/voice/agent_activity.js +1449 -0
- package/dist/voice/agent_activity.js.map +1 -0
- package/dist/voice/agent_session.cjs +312 -0
- package/dist/voice/agent_session.cjs.map +1 -0
- package/dist/voice/agent_session.d.cts +121 -0
- package/dist/voice/agent_session.d.ts +121 -0
- package/dist/voice/agent_session.d.ts.map +1 -0
- package/dist/voice/agent_session.js +295 -0
- package/dist/voice/agent_session.js.map +1 -0
- package/dist/voice/audio_recognition.cjs +375 -0
- package/dist/voice/audio_recognition.cjs.map +1 -0
- package/dist/voice/audio_recognition.d.cts +80 -0
- package/dist/voice/audio_recognition.d.ts +80 -0
- package/dist/voice/audio_recognition.d.ts.map +1 -0
- package/dist/voice/audio_recognition.js +351 -0
- package/dist/voice/audio_recognition.js.map +1 -0
- package/dist/voice/events.cjs +145 -0
- package/dist/voice/events.cjs.map +1 -0
- package/dist/voice/events.d.cts +124 -0
- package/dist/voice/events.d.ts +124 -0
- package/dist/voice/events.d.ts.map +1 -0
- package/dist/voice/events.js +110 -0
- package/dist/voice/events.js.map +1 -0
- package/dist/voice/generation.cjs +700 -0
- package/dist/voice/generation.cjs.map +1 -0
- package/dist/voice/generation.d.cts +115 -0
- package/dist/voice/generation.d.ts +115 -0
- package/dist/voice/generation.d.ts.map +1 -0
- package/dist/voice/generation.js +672 -0
- package/dist/voice/generation.js.map +1 -0
- package/dist/voice/index.cjs +40 -0
- package/dist/voice/index.cjs.map +1 -0
- package/dist/voice/index.d.cts +5 -0
- package/dist/voice/index.d.ts +5 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +11 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/io.cjs +245 -0
- package/dist/voice/io.cjs.map +1 -0
- package/dist/voice/io.d.cts +101 -0
- package/dist/voice/io.d.ts +101 -0
- package/dist/voice/io.d.ts.map +1 -0
- package/dist/voice/io.js +217 -0
- package/dist/voice/io.js.map +1 -0
- package/dist/voice/room_io/_input.cjs +121 -0
- package/dist/voice/room_io/_input.cjs.map +1 -0
- package/dist/voice/room_io/_input.d.cts +24 -0
- package/dist/voice/room_io/_input.d.ts +24 -0
- package/dist/voice/room_io/_input.d.ts.map +1 -0
- package/dist/voice/room_io/_input.js +102 -0
- package/dist/voice/room_io/_input.js.map +1 -0
- package/dist/voice/room_io/_output.cjs +358 -0
- package/dist/voice/room_io/_output.cjs.map +1 -0
- package/dist/voice/room_io/_output.d.cts +75 -0
- package/dist/voice/room_io/_output.d.ts +75 -0
- package/dist/voice/room_io/_output.d.ts.map +1 -0
- package/dist/voice/room_io/_output.js +342 -0
- package/dist/voice/room_io/_output.js.map +1 -0
- package/dist/voice/room_io/index.cjs +25 -0
- package/dist/voice/room_io/index.cjs.map +1 -0
- package/dist/voice/room_io/index.d.cts +3 -0
- package/dist/voice/room_io/index.d.ts +3 -0
- package/dist/voice/room_io/index.d.ts.map +1 -0
- package/dist/voice/room_io/index.js +3 -0
- package/dist/voice/room_io/index.js.map +1 -0
- package/dist/voice/room_io/room_io.cjs +370 -0
- package/dist/voice/room_io/room_io.cjs.map +1 -0
- package/dist/voice/room_io/room_io.d.cts +73 -0
- package/dist/voice/room_io/room_io.d.ts +73 -0
- package/dist/voice/room_io/room_io.d.ts.map +1 -0
- package/dist/voice/room_io/room_io.js +361 -0
- package/dist/voice/room_io/room_io.js.map +1 -0
- package/dist/{pipeline/index.cjs → voice/run_context.cjs} +16 -11
- package/dist/voice/run_context.cjs.map +1 -0
- package/dist/voice/run_context.d.cts +12 -0
- package/dist/voice/run_context.d.ts +12 -0
- package/dist/voice/run_context.d.ts.map +1 -0
- package/dist/voice/run_context.js +14 -0
- package/dist/voice/run_context.js.map +1 -0
- package/dist/voice/speech_handle.cjs +105 -0
- package/dist/voice/speech_handle.cjs.map +1 -0
- package/dist/voice/speech_handle.d.cts +46 -0
- package/dist/voice/speech_handle.d.ts +46 -0
- package/dist/voice/speech_handle.d.ts.map +1 -0
- package/dist/voice/speech_handle.js +81 -0
- package/dist/voice/speech_handle.js.map +1 -0
- package/dist/voice/transcription/_utils.cjs +45 -0
- package/dist/voice/transcription/_utils.cjs.map +1 -0
- package/dist/voice/transcription/_utils.d.cts +3 -0
- package/dist/voice/transcription/_utils.d.ts +3 -0
- package/dist/voice/transcription/_utils.d.ts.map +1 -0
- package/dist/voice/transcription/_utils.js +21 -0
- package/dist/voice/transcription/_utils.js.map +1 -0
- package/dist/voice/transcription/index.cjs +23 -0
- package/dist/voice/transcription/index.cjs.map +1 -0
- package/dist/voice/transcription/index.d.cts +2 -0
- package/dist/voice/transcription/index.d.ts +2 -0
- package/dist/voice/transcription/index.d.ts.map +1 -0
- package/dist/voice/transcription/index.js +2 -0
- package/dist/voice/transcription/index.js.map +1 -0
- package/dist/voice/transcription/synchronizer.cjs +380 -0
- package/dist/voice/transcription/synchronizer.cjs.map +1 -0
- package/dist/voice/transcription/synchronizer.d.cts +86 -0
- package/dist/voice/transcription/synchronizer.d.ts +86 -0
- package/dist/voice/transcription/synchronizer.d.ts.map +1 -0
- package/dist/voice/transcription/synchronizer.js +355 -0
- package/dist/voice/transcription/synchronizer.js.map +1 -0
- package/dist/worker.cjs +22 -4
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +22 -4
- package/dist/worker.js.map +1 -1
- package/package.json +9 -2
- package/src/_exceptions.ts +137 -0
- package/src/audio.ts +12 -1
- package/src/cli.ts +37 -0
- package/src/constants.ts +2 -1
- package/src/http_server.ts +1 -0
- package/src/index.ts +13 -10
- package/src/inference_runner.ts +2 -3
- package/src/ipc/inference_proc_executor.ts +2 -2
- package/src/ipc/job_executor.ts +1 -1
- package/src/ipc/job_proc_executor.ts +1 -1
- package/src/ipc/job_proc_lazy_main.ts +1 -1
- package/src/job.ts +18 -0
- package/src/llm/__snapshots__/chat_context.test.ts.snap +527 -0
- package/src/llm/__snapshots__/tool_context.test.ts.snap +177 -0
- package/src/llm/__snapshots__/utils.test.ts.snap +65 -0
- package/src/llm/chat_context.test.ts +450 -0
- package/src/llm/chat_context.ts +501 -103
- package/src/llm/index.ts +53 -18
- package/src/llm/llm.ts +149 -50
- package/src/llm/provider_format/google.test.ts +772 -0
- package/src/llm/provider_format/google.ts +130 -0
- package/src/llm/provider_format/index.ts +23 -0
- package/src/llm/provider_format/openai.test.ts +581 -0
- package/src/llm/provider_format/openai.ts +118 -0
- package/src/llm/provider_format/utils.ts +183 -0
- package/src/llm/realtime.ts +151 -0
- package/src/llm/remote_chat_context.test.ts +290 -0
- package/src/llm/remote_chat_context.ts +114 -0
- package/src/llm/tool_context.test.ts +198 -0
- package/src/llm/tool_context.ts +259 -0
- package/src/llm/tool_context.type.test.ts +115 -0
- package/src/llm/utils.test.ts +670 -0
- package/src/llm/utils.ts +324 -0
- package/src/metrics/base.ts +110 -78
- package/src/metrics/index.ts +3 -9
- package/src/metrics/usage_collector.ts +19 -13
- package/src/metrics/utils.ts +24 -69
- package/src/multimodal/index.ts +0 -1
- package/src/plugin.ts +26 -8
- package/src/stream/deferred_stream.test.ts +755 -0
- package/src/stream/deferred_stream.ts +110 -0
- package/src/stream/identity_transform.test.ts +179 -0
- package/src/stream/identity_transform.ts +18 -0
- package/src/stream/index.ts +7 -0
- package/src/stream/merge_readable_streams.ts +40 -0
- package/src/stream/stream_channel.test.ts +129 -0
- package/src/stream/stream_channel.ts +32 -0
- package/src/stt/stream_adapter.ts +3 -5
- package/src/stt/stt.ts +135 -17
- package/src/tokenize/basic/basic.ts +13 -5
- package/src/tokenize/basic/sentence.ts +20 -6
- package/src/tokenize/token_stream.ts +7 -4
- package/src/transcription.ts +2 -3
- package/src/tts/index.ts +0 -1
- package/src/tts/stream_adapter.ts +42 -16
- package/src/tts/tts.ts +203 -21
- package/src/types.ts +42 -0
- package/src/utils.test.ts +658 -0
- package/src/utils.ts +375 -44
- package/src/vad.ts +90 -22
- package/src/voice/agent.test.ts +80 -0
- package/src/voice/agent.ts +332 -0
- package/src/voice/agent_activity.ts +1913 -0
- package/src/voice/agent_session.ts +460 -0
- package/src/voice/audio_recognition.ts +474 -0
- package/src/voice/events.ts +252 -0
- package/src/voice/generation.ts +881 -0
- package/src/voice/index.ts +7 -0
- package/src/voice/io.ts +304 -0
- package/src/voice/room_io/_input.ts +144 -0
- package/src/voice/room_io/_output.ts +436 -0
- package/src/voice/room_io/index.ts +5 -0
- package/src/voice/room_io/room_io.ts +495 -0
- package/src/voice/run_context.ts +20 -0
- package/src/voice/speech_handle.ts +104 -0
- package/src/voice/transcription/_utils.ts +25 -0
- package/src/voice/transcription/index.ts +4 -0
- package/src/voice/transcription/synchronizer.ts +478 -0
- package/src/worker.ts +22 -2
- package/dist/llm/function_context.cjs +0 -103
- package/dist/llm/function_context.cjs.map +0 -1
- package/dist/llm/function_context.d.cts +0 -47
- package/dist/llm/function_context.d.ts +0 -47
- package/dist/llm/function_context.d.ts.map +0 -1
- package/dist/llm/function_context.js +0 -78
- package/dist/llm/function_context.js.map +0 -1
- package/dist/llm/function_context.test.cjs +0 -218
- package/dist/llm/function_context.test.cjs.map +0 -1
- package/dist/llm/function_context.test.js +0 -217
- package/dist/llm/function_context.test.js.map +0 -1
- package/dist/multimodal/multimodal_agent.cjs +0 -486
- package/dist/multimodal/multimodal_agent.cjs.map +0 -1
- package/dist/multimodal/multimodal_agent.d.cts +0 -48
- package/dist/multimodal/multimodal_agent.d.ts +0 -48
- package/dist/multimodal/multimodal_agent.d.ts.map +0 -1
- package/dist/multimodal/multimodal_agent.js +0 -461
- package/dist/multimodal/multimodal_agent.js.map +0 -1
- package/dist/pipeline/agent_output.cjs +0 -197
- package/dist/pipeline/agent_output.cjs.map +0 -1
- package/dist/pipeline/agent_output.d.cts +0 -33
- package/dist/pipeline/agent_output.d.ts +0 -33
- package/dist/pipeline/agent_output.d.ts.map +0 -1
- package/dist/pipeline/agent_output.js +0 -172
- package/dist/pipeline/agent_output.js.map +0 -1
- package/dist/pipeline/agent_playout.cjs +0 -175
- package/dist/pipeline/agent_playout.cjs.map +0 -1
- package/dist/pipeline/agent_playout.d.cts +0 -40
- package/dist/pipeline/agent_playout.d.ts +0 -40
- package/dist/pipeline/agent_playout.d.ts.map +0 -1
- package/dist/pipeline/agent_playout.js +0 -139
- package/dist/pipeline/agent_playout.js.map +0 -1
- package/dist/pipeline/human_input.cjs +0 -171
- package/dist/pipeline/human_input.cjs.map +0 -1
- package/dist/pipeline/human_input.d.cts +0 -30
- package/dist/pipeline/human_input.d.ts +0 -30
- package/dist/pipeline/human_input.d.ts.map +0 -1
- package/dist/pipeline/human_input.js +0 -146
- package/dist/pipeline/human_input.js.map +0 -1
- package/dist/pipeline/index.cjs.map +0 -1
- package/dist/pipeline/index.d.cts +0 -2
- package/dist/pipeline/index.d.ts +0 -2
- package/dist/pipeline/index.d.ts.map +0 -1
- package/dist/pipeline/index.js +0 -11
- package/dist/pipeline/index.js.map +0 -1
- package/dist/pipeline/pipeline_agent.cjs +0 -859
- package/dist/pipeline/pipeline_agent.cjs.map +0 -1
- package/dist/pipeline/pipeline_agent.d.cts +0 -150
- package/dist/pipeline/pipeline_agent.d.ts +0 -150
- package/dist/pipeline/pipeline_agent.d.ts.map +0 -1
- package/dist/pipeline/pipeline_agent.js +0 -837
- package/dist/pipeline/pipeline_agent.js.map +0 -1
- package/dist/pipeline/speech_handle.cjs +0 -176
- package/dist/pipeline/speech_handle.cjs.map +0 -1
- package/dist/pipeline/speech_handle.d.cts +0 -37
- package/dist/pipeline/speech_handle.d.ts +0 -37
- package/dist/pipeline/speech_handle.d.ts.map +0 -1
- package/dist/pipeline/speech_handle.js +0 -152
- package/dist/pipeline/speech_handle.js.map +0 -1
- package/src/llm/function_context.test.ts +0 -248
- package/src/llm/function_context.ts +0 -142
- package/src/multimodal/multimodal_agent.ts +0 -592
- package/src/pipeline/agent_output.ts +0 -219
- package/src/pipeline/agent_playout.ts +0 -192
- package/src/pipeline/human_input.ts +0 -188
- package/src/pipeline/index.ts +0 -15
- package/src/pipeline/pipeline_agent.ts +0 -1197
- package/src/pipeline/speech_handle.ts +0 -201
package/src/tts/tts.ts
CHANGED
|
@@ -3,9 +3,15 @@
|
|
|
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 { delay } from '@std/async';
|
|
6
7
|
import { EventEmitter } from 'node:events';
|
|
8
|
+
import type { ReadableStream } from 'node:stream/web';
|
|
9
|
+
import { APIConnectionError, APIStatusError } from '../_exceptions.js';
|
|
10
|
+
import { log } from '../log.js';
|
|
7
11
|
import type { TTSMetrics } from '../metrics/base.js';
|
|
8
|
-
import {
|
|
12
|
+
import { DeferredReadableStream } from '../stream/deferred_stream.js';
|
|
13
|
+
import { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS } from '../types.js';
|
|
14
|
+
import { AsyncIterableQueue, mergeFrames, startSoon, toError } from '../utils.js';
|
|
9
15
|
|
|
10
16
|
/** SynthesizedAudio is a packet of speech synthesis as returned by the TTS. */
|
|
11
17
|
export interface SynthesizedAudio {
|
|
@@ -32,12 +38,17 @@ export interface TTSCapabilities {
|
|
|
32
38
|
streaming: boolean;
|
|
33
39
|
}
|
|
34
40
|
|
|
35
|
-
export
|
|
36
|
-
|
|
41
|
+
export interface TTSError {
|
|
42
|
+
type: 'tts_error';
|
|
43
|
+
timestamp: number;
|
|
44
|
+
label: string;
|
|
45
|
+
error: Error;
|
|
46
|
+
recoverable: boolean;
|
|
37
47
|
}
|
|
38
48
|
|
|
39
49
|
export type TTSCallbacks = {
|
|
40
|
-
[
|
|
50
|
+
['metrics_collected']: (metrics: TTSMetrics) => void;
|
|
51
|
+
['error']: (error: TTSError) => void;
|
|
41
52
|
};
|
|
42
53
|
|
|
43
54
|
/**
|
|
@@ -118,15 +129,108 @@ export abstract class SynthesizeStream
|
|
|
118
129
|
#metricsPendingTexts: string[] = [];
|
|
119
130
|
#metricsText = '';
|
|
120
131
|
#monitorMetricsTask?: Promise<void>;
|
|
132
|
+
private _connOptions: APIConnectOptions;
|
|
133
|
+
protected abortController = new AbortController();
|
|
121
134
|
|
|
122
|
-
|
|
135
|
+
private deferredInputStream: DeferredReadableStream<
|
|
136
|
+
string | typeof SynthesizeStream.FLUSH_SENTINEL
|
|
137
|
+
>;
|
|
138
|
+
private logger = log();
|
|
139
|
+
|
|
140
|
+
constructor(tts: TTS, connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS) {
|
|
123
141
|
this.#tts = tts;
|
|
142
|
+
this._connOptions = connOptions;
|
|
143
|
+
this.deferredInputStream = new DeferredReadableStream();
|
|
144
|
+
this.pumpInput();
|
|
145
|
+
this.abortController.signal.addEventListener('abort', () => {
|
|
146
|
+
this.deferredInputStream.detachSource();
|
|
147
|
+
// TODO (AJS-36) clean this up when we refactor with streams
|
|
148
|
+
this.input.close();
|
|
149
|
+
this.output.close();
|
|
150
|
+
this.closed = true;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// this is a hack to immitate asyncio.create_task so that mainTask
|
|
154
|
+
// is run **after** the constructor has finished. Otherwise we get
|
|
155
|
+
// runtime error when trying to access class variables in the
|
|
156
|
+
// `run` method.
|
|
157
|
+
startSoon(() => this.mainTask().then(() => this.queue.close()));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private async mainTask() {
|
|
161
|
+
for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
|
|
162
|
+
try {
|
|
163
|
+
return await this.run();
|
|
164
|
+
} catch (error) {
|
|
165
|
+
if (error instanceof APIStatusError) {
|
|
166
|
+
const retryInterval = this._connOptions._intervalForRetry(i);
|
|
167
|
+
|
|
168
|
+
if (this._connOptions.maxRetry === 0 || !error.retryable) {
|
|
169
|
+
this.emitError({ error, recoverable: false });
|
|
170
|
+
throw error;
|
|
171
|
+
} else if (i === this._connOptions.maxRetry) {
|
|
172
|
+
this.emitError({ error, recoverable: false });
|
|
173
|
+
throw new APIConnectionError({
|
|
174
|
+
message: `failed to generate TTS completion after ${this._connOptions.maxRetry + 1} attempts`,
|
|
175
|
+
options: { retryable: false },
|
|
176
|
+
});
|
|
177
|
+
} else {
|
|
178
|
+
this.emitError({ error, recoverable: true });
|
|
179
|
+
this.logger.warn(
|
|
180
|
+
{ tts: this.#tts.label, attempt: i + 1, error },
|
|
181
|
+
`failed to synthesize speech, retrying in ${retryInterval}s`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (retryInterval > 0) {
|
|
186
|
+
await delay(retryInterval);
|
|
187
|
+
}
|
|
188
|
+
} else {
|
|
189
|
+
this.emitError({ error: toError(error), recoverable: false });
|
|
190
|
+
throw error;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
|
|
197
|
+
this.#tts.emit('error', {
|
|
198
|
+
type: 'tts_error',
|
|
199
|
+
timestamp: Date.now(),
|
|
200
|
+
label: this.#tts.label,
|
|
201
|
+
error,
|
|
202
|
+
recoverable,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// TODO(AJS-37) Remove when refactoring TTS to use streams
|
|
207
|
+
protected async pumpInput() {
|
|
208
|
+
const reader = this.deferredInputStream.stream.getReader();
|
|
209
|
+
try {
|
|
210
|
+
while (true) {
|
|
211
|
+
const { done, value } = await reader.read();
|
|
212
|
+
if (done || value === SynthesizeStream.FLUSH_SENTINEL) {
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
this.pushText(value);
|
|
216
|
+
}
|
|
217
|
+
this.endInput();
|
|
218
|
+
} catch (error) {
|
|
219
|
+
this.logger.error(error, 'Error reading deferred input stream');
|
|
220
|
+
} finally {
|
|
221
|
+
reader.releaseLock();
|
|
222
|
+
// Ensure output is closed when the stream ends
|
|
223
|
+
if (!this.#monitorMetricsTask) {
|
|
224
|
+
// No text was received, close the output directly
|
|
225
|
+
this.output.close();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
124
228
|
}
|
|
125
229
|
|
|
126
230
|
protected async monitorMetrics() {
|
|
127
231
|
const startTime = process.hrtime.bigint();
|
|
128
232
|
let audioDuration = 0;
|
|
129
|
-
let ttfb: bigint
|
|
233
|
+
let ttfb: bigint = BigInt(-1);
|
|
130
234
|
let requestId = '';
|
|
131
235
|
|
|
132
236
|
const emit = () => {
|
|
@@ -134,27 +238,32 @@ export abstract class SynthesizeStream
|
|
|
134
238
|
const text = this.#metricsPendingTexts.shift()!;
|
|
135
239
|
const duration = process.hrtime.bigint() - startTime;
|
|
136
240
|
const metrics: TTSMetrics = {
|
|
241
|
+
type: 'tts_metrics',
|
|
137
242
|
timestamp: Date.now(),
|
|
138
243
|
requestId,
|
|
139
|
-
ttfb: Math.trunc(Number(
|
|
244
|
+
ttfb: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
|
|
140
245
|
duration: Math.trunc(Number(duration / BigInt(1000000))),
|
|
141
246
|
charactersCount: text.length,
|
|
142
247
|
audioDuration,
|
|
143
|
-
cancelled:
|
|
144
|
-
label: this.label,
|
|
248
|
+
cancelled: this.abortController.signal.aborted,
|
|
249
|
+
label: this.#tts.label,
|
|
145
250
|
streamed: false,
|
|
146
251
|
};
|
|
147
|
-
this.#tts.emit(
|
|
252
|
+
this.#tts.emit('metrics_collected', metrics);
|
|
148
253
|
}
|
|
149
254
|
};
|
|
150
255
|
|
|
151
256
|
for await (const audio of this.queue) {
|
|
257
|
+
if (this.abortController.signal.aborted) {
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
152
260
|
this.output.put(audio);
|
|
153
261
|
if (audio === SynthesizeStream.END_OF_STREAM) continue;
|
|
154
262
|
requestId = audio.requestId;
|
|
155
|
-
if (
|
|
263
|
+
if (ttfb === BigInt(-1)) {
|
|
156
264
|
ttfb = process.hrtime.bigint() - startTime;
|
|
157
265
|
}
|
|
266
|
+
// TODO(AJS-102): use frame.durationMs once available in rtc-node
|
|
158
267
|
audioDuration += audio.frame.samplesPerChannel / audio.frame.sampleRate;
|
|
159
268
|
if (audio.final) {
|
|
160
269
|
emit();
|
|
@@ -164,13 +273,21 @@ export abstract class SynthesizeStream
|
|
|
164
273
|
if (requestId) {
|
|
165
274
|
emit();
|
|
166
275
|
}
|
|
167
|
-
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
protected abstract run(): Promise<void>;
|
|
279
|
+
|
|
280
|
+
updateInputStream(text: ReadableStream<string>) {
|
|
281
|
+
this.deferredInputStream.setSource(text);
|
|
168
282
|
}
|
|
169
283
|
|
|
170
284
|
/** Push a string of text to the TTS */
|
|
285
|
+
/** @deprecated Use `updateInputStream` instead */
|
|
171
286
|
pushText(text: string) {
|
|
172
287
|
if (!this.#monitorMetricsTask) {
|
|
173
288
|
this.#monitorMetricsTask = this.monitorMetrics();
|
|
289
|
+
// Close output when metrics task completes
|
|
290
|
+
this.#monitorMetricsTask.finally(() => this.output.close());
|
|
174
291
|
}
|
|
175
292
|
this.#metricsText += text;
|
|
176
293
|
|
|
@@ -200,6 +317,7 @@ export abstract class SynthesizeStream
|
|
|
200
317
|
|
|
201
318
|
/** Mark the input as ended and forbid additional pushes */
|
|
202
319
|
endInput() {
|
|
320
|
+
this.flush();
|
|
203
321
|
if (this.input.closed) {
|
|
204
322
|
throw new Error('Input is closed');
|
|
205
323
|
}
|
|
@@ -215,9 +333,7 @@ export abstract class SynthesizeStream
|
|
|
215
333
|
|
|
216
334
|
/** Close both the input and output of the TTS stream */
|
|
217
335
|
close() {
|
|
218
|
-
this.
|
|
219
|
-
this.output.close();
|
|
220
|
-
this.closed = true;
|
|
336
|
+
this.abortController.abort();
|
|
221
337
|
}
|
|
222
338
|
|
|
223
339
|
[Symbol.asyncIterator](): SynthesizeStream {
|
|
@@ -246,12 +362,77 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
246
362
|
abstract label: string;
|
|
247
363
|
#text: string;
|
|
248
364
|
#tts: TTS;
|
|
249
|
-
|
|
250
|
-
|
|
365
|
+
private _connOptions: APIConnectOptions;
|
|
366
|
+
private logger = log();
|
|
367
|
+
|
|
368
|
+
constructor(
|
|
369
|
+
text: string,
|
|
370
|
+
tts: TTS,
|
|
371
|
+
connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS,
|
|
372
|
+
) {
|
|
251
373
|
this.#text = text;
|
|
252
374
|
this.#tts = tts;
|
|
375
|
+
this._connOptions = connOptions;
|
|
253
376
|
|
|
254
377
|
this.monitorMetrics();
|
|
378
|
+
|
|
379
|
+
// this is a hack to immitate asyncio.create_task so that mainTask
|
|
380
|
+
// is run **after** the constructor has finished. Otherwise we get
|
|
381
|
+
// runtime error when trying to access class variables in the
|
|
382
|
+
// `run` method.
|
|
383
|
+
Promise.resolve().then(() => this.mainTask().then(() => this.queue.close()));
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
private async mainTask() {
|
|
387
|
+
for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
|
|
388
|
+
try {
|
|
389
|
+
return await this.run();
|
|
390
|
+
} catch (error) {
|
|
391
|
+
if (error instanceof APIStatusError) {
|
|
392
|
+
const retryInterval = this._connOptions._intervalForRetry(i);
|
|
393
|
+
|
|
394
|
+
if (this._connOptions.maxRetry === 0 || !error.retryable) {
|
|
395
|
+
this.emitError({ error, recoverable: false });
|
|
396
|
+
throw error;
|
|
397
|
+
} else if (i === this._connOptions.maxRetry) {
|
|
398
|
+
this.emitError({ error, recoverable: false });
|
|
399
|
+
throw new APIConnectionError({
|
|
400
|
+
message: `failed to generate TTS completion after ${this._connOptions.maxRetry + 1} attempts`,
|
|
401
|
+
options: { retryable: false },
|
|
402
|
+
});
|
|
403
|
+
} else {
|
|
404
|
+
this.emitError({ error, recoverable: true });
|
|
405
|
+
this.logger.warn(
|
|
406
|
+
{ tts: this.#tts.label, attempt: i + 1, error },
|
|
407
|
+
`failed to generate TTS completion, retrying in ${retryInterval}s`,
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
if (retryInterval > 0) {
|
|
412
|
+
await delay(retryInterval);
|
|
413
|
+
}
|
|
414
|
+
} else {
|
|
415
|
+
this.emitError({ error: toError(error), recoverable: false });
|
|
416
|
+
throw error;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
|
|
423
|
+
this.#tts.emit('error', {
|
|
424
|
+
type: 'tts_error',
|
|
425
|
+
timestamp: Date.now(),
|
|
426
|
+
label: this.#tts.label,
|
|
427
|
+
error,
|
|
428
|
+
recoverable,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
protected abstract run(): Promise<void>;
|
|
433
|
+
|
|
434
|
+
get inputText(): string {
|
|
435
|
+
return this.#text;
|
|
255
436
|
}
|
|
256
437
|
|
|
257
438
|
protected async monitorMetrics() {
|
|
@@ -263,7 +444,7 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
263
444
|
for await (const audio of this.queue) {
|
|
264
445
|
this.output.put(audio);
|
|
265
446
|
requestId = audio.requestId;
|
|
266
|
-
if (ttfb
|
|
447
|
+
if (!ttfb) {
|
|
267
448
|
ttfb = process.hrtime.bigint() - startTime;
|
|
268
449
|
}
|
|
269
450
|
audioDuration += audio.frame.samplesPerChannel / audio.frame.sampleRate;
|
|
@@ -272,17 +453,18 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
272
453
|
|
|
273
454
|
const duration = process.hrtime.bigint() - startTime;
|
|
274
455
|
const metrics: TTSMetrics = {
|
|
456
|
+
type: 'tts_metrics',
|
|
275
457
|
timestamp: Date.now(),
|
|
276
458
|
requestId,
|
|
277
459
|
ttfb: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
|
|
278
460
|
duration: Math.trunc(Number(duration / BigInt(1000000))),
|
|
279
461
|
charactersCount: this.#text.length,
|
|
280
462
|
audioDuration,
|
|
281
|
-
cancelled: false, //
|
|
282
|
-
label: this.label,
|
|
463
|
+
cancelled: false, // TODO(AJS-186): support ChunkedStream with 1.0 - add this.abortController.signal.aborted here
|
|
464
|
+
label: this.#tts.label,
|
|
283
465
|
streamed: false,
|
|
284
466
|
};
|
|
285
|
-
this.#tts.emit(
|
|
467
|
+
this.#tts.emit('metrics_collected', metrics);
|
|
286
468
|
}
|
|
287
469
|
|
|
288
470
|
/** Collect every frame into one in a single call */
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2025 LiveKit, Inc.
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
export class APIConnectOptions {
|
|
5
|
+
/** Maximum number of retries to connect to the API. */
|
|
6
|
+
readonly maxRetry: number;
|
|
7
|
+
/** Interval between retries to connect to the API in milliseconds. */
|
|
8
|
+
readonly retryIntervalMs: number;
|
|
9
|
+
/** Timeout for connecting to the API in milliseconds. */
|
|
10
|
+
readonly timeoutMs: number;
|
|
11
|
+
|
|
12
|
+
constructor(options: Partial<APIConnectOptions> = {}) {
|
|
13
|
+
this.maxRetry = options.maxRetry ?? 3;
|
|
14
|
+
this.retryIntervalMs = options.retryIntervalMs ?? 2000;
|
|
15
|
+
this.timeoutMs = options.timeoutMs ?? 10000;
|
|
16
|
+
|
|
17
|
+
if (this.maxRetry < 0) {
|
|
18
|
+
throw new Error('maxRetry must be greater than or equal to 0');
|
|
19
|
+
}
|
|
20
|
+
if (this.retryIntervalMs < 0) {
|
|
21
|
+
throw new Error('retryIntervalMs must be greater than or equal to 0');
|
|
22
|
+
}
|
|
23
|
+
if (this.timeoutMs < 0) {
|
|
24
|
+
throw new Error('timeoutMs must be greater than or equal to 0');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** @internal */
|
|
29
|
+
_intervalForRetry(numRetries: number): number {
|
|
30
|
+
/**
|
|
31
|
+
* Return the interval for the given number of retries.
|
|
32
|
+
*
|
|
33
|
+
* The first retry is immediate, and then uses specified retryIntervalMs
|
|
34
|
+
*/
|
|
35
|
+
if (numRetries === 0) {
|
|
36
|
+
return 0.1;
|
|
37
|
+
}
|
|
38
|
+
return this.retryIntervalMs;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const DEFAULT_API_CONNECT_OPTIONS = new APIConnectOptions();
|