@livekit/agents 0.7.9 → 1.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_exceptions.cjs +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 +97 -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 +98 -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 +100 -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 +101 -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 +156 -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 +156 -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 +298 -27
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +145 -9
- package/dist/utils.d.ts +145 -9
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +281 -26
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.cjs +491 -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 +374 -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 +350 -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 +379 -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 +354 -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 +8 -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 +148 -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 +134 -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 +202 -21
- package/src/types.ts +42 -0
- package/src/utils.test.ts +658 -0
- package/src/utils.ts +402 -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 +473 -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 +477 -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
|
@@ -4,8 +4,13 @@
|
|
|
4
4
|
import type { AudioFrame } from '@livekit/rtc-node';
|
|
5
5
|
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
|
|
6
6
|
import { EventEmitter } from 'node:events';
|
|
7
|
+
import type { ReadableStream } from 'node:stream/web';
|
|
8
|
+
import { APIConnectionError, APIStatusError } from '../_exceptions.js';
|
|
9
|
+
import { log } from '../log.js';
|
|
7
10
|
import type { TTSMetrics } from '../metrics/base.js';
|
|
8
|
-
import {
|
|
11
|
+
import { DeferredReadableStream } from '../stream/deferred_stream.js';
|
|
12
|
+
import { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS } from '../types.js';
|
|
13
|
+
import { AsyncIterableQueue, delay, mergeFrames, startSoon, toError } from '../utils.js';
|
|
9
14
|
|
|
10
15
|
/** SynthesizedAudio is a packet of speech synthesis as returned by the TTS. */
|
|
11
16
|
export interface SynthesizedAudio {
|
|
@@ -32,12 +37,17 @@ export interface TTSCapabilities {
|
|
|
32
37
|
streaming: boolean;
|
|
33
38
|
}
|
|
34
39
|
|
|
35
|
-
export
|
|
36
|
-
|
|
40
|
+
export interface TTSError {
|
|
41
|
+
type: 'tts_error';
|
|
42
|
+
timestamp: number;
|
|
43
|
+
label: string;
|
|
44
|
+
error: Error;
|
|
45
|
+
recoverable: boolean;
|
|
37
46
|
}
|
|
38
47
|
|
|
39
48
|
export type TTSCallbacks = {
|
|
40
|
-
[
|
|
49
|
+
['metrics_collected']: (metrics: TTSMetrics) => void;
|
|
50
|
+
['error']: (error: TTSError) => void;
|
|
41
51
|
};
|
|
42
52
|
|
|
43
53
|
/**
|
|
@@ -118,15 +128,108 @@ export abstract class SynthesizeStream
|
|
|
118
128
|
#metricsPendingTexts: string[] = [];
|
|
119
129
|
#metricsText = '';
|
|
120
130
|
#monitorMetricsTask?: Promise<void>;
|
|
131
|
+
private _connOptions: APIConnectOptions;
|
|
132
|
+
protected abortController = new AbortController();
|
|
121
133
|
|
|
122
|
-
|
|
134
|
+
private deferredInputStream: DeferredReadableStream<
|
|
135
|
+
string | typeof SynthesizeStream.FLUSH_SENTINEL
|
|
136
|
+
>;
|
|
137
|
+
private logger = log();
|
|
138
|
+
|
|
139
|
+
constructor(tts: TTS, connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS) {
|
|
123
140
|
this.#tts = tts;
|
|
141
|
+
this._connOptions = connOptions;
|
|
142
|
+
this.deferredInputStream = new DeferredReadableStream();
|
|
143
|
+
this.pumpInput();
|
|
144
|
+
this.abortController.signal.addEventListener('abort', () => {
|
|
145
|
+
this.deferredInputStream.detachSource();
|
|
146
|
+
// TODO (AJS-36) clean this up when we refactor with streams
|
|
147
|
+
this.input.close();
|
|
148
|
+
this.output.close();
|
|
149
|
+
this.closed = true;
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// this is a hack to immitate asyncio.create_task so that mainTask
|
|
153
|
+
// is run **after** the constructor has finished. Otherwise we get
|
|
154
|
+
// runtime error when trying to access class variables in the
|
|
155
|
+
// `run` method.
|
|
156
|
+
startSoon(() => this.mainTask().then(() => this.queue.close()));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private async mainTask() {
|
|
160
|
+
for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
|
|
161
|
+
try {
|
|
162
|
+
return await this.run();
|
|
163
|
+
} catch (error) {
|
|
164
|
+
if (error instanceof APIStatusError) {
|
|
165
|
+
const retryInterval = this._connOptions._intervalForRetry(i);
|
|
166
|
+
|
|
167
|
+
if (this._connOptions.maxRetry === 0 || !error.retryable) {
|
|
168
|
+
this.emitError({ error, recoverable: false });
|
|
169
|
+
throw error;
|
|
170
|
+
} else if (i === this._connOptions.maxRetry) {
|
|
171
|
+
this.emitError({ error, recoverable: false });
|
|
172
|
+
throw new APIConnectionError({
|
|
173
|
+
message: `failed to generate TTS completion after ${this._connOptions.maxRetry + 1} attempts`,
|
|
174
|
+
options: { retryable: false },
|
|
175
|
+
});
|
|
176
|
+
} else {
|
|
177
|
+
this.emitError({ error, recoverable: true });
|
|
178
|
+
this.logger.warn(
|
|
179
|
+
{ tts: this.#tts.label, attempt: i + 1, error },
|
|
180
|
+
`failed to synthesize speech, retrying in ${retryInterval}s`,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (retryInterval > 0) {
|
|
185
|
+
await delay(retryInterval);
|
|
186
|
+
}
|
|
187
|
+
} else {
|
|
188
|
+
this.emitError({ error: toError(error), recoverable: false });
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
|
|
196
|
+
this.#tts.emit('error', {
|
|
197
|
+
type: 'tts_error',
|
|
198
|
+
timestamp: Date.now(),
|
|
199
|
+
label: this.#tts.label,
|
|
200
|
+
error,
|
|
201
|
+
recoverable,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// TODO(AJS-37) Remove when refactoring TTS to use streams
|
|
206
|
+
protected async pumpInput() {
|
|
207
|
+
const reader = this.deferredInputStream.stream.getReader();
|
|
208
|
+
try {
|
|
209
|
+
while (true) {
|
|
210
|
+
const { done, value } = await reader.read();
|
|
211
|
+
if (done || value === SynthesizeStream.FLUSH_SENTINEL) {
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
this.pushText(value);
|
|
215
|
+
}
|
|
216
|
+
this.endInput();
|
|
217
|
+
} catch (error) {
|
|
218
|
+
this.logger.error(error, 'Error reading deferred input stream');
|
|
219
|
+
} finally {
|
|
220
|
+
reader.releaseLock();
|
|
221
|
+
// Ensure output is closed when the stream ends
|
|
222
|
+
if (!this.#monitorMetricsTask) {
|
|
223
|
+
// No text was received, close the output directly
|
|
224
|
+
this.output.close();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
124
227
|
}
|
|
125
228
|
|
|
126
229
|
protected async monitorMetrics() {
|
|
127
230
|
const startTime = process.hrtime.bigint();
|
|
128
231
|
let audioDuration = 0;
|
|
129
|
-
let ttfb: bigint
|
|
232
|
+
let ttfb: bigint = BigInt(-1);
|
|
130
233
|
let requestId = '';
|
|
131
234
|
|
|
132
235
|
const emit = () => {
|
|
@@ -134,27 +237,32 @@ export abstract class SynthesizeStream
|
|
|
134
237
|
const text = this.#metricsPendingTexts.shift()!;
|
|
135
238
|
const duration = process.hrtime.bigint() - startTime;
|
|
136
239
|
const metrics: TTSMetrics = {
|
|
240
|
+
type: 'tts_metrics',
|
|
137
241
|
timestamp: Date.now(),
|
|
138
242
|
requestId,
|
|
139
|
-
ttfb: Math.trunc(Number(
|
|
243
|
+
ttfb: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
|
|
140
244
|
duration: Math.trunc(Number(duration / BigInt(1000000))),
|
|
141
245
|
charactersCount: text.length,
|
|
142
246
|
audioDuration,
|
|
143
|
-
cancelled:
|
|
144
|
-
label: this.label,
|
|
247
|
+
cancelled: this.abortController.signal.aborted,
|
|
248
|
+
label: this.#tts.label,
|
|
145
249
|
streamed: false,
|
|
146
250
|
};
|
|
147
|
-
this.#tts.emit(
|
|
251
|
+
this.#tts.emit('metrics_collected', metrics);
|
|
148
252
|
}
|
|
149
253
|
};
|
|
150
254
|
|
|
151
255
|
for await (const audio of this.queue) {
|
|
256
|
+
if (this.abortController.signal.aborted) {
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
152
259
|
this.output.put(audio);
|
|
153
260
|
if (audio === SynthesizeStream.END_OF_STREAM) continue;
|
|
154
261
|
requestId = audio.requestId;
|
|
155
|
-
if (
|
|
262
|
+
if (ttfb === BigInt(-1)) {
|
|
156
263
|
ttfb = process.hrtime.bigint() - startTime;
|
|
157
264
|
}
|
|
265
|
+
// TODO(AJS-102): use frame.durationMs once available in rtc-node
|
|
158
266
|
audioDuration += audio.frame.samplesPerChannel / audio.frame.sampleRate;
|
|
159
267
|
if (audio.final) {
|
|
160
268
|
emit();
|
|
@@ -164,13 +272,21 @@ export abstract class SynthesizeStream
|
|
|
164
272
|
if (requestId) {
|
|
165
273
|
emit();
|
|
166
274
|
}
|
|
167
|
-
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
protected abstract run(): Promise<void>;
|
|
278
|
+
|
|
279
|
+
updateInputStream(text: ReadableStream<string>) {
|
|
280
|
+
this.deferredInputStream.setSource(text);
|
|
168
281
|
}
|
|
169
282
|
|
|
170
283
|
/** Push a string of text to the TTS */
|
|
284
|
+
/** @deprecated Use `updateInputStream` instead */
|
|
171
285
|
pushText(text: string) {
|
|
172
286
|
if (!this.#monitorMetricsTask) {
|
|
173
287
|
this.#monitorMetricsTask = this.monitorMetrics();
|
|
288
|
+
// Close output when metrics task completes
|
|
289
|
+
this.#monitorMetricsTask.finally(() => this.output.close());
|
|
174
290
|
}
|
|
175
291
|
this.#metricsText += text;
|
|
176
292
|
|
|
@@ -200,6 +316,7 @@ export abstract class SynthesizeStream
|
|
|
200
316
|
|
|
201
317
|
/** Mark the input as ended and forbid additional pushes */
|
|
202
318
|
endInput() {
|
|
319
|
+
this.flush();
|
|
203
320
|
if (this.input.closed) {
|
|
204
321
|
throw new Error('Input is closed');
|
|
205
322
|
}
|
|
@@ -215,9 +332,7 @@ export abstract class SynthesizeStream
|
|
|
215
332
|
|
|
216
333
|
/** Close both the input and output of the TTS stream */
|
|
217
334
|
close() {
|
|
218
|
-
this.
|
|
219
|
-
this.output.close();
|
|
220
|
-
this.closed = true;
|
|
335
|
+
this.abortController.abort();
|
|
221
336
|
}
|
|
222
337
|
|
|
223
338
|
[Symbol.asyncIterator](): SynthesizeStream {
|
|
@@ -246,12 +361,77 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
246
361
|
abstract label: string;
|
|
247
362
|
#text: string;
|
|
248
363
|
#tts: TTS;
|
|
249
|
-
|
|
250
|
-
|
|
364
|
+
private _connOptions: APIConnectOptions;
|
|
365
|
+
private logger = log();
|
|
366
|
+
|
|
367
|
+
constructor(
|
|
368
|
+
text: string,
|
|
369
|
+
tts: TTS,
|
|
370
|
+
connOptions: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS,
|
|
371
|
+
) {
|
|
251
372
|
this.#text = text;
|
|
252
373
|
this.#tts = tts;
|
|
374
|
+
this._connOptions = connOptions;
|
|
253
375
|
|
|
254
376
|
this.monitorMetrics();
|
|
377
|
+
|
|
378
|
+
// this is a hack to immitate asyncio.create_task so that mainTask
|
|
379
|
+
// is run **after** the constructor has finished. Otherwise we get
|
|
380
|
+
// runtime error when trying to access class variables in the
|
|
381
|
+
// `run` method.
|
|
382
|
+
Promise.resolve().then(() => this.mainTask().then(() => this.queue.close()));
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
private async mainTask() {
|
|
386
|
+
for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
|
|
387
|
+
try {
|
|
388
|
+
return await this.run();
|
|
389
|
+
} catch (error) {
|
|
390
|
+
if (error instanceof APIStatusError) {
|
|
391
|
+
const retryInterval = this._connOptions._intervalForRetry(i);
|
|
392
|
+
|
|
393
|
+
if (this._connOptions.maxRetry === 0 || !error.retryable) {
|
|
394
|
+
this.emitError({ error, recoverable: false });
|
|
395
|
+
throw error;
|
|
396
|
+
} else if (i === this._connOptions.maxRetry) {
|
|
397
|
+
this.emitError({ error, recoverable: false });
|
|
398
|
+
throw new APIConnectionError({
|
|
399
|
+
message: `failed to generate TTS completion after ${this._connOptions.maxRetry + 1} attempts`,
|
|
400
|
+
options: { retryable: false },
|
|
401
|
+
});
|
|
402
|
+
} else {
|
|
403
|
+
this.emitError({ error, recoverable: true });
|
|
404
|
+
this.logger.warn(
|
|
405
|
+
{ tts: this.#tts.label, attempt: i + 1, error },
|
|
406
|
+
`failed to generate TTS completion, retrying in ${retryInterval}s`,
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (retryInterval > 0) {
|
|
411
|
+
await delay(retryInterval);
|
|
412
|
+
}
|
|
413
|
+
} else {
|
|
414
|
+
this.emitError({ error: toError(error), recoverable: false });
|
|
415
|
+
throw error;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {
|
|
422
|
+
this.#tts.emit('error', {
|
|
423
|
+
type: 'tts_error',
|
|
424
|
+
timestamp: Date.now(),
|
|
425
|
+
label: this.#tts.label,
|
|
426
|
+
error,
|
|
427
|
+
recoverable,
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
protected abstract run(): Promise<void>;
|
|
432
|
+
|
|
433
|
+
get inputText(): string {
|
|
434
|
+
return this.#text;
|
|
255
435
|
}
|
|
256
436
|
|
|
257
437
|
protected async monitorMetrics() {
|
|
@@ -263,7 +443,7 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
263
443
|
for await (const audio of this.queue) {
|
|
264
444
|
this.output.put(audio);
|
|
265
445
|
requestId = audio.requestId;
|
|
266
|
-
if (ttfb
|
|
446
|
+
if (!ttfb) {
|
|
267
447
|
ttfb = process.hrtime.bigint() - startTime;
|
|
268
448
|
}
|
|
269
449
|
audioDuration += audio.frame.samplesPerChannel / audio.frame.sampleRate;
|
|
@@ -272,17 +452,18 @@ export abstract class ChunkedStream implements AsyncIterableIterator<Synthesized
|
|
|
272
452
|
|
|
273
453
|
const duration = process.hrtime.bigint() - startTime;
|
|
274
454
|
const metrics: TTSMetrics = {
|
|
455
|
+
type: 'tts_metrics',
|
|
275
456
|
timestamp: Date.now(),
|
|
276
457
|
requestId,
|
|
277
458
|
ttfb: ttfb === BigInt(-1) ? -1 : Math.trunc(Number(ttfb / BigInt(1000000))),
|
|
278
459
|
duration: Math.trunc(Number(duration / BigInt(1000000))),
|
|
279
460
|
charactersCount: this.#text.length,
|
|
280
461
|
audioDuration,
|
|
281
|
-
cancelled: false, //
|
|
282
|
-
label: this.label,
|
|
462
|
+
cancelled: false, // TODO(AJS-186): support ChunkedStream with 1.0 - add this.abortController.signal.aborted here
|
|
463
|
+
label: this.#tts.label,
|
|
283
464
|
streamed: false,
|
|
284
465
|
};
|
|
285
|
-
this.#tts.emit(
|
|
466
|
+
this.#tts.emit('metrics_collected', metrics);
|
|
286
467
|
}
|
|
287
468
|
|
|
288
469
|
/** 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();
|