@livekit/agents 0.7.8 → 1.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_exceptions.cjs +109 -0
- package/dist/_exceptions.cjs.map +1 -0
- package/dist/_exceptions.d.cts +64 -0
- package/dist/_exceptions.d.ts +64 -0
- package/dist/_exceptions.d.ts.map +1 -0
- package/dist/_exceptions.js +80 -0
- package/dist/_exceptions.js.map +1 -0
- package/dist/audio.cjs +10 -3
- package/dist/audio.cjs.map +1 -1
- package/dist/audio.d.cts +2 -0
- package/dist/audio.d.ts +2 -0
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +8 -2
- package/dist/audio.js.map +1 -1
- package/dist/cli.cjs +25 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -1
- package/dist/constants.cjs +6 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +2 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/http_server.cjs.map +1 -1
- package/dist/http_server.d.cts +1 -0
- package/dist/http_server.d.ts +1 -0
- package/dist/http_server.d.ts.map +1 -1
- package/dist/http_server.js.map +1 -1
- package/dist/index.cjs +27 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -10
- package/dist/index.d.ts +13 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -11
- package/dist/index.js.map +1 -1
- package/dist/inference_runner.cjs +0 -1
- package/dist/inference_runner.cjs.map +1 -1
- package/dist/inference_runner.d.cts +2 -3
- package/dist/inference_runner.d.ts +2 -3
- package/dist/inference_runner.d.ts.map +1 -1
- package/dist/inference_runner.js +0 -1
- package/dist/inference_runner.js.map +1 -1
- package/dist/ipc/inference_proc_executor.cjs +2 -2
- package/dist/ipc/inference_proc_executor.cjs.map +1 -1
- package/dist/ipc/inference_proc_executor.js +2 -2
- package/dist/ipc/inference_proc_executor.js.map +1 -1
- package/dist/ipc/job_executor.cjs.map +1 -1
- package/dist/ipc/job_executor.js.map +1 -1
- package/dist/ipc/job_proc_executor.cjs +1 -0
- package/dist/ipc/job_proc_executor.cjs.map +1 -1
- package/dist/ipc/job_proc_executor.js +1 -0
- package/dist/ipc/job_proc_executor.js.map +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
- package/dist/ipc/job_proc_lazy_main.js +1 -1
- package/dist/ipc/job_proc_lazy_main.js.map +1 -1
- package/dist/ipc/supervised_proc.d.cts +1 -1
- package/dist/ipc/supervised_proc.d.ts +1 -1
- package/dist/ipc/supervised_proc.d.ts.map +1 -1
- package/dist/job.cjs +14 -2
- package/dist/job.cjs.map +1 -1
- package/dist/job.d.cts +8 -0
- package/dist/job.d.ts +8 -0
- package/dist/job.d.ts.map +1 -1
- package/dist/job.js +12 -1
- package/dist/job.js.map +1 -1
- package/dist/llm/chat_context.cjs +332 -82
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +152 -48
- package/dist/llm/chat_context.d.ts +152 -48
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +327 -81
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/chat_context.test.cjs +380 -0
- package/dist/llm/chat_context.test.cjs.map +1 -0
- package/dist/llm/chat_context.test.js +385 -0
- package/dist/llm/chat_context.test.js.map +1 -0
- package/dist/llm/index.cjs +37 -8
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +7 -3
- package/dist/llm/index.d.ts +7 -3
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +39 -9
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +98 -33
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.cts +50 -24
- package/dist/llm/llm.d.ts +50 -24
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +99 -33
- package/dist/llm/llm.js.map +1 -1
- package/dist/llm/provider_format/google.cjs +128 -0
- package/dist/llm/provider_format/google.cjs.map +1 -0
- package/dist/llm/provider_format/google.d.cts +6 -0
- package/dist/llm/provider_format/google.d.ts +6 -0
- package/dist/llm/provider_format/google.d.ts.map +1 -0
- package/dist/llm/provider_format/google.js +104 -0
- package/dist/llm/provider_format/google.js.map +1 -0
- package/dist/llm/provider_format/google.test.cjs +676 -0
- package/dist/llm/provider_format/google.test.cjs.map +1 -0
- package/dist/llm/provider_format/google.test.js +675 -0
- package/dist/llm/provider_format/google.test.js.map +1 -0
- package/dist/llm/provider_format/index.cjs +40 -0
- package/dist/llm/provider_format/index.cjs.map +1 -0
- package/dist/llm/provider_format/index.d.cts +4 -0
- package/dist/llm/provider_format/index.d.ts +4 -0
- package/dist/llm/provider_format/index.d.ts.map +1 -0
- package/dist/llm/provider_format/index.js +16 -0
- package/dist/llm/provider_format/index.js.map +1 -0
- package/dist/llm/provider_format/openai.cjs +116 -0
- package/dist/llm/provider_format/openai.cjs.map +1 -0
- package/dist/llm/provider_format/openai.d.cts +3 -0
- package/dist/llm/provider_format/openai.d.ts +3 -0
- package/dist/llm/provider_format/openai.d.ts.map +1 -0
- package/dist/llm/provider_format/openai.js +92 -0
- package/dist/llm/provider_format/openai.js.map +1 -0
- package/dist/llm/provider_format/openai.test.cjs +490 -0
- package/dist/llm/provider_format/openai.test.cjs.map +1 -0
- package/dist/llm/provider_format/openai.test.js +489 -0
- package/dist/llm/provider_format/openai.test.js.map +1 -0
- package/dist/llm/provider_format/utils.cjs +146 -0
- package/dist/llm/provider_format/utils.cjs.map +1 -0
- package/dist/llm/provider_format/utils.d.cts +38 -0
- package/dist/llm/provider_format/utils.d.ts +38 -0
- package/dist/llm/provider_format/utils.d.ts.map +1 -0
- package/dist/llm/provider_format/utils.js +122 -0
- package/dist/llm/provider_format/utils.js.map +1 -0
- package/dist/llm/realtime.cjs +77 -0
- package/dist/llm/realtime.cjs.map +1 -0
- package/dist/llm/realtime.d.cts +98 -0
- package/dist/llm/realtime.d.ts +98 -0
- package/dist/llm/realtime.d.ts.map +1 -0
- package/dist/llm/realtime.js +52 -0
- package/dist/llm/realtime.js.map +1 -0
- package/dist/llm/remote_chat_context.cjs +112 -0
- package/dist/llm/remote_chat_context.cjs.map +1 -0
- package/dist/llm/remote_chat_context.d.cts +23 -0
- package/dist/llm/remote_chat_context.d.ts +23 -0
- package/dist/llm/remote_chat_context.d.ts.map +1 -0
- package/dist/llm/remote_chat_context.js +88 -0
- package/dist/llm/remote_chat_context.js.map +1 -0
- package/dist/llm/remote_chat_context.test.cjs +225 -0
- package/dist/llm/remote_chat_context.test.cjs.map +1 -0
- package/dist/llm/remote_chat_context.test.js +224 -0
- package/dist/llm/remote_chat_context.test.js.map +1 -0
- package/dist/llm/tool_context.cjs +111 -0
- package/dist/llm/tool_context.cjs.map +1 -0
- package/dist/llm/tool_context.d.cts +125 -0
- package/dist/llm/tool_context.d.ts +125 -0
- package/dist/llm/tool_context.d.ts.map +1 -0
- package/dist/llm/tool_context.js +80 -0
- package/dist/llm/tool_context.js.map +1 -0
- package/dist/llm/tool_context.test.cjs +162 -0
- package/dist/llm/tool_context.test.cjs.map +1 -0
- package/dist/llm/tool_context.test.js +161 -0
- package/dist/llm/tool_context.test.js.map +1 -0
- package/dist/llm/tool_context.type.test.cjs +92 -0
- package/dist/llm/tool_context.type.test.cjs.map +1 -0
- package/dist/llm/tool_context.type.test.js +91 -0
- package/dist/llm/tool_context.type.test.js.map +1 -0
- package/dist/llm/utils.cjs +260 -0
- package/dist/llm/utils.cjs.map +1 -0
- package/dist/llm/utils.d.cts +42 -0
- package/dist/llm/utils.d.ts +42 -0
- package/dist/llm/utils.d.ts.map +1 -0
- package/dist/llm/utils.js +223 -0
- package/dist/llm/utils.js.map +1 -0
- package/dist/llm/utils.test.cjs +513 -0
- package/dist/llm/utils.test.cjs.map +1 -0
- package/dist/llm/utils.test.js +490 -0
- package/dist/llm/utils.test.js.map +1 -0
- package/dist/metrics/base.cjs +0 -27
- package/dist/metrics/base.cjs.map +1 -1
- package/dist/metrics/base.d.cts +105 -63
- package/dist/metrics/base.d.ts +105 -63
- package/dist/metrics/base.d.ts.map +1 -1
- package/dist/metrics/base.js +0 -19
- package/dist/metrics/base.js.map +1 -1
- package/dist/metrics/index.cjs +0 -3
- package/dist/metrics/index.cjs.map +1 -1
- package/dist/metrics/index.d.cts +2 -3
- package/dist/metrics/index.d.ts +2 -3
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +0 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/usage_collector.cjs +17 -12
- package/dist/metrics/usage_collector.cjs.map +1 -1
- package/dist/metrics/usage_collector.d.cts +3 -2
- package/dist/metrics/usage_collector.d.ts +3 -2
- package/dist/metrics/usage_collector.d.ts.map +1 -1
- package/dist/metrics/usage_collector.js +17 -12
- package/dist/metrics/usage_collector.js.map +1 -1
- package/dist/metrics/utils.cjs +22 -59
- package/dist/metrics/utils.cjs.map +1 -1
- package/dist/metrics/utils.d.cts +1 -8
- package/dist/metrics/utils.d.ts +1 -8
- package/dist/metrics/utils.d.ts.map +1 -1
- package/dist/metrics/utils.js +22 -52
- package/dist/metrics/utils.js.map +1 -1
- package/dist/multimodal/index.cjs +0 -2
- package/dist/multimodal/index.cjs.map +1 -1
- package/dist/multimodal/index.d.cts +0 -1
- package/dist/multimodal/index.d.ts +0 -1
- package/dist/multimodal/index.d.ts.map +1 -1
- package/dist/multimodal/index.js +0 -1
- package/dist/multimodal/index.js.map +1 -1
- package/dist/plugin.cjs +24 -8
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +18 -4
- package/dist/plugin.d.ts +18 -4
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +22 -7
- package/dist/plugin.js.map +1 -1
- package/dist/stream/deferred_stream.cjs +98 -0
- package/dist/stream/deferred_stream.cjs.map +1 -0
- package/dist/stream/deferred_stream.d.cts +27 -0
- package/dist/stream/deferred_stream.d.ts +27 -0
- package/dist/stream/deferred_stream.d.ts.map +1 -0
- package/dist/stream/deferred_stream.js +73 -0
- package/dist/stream/deferred_stream.js.map +1 -0
- package/dist/stream/deferred_stream.test.cjs +527 -0
- package/dist/stream/deferred_stream.test.cjs.map +1 -0
- package/dist/stream/deferred_stream.test.js +526 -0
- package/dist/stream/deferred_stream.test.js.map +1 -0
- package/dist/stream/identity_transform.cjs +42 -0
- package/dist/stream/identity_transform.cjs.map +1 -0
- package/dist/stream/identity_transform.d.cts +6 -0
- package/dist/stream/identity_transform.d.ts +6 -0
- package/dist/stream/identity_transform.d.ts.map +1 -0
- package/dist/stream/identity_transform.js +18 -0
- package/dist/stream/identity_transform.js.map +1 -0
- package/dist/stream/identity_transform.test.cjs +125 -0
- package/dist/stream/identity_transform.test.cjs.map +1 -0
- package/dist/stream/identity_transform.test.js +124 -0
- package/dist/stream/identity_transform.test.js.map +1 -0
- package/dist/stream/index.cjs +38 -0
- package/dist/stream/index.cjs.map +1 -0
- package/dist/stream/index.d.cts +5 -0
- package/dist/stream/index.d.ts +5 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +11 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/merge_readable_streams.cjs +59 -0
- package/dist/stream/merge_readable_streams.cjs.map +1 -0
- package/dist/stream/merge_readable_streams.d.cts +4 -0
- package/dist/stream/merge_readable_streams.d.ts +4 -0
- package/dist/stream/merge_readable_streams.d.ts.map +1 -0
- package/dist/stream/merge_readable_streams.js +35 -0
- package/dist/stream/merge_readable_streams.js.map +1 -0
- package/dist/stream/stream_channel.cjs +47 -0
- package/dist/stream/stream_channel.cjs.map +1 -0
- package/dist/stream/stream_channel.d.cts +9 -0
- package/dist/stream/stream_channel.d.ts +9 -0
- package/dist/stream/stream_channel.d.ts.map +1 -0
- package/dist/stream/stream_channel.js +23 -0
- package/dist/stream/stream_channel.js.map +1 -0
- package/dist/stream/stream_channel.test.cjs +97 -0
- package/dist/stream/stream_channel.test.cjs.map +1 -0
- package/dist/stream/stream_channel.test.js +96 -0
- package/dist/stream/stream_channel.test.js.map +1 -0
- package/dist/stt/stream_adapter.cjs +3 -4
- package/dist/stt/stream_adapter.cjs.map +1 -1
- package/dist/stt/stream_adapter.d.cts +1 -0
- package/dist/stt/stream_adapter.d.ts +1 -0
- package/dist/stt/stream_adapter.d.ts.map +1 -1
- package/dist/stt/stream_adapter.js +3 -4
- package/dist/stt/stream_adapter.js.map +1 -1
- package/dist/stt/stt.cjs +101 -10
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.cts +26 -5
- package/dist/stt/stt.d.ts +26 -5
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +102 -11
- package/dist/stt/stt.js.map +1 -1
- package/dist/tokenize/basic/basic.cjs +10 -5
- package/dist/tokenize/basic/basic.cjs.map +1 -1
- package/dist/tokenize/basic/basic.d.cts +7 -1
- package/dist/tokenize/basic/basic.d.ts +7 -1
- package/dist/tokenize/basic/basic.d.ts.map +1 -1
- package/dist/tokenize/basic/basic.js +10 -5
- package/dist/tokenize/basic/basic.js.map +1 -1
- package/dist/tokenize/basic/sentence.cjs +14 -6
- package/dist/tokenize/basic/sentence.cjs.map +1 -1
- package/dist/tokenize/basic/sentence.d.cts +1 -1
- package/dist/tokenize/basic/sentence.d.ts +1 -1
- package/dist/tokenize/basic/sentence.d.ts.map +1 -1
- package/dist/tokenize/basic/sentence.js +14 -6
- package/dist/tokenize/basic/sentence.js.map +1 -1
- package/dist/tokenize/token_stream.cjs +5 -3
- package/dist/tokenize/token_stream.cjs.map +1 -1
- package/dist/tokenize/token_stream.d.cts +1 -0
- package/dist/tokenize/token_stream.d.ts +1 -0
- package/dist/tokenize/token_stream.d.ts.map +1 -1
- package/dist/tokenize/token_stream.js +6 -4
- package/dist/tokenize/token_stream.js.map +1 -1
- package/dist/transcription.cjs +1 -2
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js +2 -3
- package/dist/transcription.js.map +1 -1
- package/dist/tts/index.cjs +2 -4
- package/dist/tts/index.cjs.map +1 -1
- package/dist/tts/index.d.cts +1 -1
- package/dist/tts/index.d.ts +1 -1
- package/dist/tts/index.d.ts.map +1 -1
- package/dist/tts/index.js +1 -3
- package/dist/tts/index.js.map +1 -1
- package/dist/tts/stream_adapter.cjs +26 -13
- package/dist/tts/stream_adapter.cjs.map +1 -1
- package/dist/tts/stream_adapter.d.cts +1 -1
- package/dist/tts/stream_adapter.d.ts +1 -1
- package/dist/tts/stream_adapter.d.ts.map +1 -1
- package/dist/tts/stream_adapter.js +27 -14
- package/dist/tts/stream_adapter.js.map +1 -1
- package/dist/tts/tts.cjs +157 -25
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.cts +29 -5
- package/dist/tts/tts.d.ts +29 -5
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +157 -24
- package/dist/tts/tts.js.map +1 -1
- package/dist/types.cjs +60 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +13 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +35 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.cjs +281 -27
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +134 -9
- package/dist/utils.d.ts +134 -9
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +265 -26
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.cjs +492 -0
- package/dist/utils.test.cjs.map +1 -0
- package/dist/utils.test.js +498 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/vad.cjs +76 -20
- package/dist/vad.cjs.map +1 -1
- package/dist/vad.d.cts +25 -5
- package/dist/vad.d.ts +25 -5
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js +76 -20
- package/dist/vad.js.map +1 -1
- package/dist/voice/agent.cjs +245 -0
- package/dist/voice/agent.cjs.map +1 -0
- package/dist/voice/agent.d.cts +78 -0
- package/dist/voice/agent.d.ts +78 -0
- package/dist/voice/agent.d.ts.map +1 -0
- package/dist/voice/agent.js +220 -0
- package/dist/voice/agent.js.map +1 -0
- package/dist/voice/agent.test.cjs +61 -0
- package/dist/voice/agent.test.cjs.map +1 -0
- package/dist/voice/agent.test.js +60 -0
- package/dist/voice/agent.test.js.map +1 -0
- package/dist/voice/agent_activity.cjs +1453 -0
- package/dist/voice/agent_activity.cjs.map +1 -0
- package/dist/voice/agent_activity.d.cts +94 -0
- package/dist/voice/agent_activity.d.ts +94 -0
- package/dist/voice/agent_activity.d.ts.map +1 -0
- package/dist/voice/agent_activity.js +1449 -0
- package/dist/voice/agent_activity.js.map +1 -0
- package/dist/voice/agent_session.cjs +312 -0
- package/dist/voice/agent_session.cjs.map +1 -0
- package/dist/voice/agent_session.d.cts +121 -0
- package/dist/voice/agent_session.d.ts +121 -0
- package/dist/voice/agent_session.d.ts.map +1 -0
- package/dist/voice/agent_session.js +295 -0
- package/dist/voice/agent_session.js.map +1 -0
- package/dist/voice/audio_recognition.cjs +375 -0
- package/dist/voice/audio_recognition.cjs.map +1 -0
- package/dist/voice/audio_recognition.d.cts +80 -0
- package/dist/voice/audio_recognition.d.ts +80 -0
- package/dist/voice/audio_recognition.d.ts.map +1 -0
- package/dist/voice/audio_recognition.js +351 -0
- package/dist/voice/audio_recognition.js.map +1 -0
- package/dist/voice/events.cjs +145 -0
- package/dist/voice/events.cjs.map +1 -0
- package/dist/voice/events.d.cts +124 -0
- package/dist/voice/events.d.ts +124 -0
- package/dist/voice/events.d.ts.map +1 -0
- package/dist/voice/events.js +110 -0
- package/dist/voice/events.js.map +1 -0
- package/dist/voice/generation.cjs +700 -0
- package/dist/voice/generation.cjs.map +1 -0
- package/dist/voice/generation.d.cts +115 -0
- package/dist/voice/generation.d.ts +115 -0
- package/dist/voice/generation.d.ts.map +1 -0
- package/dist/voice/generation.js +672 -0
- package/dist/voice/generation.js.map +1 -0
- package/dist/voice/index.cjs +40 -0
- package/dist/voice/index.cjs.map +1 -0
- package/dist/voice/index.d.cts +5 -0
- package/dist/voice/index.d.ts +5 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +11 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/io.cjs +245 -0
- package/dist/voice/io.cjs.map +1 -0
- package/dist/voice/io.d.cts +101 -0
- package/dist/voice/io.d.ts +101 -0
- package/dist/voice/io.d.ts.map +1 -0
- package/dist/voice/io.js +217 -0
- package/dist/voice/io.js.map +1 -0
- package/dist/voice/room_io/_input.cjs +121 -0
- package/dist/voice/room_io/_input.cjs.map +1 -0
- package/dist/voice/room_io/_input.d.cts +24 -0
- package/dist/voice/room_io/_input.d.ts +24 -0
- package/dist/voice/room_io/_input.d.ts.map +1 -0
- package/dist/voice/room_io/_input.js +102 -0
- package/dist/voice/room_io/_input.js.map +1 -0
- package/dist/voice/room_io/_output.cjs +358 -0
- package/dist/voice/room_io/_output.cjs.map +1 -0
- package/dist/voice/room_io/_output.d.cts +75 -0
- package/dist/voice/room_io/_output.d.ts +75 -0
- package/dist/voice/room_io/_output.d.ts.map +1 -0
- package/dist/voice/room_io/_output.js +342 -0
- package/dist/voice/room_io/_output.js.map +1 -0
- package/dist/voice/room_io/index.cjs +25 -0
- package/dist/voice/room_io/index.cjs.map +1 -0
- package/dist/voice/room_io/index.d.cts +3 -0
- package/dist/voice/room_io/index.d.ts +3 -0
- package/dist/voice/room_io/index.d.ts.map +1 -0
- package/dist/voice/room_io/index.js +3 -0
- package/dist/voice/room_io/index.js.map +1 -0
- package/dist/voice/room_io/room_io.cjs +370 -0
- package/dist/voice/room_io/room_io.cjs.map +1 -0
- package/dist/voice/room_io/room_io.d.cts +73 -0
- package/dist/voice/room_io/room_io.d.ts +73 -0
- package/dist/voice/room_io/room_io.d.ts.map +1 -0
- package/dist/voice/room_io/room_io.js +361 -0
- package/dist/voice/room_io/room_io.js.map +1 -0
- package/dist/{pipeline/index.cjs → voice/run_context.cjs} +16 -11
- package/dist/voice/run_context.cjs.map +1 -0
- package/dist/voice/run_context.d.cts +12 -0
- package/dist/voice/run_context.d.ts +12 -0
- package/dist/voice/run_context.d.ts.map +1 -0
- package/dist/voice/run_context.js +14 -0
- package/dist/voice/run_context.js.map +1 -0
- package/dist/voice/speech_handle.cjs +105 -0
- package/dist/voice/speech_handle.cjs.map +1 -0
- package/dist/voice/speech_handle.d.cts +46 -0
- package/dist/voice/speech_handle.d.ts +46 -0
- package/dist/voice/speech_handle.d.ts.map +1 -0
- package/dist/voice/speech_handle.js +81 -0
- package/dist/voice/speech_handle.js.map +1 -0
- package/dist/voice/transcription/_utils.cjs +45 -0
- package/dist/voice/transcription/_utils.cjs.map +1 -0
- package/dist/voice/transcription/_utils.d.cts +3 -0
- package/dist/voice/transcription/_utils.d.ts +3 -0
- package/dist/voice/transcription/_utils.d.ts.map +1 -0
- package/dist/voice/transcription/_utils.js +21 -0
- package/dist/voice/transcription/_utils.js.map +1 -0
- package/dist/voice/transcription/index.cjs +23 -0
- package/dist/voice/transcription/index.cjs.map +1 -0
- package/dist/voice/transcription/index.d.cts +2 -0
- package/dist/voice/transcription/index.d.ts +2 -0
- package/dist/voice/transcription/index.d.ts.map +1 -0
- package/dist/voice/transcription/index.js +2 -0
- package/dist/voice/transcription/index.js.map +1 -0
- package/dist/voice/transcription/synchronizer.cjs +380 -0
- package/dist/voice/transcription/synchronizer.cjs.map +1 -0
- package/dist/voice/transcription/synchronizer.d.cts +86 -0
- package/dist/voice/transcription/synchronizer.d.ts +86 -0
- package/dist/voice/transcription/synchronizer.d.ts.map +1 -0
- package/dist/voice/transcription/synchronizer.js +355 -0
- package/dist/voice/transcription/synchronizer.js.map +1 -0
- package/dist/worker.cjs +22 -4
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +22 -4
- package/dist/worker.js.map +1 -1
- package/package.json +9 -2
- package/src/_exceptions.ts +137 -0
- package/src/audio.ts +12 -1
- package/src/cli.ts +37 -0
- package/src/constants.ts +2 -0
- package/src/http_server.ts +1 -0
- package/src/index.ts +13 -10
- package/src/inference_runner.ts +2 -3
- package/src/ipc/inference_proc_executor.ts +2 -2
- package/src/ipc/job_executor.ts +1 -1
- package/src/ipc/job_proc_executor.ts +1 -1
- package/src/ipc/job_proc_lazy_main.ts +1 -1
- package/src/job.ts +18 -0
- package/src/llm/__snapshots__/chat_context.test.ts.snap +527 -0
- package/src/llm/__snapshots__/tool_context.test.ts.snap +177 -0
- package/src/llm/__snapshots__/utils.test.ts.snap +65 -0
- package/src/llm/chat_context.test.ts +450 -0
- package/src/llm/chat_context.ts +501 -103
- package/src/llm/index.ts +53 -18
- package/src/llm/llm.ts +149 -50
- package/src/llm/provider_format/google.test.ts +772 -0
- package/src/llm/provider_format/google.ts +130 -0
- package/src/llm/provider_format/index.ts +23 -0
- package/src/llm/provider_format/openai.test.ts +581 -0
- package/src/llm/provider_format/openai.ts +118 -0
- package/src/llm/provider_format/utils.ts +183 -0
- package/src/llm/realtime.ts +151 -0
- package/src/llm/remote_chat_context.test.ts +290 -0
- package/src/llm/remote_chat_context.ts +114 -0
- package/src/llm/tool_context.test.ts +198 -0
- package/src/llm/tool_context.ts +259 -0
- package/src/llm/tool_context.type.test.ts +115 -0
- package/src/llm/utils.test.ts +670 -0
- package/src/llm/utils.ts +324 -0
- package/src/metrics/base.ts +110 -78
- package/src/metrics/index.ts +3 -9
- package/src/metrics/usage_collector.ts +19 -13
- package/src/metrics/utils.ts +24 -69
- package/src/multimodal/index.ts +0 -1
- package/src/plugin.ts +26 -8
- package/src/stream/deferred_stream.test.ts +755 -0
- package/src/stream/deferred_stream.ts +110 -0
- package/src/stream/identity_transform.test.ts +179 -0
- package/src/stream/identity_transform.ts +18 -0
- package/src/stream/index.ts +7 -0
- package/src/stream/merge_readable_streams.ts +40 -0
- package/src/stream/stream_channel.test.ts +129 -0
- package/src/stream/stream_channel.ts +32 -0
- package/src/stt/stream_adapter.ts +3 -5
- package/src/stt/stt.ts +135 -17
- package/src/tokenize/basic/basic.ts +13 -5
- package/src/tokenize/basic/sentence.ts +20 -6
- package/src/tokenize/token_stream.ts +7 -4
- package/src/transcription.ts +2 -3
- package/src/tts/index.ts +0 -1
- package/src/tts/stream_adapter.ts +42 -16
- package/src/tts/tts.ts +203 -21
- package/src/types.ts +42 -0
- package/src/utils.test.ts +658 -0
- package/src/utils.ts +375 -44
- package/src/vad.ts +90 -22
- package/src/voice/agent.test.ts +80 -0
- package/src/voice/agent.ts +332 -0
- package/src/voice/agent_activity.ts +1913 -0
- package/src/voice/agent_session.ts +460 -0
- package/src/voice/audio_recognition.ts +474 -0
- package/src/voice/events.ts +252 -0
- package/src/voice/generation.ts +881 -0
- package/src/voice/index.ts +7 -0
- package/src/voice/io.ts +304 -0
- package/src/voice/room_io/_input.ts +144 -0
- package/src/voice/room_io/_output.ts +436 -0
- package/src/voice/room_io/index.ts +5 -0
- package/src/voice/room_io/room_io.ts +495 -0
- package/src/voice/run_context.ts +20 -0
- package/src/voice/speech_handle.ts +104 -0
- package/src/voice/transcription/_utils.ts +25 -0
- package/src/voice/transcription/index.ts +4 -0
- package/src/voice/transcription/synchronizer.ts +478 -0
- package/src/worker.ts +22 -2
- package/dist/llm/function_context.cjs +0 -103
- package/dist/llm/function_context.cjs.map +0 -1
- package/dist/llm/function_context.d.cts +0 -47
- package/dist/llm/function_context.d.ts +0 -47
- package/dist/llm/function_context.d.ts.map +0 -1
- package/dist/llm/function_context.js +0 -78
- package/dist/llm/function_context.js.map +0 -1
- package/dist/llm/function_context.test.cjs +0 -218
- package/dist/llm/function_context.test.cjs.map +0 -1
- package/dist/llm/function_context.test.js +0 -217
- package/dist/llm/function_context.test.js.map +0 -1
- package/dist/multimodal/multimodal_agent.cjs +0 -451
- 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 -425
- 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 -849
- 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 -826
- 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 -555
- 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 -1185
- package/src/pipeline/speech_handle.ts +0 -201
package/dist/llm/llm.cjs
CHANGED
|
@@ -19,31 +19,105 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var llm_exports = {};
|
|
20
20
|
__export(llm_exports, {
|
|
21
21
|
LLM: () => LLM,
|
|
22
|
-
LLMEvent: () => LLMEvent,
|
|
23
22
|
LLMStream: () => LLMStream
|
|
24
23
|
});
|
|
25
24
|
module.exports = __toCommonJS(llm_exports);
|
|
25
|
+
var import_async = require("@std/async");
|
|
26
26
|
var import_node_events = require("node:events");
|
|
27
|
+
var import_exceptions = require("../_exceptions.cjs");
|
|
28
|
+
var import_log = require("../log.cjs");
|
|
27
29
|
var import_utils = require("../utils.cjs");
|
|
28
|
-
var
|
|
29
|
-
LLMEvent2[LLMEvent2["METRICS_COLLECTED"] = 0] = "METRICS_COLLECTED";
|
|
30
|
-
return LLMEvent2;
|
|
31
|
-
})(LLMEvent || {});
|
|
30
|
+
var import_chat_context = require("./chat_context.cjs");
|
|
32
31
|
class LLM extends import_node_events.EventEmitter {
|
|
32
|
+
constructor() {
|
|
33
|
+
super();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the model name/identifier for this LLM instance.
|
|
37
|
+
*
|
|
38
|
+
* @returns The model name if available, "unknown" otherwise.
|
|
39
|
+
*
|
|
40
|
+
* @remarks
|
|
41
|
+
* Plugins should override this property to provide their model information.
|
|
42
|
+
*/
|
|
43
|
+
get model() {
|
|
44
|
+
return "unknown";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Pre-warm connection to the LLM service
|
|
48
|
+
*/
|
|
49
|
+
prewarm() {
|
|
50
|
+
}
|
|
51
|
+
async aclose() {
|
|
52
|
+
}
|
|
33
53
|
}
|
|
34
54
|
class LLMStream {
|
|
35
55
|
output = new import_utils.AsyncIterableQueue();
|
|
36
56
|
queue = new import_utils.AsyncIterableQueue();
|
|
37
57
|
closed = false;
|
|
38
|
-
|
|
58
|
+
abortController = new AbortController();
|
|
59
|
+
_connOptions;
|
|
60
|
+
logger = (0, import_log.log)();
|
|
39
61
|
#llm;
|
|
40
62
|
#chatCtx;
|
|
41
|
-
#
|
|
42
|
-
constructor(llm,
|
|
63
|
+
#toolCtx;
|
|
64
|
+
constructor(llm, {
|
|
65
|
+
chatCtx,
|
|
66
|
+
toolCtx,
|
|
67
|
+
connOptions
|
|
68
|
+
}) {
|
|
43
69
|
this.#llm = llm;
|
|
44
70
|
this.#chatCtx = chatCtx;
|
|
45
|
-
this.#
|
|
71
|
+
this.#toolCtx = toolCtx;
|
|
72
|
+
this._connOptions = connOptions;
|
|
46
73
|
this.monitorMetrics();
|
|
74
|
+
this.abortController.signal.addEventListener("abort", () => {
|
|
75
|
+
this.output.close();
|
|
76
|
+
this.closed = true;
|
|
77
|
+
});
|
|
78
|
+
(0, import_utils.startSoon)(() => this.mainTask().then(() => this.queue.close()));
|
|
79
|
+
}
|
|
80
|
+
async mainTask() {
|
|
81
|
+
for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
|
|
82
|
+
try {
|
|
83
|
+
return await this.run();
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (error instanceof import_exceptions.APIError) {
|
|
86
|
+
const retryInterval = this._connOptions._intervalForRetry(i);
|
|
87
|
+
if (this._connOptions.maxRetry === 0 || !error.retryable) {
|
|
88
|
+
this.emitError({ error, recoverable: false });
|
|
89
|
+
throw error;
|
|
90
|
+
} else if (i === this._connOptions.maxRetry) {
|
|
91
|
+
this.emitError({ error, recoverable: false });
|
|
92
|
+
throw new import_exceptions.APIConnectionError({
|
|
93
|
+
message: `failed to generate LLM completion after ${this._connOptions.maxRetry + 1} attempts`,
|
|
94
|
+
options: { retryable: false }
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
this.emitError({ error, recoverable: true });
|
|
98
|
+
this.logger.warn(
|
|
99
|
+
{ llm: this.#llm.label(), attempt: i + 1, error },
|
|
100
|
+
`failed to generate LLM completion, retrying in ${retryInterval}s`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (retryInterval > 0) {
|
|
104
|
+
await (0, import_async.delay)(retryInterval);
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
this.emitError({ error: (0, import_utils.toError)(error), recoverable: false });
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
emitError({ error, recoverable }) {
|
|
114
|
+
this.#llm.emit("error", {
|
|
115
|
+
type: "llm_error",
|
|
116
|
+
timestamp: Date.now(),
|
|
117
|
+
label: this.#llm.label(),
|
|
118
|
+
error,
|
|
119
|
+
recoverable
|
|
120
|
+
});
|
|
47
121
|
}
|
|
48
122
|
async monitorMetrics() {
|
|
49
123
|
const startTime = process.hrtime.bigint();
|
|
@@ -51,8 +125,11 @@ class LLMStream {
|
|
|
51
125
|
let requestId = "";
|
|
52
126
|
let usage;
|
|
53
127
|
for await (const ev of this.queue) {
|
|
128
|
+
if (this.abortController.signal.aborted) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
54
131
|
this.output.put(ev);
|
|
55
|
-
requestId = ev.
|
|
132
|
+
requestId = ev.id;
|
|
56
133
|
if (ttft === BigInt(-1)) {
|
|
57
134
|
ttft = process.hrtime.bigint() - startTime;
|
|
58
135
|
}
|
|
@@ -63,49 +140,38 @@ class LLMStream {
|
|
|
63
140
|
this.output.close();
|
|
64
141
|
const duration = process.hrtime.bigint() - startTime;
|
|
65
142
|
const metrics = {
|
|
143
|
+
type: "llm_metrics",
|
|
66
144
|
timestamp: Date.now(),
|
|
67
145
|
requestId,
|
|
68
146
|
ttft: ttft === BigInt(-1) ? -1 : Math.trunc(Number(ttft / BigInt(1e6))),
|
|
69
147
|
duration: Math.trunc(Number(duration / BigInt(1e6))),
|
|
70
|
-
cancelled:
|
|
71
|
-
|
|
72
|
-
label: this.label,
|
|
148
|
+
cancelled: this.abortController.signal.aborted,
|
|
149
|
+
label: this.#llm.label(),
|
|
73
150
|
completionTokens: (usage == null ? void 0 : usage.completionTokens) || 0,
|
|
74
151
|
promptTokens: (usage == null ? void 0 : usage.promptTokens) || 0,
|
|
152
|
+
promptCachedTokens: (usage == null ? void 0 : usage.promptCachedTokens) || 0,
|
|
75
153
|
totalTokens: (usage == null ? void 0 : usage.totalTokens) || 0,
|
|
76
154
|
tokensPerSecond: ((usage == null ? void 0 : usage.completionTokens) || 0) / Math.trunc(Number(duration / BigInt(1e9)))
|
|
77
155
|
};
|
|
78
|
-
this.#llm.emit(
|
|
79
|
-
}
|
|
80
|
-
/** List of called functions from this stream. */
|
|
81
|
-
get functionCalls() {
|
|
82
|
-
return this._functionCalls;
|
|
156
|
+
this.#llm.emit("metrics_collected", metrics);
|
|
83
157
|
}
|
|
84
158
|
/** The function context of this stream. */
|
|
85
|
-
get
|
|
86
|
-
return this.#
|
|
159
|
+
get toolCtx() {
|
|
160
|
+
return this.#toolCtx;
|
|
87
161
|
}
|
|
88
162
|
/** The initial chat context of this stream. */
|
|
89
163
|
get chatCtx() {
|
|
90
164
|
return this.#chatCtx;
|
|
91
165
|
}
|
|
92
|
-
/**
|
|
93
|
-
|
|
94
|
-
this.
|
|
95
|
-
(f) => f.task = f.func.execute(f.params).then(
|
|
96
|
-
(result) => ({ name: f.name, toolCallId: f.toolCallId, result }),
|
|
97
|
-
(error) => ({ name: f.name, toolCallId: f.toolCallId, error })
|
|
98
|
-
)
|
|
99
|
-
);
|
|
100
|
-
return this._functionCalls;
|
|
166
|
+
/** The connection options for this stream. */
|
|
167
|
+
get connOptions() {
|
|
168
|
+
return this._connOptions;
|
|
101
169
|
}
|
|
102
170
|
next() {
|
|
103
171
|
return this.output.next();
|
|
104
172
|
}
|
|
105
173
|
close() {
|
|
106
|
-
this.
|
|
107
|
-
this.queue.close();
|
|
108
|
-
this.closed = true;
|
|
174
|
+
this.abortController.abort();
|
|
109
175
|
}
|
|
110
176
|
[Symbol.asyncIterator]() {
|
|
111
177
|
return this;
|
|
@@ -114,7 +180,6 @@ class LLMStream {
|
|
|
114
180
|
// Annotate the CommonJS export names for ESM import in node:
|
|
115
181
|
0 && (module.exports = {
|
|
116
182
|
LLM,
|
|
117
|
-
LLMEvent,
|
|
118
183
|
LLMStream
|
|
119
184
|
});
|
|
120
185
|
//# sourceMappingURL=llm.cjs.map
|
package/dist/llm/llm.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/llm/llm.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport { EventEmitter } from 'node:events';\nimport type { LLMMetrics } from '../metrics/base.js';\nimport { AsyncIterableQueue } from '../utils.js';\nimport type { ChatContext, ChatRole } from './chat_context.js';\nimport type { FunctionCallInfo, FunctionContext } from './function_context.js';\n\nexport interface ChoiceDelta {\n role: ChatRole;\n content?: string;\n toolCalls?: FunctionCallInfo[];\n}\n\nexport interface CompletionUsage {\n completionTokens: number;\n promptTokens: number;\n totalTokens: number;\n}\n\nexport interface Choice {\n delta: ChoiceDelta;\n index: number;\n}\n\nexport interface ChatChunk {\n requestId: string;\n choices: Choice[];\n usage?: CompletionUsage;\n}\n\nexport enum LLMEvent {\n METRICS_COLLECTED,\n}\n\nexport type LLMCallbacks = {\n [LLMEvent.METRICS_COLLECTED]: (metrics: LLMMetrics) => void;\n};\n\nexport abstract class LLM extends (EventEmitter as new () => TypedEmitter<LLMCallbacks>) {\n /**\n * Returns a {@link LLMStream} that can be used to push text and receive LLM responses.\n */\n abstract chat({\n chatCtx,\n fncCtx,\n temperature,\n n,\n parallelToolCalls,\n }: {\n chatCtx: ChatContext;\n fncCtx?: FunctionContext;\n temperature?: number;\n n?: number;\n parallelToolCalls?: boolean;\n }): LLMStream;\n}\n\nexport abstract class LLMStream implements AsyncIterableIterator<ChatChunk> {\n protected output = new AsyncIterableQueue<ChatChunk>();\n protected queue = new AsyncIterableQueue<ChatChunk>();\n protected closed = false;\n protected _functionCalls: FunctionCallInfo[] = [];\n abstract label: string;\n\n #llm: LLM;\n #chatCtx: ChatContext;\n #fncCtx?: FunctionContext;\n\n constructor(llm: LLM, chatCtx: ChatContext, fncCtx?: FunctionContext) {\n this.#llm = llm;\n this.#chatCtx = chatCtx;\n this.#fncCtx = fncCtx;\n this.monitorMetrics();\n }\n\n protected async monitorMetrics() {\n const startTime = process.hrtime.bigint();\n let ttft: bigint = BigInt(-1);\n let requestId = '';\n let usage: CompletionUsage | undefined;\n\n for await (const ev of this.queue) {\n this.output.put(ev);\n requestId = ev.requestId;\n if (ttft === BigInt(-1)) {\n ttft = process.hrtime.bigint() - startTime;\n }\n if (ev.usage) {\n usage = ev.usage;\n }\n }\n this.output.close();\n\n const duration = process.hrtime.bigint() - startTime;\n const metrics: LLMMetrics = {\n timestamp: Date.now(),\n requestId,\n ttft: ttft === BigInt(-1) ? -1 : Math.trunc(Number(ttft / BigInt(1000000))),\n duration: Math.trunc(Number(duration / BigInt(1000000))),\n cancelled: false, // XXX(nbsp)\n label: this.label,\n completionTokens: usage?.completionTokens || 0,\n promptTokens: usage?.promptTokens || 0,\n totalTokens: usage?.totalTokens || 0,\n tokensPerSecond:\n (usage?.completionTokens || 0) / Math.trunc(Number(duration / BigInt(1000000000))),\n };\n this.#llm.emit(LLMEvent.METRICS_COLLECTED, metrics);\n }\n\n /** List of called functions from this stream. */\n get functionCalls(): FunctionCallInfo[] {\n return this._functionCalls;\n }\n\n /** The function context of this stream. */\n get fncCtx(): FunctionContext | undefined {\n return this.#fncCtx;\n }\n\n /** The initial chat context of this stream. */\n get chatCtx(): ChatContext {\n return this.#chatCtx;\n }\n\n /** Execute all deferred functions of this stream concurrently. */\n executeFunctions(): FunctionCallInfo[] {\n this._functionCalls.forEach(\n (f) =>\n (f.task = f.func.execute(f.params).then(\n (result) => ({ name: f.name, toolCallId: f.toolCallId, result }),\n (error) => ({ name: f.name, toolCallId: f.toolCallId, error }),\n )),\n );\n return this._functionCalls;\n }\n\n next(): Promise<IteratorResult<ChatChunk>> {\n return this.output.next();\n }\n\n close() {\n this.output.close();\n this.queue.close();\n this.closed = true;\n }\n\n [Symbol.asyncIterator](): LLMStream {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,yBAA6B;AAE7B,mBAAmC;AA2B5B,IAAK,WAAL,kBAAKA,cAAL;AACL,EAAAA,oBAAA;AADU,SAAAA;AAAA,GAAA;AAQL,MAAe,YAAa,gCAAsD;AAiBzF;AAEO,MAAe,UAAsD;AAAA,EAChE,SAAS,IAAI,gCAA8B;AAAA,EAC3C,QAAQ,IAAI,gCAA8B;AAAA,EAC1C,SAAS;AAAA,EACT,iBAAqC,CAAC;AAAA,EAGhD;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,KAAU,SAAsB,QAA0B;AACpE,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAgB,iBAAiB;AAC/B,UAAM,YAAY,QAAQ,OAAO,OAAO;AACxC,QAAI,OAAe,OAAO,EAAE;AAC5B,QAAI,YAAY;AAChB,QAAI;AAEJ,qBAAiB,MAAM,KAAK,OAAO;AACjC,WAAK,OAAO,IAAI,EAAE;AAClB,kBAAY,GAAG;AACf,UAAI,SAAS,OAAO,EAAE,GAAG;AACvB,eAAO,QAAQ,OAAO,OAAO,IAAI;AAAA,MACnC;AACA,UAAI,GAAG,OAAO;AACZ,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF;AACA,SAAK,OAAO,MAAM;AAElB,UAAM,WAAW,QAAQ,OAAO,OAAO,IAAI;AAC3C,UAAM,UAAsB;AAAA,MAC1B,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA,MAAM,SAAS,OAAO,EAAE,IAAI,KAAK,KAAK,MAAM,OAAO,OAAO,OAAO,GAAO,CAAC,CAAC;AAAA,MAC1E,UAAU,KAAK,MAAM,OAAO,WAAW,OAAO,GAAO,CAAC,CAAC;AAAA,MACvD,WAAW;AAAA;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,mBAAkB,+BAAO,qBAAoB;AAAA,MAC7C,eAAc,+BAAO,iBAAgB;AAAA,MACrC,cAAa,+BAAO,gBAAe;AAAA,MACnC,mBACG,+BAAO,qBAAoB,KAAK,KAAK,MAAM,OAAO,WAAW,OAAO,GAAU,CAAC,CAAC;AAAA,IACrF;AACA,SAAK,KAAK,KAAK,2BAA4B,OAAO;AAAA,EACpD;AAAA;AAAA,EAGA,IAAI,gBAAoC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAsC;AACxC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,UAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,mBAAuC;AACrC,SAAK,eAAe;AAAA,MAClB,CAAC,MACE,EAAE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE;AAAA,QACjC,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,EAAE,YAAY,OAAO;AAAA,QAC9D,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,EAAE,YAAY,MAAM;AAAA,MAC9D;AAAA,IACJ;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAA2C;AACzC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,QAAQ;AACN,SAAK,OAAO,MAAM;AAClB,SAAK,MAAM,MAAM;AACjB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAe;AAClC,WAAO;AAAA,EACT;AACF;","names":["LLMEvent"]}
|
|
1
|
+
{"version":3,"sources":["../../src/llm/llm.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport { delay } from '@std/async';\nimport { EventEmitter } from 'node:events';\nimport { APIConnectionError, APIError } from '../_exceptions.js';\nimport { log } from '../log.js';\nimport type { LLMMetrics } from '../metrics/base.js';\nimport type { APIConnectOptions } from '../types.js';\nimport { AsyncIterableQueue, startSoon, toError } from '../utils.js';\nimport { type ChatContext, type ChatRole, type FunctionCall } from './chat_context.js';\nimport type { ToolChoice, ToolContext } from './tool_context.js';\n\nexport interface ChoiceDelta {\n role: ChatRole;\n content?: string;\n toolCalls?: FunctionCall[];\n}\n\nexport interface CompletionUsage {\n completionTokens: number;\n promptTokens: number;\n promptCachedTokens: number;\n totalTokens: number;\n}\n\nexport interface ChatChunk {\n id: string;\n delta?: ChoiceDelta;\n usage?: CompletionUsage;\n}\n\nexport interface LLMError {\n type: 'llm_error';\n timestamp: number;\n label: string;\n error: Error;\n recoverable: boolean;\n}\n\nexport type LLMCallbacks = {\n ['metrics_collected']: (metrics: LLMMetrics) => void;\n ['error']: (error: LLMError) => void;\n};\n\nexport abstract class LLM extends (EventEmitter as new () => TypedEmitter<LLMCallbacks>) {\n constructor() {\n super();\n }\n\n abstract label(): string;\n\n /**\n * Get the model name/identifier for this LLM instance.\n *\n * @returns The model name if available, \"unknown\" otherwise.\n *\n * @remarks\n * Plugins should override this property to provide their model information.\n */\n get model(): string {\n return 'unknown';\n }\n\n /**\n * Returns a {@link LLMStream} that can be used to push text and receive LLM responses.\n */\n abstract chat({\n chatCtx,\n toolCtx,\n connOptions,\n parallelToolCalls,\n toolChoice,\n extraKwargs,\n }: {\n chatCtx: ChatContext;\n toolCtx?: ToolContext;\n connOptions?: APIConnectOptions;\n parallelToolCalls?: boolean;\n toolChoice?: ToolChoice;\n extraKwargs?: Record<string, any>;\n }): LLMStream;\n\n /**\n * Pre-warm connection to the LLM service\n */\n prewarm(): void {\n // Default implementation - subclasses can override\n }\n\n async aclose(): Promise<void> {\n // Default implementation - subclasses can override\n }\n}\n\nexport abstract class LLMStream implements AsyncIterableIterator<ChatChunk> {\n protected output = new AsyncIterableQueue<ChatChunk>();\n protected queue = new AsyncIterableQueue<ChatChunk>();\n protected closed = false;\n protected abortController = new AbortController();\n protected _connOptions: APIConnectOptions;\n protected logger = log();\n\n #llm: LLM;\n #chatCtx: ChatContext;\n #toolCtx?: ToolContext;\n\n constructor(\n llm: LLM,\n {\n chatCtx,\n toolCtx,\n connOptions,\n }: {\n chatCtx: ChatContext;\n toolCtx?: ToolContext;\n connOptions: APIConnectOptions;\n },\n ) {\n this.#llm = llm;\n this.#chatCtx = chatCtx;\n this.#toolCtx = toolCtx;\n this._connOptions = connOptions;\n this.monitorMetrics();\n this.abortController.signal.addEventListener('abort', () => {\n // TODO (AJS-37) clean this up when we refactor with streams\n this.output.close();\n this.closed = true;\n });\n\n // this is a hack to immitate asyncio.create_task so that mainTask\n // is run **after** the constructor has finished. Otherwise we get\n // runtime error when trying to access class variables in the\n // `run` method.\n startSoon(() => this.mainTask().then(() => this.queue.close()));\n }\n\n private async mainTask() {\n for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {\n try {\n return await this.run();\n } catch (error) {\n if (error instanceof APIError) {\n const retryInterval = this._connOptions._intervalForRetry(i);\n\n if (this._connOptions.maxRetry === 0 || !error.retryable) {\n this.emitError({ error, recoverable: false });\n throw error;\n } else if (i === this._connOptions.maxRetry) {\n this.emitError({ error, recoverable: false });\n throw new APIConnectionError({\n message: `failed to generate LLM completion after ${this._connOptions.maxRetry + 1} attempts`,\n options: { retryable: false },\n });\n } else {\n this.emitError({ error, recoverable: true });\n this.logger.warn(\n { llm: this.#llm.label(), attempt: i + 1, error },\n `failed to generate LLM completion, retrying in ${retryInterval}s`,\n );\n }\n\n if (retryInterval > 0) {\n await delay(retryInterval);\n }\n } else {\n this.emitError({ error: toError(error), recoverable: false });\n throw error;\n }\n }\n }\n }\n\n private emitError({ error, recoverable }: { error: Error; recoverable: boolean }) {\n this.#llm.emit('error', {\n type: 'llm_error',\n timestamp: Date.now(),\n label: this.#llm.label(),\n error,\n recoverable,\n });\n }\n\n protected async monitorMetrics() {\n const startTime = process.hrtime.bigint();\n let ttft: bigint = BigInt(-1);\n let requestId = '';\n let usage: CompletionUsage | undefined;\n\n for await (const ev of this.queue) {\n if (this.abortController.signal.aborted) {\n break;\n }\n this.output.put(ev);\n requestId = ev.id;\n if (ttft === BigInt(-1)) {\n ttft = process.hrtime.bigint() - startTime;\n }\n if (ev.usage) {\n usage = ev.usage;\n }\n }\n this.output.close();\n\n const duration = process.hrtime.bigint() - startTime;\n const metrics: LLMMetrics = {\n type: 'llm_metrics',\n timestamp: Date.now(),\n requestId,\n ttft: ttft === BigInt(-1) ? -1 : Math.trunc(Number(ttft / BigInt(1000000))),\n duration: Math.trunc(Number(duration / BigInt(1000000))),\n cancelled: this.abortController.signal.aborted,\n label: this.#llm.label(),\n completionTokens: usage?.completionTokens || 0,\n promptTokens: usage?.promptTokens || 0,\n promptCachedTokens: usage?.promptCachedTokens || 0,\n totalTokens: usage?.totalTokens || 0,\n tokensPerSecond:\n (usage?.completionTokens || 0) / Math.trunc(Number(duration / BigInt(1000000000))),\n };\n this.#llm.emit('metrics_collected', metrics);\n }\n\n protected abstract run(): Promise<void>;\n\n /** The function context of this stream. */\n get toolCtx(): ToolContext | undefined {\n return this.#toolCtx;\n }\n\n /** The initial chat context of this stream. */\n get chatCtx(): ChatContext {\n return this.#chatCtx;\n }\n\n /** The connection options for this stream. */\n get connOptions(): APIConnectOptions {\n return this._connOptions;\n }\n\n next(): Promise<IteratorResult<ChatChunk>> {\n return this.output.next();\n }\n\n close() {\n this.abortController.abort();\n }\n\n [Symbol.asyncIterator](): LLMStream {\n return this;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/llm/llm.d.cts
CHANGED
|
@@ -1,63 +1,89 @@
|
|
|
1
1
|
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
|
|
2
2
|
import type { LLMMetrics } from '../metrics/base.js';
|
|
3
|
+
import type { APIConnectOptions } from '../types.js';
|
|
3
4
|
import { AsyncIterableQueue } from '../utils.js';
|
|
4
|
-
import type
|
|
5
|
-
import type {
|
|
5
|
+
import { type ChatContext, type ChatRole, type FunctionCall } from './chat_context.js';
|
|
6
|
+
import type { ToolChoice, ToolContext } from './tool_context.js';
|
|
6
7
|
export interface ChoiceDelta {
|
|
7
8
|
role: ChatRole;
|
|
8
9
|
content?: string;
|
|
9
|
-
toolCalls?:
|
|
10
|
+
toolCalls?: FunctionCall[];
|
|
10
11
|
}
|
|
11
12
|
export interface CompletionUsage {
|
|
12
13
|
completionTokens: number;
|
|
13
14
|
promptTokens: number;
|
|
15
|
+
promptCachedTokens: number;
|
|
14
16
|
totalTokens: number;
|
|
15
17
|
}
|
|
16
|
-
export interface Choice {
|
|
17
|
-
delta: ChoiceDelta;
|
|
18
|
-
index: number;
|
|
19
|
-
}
|
|
20
18
|
export interface ChatChunk {
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
id: string;
|
|
20
|
+
delta?: ChoiceDelta;
|
|
23
21
|
usage?: CompletionUsage;
|
|
24
22
|
}
|
|
25
|
-
export
|
|
26
|
-
|
|
23
|
+
export interface LLMError {
|
|
24
|
+
type: 'llm_error';
|
|
25
|
+
timestamp: number;
|
|
26
|
+
label: string;
|
|
27
|
+
error: Error;
|
|
28
|
+
recoverable: boolean;
|
|
27
29
|
}
|
|
28
30
|
export type LLMCallbacks = {
|
|
29
|
-
[
|
|
31
|
+
['metrics_collected']: (metrics: LLMMetrics) => void;
|
|
32
|
+
['error']: (error: LLMError) => void;
|
|
30
33
|
};
|
|
31
34
|
declare const LLM_base: new () => TypedEmitter<LLMCallbacks>;
|
|
32
35
|
export declare abstract class LLM extends LLM_base {
|
|
36
|
+
constructor();
|
|
37
|
+
abstract label(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get the model name/identifier for this LLM instance.
|
|
40
|
+
*
|
|
41
|
+
* @returns The model name if available, "unknown" otherwise.
|
|
42
|
+
*
|
|
43
|
+
* @remarks
|
|
44
|
+
* Plugins should override this property to provide their model information.
|
|
45
|
+
*/
|
|
46
|
+
get model(): string;
|
|
33
47
|
/**
|
|
34
48
|
* Returns a {@link LLMStream} that can be used to push text and receive LLM responses.
|
|
35
49
|
*/
|
|
36
|
-
abstract chat({ chatCtx,
|
|
50
|
+
abstract chat({ chatCtx, toolCtx, connOptions, parallelToolCalls, toolChoice, extraKwargs, }: {
|
|
37
51
|
chatCtx: ChatContext;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
n?: number;
|
|
52
|
+
toolCtx?: ToolContext;
|
|
53
|
+
connOptions?: APIConnectOptions;
|
|
41
54
|
parallelToolCalls?: boolean;
|
|
55
|
+
toolChoice?: ToolChoice;
|
|
56
|
+
extraKwargs?: Record<string, any>;
|
|
42
57
|
}): LLMStream;
|
|
58
|
+
/**
|
|
59
|
+
* Pre-warm connection to the LLM service
|
|
60
|
+
*/
|
|
61
|
+
prewarm(): void;
|
|
62
|
+
aclose(): Promise<void>;
|
|
43
63
|
}
|
|
44
64
|
export declare abstract class LLMStream implements AsyncIterableIterator<ChatChunk> {
|
|
45
65
|
#private;
|
|
46
66
|
protected output: AsyncIterableQueue<ChatChunk>;
|
|
47
67
|
protected queue: AsyncIterableQueue<ChatChunk>;
|
|
48
68
|
protected closed: boolean;
|
|
49
|
-
protected
|
|
50
|
-
|
|
51
|
-
|
|
69
|
+
protected abortController: AbortController;
|
|
70
|
+
protected _connOptions: APIConnectOptions;
|
|
71
|
+
protected logger: import("pino").Logger;
|
|
72
|
+
constructor(llm: LLM, { chatCtx, toolCtx, connOptions, }: {
|
|
73
|
+
chatCtx: ChatContext;
|
|
74
|
+
toolCtx?: ToolContext;
|
|
75
|
+
connOptions: APIConnectOptions;
|
|
76
|
+
});
|
|
77
|
+
private mainTask;
|
|
78
|
+
private emitError;
|
|
52
79
|
protected monitorMetrics(): Promise<void>;
|
|
53
|
-
|
|
54
|
-
get functionCalls(): FunctionCallInfo[];
|
|
80
|
+
protected abstract run(): Promise<void>;
|
|
55
81
|
/** The function context of this stream. */
|
|
56
|
-
get
|
|
82
|
+
get toolCtx(): ToolContext | undefined;
|
|
57
83
|
/** The initial chat context of this stream. */
|
|
58
84
|
get chatCtx(): ChatContext;
|
|
59
|
-
/**
|
|
60
|
-
|
|
85
|
+
/** The connection options for this stream. */
|
|
86
|
+
get connOptions(): APIConnectOptions;
|
|
61
87
|
next(): Promise<IteratorResult<ChatChunk>>;
|
|
62
88
|
close(): void;
|
|
63
89
|
[Symbol.asyncIterator](): LLMStream;
|
package/dist/llm/llm.d.ts
CHANGED
|
@@ -1,63 +1,89 @@
|
|
|
1
1
|
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
|
|
2
2
|
import type { LLMMetrics } from '../metrics/base.js';
|
|
3
|
+
import type { APIConnectOptions } from '../types.js';
|
|
3
4
|
import { AsyncIterableQueue } from '../utils.js';
|
|
4
|
-
import type
|
|
5
|
-
import type {
|
|
5
|
+
import { type ChatContext, type ChatRole, type FunctionCall } from './chat_context.js';
|
|
6
|
+
import type { ToolChoice, ToolContext } from './tool_context.js';
|
|
6
7
|
export interface ChoiceDelta {
|
|
7
8
|
role: ChatRole;
|
|
8
9
|
content?: string;
|
|
9
|
-
toolCalls?:
|
|
10
|
+
toolCalls?: FunctionCall[];
|
|
10
11
|
}
|
|
11
12
|
export interface CompletionUsage {
|
|
12
13
|
completionTokens: number;
|
|
13
14
|
promptTokens: number;
|
|
15
|
+
promptCachedTokens: number;
|
|
14
16
|
totalTokens: number;
|
|
15
17
|
}
|
|
16
|
-
export interface Choice {
|
|
17
|
-
delta: ChoiceDelta;
|
|
18
|
-
index: number;
|
|
19
|
-
}
|
|
20
18
|
export interface ChatChunk {
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
id: string;
|
|
20
|
+
delta?: ChoiceDelta;
|
|
23
21
|
usage?: CompletionUsage;
|
|
24
22
|
}
|
|
25
|
-
export
|
|
26
|
-
|
|
23
|
+
export interface LLMError {
|
|
24
|
+
type: 'llm_error';
|
|
25
|
+
timestamp: number;
|
|
26
|
+
label: string;
|
|
27
|
+
error: Error;
|
|
28
|
+
recoverable: boolean;
|
|
27
29
|
}
|
|
28
30
|
export type LLMCallbacks = {
|
|
29
|
-
[
|
|
31
|
+
['metrics_collected']: (metrics: LLMMetrics) => void;
|
|
32
|
+
['error']: (error: LLMError) => void;
|
|
30
33
|
};
|
|
31
34
|
declare const LLM_base: new () => TypedEmitter<LLMCallbacks>;
|
|
32
35
|
export declare abstract class LLM extends LLM_base {
|
|
36
|
+
constructor();
|
|
37
|
+
abstract label(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get the model name/identifier for this LLM instance.
|
|
40
|
+
*
|
|
41
|
+
* @returns The model name if available, "unknown" otherwise.
|
|
42
|
+
*
|
|
43
|
+
* @remarks
|
|
44
|
+
* Plugins should override this property to provide their model information.
|
|
45
|
+
*/
|
|
46
|
+
get model(): string;
|
|
33
47
|
/**
|
|
34
48
|
* Returns a {@link LLMStream} that can be used to push text and receive LLM responses.
|
|
35
49
|
*/
|
|
36
|
-
abstract chat({ chatCtx,
|
|
50
|
+
abstract chat({ chatCtx, toolCtx, connOptions, parallelToolCalls, toolChoice, extraKwargs, }: {
|
|
37
51
|
chatCtx: ChatContext;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
n?: number;
|
|
52
|
+
toolCtx?: ToolContext;
|
|
53
|
+
connOptions?: APIConnectOptions;
|
|
41
54
|
parallelToolCalls?: boolean;
|
|
55
|
+
toolChoice?: ToolChoice;
|
|
56
|
+
extraKwargs?: Record<string, any>;
|
|
42
57
|
}): LLMStream;
|
|
58
|
+
/**
|
|
59
|
+
* Pre-warm connection to the LLM service
|
|
60
|
+
*/
|
|
61
|
+
prewarm(): void;
|
|
62
|
+
aclose(): Promise<void>;
|
|
43
63
|
}
|
|
44
64
|
export declare abstract class LLMStream implements AsyncIterableIterator<ChatChunk> {
|
|
45
65
|
#private;
|
|
46
66
|
protected output: AsyncIterableQueue<ChatChunk>;
|
|
47
67
|
protected queue: AsyncIterableQueue<ChatChunk>;
|
|
48
68
|
protected closed: boolean;
|
|
49
|
-
protected
|
|
50
|
-
|
|
51
|
-
|
|
69
|
+
protected abortController: AbortController;
|
|
70
|
+
protected _connOptions: APIConnectOptions;
|
|
71
|
+
protected logger: import("pino").Logger;
|
|
72
|
+
constructor(llm: LLM, { chatCtx, toolCtx, connOptions, }: {
|
|
73
|
+
chatCtx: ChatContext;
|
|
74
|
+
toolCtx?: ToolContext;
|
|
75
|
+
connOptions: APIConnectOptions;
|
|
76
|
+
});
|
|
77
|
+
private mainTask;
|
|
78
|
+
private emitError;
|
|
52
79
|
protected monitorMetrics(): Promise<void>;
|
|
53
|
-
|
|
54
|
-
get functionCalls(): FunctionCallInfo[];
|
|
80
|
+
protected abstract run(): Promise<void>;
|
|
55
81
|
/** The function context of this stream. */
|
|
56
|
-
get
|
|
82
|
+
get toolCtx(): ToolContext | undefined;
|
|
57
83
|
/** The initial chat context of this stream. */
|
|
58
84
|
get chatCtx(): ChatContext;
|
|
59
|
-
/**
|
|
60
|
-
|
|
85
|
+
/** The connection options for this stream. */
|
|
86
|
+
get connOptions(): APIConnectOptions;
|
|
61
87
|
next(): Promise<IteratorResult<ChatChunk>>;
|
|
62
88
|
close(): void;
|
|
63
89
|
[Symbol.asyncIterator](): LLMStream;
|
package/dist/llm/llm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/llm/llm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/llm/llm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKhF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAsB,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACrD,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CACtC,CAAC;kCAE2D,aAAa,YAAY,CAAC;AAAvF,8BAAsB,GAAI,SAAQ,QAAsD;;IAKtF,QAAQ,CAAC,KAAK,IAAI,MAAM;IAExB;;;;;;;OAOG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EACZ,OAAO,EACP,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,WAAW,GACZ,EAAE;QACD,OAAO,EAAE,WAAW,CAAC;QACrB,OAAO,CAAC,EAAE,WAAW,CAAC;QACtB,WAAW,CAAC,EAAE,iBAAiB,CAAC;QAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACnC,GAAG,SAAS;IAEb;;OAEG;IACH,OAAO,IAAI,IAAI;IAIT,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,8BAAsB,SAAU,YAAW,qBAAqB,CAAC,SAAS,CAAC;;IACzE,SAAS,CAAC,MAAM,gCAAuC;IACvD,SAAS,CAAC,KAAK,gCAAuC;IACtD,SAAS,CAAC,MAAM,UAAS;IACzB,SAAS,CAAC,eAAe,kBAAyB;IAClD,SAAS,CAAC,YAAY,EAAE,iBAAiB,CAAC;IAC1C,SAAS,CAAC,MAAM,wBAAS;gBAOvB,GAAG,EAAE,GAAG,EACR,EACE,OAAO,EACP,OAAO,EACP,WAAW,GACZ,EAAE;QACD,OAAO,EAAE,WAAW,CAAC;QACrB,OAAO,CAAC,EAAE,WAAW,CAAC;QACtB,WAAW,EAAE,iBAAiB,CAAC;KAChC;YAoBW,QAAQ;IAoCtB,OAAO,CAAC,SAAS;cAUD,cAAc;IAwC9B,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAEvC,2CAA2C;IAC3C,IAAI,OAAO,IAAI,WAAW,GAAG,SAAS,CAErC;IAED,+CAA+C;IAC/C,IAAI,OAAO,IAAI,WAAW,CAEzB;IAED,8CAA8C;IAC9C,IAAI,WAAW,IAAI,iBAAiB,CAEnC;IAED,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAI1C,KAAK;IAIL,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,SAAS;CAGpC"}
|
package/dist/llm/llm.js
CHANGED
|
@@ -1,24 +1,99 @@
|
|
|
1
|
+
import { delay } from "@std/async";
|
|
1
2
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
})(LLMEvent || {});
|
|
3
|
+
import { APIConnectionError, APIError } from "../_exceptions.js";
|
|
4
|
+
import { log } from "../log.js";
|
|
5
|
+
import { AsyncIterableQueue, startSoon, toError } from "../utils.js";
|
|
6
|
+
import {} from "./chat_context.js";
|
|
7
7
|
class LLM extends EventEmitter {
|
|
8
|
+
constructor() {
|
|
9
|
+
super();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get the model name/identifier for this LLM instance.
|
|
13
|
+
*
|
|
14
|
+
* @returns The model name if available, "unknown" otherwise.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* Plugins should override this property to provide their model information.
|
|
18
|
+
*/
|
|
19
|
+
get model() {
|
|
20
|
+
return "unknown";
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Pre-warm connection to the LLM service
|
|
24
|
+
*/
|
|
25
|
+
prewarm() {
|
|
26
|
+
}
|
|
27
|
+
async aclose() {
|
|
28
|
+
}
|
|
8
29
|
}
|
|
9
30
|
class LLMStream {
|
|
10
31
|
output = new AsyncIterableQueue();
|
|
11
32
|
queue = new AsyncIterableQueue();
|
|
12
33
|
closed = false;
|
|
13
|
-
|
|
34
|
+
abortController = new AbortController();
|
|
35
|
+
_connOptions;
|
|
36
|
+
logger = log();
|
|
14
37
|
#llm;
|
|
15
38
|
#chatCtx;
|
|
16
|
-
#
|
|
17
|
-
constructor(llm,
|
|
39
|
+
#toolCtx;
|
|
40
|
+
constructor(llm, {
|
|
41
|
+
chatCtx,
|
|
42
|
+
toolCtx,
|
|
43
|
+
connOptions
|
|
44
|
+
}) {
|
|
18
45
|
this.#llm = llm;
|
|
19
46
|
this.#chatCtx = chatCtx;
|
|
20
|
-
this.#
|
|
47
|
+
this.#toolCtx = toolCtx;
|
|
48
|
+
this._connOptions = connOptions;
|
|
21
49
|
this.monitorMetrics();
|
|
50
|
+
this.abortController.signal.addEventListener("abort", () => {
|
|
51
|
+
this.output.close();
|
|
52
|
+
this.closed = true;
|
|
53
|
+
});
|
|
54
|
+
startSoon(() => this.mainTask().then(() => this.queue.close()));
|
|
55
|
+
}
|
|
56
|
+
async mainTask() {
|
|
57
|
+
for (let i = 0; i < this._connOptions.maxRetry + 1; i++) {
|
|
58
|
+
try {
|
|
59
|
+
return await this.run();
|
|
60
|
+
} catch (error) {
|
|
61
|
+
if (error instanceof APIError) {
|
|
62
|
+
const retryInterval = this._connOptions._intervalForRetry(i);
|
|
63
|
+
if (this._connOptions.maxRetry === 0 || !error.retryable) {
|
|
64
|
+
this.emitError({ error, recoverable: false });
|
|
65
|
+
throw error;
|
|
66
|
+
} else if (i === this._connOptions.maxRetry) {
|
|
67
|
+
this.emitError({ error, recoverable: false });
|
|
68
|
+
throw new APIConnectionError({
|
|
69
|
+
message: `failed to generate LLM completion after ${this._connOptions.maxRetry + 1} attempts`,
|
|
70
|
+
options: { retryable: false }
|
|
71
|
+
});
|
|
72
|
+
} else {
|
|
73
|
+
this.emitError({ error, recoverable: true });
|
|
74
|
+
this.logger.warn(
|
|
75
|
+
{ llm: this.#llm.label(), attempt: i + 1, error },
|
|
76
|
+
`failed to generate LLM completion, retrying in ${retryInterval}s`
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (retryInterval > 0) {
|
|
80
|
+
await delay(retryInterval);
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
this.emitError({ error: toError(error), recoverable: false });
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
emitError({ error, recoverable }) {
|
|
90
|
+
this.#llm.emit("error", {
|
|
91
|
+
type: "llm_error",
|
|
92
|
+
timestamp: Date.now(),
|
|
93
|
+
label: this.#llm.label(),
|
|
94
|
+
error,
|
|
95
|
+
recoverable
|
|
96
|
+
});
|
|
22
97
|
}
|
|
23
98
|
async monitorMetrics() {
|
|
24
99
|
const startTime = process.hrtime.bigint();
|
|
@@ -26,8 +101,11 @@ class LLMStream {
|
|
|
26
101
|
let requestId = "";
|
|
27
102
|
let usage;
|
|
28
103
|
for await (const ev of this.queue) {
|
|
104
|
+
if (this.abortController.signal.aborted) {
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
29
107
|
this.output.put(ev);
|
|
30
|
-
requestId = ev.
|
|
108
|
+
requestId = ev.id;
|
|
31
109
|
if (ttft === BigInt(-1)) {
|
|
32
110
|
ttft = process.hrtime.bigint() - startTime;
|
|
33
111
|
}
|
|
@@ -38,49 +116,38 @@ class LLMStream {
|
|
|
38
116
|
this.output.close();
|
|
39
117
|
const duration = process.hrtime.bigint() - startTime;
|
|
40
118
|
const metrics = {
|
|
119
|
+
type: "llm_metrics",
|
|
41
120
|
timestamp: Date.now(),
|
|
42
121
|
requestId,
|
|
43
122
|
ttft: ttft === BigInt(-1) ? -1 : Math.trunc(Number(ttft / BigInt(1e6))),
|
|
44
123
|
duration: Math.trunc(Number(duration / BigInt(1e6))),
|
|
45
|
-
cancelled:
|
|
46
|
-
|
|
47
|
-
label: this.label,
|
|
124
|
+
cancelled: this.abortController.signal.aborted,
|
|
125
|
+
label: this.#llm.label(),
|
|
48
126
|
completionTokens: (usage == null ? void 0 : usage.completionTokens) || 0,
|
|
49
127
|
promptTokens: (usage == null ? void 0 : usage.promptTokens) || 0,
|
|
128
|
+
promptCachedTokens: (usage == null ? void 0 : usage.promptCachedTokens) || 0,
|
|
50
129
|
totalTokens: (usage == null ? void 0 : usage.totalTokens) || 0,
|
|
51
130
|
tokensPerSecond: ((usage == null ? void 0 : usage.completionTokens) || 0) / Math.trunc(Number(duration / BigInt(1e9)))
|
|
52
131
|
};
|
|
53
|
-
this.#llm.emit(
|
|
54
|
-
}
|
|
55
|
-
/** List of called functions from this stream. */
|
|
56
|
-
get functionCalls() {
|
|
57
|
-
return this._functionCalls;
|
|
132
|
+
this.#llm.emit("metrics_collected", metrics);
|
|
58
133
|
}
|
|
59
134
|
/** The function context of this stream. */
|
|
60
|
-
get
|
|
61
|
-
return this.#
|
|
135
|
+
get toolCtx() {
|
|
136
|
+
return this.#toolCtx;
|
|
62
137
|
}
|
|
63
138
|
/** The initial chat context of this stream. */
|
|
64
139
|
get chatCtx() {
|
|
65
140
|
return this.#chatCtx;
|
|
66
141
|
}
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
this.
|
|
70
|
-
(f) => f.task = f.func.execute(f.params).then(
|
|
71
|
-
(result) => ({ name: f.name, toolCallId: f.toolCallId, result }),
|
|
72
|
-
(error) => ({ name: f.name, toolCallId: f.toolCallId, error })
|
|
73
|
-
)
|
|
74
|
-
);
|
|
75
|
-
return this._functionCalls;
|
|
142
|
+
/** The connection options for this stream. */
|
|
143
|
+
get connOptions() {
|
|
144
|
+
return this._connOptions;
|
|
76
145
|
}
|
|
77
146
|
next() {
|
|
78
147
|
return this.output.next();
|
|
79
148
|
}
|
|
80
149
|
close() {
|
|
81
|
-
this.
|
|
82
|
-
this.queue.close();
|
|
83
|
-
this.closed = true;
|
|
150
|
+
this.abortController.abort();
|
|
84
151
|
}
|
|
85
152
|
[Symbol.asyncIterator]() {
|
|
86
153
|
return this;
|
|
@@ -88,7 +155,6 @@ class LLMStream {
|
|
|
88
155
|
}
|
|
89
156
|
export {
|
|
90
157
|
LLM,
|
|
91
|
-
LLMEvent,
|
|
92
158
|
LLMStream
|
|
93
159
|
};
|
|
94
160
|
//# sourceMappingURL=llm.js.map
|