@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool_context.d.ts","sourceRoot":"","sources":["../../src/llm/tool_context.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tool_context.d.ts","sourceRoot":"","sources":["../../src/llm/tool_context.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/tool_context.js
CHANGED
|
@@ -13,6 +13,10 @@ class ToolError extends Error {
|
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
+
const ToolFlag = {
|
|
17
|
+
NONE: 0,
|
|
18
|
+
IGNORE_ON_ENTER: 1 << 0
|
|
19
|
+
};
|
|
16
20
|
function handoff(options) {
|
|
17
21
|
return {
|
|
18
22
|
agent: options.agent,
|
|
@@ -70,6 +74,7 @@ function tool(tool2) {
|
|
|
70
74
|
description: tool2.description,
|
|
71
75
|
parameters,
|
|
72
76
|
execute: tool2.execute,
|
|
77
|
+
flags: tool2.flags ?? ToolFlag.NONE,
|
|
73
78
|
[TOOL_SYMBOL]: true,
|
|
74
79
|
[FUNCTION_TOOL_SYMBOL]: true
|
|
75
80
|
};
|
|
@@ -106,6 +111,7 @@ function isAgentHandoff(handoff2) {
|
|
|
106
111
|
}
|
|
107
112
|
export {
|
|
108
113
|
ToolError,
|
|
114
|
+
ToolFlag,
|
|
109
115
|
handoff,
|
|
110
116
|
isAgentHandoff,
|
|
111
117
|
isFunctionTool,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/llm/tool_context.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { z } from 'zod';\nimport type { Agent } from '../voice/agent.js';\nimport type { RunContext, UnknownUserData } from '../voice/run_context.js';\nimport { isZodObjectSchema, isZodSchema } from './zod-utils.js';\n\n// heavily inspired by Vercel AI's `tool()`:\n// https://github.com/vercel/ai/blob/3b0983b/packages/ai/core/tool/tool.ts\n\nconst TOOL_SYMBOL = Symbol('tool');\nconst FUNCTION_TOOL_SYMBOL = Symbol('function_tool');\nconst PROVIDER_DEFINED_TOOL_SYMBOL = Symbol('provider_defined_tool');\nconst TOOL_ERROR_SYMBOL = Symbol('tool_error');\nconst HANDOFF_SYMBOL = Symbol('handoff');\n\nexport type JSONValue = null | string | number | boolean | JSONObject | JSONArray;\n\nexport type JSONArray = JSONValue[];\n\nexport type JSONObject = {\n [key: string]: JSONValue;\n};\n\n// Supports both Zod v3 and v4 schemas, as well as raw JSON schema\n// Adapted from Vercel AI SDK's FlexibleSchema approach\n// Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L67-L70\n//\n// Vercel uses StandardSchemaV1 from @standard-schema/spec package.\n// We use a simpler approach by directly checking for schema properties:\n// - Zod v3: Has `_output` property\n// - Zod v4: Implements Standard Schema spec with `~standard` property\n// - JSON Schema: Plain object fallback\nexport type ToolInputSchema<T = JSONObject> =\n | {\n // Zod v3 schema - has _output property for type inference\n _output: T;\n }\n | {\n // Zod v4 schema (Standard Schema) - has ~standard property\n '~standard': {\n types?: { output: T };\n };\n }\n | JSONSchema7;\n\n/**\n * Infer the output type from a ToolInputSchema.\n * Adapted from Vercel AI SDK's InferSchema type.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L72-L79\n */\nexport type InferToolInput<T> = T extends { _output: infer O }\n ? O\n : T extends { '~standard': { types?: { output: infer O } } }\n ? O\n : any; // eslint-disable-line @typescript-eslint/no-explicit-any -- Fallback type for JSON Schema objects without type inference\n\nexport type ToolType = 'function' | 'provider-defined';\n\nexport type ToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | {\n type: 'function';\n function: {\n name: string;\n };\n };\n\nexport class ToolError extends Error {\n constructor(message: string) {\n super(message);\n\n Object.defineProperty(this, TOOL_ERROR_SYMBOL, {\n value: true,\n });\n }\n}\n\nexport interface AgentHandoff {\n /**\n * The agent to handoff to.\n */\n agent: Agent;\n\n /**\n * The return value of the tool.\n */\n returns?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n [HANDOFF_SYMBOL]: true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handoff(options: { agent: Agent; returns?: any }): AgentHandoff {\n return {\n agent: options.agent,\n returns: options.returns,\n [HANDOFF_SYMBOL]: true,\n };\n}\n\nexport interface ToolOptions<UserData = UnknownUserData> {\n /**\n * RunContext for the current agent session.\n */\n ctx: RunContext<UserData>;\n\n /**\n * The ID of the tool call.\n */\n toolCallId: string;\n\n /**\n * An optional abort signal that indicates that the overall operation should be aborted.\n */\n abortSignal?: AbortSignal;\n}\n\nexport type ToolExecuteFunction<\n Parameters extends JSONObject,\n UserData = UnknownUserData,\n Result = unknown,\n> = (args: Parameters, opts: ToolOptions<UserData>) => Promise<Result>;\n\nexport interface Tool {\n /**\n * The type of the tool.\n * @internal Either user-defined core tool or provider-defined tool.\n */\n type: ToolType;\n\n [TOOL_SYMBOL]: true;\n}\n\n// TODO(AJS-112): support provider-defined tools\nexport interface ProviderDefinedTool extends Tool {\n type: 'provider-defined';\n\n /**\n * The ID of the tool.\n */\n id: string;\n\n /**\n * The configuration of the tool.\n */\n config: Record<string, unknown>;\n\n [PROVIDER_DEFINED_TOOL_SYMBOL]: true;\n}\n\nexport interface FunctionTool<\n Parameters extends JSONObject,\n UserData = UnknownUserData,\n Result = unknown,\n> extends Tool {\n type: 'function';\n\n /**\n * The description of the tool. Will be used by the language model to decide whether to use the tool.\n */\n description: string;\n\n /**\n * The schema of the input that the tool expects. The language model will use this to generate the input.\n * It is also used to validate the output of the language model.\n * Use descriptions to make the input understandable for the language model.\n */\n parameters: ToolInputSchema<Parameters>;\n\n /**\n * An async function that is called with the arguments from the tool call and produces a result.\n * It also carries context about current session, user-defined data, and the tool call id, etc.\n */\n execute: ToolExecuteFunction<Parameters, UserData, Result>;\n\n [FUNCTION_TOOL_SYMBOL]: true;\n}\n\n// TODO(AJS-112): support provider-defined tools in the future)\nexport type ToolContext<UserData = UnknownUserData> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Generic tool registry needs to accept any parameter/result types\n [name: string]: FunctionTool<any, UserData, any>;\n};\n\nexport function isSameToolContext(ctx1: ToolContext, ctx2: ToolContext): boolean {\n const toolNames = new Set(Object.keys(ctx1));\n const toolNames2 = new Set(Object.keys(ctx2));\n\n if (toolNames.size !== toolNames2.size) {\n return false;\n }\n\n for (const name of toolNames) {\n if (!toolNames2.has(name)) {\n return false;\n }\n\n const tool1 = ctx1[name];\n const tool2 = ctx2[name];\n\n if (!tool1 || !tool2) {\n return false;\n }\n\n if (tool1.description !== tool2.description) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function isSameToolChoice(choice1: ToolChoice | null, choice2: ToolChoice | null): boolean {\n if (choice1 === choice2) {\n return true;\n }\n if (choice1 === null || choice2 === null) {\n return false;\n }\n if (typeof choice1 === 'string' && typeof choice2 === 'string') {\n return choice1 === choice2;\n }\n if (typeof choice1 === 'object' && typeof choice2 === 'object') {\n return choice1.type === choice2.type && choice1.function.name === choice2.function.name;\n }\n return false;\n}\n\n/**\n * Create a function tool with inferred parameters from the schema.\n */\nexport function tool<\n Schema extends ToolInputSchema<any>, // eslint-disable-line @typescript-eslint/no-explicit-any -- Generic constraint needs to accept any JSONObject type\n UserData = UnknownUserData,\n Result = unknown,\n>({\n description,\n parameters,\n execute,\n}: {\n description: string;\n parameters: Schema;\n execute: ToolExecuteFunction<InferToolInput<Schema>, UserData, Result>;\n}): FunctionTool<InferToolInput<Schema>, UserData, Result>;\n\n/**\n * Create a function tool without parameters.\n */\nexport function tool<UserData = UnknownUserData, Result = unknown>({\n description,\n execute,\n}: {\n description: string;\n parameters?: never;\n execute: ToolExecuteFunction<Record<string, never>, UserData, Result>;\n}): FunctionTool<Record<string, never>, UserData, Result>;\n\n/**\n * Create a provider-defined tool.\n *\n * @param id - The ID of the tool.\n * @param config - The configuration of the tool.\n */\nexport function tool({\n id,\n config,\n}: {\n id: string;\n config: Record<string, unknown>;\n}): ProviderDefinedTool;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function tool(tool: any): any {\n if (tool.execute !== undefined) {\n // Default parameters to z.object({}) if not provided\n const parameters = tool.parameters ?? z.object({});\n\n // if parameters is a Zod schema, ensure it's an object schema\n if (isZodSchema(parameters) && !isZodObjectSchema(parameters)) {\n throw new Error('Tool parameters must be a Zod object schema (z.object(...))');\n }\n\n // Ensure parameters is either a Zod schema or a plain object (JSON schema)\n if (!isZodSchema(parameters) && !(typeof parameters === 'object')) {\n throw new Error('Tool parameters must be a Zod object schema or a raw JSON schema');\n }\n\n return {\n type: 'function',\n description: tool.description,\n parameters,\n execute: tool.execute,\n [TOOL_SYMBOL]: true,\n [FUNCTION_TOOL_SYMBOL]: true,\n };\n }\n\n if (tool.config !== undefined && tool.id !== undefined) {\n return {\n type: 'provider-defined',\n id: tool.id,\n config: tool.config,\n [TOOL_SYMBOL]: true,\n [PROVIDER_DEFINED_TOOL_SYMBOL]: true,\n };\n }\n\n throw new Error('Invalid tool');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isTool(tool: any): tool is Tool {\n return tool && tool[TOOL_SYMBOL] === true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isFunctionTool(tool: any): tool is FunctionTool<any, any, any> {\n const isTool = tool && tool[TOOL_SYMBOL] === true;\n const isFunctionTool = tool[FUNCTION_TOOL_SYMBOL] === true;\n return isTool && isFunctionTool;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isProviderDefinedTool(tool: any): tool is ProviderDefinedTool {\n const isTool = tool && tool[TOOL_SYMBOL] === true;\n const isProviderDefinedTool = tool[PROVIDER_DEFINED_TOOL_SYMBOL] === true;\n return isTool && isProviderDefinedTool;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isToolError(error: any): error is ToolError {\n return error && error[TOOL_ERROR_SYMBOL] === true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isAgentHandoff(handoff: any): handoff is AgentHandoff {\n return handoff && handoff[HANDOFF_SYMBOL] === true;\n}\n"],"mappings":"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","names":["tool","isTool","isFunctionTool","isProviderDefinedTool","handoff"]}
|
|
1
|
+
{"version":3,"sources":["../../src/llm/tool_context.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { z } from 'zod';\nimport type { Agent } from '../voice/agent.js';\nimport type { RunContext, UnknownUserData } from '../voice/run_context.js';\nimport { isZodObjectSchema, isZodSchema } from './zod-utils.js';\n\n// heavily inspired by Vercel AI's `tool()`:\n// https://github.com/vercel/ai/blob/3b0983b/packages/ai/core/tool/tool.ts\n\nconst TOOL_SYMBOL = Symbol('tool');\nconst FUNCTION_TOOL_SYMBOL = Symbol('function_tool');\nconst PROVIDER_DEFINED_TOOL_SYMBOL = Symbol('provider_defined_tool');\nconst TOOL_ERROR_SYMBOL = Symbol('tool_error');\nconst HANDOFF_SYMBOL = Symbol('handoff');\n\nexport type JSONValue = null | string | number | boolean | JSONObject | JSONArray;\n\nexport type JSONArray = JSONValue[];\n\nexport type JSONObject = {\n [key: string]: JSONValue;\n};\n\n// Supports both Zod v3 and v4 schemas, as well as raw JSON schema\n// Adapted from Vercel AI SDK's FlexibleSchema approach\n// Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L67-L70\n//\n// Vercel uses StandardSchemaV1 from @standard-schema/spec package.\n// We use a simpler approach by directly checking for schema properties:\n// - Zod v3: Has `_output` property\n// - Zod v4: Implements Standard Schema spec with `~standard` property\n// - JSON Schema: Plain object fallback\nexport type ToolInputSchema<T = JSONObject> =\n | {\n // Zod v3 schema - has _output property for type inference\n _output: T;\n }\n | {\n // Zod v4 schema (Standard Schema) - has ~standard property\n '~standard': {\n types?: { output: T };\n };\n }\n | JSONSchema7;\n\n/**\n * Infer the output type from a ToolInputSchema.\n * Adapted from Vercel AI SDK's InferSchema type.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L72-L79\n */\nexport type InferToolInput<T> = T extends { _output: infer O }\n ? O\n : T extends { '~standard': { types?: { output: infer O } } }\n ? O\n : any; // eslint-disable-line @typescript-eslint/no-explicit-any -- Fallback type for JSON Schema objects without type inference\n\nexport type ToolType = 'function' | 'provider-defined';\n\nexport type ToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | {\n type: 'function';\n function: {\n name: string;\n };\n };\n\nexport class ToolError extends Error {\n constructor(message: string) {\n super(message);\n\n Object.defineProperty(this, TOOL_ERROR_SYMBOL, {\n value: true,\n });\n }\n}\n\nexport const ToolFlag = {\n NONE: 0,\n IGNORE_ON_ENTER: 1 << 0,\n} as const;\n\nexport type ToolFlag = (typeof ToolFlag)[keyof typeof ToolFlag];\n\nexport interface AgentHandoff {\n /**\n * The agent to handoff to.\n */\n agent: Agent;\n\n /**\n * The return value of the tool.\n */\n returns?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n [HANDOFF_SYMBOL]: true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handoff(options: { agent: Agent; returns?: any }): AgentHandoff {\n return {\n agent: options.agent,\n returns: options.returns,\n [HANDOFF_SYMBOL]: true,\n };\n}\n\nexport interface ToolOptions<UserData = UnknownUserData> {\n /**\n * RunContext for the current agent session.\n */\n ctx: RunContext<UserData>;\n\n /**\n * The ID of the tool call.\n */\n toolCallId: string;\n\n /**\n * An optional abort signal that indicates that the overall operation should be aborted.\n */\n abortSignal?: AbortSignal;\n}\n\nexport type ToolExecuteFunction<\n Parameters extends JSONObject,\n UserData = UnknownUserData,\n Result = unknown,\n> = (args: Parameters, opts: ToolOptions<UserData>) => Promise<Result>;\n\nexport interface Tool {\n /**\n * The type of the tool.\n * @internal Either user-defined core tool or provider-defined tool.\n */\n type: ToolType;\n\n [TOOL_SYMBOL]: true;\n}\n\n// TODO(AJS-112): support provider-defined tools\nexport interface ProviderDefinedTool extends Tool {\n type: 'provider-defined';\n\n /**\n * The ID of the tool.\n */\n id: string;\n\n /**\n * The configuration of the tool.\n */\n config: Record<string, unknown>;\n\n [PROVIDER_DEFINED_TOOL_SYMBOL]: true;\n}\n\nexport interface FunctionTool<\n Parameters extends JSONObject,\n UserData = UnknownUserData,\n Result = unknown,\n> extends Tool {\n type: 'function';\n\n /**\n * The description of the tool. Will be used by the language model to decide whether to use the tool.\n */\n description: string;\n\n /**\n * The schema of the input that the tool expects. The language model will use this to generate the input.\n * It is also used to validate the output of the language model.\n * Use descriptions to make the input understandable for the language model.\n */\n parameters: ToolInputSchema<Parameters>;\n\n /**\n * An async function that is called with the arguments from the tool call and produces a result.\n * It also carries context about current session, user-defined data, and the tool call id, etc.\n */\n execute: ToolExecuteFunction<Parameters, UserData, Result>;\n\n flags: number;\n\n [FUNCTION_TOOL_SYMBOL]: true;\n}\n\n// TODO(AJS-112): support provider-defined tools in the future)\nexport type ToolContext<UserData = UnknownUserData> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Generic tool registry needs to accept any parameter/result types\n [name: string]: FunctionTool<any, UserData, any>;\n};\n\nexport function isSameToolContext(ctx1: ToolContext, ctx2: ToolContext): boolean {\n const toolNames = new Set(Object.keys(ctx1));\n const toolNames2 = new Set(Object.keys(ctx2));\n\n if (toolNames.size !== toolNames2.size) {\n return false;\n }\n\n for (const name of toolNames) {\n if (!toolNames2.has(name)) {\n return false;\n }\n\n const tool1 = ctx1[name];\n const tool2 = ctx2[name];\n\n if (!tool1 || !tool2) {\n return false;\n }\n\n if (tool1.description !== tool2.description) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function isSameToolChoice(choice1: ToolChoice | null, choice2: ToolChoice | null): boolean {\n if (choice1 === choice2) {\n return true;\n }\n if (choice1 === null || choice2 === null) {\n return false;\n }\n if (typeof choice1 === 'string' && typeof choice2 === 'string') {\n return choice1 === choice2;\n }\n if (typeof choice1 === 'object' && typeof choice2 === 'object') {\n return choice1.type === choice2.type && choice1.function.name === choice2.function.name;\n }\n return false;\n}\n\n/**\n * Create a function tool with inferred parameters from the schema.\n */\nexport function tool<\n Schema extends ToolInputSchema<any>, // eslint-disable-line @typescript-eslint/no-explicit-any -- Generic constraint needs to accept any JSONObject type\n UserData = UnknownUserData,\n Result = unknown,\n>({\n description,\n parameters,\n execute,\n flags,\n}: {\n description: string;\n parameters: Schema;\n execute: ToolExecuteFunction<InferToolInput<Schema>, UserData, Result>;\n flags?: number;\n}): FunctionTool<InferToolInput<Schema>, UserData, Result>;\n\n/**\n * Create a function tool without parameters.\n */\nexport function tool<UserData = UnknownUserData, Result = unknown>({\n description,\n execute,\n flags,\n}: {\n description: string;\n parameters?: never;\n execute: ToolExecuteFunction<Record<string, never>, UserData, Result>;\n flags?: number;\n}): FunctionTool<Record<string, never>, UserData, Result>;\n\n/**\n * Create a provider-defined tool.\n *\n * @param id - The ID of the tool.\n * @param config - The configuration of the tool.\n */\nexport function tool({\n id,\n config,\n}: {\n id: string;\n config: Record<string, unknown>;\n}): ProviderDefinedTool;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function tool(tool: any): any {\n if (tool.execute !== undefined) {\n // Default parameters to z.object({}) if not provided\n const parameters = tool.parameters ?? z.object({});\n\n // if parameters is a Zod schema, ensure it's an object schema\n if (isZodSchema(parameters) && !isZodObjectSchema(parameters)) {\n throw new Error('Tool parameters must be a Zod object schema (z.object(...))');\n }\n\n // Ensure parameters is either a Zod schema or a plain object (JSON schema)\n if (!isZodSchema(parameters) && !(typeof parameters === 'object')) {\n throw new Error('Tool parameters must be a Zod object schema or a raw JSON schema');\n }\n\n return {\n type: 'function',\n description: tool.description,\n parameters,\n execute: tool.execute,\n flags: tool.flags ?? ToolFlag.NONE,\n [TOOL_SYMBOL]: true,\n [FUNCTION_TOOL_SYMBOL]: true,\n };\n }\n\n if (tool.config !== undefined && tool.id !== undefined) {\n return {\n type: 'provider-defined',\n id: tool.id,\n config: tool.config,\n [TOOL_SYMBOL]: true,\n [PROVIDER_DEFINED_TOOL_SYMBOL]: true,\n };\n }\n\n throw new Error('Invalid tool');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isTool(tool: any): tool is Tool {\n return tool && tool[TOOL_SYMBOL] === true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isFunctionTool(tool: any): tool is FunctionTool<any, any, any> {\n const isTool = tool && tool[TOOL_SYMBOL] === true;\n const isFunctionTool = tool[FUNCTION_TOOL_SYMBOL] === true;\n return isTool && isFunctionTool;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isProviderDefinedTool(tool: any): tool is ProviderDefinedTool {\n const isTool = tool && tool[TOOL_SYMBOL] === true;\n const isProviderDefinedTool = tool[PROVIDER_DEFINED_TOOL_SYMBOL] === true;\n return isTool && isProviderDefinedTool;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isToolError(error: any): error is ToolError {\n return error && error[TOOL_ERROR_SYMBOL] === true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isAgentHandoff(handoff: any): handoff is AgentHandoff {\n return handoff && handoff[HANDOFF_SYMBOL] === true;\n}\n"],"mappings":"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","names":["tool","isTool","isFunctionTool","isProviderDefinedTool","handoff"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/base.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type AgentMetrics =\n | STTMetrics\n | LLMMetrics\n | TTSMetrics\n | VADMetrics\n | EOUMetrics\n | RealtimeModelMetrics;\n\nexport type LLMMetrics = {\n type: 'llm_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n /** Duration of the request in milliseconds. */\n durationMs: number;\n /** Time to first token in milliseconds. */\n ttftMs: number;\n cancelled: boolean;\n completionTokens: number;\n promptTokens: number;\n promptCachedTokens: number;\n totalTokens: number;\n tokensPerSecond: number;\n speechId?: string;\n};\n\nexport type STTMetrics = {\n type: 'stt_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n /**\n * The request duration in milliseconds, 0.0 if the STT is streaming.\n */\n durationMs: number;\n /**\n * The duration of the pushed audio in milliseconds.\n */\n audioDurationMs: number;\n /**\n * Whether the STT is streaming (e.g using websocket).\n */\n streamed: boolean;\n};\n\nexport type TTSMetrics = {\n type: 'tts_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n /** Time to first byte in milliseconds. */\n ttfbMs: number;\n /** Total synthesis duration in milliseconds. */\n durationMs: number;\n /** Generated audio duration in milliseconds. */\n audioDurationMs: number;\n cancelled: boolean;\n charactersCount: number;\n streamed: boolean;\n segmentId?: string;\n speechId?: string;\n};\n\nexport type VADMetrics = {\n type: 'vad_metrics';\n label: string;\n timestamp: number;\n idleTimeMs: number;\n inferenceDurationTotalMs: number;\n inferenceCount: number;\n};\n\nexport type EOUMetrics = {\n type: 'eou_metrics';\n timestamp: number;\n /**\n * Amount of time between the end of speech from VAD and the decision to end the user's turn.\n * Set to 0.0 if the end of speech was not detected.\n */\n endOfUtteranceDelayMs: number;\n /**\n * Time taken to obtain the transcript after the end of the user's speech.\n * Set to 0.0 if the end of speech was not detected.\n */\n transcriptionDelayMs: number;\n /**\n * Time taken to invoke the user's `Agent.onUserTurnCompleted` callback.\n */\n onUserTurnCompletedDelayMs: number;\n /**\n * The time the user stopped speaking.\n */\n lastSpeakingTimeMs: number;\n /**\n * The ID of the speech handle.\n */\n speechId?: string;\n};\n\nexport type RealtimeModelMetricsCachedTokenDetails = {\n audioTokens: number;\n textTokens: number;\n imageTokens: number;\n};\n\nexport type RealtimeModelMetricsInputTokenDetails = {\n audioTokens: number;\n textTokens: number;\n imageTokens: number;\n cachedTokens: number;\n cachedTokensDetails?: RealtimeModelMetricsCachedTokenDetails;\n};\n\nexport type RealtimeModelMetricsOutputTokenDetails = {\n textTokens: number;\n audioTokens: number;\n imageTokens: number;\n};\n\nexport type RealtimeModelMetrics = {\n type: 'realtime_model_metrics';\n label: string;\n requestId: string;\n /**\n * The timestamp of the response creation.\n */\n timestamp: number;\n /**\n * The duration of the response from created to done in milliseconds.\n */\n durationMs: number;\n /**\n * Time to first audio token in milliseconds. -1 if no audio token was sent.\n */\n ttftMs: number;\n /**\n * Whether the request was cancelled.\n */\n cancelled: boolean;\n /**\n * The number of input tokens used in the Response, including text and audio tokens.\n */\n inputTokens: number;\n /**\n * The number of output tokens sent in the Response, including text and audio tokens.\n */\n outputTokens: number;\n /**\n * The total number of tokens in the Response.\n */\n totalTokens: number;\n /**\n * The number of tokens per second.\n */\n tokensPerSecond: number;\n /**\n * Details about the input tokens used in the Response.\n */\n inputTokenDetails: RealtimeModelMetricsInputTokenDetails;\n /**\n * Details about the output tokens used in the Response.\n */\n outputTokenDetails: RealtimeModelMetricsOutputTokenDetails;\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/base.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type MetricsMetadata = {\n /** The provider name (e.g., 'openai', 'anthropic'). */\n modelProvider?: string;\n /** The model name (e.g., 'gpt-4o', 'claude-3-5-sonnet'). */\n modelName?: string;\n};\n\nexport type AgentMetrics =\n | STTMetrics\n | LLMMetrics\n | TTSMetrics\n | VADMetrics\n | EOUMetrics\n | RealtimeModelMetrics\n | InterruptionMetrics;\n\nexport type LLMMetrics = {\n type: 'llm_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n /** Duration of the request in milliseconds. */\n durationMs: number;\n /** Time to first token in milliseconds. */\n ttftMs: number;\n cancelled: boolean;\n completionTokens: number;\n promptTokens: number;\n promptCachedTokens: number;\n totalTokens: number;\n tokensPerSecond: number;\n speechId?: string;\n /** Metadata for model provider and name tracking. */\n metadata?: MetricsMetadata;\n};\n\nexport type STTMetrics = {\n type: 'stt_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n /**\n * The request duration in milliseconds, 0.0 if the STT is streaming.\n */\n durationMs: number;\n /**\n * The duration of the pushed audio in milliseconds.\n */\n audioDurationMs: number;\n /** Input audio tokens (for token-based billing). */\n inputTokens?: number;\n /** Output text tokens (for token-based billing). */\n outputTokens?: number;\n /**\n * Whether the STT is streaming (e.g using websocket).\n */\n streamed: boolean;\n /** Metadata for model provider and name tracking. */\n metadata?: MetricsMetadata;\n};\n\nexport type TTSMetrics = {\n type: 'tts_metrics';\n label: string;\n requestId: string;\n timestamp: number;\n /** Time to first byte in milliseconds. */\n ttfbMs: number;\n /** Total synthesis duration in milliseconds. */\n durationMs: number;\n /** Generated audio duration in milliseconds. */\n audioDurationMs: number;\n cancelled: boolean;\n /** Number of characters synthesized (for character-based billing). */\n charactersCount: number;\n /** Input text tokens (for token-based billing, e.g., OpenAI TTS). */\n inputTokens?: number;\n /** Output audio tokens (for token-based billing, e.g., OpenAI TTS). */\n outputTokens?: number;\n streamed: boolean;\n segmentId?: string;\n speechId?: string;\n /** Metadata for model provider and name tracking. */\n metadata?: MetricsMetadata;\n};\n\nexport type VADMetrics = {\n type: 'vad_metrics';\n label: string;\n timestamp: number;\n idleTimeMs: number;\n inferenceDurationTotalMs: number;\n inferenceCount: number;\n};\n\nexport type EOUMetrics = {\n type: 'eou_metrics';\n timestamp: number;\n /**\n * Amount of time between the end of speech from VAD and the decision to end the user's turn.\n * Set to 0.0 if the end of speech was not detected.\n */\n endOfUtteranceDelayMs: number;\n /**\n * Time taken to obtain the transcript after the end of the user's speech.\n * Set to 0.0 if the end of speech was not detected.\n */\n transcriptionDelayMs: number;\n /**\n * Time taken to invoke the user's `Agent.onUserTurnCompleted` callback.\n */\n onUserTurnCompletedDelayMs: number;\n /**\n * The time the user stopped speaking.\n */\n lastSpeakingTimeMs: number;\n /**\n * The ID of the speech handle.\n */\n speechId?: string;\n};\n\nexport type RealtimeModelMetricsCachedTokenDetails = {\n audioTokens: number;\n textTokens: number;\n imageTokens: number;\n};\n\nexport type RealtimeModelMetricsInputTokenDetails = {\n audioTokens: number;\n textTokens: number;\n imageTokens: number;\n cachedTokens: number;\n cachedTokensDetails?: RealtimeModelMetricsCachedTokenDetails;\n};\n\nexport type RealtimeModelMetricsOutputTokenDetails = {\n textTokens: number;\n audioTokens: number;\n imageTokens: number;\n};\n\nexport type RealtimeModelMetrics = {\n type: 'realtime_model_metrics';\n label: string;\n requestId: string;\n /**\n * The timestamp of the response creation.\n */\n timestamp: number;\n /**\n * The duration of the response from created to done in milliseconds.\n */\n durationMs: number;\n /**\n * The duration of the session connection in milliseconds (for session-based billing like xAI).\n */\n sessionDurationMs?: number;\n /**\n * Time to first audio token in milliseconds. -1 if no audio token was sent.\n */\n ttftMs: number;\n /**\n * Whether the request was cancelled.\n */\n cancelled: boolean;\n /**\n * The number of input tokens used in the Response, including text and audio tokens.\n */\n inputTokens: number;\n /**\n * The number of output tokens sent in the Response, including text and audio tokens.\n */\n outputTokens: number;\n /**\n * The total number of tokens in the Response.\n */\n totalTokens: number;\n /**\n * The number of tokens per second.\n */\n tokensPerSecond: number;\n /**\n * Details about the input tokens used in the Response.\n */\n inputTokenDetails: RealtimeModelMetricsInputTokenDetails;\n /**\n * Details about the output tokens used in the Response.\n */\n outputTokenDetails: RealtimeModelMetricsOutputTokenDetails;\n /** Metadata for model provider and name tracking. */\n metadata?: MetricsMetadata;\n};\n\nexport type InterruptionMetrics = {\n type: 'interruption_metrics';\n timestamp: number;\n /** Latest RTT time taken to perform inference, in milliseconds. */\n totalDuration: number;\n /** Latest time taken by the model side, in milliseconds. */\n predictionDuration: number;\n /** Latest total time from onset of speech to final prediction, in milliseconds. */\n detectionDelay: number;\n /** Number of interruptions detected (incremental). */\n numInterruptions: number;\n /** Number of backchannels detected (incremental). */\n numBackchannels: number;\n /** Number of requests sent to the model (incremental). */\n numRequests: number;\n metadata?: MetricsMetadata;\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
package/dist/metrics/base.d.cts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type MetricsMetadata = {
|
|
2
|
+
/** The provider name (e.g., 'openai', 'anthropic'). */
|
|
3
|
+
modelProvider?: string;
|
|
4
|
+
/** The model name (e.g., 'gpt-4o', 'claude-3-5-sonnet'). */
|
|
5
|
+
modelName?: string;
|
|
6
|
+
};
|
|
7
|
+
export type AgentMetrics = STTMetrics | LLMMetrics | TTSMetrics | VADMetrics | EOUMetrics | RealtimeModelMetrics | InterruptionMetrics;
|
|
2
8
|
export type LLMMetrics = {
|
|
3
9
|
type: 'llm_metrics';
|
|
4
10
|
label: string;
|
|
@@ -15,6 +21,8 @@ export type LLMMetrics = {
|
|
|
15
21
|
totalTokens: number;
|
|
16
22
|
tokensPerSecond: number;
|
|
17
23
|
speechId?: string;
|
|
24
|
+
/** Metadata for model provider and name tracking. */
|
|
25
|
+
metadata?: MetricsMetadata;
|
|
18
26
|
};
|
|
19
27
|
export type STTMetrics = {
|
|
20
28
|
type: 'stt_metrics';
|
|
@@ -29,10 +37,16 @@ export type STTMetrics = {
|
|
|
29
37
|
* The duration of the pushed audio in milliseconds.
|
|
30
38
|
*/
|
|
31
39
|
audioDurationMs: number;
|
|
40
|
+
/** Input audio tokens (for token-based billing). */
|
|
41
|
+
inputTokens?: number;
|
|
42
|
+
/** Output text tokens (for token-based billing). */
|
|
43
|
+
outputTokens?: number;
|
|
32
44
|
/**
|
|
33
45
|
* Whether the STT is streaming (e.g using websocket).
|
|
34
46
|
*/
|
|
35
47
|
streamed: boolean;
|
|
48
|
+
/** Metadata for model provider and name tracking. */
|
|
49
|
+
metadata?: MetricsMetadata;
|
|
36
50
|
};
|
|
37
51
|
export type TTSMetrics = {
|
|
38
52
|
type: 'tts_metrics';
|
|
@@ -46,10 +60,17 @@ export type TTSMetrics = {
|
|
|
46
60
|
/** Generated audio duration in milliseconds. */
|
|
47
61
|
audioDurationMs: number;
|
|
48
62
|
cancelled: boolean;
|
|
63
|
+
/** Number of characters synthesized (for character-based billing). */
|
|
49
64
|
charactersCount: number;
|
|
65
|
+
/** Input text tokens (for token-based billing, e.g., OpenAI TTS). */
|
|
66
|
+
inputTokens?: number;
|
|
67
|
+
/** Output audio tokens (for token-based billing, e.g., OpenAI TTS). */
|
|
68
|
+
outputTokens?: number;
|
|
50
69
|
streamed: boolean;
|
|
51
70
|
segmentId?: string;
|
|
52
71
|
speechId?: string;
|
|
72
|
+
/** Metadata for model provider and name tracking. */
|
|
73
|
+
metadata?: MetricsMetadata;
|
|
53
74
|
};
|
|
54
75
|
export type VADMetrics = {
|
|
55
76
|
type: 'vad_metrics';
|
|
@@ -114,6 +135,10 @@ export type RealtimeModelMetrics = {
|
|
|
114
135
|
* The duration of the response from created to done in milliseconds.
|
|
115
136
|
*/
|
|
116
137
|
durationMs: number;
|
|
138
|
+
/**
|
|
139
|
+
* The duration of the session connection in milliseconds (for session-based billing like xAI).
|
|
140
|
+
*/
|
|
141
|
+
sessionDurationMs?: number;
|
|
117
142
|
/**
|
|
118
143
|
* Time to first audio token in milliseconds. -1 if no audio token was sent.
|
|
119
144
|
*/
|
|
@@ -146,5 +171,24 @@ export type RealtimeModelMetrics = {
|
|
|
146
171
|
* Details about the output tokens used in the Response.
|
|
147
172
|
*/
|
|
148
173
|
outputTokenDetails: RealtimeModelMetricsOutputTokenDetails;
|
|
174
|
+
/** Metadata for model provider and name tracking. */
|
|
175
|
+
metadata?: MetricsMetadata;
|
|
176
|
+
};
|
|
177
|
+
export type InterruptionMetrics = {
|
|
178
|
+
type: 'interruption_metrics';
|
|
179
|
+
timestamp: number;
|
|
180
|
+
/** Latest RTT time taken to perform inference, in milliseconds. */
|
|
181
|
+
totalDuration: number;
|
|
182
|
+
/** Latest time taken by the model side, in milliseconds. */
|
|
183
|
+
predictionDuration: number;
|
|
184
|
+
/** Latest total time from onset of speech to final prediction, in milliseconds. */
|
|
185
|
+
detectionDelay: number;
|
|
186
|
+
/** Number of interruptions detected (incremental). */
|
|
187
|
+
numInterruptions: number;
|
|
188
|
+
/** Number of backchannels detected (incremental). */
|
|
189
|
+
numBackchannels: number;
|
|
190
|
+
/** Number of requests sent to the model (incremental). */
|
|
191
|
+
numRequests: number;
|
|
192
|
+
metadata?: MetricsMetadata;
|
|
149
193
|
};
|
|
150
194
|
//# sourceMappingURL=base.d.ts.map
|
package/dist/metrics/base.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type MetricsMetadata = {
|
|
2
|
+
/** The provider name (e.g., 'openai', 'anthropic'). */
|
|
3
|
+
modelProvider?: string;
|
|
4
|
+
/** The model name (e.g., 'gpt-4o', 'claude-3-5-sonnet'). */
|
|
5
|
+
modelName?: string;
|
|
6
|
+
};
|
|
7
|
+
export type AgentMetrics = STTMetrics | LLMMetrics | TTSMetrics | VADMetrics | EOUMetrics | RealtimeModelMetrics | InterruptionMetrics;
|
|
2
8
|
export type LLMMetrics = {
|
|
3
9
|
type: 'llm_metrics';
|
|
4
10
|
label: string;
|
|
@@ -15,6 +21,8 @@ export type LLMMetrics = {
|
|
|
15
21
|
totalTokens: number;
|
|
16
22
|
tokensPerSecond: number;
|
|
17
23
|
speechId?: string;
|
|
24
|
+
/** Metadata for model provider and name tracking. */
|
|
25
|
+
metadata?: MetricsMetadata;
|
|
18
26
|
};
|
|
19
27
|
export type STTMetrics = {
|
|
20
28
|
type: 'stt_metrics';
|
|
@@ -29,10 +37,16 @@ export type STTMetrics = {
|
|
|
29
37
|
* The duration of the pushed audio in milliseconds.
|
|
30
38
|
*/
|
|
31
39
|
audioDurationMs: number;
|
|
40
|
+
/** Input audio tokens (for token-based billing). */
|
|
41
|
+
inputTokens?: number;
|
|
42
|
+
/** Output text tokens (for token-based billing). */
|
|
43
|
+
outputTokens?: number;
|
|
32
44
|
/**
|
|
33
45
|
* Whether the STT is streaming (e.g using websocket).
|
|
34
46
|
*/
|
|
35
47
|
streamed: boolean;
|
|
48
|
+
/** Metadata for model provider and name tracking. */
|
|
49
|
+
metadata?: MetricsMetadata;
|
|
36
50
|
};
|
|
37
51
|
export type TTSMetrics = {
|
|
38
52
|
type: 'tts_metrics';
|
|
@@ -46,10 +60,17 @@ export type TTSMetrics = {
|
|
|
46
60
|
/** Generated audio duration in milliseconds. */
|
|
47
61
|
audioDurationMs: number;
|
|
48
62
|
cancelled: boolean;
|
|
63
|
+
/** Number of characters synthesized (for character-based billing). */
|
|
49
64
|
charactersCount: number;
|
|
65
|
+
/** Input text tokens (for token-based billing, e.g., OpenAI TTS). */
|
|
66
|
+
inputTokens?: number;
|
|
67
|
+
/** Output audio tokens (for token-based billing, e.g., OpenAI TTS). */
|
|
68
|
+
outputTokens?: number;
|
|
50
69
|
streamed: boolean;
|
|
51
70
|
segmentId?: string;
|
|
52
71
|
speechId?: string;
|
|
72
|
+
/** Metadata for model provider and name tracking. */
|
|
73
|
+
metadata?: MetricsMetadata;
|
|
53
74
|
};
|
|
54
75
|
export type VADMetrics = {
|
|
55
76
|
type: 'vad_metrics';
|
|
@@ -114,6 +135,10 @@ export type RealtimeModelMetrics = {
|
|
|
114
135
|
* The duration of the response from created to done in milliseconds.
|
|
115
136
|
*/
|
|
116
137
|
durationMs: number;
|
|
138
|
+
/**
|
|
139
|
+
* The duration of the session connection in milliseconds (for session-based billing like xAI).
|
|
140
|
+
*/
|
|
141
|
+
sessionDurationMs?: number;
|
|
117
142
|
/**
|
|
118
143
|
* Time to first audio token in milliseconds. -1 if no audio token was sent.
|
|
119
144
|
*/
|
|
@@ -146,5 +171,24 @@ export type RealtimeModelMetrics = {
|
|
|
146
171
|
* Details about the output tokens used in the Response.
|
|
147
172
|
*/
|
|
148
173
|
outputTokenDetails: RealtimeModelMetricsOutputTokenDetails;
|
|
174
|
+
/** Metadata for model provider and name tracking. */
|
|
175
|
+
metadata?: MetricsMetadata;
|
|
176
|
+
};
|
|
177
|
+
export type InterruptionMetrics = {
|
|
178
|
+
type: 'interruption_metrics';
|
|
179
|
+
timestamp: number;
|
|
180
|
+
/** Latest RTT time taken to perform inference, in milliseconds. */
|
|
181
|
+
totalDuration: number;
|
|
182
|
+
/** Latest time taken by the model side, in milliseconds. */
|
|
183
|
+
predictionDuration: number;
|
|
184
|
+
/** Latest total time from onset of speech to final prediction, in milliseconds. */
|
|
185
|
+
detectionDelay: number;
|
|
186
|
+
/** Number of interruptions detected (incremental). */
|
|
187
|
+
numInterruptions: number;
|
|
188
|
+
/** Number of backchannels detected (incremental). */
|
|
189
|
+
numBackchannels: number;
|
|
190
|
+
/** Number of requests sent to the model (incremental). */
|
|
191
|
+
numRequests: number;
|
|
192
|
+
metadata?: MetricsMetadata;
|
|
149
193
|
};
|
|
150
194
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/metrics/base.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,UAAU,GACV,UAAU,GACV,UAAU,GACV,UAAU,GACV,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/metrics/base.ts"],"names":[],"mappings":"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"}
|
package/dist/metrics/index.cjs
CHANGED
|
@@ -18,15 +18,20 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var metrics_exports = {};
|
|
20
20
|
__export(metrics_exports, {
|
|
21
|
+
ModelUsageCollector: () => import_model_usage.ModelUsageCollector,
|
|
21
22
|
UsageCollector: () => import_usage_collector.UsageCollector,
|
|
23
|
+
filterZeroValues: () => import_model_usage.filterZeroValues,
|
|
22
24
|
logMetrics: () => import_utils.logMetrics
|
|
23
25
|
});
|
|
24
26
|
module.exports = __toCommonJS(metrics_exports);
|
|
27
|
+
var import_model_usage = require("./model_usage.cjs");
|
|
25
28
|
var import_usage_collector = require("./usage_collector.cjs");
|
|
26
29
|
var import_utils = require("./utils.cjs");
|
|
27
30
|
// Annotate the CommonJS export names for ESM import in node:
|
|
28
31
|
0 && (module.exports = {
|
|
32
|
+
ModelUsageCollector,
|
|
29
33
|
UsageCollector,
|
|
34
|
+
filterZeroValues,
|
|
30
35
|
logMetrics
|
|
31
36
|
});
|
|
32
37
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type {\n AgentMetrics,\n EOUMetrics,\n LLMMetrics,\n RealtimeModelMetrics,\n STTMetrics,\n TTSMetrics,\n VADMetrics,\n} from './base.js';\nexport { UsageCollector, type UsageSummary } from './usage_collector.js';\nexport { logMetrics } from './utils.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type {\n AgentMetrics,\n EOUMetrics,\n InterruptionMetrics,\n LLMMetrics,\n MetricsMetadata,\n RealtimeModelMetrics,\n STTMetrics,\n TTSMetrics,\n VADMetrics,\n} from './base.js';\nexport {\n filterZeroValues,\n ModelUsageCollector,\n type InterruptionModelUsage,\n type LLMModelUsage,\n type ModelUsage,\n type STTModelUsage,\n type TTSModelUsage,\n} from './model_usage.js';\nexport { UsageCollector, type UsageSummary } from './usage_collector.js';\nexport { logMetrics } from './utils.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,yBAQO;AACP,6BAAkD;AAClD,mBAA2B;","names":[]}
|
package/dist/metrics/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export type { AgentMetrics, EOUMetrics, LLMMetrics, RealtimeModelMetrics, STTMetrics, TTSMetrics, VADMetrics, } from './base.js';
|
|
1
|
+
export type { AgentMetrics, EOUMetrics, InterruptionMetrics, LLMMetrics, MetricsMetadata, RealtimeModelMetrics, STTMetrics, TTSMetrics, VADMetrics, } from './base.js';
|
|
2
|
+
export { filterZeroValues, ModelUsageCollector, type InterruptionModelUsage, type LLMModelUsage, type ModelUsage, type STTModelUsage, type TTSModelUsage, } from './model_usage.js';
|
|
2
3
|
export { UsageCollector, type UsageSummary } from './usage_collector.js';
|
|
3
4
|
export { logMetrics } from './utils.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/metrics/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export type { AgentMetrics, EOUMetrics, LLMMetrics, RealtimeModelMetrics, STTMetrics, TTSMetrics, VADMetrics, } from './base.js';
|
|
1
|
+
export type { AgentMetrics, EOUMetrics, InterruptionMetrics, LLMMetrics, MetricsMetadata, RealtimeModelMetrics, STTMetrics, TTSMetrics, VADMetrics, } from './base.js';
|
|
2
|
+
export { filterZeroValues, ModelUsageCollector, type InterruptionModelUsage, type LLMModelUsage, type ModelUsage, type STTModelUsage, type TTSModelUsage, } from './model_usage.js';
|
|
2
3
|
export { UsageCollector, type UsageSummary } from './usage_collector.js';
|
|
3
4
|
export { logMetrics } from './utils.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/metrics/index.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
filterZeroValues,
|
|
3
|
+
ModelUsageCollector
|
|
4
|
+
} from "./model_usage.js";
|
|
1
5
|
import { UsageCollector } from "./usage_collector.js";
|
|
2
6
|
import { logMetrics } from "./utils.js";
|
|
3
7
|
export {
|
|
8
|
+
ModelUsageCollector,
|
|
4
9
|
UsageCollector,
|
|
10
|
+
filterZeroValues,
|
|
5
11
|
logMetrics
|
|
6
12
|
};
|
|
7
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type {\n AgentMetrics,\n EOUMetrics,\n LLMMetrics,\n RealtimeModelMetrics,\n STTMetrics,\n TTSMetrics,\n VADMetrics,\n} from './base.js';\nexport { UsageCollector, type UsageSummary } from './usage_collector.js';\nexport { logMetrics } from './utils.js';\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport type {\n AgentMetrics,\n EOUMetrics,\n InterruptionMetrics,\n LLMMetrics,\n MetricsMetadata,\n RealtimeModelMetrics,\n STTMetrics,\n TTSMetrics,\n VADMetrics,\n} from './base.js';\nexport {\n filterZeroValues,\n ModelUsageCollector,\n type InterruptionModelUsage,\n type LLMModelUsage,\n type ModelUsage,\n type STTModelUsage,\n type TTSModelUsage,\n} from './model_usage.js';\nexport { UsageCollector, type UsageSummary } from './usage_collector.js';\nexport { logMetrics } from './utils.js';\n"],"mappings":"AAeA;AAAA,EACE;AAAA,EACA;AAAA,OAMK;AACP,SAAS,sBAAyC;AAClD,SAAS,kBAAkB;","names":[]}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var model_usage_exports = {};
|
|
20
|
+
__export(model_usage_exports, {
|
|
21
|
+
ModelUsageCollector: () => ModelUsageCollector,
|
|
22
|
+
filterZeroValues: () => filterZeroValues
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(model_usage_exports);
|
|
25
|
+
function filterZeroValues(usage) {
|
|
26
|
+
const result = {};
|
|
27
|
+
for (const [key, value] of Object.entries(usage)) {
|
|
28
|
+
if (value !== 0 && value !== 0) {
|
|
29
|
+
result[key] = value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
class ModelUsageCollector {
|
|
35
|
+
llmUsage = /* @__PURE__ */ new Map();
|
|
36
|
+
ttsUsage = /* @__PURE__ */ new Map();
|
|
37
|
+
sttUsage = /* @__PURE__ */ new Map();
|
|
38
|
+
interruptionUsage = /* @__PURE__ */ new Map();
|
|
39
|
+
/** Extract provider and model from metrics metadata. */
|
|
40
|
+
extractProviderModel(metrics) {
|
|
41
|
+
let provider = "";
|
|
42
|
+
let model = "";
|
|
43
|
+
if (metrics.metadata) {
|
|
44
|
+
provider = metrics.metadata.modelProvider || "";
|
|
45
|
+
model = metrics.metadata.modelName || "";
|
|
46
|
+
}
|
|
47
|
+
return [provider, model];
|
|
48
|
+
}
|
|
49
|
+
/** Get or create an LLMModelUsage for the given provider/model combination. */
|
|
50
|
+
getLLMUsage(provider, model) {
|
|
51
|
+
const key = `${provider}:${model}`;
|
|
52
|
+
let usage = this.llmUsage.get(key);
|
|
53
|
+
if (!usage) {
|
|
54
|
+
usage = {
|
|
55
|
+
type: "llm_usage",
|
|
56
|
+
provider,
|
|
57
|
+
model,
|
|
58
|
+
inputTokens: 0,
|
|
59
|
+
inputCachedTokens: 0,
|
|
60
|
+
inputAudioTokens: 0,
|
|
61
|
+
inputCachedAudioTokens: 0,
|
|
62
|
+
inputTextTokens: 0,
|
|
63
|
+
inputCachedTextTokens: 0,
|
|
64
|
+
inputImageTokens: 0,
|
|
65
|
+
inputCachedImageTokens: 0,
|
|
66
|
+
outputTokens: 0,
|
|
67
|
+
outputAudioTokens: 0,
|
|
68
|
+
outputTextTokens: 0,
|
|
69
|
+
sessionDurationMs: 0
|
|
70
|
+
};
|
|
71
|
+
this.llmUsage.set(key, usage);
|
|
72
|
+
}
|
|
73
|
+
return usage;
|
|
74
|
+
}
|
|
75
|
+
/** Get or create a TTSModelUsage for the given provider/model combination. */
|
|
76
|
+
getTTSUsage(provider, model) {
|
|
77
|
+
const key = `${provider}:${model}`;
|
|
78
|
+
let usage = this.ttsUsage.get(key);
|
|
79
|
+
if (!usage) {
|
|
80
|
+
usage = {
|
|
81
|
+
type: "tts_usage",
|
|
82
|
+
provider,
|
|
83
|
+
model,
|
|
84
|
+
inputTokens: 0,
|
|
85
|
+
outputTokens: 0,
|
|
86
|
+
charactersCount: 0,
|
|
87
|
+
audioDurationMs: 0
|
|
88
|
+
};
|
|
89
|
+
this.ttsUsage.set(key, usage);
|
|
90
|
+
}
|
|
91
|
+
return usage;
|
|
92
|
+
}
|
|
93
|
+
/** Get or create an STTModelUsage for the given provider/model combination. */
|
|
94
|
+
getSTTUsage(provider, model) {
|
|
95
|
+
const key = `${provider}:${model}`;
|
|
96
|
+
let usage = this.sttUsage.get(key);
|
|
97
|
+
if (!usage) {
|
|
98
|
+
usage = {
|
|
99
|
+
type: "stt_usage",
|
|
100
|
+
provider,
|
|
101
|
+
model,
|
|
102
|
+
inputTokens: 0,
|
|
103
|
+
outputTokens: 0,
|
|
104
|
+
audioDurationMs: 0
|
|
105
|
+
};
|
|
106
|
+
this.sttUsage.set(key, usage);
|
|
107
|
+
}
|
|
108
|
+
return usage;
|
|
109
|
+
}
|
|
110
|
+
getInterruptionUsage(provider, model) {
|
|
111
|
+
const key = `${provider}:${model}`;
|
|
112
|
+
let usage = this.interruptionUsage.get(key);
|
|
113
|
+
if (!usage) {
|
|
114
|
+
usage = {
|
|
115
|
+
type: "interruption_usage",
|
|
116
|
+
provider,
|
|
117
|
+
model,
|
|
118
|
+
totalRequests: 0
|
|
119
|
+
};
|
|
120
|
+
this.interruptionUsage.set(key, usage);
|
|
121
|
+
}
|
|
122
|
+
return usage;
|
|
123
|
+
}
|
|
124
|
+
/** Collect metrics and aggregate usage by model/provider. */
|
|
125
|
+
collect(metrics) {
|
|
126
|
+
var _a, _b, _c;
|
|
127
|
+
if (metrics.type === "llm_metrics") {
|
|
128
|
+
const [provider, model] = this.extractProviderModel(metrics);
|
|
129
|
+
const usage = this.getLLMUsage(provider, model);
|
|
130
|
+
usage.inputTokens += metrics.promptTokens;
|
|
131
|
+
usage.inputCachedTokens += metrics.promptCachedTokens;
|
|
132
|
+
usage.outputTokens += metrics.completionTokens;
|
|
133
|
+
} else if (metrics.type === "realtime_model_metrics") {
|
|
134
|
+
const [provider, model] = this.extractProviderModel(metrics);
|
|
135
|
+
const usage = this.getLLMUsage(provider, model);
|
|
136
|
+
usage.inputTokens += metrics.inputTokens;
|
|
137
|
+
usage.inputCachedTokens += metrics.inputTokenDetails.cachedTokens;
|
|
138
|
+
usage.inputTextTokens += metrics.inputTokenDetails.textTokens;
|
|
139
|
+
usage.inputCachedTextTokens += ((_a = metrics.inputTokenDetails.cachedTokensDetails) == null ? void 0 : _a.textTokens) ?? 0;
|
|
140
|
+
usage.inputImageTokens += metrics.inputTokenDetails.imageTokens;
|
|
141
|
+
usage.inputCachedImageTokens += ((_b = metrics.inputTokenDetails.cachedTokensDetails) == null ? void 0 : _b.imageTokens) ?? 0;
|
|
142
|
+
usage.inputAudioTokens += metrics.inputTokenDetails.audioTokens;
|
|
143
|
+
usage.inputCachedAudioTokens += ((_c = metrics.inputTokenDetails.cachedTokensDetails) == null ? void 0 : _c.audioTokens) ?? 0;
|
|
144
|
+
usage.outputTextTokens += metrics.outputTokenDetails.textTokens;
|
|
145
|
+
usage.outputAudioTokens += metrics.outputTokenDetails.audioTokens;
|
|
146
|
+
usage.outputTokens += metrics.outputTokens;
|
|
147
|
+
usage.sessionDurationMs += metrics.sessionDurationMs ?? 0;
|
|
148
|
+
} else if (metrics.type === "tts_metrics") {
|
|
149
|
+
const [provider, model] = this.extractProviderModel(metrics);
|
|
150
|
+
const ttsUsage = this.getTTSUsage(provider, model);
|
|
151
|
+
ttsUsage.inputTokens += metrics.inputTokens ?? 0;
|
|
152
|
+
ttsUsage.outputTokens += metrics.outputTokens ?? 0;
|
|
153
|
+
ttsUsage.charactersCount += metrics.charactersCount;
|
|
154
|
+
ttsUsage.audioDurationMs += metrics.audioDurationMs;
|
|
155
|
+
} else if (metrics.type === "stt_metrics") {
|
|
156
|
+
const [provider, model] = this.extractProviderModel(metrics);
|
|
157
|
+
const sttUsage = this.getSTTUsage(provider, model);
|
|
158
|
+
sttUsage.inputTokens += metrics.inputTokens ?? 0;
|
|
159
|
+
sttUsage.outputTokens += metrics.outputTokens ?? 0;
|
|
160
|
+
sttUsage.audioDurationMs += metrics.audioDurationMs;
|
|
161
|
+
} else if (metrics.type === "interruption_metrics") {
|
|
162
|
+
const [provider, model] = this.extractProviderModel(metrics);
|
|
163
|
+
const usage = this.getInterruptionUsage(provider, model);
|
|
164
|
+
usage.totalRequests += metrics.numRequests;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
flatten() {
|
|
168
|
+
const result = [];
|
|
169
|
+
for (const u of this.llmUsage.values()) {
|
|
170
|
+
result.push({ ...u });
|
|
171
|
+
}
|
|
172
|
+
for (const u of this.ttsUsage.values()) {
|
|
173
|
+
result.push({ ...u });
|
|
174
|
+
}
|
|
175
|
+
for (const u of this.sttUsage.values()) {
|
|
176
|
+
result.push({ ...u });
|
|
177
|
+
}
|
|
178
|
+
for (const u of this.interruptionUsage.values()) {
|
|
179
|
+
result.push({ ...u });
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
185
|
+
0 && (module.exports = {
|
|
186
|
+
ModelUsageCollector,
|
|
187
|
+
filterZeroValues
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=model_usage.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/model_usage.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n AgentMetrics,\n InterruptionMetrics,\n LLMMetrics,\n RealtimeModelMetrics,\n STTMetrics,\n TTSMetrics,\n} from './base.js';\n\nexport type LLMModelUsage = {\n type: 'llm_usage';\n /** The provider name (e.g., 'openai', 'anthropic'). */\n provider: string;\n /** The model name (e.g., 'gpt-4o', 'claude-3-5-sonnet'). */\n model: string;\n /** Total input tokens. */\n inputTokens: number;\n /** Input tokens served from cache. */\n inputCachedTokens: number;\n /** Input audio tokens (for multimodal models). */\n inputAudioTokens: number;\n /** Cached input audio tokens. */\n inputCachedAudioTokens: number;\n /** Input text tokens. */\n inputTextTokens: number;\n /** Cached input text tokens. */\n inputCachedTextTokens: number;\n /** Input image tokens (for multimodal models). */\n inputImageTokens: number;\n /** Cached input image tokens. */\n inputCachedImageTokens: number;\n /** Total output tokens. */\n outputTokens: number;\n /** Output audio tokens (for multimodal models). */\n outputAudioTokens: number;\n /** Output text tokens. */\n outputTextTokens: number;\n /** Total session connection duration in milliseconds (for session-based billing like xAI). */\n sessionDurationMs: number;\n};\n\nexport type TTSModelUsage = {\n type: 'tts_usage';\n /** The provider name (e.g., 'elevenlabs', 'cartesia'). */\n provider: string;\n /** The model name (e.g., 'eleven_turbo_v2', 'sonic'). */\n model: string;\n /** Input text tokens (for token-based TTS billing, e.g., OpenAI TTS). */\n inputTokens: number;\n /** Output audio tokens (for token-based TTS billing, e.g., OpenAI TTS). */\n outputTokens: number;\n /** Number of characters synthesized (for character-based TTS billing). */\n charactersCount: number;\n /**\n * Duration of generated audio in milliseconds.\n */\n audioDurationMs: number;\n};\n\nexport type STTModelUsage = {\n type: 'stt_usage';\n /** The provider name (e.g., 'deepgram', 'assemblyai'). */\n provider: string;\n /** The model name (e.g., 'nova-2', 'best'). */\n model: string;\n /** Input audio tokens (for token-based STT billing). */\n inputTokens: number;\n /** Output text tokens (for token-based STT billing). */\n outputTokens: number;\n /** Duration of processed audio in milliseconds. */\n audioDurationMs: number;\n};\n\nexport type InterruptionModelUsage = {\n type: 'interruption_usage';\n /** The provider name (e.g., 'livekit'). */\n provider: string;\n /** The model name (e.g., 'adaptive interruption'). */\n model: string;\n /** Total number of requests sent. */\n totalRequests: number;\n};\n\nexport type ModelUsage = LLMModelUsage | TTSModelUsage | STTModelUsage | InterruptionModelUsage;\n\nexport function filterZeroValues<T extends ModelUsage>(usage: T): Partial<T> {\n const result: Partial<T> = {} as Partial<T>;\n for (const [key, value] of Object.entries(usage)) {\n if (value !== 0 && value !== 0.0) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n}\n\nexport class ModelUsageCollector {\n private llmUsage: Map<string, LLMModelUsage> = new Map();\n private ttsUsage: Map<string, TTSModelUsage> = new Map();\n private sttUsage: Map<string, STTModelUsage> = new Map();\n\n private interruptionUsage: Map<string, InterruptionModelUsage> = new Map();\n\n /** Extract provider and model from metrics metadata. */\n private extractProviderModel(\n metrics: LLMMetrics | STTMetrics | TTSMetrics | RealtimeModelMetrics | InterruptionMetrics,\n ): [string, string] {\n let provider = '';\n let model = '';\n if (metrics.metadata) {\n provider = metrics.metadata.modelProvider || '';\n model = metrics.metadata.modelName || '';\n }\n return [provider, model];\n }\n\n /** Get or create an LLMModelUsage for the given provider/model combination. */\n private getLLMUsage(provider: string, model: string): LLMModelUsage {\n const key = `${provider}:${model}`;\n let usage = this.llmUsage.get(key);\n if (!usage) {\n usage = {\n type: 'llm_usage',\n provider,\n model,\n inputTokens: 0,\n inputCachedTokens: 0,\n inputAudioTokens: 0,\n inputCachedAudioTokens: 0,\n inputTextTokens: 0,\n inputCachedTextTokens: 0,\n inputImageTokens: 0,\n inputCachedImageTokens: 0,\n outputTokens: 0,\n outputAudioTokens: 0,\n outputTextTokens: 0,\n sessionDurationMs: 0,\n };\n this.llmUsage.set(key, usage);\n }\n return usage;\n }\n\n /** Get or create a TTSModelUsage for the given provider/model combination. */\n private getTTSUsage(provider: string, model: string): TTSModelUsage {\n const key = `${provider}:${model}`;\n let usage = this.ttsUsage.get(key);\n if (!usage) {\n usage = {\n type: 'tts_usage',\n provider,\n model,\n inputTokens: 0,\n outputTokens: 0,\n charactersCount: 0,\n audioDurationMs: 0,\n };\n this.ttsUsage.set(key, usage);\n }\n return usage;\n }\n\n /** Get or create an STTModelUsage for the given provider/model combination. */\n private getSTTUsage(provider: string, model: string): STTModelUsage {\n const key = `${provider}:${model}`;\n let usage = this.sttUsage.get(key);\n if (!usage) {\n usage = {\n type: 'stt_usage',\n provider,\n model,\n inputTokens: 0,\n outputTokens: 0,\n audioDurationMs: 0,\n };\n this.sttUsage.set(key, usage);\n }\n return usage;\n }\n\n private getInterruptionUsage(provider: string, model: string): InterruptionModelUsage {\n const key = `${provider}:${model}`;\n let usage = this.interruptionUsage.get(key);\n if (!usage) {\n usage = {\n type: 'interruption_usage',\n provider,\n model,\n totalRequests: 0,\n };\n this.interruptionUsage.set(key, usage);\n }\n return usage;\n }\n\n /** Collect metrics and aggregate usage by model/provider. */\n collect(metrics: AgentMetrics): void {\n if (metrics.type === 'llm_metrics') {\n const [provider, model] = this.extractProviderModel(metrics);\n const usage = this.getLLMUsage(provider, model);\n usage.inputTokens += metrics.promptTokens;\n usage.inputCachedTokens += metrics.promptCachedTokens;\n usage.outputTokens += metrics.completionTokens;\n } else if (metrics.type === 'realtime_model_metrics') {\n const [provider, model] = this.extractProviderModel(metrics);\n const usage = this.getLLMUsage(provider, model);\n usage.inputTokens += metrics.inputTokens;\n usage.inputCachedTokens += metrics.inputTokenDetails.cachedTokens;\n\n usage.inputTextTokens += metrics.inputTokenDetails.textTokens;\n usage.inputCachedTextTokens += metrics.inputTokenDetails.cachedTokensDetails?.textTokens ?? 0;\n usage.inputImageTokens += metrics.inputTokenDetails.imageTokens;\n usage.inputCachedImageTokens +=\n metrics.inputTokenDetails.cachedTokensDetails?.imageTokens ?? 0;\n usage.inputAudioTokens += metrics.inputTokenDetails.audioTokens;\n usage.inputCachedAudioTokens +=\n metrics.inputTokenDetails.cachedTokensDetails?.audioTokens ?? 0;\n\n usage.outputTextTokens += metrics.outputTokenDetails.textTokens;\n usage.outputAudioTokens += metrics.outputTokenDetails.audioTokens;\n usage.outputTokens += metrics.outputTokens;\n usage.sessionDurationMs += metrics.sessionDurationMs ?? 0;\n } else if (metrics.type === 'tts_metrics') {\n const [provider, model] = this.extractProviderModel(metrics);\n const ttsUsage = this.getTTSUsage(provider, model);\n ttsUsage.inputTokens += metrics.inputTokens ?? 0;\n ttsUsage.outputTokens += metrics.outputTokens ?? 0;\n ttsUsage.charactersCount += metrics.charactersCount;\n ttsUsage.audioDurationMs += metrics.audioDurationMs;\n } else if (metrics.type === 'stt_metrics') {\n const [provider, model] = this.extractProviderModel(metrics);\n const sttUsage = this.getSTTUsage(provider, model);\n sttUsage.inputTokens += metrics.inputTokens ?? 0;\n sttUsage.outputTokens += metrics.outputTokens ?? 0;\n sttUsage.audioDurationMs += metrics.audioDurationMs;\n } else if (metrics.type === 'interruption_metrics') {\n const [provider, model] = this.extractProviderModel(metrics);\n const usage = this.getInterruptionUsage(provider, model);\n usage.totalRequests += metrics.numRequests;\n }\n // VAD and EOU metrics are not aggregated for usage tracking.\n }\n\n flatten(): ModelUsage[] {\n const result: ModelUsage[] = [];\n for (const u of this.llmUsage.values()) {\n result.push({ ...u });\n }\n for (const u of this.ttsUsage.values()) {\n result.push({ ...u });\n }\n for (const u of this.sttUsage.values()) {\n result.push({ ...u });\n }\n for (const u of this.interruptionUsage.values()) {\n result.push({ ...u });\n }\n return result;\n }\n}\n"],"mappings":"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","names":[]}
|