@livekit/agents 0.0.0-20260120144724
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/LICENSE +201 -0
- package/README.md +17 -0
- 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 +170 -0
- package/dist/audio.cjs.map +1 -0
- package/dist/audio.d.cts +46 -0
- package/dist/audio.d.ts +46 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +133 -0
- package/dist/audio.js.map +1 -0
- package/dist/cli.cjs +171 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +14 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +145 -0
- package/dist/cli.js.map +1 -0
- package/dist/connection_pool.cjs +242 -0
- package/dist/connection_pool.cjs.map +1 -0
- package/dist/connection_pool.d.cts +123 -0
- package/dist/connection_pool.d.ts +123 -0
- package/dist/connection_pool.d.ts.map +1 -0
- package/dist/connection_pool.js +218 -0
- package/dist/connection_pool.js.map +1 -0
- package/dist/connection_pool.test.cjs +256 -0
- package/dist/connection_pool.test.cjs.map +1 -0
- package/dist/connection_pool.test.js +255 -0
- package/dist/connection_pool.test.js.map +1 -0
- package/dist/constants.cjs +44 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.d.cts +7 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -0
- package/dist/generator.cjs +36 -0
- package/dist/generator.cjs.map +1 -0
- package/dist/generator.d.cts +23 -0
- package/dist/generator.d.ts +23 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +11 -0
- package/dist/generator.js.map +1 -0
- package/dist/http_server.cjs +75 -0
- package/dist/http_server.cjs.map +1 -0
- package/dist/http_server.d.cts +20 -0
- package/dist/http_server.d.ts +20 -0
- package/dist/http_server.d.ts.map +1 -0
- package/dist/http_server.js +51 -0
- package/dist/http_server.js.map +1 -0
- package/dist/index.cjs +100 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/api_protos.cjs +104 -0
- package/dist/inference/api_protos.cjs.map +1 -0
- package/dist/inference/api_protos.d.cts +222 -0
- package/dist/inference/api_protos.d.ts +222 -0
- package/dist/inference/api_protos.d.ts.map +1 -0
- package/dist/inference/api_protos.js +70 -0
- package/dist/inference/api_protos.js.map +1 -0
- package/dist/inference/index.cjs +56 -0
- package/dist/inference/index.cjs.map +1 -0
- package/dist/inference/index.d.cts +8 -0
- package/dist/inference/index.d.ts +8 -0
- package/dist/inference/index.d.ts.map +1 -0
- package/dist/inference/index.js +23 -0
- package/dist/inference/index.js.map +1 -0
- package/dist/inference/interruption/AdaptiveInterruptionDetector.cjs +152 -0
- package/dist/inference/interruption/AdaptiveInterruptionDetector.cjs.map +1 -0
- package/dist/inference/interruption/AdaptiveInterruptionDetector.d.cts +50 -0
- package/dist/inference/interruption/AdaptiveInterruptionDetector.d.ts +50 -0
- package/dist/inference/interruption/AdaptiveInterruptionDetector.d.ts.map +1 -0
- package/dist/inference/interruption/AdaptiveInterruptionDetector.js +125 -0
- package/dist/inference/interruption/AdaptiveInterruptionDetector.js.map +1 -0
- package/dist/inference/interruption/InterruptionStream.cjs +310 -0
- package/dist/inference/interruption/InterruptionStream.cjs.map +1 -0
- package/dist/inference/interruption/InterruptionStream.d.cts +57 -0
- package/dist/inference/interruption/InterruptionStream.d.ts +57 -0
- package/dist/inference/interruption/InterruptionStream.d.ts.map +1 -0
- package/dist/inference/interruption/InterruptionStream.js +288 -0
- package/dist/inference/interruption/InterruptionStream.js.map +1 -0
- package/dist/inference/interruption/defaults.cjs +76 -0
- package/dist/inference/interruption/defaults.cjs.map +1 -0
- package/dist/inference/interruption/defaults.d.cts +14 -0
- package/dist/inference/interruption/defaults.d.ts +14 -0
- package/dist/inference/interruption/defaults.d.ts.map +1 -0
- package/dist/inference/interruption/defaults.js +42 -0
- package/dist/inference/interruption/defaults.js.map +1 -0
- package/dist/inference/interruption/errors.cjs +2 -0
- package/dist/inference/interruption/errors.cjs.map +1 -0
- package/dist/inference/interruption/errors.d.cts +2 -0
- package/dist/inference/interruption/errors.d.ts +2 -0
- package/dist/inference/interruption/errors.d.ts.map +1 -0
- package/dist/inference/interruption/errors.js +1 -0
- package/dist/inference/interruption/errors.js.map +1 -0
- package/dist/inference/interruption/http_transport.cjs +57 -0
- package/dist/inference/interruption/http_transport.cjs.map +1 -0
- package/dist/inference/interruption/http_transport.d.cts +23 -0
- package/dist/inference/interruption/http_transport.d.ts +23 -0
- package/dist/inference/interruption/http_transport.d.ts.map +1 -0
- package/dist/inference/interruption/http_transport.js +33 -0
- package/dist/inference/interruption/http_transport.js.map +1 -0
- package/dist/inference/interruption/index.cjs +34 -0
- package/dist/inference/interruption/index.cjs.map +1 -0
- package/dist/inference/interruption/index.d.cts +5 -0
- package/dist/inference/interruption/index.d.ts +5 -0
- package/dist/inference/interruption/index.d.ts.map +1 -0
- package/dist/inference/interruption/index.js +7 -0
- package/dist/inference/interruption/index.js.map +1 -0
- package/dist/inference/interruption/interruption.cjs +85 -0
- package/dist/inference/interruption/interruption.cjs.map +1 -0
- package/dist/inference/interruption/interruption.d.cts +48 -0
- package/dist/inference/interruption/interruption.d.ts +48 -0
- package/dist/inference/interruption/interruption.d.ts.map +1 -0
- package/dist/inference/interruption/interruption.js +59 -0
- package/dist/inference/interruption/interruption.js.map +1 -0
- package/dist/inference/llm.cjs +347 -0
- package/dist/inference/llm.cjs.map +1 -0
- package/dist/inference/llm.d.cts +114 -0
- package/dist/inference/llm.d.ts +114 -0
- package/dist/inference/llm.d.ts.map +1 -0
- package/dist/inference/llm.js +318 -0
- package/dist/inference/llm.js.map +1 -0
- package/dist/inference/stt.cjs +371 -0
- package/dist/inference/stt.cjs.map +1 -0
- package/dist/inference/stt.d.cts +91 -0
- package/dist/inference/stt.d.ts +91 -0
- package/dist/inference/stt.d.ts.map +1 -0
- package/dist/inference/stt.js +350 -0
- package/dist/inference/stt.js.map +1 -0
- package/dist/inference/tts.cjs +439 -0
- package/dist/inference/tts.cjs.map +1 -0
- package/dist/inference/tts.d.cts +80 -0
- package/dist/inference/tts.d.ts +80 -0
- package/dist/inference/tts.d.ts.map +1 -0
- package/dist/inference/tts.js +417 -0
- package/dist/inference/tts.js.map +1 -0
- package/dist/inference/utils.cjs +89 -0
- package/dist/inference/utils.cjs.map +1 -0
- package/dist/inference/utils.d.cts +6 -0
- package/dist/inference/utils.d.ts +6 -0
- package/dist/inference/utils.d.ts.map +1 -0
- package/dist/inference/utils.js +63 -0
- package/dist/inference/utils.js.map +1 -0
- package/dist/inference/utils.test.cjs +20 -0
- package/dist/inference/utils.test.cjs.map +1 -0
- package/dist/inference/utils.test.js +19 -0
- package/dist/inference/utils.test.js.map +1 -0
- package/dist/inference_runner.cjs +37 -0
- package/dist/inference_runner.cjs.map +1 -0
- package/dist/inference_runner.d.cts +11 -0
- package/dist/inference_runner.d.ts +11 -0
- package/dist/inference_runner.d.ts.map +1 -0
- package/dist/inference_runner.js +13 -0
- package/dist/inference_runner.js.map +1 -0
- package/dist/ipc/index.cjs +23 -0
- package/dist/ipc/index.cjs.map +1 -0
- package/dist/ipc/index.d.cts +2 -0
- package/dist/ipc/index.d.ts +2 -0
- package/dist/ipc/index.d.ts.map +1 -0
- package/dist/ipc/index.js +2 -0
- package/dist/ipc/index.js.map +1 -0
- package/dist/ipc/inference_executor.cjs +17 -0
- package/dist/ipc/inference_executor.cjs.map +1 -0
- package/dist/ipc/inference_executor.d.cts +4 -0
- package/dist/ipc/inference_executor.d.ts +4 -0
- package/dist/ipc/inference_executor.d.ts.map +1 -0
- package/dist/ipc/inference_executor.js +1 -0
- package/dist/ipc/inference_executor.js.map +1 -0
- package/dist/ipc/inference_proc_executor.cjs +101 -0
- package/dist/ipc/inference_proc_executor.cjs.map +1 -0
- package/dist/ipc/inference_proc_executor.d.cts +23 -0
- package/dist/ipc/inference_proc_executor.d.ts +23 -0
- package/dist/ipc/inference_proc_executor.d.ts.map +1 -0
- package/dist/ipc/inference_proc_executor.js +75 -0
- package/dist/ipc/inference_proc_executor.js.map +1 -0
- package/dist/ipc/inference_proc_lazy_main.cjs +86 -0
- package/dist/ipc/inference_proc_lazy_main.cjs.map +1 -0
- package/dist/ipc/inference_proc_lazy_main.d.cts +2 -0
- package/dist/ipc/inference_proc_lazy_main.d.ts +2 -0
- package/dist/ipc/inference_proc_lazy_main.d.ts.map +1 -0
- package/dist/ipc/inference_proc_lazy_main.js +85 -0
- package/dist/ipc/inference_proc_lazy_main.js.map +1 -0
- package/dist/ipc/job_executor.cjs +34 -0
- package/dist/ipc/job_executor.cjs.map +1 -0
- package/dist/ipc/job_executor.d.cts +18 -0
- package/dist/ipc/job_executor.d.ts +18 -0
- package/dist/ipc/job_executor.d.ts.map +1 -0
- package/dist/ipc/job_executor.js +10 -0
- package/dist/ipc/job_executor.js.map +1 -0
- package/dist/ipc/job_proc_executor.cjs +115 -0
- package/dist/ipc/job_proc_executor.cjs.map +1 -0
- package/dist/ipc/job_proc_executor.d.cts +19 -0
- package/dist/ipc/job_proc_executor.d.ts +19 -0
- package/dist/ipc/job_proc_executor.d.ts.map +1 -0
- package/dist/ipc/job_proc_executor.js +89 -0
- package/dist/ipc/job_proc_executor.js.map +1 -0
- package/dist/ipc/job_proc_lazy_main.cjs +210 -0
- package/dist/ipc/job_proc_lazy_main.cjs.map +1 -0
- package/dist/ipc/job_proc_lazy_main.d.cts +2 -0
- package/dist/ipc/job_proc_lazy_main.d.ts +2 -0
- package/dist/ipc/job_proc_lazy_main.d.ts.map +1 -0
- package/dist/ipc/job_proc_lazy_main.js +187 -0
- package/dist/ipc/job_proc_lazy_main.js.map +1 -0
- package/dist/ipc/message.cjs +17 -0
- package/dist/ipc/message.cjs.map +1 -0
- package/dist/ipc/message.d.cts +58 -0
- package/dist/ipc/message.d.ts +58 -0
- package/dist/ipc/message.d.ts.map +1 -0
- package/dist/ipc/message.js +1 -0
- package/dist/ipc/message.js.map +1 -0
- package/dist/ipc/proc_pool.cjs +164 -0
- package/dist/ipc/proc_pool.cjs.map +1 -0
- package/dist/ipc/proc_pool.d.cts +31 -0
- package/dist/ipc/proc_pool.d.ts +31 -0
- package/dist/ipc/proc_pool.d.ts.map +1 -0
- package/dist/ipc/proc_pool.js +140 -0
- package/dist/ipc/proc_pool.js.map +1 -0
- package/dist/ipc/supervised_proc.cjs +229 -0
- package/dist/ipc/supervised_proc.cjs.map +1 -0
- package/dist/ipc/supervised_proc.d.cts +32 -0
- package/dist/ipc/supervised_proc.d.ts +32 -0
- package/dist/ipc/supervised_proc.d.ts.map +1 -0
- package/dist/ipc/supervised_proc.js +195 -0
- package/dist/ipc/supervised_proc.js.map +1 -0
- package/dist/ipc/supervised_proc.test.cjs +145 -0
- package/dist/ipc/supervised_proc.test.cjs.map +1 -0
- package/dist/ipc/supervised_proc.test.js +122 -0
- package/dist/ipc/supervised_proc.test.js.map +1 -0
- package/dist/job.cjs +373 -0
- package/dist/job.cjs.map +1 -0
- package/dist/job.d.cts +141 -0
- package/dist/job.d.ts +141 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +332 -0
- package/dist/job.js.map +1 -0
- package/dist/llm/chat_context.cjs +527 -0
- package/dist/llm/chat_context.cjs.map +1 -0
- package/dist/llm/chat_context.d.cts +223 -0
- package/dist/llm/chat_context.d.ts +223 -0
- package/dist/llm/chat_context.d.ts.map +1 -0
- package/dist/llm/chat_context.js +496 -0
- package/dist/llm/chat_context.js.map +1 -0
- package/dist/llm/chat_context.test.cjs +911 -0
- package/dist/llm/chat_context.test.cjs.map +1 -0
- package/dist/llm/chat_context.test.js +916 -0
- package/dist/llm/chat_context.test.js.map +1 -0
- package/dist/llm/fallback_adapter.cjs +278 -0
- package/dist/llm/fallback_adapter.cjs.map +1 -0
- package/dist/llm/fallback_adapter.d.cts +73 -0
- package/dist/llm/fallback_adapter.d.ts +73 -0
- package/dist/llm/fallback_adapter.d.ts.map +1 -0
- package/dist/llm/fallback_adapter.js +254 -0
- package/dist/llm/fallback_adapter.js.map +1 -0
- package/dist/llm/fallback_adapter.test.cjs +176 -0
- package/dist/llm/fallback_adapter.test.cjs.map +1 -0
- package/dist/llm/fallback_adapter.test.js +175 -0
- package/dist/llm/fallback_adapter.test.js.map +1 -0
- package/dist/llm/index.cjs +79 -0
- package/dist/llm/index.cjs.map +1 -0
- package/dist/llm/index.d.cts +9 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +61 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm.cjs +226 -0
- package/dist/llm/llm.cjs.map +1 -0
- package/dist/llm/llm.d.cts +94 -0
- package/dist/llm/llm.d.ts +94 -0
- package/dist/llm/llm.d.ts.map +1 -0
- package/dist/llm/llm.js +201 -0
- package/dist/llm/llm.js.map +1 -0
- package/dist/llm/provider_format/google.cjs +132 -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 +108 -0
- package/dist/llm/provider_format/google.js.map +1 -0
- package/dist/llm/provider_format/google.test.cjs +724 -0
- package/dist/llm/provider_format/google.test.cjs.map +1 -0
- package/dist/llm/provider_format/google.test.js +728 -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 +138 -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 +114 -0
- package/dist/llm/provider_format/openai.js.map +1 -0
- package/dist/llm/provider_format/openai.test.cjs +557 -0
- package/dist/llm/provider_format/openai.test.cjs.map +1 -0
- package/dist/llm/provider_format/openai.test.js +561 -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 +106 -0
- package/dist/llm/realtime.d.ts +106 -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 +25 -0
- package/dist/llm/remote_chat_context.d.ts +25 -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 +152 -0
- package/dist/llm/tool_context.cjs.map +1 -0
- package/dist/llm/tool_context.d.cts +153 -0
- package/dist/llm/tool_context.d.ts +153 -0
- package/dist/llm/tool_context.d.ts.map +1 -0
- package/dist/llm/tool_context.js +119 -0
- package/dist/llm/tool_context.js.map +1 -0
- package/dist/llm/tool_context.test.cjs +359 -0
- package/dist/llm/tool_context.test.cjs.map +1 -0
- package/dist/llm/tool_context.test.js +336 -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 +267 -0
- package/dist/llm/utils.cjs.map +1 -0
- package/dist/llm/utils.d.cts +41 -0
- package/dist/llm/utils.d.ts +41 -0
- package/dist/llm/utils.d.ts.map +1 -0
- package/dist/llm/utils.js +230 -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/llm/zod-utils.cjs +102 -0
- package/dist/llm/zod-utils.cjs.map +1 -0
- package/dist/llm/zod-utils.d.cts +65 -0
- package/dist/llm/zod-utils.d.ts +65 -0
- package/dist/llm/zod-utils.d.ts.map +1 -0
- package/dist/llm/zod-utils.js +64 -0
- package/dist/llm/zod-utils.js.map +1 -0
- package/dist/llm/zod-utils.test.cjs +472 -0
- package/dist/llm/zod-utils.test.cjs.map +1 -0
- package/dist/llm/zod-utils.test.js +455 -0
- package/dist/llm/zod-utils.test.js.map +1 -0
- package/dist/log.cjs +81 -0
- package/dist/log.cjs.map +1 -0
- package/dist/log.d.cts +20 -0
- package/dist/log.d.ts +20 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +54 -0
- package/dist/log.js.map +1 -0
- package/dist/metrics/base.cjs +17 -0
- package/dist/metrics/base.cjs.map +1 -0
- package/dist/metrics/base.d.cts +150 -0
- package/dist/metrics/base.d.ts +150 -0
- package/dist/metrics/base.d.ts.map +1 -0
- package/dist/metrics/base.js +1 -0
- package/dist/metrics/base.js.map +1 -0
- package/dist/metrics/index.cjs +32 -0
- package/dist/metrics/index.cjs.map +1 -0
- package/dist/metrics/index.d.cts +4 -0
- package/dist/metrics/index.d.ts +4 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +7 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/usage_collector.cjs +58 -0
- package/dist/metrics/usage_collector.cjs.map +1 -0
- package/dist/metrics/usage_collector.d.cts +15 -0
- package/dist/metrics/usage_collector.d.ts +15 -0
- package/dist/metrics/usage_collector.d.ts.map +1 -0
- package/dist/metrics/usage_collector.js +34 -0
- package/dist/metrics/usage_collector.js.map +1 -0
- package/dist/metrics/utils.cjs +74 -0
- package/dist/metrics/utils.cjs.map +1 -0
- package/dist/metrics/utils.d.cts +3 -0
- package/dist/metrics/utils.d.ts +3 -0
- package/dist/metrics/utils.d.ts.map +1 -0
- package/dist/metrics/utils.js +50 -0
- package/dist/metrics/utils.js.map +1 -0
- package/dist/plugin.cjs +62 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +24 -0
- package/dist/plugin.d.ts +24 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +37 -0
- package/dist/plugin.js.map +1 -0
- package/dist/stream/deferred_stream.cjs +106 -0
- package/dist/stream/deferred_stream.cjs.map +1 -0
- package/dist/stream/deferred_stream.d.cts +32 -0
- package/dist/stream/deferred_stream.d.ts +32 -0
- package/dist/stream/deferred_stream.d.ts.map +1 -0
- package/dist/stream/deferred_stream.js +81 -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 +57 -0
- package/dist/stream/stream_channel.cjs.map +1 -0
- package/dist/stream/stream_channel.d.cts +11 -0
- package/dist/stream/stream_channel.d.ts +11 -0
- package/dist/stream/stream_channel.d.ts.map +1 -0
- package/dist/stream/stream_channel.js +33 -0
- package/dist/stream/stream_channel.js.map +1 -0
- package/dist/stream/stream_channel.test.cjs +124 -0
- package/dist/stream/stream_channel.test.cjs.map +1 -0
- package/dist/stream/stream_channel.test.js +123 -0
- package/dist/stream/stream_channel.test.js.map +1 -0
- package/dist/stt/index.cjs +38 -0
- package/dist/stt/index.cjs.map +1 -0
- package/dist/stt/index.d.cts +3 -0
- package/dist/stt/index.d.ts +3 -0
- package/dist/stt/index.d.ts.map +1 -0
- package/dist/stt/index.js +14 -0
- package/dist/stt/index.js.map +1 -0
- package/dist/stt/stream_adapter.cjs +115 -0
- package/dist/stt/stream_adapter.cjs.map +1 -0
- package/dist/stt/stream_adapter.d.cts +23 -0
- package/dist/stt/stream_adapter.d.ts +23 -0
- package/dist/stt/stream_adapter.d.ts.map +1 -0
- package/dist/stt/stream_adapter.js +90 -0
- package/dist/stt/stream_adapter.js.map +1 -0
- package/dist/stt/stt.cjs +253 -0
- package/dist/stt/stt.cjs.map +1 -0
- package/dist/stt/stt.d.cts +158 -0
- package/dist/stt/stt.d.ts +158 -0
- package/dist/stt/stt.d.ts.map +1 -0
- package/dist/stt/stt.js +227 -0
- package/dist/stt/stt.js.map +1 -0
- package/dist/telemetry/index.cjs +72 -0
- package/dist/telemetry/index.cjs.map +1 -0
- package/dist/telemetry/index.d.cts +7 -0
- package/dist/telemetry/index.d.ts +7 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +37 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/logging.cjs +65 -0
- package/dist/telemetry/logging.cjs.map +1 -0
- package/dist/telemetry/logging.d.cts +21 -0
- package/dist/telemetry/logging.d.ts +21 -0
- package/dist/telemetry/logging.d.ts.map +1 -0
- package/dist/telemetry/logging.js +40 -0
- package/dist/telemetry/logging.js.map +1 -0
- package/dist/telemetry/otel_http_exporter.cjs +147 -0
- package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
- package/dist/telemetry/otel_http_exporter.d.cts +62 -0
- package/dist/telemetry/otel_http_exporter.d.ts +62 -0
- package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
- package/dist/telemetry/otel_http_exporter.js +123 -0
- package/dist/telemetry/otel_http_exporter.js.map +1 -0
- package/dist/telemetry/pino_otel_transport.cjs +217 -0
- package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
- package/dist/telemetry/pino_otel_transport.d.cts +58 -0
- package/dist/telemetry/pino_otel_transport.d.ts +58 -0
- package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
- package/dist/telemetry/pino_otel_transport.js +189 -0
- package/dist/telemetry/pino_otel_transport.js.map +1 -0
- package/dist/telemetry/trace_types.cjs +206 -0
- package/dist/telemetry/trace_types.cjs.map +1 -0
- package/dist/telemetry/trace_types.d.cts +61 -0
- package/dist/telemetry/trace_types.d.ts +61 -0
- package/dist/telemetry/trace_types.d.ts.map +1 -0
- package/dist/telemetry/trace_types.js +123 -0
- package/dist/telemetry/trace_types.js.map +1 -0
- package/dist/telemetry/traces.cjs +444 -0
- package/dist/telemetry/traces.cjs.map +1 -0
- package/dist/telemetry/traces.d.cts +114 -0
- package/dist/telemetry/traces.d.ts +114 -0
- package/dist/telemetry/traces.d.ts.map +1 -0
- package/dist/telemetry/traces.js +409 -0
- package/dist/telemetry/traces.js.map +1 -0
- package/dist/telemetry/utils.cjs +86 -0
- package/dist/telemetry/utils.cjs.map +1 -0
- package/dist/telemetry/utils.d.cts +5 -0
- package/dist/telemetry/utils.d.ts +5 -0
- package/dist/telemetry/utils.d.ts.map +1 -0
- package/dist/telemetry/utils.js +51 -0
- package/dist/telemetry/utils.js.map +1 -0
- package/dist/tokenize/basic/basic.cjs +105 -0
- package/dist/tokenize/basic/basic.cjs.map +1 -0
- package/dist/tokenize/basic/basic.d.cts +24 -0
- package/dist/tokenize/basic/basic.d.ts +24 -0
- package/dist/tokenize/basic/basic.d.ts.map +1 -0
- package/dist/tokenize/basic/basic.js +67 -0
- package/dist/tokenize/basic/basic.js.map +1 -0
- package/dist/tokenize/basic/hyphenator.cjs +425 -0
- package/dist/tokenize/basic/hyphenator.cjs.map +1 -0
- package/dist/tokenize/basic/hyphenator.d.cts +17 -0
- package/dist/tokenize/basic/hyphenator.d.ts +17 -0
- package/dist/tokenize/basic/hyphenator.d.ts.map +1 -0
- package/dist/tokenize/basic/hyphenator.js +401 -0
- package/dist/tokenize/basic/hyphenator.js.map +1 -0
- package/dist/tokenize/basic/index.cjs +37 -0
- package/dist/tokenize/basic/index.cjs.map +1 -0
- package/dist/tokenize/basic/index.d.cts +2 -0
- package/dist/tokenize/basic/index.d.ts +2 -0
- package/dist/tokenize/basic/index.d.ts.map +1 -0
- package/dist/tokenize/basic/index.js +15 -0
- package/dist/tokenize/basic/index.js.map +1 -0
- package/dist/tokenize/basic/paragraph.cjs +57 -0
- package/dist/tokenize/basic/paragraph.cjs.map +1 -0
- package/dist/tokenize/basic/paragraph.d.cts +5 -0
- package/dist/tokenize/basic/paragraph.d.ts +5 -0
- package/dist/tokenize/basic/paragraph.d.ts.map +1 -0
- package/dist/tokenize/basic/paragraph.js +33 -0
- package/dist/tokenize/basic/paragraph.js.map +1 -0
- package/dist/tokenize/basic/sentence.cjs +97 -0
- package/dist/tokenize/basic/sentence.cjs.map +1 -0
- package/dist/tokenize/basic/sentence.d.cts +5 -0
- package/dist/tokenize/basic/sentence.d.ts +5 -0
- package/dist/tokenize/basic/sentence.d.ts.map +1 -0
- package/dist/tokenize/basic/sentence.js +73 -0
- package/dist/tokenize/basic/sentence.js.map +1 -0
- package/dist/tokenize/basic/word.cjs +44 -0
- package/dist/tokenize/basic/word.cjs.map +1 -0
- package/dist/tokenize/basic/word.d.cts +5 -0
- package/dist/tokenize/basic/word.d.ts +5 -0
- package/dist/tokenize/basic/word.d.ts.map +1 -0
- package/dist/tokenize/basic/word.js +20 -0
- package/dist/tokenize/basic/word.js.map +1 -0
- package/dist/tokenize/index.cjs +55 -0
- package/dist/tokenize/index.cjs.map +1 -0
- package/dist/tokenize/index.d.cts +5 -0
- package/dist/tokenize/index.d.ts +5 -0
- package/dist/tokenize/index.d.ts.map +1 -0
- package/dist/tokenize/index.js +19 -0
- package/dist/tokenize/index.js.map +1 -0
- package/dist/tokenize/token_stream.cjs +168 -0
- package/dist/tokenize/token_stream.cjs.map +1 -0
- package/dist/tokenize/token_stream.d.cts +40 -0
- package/dist/tokenize/token_stream.d.ts +40 -0
- package/dist/tokenize/token_stream.d.ts.map +1 -0
- package/dist/tokenize/token_stream.js +142 -0
- package/dist/tokenize/token_stream.js.map +1 -0
- package/dist/tokenize/tokenizer.cjs +184 -0
- package/dist/tokenize/tokenizer.cjs.map +1 -0
- package/dist/tokenize/tokenizer.d.cts +55 -0
- package/dist/tokenize/tokenizer.d.ts +55 -0
- package/dist/tokenize/tokenizer.d.ts.map +1 -0
- package/dist/tokenize/tokenizer.js +156 -0
- package/dist/tokenize/tokenizer.js.map +1 -0
- package/dist/tokenize/tokenizer.test.cjs +220 -0
- package/dist/tokenize/tokenizer.test.cjs.map +1 -0
- package/dist/tokenize/tokenizer.test.js +219 -0
- package/dist/tokenize/tokenizer.test.js.map +1 -0
- package/dist/transcription.cjs +247 -0
- package/dist/transcription.cjs.map +1 -0
- package/dist/transcription.d.cts +31 -0
- package/dist/transcription.d.ts +31 -0
- package/dist/transcription.d.ts.map +1 -0
- package/dist/transcription.js +222 -0
- package/dist/transcription.js.map +1 -0
- package/dist/tts/index.cjs +38 -0
- package/dist/tts/index.cjs.map +1 -0
- package/dist/tts/index.d.cts +3 -0
- package/dist/tts/index.d.ts +3 -0
- package/dist/tts/index.d.ts.map +1 -0
- package/dist/tts/index.js +14 -0
- package/dist/tts/index.js.map +1 -0
- package/dist/tts/stream_adapter.cjs +105 -0
- package/dist/tts/stream_adapter.cjs.map +1 -0
- package/dist/tts/stream_adapter.d.cts +20 -0
- package/dist/tts/stream_adapter.d.ts +20 -0
- package/dist/tts/stream_adapter.d.ts.map +1 -0
- package/dist/tts/stream_adapter.js +80 -0
- package/dist/tts/stream_adapter.js.map +1 -0
- package/dist/tts/tts.cjs +431 -0
- package/dist/tts/tts.cjs.map +1 -0
- package/dist/tts/tts.d.cts +161 -0
- package/dist/tts/tts.d.ts +161 -0
- package/dist/tts/tts.d.ts.map +1 -0
- package/dist/tts/tts.js +405 -0
- package/dist/tts/tts.js.map +1 -0
- package/dist/types.cjs +49 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +44 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ws_transport.cjs +51 -0
- package/dist/utils/ws_transport.cjs.map +1 -0
- package/dist/utils/ws_transport.d.cts +9 -0
- package/dist/utils/ws_transport.d.ts +9 -0
- package/dist/utils/ws_transport.d.ts.map +1 -0
- package/dist/utils/ws_transport.js +17 -0
- package/dist/utils/ws_transport.js.map +1 -0
- package/dist/utils/ws_transport.test.cjs +212 -0
- package/dist/utils/ws_transport.test.cjs.map +1 -0
- package/dist/utils/ws_transport.test.js +211 -0
- package/dist/utils/ws_transport.test.js.map +1 -0
- package/dist/utils.cjs +669 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +244 -0
- package/dist/utils.d.ts +244 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +617 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.cjs +492 -0
- package/dist/utils.test.cjs.map +1 -0
- package/dist/utils.test.js +491 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/vad.cjs +211 -0
- package/dist/vad.cjs.map +1 -0
- package/dist/vad.d.cts +105 -0
- package/dist/vad.d.ts +105 -0
- package/dist/vad.d.ts.map +1 -0
- package/dist/vad.js +185 -0
- package/dist/vad.js.map +1 -0
- package/dist/version.cjs +29 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.cts +2 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/voice/agent.cjs +308 -0
- package/dist/voice/agent.cjs.map +1 -0
- package/dist/voice/agent.d.cts +83 -0
- package/dist/voice/agent.d.ts +83 -0
- package/dist/voice/agent.d.ts.map +1 -0
- package/dist/voice/agent.js +287 -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 +1784 -0
- package/dist/voice/agent_activity.cjs.map +1 -0
- package/dist/voice/agent_activity.d.cts +116 -0
- package/dist/voice/agent_activity.d.ts +116 -0
- package/dist/voice/agent_activity.d.ts.map +1 -0
- package/dist/voice/agent_activity.js +1780 -0
- package/dist/voice/agent_activity.js.map +1 -0
- package/dist/voice/agent_session.cjs +592 -0
- package/dist/voice/agent_session.cjs.map +1 -0
- package/dist/voice/agent_session.d.cts +165 -0
- package/dist/voice/agent_session.d.ts +165 -0
- package/dist/voice/agent_session.d.ts.map +1 -0
- package/dist/voice/agent_session.js +582 -0
- package/dist/voice/agent_session.js.map +1 -0
- package/dist/voice/audio_recognition.cjs +668 -0
- package/dist/voice/audio_recognition.cjs.map +1 -0
- package/dist/voice/audio_recognition.d.cts +127 -0
- package/dist/voice/audio_recognition.d.ts +127 -0
- package/dist/voice/audio_recognition.d.ts.map +1 -0
- package/dist/voice/audio_recognition.js +647 -0
- package/dist/voice/audio_recognition.js.map +1 -0
- package/dist/voice/avatar/datastream_io.cjs +204 -0
- package/dist/voice/avatar/datastream_io.cjs.map +1 -0
- package/dist/voice/avatar/datastream_io.d.cts +37 -0
- package/dist/voice/avatar/datastream_io.d.ts +37 -0
- package/dist/voice/avatar/datastream_io.d.ts.map +1 -0
- package/dist/voice/avatar/datastream_io.js +188 -0
- package/dist/voice/avatar/datastream_io.js.map +1 -0
- package/dist/voice/avatar/index.cjs +23 -0
- package/dist/voice/avatar/index.cjs.map +1 -0
- package/dist/voice/avatar/index.d.cts +2 -0
- package/dist/voice/avatar/index.d.ts +2 -0
- package/dist/voice/avatar/index.d.ts.map +1 -0
- package/dist/voice/avatar/index.js +2 -0
- package/dist/voice/avatar/index.js.map +1 -0
- package/dist/voice/background_audio.cjs +366 -0
- package/dist/voice/background_audio.cjs.map +1 -0
- package/dist/voice/background_audio.d.cts +121 -0
- package/dist/voice/background_audio.d.ts +121 -0
- package/dist/voice/background_audio.d.ts.map +1 -0
- package/dist/voice/background_audio.js +342 -0
- package/dist/voice/background_audio.js.map +1 -0
- package/dist/voice/events.cjs +147 -0
- package/dist/voice/events.cjs.map +1 -0
- package/dist/voice/events.d.cts +127 -0
- package/dist/voice/events.d.ts +127 -0
- package/dist/voice/events.d.ts.map +1 -0
- package/dist/voice/events.js +112 -0
- package/dist/voice/events.js.map +1 -0
- package/dist/voice/generation.cjs +747 -0
- package/dist/voice/generation.cjs.map +1 -0
- package/dist/voice/generation.d.cts +116 -0
- package/dist/voice/generation.d.ts +116 -0
- package/dist/voice/generation.d.ts.map +1 -0
- package/dist/voice/generation.js +719 -0
- package/dist/voice/generation.js.map +1 -0
- package/dist/voice/generation_tools.test.cjs +236 -0
- package/dist/voice/generation_tools.test.cjs.map +1 -0
- package/dist/voice/generation_tools.test.js +235 -0
- package/dist/voice/generation_tools.test.js.map +1 -0
- package/dist/voice/index.cjs +49 -0
- package/dist/voice/index.cjs.map +1 -0
- package/dist/voice/index.d.cts +10 -0
- package/dist/voice/index.d.ts +10 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +16 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/interruption_detection.test.cjs +114 -0
- package/dist/voice/interruption_detection.test.cjs.map +1 -0
- package/dist/voice/interruption_detection.test.js +113 -0
- package/dist/voice/interruption_detection.test.js.map +1 -0
- package/dist/voice/io.cjs +270 -0
- package/dist/voice/io.cjs.map +1 -0
- package/dist/voice/io.d.cts +126 -0
- package/dist/voice/io.d.ts +126 -0
- package/dist/voice/io.d.ts.map +1 -0
- package/dist/voice/io.js +242 -0
- package/dist/voice/io.js.map +1 -0
- package/dist/voice/recorder_io/index.cjs +23 -0
- package/dist/voice/recorder_io/index.cjs.map +1 -0
- package/dist/voice/recorder_io/index.d.cts +2 -0
- package/dist/voice/recorder_io/index.d.ts +2 -0
- package/dist/voice/recorder_io/index.d.ts.map +1 -0
- package/dist/voice/recorder_io/index.js +2 -0
- package/dist/voice/recorder_io/index.js.map +1 -0
- package/dist/voice/recorder_io/recorder_io.cjs +542 -0
- package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
- package/dist/voice/recorder_io/recorder_io.d.cts +100 -0
- package/dist/voice/recorder_io/recorder_io.d.ts +100 -0
- package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
- package/dist/voice/recorder_io/recorder_io.js +508 -0
- package/dist/voice/recorder_io/recorder_io.js.map +1 -0
- package/dist/voice/report.cjs +75 -0
- package/dist/voice/report.cjs.map +1 -0
- package/dist/voice/report.d.cts +42 -0
- package/dist/voice/report.d.ts +42 -0
- package/dist/voice/report.d.ts.map +1 -0
- package/dist/voice/report.js +50 -0
- package/dist/voice/report.js.map +1 -0
- package/dist/voice/room_io/_input.cjs +133 -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 +114 -0
- package/dist/voice/room_io/_input.js.map +1 -0
- package/dist/voice/room_io/_output.cjs +359 -0
- package/dist/voice/room_io/_output.cjs.map +1 -0
- package/dist/voice/room_io/_output.d.cts +77 -0
- package/dist/voice/room_io/_output.d.ts +77 -0
- package/dist/voice/room_io/_output.d.ts.map +1 -0
- package/dist/voice/room_io/_output.js +343 -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 +373 -0
- package/dist/voice/room_io/room_io.cjs.map +1 -0
- package/dist/voice/room_io/room_io.d.cts +94 -0
- package/dist/voice/room_io/room_io.d.ts +94 -0
- package/dist/voice/room_io/room_io.d.ts.map +1 -0
- package/dist/voice/room_io/room_io.js +364 -0
- package/dist/voice/room_io/room_io.js.map +1 -0
- package/dist/voice/run_context.cjs +51 -0
- package/dist/voice/run_context.cjs.map +1 -0
- package/dist/voice/run_context.d.cts +22 -0
- package/dist/voice/run_context.d.ts +22 -0
- package/dist/voice/run_context.d.ts.map +1 -0
- package/dist/voice/run_context.js +27 -0
- package/dist/voice/run_context.js.map +1 -0
- package/dist/voice/speech_handle.cjs +228 -0
- package/dist/voice/speech_handle.cjs.map +1 -0
- package/dist/voice/speech_handle.d.cts +97 -0
- package/dist/voice/speech_handle.d.ts +97 -0
- package/dist/voice/speech_handle.d.ts.map +1 -0
- package/dist/voice/speech_handle.js +204 -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 +87 -0
- package/dist/voice/transcription/synchronizer.d.ts +87 -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 +680 -0
- package/dist/worker.cjs.map +1 -0
- package/dist/worker.d.cts +119 -0
- package/dist/worker.d.ts +119 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +645 -0
- package/dist/worker.js.map +1 -0
- package/package.json +86 -0
- package/resources/NOTICE +2 -0
- package/resources/keyboard-typing.ogg +0 -0
- package/resources/keyboard-typing2.ogg +0 -0
- package/resources/office-ambience.ogg +0 -0
- package/src/_exceptions.ts +137 -0
- package/src/audio.ts +205 -0
- package/src/cli.ts +224 -0
- package/src/connection_pool.test.ts +346 -0
- package/src/connection_pool.ts +307 -0
- package/src/constants.ts +9 -0
- package/src/generator.ts +38 -0
- package/src/http_server.ts +64 -0
- package/src/index.ts +41 -0
- package/src/inference/api_protos.ts +82 -0
- package/src/inference/index.ts +32 -0
- package/src/inference/interruption/AdaptiveInterruptionDetector.ts +166 -0
- package/src/inference/interruption/InterruptionStream.ts +397 -0
- package/src/inference/interruption/defaults.ts +33 -0
- package/src/inference/interruption/errors.ts +0 -0
- package/src/inference/interruption/http_transport.ts +61 -0
- package/src/inference/interruption/index.ts +4 -0
- package/src/inference/interruption/interruption.ts +88 -0
- package/src/inference/llm.ts +532 -0
- package/src/inference/stt.ts +524 -0
- package/src/inference/tts.ts +574 -0
- package/src/inference/utils.test.ts +31 -0
- package/src/inference/utils.ts +81 -0
- package/src/inference_runner.ts +19 -0
- package/src/ipc/index.ts +5 -0
- package/src/ipc/inference_executor.ts +7 -0
- package/src/ipc/inference_proc_executor.ts +101 -0
- package/src/ipc/inference_proc_lazy_main.ts +115 -0
- package/src/ipc/job_executor.ts +23 -0
- package/src/ipc/job_proc_executor.ts +122 -0
- package/src/ipc/job_proc_lazy_main.ts +247 -0
- package/src/ipc/message.ts +52 -0
- package/src/ipc/proc_pool.ts +164 -0
- package/src/ipc/supervised_proc.test.ts +153 -0
- package/src/ipc/supervised_proc.ts +242 -0
- package/src/job.ts +461 -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__/zod-utils.test.ts.snap +559 -0
- package/src/llm/chat_context.test.ts +1057 -0
- package/src/llm/chat_context.ts +759 -0
- package/src/llm/fallback_adapter.test.ts +238 -0
- package/src/llm/fallback_adapter.ts +391 -0
- package/src/llm/index.ts +74 -0
- package/src/llm/llm.ts +303 -0
- package/src/llm/provider_format/google.test.ts +843 -0
- package/src/llm/provider_format/google.ts +134 -0
- package/src/llm/provider_format/index.ts +23 -0
- package/src/llm/provider_format/openai.test.ts +675 -0
- package/src/llm/provider_format/openai.ts +146 -0
- package/src/llm/provider_format/utils.ts +187 -0
- package/src/llm/realtime.ts +163 -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 +407 -0
- package/src/llm/tool_context.ts +343 -0
- package/src/llm/tool_context.type.test.ts +115 -0
- package/src/llm/utils.test.ts +670 -0
- package/src/llm/utils.ts +336 -0
- package/src/llm/zod-utils.test.ts +577 -0
- package/src/llm/zod-utils.ts +153 -0
- package/src/log.ts +83 -0
- package/src/metrics/base.ts +168 -0
- package/src/metrics/index.ts +15 -0
- package/src/metrics/usage_collector.ts +46 -0
- package/src/metrics/utils.ts +64 -0
- package/src/plugin.ts +46 -0
- package/src/stream/deferred_stream.test.ts +755 -0
- package/src/stream/deferred_stream.ts +127 -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 +166 -0
- package/src/stream/stream_channel.ts +44 -0
- package/src/stt/index.ts +15 -0
- package/src/stt/stream_adapter.ts +107 -0
- package/src/stt/stt.ts +374 -0
- package/src/telemetry/index.ts +28 -0
- package/src/telemetry/logging.ts +55 -0
- package/src/telemetry/otel_http_exporter.ts +195 -0
- package/src/telemetry/pino_otel_transport.ts +265 -0
- package/src/telemetry/trace_types.ts +95 -0
- package/src/telemetry/traces.ts +612 -0
- package/src/telemetry/utils.ts +61 -0
- package/src/tokenize/basic/basic.ts +83 -0
- package/src/tokenize/basic/hyphenator.ts +434 -0
- package/src/tokenize/basic/index.ts +11 -0
- package/src/tokenize/basic/paragraph.ts +43 -0
- package/src/tokenize/basic/sentence.ts +89 -0
- package/src/tokenize/basic/word.ts +27 -0
- package/src/tokenize/index.ts +16 -0
- package/src/tokenize/token_stream.ts +180 -0
- package/src/tokenize/tokenizer.test.ts +255 -0
- package/src/tokenize/tokenizer.ts +152 -0
- package/src/transcription.ts +307 -0
- package/src/tts/index.ts +12 -0
- package/src/tts/stream_adapter.ts +110 -0
- package/src/tts/tts.ts +598 -0
- package/src/types.ts +66 -0
- package/src/utils/ws_transport.test.ts +282 -0
- package/src/utils/ws_transport.ts +22 -0
- package/src/utils.test.ts +651 -0
- package/src/utils.ts +871 -0
- package/src/vad.ts +262 -0
- package/src/version.ts +5 -0
- package/src/voice/agent.test.ts +80 -0
- package/src/voice/agent.ts +418 -0
- package/src/voice/agent_activity.ts +2375 -0
- package/src/voice/agent_session.ts +866 -0
- package/src/voice/audio_recognition.ts +877 -0
- package/src/voice/avatar/datastream_io.ts +247 -0
- package/src/voice/avatar/index.ts +4 -0
- package/src/voice/background_audio.ts +491 -0
- package/src/voice/events.ts +261 -0
- package/src/voice/generation.ts +946 -0
- package/src/voice/generation_tools.test.ts +268 -0
- package/src/voice/index.ts +12 -0
- package/src/voice/interruption_detection.test.ts +151 -0
- package/src/voice/io.ts +347 -0
- package/src/voice/recorder_io/index.ts +4 -0
- package/src/voice/recorder_io/recorder_io.ts +690 -0
- package/src/voice/report.ts +100 -0
- package/src/voice/room_io/_input.ts +162 -0
- package/src/voice/room_io/_output.ts +439 -0
- package/src/voice/room_io/index.ts +5 -0
- package/src/voice/room_io/room_io.ts +518 -0
- package/src/voice/run_context.ts +34 -0
- package/src/voice/speech_handle.ts +250 -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 +798 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/llm/chat_context.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport {\n type AudioContent,\n ChatContext,\n type ChatItem,\n ChatMessage,\n FunctionCall,\n FunctionCallOutput,\n type ImageContent,\n ReadonlyChatContext,\n} from './chat_context.js';\n\ndescribe('ChatContext.toJSON', () => {\n it('should match snapshot for empty context', () => {\n const context = new ChatContext();\n expect(context.toJSON()).toMatchSnapshot();\n });\n\n it('should match snapshot for simple conversation', () => {\n const context = new ChatContext();\n\n context.addMessage({\n id: 'msg_system_1',\n role: 'system',\n content: 'You are a helpful assistant.',\n createdAt: 1000000000,\n });\n\n context.addMessage({\n id: 'msg_user_1',\n role: 'user',\n content: 'Hello, how are you?',\n createdAt: 1000000001,\n });\n\n context.addMessage({\n id: 'msg_assistant_1',\n role: 'assistant',\n content: \"I'm doing well, thank you! How can I help you today?\",\n createdAt: 1000000002,\n });\n\n expect(context.toJSON()).toMatchSnapshot('simple-conversation-no-timestamps');\n\n expect(context.toJSON({ excludeTimestamp: false })).toMatchSnapshot(\n 'simple-conversation-with-timestamps',\n );\n });\n\n it('should match snapshot for multimodal content', () => {\n const context = new ChatContext();\n\n const imageContent: ImageContent = {\n id: 'img_test_1',\n type: 'image_content',\n image: 'https://example.com/test-image.jpg',\n inferenceDetail: 'high',\n inferenceWidth: 1024,\n inferenceHeight: 768,\n mimeType: 'image/jpeg',\n _cache: {},\n };\n\n const audioContent: AudioContent = {\n type: 'audio_content',\n frame: [], // This won't be included in JSON\n transcript: 'This is a test audio transcript',\n };\n\n context.addMessage({\n id: 'msg_user_2',\n role: 'user',\n content: [\n 'Check out this image and audio:',\n imageContent,\n audioContent,\n 'What do you think?',\n ],\n createdAt: 2000000000,\n });\n\n expect(context.toJSON()).toMatchSnapshot('multimodal-default-exclusions');\n\n expect(\n context.toJSON({\n excludeImage: false,\n excludeAudio: true,\n }),\n ).toMatchSnapshot('multimodal-with-images-only');\n\n expect(\n context.toJSON({\n excludeImage: true,\n excludeAudio: false,\n }),\n ).toMatchSnapshot('multimodal-with-audio-only');\n\n expect(\n context.toJSON({\n excludeImage: false,\n excludeAudio: false,\n excludeTimestamp: false,\n }),\n ).toMatchSnapshot('multimodal-full-content');\n });\n\n it('should match snapshot for function calls', () => {\n const context = new ChatContext();\n\n context.addMessage({\n id: 'msg_user_3',\n role: 'user',\n content: \"What's the weather in Paris?\",\n createdAt: 3000000000,\n });\n\n const functionCall = new FunctionCall({\n id: 'func_call_1',\n callId: 'call_weather_123',\n name: 'get_weather',\n args: '{\"location\": \"Paris, France\", \"unit\": \"celsius\"}',\n createdAt: 3000000001,\n });\n context.insert(functionCall);\n\n const functionOutput = new FunctionCallOutput({\n id: 'func_output_1',\n callId: 'call_weather_123',\n name: 'get_weather',\n output: '{\"temperature\": 22, \"condition\": \"partly cloudy\", \"humidity\": 65}',\n isError: false,\n createdAt: 3000000002,\n });\n context.insert(functionOutput);\n\n context.addMessage({\n id: 'msg_assistant_2',\n role: 'assistant',\n content: 'The weather in Paris is currently 22°C and partly cloudy with 65% humidity.',\n createdAt: 3000000003,\n });\n\n expect(context.toJSON()).toMatchSnapshot('conversation-with-function-calls');\n\n expect(\n context.toJSON({\n excludeFunctionCall: true,\n }),\n ).toMatchSnapshot('conversation-without-function-calls');\n\n expect(\n context.toJSON({\n excludeTimestamp: false,\n }),\n ).toMatchSnapshot('conversation-with-function-calls-and-timestamps');\n });\n\n it('should match snapshot for edge cases', () => {\n const context = new ChatContext();\n\n context.addMessage({\n id: 'msg_empty_1',\n role: 'user',\n content: [],\n createdAt: 5000000000,\n });\n\n const silentAudio: AudioContent = {\n type: 'audio_content',\n frame: [],\n transcript: undefined,\n };\n\n context.addMessage({\n id: 'msg_silent_audio',\n role: 'user',\n content: [silentAudio],\n createdAt: 5000000001,\n });\n\n context.addMessage({\n id: 'msg_multi_text',\n role: 'assistant',\n content: ['Part 1. ', 'Part 2. ', 'Part 3.'],\n createdAt: 5000000002,\n });\n\n const minimalCall = new FunctionCall({\n id: 'func_minimal',\n callId: 'minimal',\n name: 'test',\n args: '{}',\n createdAt: 5000000003,\n });\n context.insert(minimalCall);\n\n const namelessOutput = new FunctionCallOutput({\n id: 'func_output_nameless',\n callId: 'minimal',\n output: 'OK',\n isError: false,\n createdAt: 5000000004,\n });\n context.insert(namelessOutput);\n\n context.addMessage({\n id: 'msg_special_chars',\n role: 'user',\n content:\n 'Test with special chars: \\n\\t\\r \"quotes\" \\'apostrophes\\' \\\\backslashes\\\\ {braces} [brackets]',\n createdAt: 5000000005,\n });\n\n expect(context.toJSON()).toMatchSnapshot('edge-cases-default');\n expect(\n context.toJSON({\n excludeTimestamp: false,\n excludeAudio: false,\n }),\n ).toMatchSnapshot('edge-cases-with-details');\n });\n\n it('should match snapshot for message property variations', () => {\n const context = new ChatContext();\n\n context.addMessage({\n id: 'custom-message-id-123',\n role: 'user',\n content: 'Message with custom ID',\n createdAt: 6000000000,\n });\n\n context.addMessage({\n id: 'msg_interrupted',\n role: 'assistant',\n content: 'This response was interrupted...',\n interrupted: true,\n createdAt: 6000000001,\n });\n\n context.addMessage({\n id: 'msg_dev_2',\n role: 'developer',\n content: 'Developer message',\n createdAt: 6000000002,\n });\n\n context.addMessage({\n id: 'msg_system_3',\n role: 'system',\n content: 'System message',\n createdAt: 6000000003,\n });\n\n const detailedImage: ImageContent = {\n id: 'img_detailed',\n type: 'image_content',\n image: 'https://example.com/image.jpg',\n inferenceDetail: 'low',\n inferenceWidth: 512,\n inferenceHeight: 512,\n mimeType: 'image/png',\n _cache: { cached: true },\n };\n\n context.addMessage({\n id: 'msg_with_image',\n role: 'user',\n content: ['Image with all properties:', detailedImage],\n createdAt: 6000000004,\n });\n\n expect(context.toJSON()).toMatchSnapshot('message-properties-default');\n expect(\n context.toJSON({\n excludeImage: false,\n excludeTimestamp: false,\n }),\n ).toMatchSnapshot('message-properties-full');\n });\n});\n\ndescribe('ReadonlyChatContext with immutable array', () => {\n it('should have readonly property set to true', () => {\n const items: ChatItem[] = [\n new ChatMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Test'],\n interrupted: false,\n createdAt: Date.now(),\n }),\n ];\n const readonlyContext = new ReadonlyChatContext(items);\n\n expect(readonlyContext.readonly).toBe(true);\n });\n\n it('should prevent setting items property', () => {\n const items: ChatItem[] = [\n new ChatMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Test'],\n interrupted: false,\n createdAt: Date.now(),\n }),\n ];\n const readonlyContext = new ReadonlyChatContext(items);\n expect(() => {\n readonlyContext.items = [];\n }).toThrow(\n `Cannot set items on a read-only chat context. Please use .copy() and agent.update_chat_ctx() to modify the chat context.`,\n );\n });\n\n it('should prevent modifications through array methods', () => {\n const items: ChatItem[] = [\n new ChatMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Test'],\n interrupted: false,\n createdAt: Date.now(),\n }),\n ];\n const readonlyContext = new ReadonlyChatContext(items);\n const newItem = new ChatMessage({\n id: 'msg_2',\n role: 'assistant',\n content: ['Response'],\n interrupted: false,\n createdAt: Date.now(),\n });\n\n const mutableItems = readonlyContext.items;\n expect(() => mutableItems.push(newItem)).toThrow(\n 'Cannot call push() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.pop()).toThrow(\n 'Cannot call pop() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.shift()).toThrow(\n 'Cannot call shift() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.unshift(newItem)).toThrow(\n 'Cannot call unshift() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.splice(0, 1)).toThrow(\n 'Cannot call splice() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.sort()).toThrow(\n 'Cannot call sort() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.reverse()).toThrow(\n 'Cannot call reverse() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.fill(newItem)).toThrow(\n 'Cannot call fill() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => mutableItems.copyWithin(0, 1)).toThrow(\n 'Cannot call copyWithin() on a read-only array. Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n });\n\n it('should prevent bracket notation assignment and deletion', () => {\n const items: ChatItem[] = [\n new ChatMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Test'],\n interrupted: false,\n createdAt: Date.now(),\n }),\n ];\n const readonlyContext = new ReadonlyChatContext(items);\n const newItem = new ChatMessage({\n id: 'msg_2',\n role: 'assistant',\n content: ['Response'],\n interrupted: false,\n createdAt: Date.now(),\n });\n\n expect(() => {\n readonlyContext.items[0] = newItem;\n }).toThrow(\n 'Cannot assign to read-only array index \"0\". Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => {\n delete readonlyContext.items[0];\n }).toThrow(\n 'Cannot delete read-only array index \"0\". Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n\n expect(() => {\n readonlyContext.items[99] = newItem;\n }).toThrow(\n 'Cannot assign to read-only array index \"99\". Please use .copy() and agent.update_chat_ctx() to modify the chat context.',\n );\n });\n\n it('should allow read operations on the immutable array', () => {\n const items: ChatItem[] = [\n new ChatMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Test 1'],\n interrupted: false,\n createdAt: 1000,\n }),\n new ChatMessage({\n id: 'msg_2',\n role: 'assistant',\n content: ['Test 2'],\n interrupted: false,\n createdAt: 2000,\n }),\n ];\n const readonlyContext = new ReadonlyChatContext(items);\n\n expect(readonlyContext.items.length).toBe(2);\n expect(readonlyContext.items[0]).toEqual(items[0]);\n expect(readonlyContext.items[1]).toEqual(items[1]);\n expect(readonlyContext.items.find((item: ChatItem) => item.id === 'msg_2')).toEqual(items[1]);\n expect(readonlyContext.items.map((item: ChatItem) => item.id)).toEqual(['msg_1', 'msg_2']);\n expect(\n readonlyContext.items.filter(\n (item: ChatItem) => item.type === 'message' && item.role === 'user',\n ),\n ).toHaveLength(1);\n\n // forEach should work for reading\n const ids: string[] = [];\n readonlyContext.items.forEach((item) => ids.push(item.id));\n expect(ids).toEqual(['msg_1', 'msg_2']);\n });\n});\n\ndescribe('ChatContext.isEquivalent', () => {\n it('should return true for same reference', () => {\n const ctx = new ChatContext();\n ctx.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n });\n\n expect(ctx.isEquivalent(ctx)).toBe(true);\n });\n\n it('should return true for identical empty contexts', () => {\n const ctx1 = new ChatContext();\n const ctx2 = new ChatContext();\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n\n it('should return false for contexts with different lengths', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n });\n ctx2.addMessage({\n id: 'msg_2',\n role: 'assistant',\n content: 'Hi',\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for contexts with different item IDs', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_2',\n role: 'user',\n content: 'Hello',\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for contexts with different item types', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n });\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCall({\n id: 'msg_1',\n callId: 'call_1',\n name: 'test',\n args: '{}',\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n describe('message comparison', () => {\n it('should return true for identical messages', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n interrupted: false,\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n interrupted: false,\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n\n it('should return false for messages with different roles', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'assistant',\n content: 'Hello',\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for messages with different interrupted flags', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n interrupted: false,\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n interrupted: true,\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for messages with different content', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'Hello',\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'World',\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return true for messages with identical array content', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Hello', 'World'],\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Hello', 'World'],\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n\n it('should return false for messages with different array content', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Hello', 'World'],\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Hello'],\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return true for messages with identical image content', () => {\n const imageContent: ImageContent = {\n id: 'img_1',\n type: 'image_content',\n image: 'https://example.com/image.jpg',\n inferenceDetail: 'high',\n inferenceWidth: 1024,\n inferenceHeight: 768,\n mimeType: 'image/jpeg',\n _cache: {},\n };\n\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Check this:', imageContent],\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Check this:', { ...imageContent }],\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n\n it('should return false for messages with different image content', () => {\n const imageContent1: ImageContent = {\n id: 'img_1',\n type: 'image_content',\n image: 'https://example.com/image1.jpg',\n inferenceDetail: 'high',\n _cache: {},\n };\n\n const imageContent2: ImageContent = {\n id: 'img_2',\n type: 'image_content',\n image: 'https://example.com/image2.jpg',\n inferenceDetail: 'high',\n _cache: {},\n };\n\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Check this:', imageContent1],\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: ['Check this:', imageContent2],\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n });\n\n describe('function call comparison', () => {\n it('should return true for identical function calls', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{\"location\": \"Paris\"}',\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{\"location\": \"Paris\"}',\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n\n it('should return false for function calls with different names', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{}',\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_time',\n args: '{}',\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for function calls with different call IDs', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{}',\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_2',\n name: 'get_weather',\n args: '{}',\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for function calls with different arguments', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{\"location\": \"Paris\"}',\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{\"location\": \"London\"}',\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should ignore timestamps', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{}',\n createdAt: 1000,\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{}',\n createdAt: 2000,\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n });\n\n describe('function call output comparison', () => {\n it('should return true for identical function call outputs', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{\"temperature\": 22}',\n isError: false,\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{\"temperature\": 22}',\n isError: false,\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n\n it('should return false for function call outputs with different names', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{}',\n isError: false,\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_time',\n output: '{}',\n isError: false,\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for function call outputs with different call IDs', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{}',\n isError: false,\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_2',\n name: 'get_weather',\n output: '{}',\n isError: false,\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for function call outputs with different output values', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{\"temperature\": 22}',\n isError: false,\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{\"temperature\": 25}',\n isError: false,\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should return false for function call outputs with different error flags', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: 'Error occurred',\n isError: false,\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: 'Error occurred',\n isError: true,\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(false);\n });\n\n it('should ignore timestamps', () => {\n const ctx1 = new ChatContext();\n ctx1.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{}',\n isError: false,\n createdAt: 1000,\n }),\n );\n\n const ctx2 = new ChatContext();\n ctx2.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{}',\n isError: false,\n createdAt: 2000,\n }),\n );\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n });\n\n describe('complex context comparison', () => {\n it('should return true for identical complex contexts', () => {\n const ctx1 = new ChatContext();\n ctx1.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'What is the weather?',\n });\n ctx1.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{\"location\": \"Paris\"}',\n }),\n );\n ctx1.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{\"temperature\": 22}',\n isError: false,\n }),\n );\n ctx1.addMessage({\n id: 'msg_2',\n role: 'assistant',\n content: 'The weather is 22°C',\n });\n\n const ctx2 = new ChatContext();\n ctx2.addMessage({\n id: 'msg_1',\n role: 'user',\n content: 'What is the weather?',\n });\n ctx2.insert(\n new FunctionCall({\n id: 'func_1',\n callId: 'call_1',\n name: 'get_weather',\n args: '{\"location\": \"Paris\"}',\n }),\n );\n ctx2.insert(\n new FunctionCallOutput({\n id: 'output_1',\n callId: 'call_1',\n name: 'get_weather',\n output: '{\"temperature\": 22}',\n isError: false,\n }),\n );\n ctx2.addMessage({\n id: 'msg_2',\n role: 'assistant',\n content: 'The weather is 22°C',\n });\n\n expect(ctx1.isEquivalent(ctx2)).toBe(true);\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,278 @@
|
|
|
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 fallback_adapter_exports = {};
|
|
20
|
+
__export(fallback_adapter_exports, {
|
|
21
|
+
FallbackAdapter: () => FallbackAdapter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(fallback_adapter_exports);
|
|
24
|
+
var import_exceptions = require("../_exceptions.cjs");
|
|
25
|
+
var import_log = require("../log.cjs");
|
|
26
|
+
var import_types = require("../types.cjs");
|
|
27
|
+
var import_llm = require("./llm.cjs");
|
|
28
|
+
const DEFAULT_FALLBACK_API_CONNECT_OPTIONS = {
|
|
29
|
+
maxRetry: 0,
|
|
30
|
+
timeoutMs: import_types.DEFAULT_API_CONNECT_OPTIONS.timeoutMs,
|
|
31
|
+
retryIntervalMs: import_types.DEFAULT_API_CONNECT_OPTIONS.retryIntervalMs
|
|
32
|
+
};
|
|
33
|
+
class FallbackAdapter extends import_llm.LLM {
|
|
34
|
+
llms;
|
|
35
|
+
attemptTimeout;
|
|
36
|
+
maxRetryPerLLM;
|
|
37
|
+
retryInterval;
|
|
38
|
+
retryOnChunkSent;
|
|
39
|
+
/** @internal */
|
|
40
|
+
_status;
|
|
41
|
+
logger = (0, import_log.log)();
|
|
42
|
+
constructor(options) {
|
|
43
|
+
super();
|
|
44
|
+
if (!options.llms || options.llms.length < 1) {
|
|
45
|
+
throw new Error("at least one LLM instance must be provided.");
|
|
46
|
+
}
|
|
47
|
+
this.llms = options.llms;
|
|
48
|
+
this.attemptTimeout = options.attemptTimeout ?? 5;
|
|
49
|
+
this.maxRetryPerLLM = options.maxRetryPerLLM ?? 0;
|
|
50
|
+
this.retryInterval = options.retryInterval ?? 0.5;
|
|
51
|
+
this.retryOnChunkSent = options.retryOnChunkSent ?? false;
|
|
52
|
+
this._status = this.llms.map(() => ({
|
|
53
|
+
available: true,
|
|
54
|
+
recoveringTask: null
|
|
55
|
+
}));
|
|
56
|
+
for (const llm of this.llms) {
|
|
57
|
+
llm.on("metrics_collected", (metrics) => {
|
|
58
|
+
this.emit("metrics_collected", metrics);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
get model() {
|
|
63
|
+
return "FallbackAdapter";
|
|
64
|
+
}
|
|
65
|
+
label() {
|
|
66
|
+
return "FallbackAdapter";
|
|
67
|
+
}
|
|
68
|
+
chat(opts) {
|
|
69
|
+
return new FallbackLLMStream(this, {
|
|
70
|
+
chatCtx: opts.chatCtx,
|
|
71
|
+
toolCtx: opts.toolCtx,
|
|
72
|
+
connOptions: opts.connOptions || DEFAULT_FALLBACK_API_CONNECT_OPTIONS,
|
|
73
|
+
parallelToolCalls: opts.parallelToolCalls,
|
|
74
|
+
toolChoice: opts.toolChoice,
|
|
75
|
+
extraKwargs: opts.extraKwargs
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Emit availability changed event.
|
|
80
|
+
* @internal
|
|
81
|
+
*/
|
|
82
|
+
_emitAvailabilityChanged(llm, available) {
|
|
83
|
+
const event = { llm, available };
|
|
84
|
+
this.emit(
|
|
85
|
+
"llm_availability_changed",
|
|
86
|
+
event
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
class FallbackLLMStream extends import_llm.LLMStream {
|
|
91
|
+
adapter;
|
|
92
|
+
parallelToolCalls;
|
|
93
|
+
toolChoice;
|
|
94
|
+
extraKwargs;
|
|
95
|
+
_currentStream;
|
|
96
|
+
_log = (0, import_log.log)();
|
|
97
|
+
constructor(adapter, opts) {
|
|
98
|
+
super(adapter, {
|
|
99
|
+
chatCtx: opts.chatCtx,
|
|
100
|
+
toolCtx: opts.toolCtx,
|
|
101
|
+
connOptions: opts.connOptions
|
|
102
|
+
});
|
|
103
|
+
this.adapter = adapter;
|
|
104
|
+
this.parallelToolCalls = opts.parallelToolCalls;
|
|
105
|
+
this.toolChoice = opts.toolChoice;
|
|
106
|
+
this.extraKwargs = opts.extraKwargs;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Override chatCtx to return current stream's context if available.
|
|
110
|
+
*/
|
|
111
|
+
get chatCtx() {
|
|
112
|
+
var _a;
|
|
113
|
+
return ((_a = this._currentStream) == null ? void 0 : _a.chatCtx) ?? super.chatCtx;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Try to generate with a single LLM.
|
|
117
|
+
* Returns an async generator that yields chunks.
|
|
118
|
+
*/
|
|
119
|
+
async *tryGenerate(llm, checkRecovery = false) {
|
|
120
|
+
const connOptions = {
|
|
121
|
+
...this.connOptions,
|
|
122
|
+
maxRetry: this.adapter.maxRetryPerLLM,
|
|
123
|
+
timeoutMs: this.adapter.attemptTimeout * 1e3,
|
|
124
|
+
retryIntervalMs: this.adapter.retryInterval * 1e3
|
|
125
|
+
};
|
|
126
|
+
const stream = llm.chat({
|
|
127
|
+
chatCtx: super.chatCtx,
|
|
128
|
+
toolCtx: this.toolCtx,
|
|
129
|
+
connOptions,
|
|
130
|
+
parallelToolCalls: this.parallelToolCalls,
|
|
131
|
+
toolChoice: this.toolChoice,
|
|
132
|
+
extraKwargs: this.extraKwargs
|
|
133
|
+
});
|
|
134
|
+
let streamError;
|
|
135
|
+
const errorHandler = (ev) => {
|
|
136
|
+
streamError = ev.error;
|
|
137
|
+
};
|
|
138
|
+
llm.on("error", errorHandler);
|
|
139
|
+
try {
|
|
140
|
+
let shouldSetCurrent = !checkRecovery;
|
|
141
|
+
for await (const chunk of stream) {
|
|
142
|
+
if (shouldSetCurrent) {
|
|
143
|
+
shouldSetCurrent = false;
|
|
144
|
+
this._currentStream = stream;
|
|
145
|
+
}
|
|
146
|
+
yield chunk;
|
|
147
|
+
}
|
|
148
|
+
if (streamError) {
|
|
149
|
+
throw streamError;
|
|
150
|
+
}
|
|
151
|
+
} catch (error) {
|
|
152
|
+
if (error instanceof import_exceptions.APIError) {
|
|
153
|
+
if (checkRecovery) {
|
|
154
|
+
this._log.warn({ llm: llm.label(), error }, "recovery failed");
|
|
155
|
+
} else {
|
|
156
|
+
this._log.warn({ llm: llm.label(), error }, "failed, switching to next LLM");
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
161
|
+
if (checkRecovery) {
|
|
162
|
+
this._log.warn({ llm: llm.label() }, "recovery timed out");
|
|
163
|
+
} else {
|
|
164
|
+
this._log.warn({ llm: llm.label() }, "timed out, switching to next LLM");
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
if (checkRecovery) {
|
|
169
|
+
this._log.error({ llm: llm.label(), error }, "recovery unexpected error");
|
|
170
|
+
} else {
|
|
171
|
+
this._log.error({ llm: llm.label(), error }, "unexpected error, switching to next LLM");
|
|
172
|
+
}
|
|
173
|
+
throw error;
|
|
174
|
+
} finally {
|
|
175
|
+
llm.off("error", errorHandler);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Start background recovery task for an LLM.
|
|
180
|
+
*/
|
|
181
|
+
tryRecovery(llm, index) {
|
|
182
|
+
const status = this.adapter._status[index];
|
|
183
|
+
if (status.recoveringTask !== null) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const recoverTask = async () => {
|
|
187
|
+
try {
|
|
188
|
+
for await (const _chunk of this.tryGenerate(llm, true)) {
|
|
189
|
+
}
|
|
190
|
+
status.available = true;
|
|
191
|
+
this._log.info({ llm: llm.label() }, "LLM recovered");
|
|
192
|
+
this.adapter._emitAvailabilityChanged(llm, true);
|
|
193
|
+
} catch {
|
|
194
|
+
} finally {
|
|
195
|
+
status.recoveringTask = null;
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
status.recoveringTask = recoverTask();
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Main run method - iterates through LLMs with fallback logic.
|
|
202
|
+
*/
|
|
203
|
+
async run() {
|
|
204
|
+
const startTime = Date.now();
|
|
205
|
+
const allFailed = this.adapter._status.every((s) => !s.available);
|
|
206
|
+
if (allFailed) {
|
|
207
|
+
this._log.error("all LLMs are unavailable, retrying...");
|
|
208
|
+
}
|
|
209
|
+
for (let i = 0; i < this.adapter.llms.length; i++) {
|
|
210
|
+
const llm = this.adapter.llms[i];
|
|
211
|
+
const status = this.adapter._status[i];
|
|
212
|
+
this._log.debug(
|
|
213
|
+
{ llm: llm.label(), index: i, available: status.available, allFailed },
|
|
214
|
+
"checking LLM"
|
|
215
|
+
);
|
|
216
|
+
if (status.available || allFailed) {
|
|
217
|
+
let textSent = "";
|
|
218
|
+
const toolCallsSent = [];
|
|
219
|
+
try {
|
|
220
|
+
this._log.info({ llm: llm.label() }, "FallbackAdapter: Attempting provider");
|
|
221
|
+
let chunkCount = 0;
|
|
222
|
+
for await (const chunk of this.tryGenerate(llm, false)) {
|
|
223
|
+
chunkCount++;
|
|
224
|
+
if (chunk.delta) {
|
|
225
|
+
if (chunk.delta.content) {
|
|
226
|
+
textSent += chunk.delta.content;
|
|
227
|
+
}
|
|
228
|
+
if (chunk.delta.toolCalls) {
|
|
229
|
+
for (const tc of chunk.delta.toolCalls) {
|
|
230
|
+
if (tc.name) {
|
|
231
|
+
toolCallsSent.push(tc.name);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
this._log.debug({ llm: llm.label(), chunkCount }, "run: forwarding chunk to queue");
|
|
237
|
+
this.queue.put(chunk);
|
|
238
|
+
}
|
|
239
|
+
this._log.info(
|
|
240
|
+
{ llm: llm.label(), totalChunks: chunkCount, textLength: textSent.length },
|
|
241
|
+
"FallbackAdapter: Provider succeeded"
|
|
242
|
+
);
|
|
243
|
+
return;
|
|
244
|
+
} catch (error) {
|
|
245
|
+
if (status.available) {
|
|
246
|
+
status.available = false;
|
|
247
|
+
this.adapter._emitAvailabilityChanged(llm, false);
|
|
248
|
+
}
|
|
249
|
+
if (textSent || toolCallsSent.length > 0) {
|
|
250
|
+
const extra = { textSent, toolCallsSent };
|
|
251
|
+
if (!this.adapter.retryOnChunkSent) {
|
|
252
|
+
this._log.error(
|
|
253
|
+
{ llm: llm.label(), ...extra },
|
|
254
|
+
"failed after sending chunk, skip retrying. Set `retryOnChunkSent` to `true` to enable."
|
|
255
|
+
);
|
|
256
|
+
throw error;
|
|
257
|
+
}
|
|
258
|
+
this._log.warn(
|
|
259
|
+
{ llm: llm.label(), ...extra },
|
|
260
|
+
"failed after sending chunk, retrying..."
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
this.tryRecovery(llm, i);
|
|
266
|
+
}
|
|
267
|
+
const duration = (Date.now() - startTime) / 1e3;
|
|
268
|
+
const labels = this.adapter.llms.map((l) => l.label()).join(", ");
|
|
269
|
+
throw new import_exceptions.APIConnectionError({
|
|
270
|
+
message: `all LLMs failed (${labels}) after ${duration.toFixed(2)}s`
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
275
|
+
0 && (module.exports = {
|
|
276
|
+
FallbackAdapter
|
|
277
|
+
});
|
|
278
|
+
//# sourceMappingURL=fallback_adapter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/llm/fallback_adapter.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { APIConnectionError, APIError } from '../_exceptions.js';\nimport { log } from '../log.js';\nimport { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS } from '../types.js';\nimport type { ChatContext } from './chat_context.js';\nimport type { ChatChunk } from './llm.js';\nimport { LLM, LLMStream } from './llm.js';\nimport type { ToolChoice, ToolContext } from './tool_context.js';\n\n/**\n * Default connection options for FallbackAdapter.\n * Uses max_retry=0 since fallback handles retries at a higher level.\n */\nconst DEFAULT_FALLBACK_API_CONNECT_OPTIONS: APIConnectOptions = {\n maxRetry: 0,\n timeoutMs: DEFAULT_API_CONNECT_OPTIONS.timeoutMs,\n retryIntervalMs: DEFAULT_API_CONNECT_OPTIONS.retryIntervalMs,\n};\n\n/**\n * Internal status tracking for each LLM instance.\n */\ninterface LLMStatus {\n available: boolean;\n recoveringTask: Promise<void> | null;\n}\n\n/**\n * Event emitted when an LLM's availability changes.\n */\nexport interface AvailabilityChangedEvent {\n llm: LLM;\n available: boolean;\n}\n\n/**\n * Options for creating a FallbackAdapter.\n */\nexport interface FallbackAdapterOptions {\n /** List of LLM instances to fallback to (in order). */\n llms: LLM[];\n /** Timeout for each LLM attempt in seconds. Defaults to 5.0. */\n attemptTimeout?: number;\n /** Internal retries per LLM before moving to next. Defaults to 0. */\n maxRetryPerLLM?: number;\n /** Interval between retries in seconds. Defaults to 0.5. */\n retryInterval?: number;\n /** Whether to retry when LLM fails after chunks are sent. Defaults to false. */\n retryOnChunkSent?: boolean;\n}\n\n/**\n * FallbackAdapter is an LLM that can fallback to a different LLM if the current LLM fails.\n *\n * @example\n * ```typescript\n * const fallbackLLM = new FallbackAdapter({\n * llms: [primaryLLM, secondaryLLM, tertiaryLLM],\n * attemptTimeout: 5.0,\n * maxRetryPerLLM: 1,\n * });\n * ```\n */\nexport class FallbackAdapter extends LLM {\n readonly llms: LLM[];\n readonly attemptTimeout: number;\n readonly maxRetryPerLLM: number;\n readonly retryInterval: number;\n readonly retryOnChunkSent: boolean;\n\n /** @internal */\n _status: LLMStatus[];\n\n private logger = log();\n\n constructor(options: FallbackAdapterOptions) {\n super();\n\n if (!options.llms || options.llms.length < 1) {\n throw new Error('at least one LLM instance must be provided.');\n }\n\n this.llms = options.llms;\n this.attemptTimeout = options.attemptTimeout ?? 5.0;\n this.maxRetryPerLLM = options.maxRetryPerLLM ?? 0;\n this.retryInterval = options.retryInterval ?? 0.5;\n this.retryOnChunkSent = options.retryOnChunkSent ?? false;\n\n // Initialize status for each LLM\n this._status = this.llms.map(() => ({\n available: true,\n recoveringTask: null,\n }));\n\n // Forward metrics_collected events from child LLMs\n for (const llm of this.llms) {\n llm.on('metrics_collected', (metrics) => {\n this.emit('metrics_collected', metrics);\n });\n }\n }\n\n get model(): string {\n return 'FallbackAdapter';\n }\n\n label(): string {\n return 'FallbackAdapter';\n }\n\n chat(opts: {\n chatCtx: ChatContext;\n toolCtx?: ToolContext;\n connOptions?: APIConnectOptions;\n parallelToolCalls?: boolean;\n toolChoice?: ToolChoice;\n extraKwargs?: Record<string, unknown>;\n }): LLMStream {\n return new FallbackLLMStream(this, {\n chatCtx: opts.chatCtx,\n toolCtx: opts.toolCtx,\n connOptions: opts.connOptions || DEFAULT_FALLBACK_API_CONNECT_OPTIONS,\n parallelToolCalls: opts.parallelToolCalls,\n toolChoice: opts.toolChoice,\n extraKwargs: opts.extraKwargs,\n });\n }\n\n /**\n * Emit availability changed event.\n * @internal\n */\n _emitAvailabilityChanged(llm: LLM, available: boolean): void {\n const event: AvailabilityChangedEvent = { llm, available };\n // Use type assertion for custom event\n (this as unknown as { emit: (event: string, data: AvailabilityChangedEvent) => void }).emit(\n 'llm_availability_changed',\n event,\n );\n }\n}\n\n/**\n * LLMStream implementation for FallbackAdapter.\n * Handles fallback logic between multiple LLM providers.\n */\nclass FallbackLLMStream extends LLMStream {\n private adapter: FallbackAdapter;\n private parallelToolCalls?: boolean;\n private toolChoice?: ToolChoice;\n private extraKwargs?: Record<string, unknown>;\n private _currentStream?: LLMStream;\n private _log = log();\n\n constructor(\n adapter: FallbackAdapter,\n opts: {\n chatCtx: ChatContext;\n toolCtx?: ToolContext;\n connOptions: APIConnectOptions;\n parallelToolCalls?: boolean;\n toolChoice?: ToolChoice;\n extraKwargs?: Record<string, unknown>;\n },\n ) {\n super(adapter, {\n chatCtx: opts.chatCtx,\n toolCtx: opts.toolCtx,\n connOptions: opts.connOptions,\n });\n this.adapter = adapter;\n this.parallelToolCalls = opts.parallelToolCalls;\n this.toolChoice = opts.toolChoice;\n this.extraKwargs = opts.extraKwargs;\n }\n\n /**\n * Override chatCtx to return current stream's context if available.\n */\n override get chatCtx(): ChatContext {\n return this._currentStream?.chatCtx ?? super.chatCtx;\n }\n\n /**\n * Try to generate with a single LLM.\n * Returns an async generator that yields chunks.\n */\n private async *tryGenerate(\n llm: LLM,\n checkRecovery: boolean = false,\n ): AsyncGenerator<ChatChunk, void, unknown> {\n const connOptions: APIConnectOptions = {\n ...this.connOptions,\n maxRetry: this.adapter.maxRetryPerLLM,\n timeoutMs: this.adapter.attemptTimeout * 1000,\n retryIntervalMs: this.adapter.retryInterval * 1000,\n };\n\n const stream = llm.chat({\n chatCtx: super.chatCtx,\n toolCtx: this.toolCtx,\n connOptions,\n parallelToolCalls: this.parallelToolCalls,\n toolChoice: this.toolChoice,\n extraKwargs: this.extraKwargs,\n });\n\n // Listen for error events - child LLMs emit errors via their LLM instance, not the stream\n let streamError: Error | undefined;\n const errorHandler = (ev: { error: Error }) => {\n streamError = ev.error;\n };\n llm.on('error', errorHandler);\n\n try {\n let shouldSetCurrent = !checkRecovery;\n for await (const chunk of stream) {\n if (shouldSetCurrent) {\n shouldSetCurrent = false;\n this._currentStream = stream;\n }\n yield chunk;\n }\n\n // If an error was emitted but not thrown through iteration, throw it now\n if (streamError) {\n throw streamError;\n }\n } catch (error) {\n if (error instanceof APIError) {\n if (checkRecovery) {\n this._log.warn({ llm: llm.label(), error }, 'recovery failed');\n } else {\n this._log.warn({ llm: llm.label(), error }, 'failed, switching to next LLM');\n }\n throw error;\n }\n\n // Handle timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n if (checkRecovery) {\n this._log.warn({ llm: llm.label() }, 'recovery timed out');\n } else {\n this._log.warn({ llm: llm.label() }, 'timed out, switching to next LLM');\n }\n throw error;\n }\n\n // Unexpected error\n if (checkRecovery) {\n this._log.error({ llm: llm.label(), error }, 'recovery unexpected error');\n } else {\n this._log.error({ llm: llm.label(), error }, 'unexpected error, switching to next LLM');\n }\n throw error;\n } finally {\n llm.off('error', errorHandler);\n }\n }\n\n /**\n * Start background recovery task for an LLM.\n */\n private tryRecovery(llm: LLM, index: number): void {\n const status = this.adapter._status[index]!;\n\n // Skip if already recovering\n if (status.recoveringTask !== null) {\n return;\n }\n\n const recoverTask = async (): Promise<void> => {\n try {\n // Try to generate (just iterate to check if it works)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _chunk of this.tryGenerate(llm, true)) {\n // Just consume the stream to verify it works\n }\n\n // Recovery successful\n status.available = true;\n this._log.info({ llm: llm.label() }, 'LLM recovered');\n this.adapter._emitAvailabilityChanged(llm, true);\n } catch {\n // Recovery failed, stay unavailable\n } finally {\n status.recoveringTask = null;\n }\n };\n\n // Fire and forget\n status.recoveringTask = recoverTask();\n }\n\n /**\n * Main run method - iterates through LLMs with fallback logic.\n */\n protected async run(): Promise<void> {\n const startTime = Date.now();\n\n // Check if all LLMs are unavailable\n const allFailed = this.adapter._status.every((s) => !s.available);\n if (allFailed) {\n this._log.error('all LLMs are unavailable, retrying...');\n }\n\n for (let i = 0; i < this.adapter.llms.length; i++) {\n const llm = this.adapter.llms[i]!;\n const status = this.adapter._status[i]!;\n\n this._log.debug(\n { llm: llm.label(), index: i, available: status.available, allFailed },\n 'checking LLM',\n );\n\n if (status.available || allFailed) {\n let textSent = '';\n const toolCallsSent: string[] = [];\n\n try {\n this._log.info({ llm: llm.label() }, 'FallbackAdapter: Attempting provider');\n\n let chunkCount = 0;\n for await (const chunk of this.tryGenerate(llm, false)) {\n chunkCount++;\n // Track what's been sent\n if (chunk.delta) {\n if (chunk.delta.content) {\n textSent += chunk.delta.content;\n }\n if (chunk.delta.toolCalls) {\n for (const tc of chunk.delta.toolCalls) {\n if (tc.name) {\n toolCallsSent.push(tc.name);\n }\n }\n }\n }\n\n // Forward chunk to queue\n this._log.debug({ llm: llm.label(), chunkCount }, 'run: forwarding chunk to queue');\n this.queue.put(chunk);\n }\n\n // Success!\n this._log.info(\n { llm: llm.label(), totalChunks: chunkCount, textLength: textSent.length },\n 'FallbackAdapter: Provider succeeded',\n );\n return;\n } catch (error) {\n // Mark as unavailable if it was available before\n if (status.available) {\n status.available = false;\n this.adapter._emitAvailabilityChanged(llm, false);\n }\n\n // Check if we sent data before failing\n if (textSent || toolCallsSent.length > 0) {\n const extra = { textSent, toolCallsSent };\n\n if (!this.adapter.retryOnChunkSent) {\n this._log.error(\n { llm: llm.label(), ...extra },\n 'failed after sending chunk, skip retrying. Set `retryOnChunkSent` to `true` to enable.',\n );\n throw error;\n }\n\n this._log.warn(\n { llm: llm.label(), ...extra },\n 'failed after sending chunk, retrying...',\n );\n }\n }\n }\n\n // Trigger background recovery for this LLM\n this.tryRecovery(llm, i);\n }\n\n // All LLMs failed\n const duration = (Date.now() - startTime) / 1000;\n const labels = this.adapter.llms.map((l) => l.label()).join(', ');\n throw new APIConnectionError({\n message: `all LLMs failed (${labels}) after ${duration.toFixed(2)}s`,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAA6C;AAC7C,iBAAoB;AACpB,mBAAoE;AAGpE,iBAA+B;AAO/B,MAAM,uCAA0D;AAAA,EAC9D,UAAU;AAAA,EACV,WAAW,yCAA4B;AAAA,EACvC,iBAAiB,yCAA4B;AAC/C;AA8CO,MAAM,wBAAwB,eAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGT;AAAA,EAEQ,aAAS,gBAAI;AAAA,EAErB,YAAY,SAAiC;AAC3C,UAAM;AAEN,QAAI,CAAC,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC5C,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,SAAK,OAAO,QAAQ;AACpB,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,mBAAmB,QAAQ,oBAAoB;AAGpD,SAAK,UAAU,KAAK,KAAK,IAAI,OAAO;AAAA,MAClC,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,EAAE;AAGF,eAAW,OAAO,KAAK,MAAM;AAC3B,UAAI,GAAG,qBAAqB,CAAC,YAAY;AACvC,aAAK,KAAK,qBAAqB,OAAO;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,QAAgB;AACd,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,MAOS;AACZ,WAAO,IAAI,kBAAkB,MAAM;AAAA,MACjC,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,aAAa,KAAK,eAAe;AAAA,MACjC,mBAAmB,KAAK;AAAA,MACxB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAyB,KAAU,WAA0B;AAC3D,UAAM,QAAkC,EAAE,KAAK,UAAU;AAEzD,IAAC,KAAsF;AAAA,MACrF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,MAAM,0BAA0B,qBAAU;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAO,gBAAI;AAAA,EAEnB,YACE,SACA,MAQA;AACA,UAAM,SAAS;AAAA,MACb,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,IACpB,CAAC;AACD,SAAK,UAAU;AACf,SAAK,oBAAoB,KAAK;AAC9B,SAAK,aAAa,KAAK;AACvB,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAa,UAAuB;AArLtC;AAsLI,aAAO,UAAK,mBAAL,mBAAqB,YAAW,MAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,YACb,KACA,gBAAyB,OACiB;AAC1C,UAAM,cAAiC;AAAA,MACrC,GAAG,KAAK;AAAA,MACR,UAAU,KAAK,QAAQ;AAAA,MACvB,WAAW,KAAK,QAAQ,iBAAiB;AAAA,MACzC,iBAAiB,KAAK,QAAQ,gBAAgB;AAAA,IAChD;AAEA,UAAM,SAAS,IAAI,KAAK;AAAA,MACtB,SAAS,MAAM;AAAA,MACf,SAAS,KAAK;AAAA,MACd;AAAA,MACA,mBAAmB,KAAK;AAAA,MACxB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,IACpB,CAAC;AAGD,QAAI;AACJ,UAAM,eAAe,CAAC,OAAyB;AAC7C,oBAAc,GAAG;AAAA,IACnB;AACA,QAAI,GAAG,SAAS,YAAY;AAE5B,QAAI;AACF,UAAI,mBAAmB,CAAC;AACxB,uBAAiB,SAAS,QAAQ;AAChC,YAAI,kBAAkB;AACpB,6BAAmB;AACnB,eAAK,iBAAiB;AAAA,QACxB;AACA,cAAM;AAAA,MACR;AAGA,UAAI,aAAa;AACf,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,4BAAU;AAC7B,YAAI,eAAe;AACjB,eAAK,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,iBAAiB;AAAA,QAC/D,OAAO;AACL,eAAK,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,+BAA+B;AAAA,QAC7E;AACA,cAAM;AAAA,MACR;AAGA,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,YAAI,eAAe;AACjB,eAAK,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,GAAG,oBAAoB;AAAA,QAC3D,OAAO;AACL,eAAK,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,GAAG,kCAAkC;AAAA,QACzE;AACA,cAAM;AAAA,MACR;AAGA,UAAI,eAAe;AACjB,aAAK,KAAK,MAAM,EAAE,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,2BAA2B;AAAA,MAC1E,OAAO;AACL,aAAK,KAAK,MAAM,EAAE,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,yCAAyC;AAAA,MACxF;AACA,YAAM;AAAA,IACR,UAAE;AACA,UAAI,IAAI,SAAS,YAAY;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAU,OAAqB;AACjD,UAAM,SAAS,KAAK,QAAQ,QAAQ,KAAK;AAGzC,QAAI,OAAO,mBAAmB,MAAM;AAClC;AAAA,IACF;AAEA,UAAM,cAAc,YAA2B;AAC7C,UAAI;AAGF,yBAAiB,UAAU,KAAK,YAAY,KAAK,IAAI,GAAG;AAAA,QAExD;AAGA,eAAO,YAAY;AACnB,aAAK,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,GAAG,eAAe;AACpD,aAAK,QAAQ,yBAAyB,KAAK,IAAI;AAAA,MACjD,QAAQ;AAAA,MAER,UAAE;AACA,eAAO,iBAAiB;AAAA,MAC1B;AAAA,IACF;AAGA,WAAO,iBAAiB,YAAY;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,MAAqB;AACnC,UAAM,YAAY,KAAK,IAAI;AAG3B,UAAM,YAAY,KAAK,QAAQ,QAAQ,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS;AAChE,QAAI,WAAW;AACb,WAAK,KAAK,MAAM,uCAAuC;AAAA,IACzD;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,QAAQ,KAAK;AACjD,YAAM,MAAM,KAAK,QAAQ,KAAK,CAAC;AAC/B,YAAM,SAAS,KAAK,QAAQ,QAAQ,CAAC;AAErC,WAAK,KAAK;AAAA,QACR,EAAE,KAAK,IAAI,MAAM,GAAG,OAAO,GAAG,WAAW,OAAO,WAAW,UAAU;AAAA,QACrE;AAAA,MACF;AAEA,UAAI,OAAO,aAAa,WAAW;AACjC,YAAI,WAAW;AACf,cAAM,gBAA0B,CAAC;AAEjC,YAAI;AACF,eAAK,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,EAAE,GAAG,sCAAsC;AAE3E,cAAI,aAAa;AACjB,2BAAiB,SAAS,KAAK,YAAY,KAAK,KAAK,GAAG;AACtD;AAEA,gBAAI,MAAM,OAAO;AACf,kBAAI,MAAM,MAAM,SAAS;AACvB,4BAAY,MAAM,MAAM;AAAA,cAC1B;AACA,kBAAI,MAAM,MAAM,WAAW;AACzB,2BAAW,MAAM,MAAM,MAAM,WAAW;AACtC,sBAAI,GAAG,MAAM;AACX,kCAAc,KAAK,GAAG,IAAI;AAAA,kBAC5B;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,iBAAK,KAAK,MAAM,EAAE,KAAK,IAAI,MAAM,GAAG,WAAW,GAAG,gCAAgC;AAClF,iBAAK,MAAM,IAAI,KAAK;AAAA,UACtB;AAGA,eAAK,KAAK;AAAA,YACR,EAAE,KAAK,IAAI,MAAM,GAAG,aAAa,YAAY,YAAY,SAAS,OAAO;AAAA,YACzE;AAAA,UACF;AACA;AAAA,QACF,SAAS,OAAO;AAEd,cAAI,OAAO,WAAW;AACpB,mBAAO,YAAY;AACnB,iBAAK,QAAQ,yBAAyB,KAAK,KAAK;AAAA,UAClD;AAGA,cAAI,YAAY,cAAc,SAAS,GAAG;AACxC,kBAAM,QAAQ,EAAE,UAAU,cAAc;AAExC,gBAAI,CAAC,KAAK,QAAQ,kBAAkB;AAClC,mBAAK,KAAK;AAAA,gBACR,EAAE,KAAK,IAAI,MAAM,GAAG,GAAG,MAAM;AAAA,gBAC7B;AAAA,cACF;AACA,oBAAM;AAAA,YACR;AAEA,iBAAK,KAAK;AAAA,cACR,EAAE,KAAK,IAAI,MAAM,GAAG,GAAG,MAAM;AAAA,cAC7B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,WAAK,YAAY,KAAK,CAAC;AAAA,IACzB;AAGA,UAAM,YAAY,KAAK,IAAI,IAAI,aAAa;AAC5C,UAAM,SAAS,KAAK,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI;AAChE,UAAM,IAAI,qCAAmB;AAAA,MAC3B,SAAS,oBAAoB,MAAM,WAAW,SAAS,QAAQ,CAAC,CAAC;AAAA,IACnE,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type APIConnectOptions } from '../types.js';
|
|
2
|
+
import type { ChatContext } from './chat_context.js';
|
|
3
|
+
import { LLM, LLMStream } from './llm.js';
|
|
4
|
+
import type { ToolChoice, ToolContext } from './tool_context.js';
|
|
5
|
+
/**
|
|
6
|
+
* Internal status tracking for each LLM instance.
|
|
7
|
+
*/
|
|
8
|
+
interface LLMStatus {
|
|
9
|
+
available: boolean;
|
|
10
|
+
recoveringTask: Promise<void> | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Event emitted when an LLM's availability changes.
|
|
14
|
+
*/
|
|
15
|
+
export interface AvailabilityChangedEvent {
|
|
16
|
+
llm: LLM;
|
|
17
|
+
available: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for creating a FallbackAdapter.
|
|
21
|
+
*/
|
|
22
|
+
export interface FallbackAdapterOptions {
|
|
23
|
+
/** List of LLM instances to fallback to (in order). */
|
|
24
|
+
llms: LLM[];
|
|
25
|
+
/** Timeout for each LLM attempt in seconds. Defaults to 5.0. */
|
|
26
|
+
attemptTimeout?: number;
|
|
27
|
+
/** Internal retries per LLM before moving to next. Defaults to 0. */
|
|
28
|
+
maxRetryPerLLM?: number;
|
|
29
|
+
/** Interval between retries in seconds. Defaults to 0.5. */
|
|
30
|
+
retryInterval?: number;
|
|
31
|
+
/** Whether to retry when LLM fails after chunks are sent. Defaults to false. */
|
|
32
|
+
retryOnChunkSent?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* FallbackAdapter is an LLM that can fallback to a different LLM if the current LLM fails.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const fallbackLLM = new FallbackAdapter({
|
|
40
|
+
* llms: [primaryLLM, secondaryLLM, tertiaryLLM],
|
|
41
|
+
* attemptTimeout: 5.0,
|
|
42
|
+
* maxRetryPerLLM: 1,
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class FallbackAdapter extends LLM {
|
|
47
|
+
readonly llms: LLM[];
|
|
48
|
+
readonly attemptTimeout: number;
|
|
49
|
+
readonly maxRetryPerLLM: number;
|
|
50
|
+
readonly retryInterval: number;
|
|
51
|
+
readonly retryOnChunkSent: boolean;
|
|
52
|
+
/** @internal */
|
|
53
|
+
_status: LLMStatus[];
|
|
54
|
+
private logger;
|
|
55
|
+
constructor(options: FallbackAdapterOptions);
|
|
56
|
+
get model(): string;
|
|
57
|
+
label(): string;
|
|
58
|
+
chat(opts: {
|
|
59
|
+
chatCtx: ChatContext;
|
|
60
|
+
toolCtx?: ToolContext;
|
|
61
|
+
connOptions?: APIConnectOptions;
|
|
62
|
+
parallelToolCalls?: boolean;
|
|
63
|
+
toolChoice?: ToolChoice;
|
|
64
|
+
extraKwargs?: Record<string, unknown>;
|
|
65
|
+
}): LLMStream;
|
|
66
|
+
/**
|
|
67
|
+
* Emit availability changed event.
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
_emitAvailabilityChanged(llm: LLM, available: boolean): void;
|
|
71
|
+
}
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=fallback_adapter.d.ts.map
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type APIConnectOptions } from '../types.js';
|
|
2
|
+
import type { ChatContext } from './chat_context.js';
|
|
3
|
+
import { LLM, LLMStream } from './llm.js';
|
|
4
|
+
import type { ToolChoice, ToolContext } from './tool_context.js';
|
|
5
|
+
/**
|
|
6
|
+
* Internal status tracking for each LLM instance.
|
|
7
|
+
*/
|
|
8
|
+
interface LLMStatus {
|
|
9
|
+
available: boolean;
|
|
10
|
+
recoveringTask: Promise<void> | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Event emitted when an LLM's availability changes.
|
|
14
|
+
*/
|
|
15
|
+
export interface AvailabilityChangedEvent {
|
|
16
|
+
llm: LLM;
|
|
17
|
+
available: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for creating a FallbackAdapter.
|
|
21
|
+
*/
|
|
22
|
+
export interface FallbackAdapterOptions {
|
|
23
|
+
/** List of LLM instances to fallback to (in order). */
|
|
24
|
+
llms: LLM[];
|
|
25
|
+
/** Timeout for each LLM attempt in seconds. Defaults to 5.0. */
|
|
26
|
+
attemptTimeout?: number;
|
|
27
|
+
/** Internal retries per LLM before moving to next. Defaults to 0. */
|
|
28
|
+
maxRetryPerLLM?: number;
|
|
29
|
+
/** Interval between retries in seconds. Defaults to 0.5. */
|
|
30
|
+
retryInterval?: number;
|
|
31
|
+
/** Whether to retry when LLM fails after chunks are sent. Defaults to false. */
|
|
32
|
+
retryOnChunkSent?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* FallbackAdapter is an LLM that can fallback to a different LLM if the current LLM fails.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const fallbackLLM = new FallbackAdapter({
|
|
40
|
+
* llms: [primaryLLM, secondaryLLM, tertiaryLLM],
|
|
41
|
+
* attemptTimeout: 5.0,
|
|
42
|
+
* maxRetryPerLLM: 1,
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class FallbackAdapter extends LLM {
|
|
47
|
+
readonly llms: LLM[];
|
|
48
|
+
readonly attemptTimeout: number;
|
|
49
|
+
readonly maxRetryPerLLM: number;
|
|
50
|
+
readonly retryInterval: number;
|
|
51
|
+
readonly retryOnChunkSent: boolean;
|
|
52
|
+
/** @internal */
|
|
53
|
+
_status: LLMStatus[];
|
|
54
|
+
private logger;
|
|
55
|
+
constructor(options: FallbackAdapterOptions);
|
|
56
|
+
get model(): string;
|
|
57
|
+
label(): string;
|
|
58
|
+
chat(opts: {
|
|
59
|
+
chatCtx: ChatContext;
|
|
60
|
+
toolCtx?: ToolContext;
|
|
61
|
+
connOptions?: APIConnectOptions;
|
|
62
|
+
parallelToolCalls?: boolean;
|
|
63
|
+
toolChoice?: ToolChoice;
|
|
64
|
+
extraKwargs?: Record<string, unknown>;
|
|
65
|
+
}): LLMStream;
|
|
66
|
+
/**
|
|
67
|
+
* Emit availability changed event.
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
_emitAvailabilityChanged(llm: LLM, available: boolean): void;
|
|
71
|
+
}
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=fallback_adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback_adapter.d.ts","sourceRoot":"","sources":["../../src/llm/fallback_adapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,iBAAiB,EAA+B,MAAM,aAAa,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYjE;;GAEG;AACH,UAAU,SAAS;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,SAAQ,GAAG;IACtC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IAEnC,gBAAgB;IAChB,OAAO,EAAE,SAAS,EAAE,CAAC;IAErB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,sBAAsB;IA2B3C,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,KAAK,IAAI,MAAM;IAIf,IAAI,CAAC,IAAI,EAAE;QACT,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,OAAO,CAAC,CAAC;KACvC,GAAG,SAAS;IAWb;;;OAGG;IACH,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;CAQ7D"}
|