@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,84 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 LiveKit, Inc.
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import type { Span } from '@opentelemetry/api';
|
|
5
|
+
|
|
6
|
+
export interface OverlappingSpeechEvent {
|
|
7
|
+
type: 'user_overlapping_speech';
|
|
8
|
+
timestamp: number;
|
|
9
|
+
isInterruption: boolean;
|
|
10
|
+
totalDurationInS: number;
|
|
11
|
+
predictionDurationInS: number;
|
|
12
|
+
detectionDelayInS: number;
|
|
13
|
+
overlapStartedAt?: number;
|
|
14
|
+
speechInput?: Int16Array;
|
|
15
|
+
probabilities?: number[];
|
|
16
|
+
probability: number;
|
|
17
|
+
numRequests: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Configuration options for interruption detection.
|
|
22
|
+
*/
|
|
23
|
+
export interface InterruptionOptions {
|
|
24
|
+
sampleRate: number;
|
|
25
|
+
threshold: number;
|
|
26
|
+
minFrames: number;
|
|
27
|
+
maxAudioDurationInS: number;
|
|
28
|
+
audioPrefixDurationInS: number;
|
|
29
|
+
detectionIntervalInS: number;
|
|
30
|
+
inferenceTimeout: number;
|
|
31
|
+
minInterruptionDurationInS: number;
|
|
32
|
+
baseUrl: string;
|
|
33
|
+
apiKey: string;
|
|
34
|
+
apiSecret: string;
|
|
35
|
+
useProxy: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* API connection options for transport layers.
|
|
40
|
+
*/
|
|
41
|
+
export interface ApiConnectOptions {
|
|
42
|
+
maxRetries: number;
|
|
43
|
+
retryInterval: number;
|
|
44
|
+
timeout: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Sentinel types for stream control signals
|
|
48
|
+
|
|
49
|
+
export interface AgentSpeechStarted {
|
|
50
|
+
type: 'agent-speech-started';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface AgentSpeechEnded {
|
|
54
|
+
type: 'agent-speech-ended';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface OverlapSpeechStarted {
|
|
58
|
+
type: 'overlap-speech-started';
|
|
59
|
+
/** Duration of the speech segment in milliseconds (matches VADEvent.speechDuration units). */
|
|
60
|
+
speechDuration: number;
|
|
61
|
+
/** Absolute timestamp (ms) when overlap speech started, computed at call-site. */
|
|
62
|
+
startedAt: number;
|
|
63
|
+
userSpeakingSpan?: Span;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface OverlapSpeechEnded {
|
|
67
|
+
type: 'overlap-speech-ended';
|
|
68
|
+
/** Absolute timestamp (ms) when overlap speech ended, used as the non-interruption event timestamp. */
|
|
69
|
+
endedAt: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface Flush {
|
|
73
|
+
type: 'flush';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Union type for all stream control signals.
|
|
78
|
+
*/
|
|
79
|
+
export type InterruptionSentinel =
|
|
80
|
+
| AgentSpeechStarted
|
|
81
|
+
| AgentSpeechEnded
|
|
82
|
+
| OverlapSpeechStarted
|
|
83
|
+
| OverlapSpeechEnded
|
|
84
|
+
| Flush;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 LiveKit, Inc.
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { BoundedCache } from './utils.js';
|
|
6
|
+
|
|
7
|
+
class Entry {
|
|
8
|
+
createdAt: number;
|
|
9
|
+
totalDurationInS: number | undefined = undefined;
|
|
10
|
+
predictionDurationInS: number | undefined = undefined;
|
|
11
|
+
note: string | undefined = undefined;
|
|
12
|
+
|
|
13
|
+
constructor(createdAt: number, note?: string) {
|
|
14
|
+
this.createdAt = createdAt;
|
|
15
|
+
this.note = note;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe('BoundedCache', () => {
|
|
20
|
+
it('evicts oldest entry when maxLen is exceeded', () => {
|
|
21
|
+
const cache = new BoundedCache<number, Entry>(2);
|
|
22
|
+
cache.set(1, new Entry(1));
|
|
23
|
+
cache.set(2, new Entry(2));
|
|
24
|
+
cache.set(3, new Entry(3));
|
|
25
|
+
|
|
26
|
+
expect(cache.size).toBe(2);
|
|
27
|
+
expect([...cache.keys()]).toEqual([2, 3]);
|
|
28
|
+
expect(cache.get(1)).toBeUndefined();
|
|
29
|
+
expect(cache.get(2)!.createdAt).toBe(2);
|
|
30
|
+
expect(cache.get(3)!.createdAt).toBe(3);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('setOrUpdate creates a value via factory when key is missing', () => {
|
|
34
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
35
|
+
const factory = vi.fn(() => new Entry(100));
|
|
36
|
+
|
|
37
|
+
const value = cache.setOrUpdate(1, factory, { predictionDurationInS: 0.42 });
|
|
38
|
+
|
|
39
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
40
|
+
expect(value.createdAt).toBe(100);
|
|
41
|
+
expect(value.predictionDurationInS).toBe(0.42);
|
|
42
|
+
expect(cache.get(1)?.predictionDurationInS).toBe(0.42);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('setOrUpdate updates existing value and does not call factory', () => {
|
|
46
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
47
|
+
cache.set(1, new Entry(1, 'before'));
|
|
48
|
+
const factory = vi.fn(() => new Entry(999));
|
|
49
|
+
|
|
50
|
+
const value = cache.setOrUpdate(1, factory, { note: 'after', totalDurationInS: 1.5 });
|
|
51
|
+
|
|
52
|
+
expect(factory).not.toHaveBeenCalled();
|
|
53
|
+
expect(value.createdAt).toBe(1);
|
|
54
|
+
expect(value.note).toBe('after');
|
|
55
|
+
expect(value.totalDurationInS).toBe(1.5);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('updateValue returns undefined for missing key', () => {
|
|
59
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
60
|
+
const result = cache.updateValue(404, { note: 'missing' });
|
|
61
|
+
|
|
62
|
+
expect(result).toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('updateValue ignores undefined fields', () => {
|
|
66
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
67
|
+
cache.set(1, new Entry(1, 'keep'));
|
|
68
|
+
|
|
69
|
+
const result = cache.updateValue(1, {
|
|
70
|
+
note: undefined,
|
|
71
|
+
predictionDurationInS: 0.1,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
expect(result?.createdAt).toBe(1);
|
|
75
|
+
expect(result?.note).toBe('keep');
|
|
76
|
+
expect(result?.predictionDurationInS).toBe(0.1);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('pop without predicate removes the oldest entry (python parity)', () => {
|
|
80
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
81
|
+
cache.set(1, new Entry(1));
|
|
82
|
+
cache.set(2, new Entry(2));
|
|
83
|
+
cache.set(3, new Entry(3));
|
|
84
|
+
|
|
85
|
+
const popped = cache.pop();
|
|
86
|
+
|
|
87
|
+
expect(popped?.createdAt).toBe(1);
|
|
88
|
+
expect([...cache.keys()]).toEqual([2, 3]);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('pop with predicate removes the most recent matching entry', () => {
|
|
92
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
93
|
+
const e1 = new Entry(1);
|
|
94
|
+
e1.totalDurationInS = 0;
|
|
95
|
+
const e2 = new Entry(2);
|
|
96
|
+
e2.totalDurationInS = 1;
|
|
97
|
+
const e3 = new Entry(3);
|
|
98
|
+
e3.totalDurationInS = 2;
|
|
99
|
+
cache.set(1, e1);
|
|
100
|
+
cache.set(2, e2);
|
|
101
|
+
cache.set(3, e3);
|
|
102
|
+
|
|
103
|
+
const popped = cache.pop((entry) => (entry.totalDurationInS ?? 0) > 0);
|
|
104
|
+
|
|
105
|
+
expect(popped?.createdAt).toBe(3);
|
|
106
|
+
expect(popped?.totalDurationInS).toBe(2);
|
|
107
|
+
expect([...cache.keys()]).toEqual([1, 2]);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('pop with predicate returns undefined when no match exists', () => {
|
|
111
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
112
|
+
const e1 = new Entry(1);
|
|
113
|
+
e1.totalDurationInS = 0;
|
|
114
|
+
cache.set(1, e1);
|
|
115
|
+
|
|
116
|
+
const popped = cache.pop((entry) => (entry.totalDurationInS ?? 0) > 10);
|
|
117
|
+
|
|
118
|
+
expect(popped).toBeUndefined();
|
|
119
|
+
expect(cache.size).toBe(1);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('clear removes all entries', () => {
|
|
123
|
+
const cache = new BoundedCache<number, Entry>(10);
|
|
124
|
+
cache.set(1, new Entry(1));
|
|
125
|
+
cache.set(2, new Entry(2));
|
|
126
|
+
|
|
127
|
+
cache.clear();
|
|
128
|
+
|
|
129
|
+
expect(cache.size).toBe(0);
|
|
130
|
+
expect([...cache.keys()]).toEqual([]);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 LiveKit, Inc.
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import { FRAME_DURATION_IN_S, MIN_INTERRUPTION_DURATION_IN_S } from './defaults.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A bounded cache that automatically evicts the oldest entries when the cache exceeds max size.
|
|
8
|
+
* Uses FIFO eviction strategy.
|
|
9
|
+
*/
|
|
10
|
+
export class BoundedCache<K, V extends object> {
|
|
11
|
+
private cache: Map<K, V> = new Map();
|
|
12
|
+
private readonly maxLen: number;
|
|
13
|
+
|
|
14
|
+
constructor(maxLen: number = 10) {
|
|
15
|
+
this.maxLen = maxLen;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
set(key: K, value: V): void {
|
|
19
|
+
this.cache.set(key, value);
|
|
20
|
+
if (this.cache.size > this.maxLen) {
|
|
21
|
+
// Remove the oldest entry (first inserted)
|
|
22
|
+
const firstKey = this.cache.keys().next().value as K;
|
|
23
|
+
this.cache.delete(firstKey);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Update existing value fields if present and defined.
|
|
29
|
+
* Mirrors python BoundedDict.update_value behavior.
|
|
30
|
+
*/
|
|
31
|
+
updateValue(key: K, fields: Partial<V>): V | undefined {
|
|
32
|
+
const value = this.cache.get(key);
|
|
33
|
+
if (!value) return value;
|
|
34
|
+
|
|
35
|
+
for (const [fieldName, fieldValue] of Object.entries(fields) as [keyof V, V[keyof V]][]) {
|
|
36
|
+
if (fieldValue === undefined) continue;
|
|
37
|
+
// Runtime field update parity with python's hasattr + setattr.
|
|
38
|
+
if (fieldName in (value as object)) {
|
|
39
|
+
(value as Record<string, unknown>)[String(fieldName)] = fieldValue;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Set a new value with factory when missing; otherwise update in place.
|
|
47
|
+
* Mirrors python BoundedDict.set_or_update behavior.
|
|
48
|
+
*/
|
|
49
|
+
setOrUpdate(key: K, factory: () => V, fields: Partial<V>): V {
|
|
50
|
+
if (!this.cache.has(key)) {
|
|
51
|
+
this.set(key, factory());
|
|
52
|
+
}
|
|
53
|
+
const result = this.updateValue(key, fields);
|
|
54
|
+
if (!result) {
|
|
55
|
+
throw new Error('setOrUpdate invariant failed: entry should exist after set');
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get(key: K): V | undefined {
|
|
61
|
+
return this.cache.get(key);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
has(key: K): boolean {
|
|
65
|
+
return this.cache.has(key);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
delete(key: K): boolean {
|
|
69
|
+
return this.cache.delete(key);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Pop an entry if it satisfies the predicate.
|
|
74
|
+
* - No predicate: pop oldest (FIFO)
|
|
75
|
+
* - With predicate: search in reverse order and pop first match
|
|
76
|
+
*/
|
|
77
|
+
pop(predicate?: (value: V) => boolean): V | undefined {
|
|
78
|
+
if (predicate === undefined) {
|
|
79
|
+
const first = this.cache.entries().next().value as [K, V] | undefined;
|
|
80
|
+
if (!first) return undefined;
|
|
81
|
+
const [key, value] = first;
|
|
82
|
+
this.cache.delete(key);
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const keys = Array.from(this.cache.keys());
|
|
87
|
+
for (let i = keys.length - 1; i >= 0; i--) {
|
|
88
|
+
const key = keys[i]!;
|
|
89
|
+
const value = this.cache.get(key)!;
|
|
90
|
+
if (predicate(value)) {
|
|
91
|
+
this.cache.delete(key);
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
clear(): void {
|
|
99
|
+
this.cache.clear();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
get size(): number {
|
|
103
|
+
return this.cache.size;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
values(): IterableIterator<V> {
|
|
107
|
+
return this.cache.values();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
keys(): IterableIterator<K> {
|
|
111
|
+
return this.cache.keys();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
entries(): IterableIterator<[K, V]> {
|
|
115
|
+
return this.cache.entries();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Estimate probability by finding the n-th maximum value in the probabilities array.
|
|
121
|
+
* The n-th position is determined by the window size (25ms per frame).
|
|
122
|
+
* Returns 0 if there are insufficient probabilities.
|
|
123
|
+
*/
|
|
124
|
+
export function estimateProbability(
|
|
125
|
+
probabilities: number[],
|
|
126
|
+
windowSizeInS: number = MIN_INTERRUPTION_DURATION_IN_S,
|
|
127
|
+
): number {
|
|
128
|
+
const nTh = Math.ceil(windowSizeInS / FRAME_DURATION_IN_S);
|
|
129
|
+
if (probabilities.length < nTh) {
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Find the n-th maximum value by sorting in descending order
|
|
134
|
+
// Create a copy to avoid mutating the original array
|
|
135
|
+
const sorted = [...probabilities].sort((a, b) => b - a);
|
|
136
|
+
return sorted[nTh - 1]!;
|
|
137
|
+
}
|