@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,55 @@
|
|
|
1
|
+
/** Configuration for recovering from user turns that end without a transcript. */
|
|
2
|
+
export declare const DEFAULT_EMPTY_USER_TURN_INTERRUPTED_PROMPT: string;
|
|
3
|
+
export interface EmptyUserTurnConfigOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Developer message for an empty turn that interrupted the bot. `null`
|
|
6
|
+
* leaves such turns unanswered.
|
|
7
|
+
*/
|
|
8
|
+
interruptedPrompt?: string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Developer message for an empty turn while the bot was idle. `null` (the
|
|
11
|
+
* default) leaves such turns unanswered.
|
|
12
|
+
*/
|
|
13
|
+
idlePrompt?: string | null;
|
|
14
|
+
/**
|
|
15
|
+
* How many empty turns in a row are answered. Further ones are left
|
|
16
|
+
* unanswered until the user says something that is transcribed.
|
|
17
|
+
*/
|
|
18
|
+
maxConsecutiveRecoveries?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* How the user aggregator responds to a user turn with no transcript.
|
|
22
|
+
*
|
|
23
|
+
* A user turn can start on voice activity alone and then end with no
|
|
24
|
+
* transcript: a cough, background noise, or speech the STT could not
|
|
25
|
+
* recognize. Nothing is written to the context and the LLM does not run.
|
|
26
|
+
* With this config, the aggregator can append a developer message for such
|
|
27
|
+
* a turn and run the LLM once.
|
|
28
|
+
*
|
|
29
|
+
* Either case may be noise. They differ in what happens if the turn goes
|
|
30
|
+
* unanswered, so each has its own prompt:
|
|
31
|
+
*
|
|
32
|
+
* - Interrupted: the turn started while the bot was thinking, speaking or
|
|
33
|
+
* running a function call, and cut it off. Unanswered, the bot stays
|
|
34
|
+
* silent mid-response, so by default the LLM runs and the bot asks the
|
|
35
|
+
* user to repeat or picks up where it left off. A turn before the bot has
|
|
36
|
+
* first finished speaking counts as interrupted too.
|
|
37
|
+
* - Idle: the bot had finished and was waiting for the user. The
|
|
38
|
+
* conversation isn't stuck, and answering what may be noise would be
|
|
39
|
+
* intrusive, so by default the turn gets no answer.
|
|
40
|
+
*
|
|
41
|
+
* - `interruptedPrompt`: Developer message for an empty turn that interrupted
|
|
42
|
+
* the bot. `null` leaves such turns unanswered.
|
|
43
|
+
* - `idlePrompt`: Developer message for an empty turn while the bot was idle.
|
|
44
|
+
* `null` (the default) leaves such turns unanswered.
|
|
45
|
+
* - `maxConsecutiveRecoveries`: How many empty turns in a row are answered.
|
|
46
|
+
* Further ones are left unanswered until the user says something that is
|
|
47
|
+
* transcribed.
|
|
48
|
+
*/
|
|
49
|
+
export declare class EmptyUserTurnConfig {
|
|
50
|
+
interruptedPrompt: string | null;
|
|
51
|
+
idlePrompt: string | null;
|
|
52
|
+
maxConsecutiveRecoveries: number;
|
|
53
|
+
constructor(options?: EmptyUserTurnConfigOptions);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=empty_user_turn.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
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/empty_user_turn.py
|
|
6
|
+
/** Configuration for recovering from user turns that end without a transcript. */
|
|
7
|
+
export const DEFAULT_EMPTY_USER_TURN_INTERRUPTED_PROMPT = "The user may have said something while you were responding, but it was not " +
|
|
8
|
+
"recognized. Your response was cut off there, and the conversation only includes " +
|
|
9
|
+
"the part they heard, which may be none of it. Briefly ask them to repeat what they said, and " +
|
|
10
|
+
"repeat any question of yours they may have missed.";
|
|
11
|
+
/**
|
|
12
|
+
* How the user aggregator responds to a user turn with no transcript.
|
|
13
|
+
*
|
|
14
|
+
* A user turn can start on voice activity alone and then end with no
|
|
15
|
+
* transcript: a cough, background noise, or speech the STT could not
|
|
16
|
+
* recognize. Nothing is written to the context and the LLM does not run.
|
|
17
|
+
* With this config, the aggregator can append a developer message for such
|
|
18
|
+
* a turn and run the LLM once.
|
|
19
|
+
*
|
|
20
|
+
* Either case may be noise. They differ in what happens if the turn goes
|
|
21
|
+
* unanswered, so each has its own prompt:
|
|
22
|
+
*
|
|
23
|
+
* - Interrupted: the turn started while the bot was thinking, speaking or
|
|
24
|
+
* running a function call, and cut it off. Unanswered, the bot stays
|
|
25
|
+
* silent mid-response, so by default the LLM runs and the bot asks the
|
|
26
|
+
* user to repeat or picks up where it left off. A turn before the bot has
|
|
27
|
+
* first finished speaking counts as interrupted too.
|
|
28
|
+
* - Idle: the bot had finished and was waiting for the user. The
|
|
29
|
+
* conversation isn't stuck, and answering what may be noise would be
|
|
30
|
+
* intrusive, so by default the turn gets no answer.
|
|
31
|
+
*
|
|
32
|
+
* - `interruptedPrompt`: Developer message for an empty turn that interrupted
|
|
33
|
+
* the bot. `null` leaves such turns unanswered.
|
|
34
|
+
* - `idlePrompt`: Developer message for an empty turn while the bot was idle.
|
|
35
|
+
* `null` (the default) leaves such turns unanswered.
|
|
36
|
+
* - `maxConsecutiveRecoveries`: How many empty turns in a row are answered.
|
|
37
|
+
* Further ones are left unanswered until the user says something that is
|
|
38
|
+
* transcribed.
|
|
39
|
+
*/
|
|
40
|
+
export class EmptyUserTurnConfig {
|
|
41
|
+
interruptedPrompt;
|
|
42
|
+
idlePrompt;
|
|
43
|
+
maxConsecutiveRecoveries;
|
|
44
|
+
constructor(options = {}) {
|
|
45
|
+
this.interruptedPrompt =
|
|
46
|
+
options.interruptedPrompt === undefined
|
|
47
|
+
? DEFAULT_EMPTY_USER_TURN_INTERRUPTED_PROMPT
|
|
48
|
+
: options.interruptedPrompt;
|
|
49
|
+
this.idlePrompt = options.idlePrompt ?? null;
|
|
50
|
+
this.maxConsecutiveRecoveries = options.maxConsecutiveRecoveries ?? 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=empty_user_turn.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
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/__init__.py
|
|
6
|
+
// Upstream's `__init__.py` is empty: import the package's modules directly.
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/** Decision engine holding a speculative bot response until its turn is confirmed. */
|
|
2
|
+
import { type Frame } from "../frames/frames.ts";
|
|
3
|
+
import { FrameDirection } from "../processors/frame_processor.ts";
|
|
4
|
+
import { FrameQueue } from "../utils/frame_queue.ts";
|
|
5
|
+
/** A frame paired with the direction it travels in. */
|
|
6
|
+
export type GatedFrame = [Frame, FrameDirection];
|
|
7
|
+
/**
|
|
8
|
+
* What the gate is doing with the frames passing through it.
|
|
9
|
+
*
|
|
10
|
+
* - `OPEN`: emitting everything.
|
|
11
|
+
* - `HOLDING`: holding a speculative response until it is confirmed.
|
|
12
|
+
* - `DROPPING`: discarding the rest of a withdrawn speculative response.
|
|
13
|
+
*/
|
|
14
|
+
export declare const SpeculationState: {
|
|
15
|
+
readonly OPEN: "open";
|
|
16
|
+
readonly HOLDING: "holding";
|
|
17
|
+
readonly DROPPING: "dropping";
|
|
18
|
+
};
|
|
19
|
+
export type SpeculationState = (typeof SpeculationState)[keyof typeof SpeculationState];
|
|
20
|
+
export interface SpeculationGateOptions {
|
|
21
|
+
/** Label used in log messages, typically the owning service's. */
|
|
22
|
+
name?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Decides which frames of a speculative bot response may be emitted, and when.
|
|
26
|
+
*
|
|
27
|
+
* A speculative response is generated from an eager end of turn — a
|
|
28
|
+
* provisional guess that the user has finished talking — so it may answer a
|
|
29
|
+
* transcript the user never actually completed. This holds everything such a
|
|
30
|
+
* response produces until the turn is confirmed, then releases it, or discards
|
|
31
|
+
* it if the guess is withdrawn.
|
|
32
|
+
*
|
|
33
|
+
* A host calls `beginSpeculation` when it starts an inference for a turn that
|
|
34
|
+
* may not have ended, and the response that follows is held from its
|
|
35
|
+
* LLMFullResponseStartFrame onward. A UserStoppedSpeakingFrame releases it —
|
|
36
|
+
* the turn it answers has ended — and an EagerEndOfTurnCancelFrame discards
|
|
37
|
+
* it. Neither names a response: only one speculation is ever in flight, since
|
|
38
|
+
* producing one takes a whole user turn.
|
|
39
|
+
*
|
|
40
|
+
* Whether an inference is still answering an unconfirmed turn is therefore the
|
|
41
|
+
* gate's to answer, through `isSpeculating`, rather than something a host
|
|
42
|
+
* tracks alongside it. A host that kept its own copy would have to clear it on
|
|
43
|
+
* every path that settles a speculation, and the two would disagree on the
|
|
44
|
+
* paths it missed.
|
|
45
|
+
*
|
|
46
|
+
* The gate also tracks whether the turn has ended, because a confirmation can
|
|
47
|
+
* arrive before the inference it confirms — Pipecat dispatches system frames
|
|
48
|
+
* ahead of the queued frames they pass — and a response for a turn already
|
|
49
|
+
* over is not held at all.
|
|
50
|
+
*
|
|
51
|
+
* Both of those resolving frames reach the gate ahead of anything queued
|
|
52
|
+
* behind them, which is what keeps a withdrawal in front of the turn end that
|
|
53
|
+
* follows it. A withdrawal arriving second would find the response already
|
|
54
|
+
* released.
|
|
55
|
+
*
|
|
56
|
+
* While holding, everything is held in arrival order except system frames,
|
|
57
|
+
* which are out-of-band throughout Pipecat — and which carry the verdicts the
|
|
58
|
+
* gate is waiting for, so holding them would deadlock it. That includes
|
|
59
|
+
* uninterruptible frames (`Frame.interruptible` false), which are ordered like
|
|
60
|
+
* any other frame; discarding a speculation keeps them and emits them on,
|
|
61
|
+
* since they can belong to work started before it.
|
|
62
|
+
*
|
|
63
|
+
* This decides rather than processes frames: `process` is synchronous and
|
|
64
|
+
* returns the frames its caller should push, in order. A host can therefore
|
|
65
|
+
* push from several tasks at once — every state transition completes without
|
|
66
|
+
* an await for another task to interleave with. LLMService hosts one, gating
|
|
67
|
+
* every response it produces.
|
|
68
|
+
*
|
|
69
|
+
* Holding is unbounded here. Whoever started the speculation bounds it and
|
|
70
|
+
* withdraws it if it goes unresolved — see EagerUserTurnStopStrategy — so
|
|
71
|
+
* every way a speculation ends reaches this gate as a frame, and the gate
|
|
72
|
+
* never has to abandon one on its own.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* for (const [frame, direction] of gate.process(frame, direction)) {
|
|
76
|
+
* await this.pushFrame(frame, direction);
|
|
77
|
+
* }
|
|
78
|
+
*/
|
|
79
|
+
export declare class SpeculationGate {
|
|
80
|
+
protected _name: string;
|
|
81
|
+
protected _state: SpeculationState;
|
|
82
|
+
protected _speculating: boolean;
|
|
83
|
+
protected _turnEnded: boolean;
|
|
84
|
+
protected _buffer: FrameQueue<GatedFrame>;
|
|
85
|
+
/**
|
|
86
|
+
* Initialize the speculation gate.
|
|
87
|
+
*
|
|
88
|
+
* @param options.name Label used in log messages, typically the owning service's.
|
|
89
|
+
*/
|
|
90
|
+
constructor(options?: SpeculationGateOptions);
|
|
91
|
+
toString(): string;
|
|
92
|
+
/** What the gate is currently doing with frames passing through it. */
|
|
93
|
+
get state(): SpeculationState;
|
|
94
|
+
/**
|
|
95
|
+
* Whether the inference in flight answers an unconfirmed turn.
|
|
96
|
+
*
|
|
97
|
+
* Set from `beginSpeculation` until the turn settles it, so it covers the
|
|
98
|
+
* whole inference rather than only the stretch with frames in flight. False
|
|
99
|
+
* means whatever is generating now answers a turn that has ended, and its
|
|
100
|
+
* side effects can be let through. Use `state` to ask the narrower question
|
|
101
|
+
* of whether frames are being held right now.
|
|
102
|
+
*/
|
|
103
|
+
get isSpeculating(): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Take note of an inference whose turn may not have ended.
|
|
106
|
+
*
|
|
107
|
+
* Called when the inference starts rather than when its first response
|
|
108
|
+
* frame arrives, so a turn confirmed in between is already accounted for by
|
|
109
|
+
* the time the response shows up.
|
|
110
|
+
*
|
|
111
|
+
* @param speculation Whether the inference answers a turn that may still be
|
|
112
|
+
* open, rather than an ordinary one against a turn that has ended.
|
|
113
|
+
*/
|
|
114
|
+
beginSpeculation(speculation: boolean): void;
|
|
115
|
+
/**
|
|
116
|
+
* Decide what a frame passing through the gate releases.
|
|
117
|
+
*
|
|
118
|
+
* @param frame The frame to process.
|
|
119
|
+
* @param direction The direction the frame travels in.
|
|
120
|
+
* @returns The frames to push, in order. Empty while a frame is held or
|
|
121
|
+
* dropped; longer than one frame when a verdict releases what was held
|
|
122
|
+
* behind it.
|
|
123
|
+
*/
|
|
124
|
+
process(frame: Frame, direction: FrameDirection): GatedFrame[];
|
|
125
|
+
/**
|
|
126
|
+
* Leave the hold.
|
|
127
|
+
*
|
|
128
|
+
* The single exit from `HOLDING`. Whether the speculation itself is over is
|
|
129
|
+
* a separate question — a response superseded by a new one ends its hold
|
|
130
|
+
* while the inference that replaced it is still pending.
|
|
131
|
+
*
|
|
132
|
+
* @param state What the gate does with the frames that follow.
|
|
133
|
+
*/
|
|
134
|
+
protected _endHold(state: SpeculationState): void;
|
|
135
|
+
/** Decide what to do with the response opening here. */
|
|
136
|
+
protected _begin(): GatedFrame[];
|
|
137
|
+
/**
|
|
138
|
+
* Release whatever the turn ending confirms.
|
|
139
|
+
*
|
|
140
|
+
* @returns The frames the confirmation releases, in arrival order.
|
|
141
|
+
*/
|
|
142
|
+
protected _release(): GatedFrame[];
|
|
143
|
+
/**
|
|
144
|
+
* Discard the response a withdrawal or an interruption voids.
|
|
145
|
+
*
|
|
146
|
+
* A withdrawal that arrives before the response it voids needs no memory:
|
|
147
|
+
* the response is held on arrival, and whatever answers the turn instead
|
|
148
|
+
* supersedes it — or the bound on the hold runs out if nothing does.
|
|
149
|
+
*
|
|
150
|
+
* @returns Whatever the discarded response was holding back that has to be
|
|
151
|
+
* delivered anyway.
|
|
152
|
+
*/
|
|
153
|
+
protected _discard(): GatedFrame[];
|
|
154
|
+
/**
|
|
155
|
+
* Drop the held response.
|
|
156
|
+
*
|
|
157
|
+
* @param reason Why it is being dropped, for the log line.
|
|
158
|
+
* @param options.keepDropping Whether the rest of the response may still be
|
|
159
|
+
* queued behind us and has to be dropped as it arrives. False when
|
|
160
|
+
* something already past it proves there is no tail left.
|
|
161
|
+
* @returns The held frames that must be delivered anyway, in arrival order.
|
|
162
|
+
*/
|
|
163
|
+
protected _dropHeld(reason: string, options: {
|
|
164
|
+
keepDropping: boolean;
|
|
165
|
+
}): GatedFrame[];
|
|
166
|
+
/** Take everything the buffer still holds, in the order it arrived. */
|
|
167
|
+
protected _flush(): GatedFrame[];
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=speculation_gate.d.ts.map
|
|
@@ -0,0 +1,294 @@
|
|
|
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/speculation_gate.py
|
|
6
|
+
/** Decision engine holding a speculative bot response until its turn is confirmed. */
|
|
7
|
+
import { EagerEndOfTurnCancelFrame, EndFrame, InterruptionFrame, LLMFullResponseEndFrame, LLMFullResponseStartFrame, SystemFrame, UserStartedSpeakingFrame, UserStoppedSpeakingFrame, } from "../frames/frames.js";
|
|
8
|
+
import { FrameDirection } from "../processors/frame_processor.js";
|
|
9
|
+
import { FrameQueue } from "../utils/frame_queue.js";
|
|
10
|
+
import { logger } from "../utils/logger.js";
|
|
11
|
+
/**
|
|
12
|
+
* What the gate is doing with the frames passing through it.
|
|
13
|
+
*
|
|
14
|
+
* - `OPEN`: emitting everything.
|
|
15
|
+
* - `HOLDING`: holding a speculative response until it is confirmed.
|
|
16
|
+
* - `DROPPING`: discarding the rest of a withdrawn speculative response.
|
|
17
|
+
*/
|
|
18
|
+
export const SpeculationState = {
|
|
19
|
+
OPEN: "open",
|
|
20
|
+
HOLDING: "holding",
|
|
21
|
+
DROPPING: "dropping",
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Decides which frames of a speculative bot response may be emitted, and when.
|
|
25
|
+
*
|
|
26
|
+
* A speculative response is generated from an eager end of turn — a
|
|
27
|
+
* provisional guess that the user has finished talking — so it may answer a
|
|
28
|
+
* transcript the user never actually completed. This holds everything such a
|
|
29
|
+
* response produces until the turn is confirmed, then releases it, or discards
|
|
30
|
+
* it if the guess is withdrawn.
|
|
31
|
+
*
|
|
32
|
+
* A host calls `beginSpeculation` when it starts an inference for a turn that
|
|
33
|
+
* may not have ended, and the response that follows is held from its
|
|
34
|
+
* LLMFullResponseStartFrame onward. A UserStoppedSpeakingFrame releases it —
|
|
35
|
+
* the turn it answers has ended — and an EagerEndOfTurnCancelFrame discards
|
|
36
|
+
* it. Neither names a response: only one speculation is ever in flight, since
|
|
37
|
+
* producing one takes a whole user turn.
|
|
38
|
+
*
|
|
39
|
+
* Whether an inference is still answering an unconfirmed turn is therefore the
|
|
40
|
+
* gate's to answer, through `isSpeculating`, rather than something a host
|
|
41
|
+
* tracks alongside it. A host that kept its own copy would have to clear it on
|
|
42
|
+
* every path that settles a speculation, and the two would disagree on the
|
|
43
|
+
* paths it missed.
|
|
44
|
+
*
|
|
45
|
+
* The gate also tracks whether the turn has ended, because a confirmation can
|
|
46
|
+
* arrive before the inference it confirms — Pipecat dispatches system frames
|
|
47
|
+
* ahead of the queued frames they pass — and a response for a turn already
|
|
48
|
+
* over is not held at all.
|
|
49
|
+
*
|
|
50
|
+
* Both of those resolving frames reach the gate ahead of anything queued
|
|
51
|
+
* behind them, which is what keeps a withdrawal in front of the turn end that
|
|
52
|
+
* follows it. A withdrawal arriving second would find the response already
|
|
53
|
+
* released.
|
|
54
|
+
*
|
|
55
|
+
* While holding, everything is held in arrival order except system frames,
|
|
56
|
+
* which are out-of-band throughout Pipecat — and which carry the verdicts the
|
|
57
|
+
* gate is waiting for, so holding them would deadlock it. That includes
|
|
58
|
+
* uninterruptible frames (`Frame.interruptible` false), which are ordered like
|
|
59
|
+
* any other frame; discarding a speculation keeps them and emits them on,
|
|
60
|
+
* since they can belong to work started before it.
|
|
61
|
+
*
|
|
62
|
+
* This decides rather than processes frames: `process` is synchronous and
|
|
63
|
+
* returns the frames its caller should push, in order. A host can therefore
|
|
64
|
+
* push from several tasks at once — every state transition completes without
|
|
65
|
+
* an await for another task to interleave with. LLMService hosts one, gating
|
|
66
|
+
* every response it produces.
|
|
67
|
+
*
|
|
68
|
+
* Holding is unbounded here. Whoever started the speculation bounds it and
|
|
69
|
+
* withdraws it if it goes unresolved — see EagerUserTurnStopStrategy — so
|
|
70
|
+
* every way a speculation ends reaches this gate as a frame, and the gate
|
|
71
|
+
* never has to abandon one on its own.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* for (const [frame, direction] of gate.process(frame, direction)) {
|
|
75
|
+
* await this.pushFrame(frame, direction);
|
|
76
|
+
* }
|
|
77
|
+
*/
|
|
78
|
+
export class SpeculationGate {
|
|
79
|
+
_name;
|
|
80
|
+
_state = SpeculationState.OPEN;
|
|
81
|
+
// Whether the inference in flight answers a turn that has not been
|
|
82
|
+
// confirmed. Set when the inference starts, cleared when the turn settles it
|
|
83
|
+
// either way — so it outlives any one response frame.
|
|
84
|
+
_speculating = false;
|
|
85
|
+
// Whether the turn ended since it was last seen to start. A speculation
|
|
86
|
+
// registered while this is set answers a turn that is already over, so it is
|
|
87
|
+
// not held. Starts false, so a gate that never sees turn frames holds rather
|
|
88
|
+
// than speaks — the strategy's bound then recovers it.
|
|
89
|
+
_turnEnded = false;
|
|
90
|
+
_buffer = new FrameQueue((item) => item[0]);
|
|
91
|
+
/**
|
|
92
|
+
* Initialize the speculation gate.
|
|
93
|
+
*
|
|
94
|
+
* @param options.name Label used in log messages, typically the owning service's.
|
|
95
|
+
*/
|
|
96
|
+
constructor(options = {}) {
|
|
97
|
+
this._name = options.name ?? "SpeculationGate";
|
|
98
|
+
}
|
|
99
|
+
toString() {
|
|
100
|
+
return this._name;
|
|
101
|
+
}
|
|
102
|
+
/** What the gate is currently doing with frames passing through it. */
|
|
103
|
+
get state() {
|
|
104
|
+
return this._state;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Whether the inference in flight answers an unconfirmed turn.
|
|
108
|
+
*
|
|
109
|
+
* Set from `beginSpeculation` until the turn settles it, so it covers the
|
|
110
|
+
* whole inference rather than only the stretch with frames in flight. False
|
|
111
|
+
* means whatever is generating now answers a turn that has ended, and its
|
|
112
|
+
* side effects can be let through. Use `state` to ask the narrower question
|
|
113
|
+
* of whether frames are being held right now.
|
|
114
|
+
*/
|
|
115
|
+
get isSpeculating() {
|
|
116
|
+
return this._speculating;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Take note of an inference whose turn may not have ended.
|
|
120
|
+
*
|
|
121
|
+
* Called when the inference starts rather than when its first response
|
|
122
|
+
* frame arrives, so a turn confirmed in between is already accounted for by
|
|
123
|
+
* the time the response shows up.
|
|
124
|
+
*
|
|
125
|
+
* @param speculation Whether the inference answers a turn that may still be
|
|
126
|
+
* open, rather than an ordinary one against a turn that has ended.
|
|
127
|
+
*/
|
|
128
|
+
beginSpeculation(speculation) {
|
|
129
|
+
// A turn that ended before the inference reached us leaves nothing to
|
|
130
|
+
// hold for: the response answers a turn that is already over.
|
|
131
|
+
this._speculating = speculation && !this._turnEnded;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Decide what a frame passing through the gate releases.
|
|
135
|
+
*
|
|
136
|
+
* @param frame The frame to process.
|
|
137
|
+
* @param direction The direction the frame travels in.
|
|
138
|
+
* @returns The frames to push, in order. Empty while a frame is held or
|
|
139
|
+
* dropped; longer than one frame when a verdict releases what was held
|
|
140
|
+
* behind it.
|
|
141
|
+
*/
|
|
142
|
+
process(frame, direction) {
|
|
143
|
+
if (direction !== FrameDirection.DOWNSTREAM) {
|
|
144
|
+
return [[frame, direction]];
|
|
145
|
+
}
|
|
146
|
+
if (frame instanceof SystemFrame) {
|
|
147
|
+
// Emitted before the verdict is applied, so a released response still
|
|
148
|
+
// follows the frame that ended the turn it answers.
|
|
149
|
+
let emitted = [[frame, direction]];
|
|
150
|
+
if (frame instanceof EagerEndOfTurnCancelFrame || frame instanceof InterruptionFrame) {
|
|
151
|
+
emitted = emitted.concat(this._discard());
|
|
152
|
+
}
|
|
153
|
+
else if (frame instanceof UserStoppedSpeakingFrame) {
|
|
154
|
+
emitted = emitted.concat(this._release());
|
|
155
|
+
}
|
|
156
|
+
else if (frame instanceof UserStartedSpeakingFrame) {
|
|
157
|
+
// A turn is open again, so an inference started from here on answers
|
|
158
|
+
// something that may not have ended.
|
|
159
|
+
this._turnEnded = false;
|
|
160
|
+
}
|
|
161
|
+
return emitted;
|
|
162
|
+
}
|
|
163
|
+
if (frame instanceof EndFrame) {
|
|
164
|
+
// Uninterruptible, and the runner awaits it: holding it hangs shutdown.
|
|
165
|
+
// Discarding first delivers whatever is held that has to outlive the
|
|
166
|
+
// speculation, ahead of it.
|
|
167
|
+
return [...this._discard(), [frame, direction]];
|
|
168
|
+
}
|
|
169
|
+
const emitted = [];
|
|
170
|
+
if (frame instanceof LLMFullResponseStartFrame) {
|
|
171
|
+
emitted.push(...this._begin());
|
|
172
|
+
}
|
|
173
|
+
if (this._state === SpeculationState.HOLDING) {
|
|
174
|
+
// Held in arrival order, uninterruptible frames included: they are
|
|
175
|
+
// ordered like any other, and the buffer preserves them when the
|
|
176
|
+
// speculation around them is discarded.
|
|
177
|
+
this._buffer.putNowait([frame, direction]);
|
|
178
|
+
}
|
|
179
|
+
else if (this._state === SpeculationState.DROPPING) {
|
|
180
|
+
if (!frame.interruptible) {
|
|
181
|
+
// Not part of the response being dropped, and nothing is being held
|
|
182
|
+
// back, so emitting it keeps it in order.
|
|
183
|
+
emitted.push([frame, direction]);
|
|
184
|
+
}
|
|
185
|
+
else if (frame instanceof LLMFullResponseEndFrame) {
|
|
186
|
+
this._state = SpeculationState.OPEN;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
emitted.push([frame, direction]);
|
|
191
|
+
}
|
|
192
|
+
return emitted;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Leave the hold.
|
|
196
|
+
*
|
|
197
|
+
* The single exit from `HOLDING`. Whether the speculation itself is over is
|
|
198
|
+
* a separate question — a response superseded by a new one ends its hold
|
|
199
|
+
* while the inference that replaced it is still pending.
|
|
200
|
+
*
|
|
201
|
+
* @param state What the gate does with the frames that follow.
|
|
202
|
+
*/
|
|
203
|
+
_endHold(state) {
|
|
204
|
+
this._state = state;
|
|
205
|
+
}
|
|
206
|
+
/** Decide what to do with the response opening here. */
|
|
207
|
+
_begin() {
|
|
208
|
+
const emitted = [];
|
|
209
|
+
if (this._state !== SpeculationState.OPEN) {
|
|
210
|
+
// A new response supersedes the one we were holding or dropping. A
|
|
211
|
+
// withdrawn response may never send its end frame, since its generation
|
|
212
|
+
// was cancelled mid-flight, and an unconfirmed one is void once
|
|
213
|
+
// something else starts answering. Nothing of it can still be queued
|
|
214
|
+
// behind this frame, so there is no tail left to drop.
|
|
215
|
+
emitted.push(...this._dropHeld("superseded by a new response", { keepDropping: false }));
|
|
216
|
+
}
|
|
217
|
+
// Whether this response is speculative was settled when its inference
|
|
218
|
+
// started, so a turn confirmed since then already cleared it.
|
|
219
|
+
if (!this._speculating) {
|
|
220
|
+
return emitted;
|
|
221
|
+
}
|
|
222
|
+
this._state = SpeculationState.HOLDING;
|
|
223
|
+
return emitted;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Release whatever the turn ending confirms.
|
|
227
|
+
*
|
|
228
|
+
* @returns The frames the confirmation releases, in arrival order.
|
|
229
|
+
*/
|
|
230
|
+
_release() {
|
|
231
|
+
// Remembered so an inference that arrives after this is not held: the turn
|
|
232
|
+
// it answers is already over, and nothing follows to release it.
|
|
233
|
+
this._turnEnded = true;
|
|
234
|
+
// Nothing this inference still produces is speculative either — including
|
|
235
|
+
// a tool call it has yet to reach.
|
|
236
|
+
this._speculating = false;
|
|
237
|
+
if (this._state !== SpeculationState.HOLDING) {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
logger.debug(`${this}: releasing speculative response (${this._buffer.qsize()} frames)`);
|
|
241
|
+
this._endHold(SpeculationState.OPEN);
|
|
242
|
+
return this._flush();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Discard the response a withdrawal or an interruption voids.
|
|
246
|
+
*
|
|
247
|
+
* A withdrawal that arrives before the response it voids needs no memory:
|
|
248
|
+
* the response is held on arrival, and whatever answers the turn instead
|
|
249
|
+
* supersedes it — or the bound on the hold runs out if nothing does.
|
|
250
|
+
*
|
|
251
|
+
* @returns Whatever the discarded response was holding back that has to be
|
|
252
|
+
* delivered anyway.
|
|
253
|
+
*/
|
|
254
|
+
_discard() {
|
|
255
|
+
// The speculation is void, so nothing the inference still produces
|
|
256
|
+
// answers a turn worth holding for.
|
|
257
|
+
this._speculating = false;
|
|
258
|
+
return this._dropHeld("withdrawn", { keepDropping: true });
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Drop the held response.
|
|
262
|
+
*
|
|
263
|
+
* @param reason Why it is being dropped, for the log line.
|
|
264
|
+
* @param options.keepDropping Whether the rest of the response may still be
|
|
265
|
+
* queued behind us and has to be dropped as it arrives. False when
|
|
266
|
+
* something already past it proves there is no tail left.
|
|
267
|
+
* @returns The held frames that must be delivered anyway, in arrival order.
|
|
268
|
+
*/
|
|
269
|
+
_dropHeld(reason, options) {
|
|
270
|
+
if (this._state !== SpeculationState.HOLDING) {
|
|
271
|
+
this._state = SpeculationState.OPEN;
|
|
272
|
+
return [];
|
|
273
|
+
}
|
|
274
|
+
logger.debug(`${this}: discarding speculative response (${this._buffer.qsize()} frames, ${reason})`);
|
|
275
|
+
// A response that already ended has no tail left to drop.
|
|
276
|
+
const complete = this._buffer.hasFrame(LLMFullResponseEndFrame);
|
|
277
|
+
// Drops the speculative response and keeps anything that must always be
|
|
278
|
+
// delivered, which is then emitted rather than discarded with it.
|
|
279
|
+
this._buffer.reset();
|
|
280
|
+
this._endHold(options.keepDropping && !complete ? SpeculationState.DROPPING : SpeculationState.OPEN);
|
|
281
|
+
return this._flush();
|
|
282
|
+
}
|
|
283
|
+
/** Take everything the buffer still holds, in the order it arrived. */
|
|
284
|
+
_flush() {
|
|
285
|
+
const emitted = [];
|
|
286
|
+
while (!this._buffer.empty()) {
|
|
287
|
+
const [frame, direction] = this._buffer.getNowait();
|
|
288
|
+
this._buffer.taskDone();
|
|
289
|
+
emitted.push([frame, direction]);
|
|
290
|
+
}
|
|
291
|
+
return emitted;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=speculation_gate.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Shared types for user turn strategy frame processing. */
|
|
2
|
+
/**
|
|
3
|
+
* Result of processing a frame in a user turn strategy.
|
|
4
|
+
*
|
|
5
|
+
* Controls whether the strategy loop in the controller continues to the
|
|
6
|
+
* next strategy or stops early.
|
|
7
|
+
*
|
|
8
|
+
* - CONTINUE: Continue to the next strategy in the loop.
|
|
9
|
+
* - STOP: Stop evaluating further strategies for this frame.
|
|
10
|
+
*/
|
|
11
|
+
export declare const ProcessFrameResult: {
|
|
12
|
+
readonly CONTINUE: "continue";
|
|
13
|
+
readonly STOP: "stop";
|
|
14
|
+
};
|
|
15
|
+
export type ProcessFrameResult = (typeof ProcessFrameResult)[keyof typeof ProcessFrameResult];
|
|
16
|
+
export interface UserTurnSpeculationOptions {
|
|
17
|
+
/** The user turn text the inference was run against. */
|
|
18
|
+
text: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A speculative inference a stop strategy has in flight.
|
|
22
|
+
*
|
|
23
|
+
* Produced from an eager end of turn: the turn is not over yet, so the
|
|
24
|
+
* inference runs against a provisional context and its response is held back
|
|
25
|
+
* until the turn is confirmed.
|
|
26
|
+
*
|
|
27
|
+
* - `text`: The user turn text the inference was run against.
|
|
28
|
+
*/
|
|
29
|
+
export declare class UserTurnSpeculation {
|
|
30
|
+
text: string;
|
|
31
|
+
constructor(options: UserTurnSpeculationOptions);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
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/types.py
|
|
6
|
+
/** Shared types for user turn strategy frame processing. */
|
|
7
|
+
/**
|
|
8
|
+
* Result of processing a frame in a user turn strategy.
|
|
9
|
+
*
|
|
10
|
+
* Controls whether the strategy loop in the controller continues to the
|
|
11
|
+
* next strategy or stops early.
|
|
12
|
+
*
|
|
13
|
+
* - CONTINUE: Continue to the next strategy in the loop.
|
|
14
|
+
* - STOP: Stop evaluating further strategies for this frame.
|
|
15
|
+
*/
|
|
16
|
+
export const ProcessFrameResult = {
|
|
17
|
+
CONTINUE: "continue",
|
|
18
|
+
STOP: "stop",
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* A speculative inference a stop strategy has in flight.
|
|
22
|
+
*
|
|
23
|
+
* Produced from an eager end of turn: the turn is not over yet, so the
|
|
24
|
+
* inference runs against a provisional context and its response is held back
|
|
25
|
+
* until the turn is confirmed.
|
|
26
|
+
*
|
|
27
|
+
* - `text`: The user turn text the inference was run against.
|
|
28
|
+
*/
|
|
29
|
+
export class UserTurnSpeculation {
|
|
30
|
+
text;
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.text = options.text;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.js.map
|