@pipedog/core 0.0.0 → 0.2.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/engine.d.ts +60 -0
- package/dist/audio/resamplers/engine.js +89 -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/sinc_engine.d.ts +10 -0
- package/dist/audio/resamplers/sinc_engine.js +235 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +58 -0
- package/dist/audio/resamplers/soxr_resampler.js +79 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +78 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +159 -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 +151 -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 +134 -0
- package/dist/audio/vad/vad_analyzer.js +249 -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 +821 -0
- package/dist/pipeline/worker.js +1656 -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 +115 -0
- package/dist/utils/file_storage.js +178 -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 +14 -0
- package/dist/utils/image.js +63 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jpeg_encoder.d.ts +14 -0
- package/dist/utils/jpeg_encoder.js +315 -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/acronyms.d.ts +21 -0
- package/dist/utils/text/transforms/acronyms.js +31 -0
- package/dist/utils/text/transforms/currency.d.ts +16 -0
- package/dist/utils/text/transforms/currency.js +56 -0
- package/dist/utils/text/transforms/dates.d.ts +18 -0
- package/dist/utils/text/transforms/dates.js +102 -0
- package/dist/utils/text/transforms/email.d.ts +17 -0
- package/dist/utils/text/transforms/email.js +35 -0
- package/dist/utils/text/transforms/index.d.ts +37 -0
- package/dist/utils/text/transforms/index.js +42 -0
- package/dist/utils/text/transforms/numbers.d.ts +25 -0
- package/dist/utils/text/transforms/numbers.js +59 -0
- package/dist/utils/text/transforms/percentages.d.ts +16 -0
- package/dist/utils/text/transforms/percentages.js +32 -0
- package/dist/utils/text/transforms/phone.d.ts +21 -0
- package/dist/utils/text/transforms/phone.js +39 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +112 -0
- package/dist/utils/text/transforms/replacements.d.ts +39 -0
- package/dist/utils/text/transforms/replacements.js +46 -0
- package/dist/utils/text/transforms/strip_markdown.d.ts +25 -0
- package/dist/utils/text/transforms/strip_markdown.js +60 -0
- package/dist/utils/text/transforms/units.d.ts +22 -0
- package/dist/utils/text/transforms/units.js +81 -0
- package/dist/utils/text/transforms/voice_formatter.d.ts +86 -0
- package/dist/utils/text/transforms/voice_formatter.js +98 -0
- package/dist/utils/text/unicode_digits.d.ts +3 -0
- package/dist/utils/text/unicode_digits.js +34 -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 +107 -0
- package/dist/utils/tracing/setup.js +160 -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 +95 -0
- package/dist/utils/tracing/turn_trace_observer.js +233 -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 +179 -0
- package/dist/utils/yaml.js +556 -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/proxy/index.d.ts +3 -0
- package/dist/workers/proxy/index.js +9 -0
- package/dist/workers/proxy/websocket/client.d.ts +110 -0
- package/dist/workers/proxy/websocket/client.js +196 -0
- package/dist/workers/proxy/websocket/index.d.ts +3 -0
- package/dist/workers/proxy/websocket/index.js +10 -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 +61 -3
- package/README.md +0 -5
|
@@ -0,0 +1,238 @@
|
|
|
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_start/wake_phrase_user_turn_start_strategy.py
|
|
6
|
+
/** User turn start strategy that gates interaction behind wake phrase detection. */
|
|
7
|
+
import { Event, TimeoutError, waitFor } from "@pipedog/asyncio";
|
|
8
|
+
import { BotSpeakingFrame, TranscriptionFrame, UserSpeakingFrame, VADUserStartedSpeakingFrame, } from "../../frames/frames.js";
|
|
9
|
+
import { logger } from "../../utils/logger.js";
|
|
10
|
+
import { ProcessFrameResult } from "../types.js";
|
|
11
|
+
import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
|
|
12
|
+
/** Internal state for wake phrase detection. */
|
|
13
|
+
export const _WakeState = {
|
|
14
|
+
IDLE: "idle",
|
|
15
|
+
AWAKE: "awake",
|
|
16
|
+
};
|
|
17
|
+
// Python's `\w` is Unicode-aware; JS's is ASCII-only even with the `u` flag.
|
|
18
|
+
const WORD_CHAR = "[\\p{L}\\p{N}\\p{M}_]";
|
|
19
|
+
const NON_WORD_NON_SPACE = /[^\p{L}\p{N}\p{M}_\s]/gu;
|
|
20
|
+
function escapeRegExp(text) {
|
|
21
|
+
return text.replace(/[.*+?^${}()|[\]\\/-]/g, "\\$&");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* User turn start strategy that requires a wake phrase before interaction.
|
|
25
|
+
*
|
|
26
|
+
* Blocks subsequent strategies until a wake phrase is detected in a final
|
|
27
|
+
* transcription. After detection, allows interaction for a configurable
|
|
28
|
+
* timeout period before requiring the wake phrase again. Use
|
|
29
|
+
* `singleActivation: true` to require the wake phrase before every turn.
|
|
30
|
+
*
|
|
31
|
+
* This strategy should be placed first in the start strategies list.
|
|
32
|
+
*
|
|
33
|
+
* Event handlers available:
|
|
34
|
+
*
|
|
35
|
+
* - on_wake_phrase_detected: Called when a wake phrase is matched.
|
|
36
|
+
* - on_wake_phrase_timeout: Called when the inactivity timeout expires
|
|
37
|
+
* (timeout mode only).
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* // Timeout mode (default): wake phrase unlocks interaction for 10s
|
|
41
|
+
* const strategy = new WakePhraseUserTurnStartStrategy({
|
|
42
|
+
* phrases: ["hey pipecat", "ok pipecat"],
|
|
43
|
+
* timeout: 10.0,
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* // Single activation: wake phrase required before every turn
|
|
47
|
+
* const single = new WakePhraseUserTurnStartStrategy({
|
|
48
|
+
* phrases: ["hey pipecat"],
|
|
49
|
+
* singleActivation: true,
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* strategy.eventHandler("on_wake_phrase_detected", async (strategy, phrase) => { ... });
|
|
53
|
+
* strategy.eventHandler("on_wake_phrase_timeout", async (strategy) => { ... });
|
|
54
|
+
*
|
|
55
|
+
* `timeout`: In timeout mode, the timer resets on activity (user, bot speech).
|
|
56
|
+
* In single activation mode, acts as a keepalive window — the strategy stays
|
|
57
|
+
* AWAKE for this duration after wake phrase detection, allowing the current
|
|
58
|
+
* turn to complete before returning to IDLE.
|
|
59
|
+
*/
|
|
60
|
+
export class WakePhraseUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
61
|
+
_phrases;
|
|
62
|
+
_timeout;
|
|
63
|
+
_singleActivation;
|
|
64
|
+
_patterns = [];
|
|
65
|
+
_state = _WakeState.IDLE;
|
|
66
|
+
_accumulatedText = "";
|
|
67
|
+
_timeoutEvent = new Event();
|
|
68
|
+
_timeoutTask = null;
|
|
69
|
+
constructor(options) {
|
|
70
|
+
super(options);
|
|
71
|
+
this._phrases = options.phrases;
|
|
72
|
+
this._timeout = options.timeout ?? 10.0;
|
|
73
|
+
this._singleActivation = options.singleActivation ?? false;
|
|
74
|
+
for (const phrase of this._phrases) {
|
|
75
|
+
const words = phrase.split(/\s+/).filter((word) => word.length > 0);
|
|
76
|
+
const pattern = new RegExp(`(?<!${WORD_CHAR})${words.map(escapeRegExp).join("\\s*")}(?!${WORD_CHAR})`, "iu");
|
|
77
|
+
this._patterns.push(pattern);
|
|
78
|
+
}
|
|
79
|
+
this._registerEventHandler("on_wake_phrase_detected");
|
|
80
|
+
this._registerEventHandler("on_wake_phrase_timeout");
|
|
81
|
+
}
|
|
82
|
+
/** Returns the current wake state. */
|
|
83
|
+
get state() {
|
|
84
|
+
return this._state;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Set up the strategy.
|
|
88
|
+
*
|
|
89
|
+
* @param setup Configuration object containing setup parameters.
|
|
90
|
+
*/
|
|
91
|
+
async setup(setup) {
|
|
92
|
+
await super.setup(setup);
|
|
93
|
+
if (!this._timeoutTask) {
|
|
94
|
+
this._timeoutTask = this.taskManager.createTask(() => this._timeoutTaskHandler(), `${this}::_timeout_task_handler`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Cleanup the strategy. */
|
|
98
|
+
async cleanup() {
|
|
99
|
+
await super.cleanup();
|
|
100
|
+
if (this._timeoutTask) {
|
|
101
|
+
await this.taskManager.cancelTask(this._timeoutTask);
|
|
102
|
+
this._timeoutTask = null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Ready the strategy for a new user turn.
|
|
107
|
+
*
|
|
108
|
+
* In timeout mode, preserves state and refreshes the timeout — a turn
|
|
109
|
+
* starting is the activity that keeps the strategy awake. In single
|
|
110
|
+
* activation mode, does nothing: the keepalive timeout (started when the
|
|
111
|
+
* wake phrase was detected) handles the transition back to IDLE.
|
|
112
|
+
*/
|
|
113
|
+
async handleUserTurnStarted() {
|
|
114
|
+
if (this._state === _WakeState.AWAKE) {
|
|
115
|
+
if (!this._singleActivation) {
|
|
116
|
+
this._refreshTimeout();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Process an incoming frame for wake phrase detection or passthrough.
|
|
122
|
+
*
|
|
123
|
+
* @param frame The frame to be processed.
|
|
124
|
+
* @returns STOP when the wake phrase is detected or when in IDLE state
|
|
125
|
+
* (blocks subsequent strategies), CONTINUE when in AWAKE state (allows
|
|
126
|
+
* subsequent strategies to proceed).
|
|
127
|
+
*/
|
|
128
|
+
async processFrame(frame) {
|
|
129
|
+
await super.processFrame(frame);
|
|
130
|
+
if (this._state === _WakeState.IDLE) {
|
|
131
|
+
return await this._processIdle(frame);
|
|
132
|
+
}
|
|
133
|
+
return await this._processAwake(frame);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Process a frame while in IDLE state.
|
|
137
|
+
*
|
|
138
|
+
* Only final `TranscriptionFrame` instances are checked for wake phrase
|
|
139
|
+
* matches. When a match is found, a user turn start is triggered.
|
|
140
|
+
* Transcription frames that don't match have their text cleared so that
|
|
141
|
+
* pre-wake-phrase speech is not added to the LLM context. All frames
|
|
142
|
+
* return STOP to block subsequent strategies.
|
|
143
|
+
*/
|
|
144
|
+
async _processIdle(frame) {
|
|
145
|
+
if (frame instanceof TranscriptionFrame) {
|
|
146
|
+
if (this._checkWakePhrase(frame.text)) {
|
|
147
|
+
await this.triggerUserTurnStarted();
|
|
148
|
+
return ProcessFrameResult.STOP;
|
|
149
|
+
}
|
|
150
|
+
await this.triggerResetAggregation();
|
|
151
|
+
}
|
|
152
|
+
return ProcessFrameResult.STOP;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Process a frame while in AWAKE state.
|
|
156
|
+
*
|
|
157
|
+
* Refreshes the timeout on activity frames (timeout mode only). Returns
|
|
158
|
+
* CONTINUE so subsequent strategies can process the frame.
|
|
159
|
+
*/
|
|
160
|
+
async _processAwake(frame) {
|
|
161
|
+
if (!this._singleActivation) {
|
|
162
|
+
if (frame instanceof UserSpeakingFrame || frame instanceof BotSpeakingFrame) {
|
|
163
|
+
this._refreshTimeout();
|
|
164
|
+
}
|
|
165
|
+
else if (frame instanceof TranscriptionFrame) {
|
|
166
|
+
this._refreshTimeout();
|
|
167
|
+
}
|
|
168
|
+
else if (frame instanceof VADUserStartedSpeakingFrame) {
|
|
169
|
+
this._refreshTimeout();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return ProcessFrameResult.CONTINUE;
|
|
173
|
+
}
|
|
174
|
+
/** Strip punctuation from text, keeping only letters, digits, and whitespace. */
|
|
175
|
+
static _stripPunctuation(text) {
|
|
176
|
+
return text.replace(NON_WORD_NON_SPACE, "");
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if the accumulated text contains a wake phrase.
|
|
180
|
+
*
|
|
181
|
+
* Punctuation is stripped before matching so that STT output like
|
|
182
|
+
* "Hey, Pipecat!" still matches the phrase "hey pipecat".
|
|
183
|
+
*
|
|
184
|
+
* @param text New transcription text to append and check.
|
|
185
|
+
* @returns True if a wake phrase was found, false otherwise.
|
|
186
|
+
*/
|
|
187
|
+
_checkWakePhrase(text) {
|
|
188
|
+
this._accumulatedText += ` ${WakePhraseUserTurnStartStrategy._stripPunctuation(text)}`;
|
|
189
|
+
// Cap accumulated text to prevent unbounded growth.
|
|
190
|
+
if (this._accumulatedText.length > 250) {
|
|
191
|
+
this._accumulatedText = this._accumulatedText.slice(-250);
|
|
192
|
+
}
|
|
193
|
+
for (const [i, pattern] of this._patterns.entries()) {
|
|
194
|
+
if (pattern.test(this._accumulatedText)) {
|
|
195
|
+
const phrase = this._phrases[i];
|
|
196
|
+
logger.debug(`${this} wake phrase detected: '${phrase}'`);
|
|
197
|
+
this._transitionToAwake(phrase);
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
/** Transition from IDLE to AWAKE state. */
|
|
204
|
+
_transitionToAwake(phrase) {
|
|
205
|
+
this._state = _WakeState.AWAKE;
|
|
206
|
+
this._accumulatedText = "";
|
|
207
|
+
this._refreshTimeout();
|
|
208
|
+
this.taskManager.createTask(() => this._callEventHandler("on_wake_phrase_detected", phrase), `${this}::on_wake_phrase_detected`);
|
|
209
|
+
}
|
|
210
|
+
/** Transition from AWAKE to IDLE state. */
|
|
211
|
+
_transitionToIdle() {
|
|
212
|
+
logger.debug(`${this} wake phrase timeout, returning to IDLE`);
|
|
213
|
+
this._state = _WakeState.IDLE;
|
|
214
|
+
this._accumulatedText = "";
|
|
215
|
+
this.taskManager.createTask(() => this._callEventHandler("on_wake_phrase_timeout"), `${this}::on_wake_phrase_timeout`);
|
|
216
|
+
}
|
|
217
|
+
/** Refresh the inactivity timeout. */
|
|
218
|
+
_refreshTimeout() {
|
|
219
|
+
this._timeoutEvent.set();
|
|
220
|
+
}
|
|
221
|
+
/** Background task that monitors inactivity timeout. */
|
|
222
|
+
async _timeoutTaskHandler() {
|
|
223
|
+
while (true) {
|
|
224
|
+
try {
|
|
225
|
+
await waitFor(() => this._timeoutEvent.wait(), this._timeout);
|
|
226
|
+
this._timeoutEvent.clear();
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
if (!(e instanceof TimeoutError))
|
|
230
|
+
throw e;
|
|
231
|
+
if (this._state === _WakeState.AWAKE) {
|
|
232
|
+
this._transitionToIdle();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=wake_phrase_user_turn_start_strategy.js.map
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/** Base user turn stop strategy for determining when the user stopped speaking. */
|
|
2
|
+
import type { Frame } from "../../frames/frames.ts";
|
|
3
|
+
import { FrameDirection, type FrameProcessorSetup } from "../../processors/frame_processor.ts";
|
|
4
|
+
import { BaseObject, type BaseObjectOptions } from "../../utils/base_object.ts";
|
|
5
|
+
import type { ProcessFrameResult, UserTurnSpeculation } from "../types.ts";
|
|
6
|
+
export interface UserTurnStoppedParamsOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Whether to emit `UserStoppedSpeakingFrame` for this turn. False when the
|
|
9
|
+
* turn end was already announced elsewhere — by a shared
|
|
10
|
+
* `UserTurnProcessor`, or by a service that emits turn frames rather than
|
|
11
|
+
* proposing them.
|
|
12
|
+
*/
|
|
13
|
+
enableUserSpeakingFrames: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Whether this turn end confirms a speculative response that was already
|
|
16
|
+
* generated. The aggregator then writes the turn to the context without
|
|
17
|
+
* running inference again, since the answer is already on its way.
|
|
18
|
+
*/
|
|
19
|
+
confirmsSpeculation?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parameters emitted when a user turn stops.
|
|
23
|
+
*
|
|
24
|
+
* These parameters are passed to the `on_user_turn_stopped` event and provide
|
|
25
|
+
* contextual information about how the end of user turn should be handled by
|
|
26
|
+
* the user aggregator.
|
|
27
|
+
*
|
|
28
|
+
* - `enableUserSpeakingFrames`: Whether to emit `UserStoppedSpeakingFrame`
|
|
29
|
+
* for this turn. False when the turn end was already announced elsewhere.
|
|
30
|
+
* - `confirmsSpeculation`: Whether this turn end confirms a speculative
|
|
31
|
+
* response that was already generated.
|
|
32
|
+
*/
|
|
33
|
+
export declare class UserTurnStoppedParams {
|
|
34
|
+
enableUserSpeakingFrames: boolean;
|
|
35
|
+
confirmsSpeculation: boolean;
|
|
36
|
+
constructor(options: UserTurnStoppedParamsOptions);
|
|
37
|
+
}
|
|
38
|
+
export interface BaseUserTurnStopStrategyOptions extends BaseObjectOptions {
|
|
39
|
+
}
|
|
40
|
+
export interface TriggerUserTurnStoppedOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Whether to emit `UserStoppedSpeakingFrame` for this turn. Pass false when
|
|
43
|
+
* something else in the pipeline has already emitted it.
|
|
44
|
+
*/
|
|
45
|
+
enableUserSpeakingFrames?: boolean | null;
|
|
46
|
+
}
|
|
47
|
+
export interface TriggerUserTurnInferenceTriggeredOptions {
|
|
48
|
+
/**
|
|
49
|
+
* Set to run this inference speculatively, against a provisional context
|
|
50
|
+
* carrying the turn text it names, for a turn that hasn't ended yet. The
|
|
51
|
+
* response it produces is held back until the turn is confirmed. Leave null
|
|
52
|
+
* to run the inference against the conversation as it stands.
|
|
53
|
+
*/
|
|
54
|
+
speculation?: UserTurnSpeculation | null;
|
|
55
|
+
}
|
|
56
|
+
export interface TriggerUserTurnFinalizedOptions extends TriggerUserTurnStoppedOptions {
|
|
57
|
+
/**
|
|
58
|
+
* Whether a response generated ahead of this turn ending already answers
|
|
59
|
+
* it, so inference should not run again.
|
|
60
|
+
*/
|
|
61
|
+
confirmsSpeculation?: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Base class for strategies that determine when the user stops speaking.
|
|
65
|
+
*
|
|
66
|
+
* Subclasses should implement logic to detect when the user stops
|
|
67
|
+
* speaking. This could be based on analyzing incoming frames (such as
|
|
68
|
+
* transcriptions), conversation state, or other heuristics.
|
|
69
|
+
*
|
|
70
|
+
* Events triggered by strategies:
|
|
71
|
+
*
|
|
72
|
+
* - `on_push_frame`: Indicates the strategy wants to push a frame.
|
|
73
|
+
* - `on_user_turn_inference_triggered`: Signals that enough evidence
|
|
74
|
+
* exists to start LLM inference for the current user turn, carrying a
|
|
75
|
+
* `UserTurnSpeculation` when the turn it answers hasn't ended yet. In
|
|
76
|
+
* most cases this fires together with `on_user_turn_stopped`. Strategies
|
|
77
|
+
* that gate finalization on the LLM (e.g.
|
|
78
|
+
* `LLMTurnCompletionUserTurnStopStrategy`) fire only this event
|
|
79
|
+
* upstream and a separate strategy fires `on_user_turn_stopped` once
|
|
80
|
+
* the LLM confirms the turn is complete.
|
|
81
|
+
* - `on_user_turn_stopped`: Signals that the user turn is semantically
|
|
82
|
+
* final. Observers, transcript appenders, and UI indicators should
|
|
83
|
+
* bind this event.
|
|
84
|
+
*
|
|
85
|
+
* Porting note: the deprecated `enable_user_speaking_frames` constructor
|
|
86
|
+
* argument and the deprecated `reset()` hook are not ported.
|
|
87
|
+
*/
|
|
88
|
+
export declare class BaseUserTurnStopStrategy extends BaseObject {
|
|
89
|
+
protected _enableUserSpeakingFrames: boolean;
|
|
90
|
+
constructor(options?: BaseUserTurnStopStrategyOptions);
|
|
91
|
+
/**
|
|
92
|
+
* Whether this strategy resolves proposals into turn stops.
|
|
93
|
+
*
|
|
94
|
+
* A `ProposedUserStoppedSpeakingFrame` is a request for a decision, so a
|
|
95
|
+
* strategy that acts on one consumes it: the frame stops travelling, and no
|
|
96
|
+
* resolver further along decides the same turn a second time. Override to
|
|
97
|
+
* true in a strategy that handles that frame — including one that holds the
|
|
98
|
+
* proposal for a while before deciding.
|
|
99
|
+
*/
|
|
100
|
+
get resolvesProposedTurnStopFrames(): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Set up the strategy.
|
|
103
|
+
*
|
|
104
|
+
* @param setup Configuration object containing setup parameters.
|
|
105
|
+
*/
|
|
106
|
+
setup(setup: FrameProcessorSetup): Promise<void>;
|
|
107
|
+
/** Cleanup the strategy. */
|
|
108
|
+
cleanup(): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Notify the strategy that a user turn has started.
|
|
111
|
+
*
|
|
112
|
+
* The controller calls this on every stop strategy when a turn begins.
|
|
113
|
+
* Override to run, for example, logic to arm the strategy to detect the
|
|
114
|
+
* end of the turn now in progress.
|
|
115
|
+
*/
|
|
116
|
+
handleUserTurnStarted(): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Notify the strategy that the user turn has stopped.
|
|
119
|
+
*
|
|
120
|
+
* The controller calls this on every stop strategy when a turn ends,
|
|
121
|
+
* regardless of which strategy (or the stop watchdog timeout) ended it.
|
|
122
|
+
* Override to run stop-specific logic — e.g. dropping a turn analyzer's
|
|
123
|
+
* buffered speech that must not survive an externally-ended turn.
|
|
124
|
+
*/
|
|
125
|
+
handleUserTurnStopped(): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Process an incoming frame to decide whether the user stopped speaking.
|
|
128
|
+
*
|
|
129
|
+
* Subclasses should override this to implement logic that decides whether
|
|
130
|
+
* the user has stopped speaking.
|
|
131
|
+
*
|
|
132
|
+
* @param frame The frame to be analyzed.
|
|
133
|
+
* @returns A ProcessFrameResult indicating the outcome, or null (treated as
|
|
134
|
+
* CONTINUE for backward compatibility).
|
|
135
|
+
*/
|
|
136
|
+
processFrame(_frame: Frame): Promise<ProcessFrameResult | null>;
|
|
137
|
+
/**
|
|
138
|
+
* Emit on_push_frame to push a frame using the user aggregator.
|
|
139
|
+
*
|
|
140
|
+
* @param frame The frame to be pushed.
|
|
141
|
+
* @param direction What direction the frame should be pushed to.
|
|
142
|
+
*/
|
|
143
|
+
pushFrame(frame: Frame, direction?: FrameDirection): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Emit on_broadcast_frame to broadcast a frame using the user aggregator.
|
|
146
|
+
*
|
|
147
|
+
* @param frameCls The class of the frame to be broadcasted.
|
|
148
|
+
* @param options Options to be passed to the frame's constructor.
|
|
149
|
+
*/
|
|
150
|
+
broadcastFrame<O>(frameCls: new (options: O) => Frame, options?: O): Promise<void>;
|
|
151
|
+
/**
|
|
152
|
+
* Withdraw the speculation this strategy has in flight.
|
|
153
|
+
*
|
|
154
|
+
* Emitted rather than pushed so the host broadcasts it the same way it
|
|
155
|
+
* broadcasts the turn end. A withdrawal that took the queued path would
|
|
156
|
+
* reach a downstream gate *after* the turn end that follows it, and the
|
|
157
|
+
* gate would release the response the withdrawal was meant to discard.
|
|
158
|
+
*/
|
|
159
|
+
triggerUserTurnSpeculationCancelled(): Promise<void>;
|
|
160
|
+
/**
|
|
161
|
+
* Fire both `on_user_turn_inference_triggered` and `on_user_turn_stopped`.
|
|
162
|
+
*
|
|
163
|
+
* Most strategies call this when they decide a turn has ended. To
|
|
164
|
+
* defer finalization to another strategy (so this strategy fires
|
|
165
|
+
* only the inference-triggered event), wrap this strategy with
|
|
166
|
+
* `deferred()` instead of changing the trigger call.
|
|
167
|
+
*/
|
|
168
|
+
triggerUserTurnStopped(options?: TriggerUserTurnStoppedOptions): Promise<void>;
|
|
169
|
+
/** Trigger only the `on_user_turn_inference_triggered` event. */
|
|
170
|
+
triggerUserTurnInferenceTriggered(options?: TriggerUserTurnInferenceTriggeredOptions): Promise<void>;
|
|
171
|
+
/** Trigger only the `on_user_turn_stopped` event. */
|
|
172
|
+
triggerUserTurnFinalized(options?: TriggerUserTurnFinalizedOptions): Promise<void>;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=base_user_turn_stop_strategy.d.ts.map
|
|
@@ -0,0 +1,170 @@
|
|
|
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/base_user_turn_stop_strategy.py
|
|
6
|
+
import { FrameDirection } from "../../processors/frame_processor.js";
|
|
7
|
+
import { BaseObject } from "../../utils/base_object.js";
|
|
8
|
+
/**
|
|
9
|
+
* Parameters emitted when a user turn stops.
|
|
10
|
+
*
|
|
11
|
+
* These parameters are passed to the `on_user_turn_stopped` event and provide
|
|
12
|
+
* contextual information about how the end of user turn should be handled by
|
|
13
|
+
* the user aggregator.
|
|
14
|
+
*
|
|
15
|
+
* - `enableUserSpeakingFrames`: Whether to emit `UserStoppedSpeakingFrame`
|
|
16
|
+
* for this turn. False when the turn end was already announced elsewhere.
|
|
17
|
+
* - `confirmsSpeculation`: Whether this turn end confirms a speculative
|
|
18
|
+
* response that was already generated.
|
|
19
|
+
*/
|
|
20
|
+
export class UserTurnStoppedParams {
|
|
21
|
+
enableUserSpeakingFrames;
|
|
22
|
+
confirmsSpeculation;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.enableUserSpeakingFrames = options.enableUserSpeakingFrames;
|
|
25
|
+
this.confirmsSpeculation = options.confirmsSpeculation ?? false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Base class for strategies that determine when the user stops speaking.
|
|
30
|
+
*
|
|
31
|
+
* Subclasses should implement logic to detect when the user stops
|
|
32
|
+
* speaking. This could be based on analyzing incoming frames (such as
|
|
33
|
+
* transcriptions), conversation state, or other heuristics.
|
|
34
|
+
*
|
|
35
|
+
* Events triggered by strategies:
|
|
36
|
+
*
|
|
37
|
+
* - `on_push_frame`: Indicates the strategy wants to push a frame.
|
|
38
|
+
* - `on_user_turn_inference_triggered`: Signals that enough evidence
|
|
39
|
+
* exists to start LLM inference for the current user turn, carrying a
|
|
40
|
+
* `UserTurnSpeculation` when the turn it answers hasn't ended yet. In
|
|
41
|
+
* most cases this fires together with `on_user_turn_stopped`. Strategies
|
|
42
|
+
* that gate finalization on the LLM (e.g.
|
|
43
|
+
* `LLMTurnCompletionUserTurnStopStrategy`) fire only this event
|
|
44
|
+
* upstream and a separate strategy fires `on_user_turn_stopped` once
|
|
45
|
+
* the LLM confirms the turn is complete.
|
|
46
|
+
* - `on_user_turn_stopped`: Signals that the user turn is semantically
|
|
47
|
+
* final. Observers, transcript appenders, and UI indicators should
|
|
48
|
+
* bind this event.
|
|
49
|
+
*
|
|
50
|
+
* Porting note: the deprecated `enable_user_speaking_frames` constructor
|
|
51
|
+
* argument and the deprecated `reset()` hook are not ported.
|
|
52
|
+
*/
|
|
53
|
+
export class BaseUserTurnStopStrategy extends BaseObject {
|
|
54
|
+
_enableUserSpeakingFrames = true;
|
|
55
|
+
constructor(options = {}) {
|
|
56
|
+
super(options);
|
|
57
|
+
this._registerEventHandler("on_push_frame", true);
|
|
58
|
+
this._registerEventHandler("on_broadcast_frame", true);
|
|
59
|
+
this._registerEventHandler("on_user_turn_inference_triggered", true);
|
|
60
|
+
this._registerEventHandler("on_user_turn_speculation_cancelled", true);
|
|
61
|
+
this._registerEventHandler("on_user_turn_stopped", true);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Whether this strategy resolves proposals into turn stops.
|
|
65
|
+
*
|
|
66
|
+
* A `ProposedUserStoppedSpeakingFrame` is a request for a decision, so a
|
|
67
|
+
* strategy that acts on one consumes it: the frame stops travelling, and no
|
|
68
|
+
* resolver further along decides the same turn a second time. Override to
|
|
69
|
+
* true in a strategy that handles that frame — including one that holds the
|
|
70
|
+
* proposal for a while before deciding.
|
|
71
|
+
*/
|
|
72
|
+
get resolvesProposedTurnStopFrames() {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Set up the strategy.
|
|
77
|
+
*
|
|
78
|
+
* @param setup Configuration object containing setup parameters.
|
|
79
|
+
*/
|
|
80
|
+
async setup(setup) {
|
|
81
|
+
await super.setup(setup.taskManager);
|
|
82
|
+
}
|
|
83
|
+
/** Cleanup the strategy. */
|
|
84
|
+
async cleanup() { }
|
|
85
|
+
/**
|
|
86
|
+
* Notify the strategy that a user turn has started.
|
|
87
|
+
*
|
|
88
|
+
* The controller calls this on every stop strategy when a turn begins.
|
|
89
|
+
* Override to run, for example, logic to arm the strategy to detect the
|
|
90
|
+
* end of the turn now in progress.
|
|
91
|
+
*/
|
|
92
|
+
async handleUserTurnStarted() { }
|
|
93
|
+
/**
|
|
94
|
+
* Notify the strategy that the user turn has stopped.
|
|
95
|
+
*
|
|
96
|
+
* The controller calls this on every stop strategy when a turn ends,
|
|
97
|
+
* regardless of which strategy (or the stop watchdog timeout) ended it.
|
|
98
|
+
* Override to run stop-specific logic — e.g. dropping a turn analyzer's
|
|
99
|
+
* buffered speech that must not survive an externally-ended turn.
|
|
100
|
+
*/
|
|
101
|
+
async handleUserTurnStopped() { }
|
|
102
|
+
/**
|
|
103
|
+
* Process an incoming frame to decide whether the user stopped speaking.
|
|
104
|
+
*
|
|
105
|
+
* Subclasses should override this to implement logic that decides whether
|
|
106
|
+
* the user has stopped speaking.
|
|
107
|
+
*
|
|
108
|
+
* @param frame The frame to be analyzed.
|
|
109
|
+
* @returns A ProcessFrameResult indicating the outcome, or null (treated as
|
|
110
|
+
* CONTINUE for backward compatibility).
|
|
111
|
+
*/
|
|
112
|
+
async processFrame(_frame) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Emit on_push_frame to push a frame using the user aggregator.
|
|
117
|
+
*
|
|
118
|
+
* @param frame The frame to be pushed.
|
|
119
|
+
* @param direction What direction the frame should be pushed to.
|
|
120
|
+
*/
|
|
121
|
+
async pushFrame(frame, direction = FrameDirection.DOWNSTREAM) {
|
|
122
|
+
await this._callEventHandler("on_push_frame", frame, direction);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Emit on_broadcast_frame to broadcast a frame using the user aggregator.
|
|
126
|
+
*
|
|
127
|
+
* @param frameCls The class of the frame to be broadcasted.
|
|
128
|
+
* @param options Options to be passed to the frame's constructor.
|
|
129
|
+
*/
|
|
130
|
+
async broadcastFrame(frameCls, options) {
|
|
131
|
+
await this._callEventHandler("on_broadcast_frame", frameCls, options);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Withdraw the speculation this strategy has in flight.
|
|
135
|
+
*
|
|
136
|
+
* Emitted rather than pushed so the host broadcasts it the same way it
|
|
137
|
+
* broadcasts the turn end. A withdrawal that took the queued path would
|
|
138
|
+
* reach a downstream gate *after* the turn end that follows it, and the
|
|
139
|
+
* gate would release the response the withdrawal was meant to discard.
|
|
140
|
+
*/
|
|
141
|
+
async triggerUserTurnSpeculationCancelled() {
|
|
142
|
+
await this._callEventHandler("on_user_turn_speculation_cancelled");
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Fire both `on_user_turn_inference_triggered` and `on_user_turn_stopped`.
|
|
146
|
+
*
|
|
147
|
+
* Most strategies call this when they decide a turn has ended. To
|
|
148
|
+
* defer finalization to another strategy (so this strategy fires
|
|
149
|
+
* only the inference-triggered event), wrap this strategy with
|
|
150
|
+
* `deferred()` instead of changing the trigger call.
|
|
151
|
+
*/
|
|
152
|
+
async triggerUserTurnStopped(options = {}) {
|
|
153
|
+
await this.triggerUserTurnInferenceTriggered();
|
|
154
|
+
await this.triggerUserTurnFinalized({
|
|
155
|
+
enableUserSpeakingFrames: options.enableUserSpeakingFrames ?? null,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/** Trigger only the `on_user_turn_inference_triggered` event. */
|
|
159
|
+
async triggerUserTurnInferenceTriggered(options = {}) {
|
|
160
|
+
await this._callEventHandler("on_user_turn_inference_triggered", options.speculation ?? null);
|
|
161
|
+
}
|
|
162
|
+
/** Trigger only the `on_user_turn_stopped` event. */
|
|
163
|
+
async triggerUserTurnFinalized(options = {}) {
|
|
164
|
+
await this._callEventHandler("on_user_turn_stopped", new UserTurnStoppedParams({
|
|
165
|
+
enableUserSpeakingFrames: options.enableUserSpeakingFrames ?? this._enableUserSpeakingFrames,
|
|
166
|
+
confirmsSpeculation: options.confirmsSpeculation ?? false,
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=base_user_turn_stop_strategy.js.map
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** Wrapper that defers a stop strategy's finalization to another strategy. */
|
|
2
|
+
import type { Frame } from "../../frames/frames.ts";
|
|
3
|
+
import type { FrameProcessorSetup } from "../../processors/frame_processor.ts";
|
|
4
|
+
import type { EventHandlerFn } from "../../utils/base_object.ts";
|
|
5
|
+
import type { ProcessFrameResult } from "../types.ts";
|
|
6
|
+
import { BaseUserTurnStopStrategy, type BaseUserTurnStopStrategyOptions } from "./base_user_turn_stop_strategy.ts";
|
|
7
|
+
/**
|
|
8
|
+
* Wraps a stop strategy and suppresses its `on_user_turn_stopped` event.
|
|
9
|
+
*
|
|
10
|
+
* Event subscriptions added to the wrapper are forwarded directly to
|
|
11
|
+
* the inner strategy, except for `on_user_turn_stopped`, which is
|
|
12
|
+
* dropped. The inner strategy's frame-side and inference-triggered
|
|
13
|
+
* events therefore reach external listeners (the controller, etc.)
|
|
14
|
+
* unchanged; finalization is left to another strategy in the chain
|
|
15
|
+
* such as `LLMTurnCompletionUserTurnStopStrategy`.
|
|
16
|
+
*
|
|
17
|
+
* Use the `deferred` helper for ergonomic construction:
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* stop: [
|
|
21
|
+
* deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
|
|
22
|
+
* new LLMTurnCompletionUserTurnStopStrategy(),
|
|
23
|
+
* ]
|
|
24
|
+
*/
|
|
25
|
+
export declare class DeferredUserTurnStopStrategy extends BaseUserTurnStopStrategy {
|
|
26
|
+
protected _inner: BaseUserTurnStopStrategy;
|
|
27
|
+
/**
|
|
28
|
+
* @param inner The strategy whose finalization should be deferred.
|
|
29
|
+
* @param options Additional options forwarded to the base class.
|
|
30
|
+
*/
|
|
31
|
+
constructor(inner: BaseUserTurnStopStrategy, options?: BaseUserTurnStopStrategyOptions);
|
|
32
|
+
/** Return the wrapped strategy. */
|
|
33
|
+
get inner(): BaseUserTurnStopStrategy;
|
|
34
|
+
/**
|
|
35
|
+
* Report what the inner strategy does with proposals.
|
|
36
|
+
*
|
|
37
|
+
* Frame processing is forwarded, so a proposal reaches the inner strategy
|
|
38
|
+
* and is resolved there. Deferring finalization changes when the turn ends,
|
|
39
|
+
* not who decides it.
|
|
40
|
+
*/
|
|
41
|
+
get resolvesProposedTurnStopFrames(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Forward event subscriptions to the inner strategy.
|
|
44
|
+
*
|
|
45
|
+
* `on_user_turn_stopped` is silently dropped — that's the whole point of
|
|
46
|
+
* the wrapper. Every other event handler is attached to the inner strategy
|
|
47
|
+
* directly, so the inner's events reach the listener without any per-event
|
|
48
|
+
* proxy method on the wrapper.
|
|
49
|
+
*/
|
|
50
|
+
addEventHandler(eventName: string, handler: EventHandlerFn<this>): void;
|
|
51
|
+
/** Set up the inner strategy. */
|
|
52
|
+
setup(setup: FrameProcessorSetup): Promise<void>;
|
|
53
|
+
/** Clean up the inner strategy. */
|
|
54
|
+
cleanup(): Promise<void>;
|
|
55
|
+
/** Forward the turn-started callback to the inner strategy. */
|
|
56
|
+
handleUserTurnStarted(): Promise<void>;
|
|
57
|
+
/** Forward the turn-stopped callback to the inner strategy. */
|
|
58
|
+
handleUserTurnStopped(): Promise<void>;
|
|
59
|
+
/** Forward frame processing to the inner strategy. */
|
|
60
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult | null>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Defer this stop strategy's finalization to another strategy.
|
|
64
|
+
*
|
|
65
|
+
* Wraps `strategy` in a `DeferredUserTurnStopStrategy`: the inner strategy
|
|
66
|
+
* continues to drive inference-triggered events, but its
|
|
67
|
+
* `on_user_turn_stopped` event is suppressed. Use when another strategy in
|
|
68
|
+
* the chain (e.g. `LLMTurnCompletionUserTurnStopStrategy`) owns finalization.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* stop: [
|
|
72
|
+
* deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
|
|
73
|
+
* new LLMTurnCompletionUserTurnStopStrategy(),
|
|
74
|
+
* ]
|
|
75
|
+
*
|
|
76
|
+
* @param strategy The stop strategy to defer.
|
|
77
|
+
* @returns A wrapper that exposes the inner strategy's behavior with
|
|
78
|
+
* finalization suppressed.
|
|
79
|
+
*/
|
|
80
|
+
export declare function deferred(strategy: BaseUserTurnStopStrategy): DeferredUserTurnStopStrategy;
|
|
81
|
+
//# sourceMappingURL=deferred_user_turn_stop_strategy.d.ts.map
|