@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
|
@@ -17,12 +17,15 @@ import {
|
|
|
17
17
|
type STTModelString,
|
|
18
18
|
type TTSModelString,
|
|
19
19
|
} from '../inference/index.js';
|
|
20
|
+
import type { InterruptionDetectionError } from '../inference/interruption/errors.js';
|
|
21
|
+
import type { OverlappingSpeechEvent } from '../inference/interruption/types.js';
|
|
20
22
|
import { type JobContext, getJobContext } from '../job.js';
|
|
21
23
|
import type { FunctionCall, FunctionCallOutput } from '../llm/chat_context.js';
|
|
22
24
|
import { AgentHandoffItem, ChatContext, ChatMessage } from '../llm/chat_context.js';
|
|
23
25
|
import type { LLM, RealtimeModel, RealtimeModelError, ToolChoice } from '../llm/index.js';
|
|
24
26
|
import type { LLMError } from '../llm/llm.js';
|
|
25
27
|
import { log } from '../log.js';
|
|
28
|
+
import { type ModelUsage, ModelUsageCollector, filterZeroValues } from '../metrics/model_usage.js';
|
|
26
29
|
import type { STT } from '../stt/index.js';
|
|
27
30
|
import type { STTError } from '../stt/stt.js';
|
|
28
31
|
import { traceTypes, tracer } from '../telemetry/index.js';
|
|
@@ -38,6 +41,7 @@ import type { VAD } from '../vad.js';
|
|
|
38
41
|
import type { Agent } from './agent.js';
|
|
39
42
|
import { AgentActivity } from './agent_activity.js';
|
|
40
43
|
import type { _TurnDetector } from './audio_recognition.js';
|
|
44
|
+
import { ClientEventsHandler } from './client_events.js';
|
|
41
45
|
import {
|
|
42
46
|
type AgentEvent,
|
|
43
47
|
AgentSessionEventTypes,
|
|
@@ -61,37 +65,90 @@ import {
|
|
|
61
65
|
} from './events.js';
|
|
62
66
|
import { AgentInput, AgentOutput } from './io.js';
|
|
63
67
|
import { RecorderIO } from './recorder_io/index.js';
|
|
64
|
-
import {
|
|
68
|
+
import {
|
|
69
|
+
DEFAULT_TEXT_INPUT_CALLBACK,
|
|
70
|
+
RoomIO,
|
|
71
|
+
type RoomInputOptions,
|
|
72
|
+
type RoomOutputOptions,
|
|
73
|
+
} from './room_io/index.js';
|
|
65
74
|
import type { UnknownUserData } from './run_context.js';
|
|
66
75
|
import type { SpeechHandle } from './speech_handle.js';
|
|
67
76
|
import { RunResult } from './testing/run_result.js';
|
|
77
|
+
import type { InterruptionOptions } from './turn_config/interruption.js';
|
|
78
|
+
import type {
|
|
79
|
+
InternalTurnHandlingOptions,
|
|
80
|
+
TurnHandlingOptions,
|
|
81
|
+
} from './turn_config/turn_handling.js';
|
|
82
|
+
import { migrateLegacyOptions } from './turn_config/utils.js';
|
|
68
83
|
import { setParticipantSpanAttributes } from './utils.js';
|
|
69
84
|
|
|
70
|
-
export interface
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
maxEndpointingDelay: number;
|
|
85
|
+
export interface AgentSessionUsage {
|
|
86
|
+
/** List of usage summaries, one per model/provider combination. */
|
|
87
|
+
modelUsage: Array<Partial<ModelUsage>>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface SessionOptions {
|
|
77
91
|
maxToolSteps: number;
|
|
92
|
+
/**
|
|
93
|
+
* Whether to speculatively begin LLM and TTS requests before an end-of-turn is detected.
|
|
94
|
+
* When `true`, the agent sends inference calls as soon as a user transcript is received rather
|
|
95
|
+
* than waiting for a definitive turn boundary. This can reduce response latency by overlapping
|
|
96
|
+
* model inference with user audio, but may incur extra compute if the user interrupts or
|
|
97
|
+
* revises mid-utterance.
|
|
98
|
+
* @defaultValue false
|
|
99
|
+
*/
|
|
78
100
|
preemptiveGeneration: boolean;
|
|
79
|
-
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* If set, set the user state as "away" after this amount of time after user and agent are
|
|
104
|
+
* silent. Set to `null` to disable.
|
|
105
|
+
* @defaultValue 15.0
|
|
106
|
+
*/
|
|
107
|
+
userAwayTimeout: number | null;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Duration in milliseconds for AEC (Acoustic Echo Cancellation) warmup, during which
|
|
111
|
+
* interruptions from audio activity are suppressed. Set to `null` to disable.
|
|
112
|
+
* @defaultValue 3000
|
|
113
|
+
*/
|
|
114
|
+
aecWarmupDuration: number | null;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Configuration for turn handling.
|
|
118
|
+
*/
|
|
119
|
+
turnHandling: Partial<TurnHandlingOptions>;
|
|
120
|
+
|
|
80
121
|
useTtsAlignedTranscript: boolean;
|
|
122
|
+
|
|
123
|
+
/** @deprecated Use {@link SessionOptions.turnHandling}.interruption.mode instead. */
|
|
124
|
+
allowInterruptions?: boolean;
|
|
125
|
+
/** @deprecated Use {@link SessionOptions.turnHandling}.interruption.discardAudioIfUninterruptible instead. */
|
|
126
|
+
discardAudioIfUninterruptible?: boolean;
|
|
127
|
+
/** @deprecated Use {@link SessionOptions.turnHandling}.interruption.minDuration instead. */
|
|
128
|
+
minInterruptionDuration?: number;
|
|
129
|
+
/** @deprecated Use {@link SessionOptions.turnHandling}.interruption.minWords instead. */
|
|
130
|
+
minInterruptionWords?: number;
|
|
131
|
+
/** @deprecated Use {@link SessionOptions.turnHandling}.endpointing.minDelay instead. */
|
|
132
|
+
minEndpointingDelay?: number;
|
|
133
|
+
/** @deprecated Use {@link SessionOptions.turnHandling}.endpointing.maxDelay instead. */
|
|
134
|
+
maxEndpointingDelay?: number;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface InternalSessionOptions extends SessionOptions {
|
|
138
|
+
turnHandling: InternalTurnHandlingOptions;
|
|
81
139
|
}
|
|
82
140
|
|
|
83
|
-
const
|
|
84
|
-
allowInterruptions: true,
|
|
85
|
-
discardAudioIfUninterruptible: true,
|
|
86
|
-
minInterruptionDuration: 500,
|
|
87
|
-
minInterruptionWords: 0,
|
|
88
|
-
minEndpointingDelay: 500,
|
|
89
|
-
maxEndpointingDelay: 6000,
|
|
141
|
+
export const defaultSessionOptions = {
|
|
90
142
|
maxToolSteps: 3,
|
|
91
143
|
preemptiveGeneration: false,
|
|
92
144
|
userAwayTimeout: 15.0,
|
|
145
|
+
aecWarmupDuration: 3000,
|
|
146
|
+
turnHandling: {},
|
|
93
147
|
useTtsAlignedTranscript: true,
|
|
94
|
-
} as const;
|
|
148
|
+
} as const satisfies SessionOptions;
|
|
149
|
+
|
|
150
|
+
/** @deprecated {@link VoiceOptions} has been renamed to {@link SessionOptions} */
|
|
151
|
+
export type VoiceOptions = SessionOptions;
|
|
95
152
|
|
|
96
153
|
export type TurnDetectionMode = 'stt' | 'vad' | 'realtime_llm' | 'manual' | _TurnDetector;
|
|
97
154
|
|
|
@@ -105,17 +162,22 @@ export type AgentSessionCallbacks = {
|
|
|
105
162
|
[AgentSessionEventTypes.SpeechCreated]: (ev: SpeechCreatedEvent) => void;
|
|
106
163
|
[AgentSessionEventTypes.Error]: (ev: ErrorEvent) => void;
|
|
107
164
|
[AgentSessionEventTypes.Close]: (ev: CloseEvent) => void;
|
|
165
|
+
[AgentSessionEventTypes.UserOverlappingSpeech]: (ev: OverlappingSpeechEvent) => void;
|
|
108
166
|
};
|
|
109
167
|
|
|
110
168
|
export type AgentSessionOptions<UserData = UnknownUserData> = {
|
|
111
|
-
turnDetection?: TurnDetectionMode;
|
|
112
169
|
stt?: STT | STTModelString;
|
|
113
170
|
vad?: VAD;
|
|
114
171
|
llm?: LLM | RealtimeModel | LLMModels;
|
|
115
172
|
tts?: TTS | TTSModelString;
|
|
116
173
|
userData?: UserData;
|
|
117
|
-
|
|
174
|
+
options?: Partial<SessionOptions>;
|
|
118
175
|
connOptions?: SessionConnectOptions;
|
|
176
|
+
|
|
177
|
+
/** @deprecated use {@link AgentSessionOptions.options}.turnHandling.turnDetection instead */
|
|
178
|
+
turnDetection?: TurnDetectionMode;
|
|
179
|
+
/** @deprecated use {@link AgentSessionOptions.options} instead */
|
|
180
|
+
voiceOptions?: Partial<VoiceOptions>;
|
|
119
181
|
};
|
|
120
182
|
|
|
121
183
|
type ActivityTransitionOptions = {
|
|
@@ -134,22 +196,19 @@ export class AgentSession<
|
|
|
134
196
|
tts?: TTS;
|
|
135
197
|
turnDetection?: TurnDetectionMode;
|
|
136
198
|
|
|
137
|
-
readonly options:
|
|
199
|
+
readonly options: InternalSessionOptions;
|
|
200
|
+
private readonly activityLock = new Mutex();
|
|
138
201
|
|
|
139
202
|
private agent?: Agent;
|
|
140
203
|
private activity?: AgentActivity;
|
|
141
204
|
private nextActivity?: AgentActivity;
|
|
142
205
|
private updateActivityTask?: Task<void>;
|
|
143
206
|
private started = false;
|
|
144
|
-
private
|
|
145
|
-
private readonly activityLock = new Mutex();
|
|
146
|
-
|
|
147
|
-
/** @internal */
|
|
148
|
-
_roomIO?: RoomIO;
|
|
149
|
-
private logger = log();
|
|
207
|
+
private clientEventsHandler?: ClientEventsHandler;
|
|
150
208
|
|
|
151
209
|
private _chatCtx: ChatContext;
|
|
152
210
|
private _userData: UserData | undefined;
|
|
211
|
+
private _userState: UserState = 'listening';
|
|
153
212
|
private _agentState: AgentState = 'initializing';
|
|
154
213
|
|
|
155
214
|
private _input: AgentInput;
|
|
@@ -158,17 +217,29 @@ export class AgentSession<
|
|
|
158
217
|
private closingTask: Promise<void> | null = null;
|
|
159
218
|
private userAwayTimer: NodeJS.Timeout | null = null;
|
|
160
219
|
|
|
220
|
+
private _aecWarmupTimer: NodeJS.Timeout | null = null;
|
|
221
|
+
|
|
161
222
|
// Connection options for STT, LLM, and TTS
|
|
162
223
|
private _connOptions: ResolvedSessionConnectOptions;
|
|
163
224
|
|
|
164
225
|
// Unrecoverable error counts, reset after agent speaking
|
|
165
226
|
private llmErrorCounts = 0;
|
|
166
227
|
private ttsErrorCounts = 0;
|
|
228
|
+
private interruptionDetectionErrorCounts = 0;
|
|
167
229
|
|
|
168
230
|
private sessionSpan?: Span;
|
|
169
|
-
private userSpeakingSpan?: Span;
|
|
170
231
|
private agentSpeakingSpan?: Span;
|
|
171
232
|
|
|
233
|
+
private _interruptionDetection?: InterruptionOptions['mode'];
|
|
234
|
+
|
|
235
|
+
private _usageCollector: ModelUsageCollector = new ModelUsageCollector();
|
|
236
|
+
|
|
237
|
+
/** @internal */
|
|
238
|
+
_roomIO?: RoomIO;
|
|
239
|
+
|
|
240
|
+
/** @internal */
|
|
241
|
+
_aecWarmupRemaining = 0;
|
|
242
|
+
|
|
172
243
|
/** @internal */
|
|
173
244
|
_recorderIO?: RecorderIO;
|
|
174
245
|
|
|
@@ -187,20 +258,17 @@ export class AgentSession<
|
|
|
187
258
|
/** @internal - Current run state for testing */
|
|
188
259
|
_globalRunState?: RunResult;
|
|
189
260
|
|
|
190
|
-
|
|
261
|
+
/** @internal */
|
|
262
|
+
_userSpeakingSpan?: Span;
|
|
263
|
+
|
|
264
|
+
private logger = log();
|
|
265
|
+
|
|
266
|
+
constructor(options: AgentSessionOptions<UserData>) {
|
|
191
267
|
super();
|
|
192
268
|
|
|
193
|
-
const
|
|
194
|
-
vad,
|
|
195
|
-
stt,
|
|
196
|
-
llm,
|
|
197
|
-
tts,
|
|
198
|
-
turnDetection,
|
|
199
|
-
userData,
|
|
200
|
-
voiceOptions = defaultVoiceOptions,
|
|
201
|
-
connOptions,
|
|
202
|
-
} = opts;
|
|
269
|
+
const opts = migrateLegacyOptions<UserData>(options);
|
|
203
270
|
|
|
271
|
+
const { vad, stt, llm, tts, userData, connOptions, options: sessionOptions } = opts;
|
|
204
272
|
// Merge user-provided connOptions with defaults
|
|
205
273
|
this._connOptions = {
|
|
206
274
|
sttConnOptions: { ...DEFAULT_API_CONNECT_OPTIONS, ...connOptions?.sttConnOptions },
|
|
@@ -231,7 +299,8 @@ export class AgentSession<
|
|
|
231
299
|
this.tts = tts;
|
|
232
300
|
}
|
|
233
301
|
|
|
234
|
-
this.turnDetection = turnDetection;
|
|
302
|
+
this.turnDetection = sessionOptions?.turnHandling?.turnDetection;
|
|
303
|
+
this._interruptionDetection = sessionOptions?.turnHandling?.interruption?.mode;
|
|
235
304
|
this._userData = userData;
|
|
236
305
|
|
|
237
306
|
// configurable IO
|
|
@@ -240,7 +309,8 @@ export class AgentSession<
|
|
|
240
309
|
|
|
241
310
|
// This is the "global" chat context, it holds the entire conversation history
|
|
242
311
|
this._chatCtx = ChatContext.empty();
|
|
243
|
-
this.options =
|
|
312
|
+
this.options = opts.options;
|
|
313
|
+
this._aecWarmupRemaining = this.options.aecWarmupDuration ?? 0;
|
|
244
314
|
|
|
245
315
|
this._onUserInputTranscribed = this._onUserInputTranscribed.bind(this);
|
|
246
316
|
this.on(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);
|
|
@@ -252,6 +322,9 @@ export class AgentSession<
|
|
|
252
322
|
): boolean {
|
|
253
323
|
const eventData = args[0] as AgentEvent;
|
|
254
324
|
this._recordedEvents.push(eventData);
|
|
325
|
+
if (event === AgentSessionEventTypes.MetricsCollected) {
|
|
326
|
+
this._usageCollector.collect((eventData as MetricsCollectedEvent).metrics);
|
|
327
|
+
}
|
|
255
328
|
return super.emit(event, ...args);
|
|
256
329
|
}
|
|
257
330
|
|
|
@@ -280,6 +353,18 @@ export class AgentSession<
|
|
|
280
353
|
return this._connOptions;
|
|
281
354
|
}
|
|
282
355
|
|
|
356
|
+
get interruptionDetection() {
|
|
357
|
+
return this._interruptionDetection;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Returns usage summaries for this session, one per model/provider combination.
|
|
362
|
+
*/
|
|
363
|
+
get usage(): AgentSessionUsage {
|
|
364
|
+
// Skip zero fields for more concise usage display (matches python behavior).
|
|
365
|
+
return { modelUsage: this._usageCollector.flatten().map(filterZeroValues) };
|
|
366
|
+
}
|
|
367
|
+
|
|
283
368
|
get useTtsAlignedTranscript(): boolean {
|
|
284
369
|
return this.options.useTtsAlignedTranscript;
|
|
285
370
|
}
|
|
@@ -334,7 +419,15 @@ export class AgentSession<
|
|
|
334
419
|
inputOptions,
|
|
335
420
|
outputOptions,
|
|
336
421
|
});
|
|
422
|
+
|
|
337
423
|
this._roomIO.start();
|
|
424
|
+
|
|
425
|
+
this.clientEventsHandler = new ClientEventsHandler(this, this._roomIO);
|
|
426
|
+
if (inputOptions?.textEnabled !== false) {
|
|
427
|
+
this.clientEventsHandler.registerTextInput(
|
|
428
|
+
inputOptions?.textInputCallback ?? DEFAULT_TEXT_INPUT_CALLBACK,
|
|
429
|
+
);
|
|
430
|
+
}
|
|
338
431
|
}
|
|
339
432
|
|
|
340
433
|
let ctx: JobContext | undefined = undefined;
|
|
@@ -377,6 +470,10 @@ export class AgentSession<
|
|
|
377
470
|
|
|
378
471
|
await Promise.allSettled(tasks);
|
|
379
472
|
|
|
473
|
+
if (this.clientEventsHandler) {
|
|
474
|
+
await this.clientEventsHandler.start();
|
|
475
|
+
}
|
|
476
|
+
|
|
380
477
|
// Log used IO configuration
|
|
381
478
|
this.logger.debug(
|
|
382
479
|
`using audio io: ${this.input.audio ? '`' + this.input.audio.constructor.name + '`' : '(none)'} -> \`AgentSession\` -> ${this.output.audio ? '`' + this.output.audio.constructor.name + '`' : '(none)'}`,
|
|
@@ -408,6 +505,8 @@ export class AgentSession<
|
|
|
408
505
|
return;
|
|
409
506
|
}
|
|
410
507
|
|
|
508
|
+
this._usageCollector = new ModelUsageCollector();
|
|
509
|
+
|
|
411
510
|
let ctx: JobContext | undefined = undefined;
|
|
412
511
|
try {
|
|
413
512
|
ctx = getJobContext();
|
|
@@ -740,6 +839,10 @@ export class AgentSession<
|
|
|
740
839
|
return this._agentState;
|
|
741
840
|
}
|
|
742
841
|
|
|
842
|
+
get userState(): UserState {
|
|
843
|
+
return this._userState;
|
|
844
|
+
}
|
|
845
|
+
|
|
743
846
|
get currentAgent(): Agent {
|
|
744
847
|
if (!this.agent) {
|
|
745
848
|
throw new Error('AgentSession is not running');
|
|
@@ -778,7 +881,9 @@ export class AgentSession<
|
|
|
778
881
|
}
|
|
779
882
|
|
|
780
883
|
/** @internal */
|
|
781
|
-
_onError(
|
|
884
|
+
_onError(
|
|
885
|
+
error: RealtimeModelError | STTError | TTSError | LLMError | InterruptionDetectionError,
|
|
886
|
+
): void {
|
|
782
887
|
if (this.closingTask || error.recoverable) {
|
|
783
888
|
return;
|
|
784
889
|
}
|
|
@@ -794,6 +899,11 @@ export class AgentSession<
|
|
|
794
899
|
if (this.ttsErrorCounts <= this._connOptions.maxUnrecoverableErrors) {
|
|
795
900
|
return;
|
|
796
901
|
}
|
|
902
|
+
} else if (error.type === 'interruption_detection_error') {
|
|
903
|
+
this.interruptionDetectionErrorCounts += 1;
|
|
904
|
+
if (this.interruptionDetectionErrorCounts <= this._connOptions.maxUnrecoverableErrors) {
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
797
907
|
}
|
|
798
908
|
|
|
799
909
|
this.logger.error(error, 'AgentSession is closing due to unrecoverable error');
|
|
@@ -823,9 +933,9 @@ export class AgentSession<
|
|
|
823
933
|
}
|
|
824
934
|
|
|
825
935
|
if (state === 'speaking') {
|
|
826
|
-
// Reset error counts when agent starts speaking
|
|
827
936
|
this.llmErrorCounts = 0;
|
|
828
937
|
this.ttsErrorCounts = 0;
|
|
938
|
+
this.interruptionDetectionErrorCounts = 0;
|
|
829
939
|
|
|
830
940
|
if (this.agentSpeakingSpan === undefined) {
|
|
831
941
|
this.agentSpeakingSpan = tracer.startSpan({
|
|
@@ -845,11 +955,19 @@ export class AgentSession<
|
|
|
845
955
|
this.agentSpeakingSpan = undefined;
|
|
846
956
|
}
|
|
847
957
|
|
|
958
|
+
if (state === 'speaking' && this._aecWarmupRemaining > 0 && this._aecWarmupTimer === null) {
|
|
959
|
+
this._aecWarmupTimer = setTimeout(() => this._onAecWarmupExpired(), this._aecWarmupRemaining);
|
|
960
|
+
this.logger.debug(
|
|
961
|
+
{ warmupDurationMs: this._aecWarmupRemaining },
|
|
962
|
+
'aec warmup active, disabling interruptions',
|
|
963
|
+
);
|
|
964
|
+
}
|
|
965
|
+
|
|
848
966
|
const oldState = this._agentState;
|
|
849
967
|
this._agentState = state;
|
|
850
968
|
|
|
851
969
|
// Handle user away timer based on state changes
|
|
852
|
-
if (state === 'listening' && this.
|
|
970
|
+
if (state === 'listening' && this._userState === 'listening') {
|
|
853
971
|
this._setUserAwayTimer();
|
|
854
972
|
} else {
|
|
855
973
|
this._cancelUserAwayTimer();
|
|
@@ -863,12 +981,12 @@ export class AgentSession<
|
|
|
863
981
|
|
|
864
982
|
/** @internal */
|
|
865
983
|
_updateUserState(state: UserState, lastSpeakingTime?: number) {
|
|
866
|
-
if (this.
|
|
984
|
+
if (this._userState === state) {
|
|
867
985
|
return;
|
|
868
986
|
}
|
|
869
987
|
|
|
870
|
-
if (state === 'speaking' && this.
|
|
871
|
-
this.
|
|
988
|
+
if (state === 'speaking' && this._userSpeakingSpan === undefined) {
|
|
989
|
+
this._userSpeakingSpan = tracer.startSpan({
|
|
872
990
|
name: 'user_speaking',
|
|
873
991
|
context: this.rootSpanContext,
|
|
874
992
|
startTime: lastSpeakingTime,
|
|
@@ -876,15 +994,15 @@ export class AgentSession<
|
|
|
876
994
|
|
|
877
995
|
const linked = this._roomIO?.linkedParticipant;
|
|
878
996
|
if (linked) {
|
|
879
|
-
setParticipantSpanAttributes(this.
|
|
997
|
+
setParticipantSpanAttributes(this._userSpeakingSpan, linked);
|
|
880
998
|
}
|
|
881
|
-
} else if (this.
|
|
882
|
-
this.
|
|
883
|
-
this.
|
|
999
|
+
} else if (this._userSpeakingSpan !== undefined) {
|
|
1000
|
+
this._userSpeakingSpan.end(lastSpeakingTime);
|
|
1001
|
+
this._userSpeakingSpan = undefined;
|
|
884
1002
|
}
|
|
885
1003
|
|
|
886
|
-
const oldState = this.
|
|
887
|
-
this.
|
|
1004
|
+
const oldState = this._userState;
|
|
1005
|
+
this._userState = state;
|
|
888
1006
|
|
|
889
1007
|
// Handle user away timer based on state changes
|
|
890
1008
|
if (state === 'listening' && this._agentState === 'listening') {
|
|
@@ -938,8 +1056,21 @@ export class AgentSession<
|
|
|
938
1056
|
}
|
|
939
1057
|
}
|
|
940
1058
|
|
|
1059
|
+
/** @internal */
|
|
1060
|
+
_onAecWarmupExpired(): void {
|
|
1061
|
+
if (this._aecWarmupRemaining > 0) {
|
|
1062
|
+
this.logger.debug('aec warmup expired, re-enabling interruptions');
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
this._aecWarmupRemaining = 0;
|
|
1066
|
+
if (this._aecWarmupTimer !== null) {
|
|
1067
|
+
clearTimeout(this._aecWarmupTimer);
|
|
1068
|
+
this._aecWarmupTimer = null;
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
|
|
941
1072
|
private _onUserInputTranscribed(ev: UserInputTranscribedEvent): void {
|
|
942
|
-
if (this.
|
|
1073
|
+
if (this._userState === 'away' && ev.isFinal) {
|
|
943
1074
|
this.logger.debug('User returned from away state due to speech input');
|
|
944
1075
|
this._updateUserState('listening');
|
|
945
1076
|
}
|
|
@@ -947,7 +1078,13 @@ export class AgentSession<
|
|
|
947
1078
|
|
|
948
1079
|
private async closeImpl(
|
|
949
1080
|
reason: ShutdownReason,
|
|
950
|
-
error:
|
|
1081
|
+
error:
|
|
1082
|
+
| RealtimeModelError
|
|
1083
|
+
| LLMError
|
|
1084
|
+
| TTSError
|
|
1085
|
+
| STTError
|
|
1086
|
+
| InterruptionDetectionError
|
|
1087
|
+
| null = null,
|
|
951
1088
|
drain: boolean = false,
|
|
952
1089
|
): Promise<void> {
|
|
953
1090
|
if (this.rootSpanContext) {
|
|
@@ -961,7 +1098,13 @@ export class AgentSession<
|
|
|
961
1098
|
|
|
962
1099
|
private async closeImplInner(
|
|
963
1100
|
reason: ShutdownReason,
|
|
964
|
-
error:
|
|
1101
|
+
error:
|
|
1102
|
+
| RealtimeModelError
|
|
1103
|
+
| LLMError
|
|
1104
|
+
| TTSError
|
|
1105
|
+
| STTError
|
|
1106
|
+
| InterruptionDetectionError
|
|
1107
|
+
| null = null,
|
|
965
1108
|
drain: boolean = false,
|
|
966
1109
|
): Promise<void> {
|
|
967
1110
|
if (!this.started) {
|
|
@@ -969,6 +1112,7 @@ export class AgentSession<
|
|
|
969
1112
|
}
|
|
970
1113
|
|
|
971
1114
|
this._cancelUserAwayTimer();
|
|
1115
|
+
this._onAecWarmupExpired();
|
|
972
1116
|
this.off(AgentSessionEventTypes.UserInputTranscribed, this._onUserInputTranscribed);
|
|
973
1117
|
|
|
974
1118
|
if (this.activity) {
|
|
@@ -1006,6 +1150,9 @@ export class AgentSession<
|
|
|
1006
1150
|
this.output.audio = null;
|
|
1007
1151
|
this.output.transcription = null;
|
|
1008
1152
|
|
|
1153
|
+
await this.clientEventsHandler?.close();
|
|
1154
|
+
this.clientEventsHandler = undefined;
|
|
1155
|
+
|
|
1009
1156
|
await this._roomIO?.close();
|
|
1010
1157
|
this._roomIO = undefined;
|
|
1011
1158
|
|
|
@@ -1017,9 +1164,9 @@ export class AgentSession<
|
|
|
1017
1164
|
this.sessionSpan = undefined;
|
|
1018
1165
|
}
|
|
1019
1166
|
|
|
1020
|
-
if (this.
|
|
1021
|
-
this.
|
|
1022
|
-
this.
|
|
1167
|
+
if (this._userSpeakingSpan) {
|
|
1168
|
+
this._userSpeakingSpan.end();
|
|
1169
|
+
this._userSpeakingSpan = undefined;
|
|
1023
1170
|
}
|
|
1024
1171
|
|
|
1025
1172
|
if (this.agentSpeakingSpan) {
|
|
@@ -1031,11 +1178,12 @@ export class AgentSession<
|
|
|
1031
1178
|
|
|
1032
1179
|
this.emit(AgentSessionEventTypes.Close, createCloseEvent(reason, error));
|
|
1033
1180
|
|
|
1034
|
-
this.
|
|
1181
|
+
this._userState = 'listening';
|
|
1035
1182
|
this._agentState = 'initializing';
|
|
1036
1183
|
this.rootSpanContext = undefined;
|
|
1037
1184
|
this.llmErrorCounts = 0;
|
|
1038
1185
|
this.ttsErrorCounts = 0;
|
|
1186
|
+
this.interruptionDetectionErrorCounts = 0;
|
|
1039
1187
|
|
|
1040
1188
|
this.logger.info({ reason, error }, 'AgentSession closed');
|
|
1041
1189
|
}
|