@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,107 @@
|
|
|
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/deferred_user_turn_stop_strategy.py
|
|
6
|
+
import { BaseUserTurnStopStrategy, } from "./base_user_turn_stop_strategy.js";
|
|
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 class DeferredUserTurnStopStrategy extends BaseUserTurnStopStrategy {
|
|
26
|
+
_inner;
|
|
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, options = {}) {
|
|
32
|
+
super(options);
|
|
33
|
+
this._inner = inner;
|
|
34
|
+
}
|
|
35
|
+
/** Return the wrapped strategy. */
|
|
36
|
+
get inner() {
|
|
37
|
+
return this._inner;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Report what the inner strategy does with proposals.
|
|
41
|
+
*
|
|
42
|
+
* Frame processing is forwarded, so a proposal reaches the inner strategy
|
|
43
|
+
* and is resolved there. Deferring finalization changes when the turn ends,
|
|
44
|
+
* not who decides it.
|
|
45
|
+
*/
|
|
46
|
+
get resolvesProposedTurnStopFrames() {
|
|
47
|
+
return this._inner.resolvesProposedTurnStopFrames;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Forward event subscriptions to the inner strategy.
|
|
51
|
+
*
|
|
52
|
+
* `on_user_turn_stopped` is silently dropped — that's the whole point of
|
|
53
|
+
* the wrapper. Every other event handler is attached to the inner strategy
|
|
54
|
+
* directly, so the inner's events reach the listener without any per-event
|
|
55
|
+
* proxy method on the wrapper.
|
|
56
|
+
*/
|
|
57
|
+
addEventHandler(eventName, handler) {
|
|
58
|
+
if (eventName === "on_user_turn_stopped") {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this._inner.addEventHandler(eventName, handler);
|
|
62
|
+
}
|
|
63
|
+
/** Set up the inner strategy. */
|
|
64
|
+
async setup(setup) {
|
|
65
|
+
await super.setup(setup);
|
|
66
|
+
await this._inner.setup(setup);
|
|
67
|
+
}
|
|
68
|
+
/** Clean up the inner strategy. */
|
|
69
|
+
async cleanup() {
|
|
70
|
+
await super.cleanup();
|
|
71
|
+
await this._inner.cleanup();
|
|
72
|
+
}
|
|
73
|
+
/** Forward the turn-started callback to the inner strategy. */
|
|
74
|
+
async handleUserTurnStarted() {
|
|
75
|
+
await this._inner.handleUserTurnStarted();
|
|
76
|
+
}
|
|
77
|
+
/** Forward the turn-stopped callback to the inner strategy. */
|
|
78
|
+
async handleUserTurnStopped() {
|
|
79
|
+
await this._inner.handleUserTurnStopped();
|
|
80
|
+
}
|
|
81
|
+
/** Forward frame processing to the inner strategy. */
|
|
82
|
+
async processFrame(frame) {
|
|
83
|
+
return await this._inner.processFrame(frame);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Defer this stop strategy's finalization to another strategy.
|
|
88
|
+
*
|
|
89
|
+
* Wraps `strategy` in a `DeferredUserTurnStopStrategy`: the inner strategy
|
|
90
|
+
* continues to drive inference-triggered events, but its
|
|
91
|
+
* `on_user_turn_stopped` event is suppressed. Use when another strategy in
|
|
92
|
+
* the chain (e.g. `LLMTurnCompletionUserTurnStopStrategy`) owns finalization.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* stop: [
|
|
96
|
+
* deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
|
|
97
|
+
* new LLMTurnCompletionUserTurnStopStrategy(),
|
|
98
|
+
* ]
|
|
99
|
+
*
|
|
100
|
+
* @param strategy The stop strategy to defer.
|
|
101
|
+
* @returns A wrapper that exposes the inner strategy's behavior with
|
|
102
|
+
* finalization suppressed.
|
|
103
|
+
*/
|
|
104
|
+
export function deferred(strategy) {
|
|
105
|
+
return new DeferredUserTurnStopStrategy(strategy);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=deferred_user_turn_stop_strategy.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decides whether a speculative response is still the right answer.
|
|
3
|
+
*
|
|
4
|
+
* A speculative response is generated from an eager transcript, before the
|
|
5
|
+
* service commits one. This decides whether the committed transcript is close
|
|
6
|
+
* enough to the eager one for that response to stand.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class EagerMatchPolicy {
|
|
9
|
+
/**
|
|
10
|
+
* Report whether the committed transcript still matches the eager one.
|
|
11
|
+
*
|
|
12
|
+
* @param eager The transcript the speculative response was generated from.
|
|
13
|
+
* @param final The transcript the service committed to.
|
|
14
|
+
* @returns True to keep the speculative response, false to discard it and
|
|
15
|
+
* answer the committed transcript instead.
|
|
16
|
+
*/
|
|
17
|
+
abstract matches(eager: string, final: string): boolean;
|
|
18
|
+
}
|
|
19
|
+
/** Keep the response only when the two transcripts are identical. */
|
|
20
|
+
export declare class ExactMatch extends EagerMatchPolicy {
|
|
21
|
+
/** Report whether the two transcripts are identical. */
|
|
22
|
+
matches(eager: string, final: string): boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Keep the response when the transcripts differ only in formatting.
|
|
26
|
+
*
|
|
27
|
+
* Compares with case, punctuation and whitespace removed. Services commonly
|
|
28
|
+
* format the committed transcript — capitalizing it, punctuating it — while
|
|
29
|
+
* leaving the eager one raw, which `ExactMatch` counts as a difference.
|
|
30
|
+
*/
|
|
31
|
+
export declare class NormalizedMatch extends EagerMatchPolicy {
|
|
32
|
+
/** Report whether the two transcripts match once formatting is removed. */
|
|
33
|
+
matches(eager: string, final: string): boolean;
|
|
34
|
+
protected static _normalize(text: string): string;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=eager_match_policy.d.ts.map
|
|
@@ -0,0 +1,50 @@
|
|
|
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/eager_match_policy.py
|
|
6
|
+
/** Policies deciding whether an eager transcript still matches the committed one. */
|
|
7
|
+
// Apostrophes are dropped rather than spaced out, so a service that writes
|
|
8
|
+
// "it's" matches one that writes "its".
|
|
9
|
+
const APOSTROPHES = /['’ʼ]/gu;
|
|
10
|
+
// Python's `[^\w\s]` with re.UNICODE.
|
|
11
|
+
const PUNCTUATION = /[^\p{L}\p{N}\p{M}_\s]/gu;
|
|
12
|
+
const WHITESPACE = /\s+/gu;
|
|
13
|
+
/**
|
|
14
|
+
* Decides whether a speculative response is still the right answer.
|
|
15
|
+
*
|
|
16
|
+
* A speculative response is generated from an eager transcript, before the
|
|
17
|
+
* service commits one. This decides whether the committed transcript is close
|
|
18
|
+
* enough to the eager one for that response to stand.
|
|
19
|
+
*/
|
|
20
|
+
export class EagerMatchPolicy {
|
|
21
|
+
}
|
|
22
|
+
/** Keep the response only when the two transcripts are identical. */
|
|
23
|
+
export class ExactMatch extends EagerMatchPolicy {
|
|
24
|
+
/** Report whether the two transcripts are identical. */
|
|
25
|
+
matches(eager, final) {
|
|
26
|
+
return eager === final;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Keep the response when the transcripts differ only in formatting.
|
|
31
|
+
*
|
|
32
|
+
* Compares with case, punctuation and whitespace removed. Services commonly
|
|
33
|
+
* format the committed transcript — capitalizing it, punctuating it — while
|
|
34
|
+
* leaving the eager one raw, which `ExactMatch` counts as a difference.
|
|
35
|
+
*/
|
|
36
|
+
export class NormalizedMatch extends EagerMatchPolicy {
|
|
37
|
+
/** Report whether the two transcripts match once formatting is removed. */
|
|
38
|
+
matches(eager, final) {
|
|
39
|
+
return NormalizedMatch._normalize(eager) === NormalizedMatch._normalize(final);
|
|
40
|
+
}
|
|
41
|
+
static _normalize(text) {
|
|
42
|
+
// NFKC + full case folding (Python's casefold); toLowerCase after an
|
|
43
|
+
// uppercase pass approximates folding for the common special cases (ß).
|
|
44
|
+
let normalized = text.normalize("NFKC").toUpperCase().toLowerCase();
|
|
45
|
+
normalized = normalized.replace(APOSTROPHES, "");
|
|
46
|
+
normalized = normalized.replace(PUNCTUATION, " ");
|
|
47
|
+
return normalized.replace(WHITESPACE, " ").trim();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=eager_match_policy.js.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/** User turn stop strategy that answers an eager end of turn speculatively. */
|
|
2
|
+
import { type Task } from "@pipedog/asyncio";
|
|
3
|
+
import { EagerTranscriptionFrame, type Frame } from "../../frames/frames.ts";
|
|
4
|
+
import { type ProcessFrameResult, UserTurnSpeculation } from "../types.ts";
|
|
5
|
+
import type { TriggerUserTurnStoppedOptions } from "./base_user_turn_stop_strategy.ts";
|
|
6
|
+
import { type EagerMatchPolicy } from "./eager_match_policy.ts";
|
|
7
|
+
import { ExternalUserTurnStopStrategy, type ExternalUserTurnStopStrategyOptions } from "./external_user_turn_stop_strategy.ts";
|
|
8
|
+
export interface EagerUserTurnStopStrategyOptions extends ExternalUserTurnStopStrategyOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Decides whether the committed transcript is close enough to the eager one
|
|
11
|
+
* to keep the speculative response. Defaults to `NormalizedMatch`, which
|
|
12
|
+
* ignores the capitalization and punctuation services commonly add when
|
|
13
|
+
* they commit a transcript. Pass `ExactMatch` to require the two to be
|
|
14
|
+
* identical.
|
|
15
|
+
*/
|
|
16
|
+
matchPolicy?: EagerMatchPolicy | null;
|
|
17
|
+
/**
|
|
18
|
+
* Seconds a prediction may go unresolved before it is withdrawn. A service
|
|
19
|
+
* that stops sending turn signals mid-speculation would otherwise leave the
|
|
20
|
+
* response held and the bot silent for the rest of the session.
|
|
21
|
+
*/
|
|
22
|
+
speculationTimeout?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Answers an eager end of turn while the turn is still open.
|
|
26
|
+
*
|
|
27
|
+
* Some STT services predict the end of a turn before committing to it, and
|
|
28
|
+
* withdraw the prediction if the user turns out to be mid-sentence. This
|
|
29
|
+
* strategy starts generating a response on that prediction, so the gap between
|
|
30
|
+
* it and the committed end of turn is spent generating rather than waiting.
|
|
31
|
+
*
|
|
32
|
+
* The prediction can be wrong in three ways, and each withdraws the response:
|
|
33
|
+
*
|
|
34
|
+
* - the user resumes speaking, and the service withdraws the eager end of turn
|
|
35
|
+
* - the committed transcript differs from the eager one, per `matchPolicy`
|
|
36
|
+
* - the turn never commits within `speculationTimeout`
|
|
37
|
+
*
|
|
38
|
+
* Every one of those leaves as an `EagerEndOfTurnCancelFrame` from here, so a
|
|
39
|
+
* response is never dropped somewhere the rest of the pipeline cannot see.
|
|
40
|
+
*
|
|
41
|
+
* Nothing the speculation produces reaches the user or the context. The
|
|
42
|
+
* inference runs against a provisional context, and its response is held by
|
|
43
|
+
* the LLM service's `SpeculationGate` until the turn is confirmed. The turn
|
|
44
|
+
* ends normally: the user message written to the context is always the
|
|
45
|
+
* committed transcript, never the eager one.
|
|
46
|
+
*
|
|
47
|
+
* Install it with `EagerUserTurnStrategies` rather than directly — the
|
|
48
|
+
* service owns turn detection here, so it replaces the detector chain instead
|
|
49
|
+
* of running alongside it.
|
|
50
|
+
*/
|
|
51
|
+
export declare class EagerUserTurnStopStrategy extends ExternalUserTurnStopStrategy {
|
|
52
|
+
protected _matchPolicy: EagerMatchPolicy;
|
|
53
|
+
protected _speculationTimeout: number;
|
|
54
|
+
protected _speculationTimeoutTask: Task<unknown> | null;
|
|
55
|
+
protected _speculation: UserTurnSpeculation | null;
|
|
56
|
+
constructor(options?: EagerUserTurnStopStrategyOptions);
|
|
57
|
+
/** The policy deciding whether a speculative response still applies. */
|
|
58
|
+
get matchPolicy(): EagerMatchPolicy;
|
|
59
|
+
/**
|
|
60
|
+
* Start a speculation on an eager end of turn, or withdraw one.
|
|
61
|
+
*
|
|
62
|
+
* @param frame The frame to be analyzed.
|
|
63
|
+
* @returns Always CONTINUE, so subsequent stop strategies are evaluated.
|
|
64
|
+
*/
|
|
65
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
66
|
+
/** End the turn, keeping the speculative response only if it still applies. */
|
|
67
|
+
triggerUserTurnStopped(options?: TriggerUserTurnStoppedOptions): Promise<void>;
|
|
68
|
+
/** Clear per-turn state. Runs at both turn boundaries. */
|
|
69
|
+
protected _reset(): Promise<void>;
|
|
70
|
+
/** Answer an eager end of turn, leaving the turn open. */
|
|
71
|
+
protected _speculate(frame: EagerTranscriptionFrame): Promise<void>;
|
|
72
|
+
/** Withdraw a prediction the turn never resolved. */
|
|
73
|
+
protected _speculationTimeoutHandler(speculation: UserTurnSpeculation): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Take the speculation in flight, stopping the clock on it.
|
|
76
|
+
*
|
|
77
|
+
* The single exit, so a resolved speculation can never be withdrawn again
|
|
78
|
+
* by a timer still running for it.
|
|
79
|
+
*/
|
|
80
|
+
protected _takeSpeculation(): Promise<UserTurnSpeculation | null>;
|
|
81
|
+
/** Drop a speculation the service withdrew. */
|
|
82
|
+
protected _forget(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=eager_user_turn_stop_strategy.d.ts.map
|
|
@@ -0,0 +1,154 @@
|
|
|
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/eager_user_turn_stop_strategy.py
|
|
6
|
+
/** User turn stop strategy that answers an eager end of turn speculatively. */
|
|
7
|
+
import { sleep } from "@pipedog/asyncio";
|
|
8
|
+
import { EagerEndOfTurnCancelFrame, EagerTranscriptionFrame, } from "../../frames/frames.js";
|
|
9
|
+
import { logger } from "../../utils/logger.js";
|
|
10
|
+
import { UserTurnSpeculation } from "../types.js";
|
|
11
|
+
import { NormalizedMatch } from "./eager_match_policy.js";
|
|
12
|
+
import { ExternalUserTurnStopStrategy, } from "./external_user_turn_stop_strategy.js";
|
|
13
|
+
/**
|
|
14
|
+
* Answers an eager end of turn while the turn is still open.
|
|
15
|
+
*
|
|
16
|
+
* Some STT services predict the end of a turn before committing to it, and
|
|
17
|
+
* withdraw the prediction if the user turns out to be mid-sentence. This
|
|
18
|
+
* strategy starts generating a response on that prediction, so the gap between
|
|
19
|
+
* it and the committed end of turn is spent generating rather than waiting.
|
|
20
|
+
*
|
|
21
|
+
* The prediction can be wrong in three ways, and each withdraws the response:
|
|
22
|
+
*
|
|
23
|
+
* - the user resumes speaking, and the service withdraws the eager end of turn
|
|
24
|
+
* - the committed transcript differs from the eager one, per `matchPolicy`
|
|
25
|
+
* - the turn never commits within `speculationTimeout`
|
|
26
|
+
*
|
|
27
|
+
* Every one of those leaves as an `EagerEndOfTurnCancelFrame` from here, so a
|
|
28
|
+
* response is never dropped somewhere the rest of the pipeline cannot see.
|
|
29
|
+
*
|
|
30
|
+
* Nothing the speculation produces reaches the user or the context. The
|
|
31
|
+
* inference runs against a provisional context, and its response is held by
|
|
32
|
+
* the LLM service's `SpeculationGate` until the turn is confirmed. The turn
|
|
33
|
+
* ends normally: the user message written to the context is always the
|
|
34
|
+
* committed transcript, never the eager one.
|
|
35
|
+
*
|
|
36
|
+
* Install it with `EagerUserTurnStrategies` rather than directly — the
|
|
37
|
+
* service owns turn detection here, so it replaces the detector chain instead
|
|
38
|
+
* of running alongside it.
|
|
39
|
+
*/
|
|
40
|
+
export class EagerUserTurnStopStrategy extends ExternalUserTurnStopStrategy {
|
|
41
|
+
_matchPolicy;
|
|
42
|
+
_speculationTimeout;
|
|
43
|
+
_speculationTimeoutTask = null;
|
|
44
|
+
_speculation = null;
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
super(options);
|
|
47
|
+
this._matchPolicy = options.matchPolicy ?? new NormalizedMatch();
|
|
48
|
+
this._speculationTimeout = options.speculationTimeout ?? 5.0;
|
|
49
|
+
}
|
|
50
|
+
/** The policy deciding whether a speculative response still applies. */
|
|
51
|
+
get matchPolicy() {
|
|
52
|
+
return this._matchPolicy;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Start a speculation on an eager end of turn, or withdraw one.
|
|
56
|
+
*
|
|
57
|
+
* @param frame The frame to be analyzed.
|
|
58
|
+
* @returns Always CONTINUE, so subsequent stop strategies are evaluated.
|
|
59
|
+
*/
|
|
60
|
+
async processFrame(frame) {
|
|
61
|
+
if (frame instanceof EagerTranscriptionFrame) {
|
|
62
|
+
await this._speculate(frame);
|
|
63
|
+
}
|
|
64
|
+
else if (frame instanceof EagerEndOfTurnCancelFrame) {
|
|
65
|
+
// The service withdrew its prediction, and its frame reaches every
|
|
66
|
+
// consumer on its own. Only our own state is left to clear.
|
|
67
|
+
await this._forget();
|
|
68
|
+
}
|
|
69
|
+
return await super.processFrame(frame);
|
|
70
|
+
}
|
|
71
|
+
/** End the turn, keeping the speculative response only if it still applies. */
|
|
72
|
+
async triggerUserTurnStopped(options = {}) {
|
|
73
|
+
const enableUserSpeakingFrames = options.enableUserSpeakingFrames ?? null;
|
|
74
|
+
const speculation = await this._takeSpeculation();
|
|
75
|
+
if (!speculation) {
|
|
76
|
+
await super.triggerUserTurnStopped({ enableUserSpeakingFrames });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (this._matchPolicy.matches(speculation.text, this._text)) {
|
|
80
|
+
logger.debug(`${this}: eager end of turn held, keeping the speculative response`);
|
|
81
|
+
// Inference already ran, on the eager transcript. Only finalize:
|
|
82
|
+
// the UserStoppedSpeakingFrame it emits is what releases the
|
|
83
|
+
// response, and the flag stops a second inference answering the
|
|
84
|
+
// same turn.
|
|
85
|
+
await this.triggerUserTurnFinalized({
|
|
86
|
+
enableUserSpeakingFrames,
|
|
87
|
+
confirmsSpeculation: true,
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
logger.debug(`${this}: eager end of turn missed, discarding the speculative response ` +
|
|
92
|
+
`(eager: [${speculation.text}], committed: [${this._text}])`);
|
|
93
|
+
await this.triggerUserTurnSpeculationCancelled();
|
|
94
|
+
// Inference has to run again, on the committed transcript, so fire both
|
|
95
|
+
// events rather than just finalizing.
|
|
96
|
+
await super.triggerUserTurnStopped({ enableUserSpeakingFrames });
|
|
97
|
+
}
|
|
98
|
+
/** Clear per-turn state. Runs at both turn boundaries. */
|
|
99
|
+
async _reset() {
|
|
100
|
+
const speculation = await this._takeSpeculation();
|
|
101
|
+
await super._reset();
|
|
102
|
+
if (speculation) {
|
|
103
|
+
// The turn ended without resolving the speculation — the stop
|
|
104
|
+
// watchdog, an interruption, session end. Nothing else will withdraw
|
|
105
|
+
// it, so the response would be held until the gate times out.
|
|
106
|
+
logger.debug(`${this}: turn ended unresolved, discarding the speculative response`);
|
|
107
|
+
await this.triggerUserTurnSpeculationCancelled();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Answer an eager end of turn, leaving the turn open. */
|
|
111
|
+
async _speculate(frame) {
|
|
112
|
+
// Segments committed earlier in this turn are part of what the LLM will
|
|
113
|
+
// see, so they're part of what the committed transcript is compared to.
|
|
114
|
+
const speculation = new UserTurnSpeculation({ text: this._text + frame.text });
|
|
115
|
+
this._speculation = speculation;
|
|
116
|
+
this._speculationTimeoutTask = this.taskManager.createTask(() => this._speculationTimeoutHandler(speculation), `${this}::_speculation_timeout_handler`);
|
|
117
|
+
logger.debug(`${this}: speculating on eager end of turn: [${speculation.text}]`);
|
|
118
|
+
await this.triggerUserTurnInferenceTriggered({ speculation });
|
|
119
|
+
}
|
|
120
|
+
/** Withdraw a prediction the turn never resolved. */
|
|
121
|
+
async _speculationTimeoutHandler(speculation) {
|
|
122
|
+
await sleep(this._speculationTimeout);
|
|
123
|
+
// Cleared here rather than by a cancellation, since this timer fired.
|
|
124
|
+
this._speculationTimeoutTask = null;
|
|
125
|
+
if (this._speculation !== speculation) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
logger.debug(`${this}: eager end of turn unresolved after ${this._speculationTimeout}s, ` +
|
|
129
|
+
"discarding the speculative response");
|
|
130
|
+
this._speculation = null;
|
|
131
|
+
await this.triggerUserTurnSpeculationCancelled();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Take the speculation in flight, stopping the clock on it.
|
|
135
|
+
*
|
|
136
|
+
* The single exit, so a resolved speculation can never be withdrawn again
|
|
137
|
+
* by a timer still running for it.
|
|
138
|
+
*/
|
|
139
|
+
async _takeSpeculation() {
|
|
140
|
+
const speculation = this._speculation;
|
|
141
|
+
this._speculation = null;
|
|
142
|
+
if (this._speculationTimeoutTask) {
|
|
143
|
+
const task = this._speculationTimeoutTask;
|
|
144
|
+
this._speculationTimeoutTask = null;
|
|
145
|
+
await this.cancelTask(task);
|
|
146
|
+
}
|
|
147
|
+
return speculation;
|
|
148
|
+
}
|
|
149
|
+
/** Drop a speculation the service withdrew. */
|
|
150
|
+
async _forget() {
|
|
151
|
+
await this._takeSpeculation();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=eager_user_turn_stop_strategy.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** User turn stop strategy that finalizes on `UserTurnInferenceCompletedFrame`. */
|
|
2
|
+
import { type Frame } from "../../frames/frames.ts";
|
|
3
|
+
import { ProcessFrameResult } from "../types.ts";
|
|
4
|
+
import { BaseUserTurnStopStrategy } from "./base_user_turn_stop_strategy.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Finalize the user turn whenever a `UserTurnInferenceCompletedFrame` arrives.
|
|
7
|
+
*
|
|
8
|
+
* Generic stop strategy for pipelines where some external component
|
|
9
|
+
* (LLM with completion markers, STT with built-in turn detection, a
|
|
10
|
+
* dedicated end-of-turn classifier, custom user code, etc.) judges
|
|
11
|
+
* when a turn is semantically complete and emits
|
|
12
|
+
* `UserTurnInferenceCompletedFrame`.
|
|
13
|
+
*
|
|
14
|
+
* Pair this with one or more `deferred(...)`-wrapped detector
|
|
15
|
+
* strategies that drive `on_user_turn_inference_triggered` but
|
|
16
|
+
* leave finalization to this strategy:
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* stop: [
|
|
20
|
+
* deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
|
|
21
|
+
* new ExternalUserTurnCompletionStopStrategy(),
|
|
22
|
+
* ]
|
|
23
|
+
*
|
|
24
|
+
* For LLM-completion-marker gating specifically, use the subclass
|
|
25
|
+
* `LLMTurnCompletionUserTurnStopStrategy` instead, which additionally pushes
|
|
26
|
+
* the `LLMUpdateSettingsFrame` that enables the marker protocol on the LLM.
|
|
27
|
+
*
|
|
28
|
+
* A completion resolves with some latency (e.g. the LLM `●` arrives
|
|
29
|
+
* after the inference finishes), so the user may have resumed speaking
|
|
30
|
+
* in the meantime. The controller drops a finalization that arrives
|
|
31
|
+
* while the user is speaking, so a stale completion does not end the
|
|
32
|
+
* turn (and talk over the user); the turn stays open for the next
|
|
33
|
+
* inference to re-evaluate. That check lives in the controller, which
|
|
34
|
+
* holds the authoritative user-speaking state.
|
|
35
|
+
*
|
|
36
|
+
* If the producer never emits `UserTurnInferenceCompletedFrame`, the
|
|
37
|
+
* controller's `userTurnStopTimeout` watchdog finalizes the turn after no
|
|
38
|
+
* activity. Tune that timeout if your producer can take longer than the
|
|
39
|
+
* default to respond.
|
|
40
|
+
*/
|
|
41
|
+
export declare class ExternalUserTurnCompletionStopStrategy extends BaseUserTurnStopStrategy {
|
|
42
|
+
/** Fire `on_user_turn_stopped` whenever `UserTurnInferenceCompletedFrame` is seen. */
|
|
43
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=external_user_turn_completion_stop_strategy.d.ts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
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/external_user_turn_completion_stop_strategy.py
|
|
6
|
+
/** User turn stop strategy that finalizes on `UserTurnInferenceCompletedFrame`. */
|
|
7
|
+
import { UserTurnInferenceCompletedFrame } from "../../frames/frames.js";
|
|
8
|
+
import { ProcessFrameResult } from "../types.js";
|
|
9
|
+
import { BaseUserTurnStopStrategy } from "./base_user_turn_stop_strategy.js";
|
|
10
|
+
/**
|
|
11
|
+
* Finalize the user turn whenever a `UserTurnInferenceCompletedFrame` arrives.
|
|
12
|
+
*
|
|
13
|
+
* Generic stop strategy for pipelines where some external component
|
|
14
|
+
* (LLM with completion markers, STT with built-in turn detection, a
|
|
15
|
+
* dedicated end-of-turn classifier, custom user code, etc.) judges
|
|
16
|
+
* when a turn is semantically complete and emits
|
|
17
|
+
* `UserTurnInferenceCompletedFrame`.
|
|
18
|
+
*
|
|
19
|
+
* Pair this with one or more `deferred(...)`-wrapped detector
|
|
20
|
+
* strategies that drive `on_user_turn_inference_triggered` but
|
|
21
|
+
* leave finalization to this strategy:
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* stop: [
|
|
25
|
+
* deferred(new TurnAnalyzerUserTurnStopStrategy({ turnAnalyzer })),
|
|
26
|
+
* new ExternalUserTurnCompletionStopStrategy(),
|
|
27
|
+
* ]
|
|
28
|
+
*
|
|
29
|
+
* For LLM-completion-marker gating specifically, use the subclass
|
|
30
|
+
* `LLMTurnCompletionUserTurnStopStrategy` instead, which additionally pushes
|
|
31
|
+
* the `LLMUpdateSettingsFrame` that enables the marker protocol on the LLM.
|
|
32
|
+
*
|
|
33
|
+
* A completion resolves with some latency (e.g. the LLM `●` arrives
|
|
34
|
+
* after the inference finishes), so the user may have resumed speaking
|
|
35
|
+
* in the meantime. The controller drops a finalization that arrives
|
|
36
|
+
* while the user is speaking, so a stale completion does not end the
|
|
37
|
+
* turn (and talk over the user); the turn stays open for the next
|
|
38
|
+
* inference to re-evaluate. That check lives in the controller, which
|
|
39
|
+
* holds the authoritative user-speaking state.
|
|
40
|
+
*
|
|
41
|
+
* If the producer never emits `UserTurnInferenceCompletedFrame`, the
|
|
42
|
+
* controller's `userTurnStopTimeout` watchdog finalizes the turn after no
|
|
43
|
+
* activity. Tune that timeout if your producer can take longer than the
|
|
44
|
+
* default to respond.
|
|
45
|
+
*/
|
|
46
|
+
export class ExternalUserTurnCompletionStopStrategy extends BaseUserTurnStopStrategy {
|
|
47
|
+
/** Fire `on_user_turn_stopped` whenever `UserTurnInferenceCompletedFrame` is seen. */
|
|
48
|
+
async processFrame(frame) {
|
|
49
|
+
if (frame instanceof UserTurnInferenceCompletedFrame) {
|
|
50
|
+
await this.triggerUserTurnFinalized();
|
|
51
|
+
}
|
|
52
|
+
return ProcessFrameResult.CONTINUE;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=external_user_turn_completion_stop_strategy.js.map
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/** User turn stop strategy driven by another component in the pipeline. */
|
|
2
|
+
import { Event, type Task } from "@pipedog/asyncio";
|
|
3
|
+
import { type Frame, InterimTranscriptionFrame, TranscriptionFrame } from "../../frames/frames.ts";
|
|
4
|
+
import type { FrameProcessorSetup } from "../../processors/frame_processor.ts";
|
|
5
|
+
import { ProcessFrameResult } from "../types.ts";
|
|
6
|
+
import { BaseUserTurnStopStrategy, type BaseUserTurnStopStrategyOptions } from "./base_user_turn_stop_strategy.ts";
|
|
7
|
+
export interface ExternalUserTurnStopStrategyOptions extends BaseUserTurnStopStrategyOptions {
|
|
8
|
+
/**
|
|
9
|
+
* A short delay (seconds) used internally to handle consecutive or slightly
|
|
10
|
+
* delayed transcriptions.
|
|
11
|
+
*/
|
|
12
|
+
timeout?: number;
|
|
13
|
+
/**
|
|
14
|
+
* When true (default), turn-stop signaling waits for transcript text to
|
|
15
|
+
* arrive after the external stop signal. When false, the strategy signals
|
|
16
|
+
* turn-stop as soon as that signal arrives — independent of transcripts.
|
|
17
|
+
* Set this to false when local turn detection is the intended driver of the
|
|
18
|
+
* conversation (e.g. with a realtime LLM service consuming audio directly),
|
|
19
|
+
* so transcripts are off the latency critical path.
|
|
20
|
+
* `LLMContextAggregatorPair` flips this for you when
|
|
21
|
+
* `realtimeServiceMode: true`.
|
|
22
|
+
*/
|
|
23
|
+
waitForTranscript?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* User turn stop strategy driven by another component in the pipeline.
|
|
27
|
+
*
|
|
28
|
+
* The end-of-turn counterpart to `ExternalUserTurnStartStrategy`, taking the
|
|
29
|
+
* same two signals:
|
|
30
|
+
*
|
|
31
|
+
* - `ProposedUserStoppedSpeakingFrame` — a service proposing that the turn has
|
|
32
|
+
* ended. This strategy decides, and emits the `UserStoppedSpeakingFrame`
|
|
33
|
+
* itself. It may also hold the turn open past the proposal, which is what
|
|
34
|
+
* `waitForTranscript` does.
|
|
35
|
+
*
|
|
36
|
+
* - `UserStoppedSpeakingFrame` — the turn end was already decided and
|
|
37
|
+
* announced elsewhere, typically by a shared `UserTurnProcessor`. This
|
|
38
|
+
* strategy adopts that decision and emits nothing.
|
|
39
|
+
*
|
|
40
|
+
* To shift the timing further, subclass this strategy and override
|
|
41
|
+
* `BaseUserTurnStopStrategy.triggerUserTurnStopped`, which both paths reach
|
|
42
|
+
* once they decide the turn is over. Its `enableUserSpeakingFrames` option
|
|
43
|
+
* already carries whichever path got there, so pass it through when the
|
|
44
|
+
* override eventually finalizes.
|
|
45
|
+
*/
|
|
46
|
+
export declare class ExternalUserTurnStopStrategy extends BaseUserTurnStopStrategy {
|
|
47
|
+
protected _timeout: number;
|
|
48
|
+
protected _waitForTranscript: boolean;
|
|
49
|
+
protected _text: string;
|
|
50
|
+
protected _userSpeaking: boolean;
|
|
51
|
+
protected _seenInterimResults: boolean;
|
|
52
|
+
protected _turnAnnouncedElsewhere: boolean;
|
|
53
|
+
protected _turnOpen: boolean;
|
|
54
|
+
protected _event: Event;
|
|
55
|
+
protected _task: Task<unknown> | null;
|
|
56
|
+
constructor(options?: ExternalUserTurnStopStrategyOptions);
|
|
57
|
+
/** Whether this strategy resolves proposals into turn stops. */
|
|
58
|
+
get resolvesProposedTurnStopFrames(): boolean;
|
|
59
|
+
/** Whether turn-stop signaling waits for transcript text. */
|
|
60
|
+
get waitForTranscript(): boolean;
|
|
61
|
+
set waitForTranscript(value: boolean);
|
|
62
|
+
/** Ready the strategy to detect the end of the turn now starting. */
|
|
63
|
+
handleUserTurnStarted(): Promise<void>;
|
|
64
|
+
/** Clear per-turn state once the turn has ended. */
|
|
65
|
+
handleUserTurnStopped(): Promise<void>;
|
|
66
|
+
/** Clear per-turn state. Runs at both turn boundaries. */
|
|
67
|
+
protected _reset(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Set up the strategy.
|
|
70
|
+
*
|
|
71
|
+
* @param setup Configuration object containing setup parameters.
|
|
72
|
+
*/
|
|
73
|
+
setup(setup: FrameProcessorSetup): Promise<void>;
|
|
74
|
+
/** Cleanup the strategy. */
|
|
75
|
+
cleanup(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Process an incoming frame to update strategy state.
|
|
78
|
+
*
|
|
79
|
+
* Updates internal transcription text and speaking state. The user end
|
|
80
|
+
* turn will be triggered when appropriate based on the collected frames.
|
|
81
|
+
*
|
|
82
|
+
* @param frame The frame to be analyzed.
|
|
83
|
+
* @returns Always returns CONTINUE so subsequent stop strategies are evaluated.
|
|
84
|
+
*/
|
|
85
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
86
|
+
/** Handle the external signal that the user is speaking. */
|
|
87
|
+
protected _handleUserStartedSpeaking(options: {
|
|
88
|
+
announcedElsewhere: boolean;
|
|
89
|
+
}): Promise<void>;
|
|
90
|
+
/** Handle the external signal that the user has stopped speaking. */
|
|
91
|
+
protected _handleUserStoppedSpeaking(options: {
|
|
92
|
+
announcedElsewhere: boolean;
|
|
93
|
+
}): Promise<void>;
|
|
94
|
+
protected _handleInterimTranscription(_frame: InterimTranscriptionFrame): Promise<void>;
|
|
95
|
+
/** Handle user transcription. */
|
|
96
|
+
protected _handleTranscription(frame: TranscriptionFrame): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Asynchronously monitor transcriptions and trigger user end turn when ready.
|
|
99
|
+
*
|
|
100
|
+
* If transcription text exists and the user is not currently speaking,
|
|
101
|
+
* triggers the user end turn. Handles multiple or delayed transcriptions
|
|
102
|
+
* gracefully.
|
|
103
|
+
*/
|
|
104
|
+
protected _taskHandler(): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* End the turn, emitting the turn frame unless it was already announced.
|
|
107
|
+
*
|
|
108
|
+
* Reads the flag rather than taking it as an argument: finalization can
|
|
109
|
+
* land here from the transcript timeout above, long after the signal that
|
|
110
|
+
* set it.
|
|
111
|
+
*/
|
|
112
|
+
protected _triggerUserTurnStopped(): Promise<void>;
|
|
113
|
+
protected _maybeTriggerUserTurnStopped(): Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=external_user_turn_stop_strategy.d.ts.map
|