@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,332 @@
|
|
|
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/turns/user_stop/turn_analyzer_user_turn_stop_strategy.py
|
|
6
|
+
/** User turn stop strategy based on turn detection analyzers. */
|
|
7
|
+
import { CancelledError, sleep, time } from "@pipedog/asyncio";
|
|
8
|
+
import { EndOfTurnState } from "../../audio/turn/base_turn_analyzer.js";
|
|
9
|
+
import { VAD_STOP_SECS } from "../../audio/vad/vad_analyzer.js";
|
|
10
|
+
import { InputAudioRawFrame, InterimTranscriptionFrame, MetricsFrame, SpeechControlParamsFrame, STTMetadataFrame, StartFrame, TranscriptionFrame, VADUserStartedSpeakingFrame, VADUserStoppedSpeakingFrame, } from "../../frames/frames.js";
|
|
11
|
+
import { logger } from "../../utils/logger.js";
|
|
12
|
+
import { ProcessFrameResult } from "../types.js";
|
|
13
|
+
import { BaseUserTurnStopStrategy, } from "./base_user_turn_stop_strategy.js";
|
|
14
|
+
/**
|
|
15
|
+
* User turn stop strategy that uses a turn detection model to determine if the
|
|
16
|
+
* user is done speaking.
|
|
17
|
+
*
|
|
18
|
+
* This strategy feeds audio, VAD, and transcription frames to a turn
|
|
19
|
+
* detection model (`BaseTurnAnalyzer`) that predicts when the user has
|
|
20
|
+
* finished their turn. Once the model indicates the turn is complete, the
|
|
21
|
+
* strategy waits for a final transcription before triggering the end of
|
|
22
|
+
* the user's turn.
|
|
23
|
+
*
|
|
24
|
+
* For services that support finalization (`TranscriptionFrame.finalized`),
|
|
25
|
+
* the turn can be triggered immediately once the finalized transcript is
|
|
26
|
+
* received. Otherwise, an STT timeout is used as a fallback: the turn is
|
|
27
|
+
* released once `ttfsP99Latency` has elapsed since the end of the user's
|
|
28
|
+
* speech (as reported by VAD, discounting its `stopSecs` silence window).
|
|
29
|
+
*/
|
|
30
|
+
export class TurnAnalyzerUserTurnStopStrategy extends BaseUserTurnStopStrategy {
|
|
31
|
+
_turnAnalyzer;
|
|
32
|
+
_waitForTranscript;
|
|
33
|
+
_sttTimeout = 0.0; // STT P99 latency from STTMetadataFrame
|
|
34
|
+
_stopSecs = 0.0; // VAD stop_secs from VADUserStoppedSpeakingFrame
|
|
35
|
+
_stopSecsWarned = false;
|
|
36
|
+
_text = "";
|
|
37
|
+
_turnComplete = false;
|
|
38
|
+
_vadUserSpeaking = false;
|
|
39
|
+
_vadStopped = false; // Whether VAD reported a stop this turn
|
|
40
|
+
_transcriptFinalized = false;
|
|
41
|
+
_timeoutTask = null;
|
|
42
|
+
_timeoutExpired = false;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
super(options);
|
|
45
|
+
this._turnAnalyzer = options.turnAnalyzer;
|
|
46
|
+
this._waitForTranscript = options.waitForTranscript ?? true;
|
|
47
|
+
}
|
|
48
|
+
/** Whether transcripts gate end-of-turn signalling. */
|
|
49
|
+
get waitForTranscript() {
|
|
50
|
+
return this._waitForTranscript;
|
|
51
|
+
}
|
|
52
|
+
set waitForTranscript(value) {
|
|
53
|
+
this._waitForTranscript = value;
|
|
54
|
+
}
|
|
55
|
+
/** Ready the strategy to detect the end of the turn now starting. */
|
|
56
|
+
async handleUserTurnStarted() {
|
|
57
|
+
await this._reset();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Clear the analyzer's buffered speech when the turn ends.
|
|
61
|
+
*
|
|
62
|
+
* Beyond the usual per-turn reset, drop the analyzer's buffered speech
|
|
63
|
+
* state so a stale silence timer can't fire a phantom end-of-turn after
|
|
64
|
+
* an externally-ended turn (for example a forced stop while a mute
|
|
65
|
+
* strategy held audio back). The analyzer already clears itself on its
|
|
66
|
+
* own COMPLETE, so the clear is a no-op on the normal path; the
|
|
67
|
+
* pre-speech buffer refills continuously before the next turn starts.
|
|
68
|
+
*/
|
|
69
|
+
async handleUserTurnStopped() {
|
|
70
|
+
await this._reset();
|
|
71
|
+
this._turnAnalyzer.clear();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Clear turn-scoped state. Runs at both turn boundaries.
|
|
75
|
+
*
|
|
76
|
+
* `_vadUserSpeaking` is deliberately left alone: whether the user is
|
|
77
|
+
* speaking belongs to the user rather than to the turn, and VAD reports it
|
|
78
|
+
* only on transitions. Clearing it at a turn start VAD didn't drive — a
|
|
79
|
+
* turn begun from a transcript, mid-utterance — would leave it wrong until
|
|
80
|
+
* the user next stops.
|
|
81
|
+
*/
|
|
82
|
+
async _reset() {
|
|
83
|
+
this._text = "";
|
|
84
|
+
await this._discardPendingEndOfTurn();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Drop any end-of-turn conclusion reached so far.
|
|
88
|
+
*
|
|
89
|
+
* Runs at a turn boundary, and whenever VAD reports the user speaking
|
|
90
|
+
* again — which makes an earlier conclusion stale mid-turn.
|
|
91
|
+
*/
|
|
92
|
+
async _discardPendingEndOfTurn() {
|
|
93
|
+
this._turnComplete = false;
|
|
94
|
+
this._transcriptFinalized = false;
|
|
95
|
+
this._timeoutExpired = false;
|
|
96
|
+
this._vadStopped = false;
|
|
97
|
+
if (this._timeoutTask) {
|
|
98
|
+
await this.taskManager.cancelTask(this._timeoutTask);
|
|
99
|
+
this._timeoutTask = null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Set up the strategy.
|
|
104
|
+
*
|
|
105
|
+
* @param setup Configuration object containing setup parameters.
|
|
106
|
+
*/
|
|
107
|
+
async setup(setup) {
|
|
108
|
+
await super.setup(setup);
|
|
109
|
+
this._turnAnalyzer.setSampleRate(setup.audioInSampleRate);
|
|
110
|
+
}
|
|
111
|
+
/** Cleanup the strategy. */
|
|
112
|
+
async cleanup() {
|
|
113
|
+
await super.cleanup();
|
|
114
|
+
await this._turnAnalyzer.cleanup();
|
|
115
|
+
if (this._timeoutTask) {
|
|
116
|
+
await this.taskManager.cancelTask(this._timeoutTask);
|
|
117
|
+
this._timeoutTask = null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Process an incoming frame to update the turn analyzer and strategy state.
|
|
122
|
+
*
|
|
123
|
+
* @param frame The frame to be analyzed.
|
|
124
|
+
* @returns Always returns CONTINUE so subsequent stop strategies are evaluated.
|
|
125
|
+
*/
|
|
126
|
+
async processFrame(frame) {
|
|
127
|
+
await super.processFrame(frame);
|
|
128
|
+
if (frame instanceof StartFrame) {
|
|
129
|
+
await this._start(frame);
|
|
130
|
+
}
|
|
131
|
+
else if (frame instanceof STTMetadataFrame) {
|
|
132
|
+
this._sttTimeout = frame.ttfsP99Latency;
|
|
133
|
+
this._stopSecsWarned = false;
|
|
134
|
+
}
|
|
135
|
+
else if (frame instanceof VADUserStartedSpeakingFrame) {
|
|
136
|
+
await this._handleVadUserStartedSpeaking(frame);
|
|
137
|
+
}
|
|
138
|
+
else if (frame instanceof VADUserStoppedSpeakingFrame) {
|
|
139
|
+
await this._handleVadUserStoppedSpeaking(frame);
|
|
140
|
+
}
|
|
141
|
+
else if (frame instanceof InputAudioRawFrame) {
|
|
142
|
+
await this._handleInputAudio(frame);
|
|
143
|
+
}
|
|
144
|
+
else if (frame instanceof TranscriptionFrame) {
|
|
145
|
+
await this._handleTranscription(frame);
|
|
146
|
+
}
|
|
147
|
+
else if (frame instanceof InterimTranscriptionFrame) {
|
|
148
|
+
// An interim means more transcription is still on the way, so an
|
|
149
|
+
// earlier finalized transcript no longer covers all of the user's
|
|
150
|
+
// speech.
|
|
151
|
+
// Without this, a transcript finalized during a pause too short for
|
|
152
|
+
// VAD to report a stop (and thus a new start, which is what normally
|
|
153
|
+
// clears the flag) would leave the flag stale and trigger the turn
|
|
154
|
+
// immediately at the next VAD stop while the tail of the utterance
|
|
155
|
+
// is still in flight. This can happen when the STT endpointer
|
|
156
|
+
// finalizes on silences shorter than the VAD stop_secs — e.g. an
|
|
157
|
+
// aggressive STT endpoint or a manually raised stop_secs.
|
|
158
|
+
this._transcriptFinalized = false;
|
|
159
|
+
}
|
|
160
|
+
return ProcessFrameResult.CONTINUE;
|
|
161
|
+
}
|
|
162
|
+
/** Process the start frame to configure the turn analyzer. */
|
|
163
|
+
async _start(_frame) {
|
|
164
|
+
await this.broadcastFrame(SpeechControlParamsFrame, {
|
|
165
|
+
turnParams: this._turnAnalyzer.params,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/** Handle input audio to check if the turn is completed. */
|
|
169
|
+
async _handleInputAudio(frame) {
|
|
170
|
+
const state = this._turnAnalyzer.appendAudio(frame.audio, this._vadUserSpeaking);
|
|
171
|
+
// Streaming analyzers (e.g. KrispVivaTurn) detect turn completion
|
|
172
|
+
// frame-by-frame inside appendAudio, so COMPLETE is returned here
|
|
173
|
+
// rather than in analyzeEndOfTurn. Batch analyzers (BaseSmartTurn)
|
|
174
|
+
// return COMPLETE here only on a silence timeout. In either case we
|
|
175
|
+
// consume and push metrics immediately while they're fresh.
|
|
176
|
+
if (state === EndOfTurnState.COMPLETE) {
|
|
177
|
+
const [, prediction] = await this._turnAnalyzer.analyzeEndOfTurn();
|
|
178
|
+
await this._handlePredictionResult(prediction);
|
|
179
|
+
this._turnComplete = true;
|
|
180
|
+
await this._maybeTriggerUserTurnStopped();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** Handle when the VAD indicates the user is speaking. */
|
|
184
|
+
async _handleVadUserStartedSpeaking(frame) {
|
|
185
|
+
// Sync Smart Turn pre-speech buffering with VAD start delay
|
|
186
|
+
this._turnAnalyzer.updateVadStartSecs(frame.startSecs);
|
|
187
|
+
this._vadUserSpeaking = true;
|
|
188
|
+
await this._discardPendingEndOfTurn();
|
|
189
|
+
}
|
|
190
|
+
/** Handle when the VAD indicates the user has stopped speaking. */
|
|
191
|
+
async _handleVadUserStoppedSpeaking(frame) {
|
|
192
|
+
this._vadUserSpeaking = false;
|
|
193
|
+
this._stopSecs = frame.stopSecs;
|
|
194
|
+
this._vadStopped = true;
|
|
195
|
+
// The STT p99 budget is measured from when the user actually stopped
|
|
196
|
+
// speaking, which VAD only reports stop_secs later. Anchoring the
|
|
197
|
+
// safety net to that absolute deadline keeps the wait fixed no matter
|
|
198
|
+
// how long end-of-turn analysis (e.g. ML inference) takes before the
|
|
199
|
+
// timer is armed.
|
|
200
|
+
const sttDeadline = frame.timestamp - frame.stopSecs + this._sttTimeout;
|
|
201
|
+
const [state, prediction] = await this._turnAnalyzer.analyzeEndOfTurn();
|
|
202
|
+
await this._handlePredictionResult(prediction);
|
|
203
|
+
// The user stopped speaking and the turn is complete, we now need to
|
|
204
|
+
// wait for transcriptions.
|
|
205
|
+
this._turnComplete = state === EndOfTurnState.COMPLETE;
|
|
206
|
+
const timeout = Math.max(0, sttDeadline - time());
|
|
207
|
+
if (!this._stopSecsWarned) {
|
|
208
|
+
if (this._stopSecs !== VAD_STOP_SECS) {
|
|
209
|
+
this._stopSecsWarned = true;
|
|
210
|
+
logger.warning(`${this}: VAD stop_secs (${this._stopSecs}s) differs from the ` +
|
|
211
|
+
`recommended default (${VAD_STOP_SECS}s). Built-in p99 latency ` +
|
|
212
|
+
`values assume stop_secs=${VAD_STOP_SECS}. Re-run ` +
|
|
213
|
+
"https://github.com/pipecat-ai/stt-benchmark with your settings " +
|
|
214
|
+
"and pass the TTFS P99 latency result as ttfs_p99_latency to " +
|
|
215
|
+
"your STT service.");
|
|
216
|
+
}
|
|
217
|
+
if (this._sttTimeout > 0 && this._stopSecs >= this._sttTimeout) {
|
|
218
|
+
this._stopSecsWarned = true;
|
|
219
|
+
logger.warning(`${this}: VAD stop_secs (${this._stopSecs}s) >= STT p99 latency ` +
|
|
220
|
+
`(${this._sttTimeout}s). STT wait timeout collapsed to 0s, which ` +
|
|
221
|
+
"may cause delayed turn detection specified by the " +
|
|
222
|
+
"user_turn_stop_timeout parameter in the LLMUserAggregatorParams.");
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
this._timeoutTask = this.taskManager.createTask(() => this._timeoutHandler(timeout), `${this}::_timeout_handler`);
|
|
226
|
+
// A finalized transcript (or COMPLETE itself, when waitForTranscript
|
|
227
|
+
// is false) may already have satisfied the trigger conditions while the
|
|
228
|
+
// analyzer was running. The analyzer's verdict is only known now, so
|
|
229
|
+
// re-check here rather than wait out the safety-net timer.
|
|
230
|
+
await this._maybeTriggerUserTurnStopped();
|
|
231
|
+
}
|
|
232
|
+
/** Handle user transcription. */
|
|
233
|
+
async _handleTranscription(frame) {
|
|
234
|
+
// We don't really care about the content.
|
|
235
|
+
this._text = frame.text;
|
|
236
|
+
if (frame.finalized) {
|
|
237
|
+
this._transcriptFinalized = true;
|
|
238
|
+
// For finalized transcripts, trigger immediately if turn is complete
|
|
239
|
+
await this._maybeTriggerUserTurnStopped();
|
|
240
|
+
}
|
|
241
|
+
else if (this._timeoutExpired && this._turnComplete) {
|
|
242
|
+
// The p99 timeout already elapsed without a transcript. Now that
|
|
243
|
+
// we have one, trigger the turn stop immediately. This handles the
|
|
244
|
+
// case where the transcript is slower to arrive than the p99 timeout,
|
|
245
|
+
// trigger the user turn to stop immediately.
|
|
246
|
+
await this.triggerUserTurnStopped();
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// Fallback: handle transcripts when no VAD stop was received.
|
|
250
|
+
// This handles edge cases where transcripts arrive without VAD firing.
|
|
251
|
+
// In fallback mode, reset timeout on each transcript to wait for inactivity.
|
|
252
|
+
if (!this._vadUserSpeaking && !this._vadStopped) {
|
|
253
|
+
// Cancel existing fallback timeout if any
|
|
254
|
+
if (this._timeoutTask) {
|
|
255
|
+
await this.taskManager.cancelTask(this._timeoutTask);
|
|
256
|
+
}
|
|
257
|
+
// Without VAD/turn analyzer data, assume turn is complete
|
|
258
|
+
this._turnComplete = true;
|
|
259
|
+
const timeout = Math.max(0, this._sttTimeout - this._stopSecs);
|
|
260
|
+
this._timeoutTask = this.taskManager.createTask(() => this._timeoutHandler(timeout), `${this}::_timeout_handler`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/** Handle a prediction result event from the turn analyzer. */
|
|
264
|
+
async _handlePredictionResult(result) {
|
|
265
|
+
if (result) {
|
|
266
|
+
await this.pushFrame(new MetricsFrame({ data: [result] }));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Wait for the timeout then trigger user turn stopped if conditions met.
|
|
271
|
+
*
|
|
272
|
+
* @param timeout The timeout in seconds to wait.
|
|
273
|
+
*/
|
|
274
|
+
async _timeoutHandler(timeout) {
|
|
275
|
+
try {
|
|
276
|
+
await sleep(timeout);
|
|
277
|
+
}
|
|
278
|
+
catch (e) {
|
|
279
|
+
if (e instanceof CancelledError)
|
|
280
|
+
return;
|
|
281
|
+
throw e;
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
this._timeoutTask = null;
|
|
285
|
+
}
|
|
286
|
+
this._timeoutExpired = true;
|
|
287
|
+
await this._maybeTriggerUserTurnStopped();
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Trigger user turn stopped if conditions are met.
|
|
291
|
+
*
|
|
292
|
+
* Conditions:
|
|
293
|
+
* - Turn analyzer indicates turn is complete
|
|
294
|
+
* - When `waitForTranscript` is true (default): we have transcription text
|
|
295
|
+
* *and* either the safety-net timeout has elapsed or a finalized
|
|
296
|
+
* transcript arrived.
|
|
297
|
+
* - When `waitForTranscript` is false: fire as soon as the turn analyzer
|
|
298
|
+
* reports COMPLETE — independent of transcripts.
|
|
299
|
+
*/
|
|
300
|
+
async _maybeTriggerUserTurnStopped() {
|
|
301
|
+
if (!this._turnComplete) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (!this._waitForTranscript) {
|
|
305
|
+
// Turn-end is driven by the analyzer; transcripts are bookkeeping.
|
|
306
|
+
if (this._timeoutTask) {
|
|
307
|
+
await this.taskManager.cancelTask(this._timeoutTask);
|
|
308
|
+
this._timeoutTask = null;
|
|
309
|
+
}
|
|
310
|
+
await this.triggerUserTurnStopped();
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (!this._text) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
// For finalized transcripts, trigger immediately
|
|
317
|
+
if (this._transcriptFinalized) {
|
|
318
|
+
// Cancel any remaining timeout since we're triggering now
|
|
319
|
+
if (this._timeoutTask) {
|
|
320
|
+
await this.taskManager.cancelTask(this._timeoutTask);
|
|
321
|
+
this._timeoutTask = null;
|
|
322
|
+
}
|
|
323
|
+
await this.triggerUserTurnStopped();
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
// For non-finalized, only trigger if timeout task has completed
|
|
327
|
+
if (this._timeoutTask === null) {
|
|
328
|
+
await this.triggerUserTurnStopped();
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=turn_analyzer_user_turn_stop_strategy.js.map
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mixin for adding turn completion detection to LLM services.
|
|
3
|
+
*
|
|
4
|
+
* This mixin enables LLM services to detect and process turn completion
|
|
5
|
+
* markers (COMPLETE/INCOMPLETE) in LLM responses, allowing for smarter
|
|
6
|
+
* conversation flow where the LLM can indicate whether the user's input was
|
|
7
|
+
* complete or if they were interrupted mid-thought.
|
|
8
|
+
*/
|
|
9
|
+
import { type Task } from "@pipedog/asyncio";
|
|
10
|
+
import { type Ctor } from "../utils/mixin.ts";
|
|
11
|
+
export declare const USER_TURN_COMPLETE_MARKER = "\u25CF";
|
|
12
|
+
/** Short wait - user likely continues soon. */
|
|
13
|
+
export declare const USER_TURN_INCOMPLETE_SHORT_MARKER = "\u25D0";
|
|
14
|
+
/** Long wait - user needs more time. */
|
|
15
|
+
export declare const USER_TURN_INCOMPLETE_LONG_MARKER = "\u25CB";
|
|
16
|
+
/**
|
|
17
|
+
* Completion verdict detected in the current LLM response.
|
|
18
|
+
*
|
|
19
|
+
* - `COMPLETE`: ● detected, response flows through as speech.
|
|
20
|
+
* - `INCOMPLETE`: ◐/○ detected, response suppressed, timeout armed.
|
|
21
|
+
*/
|
|
22
|
+
export declare const TurnMarker: {
|
|
23
|
+
readonly COMPLETE: "complete";
|
|
24
|
+
readonly INCOMPLETE: "incomplete";
|
|
25
|
+
};
|
|
26
|
+
export type TurnMarker = (typeof TurnMarker)[keyof typeof TurnMarker];
|
|
27
|
+
/**
|
|
28
|
+
* How long to wait before re-prompting after an incomplete turn.
|
|
29
|
+
*
|
|
30
|
+
* - `SHORT`: ◐ detected, the user was cut off and likely continues soon.
|
|
31
|
+
* - `LONG`: ○ detected, the user needs more time to think.
|
|
32
|
+
*/
|
|
33
|
+
export declare const IncompleteType: {
|
|
34
|
+
readonly SHORT: "short";
|
|
35
|
+
readonly LONG: "long";
|
|
36
|
+
};
|
|
37
|
+
export type IncompleteType = (typeof IncompleteType)[keyof typeof IncompleteType];
|
|
38
|
+
export declare const DEFAULT_INCOMPLETE_SHORT_PROMPT: string;
|
|
39
|
+
export declare const DEFAULT_INCOMPLETE_LONG_PROMPT: string;
|
|
40
|
+
export declare const USER_TURN_COMPLETION_INSTRUCTIONS: string;
|
|
41
|
+
export interface UserTurnCompletionConfigOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Custom instructions for turn completion. If not provided, the default
|
|
44
|
+
* instructions are rendered from the configured markers.
|
|
45
|
+
*/
|
|
46
|
+
instructions?: string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Marker the LLM emits when the user turn is complete. It is generated
|
|
49
|
+
* before any speakable text, so prefer a character that is a single token
|
|
50
|
+
* in the model's tokenizer.
|
|
51
|
+
*/
|
|
52
|
+
completeMarker?: string;
|
|
53
|
+
/** Marker for a turn cut off mid-thought. */
|
|
54
|
+
incompleteShortMarker?: string;
|
|
55
|
+
/** Marker for a user who needs more time. */
|
|
56
|
+
incompleteLongMarker?: string;
|
|
57
|
+
/** Seconds to wait after a short incomplete before prompting. */
|
|
58
|
+
incompleteShortTimeout?: number;
|
|
59
|
+
/** Seconds to wait after a long incomplete before prompting. */
|
|
60
|
+
incompleteLongTimeout?: number;
|
|
61
|
+
/** Custom prompt when short timeout expires. */
|
|
62
|
+
incompleteShortPrompt?: string | null;
|
|
63
|
+
/** Custom prompt when long timeout expires. */
|
|
64
|
+
incompleteLongPrompt?: string | null;
|
|
65
|
+
}
|
|
66
|
+
/** Configuration for turn completion behavior. See UserTurnCompletionConfigOptions. */
|
|
67
|
+
export declare class UserTurnCompletionConfig {
|
|
68
|
+
instructions: string | null;
|
|
69
|
+
completeMarker: string;
|
|
70
|
+
incompleteShortMarker: string;
|
|
71
|
+
incompleteLongMarker: string;
|
|
72
|
+
incompleteShortTimeout: number;
|
|
73
|
+
incompleteLongTimeout: number;
|
|
74
|
+
incompleteShortPrompt: string | null;
|
|
75
|
+
incompleteLongPrompt: string | null;
|
|
76
|
+
constructor(options?: UserTurnCompletionConfigOptions);
|
|
77
|
+
/** The complete, short and long markers, in that order. */
|
|
78
|
+
get markers(): [string, string, string];
|
|
79
|
+
/** Turn completion instructions, using default if not set. */
|
|
80
|
+
get completionInstructions(): string;
|
|
81
|
+
/** Short incomplete prompt, using default if not set. */
|
|
82
|
+
get shortPrompt(): string;
|
|
83
|
+
/** Long incomplete prompt, using default if not set. */
|
|
84
|
+
get longPrompt(): string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Members the turn completion mixin adds to an LLM service.
|
|
88
|
+
*
|
|
89
|
+
* The underscore-prefixed members are protected upstream; they are public
|
|
90
|
+
* here because a mixin's members have to appear on its interface.
|
|
91
|
+
*/
|
|
92
|
+
export interface UserTurnCompletionLLMServiceMixin {
|
|
93
|
+
_turnTextBuffer: string;
|
|
94
|
+
_responseRaw: string;
|
|
95
|
+
_responseMarker: [string, string] | null;
|
|
96
|
+
_turnMarker: TurnMarker | null;
|
|
97
|
+
_turnCompletionBroadcasted: boolean;
|
|
98
|
+
_userTurnCompletionVoiced: boolean;
|
|
99
|
+
_userSpeaking: boolean;
|
|
100
|
+
_userTurnCompletionConfig: UserTurnCompletionConfig;
|
|
101
|
+
_incompleteTimeoutTask: Task<unknown> | null;
|
|
102
|
+
setUserTurnCompletionConfig(config: UserTurnCompletionConfig | null): void;
|
|
103
|
+
_broadcastTurnCompletion(): Promise<void>;
|
|
104
|
+
_startIncompleteTimeout(incompleteType: IncompleteType): Promise<void>;
|
|
105
|
+
_cancelIncompleteTimeout(): Promise<void>;
|
|
106
|
+
_incompleteTimeoutHandler(incompleteType: IncompleteType, timeout: number): Promise<void>;
|
|
107
|
+
_turnReset(): Promise<void>;
|
|
108
|
+
_pushMarker(marker: string, kind: string, appendToContextImmediately?: boolean): Promise<void>;
|
|
109
|
+
_reportResponse(): Promise<void>;
|
|
110
|
+
_pushTurnText(text: string): Promise<void>;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Mixin that adds turn completion detection to LLM services.
|
|
114
|
+
*
|
|
115
|
+
* This mixin provides methods to push LLM text with turn completion
|
|
116
|
+
* detection. It processes turn completion markers to enable smarter
|
|
117
|
+
* conversation flow:
|
|
118
|
+
*
|
|
119
|
+
* - ● (COMPLETE): Push response normally
|
|
120
|
+
* - ◐ (INCOMPLETE SHORT): Suppress response, wait 5s, then prompt
|
|
121
|
+
* - ○ (INCOMPLETE LONG): Suppress response, wait 10s, then prompt
|
|
122
|
+
*
|
|
123
|
+
* A ● that arrives while VAD still hears the user is stale (the user resumed
|
|
124
|
+
* speaking after the inference was triggered) and is handled as ◐.
|
|
125
|
+
*
|
|
126
|
+
* When incomplete timeouts expire, the mixin automatically prompts the LLM
|
|
127
|
+
* with a contextual follow-up message to re-engage the user.
|
|
128
|
+
*
|
|
129
|
+
* The LLM service controls when to use turn completion by calling
|
|
130
|
+
* `_pushTurnText` instead of `pushFrame`.
|
|
131
|
+
*
|
|
132
|
+
* The mixin requires that the base class is a FrameProcessor (it relies on
|
|
133
|
+
* `pushFrame` with FrameProcessor's signature).
|
|
134
|
+
*
|
|
135
|
+
* Upstream: `class LLMService(UserTurnCompletionLLMServiceMixin, AIService)`
|
|
136
|
+
* → `class LLMService extends UserTurnCompletionLLMServiceMixin(AIService)`.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* // With turn completion:
|
|
140
|
+
* if (this._filterIncompleteUserTurns) {
|
|
141
|
+
* await this._pushTurnText(chunk.text);
|
|
142
|
+
* } else {
|
|
143
|
+
* await this.pushFrame(new LLMTextFrame({ text: chunk.text }));
|
|
144
|
+
* }
|
|
145
|
+
*/
|
|
146
|
+
export declare const UserTurnCompletionLLMServiceMixin: import("../utils/mixin.ts").Mixin<<B extends Ctor>(base: B) => B & Ctor<UserTurnCompletionLLMServiceMixin>, UserTurnCompletionLLMServiceMixin>;
|
|
147
|
+
//# sourceMappingURL=user_turn_completion_mixin.d.ts.map
|