@livekit/agents 1.0.47 → 1.1.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/beta/index.cjs +29 -0
- package/dist/beta/index.cjs.map +1 -0
- package/dist/beta/index.d.cts +2 -0
- package/dist/beta/index.d.ts +2 -0
- package/dist/beta/index.d.ts.map +1 -0
- package/dist/beta/index.js +7 -0
- package/dist/beta/index.js.map +1 -0
- package/dist/beta/workflows/index.cjs +29 -0
- package/dist/beta/workflows/index.cjs.map +1 -0
- package/dist/beta/workflows/index.d.cts +2 -0
- package/dist/beta/workflows/index.d.ts +2 -0
- package/dist/beta/workflows/index.d.ts.map +1 -0
- package/dist/beta/workflows/index.js +7 -0
- package/dist/beta/workflows/index.js.map +1 -0
- package/dist/beta/workflows/task_group.cjs +162 -0
- package/dist/beta/workflows/task_group.cjs.map +1 -0
- package/dist/beta/workflows/task_group.d.cts +32 -0
- package/dist/beta/workflows/task_group.d.ts +32 -0
- package/dist/beta/workflows/task_group.d.ts.map +1 -0
- package/dist/beta/workflows/task_group.js +138 -0
- package/dist/beta/workflows/task_group.js.map +1 -0
- package/dist/constants.cjs +27 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +9 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/inference/api_protos.d.cts +12 -12
- package/dist/inference/api_protos.d.ts +12 -12
- package/dist/inference/interruption/defaults.cjs +81 -0
- package/dist/inference/interruption/defaults.cjs.map +1 -0
- package/dist/inference/interruption/defaults.d.cts +19 -0
- package/dist/inference/interruption/defaults.d.ts +19 -0
- package/dist/inference/interruption/defaults.d.ts.map +1 -0
- package/dist/inference/interruption/defaults.js +46 -0
- package/dist/inference/interruption/defaults.js.map +1 -0
- package/dist/inference/interruption/errors.cjs +44 -0
- package/dist/inference/interruption/errors.cjs.map +1 -0
- package/dist/inference/interruption/errors.d.cts +12 -0
- package/dist/inference/interruption/errors.d.ts +12 -0
- package/dist/inference/interruption/errors.d.ts.map +1 -0
- package/dist/inference/interruption/errors.js +20 -0
- package/dist/inference/interruption/errors.js.map +1 -0
- package/dist/inference/interruption/http_transport.cjs +147 -0
- package/dist/inference/interruption/http_transport.cjs.map +1 -0
- package/dist/inference/interruption/http_transport.d.cts +63 -0
- package/dist/inference/interruption/http_transport.d.ts +63 -0
- package/dist/inference/interruption/http_transport.d.ts.map +1 -0
- package/dist/inference/interruption/http_transport.js +121 -0
- package/dist/inference/interruption/http_transport.js.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
- package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
- package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
- package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_cache_entry.js +34 -0
- package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
- package/dist/inference/interruption/interruption_detector.cjs +181 -0
- package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
- package/dist/inference/interruption/interruption_detector.d.cts +59 -0
- package/dist/inference/interruption/interruption_detector.d.ts +59 -0
- package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_detector.js +147 -0
- package/dist/inference/interruption/interruption_detector.js.map +1 -0
- package/dist/inference/interruption/interruption_stream.cjs +368 -0
- package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
- package/dist/inference/interruption/interruption_stream.d.cts +46 -0
- package/dist/inference/interruption/interruption_stream.d.ts +46 -0
- package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
- package/dist/inference/interruption/interruption_stream.js +344 -0
- package/dist/inference/interruption/interruption_stream.js.map +1 -0
- package/dist/inference/interruption/types.cjs +17 -0
- package/dist/inference/interruption/types.cjs.map +1 -0
- package/dist/inference/interruption/types.d.cts +66 -0
- package/dist/inference/interruption/types.d.ts +66 -0
- package/dist/inference/interruption/types.d.ts.map +1 -0
- package/dist/inference/interruption/types.js +1 -0
- package/dist/inference/interruption/types.js.map +1 -0
- package/dist/inference/interruption/utils.cjs +130 -0
- package/dist/inference/interruption/utils.cjs.map +1 -0
- package/dist/inference/interruption/utils.d.cts +41 -0
- package/dist/inference/interruption/utils.d.ts +41 -0
- package/dist/inference/interruption/utils.d.ts.map +1 -0
- package/dist/inference/interruption/utils.js +105 -0
- package/dist/inference/interruption/utils.js.map +1 -0
- package/dist/inference/interruption/utils.test.cjs +105 -0
- package/dist/inference/interruption/utils.test.cjs.map +1 -0
- package/dist/inference/interruption/utils.test.js +104 -0
- package/dist/inference/interruption/utils.test.js.map +1 -0
- package/dist/inference/interruption/ws_transport.cjs +329 -0
- package/dist/inference/interruption/ws_transport.cjs.map +1 -0
- package/dist/inference/interruption/ws_transport.d.cts +33 -0
- package/dist/inference/interruption/ws_transport.d.ts +33 -0
- package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
- package/dist/inference/interruption/ws_transport.js +295 -0
- package/dist/inference/interruption/ws_transport.js.map +1 -0
- package/dist/inference/llm.cjs +14 -10
- package/dist/inference/llm.cjs.map +1 -1
- package/dist/inference/llm.d.cts +2 -1
- package/dist/inference/llm.d.ts +2 -1
- package/dist/inference/llm.d.ts.map +1 -1
- package/dist/inference/llm.js +8 -10
- package/dist/inference/llm.js.map +1 -1
- package/dist/inference/stt.cjs +7 -2
- package/dist/inference/stt.cjs.map +1 -1
- package/dist/inference/stt.d.cts +2 -0
- package/dist/inference/stt.d.ts +2 -0
- package/dist/inference/stt.d.ts.map +1 -1
- package/dist/inference/stt.js +8 -3
- package/dist/inference/stt.js.map +1 -1
- package/dist/inference/tts.cjs +7 -2
- package/dist/inference/tts.cjs.map +1 -1
- package/dist/inference/tts.d.cts +2 -0
- package/dist/inference/tts.d.ts +2 -0
- package/dist/inference/tts.d.ts.map +1 -1
- package/dist/inference/tts.js +8 -3
- package/dist/inference/tts.js.map +1 -1
- package/dist/inference/utils.cjs +26 -7
- package/dist/inference/utils.cjs.map +1 -1
- package/dist/inference/utils.d.cts +13 -0
- package/dist/inference/utils.d.ts +13 -0
- package/dist/inference/utils.d.ts.map +1 -1
- package/dist/inference/utils.js +18 -2
- package/dist/inference/utils.js.map +1 -1
- package/dist/llm/chat_context.cjs +108 -2
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +28 -1
- package/dist/llm/chat_context.d.ts +28 -1
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +108 -2
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/chat_context.test.cjs +43 -0
- package/dist/llm/chat_context.test.cjs.map +1 -1
- package/dist/llm/chat_context.test.js +43 -0
- package/dist/llm/chat_context.test.js.map +1 -1
- package/dist/llm/index.cjs +2 -0
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +2 -2
- package/dist/llm/index.d.ts +2 -2
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +3 -1
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +16 -1
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.cts +9 -0
- package/dist/llm/llm.d.ts +9 -0
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +16 -1
- package/dist/llm/llm.js.map +1 -1
- package/dist/llm/provider_format/index.d.cts +1 -1
- package/dist/llm/provider_format/index.d.ts +1 -1
- package/dist/llm/realtime.cjs +3 -0
- package/dist/llm/realtime.cjs.map +1 -1
- package/dist/llm/realtime.d.cts +1 -0
- package/dist/llm/realtime.d.ts +1 -0
- package/dist/llm/realtime.d.ts.map +1 -1
- package/dist/llm/realtime.js +3 -0
- package/dist/llm/realtime.js.map +1 -1
- package/dist/llm/tool_context.cjs +7 -0
- package/dist/llm/tool_context.cjs.map +1 -1
- package/dist/llm/tool_context.d.cts +10 -2
- package/dist/llm/tool_context.d.ts +10 -2
- package/dist/llm/tool_context.d.ts.map +1 -1
- package/dist/llm/tool_context.js +6 -0
- package/dist/llm/tool_context.js.map +1 -1
- package/dist/metrics/base.cjs.map +1 -1
- package/dist/metrics/base.d.cts +45 -1
- package/dist/metrics/base.d.ts +45 -1
- package/dist/metrics/base.d.ts.map +1 -1
- package/dist/metrics/index.cjs +5 -0
- package/dist/metrics/index.cjs.map +1 -1
- package/dist/metrics/index.d.cts +2 -1
- package/dist/metrics/index.d.ts +2 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +6 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/model_usage.cjs +189 -0
- package/dist/metrics/model_usage.cjs.map +1 -0
- package/dist/metrics/model_usage.d.cts +92 -0
- package/dist/metrics/model_usage.d.ts +92 -0
- package/dist/metrics/model_usage.d.ts.map +1 -0
- package/dist/metrics/model_usage.js +164 -0
- package/dist/metrics/model_usage.js.map +1 -0
- package/dist/metrics/model_usage.test.cjs +474 -0
- package/dist/metrics/model_usage.test.cjs.map +1 -0
- package/dist/metrics/model_usage.test.js +476 -0
- package/dist/metrics/model_usage.test.js.map +1 -0
- package/dist/metrics/usage_collector.cjs +3 -0
- package/dist/metrics/usage_collector.cjs.map +1 -1
- package/dist/metrics/usage_collector.d.cts +9 -0
- package/dist/metrics/usage_collector.d.ts +9 -0
- package/dist/metrics/usage_collector.d.ts.map +1 -1
- package/dist/metrics/usage_collector.js +3 -0
- package/dist/metrics/usage_collector.js.map +1 -1
- package/dist/metrics/utils.cjs +9 -0
- package/dist/metrics/utils.cjs.map +1 -1
- package/dist/metrics/utils.d.ts.map +1 -1
- package/dist/metrics/utils.js +9 -0
- package/dist/metrics/utils.js.map +1 -1
- package/dist/stream/multi_input_stream.test.cjs +4 -0
- package/dist/stream/multi_input_stream.test.cjs.map +1 -1
- package/dist/stream/multi_input_stream.test.js +5 -1
- package/dist/stream/multi_input_stream.test.js.map +1 -1
- package/dist/stream/stream_channel.cjs +31 -0
- package/dist/stream/stream_channel.cjs.map +1 -1
- package/dist/stream/stream_channel.d.cts +4 -2
- package/dist/stream/stream_channel.d.ts +4 -2
- package/dist/stream/stream_channel.d.ts.map +1 -1
- package/dist/stream/stream_channel.js +31 -0
- package/dist/stream/stream_channel.js.map +1 -1
- package/dist/stt/stt.cjs +34 -2
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.cts +22 -0
- package/dist/stt/stt.d.ts +22 -0
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +34 -2
- package/dist/stt/stt.js.map +1 -1
- package/dist/telemetry/otel_http_exporter.cjs +24 -5
- package/dist/telemetry/otel_http_exporter.cjs.map +1 -1
- package/dist/telemetry/otel_http_exporter.d.cts +1 -0
- package/dist/telemetry/otel_http_exporter.d.ts +1 -0
- package/dist/telemetry/otel_http_exporter.d.ts.map +1 -1
- package/dist/telemetry/otel_http_exporter.js +24 -5
- package/dist/telemetry/otel_http_exporter.js.map +1 -1
- package/dist/telemetry/trace_types.cjs +5 -5
- package/dist/telemetry/trace_types.cjs.map +1 -1
- package/dist/telemetry/trace_types.d.cts +9 -5
- package/dist/telemetry/trace_types.d.ts +9 -5
- package/dist/telemetry/trace_types.d.ts.map +1 -1
- package/dist/telemetry/trace_types.js +5 -5
- package/dist/telemetry/trace_types.js.map +1 -1
- package/dist/telemetry/traces.cjs +47 -8
- package/dist/telemetry/traces.cjs.map +1 -1
- package/dist/telemetry/traces.d.ts.map +1 -1
- package/dist/telemetry/traces.js +47 -8
- package/dist/telemetry/traces.js.map +1 -1
- package/dist/tts/tts.cjs +64 -2
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.cts +34 -0
- package/dist/tts/tts.d.ts +34 -0
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +64 -2
- package/dist/tts/tts.js.map +1 -1
- package/dist/utils.cjs +1 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -0
- package/dist/utils.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/dist/voice/agent.cjs +34 -4
- package/dist/voice/agent.cjs.map +1 -1
- package/dist/voice/agent.d.cts +11 -2
- package/dist/voice/agent.d.ts +11 -2
- package/dist/voice/agent.d.ts.map +1 -1
- package/dist/voice/agent.js +34 -4
- package/dist/voice/agent.js.map +1 -1
- package/dist/voice/agent_activity.cjs +292 -44
- package/dist/voice/agent_activity.cjs.map +1 -1
- package/dist/voice/agent_activity.d.cts +27 -6
- package/dist/voice/agent_activity.d.ts +27 -6
- package/dist/voice/agent_activity.d.ts.map +1 -1
- package/dist/voice/agent_activity.js +293 -45
- package/dist/voice/agent_activity.js.map +1 -1
- package/dist/voice/agent_session.cjs +105 -48
- package/dist/voice/agent_session.cjs.map +1 -1
- package/dist/voice/agent_session.d.cts +90 -20
- package/dist/voice/agent_session.d.ts +90 -20
- package/dist/voice/agent_session.d.ts.map +1 -1
- package/dist/voice/agent_session.js +105 -46
- package/dist/voice/agent_session.js.map +1 -1
- package/dist/voice/audio_recognition.cjs +287 -6
- package/dist/voice/audio_recognition.cjs.map +1 -1
- package/dist/voice/audio_recognition.d.cts +42 -3
- package/dist/voice/audio_recognition.d.ts +42 -3
- package/dist/voice/audio_recognition.d.ts.map +1 -1
- package/dist/voice/audio_recognition.js +289 -7
- package/dist/voice/audio_recognition.js.map +1 -1
- package/dist/voice/client_events.cjs +554 -0
- package/dist/voice/client_events.cjs.map +1 -0
- package/dist/voice/client_events.d.cts +195 -0
- package/dist/voice/client_events.d.ts +195 -0
- package/dist/voice/client_events.d.ts.map +1 -0
- package/dist/voice/client_events.js +548 -0
- package/dist/voice/client_events.js.map +1 -0
- package/dist/voice/events.cjs +1 -0
- package/dist/voice/events.cjs.map +1 -1
- package/dist/voice/events.d.cts +8 -5
- package/dist/voice/events.d.ts +8 -5
- package/dist/voice/events.d.ts.map +1 -1
- package/dist/voice/events.js +1 -0
- package/dist/voice/events.js.map +1 -1
- package/dist/voice/generation.cjs +43 -8
- package/dist/voice/generation.cjs.map +1 -1
- package/dist/voice/generation.d.cts +3 -3
- package/dist/voice/generation.d.ts +3 -3
- package/dist/voice/generation.d.ts.map +1 -1
- package/dist/voice/generation.js +43 -8
- package/dist/voice/generation.js.map +1 -1
- package/dist/voice/index.cjs +1 -0
- package/dist/voice/index.cjs.map +1 -1
- package/dist/voice/index.d.cts +1 -0
- package/dist/voice/index.d.ts +1 -0
- package/dist/voice/index.d.ts.map +1 -1
- package/dist/voice/index.js +1 -0
- package/dist/voice/index.js.map +1 -1
- package/dist/voice/report.cjs +20 -8
- package/dist/voice/report.cjs.map +1 -1
- package/dist/voice/report.d.cts +5 -0
- package/dist/voice/report.d.ts +5 -0
- package/dist/voice/report.d.ts.map +1 -1
- package/dist/voice/report.js +20 -8
- package/dist/voice/report.js.map +1 -1
- package/dist/voice/report.test.cjs +106 -0
- package/dist/voice/report.test.cjs.map +1 -0
- package/dist/voice/report.test.js +105 -0
- package/dist/voice/report.test.js.map +1 -0
- package/dist/voice/room_io/room_io.cjs +16 -41
- package/dist/voice/room_io/room_io.cjs.map +1 -1
- package/dist/voice/room_io/room_io.d.cts +4 -9
- package/dist/voice/room_io/room_io.d.ts +4 -9
- package/dist/voice/room_io/room_io.d.ts.map +1 -1
- package/dist/voice/room_io/room_io.js +17 -43
- package/dist/voice/room_io/room_io.js.map +1 -1
- package/dist/voice/testing/fake_llm.cjs +127 -0
- package/dist/voice/testing/fake_llm.cjs.map +1 -0
- package/dist/voice/testing/fake_llm.d.cts +30 -0
- package/dist/voice/testing/fake_llm.d.ts +30 -0
- package/dist/voice/testing/fake_llm.d.ts.map +1 -0
- package/dist/voice/testing/fake_llm.js +103 -0
- package/dist/voice/testing/fake_llm.js.map +1 -0
- package/dist/voice/testing/index.cjs +3 -0
- package/dist/voice/testing/index.cjs.map +1 -1
- package/dist/voice/testing/index.d.cts +1 -0
- package/dist/voice/testing/index.d.ts +1 -0
- package/dist/voice/testing/index.d.ts.map +1 -1
- package/dist/voice/testing/index.js +2 -0
- package/dist/voice/testing/index.js.map +1 -1
- package/dist/voice/turn_config/endpointing.cjs +33 -0
- package/dist/voice/turn_config/endpointing.cjs.map +1 -0
- package/dist/voice/turn_config/endpointing.d.cts +30 -0
- package/dist/voice/turn_config/endpointing.d.ts +30 -0
- package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
- package/dist/voice/turn_config/endpointing.js +9 -0
- package/dist/voice/turn_config/endpointing.js.map +1 -0
- package/dist/voice/turn_config/interruption.cjs +37 -0
- package/dist/voice/turn_config/interruption.cjs.map +1 -0
- package/dist/voice/turn_config/interruption.d.cts +53 -0
- package/dist/voice/turn_config/interruption.d.ts +53 -0
- package/dist/voice/turn_config/interruption.d.ts.map +1 -0
- package/dist/voice/turn_config/interruption.js +13 -0
- package/dist/voice/turn_config/interruption.js.map +1 -0
- package/dist/voice/turn_config/turn_handling.cjs +35 -0
- package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
- package/dist/voice/turn_config/turn_handling.d.cts +36 -0
- package/dist/voice/turn_config/turn_handling.d.ts +36 -0
- package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
- package/dist/voice/turn_config/turn_handling.js +11 -0
- package/dist/voice/turn_config/turn_handling.js.map +1 -0
- package/dist/voice/turn_config/utils.cjs +97 -0
- package/dist/voice/turn_config/utils.cjs.map +1 -0
- package/dist/voice/turn_config/utils.d.cts +25 -0
- package/dist/voice/turn_config/utils.d.ts +25 -0
- package/dist/voice/turn_config/utils.d.ts.map +1 -0
- package/dist/voice/turn_config/utils.js +73 -0
- package/dist/voice/turn_config/utils.js.map +1 -0
- package/dist/voice/turn_config/utils.test.cjs +86 -0
- package/dist/voice/turn_config/utils.test.cjs.map +1 -0
- package/dist/voice/turn_config/utils.test.js +85 -0
- package/dist/voice/turn_config/utils.test.js.map +1 -0
- package/dist/voice/wire_format.cjs +798 -0
- package/dist/voice/wire_format.cjs.map +1 -0
- package/dist/voice/wire_format.d.cts +5503 -0
- package/dist/voice/wire_format.d.ts +5503 -0
- package/dist/voice/wire_format.d.ts.map +1 -0
- package/dist/voice/wire_format.js +728 -0
- package/dist/voice/wire_format.js.map +1 -0
- package/package.json +2 -1
- package/src/beta/index.ts +9 -0
- package/src/beta/workflows/index.ts +9 -0
- package/src/beta/workflows/task_group.ts +194 -0
- package/src/constants.ts +13 -0
- package/src/index.ts +2 -1
- package/src/inference/interruption/defaults.ts +51 -0
- package/src/inference/interruption/errors.ts +25 -0
- package/src/inference/interruption/http_transport.ts +187 -0
- package/src/inference/interruption/interruption_cache_entry.ts +50 -0
- package/src/inference/interruption/interruption_detector.ts +188 -0
- package/src/inference/interruption/interruption_stream.ts +467 -0
- package/src/inference/interruption/types.ts +84 -0
- package/src/inference/interruption/utils.test.ts +132 -0
- package/src/inference/interruption/utils.ts +137 -0
- package/src/inference/interruption/ws_transport.ts +402 -0
- package/src/inference/llm.ts +9 -12
- package/src/inference/stt.ts +10 -3
- package/src/inference/tts.ts +10 -3
- package/src/inference/utils.ts +29 -1
- package/src/llm/chat_context.test.ts +48 -0
- package/src/llm/chat_context.ts +161 -0
- package/src/llm/index.ts +2 -0
- package/src/llm/llm.ts +16 -0
- package/src/llm/realtime.ts +4 -0
- package/src/llm/tool_context.ts +14 -0
- package/src/metrics/base.ts +48 -1
- package/src/metrics/index.ts +11 -0
- package/src/metrics/model_usage.test.ts +545 -0
- package/src/metrics/model_usage.ts +262 -0
- package/src/metrics/usage_collector.ts +11 -0
- package/src/metrics/utils.ts +11 -0
- package/src/stream/multi_input_stream.test.ts +6 -1
- package/src/stream/stream_channel.ts +34 -2
- package/src/stt/stt.ts +38 -0
- package/src/telemetry/otel_http_exporter.ts +28 -5
- package/src/telemetry/trace_types.ts +11 -8
- package/src/telemetry/traces.ts +111 -54
- package/src/tts/tts.ts +69 -1
- package/src/utils.ts +5 -0
- package/src/voice/agent.ts +41 -3
- package/src/voice/agent_activity.ts +371 -34
- package/src/voice/agent_session.ts +207 -59
- package/src/voice/audio_recognition.ts +385 -9
- package/src/voice/client_events.ts +838 -0
- package/src/voice/events.ts +14 -4
- package/src/voice/generation.ts +52 -9
- package/src/voice/index.ts +1 -0
- package/src/voice/report.test.ts +117 -0
- package/src/voice/report.ts +29 -6
- package/src/voice/room_io/room_io.ts +21 -64
- package/src/voice/testing/fake_llm.ts +138 -0
- package/src/voice/testing/index.ts +2 -0
- package/src/voice/turn_config/endpointing.ts +33 -0
- package/src/voice/turn_config/interruption.ts +56 -0
- package/src/voice/turn_config/turn_handling.ts +45 -0
- package/src/voice/turn_config/utils.test.ts +100 -0
- package/src/voice/turn_config/utils.ts +103 -0
- package/src/voice/wire_format.ts +827 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { log } from "../../log.js";
|
|
2
|
+
import {
|
|
3
|
+
defaultSessionOptions
|
|
4
|
+
} from "../agent_session.js";
|
|
5
|
+
import { defaultEndpointingOptions } from "./endpointing.js";
|
|
6
|
+
import { defaultInterruptionOptions } from "./interruption.js";
|
|
7
|
+
import { defaultTurnHandlingOptions } from "./turn_handling.js";
|
|
8
|
+
function migrateLegacyOptions(legacyOptions) {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const logger = log();
|
|
11
|
+
const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;
|
|
12
|
+
if (voiceOptions !== void 0 && sessionOptions !== void 0) {
|
|
13
|
+
logger.warn(
|
|
14
|
+
"Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence"
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
const originalTurnDetection = ((_a = sessionOptions == null ? void 0 : sessionOptions.turnHandling) == null ? void 0 : _a.turnDetection) ?? ((_b = voiceOptions == null ? void 0 : voiceOptions.turnHandling) == null ? void 0 : _b.turnDetection) ?? turnDetection;
|
|
18
|
+
const cloneableVoiceOptions = voiceOptions ? {
|
|
19
|
+
...voiceOptions,
|
|
20
|
+
turnHandling: voiceOptions.turnHandling ? { ...voiceOptions.turnHandling, turnDetection: void 0 } : voiceOptions.turnHandling
|
|
21
|
+
} : voiceOptions;
|
|
22
|
+
const cloneableSessionOptions = sessionOptions ? {
|
|
23
|
+
...sessionOptions,
|
|
24
|
+
turnHandling: sessionOptions.turnHandling ? { ...sessionOptions.turnHandling, turnDetection: void 0 } : sessionOptions.turnHandling
|
|
25
|
+
} : sessionOptions;
|
|
26
|
+
const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });
|
|
27
|
+
const turnHandling = {
|
|
28
|
+
interruption: {
|
|
29
|
+
discardAudioIfUninterruptible: mergedOptions == null ? void 0 : mergedOptions.discardAudioIfUninterruptible,
|
|
30
|
+
minDuration: mergedOptions == null ? void 0 : mergedOptions.minInterruptionDuration,
|
|
31
|
+
minWords: mergedOptions == null ? void 0 : mergedOptions.minInterruptionWords
|
|
32
|
+
},
|
|
33
|
+
endpointing: {
|
|
34
|
+
minDelay: mergedOptions == null ? void 0 : mergedOptions.minEndpointingDelay,
|
|
35
|
+
maxDelay: mergedOptions == null ? void 0 : mergedOptions.maxEndpointingDelay
|
|
36
|
+
},
|
|
37
|
+
...mergedOptions.turnHandling,
|
|
38
|
+
// Restore original turnDetection after spread to preserve class instance with methods
|
|
39
|
+
// (structuredClone converts class instances to plain objects, losing prototype methods)
|
|
40
|
+
turnDetection: originalTurnDetection
|
|
41
|
+
};
|
|
42
|
+
if ((mergedOptions == null ? void 0 : mergedOptions.allowInterruptions) === false) {
|
|
43
|
+
turnHandling.interruption.enabled = false;
|
|
44
|
+
}
|
|
45
|
+
const optionsWithDefaults = {
|
|
46
|
+
...defaultSessionOptions,
|
|
47
|
+
...mergedOptions,
|
|
48
|
+
turnHandling: mergeWithDefaults(turnHandling)
|
|
49
|
+
};
|
|
50
|
+
const newAgentSessionOptions = {
|
|
51
|
+
...rest,
|
|
52
|
+
options: optionsWithDefaults,
|
|
53
|
+
voiceOptions: optionsWithDefaults,
|
|
54
|
+
turnDetection: turnHandling.turnDetection
|
|
55
|
+
};
|
|
56
|
+
return newAgentSessionOptions;
|
|
57
|
+
}
|
|
58
|
+
function stripUndefined(obj) {
|
|
59
|
+
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== void 0));
|
|
60
|
+
}
|
|
61
|
+
function mergeWithDefaults(config) {
|
|
62
|
+
return {
|
|
63
|
+
turnDetection: config.turnDetection ?? defaultTurnHandlingOptions.turnDetection,
|
|
64
|
+
endpointing: { ...defaultEndpointingOptions, ...stripUndefined(config.endpointing) },
|
|
65
|
+
interruption: { ...defaultInterruptionOptions, ...stripUndefined(config.interruption) }
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
mergeWithDefaults,
|
|
70
|
+
migrateLegacyOptions,
|
|
71
|
+
stripUndefined
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../../log.js';\nimport {\n type AgentSessionOptions,\n type InternalSessionOptions,\n defaultSessionOptions,\n} from '../agent_session.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { type TurnHandlingOptions, defaultTurnHandlingOptions } from './turn_handling.js';\n\nexport function migrateLegacyOptions<UserData>(\n legacyOptions: AgentSessionOptions<UserData>,\n): AgentSessionOptions<UserData> & { options: InternalSessionOptions } {\n const logger = log();\n const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;\n\n if (voiceOptions !== undefined && sessionOptions !== undefined) {\n logger.warn(\n 'Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence',\n );\n }\n\n // Preserve turnDetection before cloning since structuredClone converts class instances to plain objects\n const originalTurnDetection =\n sessionOptions?.turnHandling?.turnDetection ??\n voiceOptions?.turnHandling?.turnDetection ??\n turnDetection;\n\n // Exclude potentially non-cloneable turnDetection objects before structuredClone.\n // They are restored from originalTurnDetection below.\n const cloneableVoiceOptions = voiceOptions\n ? {\n ...voiceOptions,\n turnHandling: voiceOptions.turnHandling\n ? { ...voiceOptions.turnHandling, turnDetection: undefined }\n : voiceOptions.turnHandling,\n }\n : voiceOptions;\n const cloneableSessionOptions = sessionOptions\n ? {\n ...sessionOptions,\n turnHandling: sessionOptions.turnHandling\n ? { ...sessionOptions.turnHandling, turnDetection: undefined }\n : sessionOptions.turnHandling,\n }\n : sessionOptions;\n\n const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });\n\n const turnHandling: TurnHandlingOptions = {\n interruption: {\n discardAudioIfUninterruptible: mergedOptions?.discardAudioIfUninterruptible,\n minDuration: mergedOptions?.minInterruptionDuration,\n minWords: mergedOptions?.minInterruptionWords,\n },\n endpointing: {\n minDelay: mergedOptions?.minEndpointingDelay,\n maxDelay: mergedOptions?.maxEndpointingDelay,\n },\n\n ...mergedOptions.turnHandling,\n // Restore original turnDetection after spread to preserve class instance with methods\n // (structuredClone converts class instances to plain objects, losing prototype methods)\n turnDetection: originalTurnDetection,\n } as const;\n\n if (mergedOptions?.allowInterruptions === false) {\n turnHandling.interruption.enabled = false;\n }\n\n const optionsWithDefaults = {\n ...defaultSessionOptions,\n ...mergedOptions,\n turnHandling: mergeWithDefaults(turnHandling),\n };\n\n const newAgentSessionOptions: AgentSessionOptions<UserData> & {\n options: InternalSessionOptions;\n } = {\n ...rest,\n options: optionsWithDefaults,\n voiceOptions: optionsWithDefaults,\n turnDetection: turnHandling.turnDetection,\n };\n\n return newAgentSessionOptions;\n}\n\n/** Remove keys whose value is `undefined` so they don't shadow defaults when spread. */\nexport function stripUndefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\nexport function mergeWithDefaults(config: TurnHandlingOptions) {\n return {\n turnDetection: config.turnDetection ?? defaultTurnHandlingOptions.turnDetection,\n endpointing: { ...defaultEndpointingOptions, ...stripUndefined(config.endpointing) },\n interruption: { ...defaultInterruptionOptions, ...stripUndefined(config.interruption) },\n } as const;\n}\n"],"mappings":"AAGA,SAAS,WAAW;AACpB;AAAA,EAGE;AAAA,OACK;AACP,SAAS,iCAAiC;AAC1C,SAAS,kCAAkC;AAC3C,SAAmC,kCAAkC;AAE9D,SAAS,qBACd,eACqE;AAfvE;AAgBE,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,cAAc,eAAe,SAAS,gBAAgB,GAAG,KAAK,IAAI;AAE1E,MAAI,iBAAiB,UAAa,mBAAmB,QAAW;AAC9D,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAGA,QAAM,0BACJ,sDAAgB,iBAAhB,mBAA8B,oBAC9B,kDAAc,iBAAd,mBAA4B,kBAC5B;AAIF,QAAM,wBAAwB,eAC1B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,aAAa,eACvB,EAAE,GAAG,aAAa,cAAc,eAAe,OAAU,IACzD,aAAa;AAAA,EACnB,IACA;AACJ,QAAM,0BAA0B,iBAC5B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,eAAe,eACzB,EAAE,GAAG,eAAe,cAAc,eAAe,OAAU,IAC3D,eAAe;AAAA,EACrB,IACA;AAEJ,QAAM,gBAAgB,gBAAgB,EAAE,GAAG,uBAAuB,GAAG,wBAAwB,CAAC;AAE9F,QAAM,eAAoC;AAAA,IACxC,cAAc;AAAA,MACZ,+BAA+B,+CAAe;AAAA,MAC9C,aAAa,+CAAe;AAAA,MAC5B,UAAU,+CAAe;AAAA,IAC3B;AAAA,IACA,aAAa;AAAA,MACX,UAAU,+CAAe;AAAA,MACzB,UAAU,+CAAe;AAAA,IAC3B;AAAA,IAEA,GAAG,cAAc;AAAA;AAAA;AAAA,IAGjB,eAAe;AAAA,EACjB;AAEA,OAAI,+CAAe,wBAAuB,OAAO;AAC/C,iBAAa,aAAa,UAAU;AAAA,EACtC;AAEA,QAAM,sBAAsB;AAAA,IAC1B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,cAAc,kBAAkB,YAAY;AAAA,EAC9C;AAEA,QAAM,yBAEF;AAAA,IACF,GAAG;AAAA,IACH,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe,aAAa;AAAA,EAC9B;AAEA,SAAO;AACT;AAGO,SAAS,eAAiC,KAAoB;AACnE,SAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,CAAC;AAClF;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,SAAO;AAAA,IACL,eAAe,OAAO,iBAAiB,2BAA2B;AAAA,IAClE,aAAa,EAAE,GAAG,2BAA2B,GAAG,eAAe,OAAO,WAAW,EAAE;AAAA,IACnF,cAAc,EAAE,GAAG,4BAA4B,GAAG,eAAe,OAAO,YAAY,EAAE;AAAA,EACxF;AACF;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var import_vitest = require("vitest");
|
|
3
|
+
var import_log = require("../../log.cjs");
|
|
4
|
+
var import_endpointing = require("./endpointing.cjs");
|
|
5
|
+
var import_interruption = require("./interruption.cjs");
|
|
6
|
+
var import_turn_handling = require("./turn_handling.cjs");
|
|
7
|
+
var import_utils = require("./utils.cjs");
|
|
8
|
+
(0, import_vitest.beforeAll)(() => {
|
|
9
|
+
(0, import_log.initializeLogger)({ pretty: true, level: "info" });
|
|
10
|
+
});
|
|
11
|
+
(0, import_vitest.describe)("migrateLegacyOptions", () => {
|
|
12
|
+
(0, import_vitest.it)("should return all defaults when no options are provided", () => {
|
|
13
|
+
const result = (0, import_utils.migrateLegacyOptions)({});
|
|
14
|
+
(0, import_vitest.expect)(result.options.turnHandling).toEqual({
|
|
15
|
+
turnDetection: import_turn_handling.defaultTurnHandlingOptions.turnDetection,
|
|
16
|
+
endpointing: import_endpointing.defaultEndpointingOptions,
|
|
17
|
+
interruption: import_interruption.defaultInterruptionOptions
|
|
18
|
+
});
|
|
19
|
+
(0, import_vitest.expect)(result.options.maxToolSteps).toBe(3);
|
|
20
|
+
(0, import_vitest.expect)(result.options.preemptiveGeneration).toBe(false);
|
|
21
|
+
(0, import_vitest.expect)(result.options.userAwayTimeout).toBe(15);
|
|
22
|
+
});
|
|
23
|
+
(0, import_vitest.it)("should migrate legacy flat fields into nested turnHandling config", () => {
|
|
24
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
25
|
+
voiceOptions: {
|
|
26
|
+
minInterruptionDuration: 1e3,
|
|
27
|
+
minInterruptionWords: 3,
|
|
28
|
+
discardAudioIfUninterruptible: false,
|
|
29
|
+
minEndpointingDelay: 800,
|
|
30
|
+
maxEndpointingDelay: 5e3
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(1e3);
|
|
34
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minWords).toBe(3);
|
|
35
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.discardAudioIfUninterruptible).toBe(false);
|
|
36
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.minDelay).toBe(800);
|
|
37
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.maxDelay).toBe(5e3);
|
|
38
|
+
});
|
|
39
|
+
(0, import_vitest.it)("should set interruption.enabled to false when allowInterruptions is false", () => {
|
|
40
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
41
|
+
options: {
|
|
42
|
+
allowInterruptions: false
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.enabled).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
(0, import_vitest.it)("should give options precedence over voiceOptions when both are provided", () => {
|
|
48
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
49
|
+
voiceOptions: {
|
|
50
|
+
minInterruptionDuration: 1e3,
|
|
51
|
+
maxEndpointingDelay: 5e3,
|
|
52
|
+
maxToolSteps: 10
|
|
53
|
+
},
|
|
54
|
+
options: {
|
|
55
|
+
minInterruptionDuration: 2e3,
|
|
56
|
+
maxEndpointingDelay: 8e3,
|
|
57
|
+
maxToolSteps: 5
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(2e3);
|
|
61
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.maxDelay).toBe(8e3);
|
|
62
|
+
(0, import_vitest.expect)(result.options.maxToolSteps).toBe(5);
|
|
63
|
+
});
|
|
64
|
+
(0, import_vitest.it)("should let explicit turnHandling override legacy flat fields", () => {
|
|
65
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
66
|
+
options: {
|
|
67
|
+
minInterruptionDuration: 1e3,
|
|
68
|
+
minEndpointingDelay: 800,
|
|
69
|
+
turnHandling: {
|
|
70
|
+
interruption: { minDuration: 3e3 },
|
|
71
|
+
endpointing: { minDelay: 2e3 }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
(0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(3e3);
|
|
76
|
+
(0, import_vitest.expect)(result.options.turnHandling.endpointing.minDelay).toBe(2e3);
|
|
77
|
+
});
|
|
78
|
+
(0, import_vitest.it)("should preserve top-level turnDetection in the result", () => {
|
|
79
|
+
const result = (0, import_utils.migrateLegacyOptions)({
|
|
80
|
+
turnDetection: "vad"
|
|
81
|
+
});
|
|
82
|
+
(0, import_vitest.expect)(result.turnDetection).toBe("vad");
|
|
83
|
+
(0, import_vitest.expect)(result.options.turnHandling.turnDetection).toBe("vad");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=utils.test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { beforeAll, describe, expect, it } from 'vitest';\nimport { initializeLogger } from '../../log.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { defaultTurnHandlingOptions } from './turn_handling.js';\nimport { migrateLegacyOptions } from './utils.js';\n\nbeforeAll(() => {\n initializeLogger({ pretty: true, level: 'info' });\n});\n\ndescribe('migrateLegacyOptions', () => {\n it('should return all defaults when no options are provided', () => {\n const result = migrateLegacyOptions({});\n\n expect(result.options.turnHandling).toEqual({\n turnDetection: defaultTurnHandlingOptions.turnDetection,\n endpointing: defaultEndpointingOptions,\n interruption: defaultInterruptionOptions,\n });\n expect(result.options.maxToolSteps).toBe(3);\n expect(result.options.preemptiveGeneration).toBe(false);\n expect(result.options.userAwayTimeout).toBe(15.0);\n });\n\n it('should migrate legacy flat fields into nested turnHandling config', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n minInterruptionWords: 3,\n discardAudioIfUninterruptible: false,\n minEndpointingDelay: 800,\n maxEndpointingDelay: 5000,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(1000);\n expect(result.options.turnHandling.interruption!.minWords).toBe(3);\n expect(result.options.turnHandling.interruption!.discardAudioIfUninterruptible).toBe(false);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(800);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(5000);\n });\n\n it('should set interruption.enabled to false when allowInterruptions is false', () => {\n const result = migrateLegacyOptions({\n options: {\n allowInterruptions: false,\n },\n });\n\n expect(result.options.turnHandling.interruption!.enabled).toBe(false);\n });\n\n it('should give options precedence over voiceOptions when both are provided', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n maxEndpointingDelay: 5000,\n maxToolSteps: 10,\n },\n options: {\n minInterruptionDuration: 2000,\n maxEndpointingDelay: 8000,\n maxToolSteps: 5,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(2000);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(8000);\n expect(result.options.maxToolSteps).toBe(5);\n });\n\n it('should let explicit turnHandling override legacy flat fields', () => {\n const result = migrateLegacyOptions({\n options: {\n minInterruptionDuration: 1000,\n minEndpointingDelay: 800,\n turnHandling: {\n interruption: { minDuration: 3000 },\n endpointing: { minDelay: 2000 },\n },\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(3000);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(2000);\n });\n\n it('should preserve top-level turnDetection in the result', () => {\n const result = migrateLegacyOptions({\n turnDetection: 'vad',\n });\n\n expect(result.turnDetection).toBe('vad');\n expect(result.options.turnHandling.turnDetection).toBe('vad');\n });\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
import { initializeLogger } from "../../log.js";
|
|
3
|
+
import { defaultEndpointingOptions } from "./endpointing.js";
|
|
4
|
+
import { defaultInterruptionOptions } from "./interruption.js";
|
|
5
|
+
import { defaultTurnHandlingOptions } from "./turn_handling.js";
|
|
6
|
+
import { migrateLegacyOptions } from "./utils.js";
|
|
7
|
+
beforeAll(() => {
|
|
8
|
+
initializeLogger({ pretty: true, level: "info" });
|
|
9
|
+
});
|
|
10
|
+
describe("migrateLegacyOptions", () => {
|
|
11
|
+
it("should return all defaults when no options are provided", () => {
|
|
12
|
+
const result = migrateLegacyOptions({});
|
|
13
|
+
expect(result.options.turnHandling).toEqual({
|
|
14
|
+
turnDetection: defaultTurnHandlingOptions.turnDetection,
|
|
15
|
+
endpointing: defaultEndpointingOptions,
|
|
16
|
+
interruption: defaultInterruptionOptions
|
|
17
|
+
});
|
|
18
|
+
expect(result.options.maxToolSteps).toBe(3);
|
|
19
|
+
expect(result.options.preemptiveGeneration).toBe(false);
|
|
20
|
+
expect(result.options.userAwayTimeout).toBe(15);
|
|
21
|
+
});
|
|
22
|
+
it("should migrate legacy flat fields into nested turnHandling config", () => {
|
|
23
|
+
const result = migrateLegacyOptions({
|
|
24
|
+
voiceOptions: {
|
|
25
|
+
minInterruptionDuration: 1e3,
|
|
26
|
+
minInterruptionWords: 3,
|
|
27
|
+
discardAudioIfUninterruptible: false,
|
|
28
|
+
minEndpointingDelay: 800,
|
|
29
|
+
maxEndpointingDelay: 5e3
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
expect(result.options.turnHandling.interruption.minDuration).toBe(1e3);
|
|
33
|
+
expect(result.options.turnHandling.interruption.minWords).toBe(3);
|
|
34
|
+
expect(result.options.turnHandling.interruption.discardAudioIfUninterruptible).toBe(false);
|
|
35
|
+
expect(result.options.turnHandling.endpointing.minDelay).toBe(800);
|
|
36
|
+
expect(result.options.turnHandling.endpointing.maxDelay).toBe(5e3);
|
|
37
|
+
});
|
|
38
|
+
it("should set interruption.enabled to false when allowInterruptions is false", () => {
|
|
39
|
+
const result = migrateLegacyOptions({
|
|
40
|
+
options: {
|
|
41
|
+
allowInterruptions: false
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
expect(result.options.turnHandling.interruption.enabled).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
it("should give options precedence over voiceOptions when both are provided", () => {
|
|
47
|
+
const result = migrateLegacyOptions({
|
|
48
|
+
voiceOptions: {
|
|
49
|
+
minInterruptionDuration: 1e3,
|
|
50
|
+
maxEndpointingDelay: 5e3,
|
|
51
|
+
maxToolSteps: 10
|
|
52
|
+
},
|
|
53
|
+
options: {
|
|
54
|
+
minInterruptionDuration: 2e3,
|
|
55
|
+
maxEndpointingDelay: 8e3,
|
|
56
|
+
maxToolSteps: 5
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
expect(result.options.turnHandling.interruption.minDuration).toBe(2e3);
|
|
60
|
+
expect(result.options.turnHandling.endpointing.maxDelay).toBe(8e3);
|
|
61
|
+
expect(result.options.maxToolSteps).toBe(5);
|
|
62
|
+
});
|
|
63
|
+
it("should let explicit turnHandling override legacy flat fields", () => {
|
|
64
|
+
const result = migrateLegacyOptions({
|
|
65
|
+
options: {
|
|
66
|
+
minInterruptionDuration: 1e3,
|
|
67
|
+
minEndpointingDelay: 800,
|
|
68
|
+
turnHandling: {
|
|
69
|
+
interruption: { minDuration: 3e3 },
|
|
70
|
+
endpointing: { minDelay: 2e3 }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
expect(result.options.turnHandling.interruption.minDuration).toBe(3e3);
|
|
75
|
+
expect(result.options.turnHandling.endpointing.minDelay).toBe(2e3);
|
|
76
|
+
});
|
|
77
|
+
it("should preserve top-level turnDetection in the result", () => {
|
|
78
|
+
const result = migrateLegacyOptions({
|
|
79
|
+
turnDetection: "vad"
|
|
80
|
+
});
|
|
81
|
+
expect(result.turnDetection).toBe("vad");
|
|
82
|
+
expect(result.options.turnHandling.turnDetection).toBe("vad");
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/turn_config/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { beforeAll, describe, expect, it } from 'vitest';\nimport { initializeLogger } from '../../log.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { defaultTurnHandlingOptions } from './turn_handling.js';\nimport { migrateLegacyOptions } from './utils.js';\n\nbeforeAll(() => {\n initializeLogger({ pretty: true, level: 'info' });\n});\n\ndescribe('migrateLegacyOptions', () => {\n it('should return all defaults when no options are provided', () => {\n const result = migrateLegacyOptions({});\n\n expect(result.options.turnHandling).toEqual({\n turnDetection: defaultTurnHandlingOptions.turnDetection,\n endpointing: defaultEndpointingOptions,\n interruption: defaultInterruptionOptions,\n });\n expect(result.options.maxToolSteps).toBe(3);\n expect(result.options.preemptiveGeneration).toBe(false);\n expect(result.options.userAwayTimeout).toBe(15.0);\n });\n\n it('should migrate legacy flat fields into nested turnHandling config', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n minInterruptionWords: 3,\n discardAudioIfUninterruptible: false,\n minEndpointingDelay: 800,\n maxEndpointingDelay: 5000,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(1000);\n expect(result.options.turnHandling.interruption!.minWords).toBe(3);\n expect(result.options.turnHandling.interruption!.discardAudioIfUninterruptible).toBe(false);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(800);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(5000);\n });\n\n it('should set interruption.enabled to false when allowInterruptions is false', () => {\n const result = migrateLegacyOptions({\n options: {\n allowInterruptions: false,\n },\n });\n\n expect(result.options.turnHandling.interruption!.enabled).toBe(false);\n });\n\n it('should give options precedence over voiceOptions when both are provided', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n maxEndpointingDelay: 5000,\n maxToolSteps: 10,\n },\n options: {\n minInterruptionDuration: 2000,\n maxEndpointingDelay: 8000,\n maxToolSteps: 5,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(2000);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(8000);\n expect(result.options.maxToolSteps).toBe(5);\n });\n\n it('should let explicit turnHandling override legacy flat fields', () => {\n const result = migrateLegacyOptions({\n options: {\n minInterruptionDuration: 1000,\n minEndpointingDelay: 800,\n turnHandling: {\n interruption: { minDuration: 3000 },\n endpointing: { minDelay: 2000 },\n },\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(3000);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(2000);\n });\n\n it('should preserve top-level turnDetection in the result', () => {\n const result = migrateLegacyOptions({\n turnDetection: 'vad',\n });\n\n expect(result.turnDetection).toBe('vad');\n expect(result.options.turnHandling.turnDetection).toBe('vad');\n });\n});\n"],"mappings":"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","names":[]}
|