@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
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var agent_exports = {};
|
|
20
|
+
__export(agent_exports, {
|
|
21
|
+
Agent: () => Agent,
|
|
22
|
+
STOP_RESPONSE_SYMBOL: () => STOP_RESPONSE_SYMBOL,
|
|
23
|
+
StopResponse: () => StopResponse,
|
|
24
|
+
asyncLocalStorage: () => asyncLocalStorage,
|
|
25
|
+
isStopResponse: () => isStopResponse
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(agent_exports);
|
|
28
|
+
var import_node_async_hooks = require("node:async_hooks");
|
|
29
|
+
var import_web = require("node:stream/web");
|
|
30
|
+
var import_chat_context = require("../llm/chat_context.cjs");
|
|
31
|
+
var import_llm = require("../llm/index.cjs");
|
|
32
|
+
var import_stt = require("../stt/index.cjs");
|
|
33
|
+
var import_basic = require("../tokenize/basic/index.cjs");
|
|
34
|
+
var import_tts = require("../tts/index.cjs");
|
|
35
|
+
const asyncLocalStorage = new import_node_async_hooks.AsyncLocalStorage();
|
|
36
|
+
const STOP_RESPONSE_SYMBOL = Symbol("StopResponse");
|
|
37
|
+
class StopResponse extends Error {
|
|
38
|
+
constructor() {
|
|
39
|
+
super();
|
|
40
|
+
this.name = "StopResponse";
|
|
41
|
+
Object.defineProperty(this, STOP_RESPONSE_SYMBOL, {
|
|
42
|
+
value: true
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function isStopResponse(value) {
|
|
47
|
+
return value !== void 0 && value !== null && typeof value === "object" && STOP_RESPONSE_SYMBOL in value;
|
|
48
|
+
}
|
|
49
|
+
class Agent {
|
|
50
|
+
turnDetection;
|
|
51
|
+
_stt;
|
|
52
|
+
_vad;
|
|
53
|
+
_llm;
|
|
54
|
+
_tts;
|
|
55
|
+
/** @internal */
|
|
56
|
+
_agentActivity;
|
|
57
|
+
/** @internal */
|
|
58
|
+
_chatCtx;
|
|
59
|
+
/** @internal */
|
|
60
|
+
_instructions;
|
|
61
|
+
/** @internal */
|
|
62
|
+
_tools;
|
|
63
|
+
constructor({
|
|
64
|
+
instructions,
|
|
65
|
+
chatCtx,
|
|
66
|
+
tools,
|
|
67
|
+
turnDetection,
|
|
68
|
+
stt,
|
|
69
|
+
vad,
|
|
70
|
+
llm,
|
|
71
|
+
tts
|
|
72
|
+
}) {
|
|
73
|
+
this._instructions = instructions;
|
|
74
|
+
this._tools = { ...tools };
|
|
75
|
+
this._chatCtx = chatCtx ? chatCtx.copy({
|
|
76
|
+
toolCtx: this._tools
|
|
77
|
+
}) : import_llm.ChatContext.empty();
|
|
78
|
+
this.turnDetection = turnDetection;
|
|
79
|
+
this._stt = stt;
|
|
80
|
+
this._vad = vad;
|
|
81
|
+
this._llm = llm;
|
|
82
|
+
this._tts = tts;
|
|
83
|
+
this._agentActivity = void 0;
|
|
84
|
+
}
|
|
85
|
+
get vad() {
|
|
86
|
+
return this._vad;
|
|
87
|
+
}
|
|
88
|
+
get stt() {
|
|
89
|
+
return this._stt;
|
|
90
|
+
}
|
|
91
|
+
get llm() {
|
|
92
|
+
return this._llm;
|
|
93
|
+
}
|
|
94
|
+
get tts() {
|
|
95
|
+
return this._tts;
|
|
96
|
+
}
|
|
97
|
+
get chatCtx() {
|
|
98
|
+
return new import_chat_context.ReadonlyChatContext(this._chatCtx.items);
|
|
99
|
+
}
|
|
100
|
+
get instructions() {
|
|
101
|
+
return this._instructions;
|
|
102
|
+
}
|
|
103
|
+
get toolCtx() {
|
|
104
|
+
return { ...this._tools };
|
|
105
|
+
}
|
|
106
|
+
get session() {
|
|
107
|
+
return this.getActivityOrThrow().agentSession;
|
|
108
|
+
}
|
|
109
|
+
async onEnter() {
|
|
110
|
+
}
|
|
111
|
+
async onExit() {
|
|
112
|
+
}
|
|
113
|
+
async transcriptionNode(text, modelSettings) {
|
|
114
|
+
return Agent.default.transcriptionNode(this, text, modelSettings);
|
|
115
|
+
}
|
|
116
|
+
async onUserTurnCompleted(_chatCtx, _newMessage) {
|
|
117
|
+
}
|
|
118
|
+
async sttNode(audio, modelSettings) {
|
|
119
|
+
return Agent.default.sttNode(this, audio, modelSettings);
|
|
120
|
+
}
|
|
121
|
+
async llmNode(chatCtx, toolCtx, modelSettings) {
|
|
122
|
+
return Agent.default.llmNode(this, chatCtx, toolCtx, modelSettings);
|
|
123
|
+
}
|
|
124
|
+
async ttsNode(text, modelSettings) {
|
|
125
|
+
return Agent.default.ttsNode(this, text, modelSettings);
|
|
126
|
+
}
|
|
127
|
+
async realtimeAudioOutputNode(audio, modelSettings) {
|
|
128
|
+
return Agent.default.realtimeAudioOutputNode(this, audio, modelSettings);
|
|
129
|
+
}
|
|
130
|
+
// realtime_audio_output_node
|
|
131
|
+
getActivityOrThrow() {
|
|
132
|
+
if (!this._agentActivity) {
|
|
133
|
+
throw new Error("Agent activity not found");
|
|
134
|
+
}
|
|
135
|
+
return this._agentActivity;
|
|
136
|
+
}
|
|
137
|
+
async updateChatCtx(chatCtx) {
|
|
138
|
+
if (!this._agentActivity) {
|
|
139
|
+
this._chatCtx = chatCtx.copy({ toolCtx: this.toolCtx });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
this._agentActivity.updateChatCtx(chatCtx);
|
|
143
|
+
}
|
|
144
|
+
static default = {
|
|
145
|
+
async sttNode(agent, audio, _modelSettings) {
|
|
146
|
+
const activity = agent.getActivityOrThrow();
|
|
147
|
+
if (!activity.stt) {
|
|
148
|
+
throw new Error("sttNode called but no STT node is available");
|
|
149
|
+
}
|
|
150
|
+
let wrapped_stt = activity.stt;
|
|
151
|
+
if (!wrapped_stt.capabilities.streaming) {
|
|
152
|
+
if (!agent.vad) {
|
|
153
|
+
throw new Error(
|
|
154
|
+
"STT does not support streaming, add a VAD to the AgentTask/VoiceAgent to enable streaming"
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
wrapped_stt = new import_stt.StreamAdapter(wrapped_stt, agent.vad);
|
|
158
|
+
}
|
|
159
|
+
const stream = wrapped_stt.stream();
|
|
160
|
+
stream.updateInputStream(audio);
|
|
161
|
+
return new import_web.ReadableStream({
|
|
162
|
+
async start(controller) {
|
|
163
|
+
for await (const event of stream) {
|
|
164
|
+
controller.enqueue(event);
|
|
165
|
+
}
|
|
166
|
+
controller.close();
|
|
167
|
+
},
|
|
168
|
+
cancel() {
|
|
169
|
+
stream.detachInputStream();
|
|
170
|
+
stream.close();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
async llmNode(agent, chatCtx, toolCtx, modelSettings) {
|
|
175
|
+
const activity = agent.getActivityOrThrow();
|
|
176
|
+
if (!activity.llm) {
|
|
177
|
+
throw new Error("llmNode called but no LLM node is available");
|
|
178
|
+
}
|
|
179
|
+
if (!(activity.llm instanceof import_llm.LLM)) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
"llmNode should only be used with LLM (non-multimodal/realtime APIs) nodes"
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
const { toolChoice } = modelSettings;
|
|
185
|
+
const stream = activity.llm.chat({
|
|
186
|
+
chatCtx,
|
|
187
|
+
toolCtx,
|
|
188
|
+
toolChoice,
|
|
189
|
+
parallelToolCalls: true
|
|
190
|
+
});
|
|
191
|
+
return new import_web.ReadableStream({
|
|
192
|
+
async start(controller) {
|
|
193
|
+
for await (const chunk of stream) {
|
|
194
|
+
controller.enqueue(chunk);
|
|
195
|
+
}
|
|
196
|
+
controller.close();
|
|
197
|
+
},
|
|
198
|
+
cancel() {
|
|
199
|
+
stream.close();
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
},
|
|
203
|
+
async ttsNode(agent, text, _modelSettings) {
|
|
204
|
+
const activity = agent.getActivityOrThrow();
|
|
205
|
+
if (!activity.tts) {
|
|
206
|
+
throw new Error("ttsNode called but no TTS node is available");
|
|
207
|
+
}
|
|
208
|
+
let wrapped_tts = activity.tts;
|
|
209
|
+
if (!activity.tts.capabilities.streaming) {
|
|
210
|
+
wrapped_tts = new import_tts.StreamAdapter(wrapped_tts, new import_basic.SentenceTokenizer());
|
|
211
|
+
}
|
|
212
|
+
const stream = wrapped_tts.stream();
|
|
213
|
+
stream.updateInputStream(text);
|
|
214
|
+
return new import_web.ReadableStream({
|
|
215
|
+
async start(controller) {
|
|
216
|
+
for await (const chunk of stream) {
|
|
217
|
+
if (chunk === import_tts.SynthesizeStream.END_OF_STREAM) {
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
controller.enqueue(chunk.frame);
|
|
221
|
+
}
|
|
222
|
+
controller.close();
|
|
223
|
+
},
|
|
224
|
+
cancel() {
|
|
225
|
+
stream.close();
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
async transcriptionNode(agent, text, _modelSettings) {
|
|
230
|
+
return text;
|
|
231
|
+
},
|
|
232
|
+
async realtimeAudioOutputNode(_agent, audio, _modelSettings) {
|
|
233
|
+
return audio;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
238
|
+
0 && (module.exports = {
|
|
239
|
+
Agent,
|
|
240
|
+
STOP_RESPONSE_SYMBOL,
|
|
241
|
+
StopResponse,
|
|
242
|
+
asyncLocalStorage,
|
|
243
|
+
isStopResponse
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=agent.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/voice/agent.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { ReadableStream } from 'node:stream/web';\nimport { ReadonlyChatContext } from '../llm/chat_context.js';\nimport type { ChatMessage, FunctionCall, RealtimeModel } from '../llm/index.js';\nimport {\n type ChatChunk,\n ChatContext,\n LLM,\n type ToolChoice,\n type ToolContext,\n} from '../llm/index.js';\nimport type { STT, SpeechEvent } from '../stt/index.js';\nimport { StreamAdapter as STTStreamAdapter } from '../stt/index.js';\nimport { SentenceTokenizer as BasicSentenceTokenizer } from '../tokenize/basic/index.js';\nimport type { TTS } from '../tts/index.js';\nimport { SynthesizeStream, StreamAdapter as TTSStreamAdapter } from '../tts/index.js';\nimport type { VAD } from '../vad.js';\nimport type { AgentActivity } from './agent_activity.js';\nimport type { AgentSession, TurnDetectionMode } from './agent_session.js';\n\nexport const asyncLocalStorage = new AsyncLocalStorage<{ functionCall?: FunctionCall }>();\nexport const STOP_RESPONSE_SYMBOL = Symbol('StopResponse');\n\nexport class StopResponse extends Error {\n constructor() {\n super();\n this.name = 'StopResponse';\n\n Object.defineProperty(this, STOP_RESPONSE_SYMBOL, {\n value: true,\n });\n }\n}\n\nexport function isStopResponse(value: unknown): value is StopResponse {\n return (\n value !== undefined &&\n value !== null &&\n typeof value === 'object' &&\n STOP_RESPONSE_SYMBOL in value\n );\n}\n\nexport interface ModelSettings {\n /* The tool choice to use when calling the LLM. */\n toolChoice?: ToolChoice;\n}\n\nexport interface AgentOptions<UserData> {\n instructions: string;\n chatCtx?: ChatContext;\n tools?: ToolContext<UserData>;\n turnDetection?: TurnDetectionMode;\n stt?: STT;\n vad?: VAD;\n llm?: LLM | RealtimeModel;\n tts?: TTS;\n allowInterruptions?: boolean;\n minConsecutiveSpeechDelay?: number;\n}\n\nexport class Agent<UserData = any> {\n private turnDetection?: TurnDetectionMode;\n private _stt?: STT;\n private _vad?: VAD;\n private _llm?: LLM | RealtimeModel;\n private _tts?: TTS;\n\n /** @internal */\n _agentActivity?: AgentActivity;\n\n /** @internal */\n _chatCtx: ChatContext;\n\n /** @internal */\n _instructions: string;\n\n /** @internal */\n _tools?: ToolContext<UserData>;\n\n constructor({\n instructions,\n chatCtx,\n tools,\n turnDetection,\n stt,\n vad,\n llm,\n tts,\n }: AgentOptions<UserData>) {\n this._instructions = instructions;\n this._tools = { ...tools };\n this._chatCtx = chatCtx\n ? chatCtx.copy({\n toolCtx: this._tools,\n })\n : ChatContext.empty();\n\n this.turnDetection = turnDetection;\n this._stt = stt;\n this._vad = vad;\n this._llm = llm;\n this._tts = tts;\n this._agentActivity = undefined;\n }\n\n get vad(): VAD | undefined {\n return this._vad;\n }\n\n get stt(): STT | undefined {\n return this._stt;\n }\n\n get llm(): LLM | RealtimeModel | undefined {\n return this._llm;\n }\n\n get tts(): TTS | undefined {\n return this._tts;\n }\n\n get chatCtx(): ReadonlyChatContext {\n return new ReadonlyChatContext(this._chatCtx.items);\n }\n\n get instructions(): string {\n return this._instructions;\n }\n\n get toolCtx(): ToolContext<UserData> {\n return { ...this._tools };\n }\n\n get session(): AgentSession<UserData> {\n return this.getActivityOrThrow().agentSession as AgentSession<UserData>;\n }\n\n async onEnter(): Promise<void> {}\n\n async onExit(): Promise<void> {}\n\n async transcriptionNode(\n text: ReadableStream<string>,\n modelSettings: ModelSettings,\n ): Promise<ReadableStream<string> | null> {\n return Agent.default.transcriptionNode(this, text, modelSettings);\n }\n\n async onUserTurnCompleted(_chatCtx: ChatContext, _newMessage: ChatMessage): Promise<void> {}\n\n async sttNode(\n audio: ReadableStream<AudioFrame>,\n modelSettings: ModelSettings,\n ): Promise<ReadableStream<SpeechEvent | string> | null> {\n return Agent.default.sttNode(this, audio, modelSettings);\n }\n\n async llmNode(\n chatCtx: ChatContext,\n toolCtx: ToolContext,\n modelSettings: ModelSettings,\n ): Promise<ReadableStream<ChatChunk | string> | null> {\n return Agent.default.llmNode(this, chatCtx, toolCtx, modelSettings);\n }\n\n async ttsNode(\n text: ReadableStream<string>,\n modelSettings: ModelSettings,\n ): Promise<ReadableStream<AudioFrame> | null> {\n return Agent.default.ttsNode(this, text, modelSettings);\n }\n\n async realtimeAudioOutputNode(\n audio: ReadableStream<AudioFrame>,\n modelSettings: ModelSettings,\n ): Promise<ReadableStream<AudioFrame> | null> {\n return Agent.default.realtimeAudioOutputNode(this, audio, modelSettings);\n }\n\n // realtime_audio_output_node\n\n getActivityOrThrow(): AgentActivity {\n if (!this._agentActivity) {\n throw new Error('Agent activity not found');\n }\n return this._agentActivity;\n }\n\n async updateChatCtx(chatCtx: ChatContext): Promise<void> {\n if (!this._agentActivity) {\n this._chatCtx = chatCtx.copy({ toolCtx: this.toolCtx });\n return;\n }\n\n this._agentActivity.updateChatCtx(chatCtx);\n }\n\n static default = {\n async sttNode(\n agent: Agent,\n audio: ReadableStream<AudioFrame>,\n _modelSettings: ModelSettings,\n ): Promise<ReadableStream<SpeechEvent | string> | null> {\n const activity = agent.getActivityOrThrow();\n if (!activity.stt) {\n throw new Error('sttNode called but no STT node is available');\n }\n\n let wrapped_stt = activity.stt;\n\n if (!wrapped_stt.capabilities.streaming) {\n if (!agent.vad) {\n throw new Error(\n 'STT does not support streaming, add a VAD to the AgentTask/VoiceAgent to enable streaming',\n );\n }\n wrapped_stt = new STTStreamAdapter(wrapped_stt, agent.vad);\n }\n\n const stream = wrapped_stt.stream();\n stream.updateInputStream(audio);\n\n return new ReadableStream({\n async start(controller) {\n for await (const event of stream) {\n controller.enqueue(event);\n }\n controller.close();\n },\n cancel() {\n stream.detachInputStream();\n stream.close();\n },\n });\n },\n\n async llmNode(\n agent: Agent,\n chatCtx: ChatContext,\n toolCtx: ToolContext,\n modelSettings: ModelSettings,\n ): Promise<ReadableStream<ChatChunk | string> | null> {\n const activity = agent.getActivityOrThrow();\n if (!activity.llm) {\n throw new Error('llmNode called but no LLM node is available');\n }\n\n if (!(activity.llm instanceof LLM)) {\n throw new Error(\n 'llmNode should only be used with LLM (non-multimodal/realtime APIs) nodes',\n );\n }\n\n // TODO(brian): make parallelToolCalls configurable\n const { toolChoice } = modelSettings;\n\n const stream = activity.llm.chat({\n chatCtx,\n toolCtx,\n toolChoice,\n parallelToolCalls: true,\n });\n return new ReadableStream({\n async start(controller) {\n for await (const chunk of stream) {\n controller.enqueue(chunk);\n }\n controller.close();\n },\n cancel() {\n stream.close();\n },\n });\n },\n\n async ttsNode(\n agent: Agent,\n text: ReadableStream<string>,\n _modelSettings: ModelSettings,\n ): Promise<ReadableStream<AudioFrame> | null> {\n const activity = agent.getActivityOrThrow();\n if (!activity.tts) {\n throw new Error('ttsNode called but no TTS node is available');\n }\n\n let wrapped_tts = activity.tts;\n\n if (!activity.tts.capabilities.streaming) {\n wrapped_tts = new TTSStreamAdapter(wrapped_tts, new BasicSentenceTokenizer());\n }\n\n const stream = wrapped_tts.stream();\n stream.updateInputStream(text);\n\n return new ReadableStream({\n async start(controller) {\n for await (const chunk of stream) {\n if (chunk === SynthesizeStream.END_OF_STREAM) {\n break;\n }\n controller.enqueue(chunk.frame);\n }\n controller.close();\n },\n cancel() {\n stream.close();\n },\n });\n },\n\n async transcriptionNode(\n agent: Agent,\n text: ReadableStream<string>,\n _modelSettings: ModelSettings,\n ): Promise<ReadableStream<string> | null> {\n return text;\n },\n\n async realtimeAudioOutputNode(\n _agent: Agent,\n audio: ReadableStream<AudioFrame>,\n _modelSettings: ModelSettings,\n ): Promise<ReadableStream<AudioFrame> | null> {\n return audio;\n },\n };\n}\n"],"mappings":"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","names":["STTStreamAdapter","TTSStreamAdapter","BasicSentenceTokenizer"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import type { AudioFrame } from '@livekit/rtc-node';
|
|
4
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
5
|
+
import { ReadableStream } from 'node:stream/web';
|
|
6
|
+
import { ReadonlyChatContext } from '../llm/chat_context.js';
|
|
7
|
+
import type { ChatMessage, FunctionCall, RealtimeModel } from '../llm/index.js';
|
|
8
|
+
import { type ChatChunk, ChatContext, LLM, type ToolChoice, type ToolContext } from '../llm/index.js';
|
|
9
|
+
import type { STT, SpeechEvent } from '../stt/index.js';
|
|
10
|
+
import type { TTS } from '../tts/index.js';
|
|
11
|
+
import type { VAD } from '../vad.js';
|
|
12
|
+
import type { AgentActivity } from './agent_activity.js';
|
|
13
|
+
import type { AgentSession, TurnDetectionMode } from './agent_session.js';
|
|
14
|
+
export declare const asyncLocalStorage: AsyncLocalStorage<{
|
|
15
|
+
functionCall?: FunctionCall | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
export declare const STOP_RESPONSE_SYMBOL: unique symbol;
|
|
18
|
+
export declare class StopResponse extends Error {
|
|
19
|
+
constructor();
|
|
20
|
+
}
|
|
21
|
+
export declare function isStopResponse(value: unknown): value is StopResponse;
|
|
22
|
+
export interface ModelSettings {
|
|
23
|
+
toolChoice?: ToolChoice;
|
|
24
|
+
}
|
|
25
|
+
export interface AgentOptions<UserData> {
|
|
26
|
+
instructions: string;
|
|
27
|
+
chatCtx?: ChatContext;
|
|
28
|
+
tools?: ToolContext<UserData>;
|
|
29
|
+
turnDetection?: TurnDetectionMode;
|
|
30
|
+
stt?: STT;
|
|
31
|
+
vad?: VAD;
|
|
32
|
+
llm?: LLM | RealtimeModel;
|
|
33
|
+
tts?: TTS;
|
|
34
|
+
allowInterruptions?: boolean;
|
|
35
|
+
minConsecutiveSpeechDelay?: number;
|
|
36
|
+
}
|
|
37
|
+
export declare class Agent<UserData = any> {
|
|
38
|
+
private turnDetection?;
|
|
39
|
+
private _stt?;
|
|
40
|
+
private _vad?;
|
|
41
|
+
private _llm?;
|
|
42
|
+
private _tts?;
|
|
43
|
+
/** @internal */
|
|
44
|
+
_agentActivity?: AgentActivity;
|
|
45
|
+
/** @internal */
|
|
46
|
+
_chatCtx: ChatContext;
|
|
47
|
+
/** @internal */
|
|
48
|
+
_instructions: string;
|
|
49
|
+
/** @internal */
|
|
50
|
+
_tools?: ToolContext<UserData>;
|
|
51
|
+
constructor({ instructions, chatCtx, tools, turnDetection, stt, vad, llm, tts, }: AgentOptions<UserData>);
|
|
52
|
+
get vad(): VAD | undefined;
|
|
53
|
+
get stt(): STT | undefined;
|
|
54
|
+
get llm(): LLM | RealtimeModel | undefined;
|
|
55
|
+
get tts(): TTS | undefined;
|
|
56
|
+
get chatCtx(): ReadonlyChatContext;
|
|
57
|
+
get instructions(): string;
|
|
58
|
+
get toolCtx(): ToolContext<UserData>;
|
|
59
|
+
get session(): AgentSession<UserData>;
|
|
60
|
+
onEnter(): Promise<void>;
|
|
61
|
+
onExit(): Promise<void>;
|
|
62
|
+
transcriptionNode(text: ReadableStream<string>, modelSettings: ModelSettings): Promise<ReadableStream<string> | null>;
|
|
63
|
+
onUserTurnCompleted(_chatCtx: ChatContext, _newMessage: ChatMessage): Promise<void>;
|
|
64
|
+
sttNode(audio: ReadableStream<AudioFrame>, modelSettings: ModelSettings): Promise<ReadableStream<SpeechEvent | string> | null>;
|
|
65
|
+
llmNode(chatCtx: ChatContext, toolCtx: ToolContext, modelSettings: ModelSettings): Promise<ReadableStream<ChatChunk | string> | null>;
|
|
66
|
+
ttsNode(text: ReadableStream<string>, modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
67
|
+
realtimeAudioOutputNode(audio: ReadableStream<AudioFrame>, modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
68
|
+
getActivityOrThrow(): AgentActivity;
|
|
69
|
+
updateChatCtx(chatCtx: ChatContext): Promise<void>;
|
|
70
|
+
static default: {
|
|
71
|
+
sttNode(agent: Agent, audio: ReadableStream<AudioFrame>, _modelSettings: ModelSettings): Promise<ReadableStream<SpeechEvent | string> | null>;
|
|
72
|
+
llmNode(agent: Agent, chatCtx: ChatContext, toolCtx: ToolContext, modelSettings: ModelSettings): Promise<ReadableStream<ChatChunk | string> | null>;
|
|
73
|
+
ttsNode(agent: Agent, text: ReadableStream<string>, _modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
74
|
+
transcriptionNode(agent: Agent, text: ReadableStream<string>, _modelSettings: ModelSettings): Promise<ReadableStream<string> | null>;
|
|
75
|
+
realtimeAudioOutputNode(_agent: Agent, audio: ReadableStream<AudioFrame>, _modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import type { AudioFrame } from '@livekit/rtc-node';
|
|
4
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
5
|
+
import { ReadableStream } from 'node:stream/web';
|
|
6
|
+
import { ReadonlyChatContext } from '../llm/chat_context.js';
|
|
7
|
+
import type { ChatMessage, FunctionCall, RealtimeModel } from '../llm/index.js';
|
|
8
|
+
import { type ChatChunk, ChatContext, LLM, type ToolChoice, type ToolContext } from '../llm/index.js';
|
|
9
|
+
import type { STT, SpeechEvent } from '../stt/index.js';
|
|
10
|
+
import type { TTS } from '../tts/index.js';
|
|
11
|
+
import type { VAD } from '../vad.js';
|
|
12
|
+
import type { AgentActivity } from './agent_activity.js';
|
|
13
|
+
import type { AgentSession, TurnDetectionMode } from './agent_session.js';
|
|
14
|
+
export declare const asyncLocalStorage: AsyncLocalStorage<{
|
|
15
|
+
functionCall?: FunctionCall | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
export declare const STOP_RESPONSE_SYMBOL: unique symbol;
|
|
18
|
+
export declare class StopResponse extends Error {
|
|
19
|
+
constructor();
|
|
20
|
+
}
|
|
21
|
+
export declare function isStopResponse(value: unknown): value is StopResponse;
|
|
22
|
+
export interface ModelSettings {
|
|
23
|
+
toolChoice?: ToolChoice;
|
|
24
|
+
}
|
|
25
|
+
export interface AgentOptions<UserData> {
|
|
26
|
+
instructions: string;
|
|
27
|
+
chatCtx?: ChatContext;
|
|
28
|
+
tools?: ToolContext<UserData>;
|
|
29
|
+
turnDetection?: TurnDetectionMode;
|
|
30
|
+
stt?: STT;
|
|
31
|
+
vad?: VAD;
|
|
32
|
+
llm?: LLM | RealtimeModel;
|
|
33
|
+
tts?: TTS;
|
|
34
|
+
allowInterruptions?: boolean;
|
|
35
|
+
minConsecutiveSpeechDelay?: number;
|
|
36
|
+
}
|
|
37
|
+
export declare class Agent<UserData = any> {
|
|
38
|
+
private turnDetection?;
|
|
39
|
+
private _stt?;
|
|
40
|
+
private _vad?;
|
|
41
|
+
private _llm?;
|
|
42
|
+
private _tts?;
|
|
43
|
+
/** @internal */
|
|
44
|
+
_agentActivity?: AgentActivity;
|
|
45
|
+
/** @internal */
|
|
46
|
+
_chatCtx: ChatContext;
|
|
47
|
+
/** @internal */
|
|
48
|
+
_instructions: string;
|
|
49
|
+
/** @internal */
|
|
50
|
+
_tools?: ToolContext<UserData>;
|
|
51
|
+
constructor({ instructions, chatCtx, tools, turnDetection, stt, vad, llm, tts, }: AgentOptions<UserData>);
|
|
52
|
+
get vad(): VAD | undefined;
|
|
53
|
+
get stt(): STT | undefined;
|
|
54
|
+
get llm(): LLM | RealtimeModel | undefined;
|
|
55
|
+
get tts(): TTS | undefined;
|
|
56
|
+
get chatCtx(): ReadonlyChatContext;
|
|
57
|
+
get instructions(): string;
|
|
58
|
+
get toolCtx(): ToolContext<UserData>;
|
|
59
|
+
get session(): AgentSession<UserData>;
|
|
60
|
+
onEnter(): Promise<void>;
|
|
61
|
+
onExit(): Promise<void>;
|
|
62
|
+
transcriptionNode(text: ReadableStream<string>, modelSettings: ModelSettings): Promise<ReadableStream<string> | null>;
|
|
63
|
+
onUserTurnCompleted(_chatCtx: ChatContext, _newMessage: ChatMessage): Promise<void>;
|
|
64
|
+
sttNode(audio: ReadableStream<AudioFrame>, modelSettings: ModelSettings): Promise<ReadableStream<SpeechEvent | string> | null>;
|
|
65
|
+
llmNode(chatCtx: ChatContext, toolCtx: ToolContext, modelSettings: ModelSettings): Promise<ReadableStream<ChatChunk | string> | null>;
|
|
66
|
+
ttsNode(text: ReadableStream<string>, modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
67
|
+
realtimeAudioOutputNode(audio: ReadableStream<AudioFrame>, modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
68
|
+
getActivityOrThrow(): AgentActivity;
|
|
69
|
+
updateChatCtx(chatCtx: ChatContext): Promise<void>;
|
|
70
|
+
static default: {
|
|
71
|
+
sttNode(agent: Agent, audio: ReadableStream<AudioFrame>, _modelSettings: ModelSettings): Promise<ReadableStream<SpeechEvent | string> | null>;
|
|
72
|
+
llmNode(agent: Agent, chatCtx: ChatContext, toolCtx: ToolContext, modelSettings: ModelSettings): Promise<ReadableStream<ChatChunk | string> | null>;
|
|
73
|
+
ttsNode(agent: Agent, text: ReadableStream<string>, _modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
74
|
+
transcriptionNode(agent: Agent, text: ReadableStream<string>, _modelSettings: ModelSettings): Promise<ReadableStream<string> | null>;
|
|
75
|
+
realtimeAudioOutputNode(_agent: Agent, audio: ReadableStream<AudioFrame>, _modelSettings: ModelSettings): Promise<ReadableStream<AudioFrame> | null>;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/voice/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { ReadableStream } from "node:stream/web";
|
|
3
|
+
import { ReadonlyChatContext } from "../llm/chat_context.js";
|
|
4
|
+
import {
|
|
5
|
+
ChatContext,
|
|
6
|
+
LLM
|
|
7
|
+
} from "../llm/index.js";
|
|
8
|
+
import { StreamAdapter as STTStreamAdapter } from "../stt/index.js";
|
|
9
|
+
import { SentenceTokenizer as BasicSentenceTokenizer } from "../tokenize/basic/index.js";
|
|
10
|
+
import { SynthesizeStream, StreamAdapter as TTSStreamAdapter } from "../tts/index.js";
|
|
11
|
+
const asyncLocalStorage = new AsyncLocalStorage();
|
|
12
|
+
const STOP_RESPONSE_SYMBOL = Symbol("StopResponse");
|
|
13
|
+
class StopResponse extends Error {
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
this.name = "StopResponse";
|
|
17
|
+
Object.defineProperty(this, STOP_RESPONSE_SYMBOL, {
|
|
18
|
+
value: true
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function isStopResponse(value) {
|
|
23
|
+
return value !== void 0 && value !== null && typeof value === "object" && STOP_RESPONSE_SYMBOL in value;
|
|
24
|
+
}
|
|
25
|
+
class Agent {
|
|
26
|
+
turnDetection;
|
|
27
|
+
_stt;
|
|
28
|
+
_vad;
|
|
29
|
+
_llm;
|
|
30
|
+
_tts;
|
|
31
|
+
/** @internal */
|
|
32
|
+
_agentActivity;
|
|
33
|
+
/** @internal */
|
|
34
|
+
_chatCtx;
|
|
35
|
+
/** @internal */
|
|
36
|
+
_instructions;
|
|
37
|
+
/** @internal */
|
|
38
|
+
_tools;
|
|
39
|
+
constructor({
|
|
40
|
+
instructions,
|
|
41
|
+
chatCtx,
|
|
42
|
+
tools,
|
|
43
|
+
turnDetection,
|
|
44
|
+
stt,
|
|
45
|
+
vad,
|
|
46
|
+
llm,
|
|
47
|
+
tts
|
|
48
|
+
}) {
|
|
49
|
+
this._instructions = instructions;
|
|
50
|
+
this._tools = { ...tools };
|
|
51
|
+
this._chatCtx = chatCtx ? chatCtx.copy({
|
|
52
|
+
toolCtx: this._tools
|
|
53
|
+
}) : ChatContext.empty();
|
|
54
|
+
this.turnDetection = turnDetection;
|
|
55
|
+
this._stt = stt;
|
|
56
|
+
this._vad = vad;
|
|
57
|
+
this._llm = llm;
|
|
58
|
+
this._tts = tts;
|
|
59
|
+
this._agentActivity = void 0;
|
|
60
|
+
}
|
|
61
|
+
get vad() {
|
|
62
|
+
return this._vad;
|
|
63
|
+
}
|
|
64
|
+
get stt() {
|
|
65
|
+
return this._stt;
|
|
66
|
+
}
|
|
67
|
+
get llm() {
|
|
68
|
+
return this._llm;
|
|
69
|
+
}
|
|
70
|
+
get tts() {
|
|
71
|
+
return this._tts;
|
|
72
|
+
}
|
|
73
|
+
get chatCtx() {
|
|
74
|
+
return new ReadonlyChatContext(this._chatCtx.items);
|
|
75
|
+
}
|
|
76
|
+
get instructions() {
|
|
77
|
+
return this._instructions;
|
|
78
|
+
}
|
|
79
|
+
get toolCtx() {
|
|
80
|
+
return { ...this._tools };
|
|
81
|
+
}
|
|
82
|
+
get session() {
|
|
83
|
+
return this.getActivityOrThrow().agentSession;
|
|
84
|
+
}
|
|
85
|
+
async onEnter() {
|
|
86
|
+
}
|
|
87
|
+
async onExit() {
|
|
88
|
+
}
|
|
89
|
+
async transcriptionNode(text, modelSettings) {
|
|
90
|
+
return Agent.default.transcriptionNode(this, text, modelSettings);
|
|
91
|
+
}
|
|
92
|
+
async onUserTurnCompleted(_chatCtx, _newMessage) {
|
|
93
|
+
}
|
|
94
|
+
async sttNode(audio, modelSettings) {
|
|
95
|
+
return Agent.default.sttNode(this, audio, modelSettings);
|
|
96
|
+
}
|
|
97
|
+
async llmNode(chatCtx, toolCtx, modelSettings) {
|
|
98
|
+
return Agent.default.llmNode(this, chatCtx, toolCtx, modelSettings);
|
|
99
|
+
}
|
|
100
|
+
async ttsNode(text, modelSettings) {
|
|
101
|
+
return Agent.default.ttsNode(this, text, modelSettings);
|
|
102
|
+
}
|
|
103
|
+
async realtimeAudioOutputNode(audio, modelSettings) {
|
|
104
|
+
return Agent.default.realtimeAudioOutputNode(this, audio, modelSettings);
|
|
105
|
+
}
|
|
106
|
+
// realtime_audio_output_node
|
|
107
|
+
getActivityOrThrow() {
|
|
108
|
+
if (!this._agentActivity) {
|
|
109
|
+
throw new Error("Agent activity not found");
|
|
110
|
+
}
|
|
111
|
+
return this._agentActivity;
|
|
112
|
+
}
|
|
113
|
+
async updateChatCtx(chatCtx) {
|
|
114
|
+
if (!this._agentActivity) {
|
|
115
|
+
this._chatCtx = chatCtx.copy({ toolCtx: this.toolCtx });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this._agentActivity.updateChatCtx(chatCtx);
|
|
119
|
+
}
|
|
120
|
+
static default = {
|
|
121
|
+
async sttNode(agent, audio, _modelSettings) {
|
|
122
|
+
const activity = agent.getActivityOrThrow();
|
|
123
|
+
if (!activity.stt) {
|
|
124
|
+
throw new Error("sttNode called but no STT node is available");
|
|
125
|
+
}
|
|
126
|
+
let wrapped_stt = activity.stt;
|
|
127
|
+
if (!wrapped_stt.capabilities.streaming) {
|
|
128
|
+
if (!agent.vad) {
|
|
129
|
+
throw new Error(
|
|
130
|
+
"STT does not support streaming, add a VAD to the AgentTask/VoiceAgent to enable streaming"
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
wrapped_stt = new STTStreamAdapter(wrapped_stt, agent.vad);
|
|
134
|
+
}
|
|
135
|
+
const stream = wrapped_stt.stream();
|
|
136
|
+
stream.updateInputStream(audio);
|
|
137
|
+
return new ReadableStream({
|
|
138
|
+
async start(controller) {
|
|
139
|
+
for await (const event of stream) {
|
|
140
|
+
controller.enqueue(event);
|
|
141
|
+
}
|
|
142
|
+
controller.close();
|
|
143
|
+
},
|
|
144
|
+
cancel() {
|
|
145
|
+
stream.detachInputStream();
|
|
146
|
+
stream.close();
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
async llmNode(agent, chatCtx, toolCtx, modelSettings) {
|
|
151
|
+
const activity = agent.getActivityOrThrow();
|
|
152
|
+
if (!activity.llm) {
|
|
153
|
+
throw new Error("llmNode called but no LLM node is available");
|
|
154
|
+
}
|
|
155
|
+
if (!(activity.llm instanceof LLM)) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
"llmNode should only be used with LLM (non-multimodal/realtime APIs) nodes"
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
const { toolChoice } = modelSettings;
|
|
161
|
+
const stream = activity.llm.chat({
|
|
162
|
+
chatCtx,
|
|
163
|
+
toolCtx,
|
|
164
|
+
toolChoice,
|
|
165
|
+
parallelToolCalls: true
|
|
166
|
+
});
|
|
167
|
+
return new ReadableStream({
|
|
168
|
+
async start(controller) {
|
|
169
|
+
for await (const chunk of stream) {
|
|
170
|
+
controller.enqueue(chunk);
|
|
171
|
+
}
|
|
172
|
+
controller.close();
|
|
173
|
+
},
|
|
174
|
+
cancel() {
|
|
175
|
+
stream.close();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
async ttsNode(agent, text, _modelSettings) {
|
|
180
|
+
const activity = agent.getActivityOrThrow();
|
|
181
|
+
if (!activity.tts) {
|
|
182
|
+
throw new Error("ttsNode called but no TTS node is available");
|
|
183
|
+
}
|
|
184
|
+
let wrapped_tts = activity.tts;
|
|
185
|
+
if (!activity.tts.capabilities.streaming) {
|
|
186
|
+
wrapped_tts = new TTSStreamAdapter(wrapped_tts, new BasicSentenceTokenizer());
|
|
187
|
+
}
|
|
188
|
+
const stream = wrapped_tts.stream();
|
|
189
|
+
stream.updateInputStream(text);
|
|
190
|
+
return new ReadableStream({
|
|
191
|
+
async start(controller) {
|
|
192
|
+
for await (const chunk of stream) {
|
|
193
|
+
if (chunk === SynthesizeStream.END_OF_STREAM) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
controller.enqueue(chunk.frame);
|
|
197
|
+
}
|
|
198
|
+
controller.close();
|
|
199
|
+
},
|
|
200
|
+
cancel() {
|
|
201
|
+
stream.close();
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
async transcriptionNode(agent, text, _modelSettings) {
|
|
206
|
+
return text;
|
|
207
|
+
},
|
|
208
|
+
async realtimeAudioOutputNode(_agent, audio, _modelSettings) {
|
|
209
|
+
return audio;
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export {
|
|
214
|
+
Agent,
|
|
215
|
+
STOP_RESPONSE_SYMBOL,
|
|
216
|
+
StopResponse,
|
|
217
|
+
asyncLocalStorage,
|
|
218
|
+
isStopResponse
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=agent.js.map
|