@pipedog/core 0.0.0 → 0.1.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/LICENSE +25 -0
- package/NOTICE +9 -0
- package/dist/adapters/base_llm_adapter.d.ts +266 -0
- package/dist/adapters/base_llm_adapter.js +489 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/schemas/direct_function.d.ts +202 -0
- package/dist/adapters/schemas/direct_function.js +302 -0
- package/dist/adapters/schemas/function_schema.d.ts +67 -0
- package/dist/adapters/schemas/function_schema.js +72 -0
- package/dist/adapters/schemas/index.d.ts +2 -0
- package/dist/adapters/schemas/index.js +8 -0
- package/dist/adapters/schemas/tools_schema.d.ts +57 -0
- package/dist/adapters/schemas/tools_schema.js +79 -0
- package/dist/adapters/services/index.d.ts +2 -0
- package/dist/adapters/services/index.js +8 -0
- package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
- package/dist/adapters/services/open_ai_adapter.js +250 -0
- package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
- package/dist/audio/dtmf/dtmf_data.js +22 -0
- package/dist/audio/dtmf/index.d.ts +2 -0
- package/dist/audio/dtmf/index.js +8 -0
- package/dist/audio/dtmf/types.d.ts +31 -0
- package/dist/audio/dtmf/types.js +35 -0
- package/dist/audio/dtmf/utils.d.ts +13 -0
- package/dist/audio/dtmf/utils.js +62 -0
- package/dist/audio/filters/base_audio_filter.d.ts +51 -0
- package/dist/audio/filters/base_audio_filter.js +17 -0
- package/dist/audio/filters/index.d.ts +2 -0
- package/dist/audio/filters/index.js +8 -0
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/krisp_instance.d.ts +95 -0
- package/dist/audio/krisp_instance.js +229 -0
- package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
- package/dist/audio/mixers/base_audio_mixer.js +16 -0
- package/dist/audio/mixers/index.d.ts +2 -0
- package/dist/audio/mixers/index.js +8 -0
- package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
- package/dist/audio/resamplers/base_audio_resampler.js +35 -0
- package/dist/audio/resamplers/index.d.ts +2 -0
- package/dist/audio/resamplers/index.js +8 -0
- package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
- package/dist/audio/resamplers/resampy_resampler.js +15 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +54 -0
- package/dist/audio/resamplers/soxr_resampler.js +69 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +75 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +146 -0
- package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
- package/dist/audio/turn/base_turn_analyzer.js +61 -0
- package/dist/audio/turn/index.d.ts +2 -0
- package/dist/audio/turn/index.js +8 -0
- package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
- package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +143 -0
- package/dist/audio/utils.d.ts +224 -0
- package/dist/audio/utils.js +634 -0
- package/dist/audio/vad/data/index.d.ts +2 -0
- package/dist/audio/vad/data/index.js +8 -0
- package/dist/audio/vad/index.d.ts +2 -0
- package/dist/audio/vad/index.js +8 -0
- package/dist/audio/vad/vad_analyzer.d.ts +126 -0
- package/dist/audio/vad/vad_analyzer.js +211 -0
- package/dist/audio/vad/vad_controller.d.ts +143 -0
- package/dist/audio/vad/vad_controller.js +228 -0
- package/dist/audio/volume.d.ts +38 -0
- package/dist/audio/volume.js +75 -0
- package/dist/bus/adapters/base.d.ts +35 -0
- package/dist/bus/adapters/base.js +19 -0
- package/dist/bus/adapters/index.d.ts +10 -0
- package/dist/bus/adapters/index.js +15 -0
- package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
- package/dist/bus/adapters/llm_context_adapter.js +82 -0
- package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
- package/dist/bus/adapters/tools_schema_adapter.js +70 -0
- package/dist/bus/bridge_processor.d.ts +111 -0
- package/dist/bus/bridge_processor.js +166 -0
- package/dist/bus/bus.d.ts +110 -0
- package/dist/bus/bus.js +200 -0
- package/dist/bus/index.d.ts +22 -0
- package/dist/bus/index.js +27 -0
- package/dist/bus/local/async_queue.d.ts +12 -0
- package/dist/bus/local/async_queue.js +21 -0
- package/dist/bus/local/index.d.ts +3 -0
- package/dist/bus/local/index.js +8 -0
- package/dist/bus/messages.d.ts +378 -0
- package/dist/bus/messages.js +357 -0
- package/dist/bus/network/index.d.ts +16 -0
- package/dist/bus/network/index.js +21 -0
- package/dist/bus/queue.d.ts +27 -0
- package/dist/bus/queue.js +51 -0
- package/dist/bus/serializers/base.d.ts +25 -0
- package/dist/bus/serializers/base.js +14 -0
- package/dist/bus/serializers/index.d.ts +9 -0
- package/dist/bus/serializers/index.js +14 -0
- package/dist/bus/serializers/json.d.ts +77 -0
- package/dist/bus/serializers/json.js +367 -0
- package/dist/bus/subscriber.d.ts +46 -0
- package/dist/bus/subscriber.js +27 -0
- package/dist/bus/ui/index.d.ts +3 -0
- package/dist/bus/ui/index.js +8 -0
- package/dist/bus/ui/messages.d.ts +186 -0
- package/dist/bus/ui/messages.js +171 -0
- package/dist/classifiers/base_classifier.d.ts +263 -0
- package/dist/classifiers/base_classifier.js +346 -0
- package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
- package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
- package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
- package/dist/classifiers/cloudflare/clef/client.js +234 -0
- package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/clef/index.js +8 -0
- package/dist/classifiers/cloudflare/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/index.js +8 -0
- package/dist/classifiers/http_client.d.ts +70 -0
- package/dist/classifiers/http_client.js +161 -0
- package/dist/classifiers/index.d.ts +2 -0
- package/dist/classifiers/index.js +8 -0
- package/dist/classifiers/jev/classifier.d.ts +8 -0
- package/dist/classifiers/jev/classifier.js +13 -0
- package/dist/classifiers/jev/client.d.ts +8 -0
- package/dist/classifiers/jev/client.js +13 -0
- package/dist/classifiers/jev/index.d.ts +2 -0
- package/dist/classifiers/jev/index.js +8 -0
- package/dist/classifiers/llm/classifier.d.ts +72 -0
- package/dist/classifiers/llm/classifier.js +304 -0
- package/dist/classifiers/llm/index.d.ts +2 -0
- package/dist/classifiers/llm/index.js +8 -0
- package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
- package/dist/classifiers/openai/decisions/classifier.js +241 -0
- package/dist/classifiers/openai/decisions/client.d.ts +108 -0
- package/dist/classifiers/openai/decisions/client.js +234 -0
- package/dist/classifiers/openai/decisions/index.d.ts +2 -0
- package/dist/classifiers/openai/decisions/index.js +8 -0
- package/dist/classifiers/openai/index.d.ts +2 -0
- package/dist/classifiers/openai/index.js +8 -0
- package/dist/classifiers/typesafe/index.d.ts +2 -0
- package/dist/classifiers/typesafe/index.js +8 -0
- package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
- package/dist/classifiers/typesafe/jev/classifier.js +220 -0
- package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
- package/dist/classifiers/typesafe/jev/client.js +233 -0
- package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
- package/dist/classifiers/typesafe/jev/index.js +8 -0
- package/dist/clocks/base_clock.d.ts +13 -0
- package/dist/clocks/base_clock.js +14 -0
- package/dist/clocks/index.d.ts +2 -0
- package/dist/clocks/index.js +8 -0
- package/dist/clocks/system_clock.d.ts +15 -0
- package/dist/clocks/system_clock.js +25 -0
- package/dist/frames/frames.d.ts +2533 -0
- package/dist/frames/frames.js +2485 -0
- package/dist/frames/index.d.ts +2 -0
- package/dist/frames/index.js +8 -0
- package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
- package/dist/frames/protobufs/frames_pb2.js +466 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +56 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/metrics.d.ts +276 -0
- package/dist/metrics/metrics.js +254 -0
- package/dist/observers/base_observer.d.ts +173 -0
- package/dist/observers/base_observer.js +151 -0
- package/dist/observers/error_observer.d.ts +75 -0
- package/dist/observers/error_observer.js +87 -0
- package/dist/observers/function_call_observer.d.ts +157 -0
- package/dist/observers/function_call_observer.js +222 -0
- package/dist/observers/index.d.ts +2 -0
- package/dist/observers/index.js +8 -0
- package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
- package/dist/observers/loggers/debug_log_observer.js +228 -0
- package/dist/observers/loggers/index.d.ts +2 -0
- package/dist/observers/loggers/index.js +8 -0
- package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
- package/dist/observers/loggers/llm_log_observer.js +110 -0
- package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
- package/dist/observers/loggers/metrics_log_observer.js +186 -0
- package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
- package/dist/observers/loggers/transcription_log_observer.js +74 -0
- package/dist/observers/service_metrics_observer.d.ts +168 -0
- package/dist/observers/service_metrics_observer.js +236 -0
- package/dist/observers/speaking_observer.d.ts +104 -0
- package/dist/observers/speaking_observer.js +150 -0
- package/dist/observers/startup_timing_observer.d.ts +221 -0
- package/dist/observers/startup_timing_observer.js +365 -0
- package/dist/observers/turn_tracking_observer.d.ts +78 -0
- package/dist/observers/turn_tracking_observer.js +189 -0
- package/dist/observers/user_bot_latency_observer.d.ts +411 -0
- package/dist/observers/user_bot_latency_observer.js +974 -0
- package/dist/pipeline/base_pipeline.d.ts +49 -0
- package/dist/pipeline/base_pipeline.js +101 -0
- package/dist/pipeline/capabilities.d.ts +76 -0
- package/dist/pipeline/capabilities.js +97 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.js +8 -0
- package/dist/pipeline/job_context.d.ts +317 -0
- package/dist/pipeline/job_context.js +450 -0
- package/dist/pipeline/job_decorator.d.ts +54 -0
- package/dist/pipeline/job_decorator.js +92 -0
- package/dist/pipeline/llm_switcher.d.ts +84 -0
- package/dist/pipeline/llm_switcher.js +107 -0
- package/dist/pipeline/llm_with_backend.d.ts +435 -0
- package/dist/pipeline/llm_with_backend.js +806 -0
- package/dist/pipeline/parallel_pipeline.d.ts +83 -0
- package/dist/pipeline/parallel_pipeline.js +200 -0
- package/dist/pipeline/pipeline.d.ts +126 -0
- package/dist/pipeline/pipeline.js +196 -0
- package/dist/pipeline/service_switcher.d.ts +287 -0
- package/dist/pipeline/service_switcher.js +509 -0
- package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
- package/dist/pipeline/sync_parallel_pipeline.js +387 -0
- package/dist/pipeline/worker.d.ts +814 -0
- package/dist/pipeline/worker.js +1639 -0
- package/dist/pipeline/worker_observer.d.ts +131 -0
- package/dist/pipeline/worker_observer.js +274 -0
- package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
- package/dist/pipeline/worker_ready_decorator.js +76 -0
- package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
- package/dist/processors/aggregators/async_tool_messages.js +291 -0
- package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
- package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
- package/dist/processors/aggregators/gated.d.ts +43 -0
- package/dist/processors/aggregators/gated.js +86 -0
- package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
- package/dist/processors/aggregators/gated_llm_context.js +86 -0
- package/dist/processors/aggregators/index.d.ts +2 -0
- package/dist/processors/aggregators/index.js +8 -0
- package/dist/processors/aggregators/llm_context.d.ts +370 -0
- package/dist/processors/aggregators/llm_context.js +580 -0
- package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
- package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
- package/dist/processors/aggregators/llm_response.d.ts +37 -0
- package/dist/processors/aggregators/llm_response.js +71 -0
- package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
- package/dist/processors/aggregators/llm_response_universal.js +2394 -0
- package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
- package/dist/processors/aggregators/llm_text_processor.js +102 -0
- package/dist/processors/aggregators/sentence.d.ts +39 -0
- package/dist/processors/aggregators/sentence.js +69 -0
- package/dist/processors/async_generator.d.ts +42 -0
- package/dist/processors/async_generator.js +76 -0
- package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
- package/dist/processors/audio/audio_buffer_processor.js +565 -0
- package/dist/processors/audio/index.d.ts +2 -0
- package/dist/processors/audio/index.js +8 -0
- package/dist/processors/audio/vad_processor.d.ts +67 -0
- package/dist/processors/audio/vad_processor.js +103 -0
- package/dist/processors/consumer_processor.d.ts +49 -0
- package/dist/processors/consumer_processor.js +85 -0
- package/dist/processors/filters/frame_filter.d.ts +39 -0
- package/dist/processors/filters/frame_filter.js +52 -0
- package/dist/processors/filters/function_filter.d.ts +59 -0
- package/dist/processors/filters/function_filter.js +78 -0
- package/dist/processors/filters/identity_filter.d.ts +33 -0
- package/dist/processors/filters/identity_filter.js +37 -0
- package/dist/processors/filters/index.d.ts +2 -0
- package/dist/processors/filters/index.js +8 -0
- package/dist/processors/filters/null_filter.d.ts +34 -0
- package/dist/processors/filters/null_filter.js +47 -0
- package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
- package/dist/processors/filters/wake_notifier_filter.js +49 -0
- package/dist/processors/frame_processor.d.ts +360 -0
- package/dist/processors/frame_processor.js +932 -0
- package/dist/processors/frameworks/index.d.ts +2 -0
- package/dist/processors/frameworks/index.js +8 -0
- package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
- package/dist/processors/frameworks/rtvi/frames.js +259 -0
- package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
- package/dist/processors/frameworks/rtvi/index.js +11 -0
- package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
- package/dist/processors/frameworks/rtvi/models.js +1807 -0
- package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
- package/dist/processors/frameworks/rtvi/observer.js +1113 -0
- package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
- package/dist/processors/frameworks/rtvi/processor.js +676 -0
- package/dist/processors/idle_frame_processor.d.ts +44 -0
- package/dist/processors/idle_frame_processor.js +86 -0
- package/dist/processors/index.d.ts +2 -0
- package/dist/processors/index.js +8 -0
- package/dist/processors/logger.d.ts +42 -0
- package/dist/processors/logger.js +87 -0
- package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
- package/dist/processors/metrics/frame_processor_metrics.js +372 -0
- package/dist/processors/metrics/index.d.ts +2 -0
- package/dist/processors/metrics/index.js +8 -0
- package/dist/processors/producer_processor.d.ts +68 -0
- package/dist/processors/producer_processor.js +78 -0
- package/dist/processors/text_transformer.d.ts +30 -0
- package/dist/processors/text_transformer.js +48 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry.d.ts +69 -0
- package/dist/registry/registry.js +149 -0
- package/dist/registry/types.d.ts +47 -0
- package/dist/registry/types.js +39 -0
- package/dist/serializers/base_serializer.d.ts +94 -0
- package/dist/serializers/base_serializer.js +82 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.js +8 -0
- package/dist/services/ai_service.d.ts +145 -0
- package/dist/services/ai_service.js +262 -0
- package/dist/services/anthropic/index.d.ts +2 -0
- package/dist/services/anthropic/index.js +7 -0
- package/dist/services/assemblyai/index.d.ts +2 -0
- package/dist/services/assemblyai/index.js +7 -0
- package/dist/services/asyncai/index.d.ts +2 -0
- package/dist/services/asyncai/index.js +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.js +7 -0
- package/dist/services/azure/index.d.ts +2 -0
- package/dist/services/azure/index.js +7 -0
- package/dist/services/baseten/index.d.ts +2 -0
- package/dist/services/baseten/index.js +7 -0
- package/dist/services/bland/index.d.ts +2 -0
- package/dist/services/bland/index.js +7 -0
- package/dist/services/camb/index.d.ts +2 -0
- package/dist/services/camb/index.js +7 -0
- package/dist/services/cartesia/index.d.ts +2 -0
- package/dist/services/cartesia/index.js +7 -0
- package/dist/services/cerebras/index.d.ts +2 -0
- package/dist/services/cerebras/index.js +7 -0
- package/dist/services/crusoe/index.d.ts +2 -0
- package/dist/services/crusoe/index.js +7 -0
- package/dist/services/deepgram/index.d.ts +2 -0
- package/dist/services/deepgram/index.js +7 -0
- package/dist/services/deepseek/index.d.ts +2 -0
- package/dist/services/deepseek/index.js +7 -0
- package/dist/services/elevenlabs/index.d.ts +2 -0
- package/dist/services/elevenlabs/index.js +7 -0
- package/dist/services/fal/index.d.ts +2 -0
- package/dist/services/fal/index.js +7 -0
- package/dist/services/fireworks/index.d.ts +2 -0
- package/dist/services/fireworks/index.js +7 -0
- package/dist/services/fish/index.d.ts +2 -0
- package/dist/services/fish/index.js +7 -0
- package/dist/services/funasr/index.d.ts +3 -0
- package/dist/services/funasr/index.js +8 -0
- package/dist/services/gladia/index.d.ts +2 -0
- package/dist/services/gladia/index.js +7 -0
- package/dist/services/google/index.d.ts +2 -0
- package/dist/services/google/index.js +7 -0
- package/dist/services/gradium/index.d.ts +2 -0
- package/dist/services/gradium/index.js +7 -0
- package/dist/services/grok/index.d.ts +2 -0
- package/dist/services/grok/index.js +7 -0
- package/dist/services/groq/index.d.ts +2 -0
- package/dist/services/groq/index.js +7 -0
- package/dist/services/heygen/index.d.ts +2 -0
- package/dist/services/heygen/index.js +7 -0
- package/dist/services/hume/index.d.ts +2 -0
- package/dist/services/hume/index.js +7 -0
- package/dist/services/image_service.d.ts +52 -0
- package/dist/services/image_service.js +60 -0
- package/dist/services/inception/index.d.ts +2 -0
- package/dist/services/inception/index.js +7 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +8 -0
- package/dist/services/inworld/index.d.ts +2 -0
- package/dist/services/inworld/index.js +7 -0
- package/dist/services/keenable/index.d.ts +2 -0
- package/dist/services/keenable/index.js +7 -0
- package/dist/services/kokoro/index.d.ts +2 -0
- package/dist/services/kokoro/index.js +7 -0
- package/dist/services/llm_service.d.ts +1106 -0
- package/dist/services/llm_service.js +2231 -0
- package/dist/services/mem0/index.d.ts +2 -0
- package/dist/services/mem0/index.js +7 -0
- package/dist/services/meta/index.d.ts +2 -0
- package/dist/services/meta/index.js +7 -0
- package/dist/services/minimax/index.d.ts +2 -0
- package/dist/services/minimax/index.js +7 -0
- package/dist/services/mistral/index.d.ts +2 -0
- package/dist/services/mistral/index.js +7 -0
- package/dist/services/moondream/index.d.ts +2 -0
- package/dist/services/moondream/index.js +7 -0
- package/dist/services/moonshine/index.d.ts +2 -0
- package/dist/services/moonshine/index.js +7 -0
- package/dist/services/nebius/index.d.ts +2 -0
- package/dist/services/nebius/index.js +7 -0
- package/dist/services/neuphonic/index.d.ts +2 -0
- package/dist/services/neuphonic/index.js +7 -0
- package/dist/services/novita/index.d.ts +2 -0
- package/dist/services/novita/index.js +7 -0
- package/dist/services/nvidia/index.d.ts +2 -0
- package/dist/services/nvidia/index.js +11 -0
- package/dist/services/ollama/index.d.ts +2 -0
- package/dist/services/ollama/index.js +7 -0
- package/dist/services/openai/index.d.ts +2 -0
- package/dist/services/openai/index.js +7 -0
- package/dist/services/openclaw/index.d.ts +14 -0
- package/dist/services/openclaw/index.js +19 -0
- package/dist/services/openrouter/index.d.ts +2 -0
- package/dist/services/openrouter/index.js +7 -0
- package/dist/services/perplexity/index.d.ts +2 -0
- package/dist/services/perplexity/index.js +7 -0
- package/dist/services/piper/index.d.ts +2 -0
- package/dist/services/piper/index.js +7 -0
- package/dist/services/pocket_tts/index.d.ts +2 -0
- package/dist/services/pocket_tts/index.js +7 -0
- package/dist/services/qwen/index.d.ts +2 -0
- package/dist/services/qwen/index.js +7 -0
- package/dist/services/resembleai/index.d.ts +2 -0
- package/dist/services/resembleai/index.js +7 -0
- package/dist/services/rime/index.d.ts +2 -0
- package/dist/services/rime/index.js +7 -0
- package/dist/services/sambanova/index.d.ts +2 -0
- package/dist/services/sambanova/index.js +7 -0
- package/dist/services/sarvam/index.d.ts +2 -0
- package/dist/services/sarvam/index.js +7 -0
- package/dist/services/settings.d.ts +356 -0
- package/dist/services/settings.js +437 -0
- package/dist/services/simli/index.d.ts +2 -0
- package/dist/services/simli/index.js +7 -0
- package/dist/services/smallest/index.d.ts +2 -0
- package/dist/services/smallest/index.js +7 -0
- package/dist/services/soniox/index.d.ts +2 -0
- package/dist/services/soniox/index.js +7 -0
- package/dist/services/speechify/index.d.ts +2 -0
- package/dist/services/speechify/index.js +7 -0
- package/dist/services/speechmatics/index.d.ts +2 -0
- package/dist/services/speechmatics/index.js +7 -0
- package/dist/services/stt_latency.d.ts +62 -0
- package/dist/services/stt_latency.js +71 -0
- package/dist/services/stt_service.d.ts +601 -0
- package/dist/services/stt_service.js +1044 -0
- package/dist/services/tavus/index.d.ts +2 -0
- package/dist/services/tavus/index.js +7 -0
- package/dist/services/together/index.d.ts +2 -0
- package/dist/services/together/index.js +7 -0
- package/dist/services/tts_service.d.ts +909 -0
- package/dist/services/tts_service.js +2018 -0
- package/dist/services/ultravox/index.d.ts +2 -0
- package/dist/services/ultravox/index.js +9 -0
- package/dist/services/vision_service.d.ts +56 -0
- package/dist/services/vision_service.js +62 -0
- package/dist/services/websocket_service.d.ts +213 -0
- package/dist/services/websocket_service.js +654 -0
- package/dist/services/whisper/index.d.ts +2 -0
- package/dist/services/whisper/index.js +9 -0
- package/dist/services/xai/index.d.ts +2 -0
- package/dist/services/xai/index.js +9 -0
- package/dist/services/xtts/index.d.ts +2 -0
- package/dist/services/xtts/index.js +9 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.js +8 -0
- package/dist/tests/utils.d.ts +123 -0
- package/dist/tests/utils.js +212 -0
- package/dist/transcriptions/index.d.ts +2 -0
- package/dist/transcriptions/index.js +8 -0
- package/dist/transcriptions/language.d.ts +376 -0
- package/dist/transcriptions/language.js +543 -0
- package/dist/transports/base_input.d.ts +149 -0
- package/dist/transports/base_input.js +338 -0
- package/dist/transports/base_output.d.ts +432 -0
- package/dist/transports/base_output.js +1231 -0
- package/dist/transports/base_transport.d.ts +223 -0
- package/dist/transports/base_transport.js +167 -0
- package/dist/transports/daily/index.d.ts +2 -0
- package/dist/transports/daily/index.js +9 -0
- package/dist/transports/heygen/index.d.ts +2 -0
- package/dist/transports/heygen/index.js +9 -0
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/lemonslice/index.d.ts +2 -0
- package/dist/transports/lemonslice/index.js +9 -0
- package/dist/transports/livekit/index.d.ts +2 -0
- package/dist/transports/livekit/index.js +9 -0
- package/dist/transports/local/index.d.ts +2 -0
- package/dist/transports/local/index.js +9 -0
- package/dist/transports/moq/index.d.ts +2 -0
- package/dist/transports/moq/index.js +9 -0
- package/dist/transports/smallwebrtc/index.d.ts +2 -0
- package/dist/transports/smallwebrtc/index.js +9 -0
- package/dist/transports/tavus/index.d.ts +2 -0
- package/dist/transports/tavus/index.js +9 -0
- package/dist/transports/video_in_sampler.d.ts +157 -0
- package/dist/transports/video_in_sampler.js +258 -0
- package/dist/transports/vonage/index.d.ts +2 -0
- package/dist/transports/vonage/index.js +9 -0
- package/dist/transports/websocket/index.d.ts +2 -0
- package/dist/transports/websocket/index.js +9 -0
- package/dist/transports/whatsapp/index.d.ts +2 -0
- package/dist/transports/whatsapp/index.js +9 -0
- package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
- package/dist/turns/eager_end_of_turn_mixin.js +122 -0
- package/dist/turns/empty_user_turn.d.ts +55 -0
- package/dist/turns/empty_user_turn.js +53 -0
- package/dist/turns/index.d.ts +2 -0
- package/dist/turns/index.js +8 -0
- package/dist/turns/speculation_gate.d.ts +169 -0
- package/dist/turns/speculation_gate.js +294 -0
- package/dist/turns/types.d.ts +33 -0
- package/dist/turns/types.js +35 -0
- package/dist/turns/user_idle_controller.d.ts +94 -0
- package/dist/turns/user_idle_controller.js +187 -0
- package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
- package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
- package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
- package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
- package/dist/turns/user_mute/index.d.ts +6 -0
- package/dist/turns/user_mute/index.js +11 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
- package/dist/turns/user_start/index.d.ts +8 -0
- package/dist/turns/user_start/index.js +16 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
- package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
- package/dist/turns/user_stop/eager_match_policy.js +50 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
- package/dist/turns/user_stop/index.d.ts +10 -0
- package/dist/turns/user_stop/index.js +15 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
- package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
- package/dist/turns/user_turn_completion_mixin.js +591 -0
- package/dist/turns/user_turn_controller.d.ts +134 -0
- package/dist/turns/user_turn_controller.js +335 -0
- package/dist/turns/user_turn_processor.d.ts +87 -0
- package/dist/turns/user_turn_processor.js +180 -0
- package/dist/turns/user_turn_strategies.d.ts +187 -0
- package/dist/turns/user_turn_strategies.js +222 -0
- package/dist/utils/async_tool_cancellation.d.ts +35 -0
- package/dist/utils/async_tool_cancellation.js +78 -0
- package/dist/utils/asyncio/index.d.ts +2 -0
- package/dist/utils/asyncio/index.js +7 -0
- package/dist/utils/asyncio/task_manager.d.ts +49 -0
- package/dist/utils/asyncio/task_manager.js +105 -0
- package/dist/utils/base_object.d.ts +76 -0
- package/dist/utils/base_object.js +154 -0
- package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
- package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
- package/dist/utils/context/audio_context_manager.d.ts +131 -0
- package/dist/utils/context/audio_context_manager.js +233 -0
- package/dist/utils/context/index.d.ts +2 -0
- package/dist/utils/context/index.js +7 -0
- package/dist/utils/context/llm_context_summarization.d.ts +258 -0
- package/dist/utils/context/llm_context_summarization.js +511 -0
- package/dist/utils/context/text_segment_map.d.ts +611 -0
- package/dist/utils/context/text_segment_map.js +1132 -0
- package/dist/utils/context/word_completion_tracker.d.ts +273 -0
- package/dist/utils/context/word_completion_tracker.js +441 -0
- package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
- package/dist/utils/context/word_timestamp_tracker.js +98 -0
- package/dist/utils/deprecation.d.ts +28 -0
- package/dist/utils/deprecation.js +75 -0
- package/dist/utils/env.d.ts +38 -0
- package/dist/utils/env.js +62 -0
- package/dist/utils/errors.d.ts +75 -0
- package/dist/utils/errors.js +202 -0
- package/dist/utils/file_resolver.d.ts +126 -0
- package/dist/utils/file_resolver.js +314 -0
- package/dist/utils/file_storage.d.ts +99 -0
- package/dist/utils/file_storage.js +100 -0
- package/dist/utils/frame_queue.d.ts +36 -0
- package/dist/utils/frame_queue.js +66 -0
- package/dist/utils/http.d.ts +39 -0
- package/dist/utils/http.js +53 -0
- package/dist/utils/image.d.ts +15 -0
- package/dist/utils/image.js +30 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/log_config.d.ts +34 -0
- package/dist/utils/log_config.js +76 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/mixin.d.ts +14 -0
- package/dist/utils/mixin.js +63 -0
- package/dist/utils/network.d.ts +73 -0
- package/dist/utils/network.js +90 -0
- package/dist/utils/security/allowed_origins.d.ts +16 -0
- package/dist/utils/security/allowed_origins.js +34 -0
- package/dist/utils/security/index.d.ts +2 -0
- package/dist/utils/security/index.js +7 -0
- package/dist/utils/security/redaction.d.ts +27 -0
- package/dist/utils/security/redaction.js +123 -0
- package/dist/utils/security/ssrf.d.ts +79 -0
- package/dist/utils/security/ssrf.js +327 -0
- package/dist/utils/shared.d.ts +35 -0
- package/dist/utils/shared.js +136 -0
- package/dist/utils/startup.d.ts +17 -0
- package/dist/utils/startup.js +130 -0
- package/dist/utils/string.d.ts +116 -0
- package/dist/utils/string.js +460 -0
- package/dist/utils/sync/base_notifier.d.ts +25 -0
- package/dist/utils/sync/base_notifier.js +16 -0
- package/dist/utils/sync/event_notifier.d.ts +38 -0
- package/dist/utils/sync/event_notifier.js +51 -0
- package/dist/utils/sync/index.d.ts +2 -0
- package/dist/utils/sync/index.js +7 -0
- package/dist/utils/text/alnum_utils.d.ts +109 -0
- package/dist/utils/text/alnum_utils.js +262 -0
- package/dist/utils/text/base_text_aggregator.d.ts +146 -0
- package/dist/utils/text/base_text_aggregator.js +102 -0
- package/dist/utils/text/base_text_filter.d.ts +54 -0
- package/dist/utils/text/base_text_filter.js +50 -0
- package/dist/utils/text/index.d.ts +2 -0
- package/dist/utils/text/index.js +7 -0
- package/dist/utils/text/markdown_text_filter.d.ts +147 -0
- package/dist/utils/text/markdown_text_filter.js +522 -0
- package/dist/utils/text/markup_utils.d.ts +54 -0
- package/dist/utils/text/markup_utils.js +156 -0
- package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
- package/dist/utils/text/pattern_pair_aggregator.js +478 -0
- package/dist/utils/text/phonemes.d.ts +60 -0
- package/dist/utils/text/phonemes.js +172 -0
- package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
- package/dist/utils/text/simple_text_aggregator.js +254 -0
- package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
- package/dist/utils/text/skip_tags_aggregator.js +147 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +111 -0
- package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
- package/dist/utils/text/word_timestamp_utils.js +52 -0
- package/dist/utils/time.d.ts +13 -0
- package/dist/utils/time.js +31 -0
- package/dist/utils/tracing/index.d.ts +3 -0
- package/dist/utils/tracing/index.js +8 -0
- package/dist/utils/tracing/service_attributes.d.ts +198 -0
- package/dist/utils/tracing/service_attributes.js +434 -0
- package/dist/utils/tracing/service_decorators.d.ts +214 -0
- package/dist/utils/tracing/service_decorators.js +1662 -0
- package/dist/utils/tracing/setup.d.ts +95 -0
- package/dist/utils/tracing/setup.js +110 -0
- package/dist/utils/tracing/tracing_context.d.ts +55 -0
- package/dist/utils/tracing/tracing_context.js +97 -0
- package/dist/utils/tracing/turn_trace_observer.d.ts +90 -0
- package/dist/utils/tracing/turn_trace_observer.js +219 -0
- package/dist/utils/types.d.ts +80 -0
- package/dist/utils/types.js +108 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.js +22 -0
- package/dist/utils/yaml.d.ts +64 -0
- package/dist/utils/yaml.js +41 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +7 -0
- package/dist/workers/base_worker.d.ts +772 -0
- package/dist/workers/base_worker.js +1298 -0
- package/dist/workers/index.d.ts +2 -0
- package/dist/workers/index.js +8 -0
- package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
- package/dist/workers/llm/backend_llm_worker.js +1055 -0
- package/dist/workers/llm/index.d.ts +6 -0
- package/dist/workers/llm/index.js +11 -0
- package/dist/workers/llm/llm_context_worker.d.ts +66 -0
- package/dist/workers/llm/llm_context_worker.js +72 -0
- package/dist/workers/llm/llm_worker.d.ts +180 -0
- package/dist/workers/llm/llm_worker.js +323 -0
- package/dist/workers/llm/tool_decorator.d.ts +68 -0
- package/dist/workers/llm/tool_decorator.js +60 -0
- package/dist/workers/runner.d.ts +268 -0
- package/dist/workers/runner.js +489 -0
- package/dist/workers/ui/index.d.ts +22 -0
- package/dist/workers/ui/index.js +27 -0
- package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
- package/dist/workers/ui/ui_event_decorator.js +75 -0
- package/dist/workers/ui/ui_job_context.d.ts +12 -0
- package/dist/workers/ui/ui_job_context.js +17 -0
- package/dist/workers/ui/ui_prompts.d.ts +21 -0
- package/dist/workers/ui/ui_prompts.js +41 -0
- package/dist/workers/ui/ui_tools.d.ts +32 -0
- package/dist/workers/ui/ui_tools.js +112 -0
- package/dist/workers/ui/ui_worker.d.ts +571 -0
- package/dist/workers/ui/ui_worker.js +1156 -0
- package/package.json +46 -3
- package/README.md +0 -5
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/observers/turn_tracking_observer.py
|
|
6
|
+
/**
|
|
7
|
+
* Turn tracking observer for conversation flow monitoring.
|
|
8
|
+
*
|
|
9
|
+
* Provides an observer that monitors conversation turns in a pipeline,
|
|
10
|
+
* tracking when turns start and end based on user and bot speech patterns.
|
|
11
|
+
*/
|
|
12
|
+
import { createTask, sleep } from "@pipedog/asyncio";
|
|
13
|
+
import { BotStartedSpeakingFrame, BotStoppedSpeakingFrame, CancelFrame, EndFrame, StartFrame, UserStartedSpeakingFrame, } from "../frames/frames.js";
|
|
14
|
+
import { logger } from "../utils/logger.js";
|
|
15
|
+
import { BaseObserver } from "./base_observer.js";
|
|
16
|
+
/**
|
|
17
|
+
* Observer that tracks conversation turns in a pipeline.
|
|
18
|
+
*
|
|
19
|
+
* This observer monitors the flow of conversation by tracking when turns
|
|
20
|
+
* start and end based on user and bot speaking patterns. It handles
|
|
21
|
+
* interruptions, timeouts, and maintains turn state throughout the pipeline.
|
|
22
|
+
*
|
|
23
|
+
* Turn tracking logic:
|
|
24
|
+
*
|
|
25
|
+
* - The first turn starts immediately when the pipeline starts (StartFrame)
|
|
26
|
+
* - Subsequent turns start when the user starts speaking
|
|
27
|
+
* - A turn ends when the bot stops speaking and either:
|
|
28
|
+
* - The user starts speaking again
|
|
29
|
+
* - A timeout period elapses with no more bot speech
|
|
30
|
+
*
|
|
31
|
+
* Events:
|
|
32
|
+
*
|
|
33
|
+
* - on_turn_started: Triggered when a turn starts, providing the turn number
|
|
34
|
+
* - on_turn_ended: Triggered when a turn ends, providing the turn number, the
|
|
35
|
+
* turn's duration in seconds, and whether it was interrupted
|
|
36
|
+
*/
|
|
37
|
+
export class TurnTrackingObserver extends BaseObserver {
|
|
38
|
+
_turnCount = 0;
|
|
39
|
+
_isTurnActive = false;
|
|
40
|
+
_isBotSpeaking = false;
|
|
41
|
+
_hasBotSpoken = false;
|
|
42
|
+
_turnStartTime = 0;
|
|
43
|
+
_turnEndTimeoutSecs;
|
|
44
|
+
// Stands in for upstream's `loop.call_later` handle: a task that sleeps for
|
|
45
|
+
// the timeout and then ends the turn.
|
|
46
|
+
_endTurnTimer = null;
|
|
47
|
+
constructor(options = {}) {
|
|
48
|
+
super({ ...options, observeEveryPush: false });
|
|
49
|
+
this._turnEndTimeoutSecs = options.turnEndTimeoutSecs ?? 2.5;
|
|
50
|
+
this._registerEventHandler("on_turn_started");
|
|
51
|
+
this._registerEventHandler("on_turn_ended");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Process frame events for turn tracking.
|
|
55
|
+
*
|
|
56
|
+
* @param data Frame push event data containing the frame and metadata.
|
|
57
|
+
*/
|
|
58
|
+
async onPushFrame(data) {
|
|
59
|
+
if (data.frame instanceof StartFrame) {
|
|
60
|
+
// Start the first turn immediately when the pipeline starts
|
|
61
|
+
if (this._turnCount === 0) {
|
|
62
|
+
await this._startTurn(data);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (data.frame instanceof UserStartedSpeakingFrame) {
|
|
66
|
+
await this._handleUserStartedSpeaking(data);
|
|
67
|
+
}
|
|
68
|
+
else if (data.frame instanceof BotStartedSpeakingFrame) {
|
|
69
|
+
await this._handleBotStartedSpeaking(data);
|
|
70
|
+
}
|
|
71
|
+
// A BotStoppedSpeakingFrame can arrive after a UserStartedSpeakingFrame
|
|
72
|
+
// following an interruption. We only want to end the turn if the bot was
|
|
73
|
+
// previously speaking.
|
|
74
|
+
else if (data.frame instanceof BotStoppedSpeakingFrame && this._isBotSpeaking) {
|
|
75
|
+
await this._handleBotStoppedSpeaking(data);
|
|
76
|
+
}
|
|
77
|
+
else if (data.frame instanceof EndFrame || data.frame instanceof CancelFrame) {
|
|
78
|
+
await this._handlePipelineEnd(data);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Cancel the pending turn end timer.
|
|
83
|
+
*
|
|
84
|
+
* The pipeline can be torn down before this observer receives its EndFrame
|
|
85
|
+
* or CancelFrame, and the timer's callback holds the pipeline until it fires.
|
|
86
|
+
*/
|
|
87
|
+
async cleanup() {
|
|
88
|
+
this._cancelTurnEndTimer();
|
|
89
|
+
await super.cleanup();
|
|
90
|
+
}
|
|
91
|
+
/** Schedule turn end with a timeout. */
|
|
92
|
+
_scheduleTurnEnd(data) {
|
|
93
|
+
// Cancel any existing timer
|
|
94
|
+
this._cancelTurnEndTimer();
|
|
95
|
+
// Create a new timer
|
|
96
|
+
const timer = createTask(async () => {
|
|
97
|
+
await sleep(this._turnEndTimeoutSecs);
|
|
98
|
+
// The timer has fired: like a `call_later` handle, cancelling it from
|
|
99
|
+
// now on no longer stops the callback.
|
|
100
|
+
if (this._endTurnTimer === timer) {
|
|
101
|
+
this._endTurnTimer = null;
|
|
102
|
+
}
|
|
103
|
+
await this._endTurnAfterTimeout(data);
|
|
104
|
+
}, "TurnTrackingObserver::_end_turn_after_timeout");
|
|
105
|
+
this._endTurnTimer = timer;
|
|
106
|
+
}
|
|
107
|
+
/** Cancel the turn end timer if it exists. */
|
|
108
|
+
_cancelTurnEndTimer() {
|
|
109
|
+
if (this._endTurnTimer) {
|
|
110
|
+
this._endTurnTimer.cancel();
|
|
111
|
+
this._endTurnTimer = null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** End turn after timeout has expired. */
|
|
115
|
+
async _endTurnAfterTimeout(data) {
|
|
116
|
+
if (this._isTurnActive && !this._isBotSpeaking) {
|
|
117
|
+
logger.trace(`Turn ${this._turnCount} ending due to timeout`);
|
|
118
|
+
await this._endTurn(data, false);
|
|
119
|
+
this._endTurnTimer = null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Handle user speaking events, including interruptions. */
|
|
123
|
+
async _handleUserStartedSpeaking(data) {
|
|
124
|
+
if (this._isBotSpeaking) {
|
|
125
|
+
// Handle interruption - end current turn and start a new one
|
|
126
|
+
this._cancelTurnEndTimer(); // Cancel any pending end turn timer
|
|
127
|
+
await this._endTurn(data, true);
|
|
128
|
+
this._isBotSpeaking = false; // Bot is considered interrupted
|
|
129
|
+
await this._startTurn(data);
|
|
130
|
+
}
|
|
131
|
+
else if (this._isTurnActive && this._hasBotSpoken) {
|
|
132
|
+
// User started speaking during the turnEndTimeoutSecs period after bot speech
|
|
133
|
+
this._cancelTurnEndTimer(); // Cancel any pending end turn timer
|
|
134
|
+
await this._endTurn(data, false);
|
|
135
|
+
await this._startTurn(data);
|
|
136
|
+
}
|
|
137
|
+
else if (!this._isTurnActive) {
|
|
138
|
+
// Start a new turn after previous one ended
|
|
139
|
+
await this._startTurn(data);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// User is speaking within the same turn (before bot has responded)
|
|
143
|
+
logger.trace(`User is already speaking in Turn ${this._turnCount}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Handle bot speaking events. */
|
|
147
|
+
async _handleBotStartedSpeaking(_data) {
|
|
148
|
+
this._isBotSpeaking = true;
|
|
149
|
+
this._hasBotSpoken = true;
|
|
150
|
+
// Cancel any pending turn end timer when bot starts speaking again
|
|
151
|
+
this._cancelTurnEndTimer();
|
|
152
|
+
}
|
|
153
|
+
/** Handle bot stopped speaking events. */
|
|
154
|
+
async _handleBotStoppedSpeaking(data) {
|
|
155
|
+
this._isBotSpeaking = false;
|
|
156
|
+
// Schedule turn end with timeout.
|
|
157
|
+
// This is needed to handle cases where the bot's speech ends and then
|
|
158
|
+
// resumes. This can happen with HTTP TTS services or function calls.
|
|
159
|
+
this._scheduleTurnEnd(data);
|
|
160
|
+
}
|
|
161
|
+
/** Handle pipeline end or cancellation by flushing any active turn. */
|
|
162
|
+
async _handlePipelineEnd(data) {
|
|
163
|
+
this._cancelTurnEndTimer();
|
|
164
|
+
if (this._isTurnActive) {
|
|
165
|
+
await this._endTurn(data, true);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Start a new turn. */
|
|
169
|
+
async _startTurn(data) {
|
|
170
|
+
this._isTurnActive = true;
|
|
171
|
+
this._hasBotSpoken = false;
|
|
172
|
+
this._turnCount += 1;
|
|
173
|
+
this._turnStartTime = data.timestamp;
|
|
174
|
+
logger.trace(`Turn ${this._turnCount} started`);
|
|
175
|
+
await this._callEventHandler("on_turn_started", this._turnCount);
|
|
176
|
+
}
|
|
177
|
+
/** End the current turn. */
|
|
178
|
+
async _endTurn(data, wasInterrupted) {
|
|
179
|
+
if (!this._isTurnActive) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const duration = (data.timestamp - this._turnStartTime) / 1_000_000_000; // Convert to seconds
|
|
183
|
+
this._isTurnActive = false;
|
|
184
|
+
const status = wasInterrupted ? "interrupted" : "completed";
|
|
185
|
+
logger.trace(`Turn ${this._turnCount} ${status} after ${duration.toFixed(2)}s`);
|
|
186
|
+
await this._callEventHandler("on_turn_ended", this._turnCount, duration, wasInterrupted);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=turn_tracking_observer.js.map
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { MetricsFrame } from "../frames/frames.ts";
|
|
2
|
+
import { BaseObserver, type BaseObserverOptions, type FramePushed } from "./base_observer.ts";
|
|
3
|
+
export interface TTFBBreakdownMetricsOptions {
|
|
4
|
+
processor: string;
|
|
5
|
+
model?: string | null;
|
|
6
|
+
startTime: number;
|
|
7
|
+
durationSecs: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* TTFB measurement with timestamp for timeline placement.
|
|
11
|
+
*
|
|
12
|
+
* - `processor`: name of the processor that reported the TTFB.
|
|
13
|
+
* - `model`: optional model name associated with the metric.
|
|
14
|
+
* - `startTime`: Unix timestamp (seconds) when the TTFB measurement started.
|
|
15
|
+
* - `durationSecs`: TTFB duration in seconds.
|
|
16
|
+
*/
|
|
17
|
+
export declare class TTFBBreakdownMetrics {
|
|
18
|
+
processor: string;
|
|
19
|
+
model: string | null;
|
|
20
|
+
startTime: number;
|
|
21
|
+
durationSecs: number;
|
|
22
|
+
constructor(options: TTFBBreakdownMetricsOptions);
|
|
23
|
+
}
|
|
24
|
+
export interface TextAggregationBreakdownMetricsOptions {
|
|
25
|
+
processor: string;
|
|
26
|
+
startTime: number;
|
|
27
|
+
durationSecs: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Text aggregation measurement with timestamp for timeline placement.
|
|
31
|
+
*
|
|
32
|
+
* - `processor`: name of the processor that reported the metric.
|
|
33
|
+
* - `startTime`: Unix timestamp (seconds) when text aggregation started.
|
|
34
|
+
* - `durationSecs`: aggregation duration in seconds.
|
|
35
|
+
*/
|
|
36
|
+
export declare class TextAggregationBreakdownMetrics {
|
|
37
|
+
processor: string;
|
|
38
|
+
startTime: number;
|
|
39
|
+
durationSecs: number;
|
|
40
|
+
constructor(options: TextAggregationBreakdownMetricsOptions);
|
|
41
|
+
}
|
|
42
|
+
export interface FunctionCallMetricsOptions {
|
|
43
|
+
functionName: string;
|
|
44
|
+
startTime: number;
|
|
45
|
+
durationSecs: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Latency for a single function call execution.
|
|
49
|
+
*
|
|
50
|
+
* - `functionName`: name of the function that was called.
|
|
51
|
+
* - `startTime`: Unix timestamp (seconds) when execution started.
|
|
52
|
+
* - `durationSecs`: time in seconds from execution start to result.
|
|
53
|
+
*/
|
|
54
|
+
export declare class FunctionCallMetrics {
|
|
55
|
+
functionName: string;
|
|
56
|
+
startTime: number;
|
|
57
|
+
durationSecs: number;
|
|
58
|
+
constructor(options: FunctionCallMetricsOptions);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Anything shorter than this is a frame hop rather than work worth naming, so
|
|
62
|
+
* it is rolled into the single pipeline contribution.
|
|
63
|
+
*/
|
|
64
|
+
export declare const MIN_CONTRIBUTION_SECS = 0.005;
|
|
65
|
+
/**
|
|
66
|
+
* Half of the last digit `turnContributionLines()` prints, below which a span
|
|
67
|
+
* would show as zero and so is not part of the timeline at all.
|
|
68
|
+
*/
|
|
69
|
+
export declare const PRINTS_AS_ZERO_SECS = 0.0005;
|
|
70
|
+
/**
|
|
71
|
+
* A point in a user-to-bot cycle that a contribution can start or end at.
|
|
72
|
+
*
|
|
73
|
+
* Most are observed as frames. `LLM_CHUNK` and `SENTENCE` are worked back from
|
|
74
|
+
* a service's own metric, because no frame marks them.
|
|
75
|
+
*/
|
|
76
|
+
declare const _MomentKind: {
|
|
77
|
+
readonly SILENCE: "silence";
|
|
78
|
+
readonly READY: "ready";
|
|
79
|
+
readonly VAD_STOP: "vad stop";
|
|
80
|
+
readonly TRANSCRIPT: "transcript";
|
|
81
|
+
readonly LLM_REQUEST: "llm request";
|
|
82
|
+
readonly LLM_CHUNK: "llm chunk";
|
|
83
|
+
readonly MARKER_COMPLETE: "marker complete";
|
|
84
|
+
readonly MARKER_INCOMPLETE: "marker incomplete";
|
|
85
|
+
readonly HANDLERS_START: "handlers start";
|
|
86
|
+
readonly HANDLERS_END: "handlers end";
|
|
87
|
+
readonly FIRST_TEXT: "first text";
|
|
88
|
+
readonly SENTENCE: "sentence";
|
|
89
|
+
readonly FIRST_AUDIO: "first audio";
|
|
90
|
+
readonly BOT_SPEAKING: "bot speaking";
|
|
91
|
+
};
|
|
92
|
+
type _MomentKind = (typeof _MomentKind)[keyof typeof _MomentKind];
|
|
93
|
+
/**
|
|
94
|
+
* One moment in a cycle.
|
|
95
|
+
*
|
|
96
|
+
* - `at`: Unix timestamp (seconds) of the moment.
|
|
97
|
+
* - `kind`: what happened.
|
|
98
|
+
* - `source`: name of whatever produced it, used when a span takes its owner
|
|
99
|
+
* from one end.
|
|
100
|
+
* - `derived`: whether it was worked back from a metric rather than observed
|
|
101
|
+
* as a frame. A derived moment sits at or before the frame that reported
|
|
102
|
+
* it, which decides the order when the two share a time.
|
|
103
|
+
*/
|
|
104
|
+
declare class _Moment {
|
|
105
|
+
readonly at: number;
|
|
106
|
+
readonly kind: _MomentKind;
|
|
107
|
+
readonly source: string;
|
|
108
|
+
readonly derived: boolean;
|
|
109
|
+
constructor(options: {
|
|
110
|
+
at: number;
|
|
111
|
+
kind: _MomentKind;
|
|
112
|
+
source?: string;
|
|
113
|
+
derived?: boolean;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Where a measured interval was anchored.
|
|
118
|
+
*
|
|
119
|
+
* A greeting is timed from the client connecting, a turn from the user
|
|
120
|
+
* falling silent, so a partial interval is never mistaken for a whole one.
|
|
121
|
+
*/
|
|
122
|
+
export declare const MeasuredFrom: {
|
|
123
|
+
readonly USER_SILENCE: "user_silence";
|
|
124
|
+
readonly CLIENT_CONNECTED: "client_connected";
|
|
125
|
+
};
|
|
126
|
+
export type MeasuredFrom = (typeof MeasuredFrom)[keyof typeof MeasuredFrom];
|
|
127
|
+
/**
|
|
128
|
+
* What kind of thing a contribution's owner is.
|
|
129
|
+
*
|
|
130
|
+
* Grouping on this answers where a turn's time went without matching on the
|
|
131
|
+
* owner's name: a service that could be swapped, a setting the bot chose, the
|
|
132
|
+
* bot's own code, or the pipeline between them.
|
|
133
|
+
*/
|
|
134
|
+
export declare const LatencyOwnerKind: {
|
|
135
|
+
readonly SERVICE: "service";
|
|
136
|
+
readonly SETTING: "setting";
|
|
137
|
+
readonly BOT: "bot";
|
|
138
|
+
readonly PIPELINE: "pipeline";
|
|
139
|
+
};
|
|
140
|
+
export type LatencyOwnerKind = (typeof LatencyOwnerKind)[keyof typeof LatencyOwnerKind];
|
|
141
|
+
export interface LatencyContributionOptions {
|
|
142
|
+
key: string;
|
|
143
|
+
label: string;
|
|
144
|
+
owner: string;
|
|
145
|
+
ownerKind: LatencyOwnerKind;
|
|
146
|
+
startTime: number;
|
|
147
|
+
durationSecs: number;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* One named part of the user-to-bot interval.
|
|
151
|
+
*
|
|
152
|
+
* Contributions account for the whole interval, so their durations sum to the
|
|
153
|
+
* measured latency. Unlike a TTFB, which reports what a service spent once it
|
|
154
|
+
* was asked, a contribution can also name time no service is measuring: the
|
|
155
|
+
* silence a VAD waits out, the tokens a turn-completion marker occupies before
|
|
156
|
+
* any speakable text, or a hold while the pipeline waits for the user to
|
|
157
|
+
* finish a sentence.
|
|
158
|
+
*
|
|
159
|
+
* - `key`: stable identifier for this part of a turn. Unlike `label`, it is
|
|
160
|
+
* safe to group on: it survives the label being reworded.
|
|
161
|
+
* - `label`: what the time was spent on.
|
|
162
|
+
* - `owner`: what spent it — a processor name, or a `config:` tag naming the
|
|
163
|
+
* setting that governs it.
|
|
164
|
+
* - `ownerKind`: what kind of thing the owner is.
|
|
165
|
+
* - `startTime`: Unix timestamp (seconds) when it started.
|
|
166
|
+
* - `durationSecs`: how long it took, in seconds.
|
|
167
|
+
*/
|
|
168
|
+
export declare class LatencyContribution {
|
|
169
|
+
key: string;
|
|
170
|
+
label: string;
|
|
171
|
+
owner: string;
|
|
172
|
+
ownerKind: LatencyOwnerKind;
|
|
173
|
+
startTime: number;
|
|
174
|
+
durationSecs: number;
|
|
175
|
+
constructor(options: LatencyContributionOptions);
|
|
176
|
+
}
|
|
177
|
+
export interface LatencyBreakdownOptions {
|
|
178
|
+
ttfb?: TTFBBreakdownMetrics[];
|
|
179
|
+
contributions?: LatencyContribution[];
|
|
180
|
+
measuredFrom?: MeasuredFrom | null;
|
|
181
|
+
totalSecs?: number;
|
|
182
|
+
textAggregation?: TextAggregationBreakdownMetrics | null;
|
|
183
|
+
userTurnStartTime?: number | null;
|
|
184
|
+
userTurnSecs?: number | null;
|
|
185
|
+
functionCalls?: FunctionCallMetrics[];
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Per-service latency breakdown for a single user-to-bot cycle.
|
|
189
|
+
*
|
|
190
|
+
* Collected between `VADUserStoppedSpeakingFrame` and
|
|
191
|
+
* `BotStartedSpeakingFrame` when `enableMetrics` is true in `PipelineParams`.
|
|
192
|
+
*
|
|
193
|
+
* - `ttfb`: time-to-first-byte metrics from each service in the pipeline.
|
|
194
|
+
* - `textAggregation`: first text aggregation measurement, representing the
|
|
195
|
+
* latency cost of sentence aggregation in the TTS pipeline.
|
|
196
|
+
* - `userTurnStartTime`: Unix timestamp when the user turn started (actual
|
|
197
|
+
* user silence, adjusted for VAD stop_secs). null if no
|
|
198
|
+
* `VADUserStoppedSpeakingFrame` was observed.
|
|
199
|
+
* - `userTurnSecs`: duration in seconds of the user's turn, measured from
|
|
200
|
+
* when the user actually stopped speaking to when the turn was released
|
|
201
|
+
* (`UserStoppedSpeakingFrame`). This includes VAD silence detection, STT
|
|
202
|
+
* finalization, and any turn analyzer wait. null if no
|
|
203
|
+
* `UserStoppedSpeakingFrame` was observed (e.g. no turn analyzer
|
|
204
|
+
* configured).
|
|
205
|
+
* - `functionCalls`: latency for each function call executed during this
|
|
206
|
+
* cycle. Empty if no function calls occurred.
|
|
207
|
+
* - `contributions`: named parts of the interval, in chronological order,
|
|
208
|
+
* summing to the measured latency. A part is listed only if it happened, so
|
|
209
|
+
* a bot without turn completion has no marker or wait entries.
|
|
210
|
+
* - `measuredFrom`: where the interval was anchored, so a greeting is not
|
|
211
|
+
* compared with a turn.
|
|
212
|
+
* - `totalSecs`: the measured interval, which the contributions sum to.
|
|
213
|
+
*/
|
|
214
|
+
export declare class LatencyBreakdown {
|
|
215
|
+
ttfb: TTFBBreakdownMetrics[];
|
|
216
|
+
contributions: LatencyContribution[];
|
|
217
|
+
measuredFrom: MeasuredFrom | null;
|
|
218
|
+
totalSecs: number;
|
|
219
|
+
textAggregation: TextAggregationBreakdownMetrics | null;
|
|
220
|
+
userTurnStartTime: number | null;
|
|
221
|
+
userTurnSecs: number | null;
|
|
222
|
+
functionCalls: FunctionCallMetrics[];
|
|
223
|
+
constructor(options?: LatencyBreakdownOptions);
|
|
224
|
+
/**
|
|
225
|
+
* Format the contributions for logging, one per line plus a total.
|
|
226
|
+
*
|
|
227
|
+
* One breakdown covers one user-to-bot cycle, so these lines describe a
|
|
228
|
+
* single turn — or, for the first thing the bot says, the wait before it
|
|
229
|
+
* from the pipeline being ready with a client on it, which the total line
|
|
230
|
+
* names.
|
|
231
|
+
*
|
|
232
|
+
* @param options.byCost Order by duration, largest first, rather than in
|
|
233
|
+
* the order things happened. Useful when the question is what to optimize
|
|
234
|
+
* rather than what the turn did.
|
|
235
|
+
* @returns One formatted line per contribution, then a total line. Empty if
|
|
236
|
+
* no contributions were collected.
|
|
237
|
+
*/
|
|
238
|
+
turnContributionLines(options?: {
|
|
239
|
+
byCost?: boolean;
|
|
240
|
+
}): string[];
|
|
241
|
+
}
|
|
242
|
+
export interface UserBotLatencyObserverOptions extends BaseObserverOptions {
|
|
243
|
+
/**
|
|
244
|
+
* Contributions shorter than this are rolled into the single pipeline entry
|
|
245
|
+
* rather than listed. Pass 0 to list every one, including individual frame
|
|
246
|
+
* hops.
|
|
247
|
+
*/
|
|
248
|
+
minContributionSecs?: number;
|
|
249
|
+
/**
|
|
250
|
+
* Reads the current time in seconds. Supplying one lets a test drive a
|
|
251
|
+
* cycle without waiting out the intervals it describes.
|
|
252
|
+
*/
|
|
253
|
+
timeSource?: () => number;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Observer that tracks user-to-bot response latency.
|
|
257
|
+
*
|
|
258
|
+
* Measures the time between when a user stops speaking
|
|
259
|
+
* (VADUserStoppedSpeakingFrame) and when the bot starts speaking
|
|
260
|
+
* (BotStartedSpeakingFrame). Emits events when latency is measured, allowing
|
|
261
|
+
* consumers to log, trace, or otherwise process the latency data.
|
|
262
|
+
*
|
|
263
|
+
* When `enableMetrics` is true in pipeline params, also collects a latency
|
|
264
|
+
* breakdown and emits an `on_latency_breakdown` event alongside the existing
|
|
265
|
+
* latency measurement. The breakdown carries per-service metrics (TTFB, text
|
|
266
|
+
* aggregation) and, in `contributions`, the whole interval named part by part:
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* for (const line of breakdown.turnContributionLines()) {
|
|
270
|
+
* logger.info(line);
|
|
271
|
+
* }
|
|
272
|
+
* // 0.200s endpointing wait [config: VAD stop_secs]
|
|
273
|
+
* // 0.125s transcription [DeepgramSTTService#0]
|
|
274
|
+
* // 0.336s LLM inference [OpenAILLMService#0]
|
|
275
|
+
* // 0.359s speech synthesis [CartesiaTTSService#0]
|
|
276
|
+
* // 1.020s TOTAL
|
|
277
|
+
*
|
|
278
|
+
* This observer follows the composition pattern used by
|
|
279
|
+
* TurnTrackingObserver, acting as a reusable component for latency
|
|
280
|
+
* measurement.
|
|
281
|
+
*
|
|
282
|
+
* Events:
|
|
283
|
+
*
|
|
284
|
+
* - on_latency_measured(observer, latencySeconds): emitted when
|
|
285
|
+
* time-to-first-bot-speech is calculated. Measures the time from when the
|
|
286
|
+
* user stopped speaking to when the bot starts speaking.
|
|
287
|
+
* - on_latency_breakdown(observer, breakdown): emitted at each
|
|
288
|
+
* `BotStartedSpeakingFrame` with a `LatencyBreakdown` containing
|
|
289
|
+
* per-service metrics collected during the user→bot cycle.
|
|
290
|
+
* - on_first_bot_speech_latency(observer, latencySeconds): emitted once, the
|
|
291
|
+
* first time `BotStartedSpeakingFrame` arrives after `ClientConnectedFrame`.
|
|
292
|
+
* Measures the time from client connection to the first bot speech.
|
|
293
|
+
*/
|
|
294
|
+
export declare class UserBotLatencyObserver extends BaseObserver {
|
|
295
|
+
protected _minContributionSecs: number;
|
|
296
|
+
protected _now: () => number;
|
|
297
|
+
protected _userStoppedTime: number | null;
|
|
298
|
+
protected _userTurnStartTime: number | null;
|
|
299
|
+
protected _userTurn: number | null;
|
|
300
|
+
protected _clientConnectedTime: number | null;
|
|
301
|
+
protected _pipelineStartedTime: number | null;
|
|
302
|
+
protected _firstBotSpeechMeasured: boolean;
|
|
303
|
+
protected _moments: _Moment[];
|
|
304
|
+
protected _llmRequest: _Moment | null;
|
|
305
|
+
protected _markersSeen: boolean;
|
|
306
|
+
protected _ttfb: TTFBBreakdownMetrics[];
|
|
307
|
+
protected _textAggregation: TextAggregationBreakdownMetrics | null;
|
|
308
|
+
protected _functionCallStarts: Map<string, [string, number]>;
|
|
309
|
+
protected _functionCallMetrics: FunctionCallMetrics[];
|
|
310
|
+
/**
|
|
311
|
+
* Initialize the user-bot latency observer.
|
|
312
|
+
*
|
|
313
|
+
* @param options.minContributionSecs Contributions shorter than this are
|
|
314
|
+
* rolled into the single pipeline entry rather than listed.
|
|
315
|
+
* @param options.timeSource Reads the current time in seconds.
|
|
316
|
+
*/
|
|
317
|
+
constructor(options?: UserBotLatencyObserverOptions);
|
|
318
|
+
/**
|
|
319
|
+
* Record that the pipeline finished starting.
|
|
320
|
+
*
|
|
321
|
+
* The `StartFrame` has reached every processor by now, which is where
|
|
322
|
+
* `StartupTimingObserver` stops measuring. A greeting is timed from here so
|
|
323
|
+
* the two reports meet rather than overlap.
|
|
324
|
+
*/
|
|
325
|
+
onPipelineStarted(): Promise<void>;
|
|
326
|
+
/**
|
|
327
|
+
* Process frames to track speech timing and calculate latency.
|
|
328
|
+
*
|
|
329
|
+
* Tracks VAD events and bot speaking events to measure the time between
|
|
330
|
+
* user stopping speech and bot starting speech. Also accumulates metrics
|
|
331
|
+
* from MetricsFrame for the latency breakdown.
|
|
332
|
+
*
|
|
333
|
+
* @param data Frame push event containing the frame and direction information.
|
|
334
|
+
*/
|
|
335
|
+
onPushFrame(data: FramePushed): Promise<void>;
|
|
336
|
+
/**
|
|
337
|
+
* Record a moment, if a cycle is being measured.
|
|
338
|
+
*
|
|
339
|
+
* @param kind What happened.
|
|
340
|
+
* @param options.at When, defaulting to now. Derived moments pass their own time.
|
|
341
|
+
* @param options.source Name of whatever produced it.
|
|
342
|
+
* @param options.once Keep only the first of this kind, for frames that
|
|
343
|
+
* repeat within a cycle such as text and audio.
|
|
344
|
+
* @param options.derived Whether it comes from a metric rather than from a frame.
|
|
345
|
+
* @returns The recorded moment, or null if it was not recorded.
|
|
346
|
+
*/
|
|
347
|
+
protected _mark(kind: _MomentKind, options?: {
|
|
348
|
+
at?: number | null;
|
|
349
|
+
source?: string;
|
|
350
|
+
once?: boolean;
|
|
351
|
+
derived?: boolean;
|
|
352
|
+
}): _Moment | null;
|
|
353
|
+
/** Whether a moment of this kind has been recorded this cycle. */
|
|
354
|
+
protected _seen(kind: _MomentKind): boolean;
|
|
355
|
+
/** Whether a cycle is open: a user turn, or the wait for the greeting. */
|
|
356
|
+
protected get _measuring(): boolean;
|
|
357
|
+
/**
|
|
358
|
+
* Moments that come from metrics rather than from frames.
|
|
359
|
+
*
|
|
360
|
+
* Handlers dispatched together run concurrently, so they become one pair of
|
|
361
|
+
* moments named for the one the wait actually depends on: listing each
|
|
362
|
+
* would count the same stretch of wall clock more than once.
|
|
363
|
+
*
|
|
364
|
+
* @returns The sentence-aggregation and function-handler moments, if any.
|
|
365
|
+
*/
|
|
366
|
+
protected _derivedMoments(): _Moment[];
|
|
367
|
+
/**
|
|
368
|
+
* Group function handlers whose executions overlap in time.
|
|
369
|
+
*
|
|
370
|
+
* @returns Groups of overlapping calls, in the order they started.
|
|
371
|
+
*/
|
|
372
|
+
protected _concurrentHandlers(): FunctionCallMetrics[][];
|
|
373
|
+
/**
|
|
374
|
+
* Name each stretch between one moment and the next.
|
|
375
|
+
*
|
|
376
|
+
* Spans run from one moment to the following one, so they tile the cycle
|
|
377
|
+
* and cannot overlap. A stretch whose pair of moments has no entry in the
|
|
378
|
+
* table is left unnamed and reported as pipeline time, which is what makes
|
|
379
|
+
* a gap in the accounting visible rather than silently absorbed.
|
|
380
|
+
*
|
|
381
|
+
* @returns Contributions in chronological order, or empty if the cycle was
|
|
382
|
+
* never measured.
|
|
383
|
+
*/
|
|
384
|
+
protected _buildContributions(): LatencyContribution[];
|
|
385
|
+
/**
|
|
386
|
+
* Join neighbouring spans that say the same thing.
|
|
387
|
+
*
|
|
388
|
+
* A marker sits in the middle of what a reader thinks of as one stretch, so
|
|
389
|
+
* the table names both halves the same way and they are joined here. Only
|
|
390
|
+
* spans that meet are joined: two of the same name either side of an
|
|
391
|
+
* unnamed gap stay apart, so the gap is reported rather than absorbed.
|
|
392
|
+
*
|
|
393
|
+
* @param spans Contributions in chronological order.
|
|
394
|
+
* @returns The same coverage, with runs of one label and owner joined.
|
|
395
|
+
*/
|
|
396
|
+
protected static _mergeAdjacent(spans: LatencyContribution[]): LatencyContribution[];
|
|
397
|
+
/** Handle BotStartedSpeakingFrame to emit latency and breakdown. */
|
|
398
|
+
protected _handleBotStartedSpeaking(): Promise<void>;
|
|
399
|
+
/**
|
|
400
|
+
* Extract latency metrics from a MetricsFrame.
|
|
401
|
+
*
|
|
402
|
+
* Accumulates metrics when a measurement is in progress: either a user→bot
|
|
403
|
+
* cycle (after `VADUserStoppedSpeakingFrame`) or the first-bot-speech
|
|
404
|
+
* window (after `ClientConnectedFrame`).
|
|
405
|
+
*/
|
|
406
|
+
protected _handleMetricsFrame(frame: MetricsFrame): void;
|
|
407
|
+
/** Clear per-cycle metric accumulators. */
|
|
408
|
+
protected _resetAccumulators(): void;
|
|
409
|
+
}
|
|
410
|
+
export {};
|
|
411
|
+
//# sourceMappingURL=user_bot_latency_observer.d.ts.map
|