@pipedog/core 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +25 -0
- package/NOTICE +9 -0
- package/dist/adapters/base_llm_adapter.d.ts +266 -0
- package/dist/adapters/base_llm_adapter.js +489 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/schemas/direct_function.d.ts +202 -0
- package/dist/adapters/schemas/direct_function.js +302 -0
- package/dist/adapters/schemas/function_schema.d.ts +67 -0
- package/dist/adapters/schemas/function_schema.js +72 -0
- package/dist/adapters/schemas/index.d.ts +2 -0
- package/dist/adapters/schemas/index.js +8 -0
- package/dist/adapters/schemas/tools_schema.d.ts +57 -0
- package/dist/adapters/schemas/tools_schema.js +79 -0
- package/dist/adapters/services/index.d.ts +2 -0
- package/dist/adapters/services/index.js +8 -0
- package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
- package/dist/adapters/services/open_ai_adapter.js +250 -0
- package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
- package/dist/audio/dtmf/dtmf_data.js +22 -0
- package/dist/audio/dtmf/index.d.ts +2 -0
- package/dist/audio/dtmf/index.js +8 -0
- package/dist/audio/dtmf/types.d.ts +31 -0
- package/dist/audio/dtmf/types.js +35 -0
- package/dist/audio/dtmf/utils.d.ts +13 -0
- package/dist/audio/dtmf/utils.js +62 -0
- package/dist/audio/filters/base_audio_filter.d.ts +51 -0
- package/dist/audio/filters/base_audio_filter.js +17 -0
- package/dist/audio/filters/index.d.ts +2 -0
- package/dist/audio/filters/index.js +8 -0
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/krisp_instance.d.ts +95 -0
- package/dist/audio/krisp_instance.js +229 -0
- package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
- package/dist/audio/mixers/base_audio_mixer.js +16 -0
- package/dist/audio/mixers/index.d.ts +2 -0
- package/dist/audio/mixers/index.js +8 -0
- package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
- package/dist/audio/resamplers/base_audio_resampler.js +35 -0
- package/dist/audio/resamplers/engine.d.ts +60 -0
- package/dist/audio/resamplers/engine.js +89 -0
- package/dist/audio/resamplers/index.d.ts +2 -0
- package/dist/audio/resamplers/index.js +8 -0
- package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
- package/dist/audio/resamplers/resampy_resampler.js +15 -0
- package/dist/audio/resamplers/sinc_engine.d.ts +10 -0
- package/dist/audio/resamplers/sinc_engine.js +235 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +58 -0
- package/dist/audio/resamplers/soxr_resampler.js +79 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +78 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +159 -0
- package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
- package/dist/audio/turn/base_turn_analyzer.js +61 -0
- package/dist/audio/turn/index.d.ts +2 -0
- package/dist/audio/turn/index.js +8 -0
- package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
- package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +151 -0
- package/dist/audio/utils.d.ts +224 -0
- package/dist/audio/utils.js +634 -0
- package/dist/audio/vad/data/index.d.ts +2 -0
- package/dist/audio/vad/data/index.js +8 -0
- package/dist/audio/vad/index.d.ts +2 -0
- package/dist/audio/vad/index.js +8 -0
- package/dist/audio/vad/vad_analyzer.d.ts +134 -0
- package/dist/audio/vad/vad_analyzer.js +249 -0
- package/dist/audio/vad/vad_controller.d.ts +143 -0
- package/dist/audio/vad/vad_controller.js +228 -0
- package/dist/audio/volume.d.ts +38 -0
- package/dist/audio/volume.js +75 -0
- package/dist/bus/adapters/base.d.ts +35 -0
- package/dist/bus/adapters/base.js +19 -0
- package/dist/bus/adapters/index.d.ts +10 -0
- package/dist/bus/adapters/index.js +15 -0
- package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
- package/dist/bus/adapters/llm_context_adapter.js +82 -0
- package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
- package/dist/bus/adapters/tools_schema_adapter.js +70 -0
- package/dist/bus/bridge_processor.d.ts +111 -0
- package/dist/bus/bridge_processor.js +166 -0
- package/dist/bus/bus.d.ts +110 -0
- package/dist/bus/bus.js +200 -0
- package/dist/bus/index.d.ts +22 -0
- package/dist/bus/index.js +27 -0
- package/dist/bus/local/async_queue.d.ts +12 -0
- package/dist/bus/local/async_queue.js +21 -0
- package/dist/bus/local/index.d.ts +3 -0
- package/dist/bus/local/index.js +8 -0
- package/dist/bus/messages.d.ts +378 -0
- package/dist/bus/messages.js +357 -0
- package/dist/bus/network/index.d.ts +16 -0
- package/dist/bus/network/index.js +21 -0
- package/dist/bus/queue.d.ts +27 -0
- package/dist/bus/queue.js +51 -0
- package/dist/bus/serializers/base.d.ts +25 -0
- package/dist/bus/serializers/base.js +14 -0
- package/dist/bus/serializers/index.d.ts +9 -0
- package/dist/bus/serializers/index.js +14 -0
- package/dist/bus/serializers/json.d.ts +77 -0
- package/dist/bus/serializers/json.js +367 -0
- package/dist/bus/subscriber.d.ts +46 -0
- package/dist/bus/subscriber.js +27 -0
- package/dist/bus/ui/index.d.ts +3 -0
- package/dist/bus/ui/index.js +8 -0
- package/dist/bus/ui/messages.d.ts +186 -0
- package/dist/bus/ui/messages.js +171 -0
- package/dist/classifiers/base_classifier.d.ts +263 -0
- package/dist/classifiers/base_classifier.js +346 -0
- package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
- package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
- package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
- package/dist/classifiers/cloudflare/clef/client.js +234 -0
- package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/clef/index.js +8 -0
- package/dist/classifiers/cloudflare/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/index.js +8 -0
- package/dist/classifiers/http_client.d.ts +70 -0
- package/dist/classifiers/http_client.js +161 -0
- package/dist/classifiers/index.d.ts +2 -0
- package/dist/classifiers/index.js +8 -0
- package/dist/classifiers/jev/classifier.d.ts +8 -0
- package/dist/classifiers/jev/classifier.js +13 -0
- package/dist/classifiers/jev/client.d.ts +8 -0
- package/dist/classifiers/jev/client.js +13 -0
- package/dist/classifiers/jev/index.d.ts +2 -0
- package/dist/classifiers/jev/index.js +8 -0
- package/dist/classifiers/llm/classifier.d.ts +72 -0
- package/dist/classifiers/llm/classifier.js +304 -0
- package/dist/classifiers/llm/index.d.ts +2 -0
- package/dist/classifiers/llm/index.js +8 -0
- package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
- package/dist/classifiers/openai/decisions/classifier.js +241 -0
- package/dist/classifiers/openai/decisions/client.d.ts +108 -0
- package/dist/classifiers/openai/decisions/client.js +234 -0
- package/dist/classifiers/openai/decisions/index.d.ts +2 -0
- package/dist/classifiers/openai/decisions/index.js +8 -0
- package/dist/classifiers/openai/index.d.ts +2 -0
- package/dist/classifiers/openai/index.js +8 -0
- package/dist/classifiers/typesafe/index.d.ts +2 -0
- package/dist/classifiers/typesafe/index.js +8 -0
- package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
- package/dist/classifiers/typesafe/jev/classifier.js +220 -0
- package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
- package/dist/classifiers/typesafe/jev/client.js +233 -0
- package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
- package/dist/classifiers/typesafe/jev/index.js +8 -0
- package/dist/clocks/base_clock.d.ts +13 -0
- package/dist/clocks/base_clock.js +14 -0
- package/dist/clocks/index.d.ts +2 -0
- package/dist/clocks/index.js +8 -0
- package/dist/clocks/system_clock.d.ts +15 -0
- package/dist/clocks/system_clock.js +25 -0
- package/dist/frames/frames.d.ts +2533 -0
- package/dist/frames/frames.js +2485 -0
- package/dist/frames/index.d.ts +2 -0
- package/dist/frames/index.js +8 -0
- package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
- package/dist/frames/protobufs/frames_pb2.js +466 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +56 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/metrics.d.ts +276 -0
- package/dist/metrics/metrics.js +254 -0
- package/dist/observers/base_observer.d.ts +173 -0
- package/dist/observers/base_observer.js +151 -0
- package/dist/observers/error_observer.d.ts +75 -0
- package/dist/observers/error_observer.js +87 -0
- package/dist/observers/function_call_observer.d.ts +157 -0
- package/dist/observers/function_call_observer.js +222 -0
- package/dist/observers/index.d.ts +2 -0
- package/dist/observers/index.js +8 -0
- package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
- package/dist/observers/loggers/debug_log_observer.js +228 -0
- package/dist/observers/loggers/index.d.ts +2 -0
- package/dist/observers/loggers/index.js +8 -0
- package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
- package/dist/observers/loggers/llm_log_observer.js +110 -0
- package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
- package/dist/observers/loggers/metrics_log_observer.js +186 -0
- package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
- package/dist/observers/loggers/transcription_log_observer.js +74 -0
- package/dist/observers/service_metrics_observer.d.ts +168 -0
- package/dist/observers/service_metrics_observer.js +236 -0
- package/dist/observers/speaking_observer.d.ts +104 -0
- package/dist/observers/speaking_observer.js +150 -0
- package/dist/observers/startup_timing_observer.d.ts +221 -0
- package/dist/observers/startup_timing_observer.js +365 -0
- package/dist/observers/turn_tracking_observer.d.ts +78 -0
- package/dist/observers/turn_tracking_observer.js +189 -0
- package/dist/observers/user_bot_latency_observer.d.ts +411 -0
- package/dist/observers/user_bot_latency_observer.js +974 -0
- package/dist/pipeline/base_pipeline.d.ts +49 -0
- package/dist/pipeline/base_pipeline.js +101 -0
- package/dist/pipeline/capabilities.d.ts +76 -0
- package/dist/pipeline/capabilities.js +97 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.js +8 -0
- package/dist/pipeline/job_context.d.ts +317 -0
- package/dist/pipeline/job_context.js +450 -0
- package/dist/pipeline/job_decorator.d.ts +54 -0
- package/dist/pipeline/job_decorator.js +92 -0
- package/dist/pipeline/llm_switcher.d.ts +84 -0
- package/dist/pipeline/llm_switcher.js +107 -0
- package/dist/pipeline/llm_with_backend.d.ts +435 -0
- package/dist/pipeline/llm_with_backend.js +806 -0
- package/dist/pipeline/parallel_pipeline.d.ts +83 -0
- package/dist/pipeline/parallel_pipeline.js +200 -0
- package/dist/pipeline/pipeline.d.ts +126 -0
- package/dist/pipeline/pipeline.js +196 -0
- package/dist/pipeline/service_switcher.d.ts +287 -0
- package/dist/pipeline/service_switcher.js +509 -0
- package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
- package/dist/pipeline/sync_parallel_pipeline.js +387 -0
- package/dist/pipeline/worker.d.ts +821 -0
- package/dist/pipeline/worker.js +1656 -0
- package/dist/pipeline/worker_observer.d.ts +131 -0
- package/dist/pipeline/worker_observer.js +274 -0
- package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
- package/dist/pipeline/worker_ready_decorator.js +76 -0
- package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
- package/dist/processors/aggregators/async_tool_messages.js +291 -0
- package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
- package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
- package/dist/processors/aggregators/gated.d.ts +43 -0
- package/dist/processors/aggregators/gated.js +86 -0
- package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
- package/dist/processors/aggregators/gated_llm_context.js +86 -0
- package/dist/processors/aggregators/index.d.ts +2 -0
- package/dist/processors/aggregators/index.js +8 -0
- package/dist/processors/aggregators/llm_context.d.ts +370 -0
- package/dist/processors/aggregators/llm_context.js +580 -0
- package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
- package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
- package/dist/processors/aggregators/llm_response.d.ts +37 -0
- package/dist/processors/aggregators/llm_response.js +71 -0
- package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
- package/dist/processors/aggregators/llm_response_universal.js +2394 -0
- package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
- package/dist/processors/aggregators/llm_text_processor.js +102 -0
- package/dist/processors/aggregators/sentence.d.ts +39 -0
- package/dist/processors/aggregators/sentence.js +69 -0
- package/dist/processors/async_generator.d.ts +42 -0
- package/dist/processors/async_generator.js +76 -0
- package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
- package/dist/processors/audio/audio_buffer_processor.js +565 -0
- package/dist/processors/audio/index.d.ts +2 -0
- package/dist/processors/audio/index.js +8 -0
- package/dist/processors/audio/vad_processor.d.ts +67 -0
- package/dist/processors/audio/vad_processor.js +103 -0
- package/dist/processors/consumer_processor.d.ts +49 -0
- package/dist/processors/consumer_processor.js +85 -0
- package/dist/processors/filters/frame_filter.d.ts +39 -0
- package/dist/processors/filters/frame_filter.js +52 -0
- package/dist/processors/filters/function_filter.d.ts +59 -0
- package/dist/processors/filters/function_filter.js +78 -0
- package/dist/processors/filters/identity_filter.d.ts +33 -0
- package/dist/processors/filters/identity_filter.js +37 -0
- package/dist/processors/filters/index.d.ts +2 -0
- package/dist/processors/filters/index.js +8 -0
- package/dist/processors/filters/null_filter.d.ts +34 -0
- package/dist/processors/filters/null_filter.js +47 -0
- package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
- package/dist/processors/filters/wake_notifier_filter.js +49 -0
- package/dist/processors/frame_processor.d.ts +360 -0
- package/dist/processors/frame_processor.js +932 -0
- package/dist/processors/frameworks/index.d.ts +2 -0
- package/dist/processors/frameworks/index.js +8 -0
- package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
- package/dist/processors/frameworks/rtvi/frames.js +259 -0
- package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
- package/dist/processors/frameworks/rtvi/index.js +11 -0
- package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
- package/dist/processors/frameworks/rtvi/models.js +1807 -0
- package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
- package/dist/processors/frameworks/rtvi/observer.js +1113 -0
- package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
- package/dist/processors/frameworks/rtvi/processor.js +676 -0
- package/dist/processors/idle_frame_processor.d.ts +44 -0
- package/dist/processors/idle_frame_processor.js +86 -0
- package/dist/processors/index.d.ts +2 -0
- package/dist/processors/index.js +8 -0
- package/dist/processors/logger.d.ts +42 -0
- package/dist/processors/logger.js +87 -0
- package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
- package/dist/processors/metrics/frame_processor_metrics.js +372 -0
- package/dist/processors/metrics/index.d.ts +2 -0
- package/dist/processors/metrics/index.js +8 -0
- package/dist/processors/producer_processor.d.ts +68 -0
- package/dist/processors/producer_processor.js +78 -0
- package/dist/processors/text_transformer.d.ts +30 -0
- package/dist/processors/text_transformer.js +48 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry.d.ts +69 -0
- package/dist/registry/registry.js +149 -0
- package/dist/registry/types.d.ts +47 -0
- package/dist/registry/types.js +39 -0
- package/dist/serializers/base_serializer.d.ts +94 -0
- package/dist/serializers/base_serializer.js +82 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.js +8 -0
- package/dist/services/ai_service.d.ts +145 -0
- package/dist/services/ai_service.js +262 -0
- package/dist/services/anthropic/index.d.ts +2 -0
- package/dist/services/anthropic/index.js +7 -0
- package/dist/services/assemblyai/index.d.ts +2 -0
- package/dist/services/assemblyai/index.js +7 -0
- package/dist/services/asyncai/index.d.ts +2 -0
- package/dist/services/asyncai/index.js +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.js +7 -0
- package/dist/services/azure/index.d.ts +2 -0
- package/dist/services/azure/index.js +7 -0
- package/dist/services/baseten/index.d.ts +2 -0
- package/dist/services/baseten/index.js +7 -0
- package/dist/services/bland/index.d.ts +2 -0
- package/dist/services/bland/index.js +7 -0
- package/dist/services/camb/index.d.ts +2 -0
- package/dist/services/camb/index.js +7 -0
- package/dist/services/cartesia/index.d.ts +2 -0
- package/dist/services/cartesia/index.js +7 -0
- package/dist/services/cerebras/index.d.ts +2 -0
- package/dist/services/cerebras/index.js +7 -0
- package/dist/services/crusoe/index.d.ts +2 -0
- package/dist/services/crusoe/index.js +7 -0
- package/dist/services/deepgram/index.d.ts +2 -0
- package/dist/services/deepgram/index.js +7 -0
- package/dist/services/deepseek/index.d.ts +2 -0
- package/dist/services/deepseek/index.js +7 -0
- package/dist/services/elevenlabs/index.d.ts +2 -0
- package/dist/services/elevenlabs/index.js +7 -0
- package/dist/services/fal/index.d.ts +2 -0
- package/dist/services/fal/index.js +7 -0
- package/dist/services/fireworks/index.d.ts +2 -0
- package/dist/services/fireworks/index.js +7 -0
- package/dist/services/fish/index.d.ts +2 -0
- package/dist/services/fish/index.js +7 -0
- package/dist/services/funasr/index.d.ts +3 -0
- package/dist/services/funasr/index.js +8 -0
- package/dist/services/gladia/index.d.ts +2 -0
- package/dist/services/gladia/index.js +7 -0
- package/dist/services/google/index.d.ts +2 -0
- package/dist/services/google/index.js +7 -0
- package/dist/services/gradium/index.d.ts +2 -0
- package/dist/services/gradium/index.js +7 -0
- package/dist/services/grok/index.d.ts +2 -0
- package/dist/services/grok/index.js +7 -0
- package/dist/services/groq/index.d.ts +2 -0
- package/dist/services/groq/index.js +7 -0
- package/dist/services/heygen/index.d.ts +2 -0
- package/dist/services/heygen/index.js +7 -0
- package/dist/services/hume/index.d.ts +2 -0
- package/dist/services/hume/index.js +7 -0
- package/dist/services/image_service.d.ts +52 -0
- package/dist/services/image_service.js +60 -0
- package/dist/services/inception/index.d.ts +2 -0
- package/dist/services/inception/index.js +7 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +8 -0
- package/dist/services/inworld/index.d.ts +2 -0
- package/dist/services/inworld/index.js +7 -0
- package/dist/services/keenable/index.d.ts +2 -0
- package/dist/services/keenable/index.js +7 -0
- package/dist/services/kokoro/index.d.ts +2 -0
- package/dist/services/kokoro/index.js +7 -0
- package/dist/services/llm_service.d.ts +1106 -0
- package/dist/services/llm_service.js +2231 -0
- package/dist/services/mem0/index.d.ts +2 -0
- package/dist/services/mem0/index.js +7 -0
- package/dist/services/meta/index.d.ts +2 -0
- package/dist/services/meta/index.js +7 -0
- package/dist/services/minimax/index.d.ts +2 -0
- package/dist/services/minimax/index.js +7 -0
- package/dist/services/mistral/index.d.ts +2 -0
- package/dist/services/mistral/index.js +7 -0
- package/dist/services/moondream/index.d.ts +2 -0
- package/dist/services/moondream/index.js +7 -0
- package/dist/services/moonshine/index.d.ts +2 -0
- package/dist/services/moonshine/index.js +7 -0
- package/dist/services/nebius/index.d.ts +2 -0
- package/dist/services/nebius/index.js +7 -0
- package/dist/services/neuphonic/index.d.ts +2 -0
- package/dist/services/neuphonic/index.js +7 -0
- package/dist/services/novita/index.d.ts +2 -0
- package/dist/services/novita/index.js +7 -0
- package/dist/services/nvidia/index.d.ts +2 -0
- package/dist/services/nvidia/index.js +11 -0
- package/dist/services/ollama/index.d.ts +2 -0
- package/dist/services/ollama/index.js +7 -0
- package/dist/services/openai/index.d.ts +2 -0
- package/dist/services/openai/index.js +7 -0
- package/dist/services/openclaw/index.d.ts +14 -0
- package/dist/services/openclaw/index.js +19 -0
- package/dist/services/openrouter/index.d.ts +2 -0
- package/dist/services/openrouter/index.js +7 -0
- package/dist/services/perplexity/index.d.ts +2 -0
- package/dist/services/perplexity/index.js +7 -0
- package/dist/services/piper/index.d.ts +2 -0
- package/dist/services/piper/index.js +7 -0
- package/dist/services/pocket_tts/index.d.ts +2 -0
- package/dist/services/pocket_tts/index.js +7 -0
- package/dist/services/qwen/index.d.ts +2 -0
- package/dist/services/qwen/index.js +7 -0
- package/dist/services/resembleai/index.d.ts +2 -0
- package/dist/services/resembleai/index.js +7 -0
- package/dist/services/rime/index.d.ts +2 -0
- package/dist/services/rime/index.js +7 -0
- package/dist/services/sambanova/index.d.ts +2 -0
- package/dist/services/sambanova/index.js +7 -0
- package/dist/services/sarvam/index.d.ts +2 -0
- package/dist/services/sarvam/index.js +7 -0
- package/dist/services/settings.d.ts +356 -0
- package/dist/services/settings.js +437 -0
- package/dist/services/simli/index.d.ts +2 -0
- package/dist/services/simli/index.js +7 -0
- package/dist/services/smallest/index.d.ts +2 -0
- package/dist/services/smallest/index.js +7 -0
- package/dist/services/soniox/index.d.ts +2 -0
- package/dist/services/soniox/index.js +7 -0
- package/dist/services/speechify/index.d.ts +2 -0
- package/dist/services/speechify/index.js +7 -0
- package/dist/services/speechmatics/index.d.ts +2 -0
- package/dist/services/speechmatics/index.js +7 -0
- package/dist/services/stt_latency.d.ts +62 -0
- package/dist/services/stt_latency.js +71 -0
- package/dist/services/stt_service.d.ts +601 -0
- package/dist/services/stt_service.js +1044 -0
- package/dist/services/tavus/index.d.ts +2 -0
- package/dist/services/tavus/index.js +7 -0
- package/dist/services/together/index.d.ts +2 -0
- package/dist/services/together/index.js +7 -0
- package/dist/services/tts_service.d.ts +909 -0
- package/dist/services/tts_service.js +2018 -0
- package/dist/services/ultravox/index.d.ts +2 -0
- package/dist/services/ultravox/index.js +9 -0
- package/dist/services/vision_service.d.ts +56 -0
- package/dist/services/vision_service.js +62 -0
- package/dist/services/websocket_service.d.ts +213 -0
- package/dist/services/websocket_service.js +654 -0
- package/dist/services/whisper/index.d.ts +2 -0
- package/dist/services/whisper/index.js +9 -0
- package/dist/services/xai/index.d.ts +2 -0
- package/dist/services/xai/index.js +9 -0
- package/dist/services/xtts/index.d.ts +2 -0
- package/dist/services/xtts/index.js +9 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.js +8 -0
- package/dist/tests/utils.d.ts +123 -0
- package/dist/tests/utils.js +212 -0
- package/dist/transcriptions/index.d.ts +2 -0
- package/dist/transcriptions/index.js +8 -0
- package/dist/transcriptions/language.d.ts +376 -0
- package/dist/transcriptions/language.js +543 -0
- package/dist/transports/base_input.d.ts +149 -0
- package/dist/transports/base_input.js +338 -0
- package/dist/transports/base_output.d.ts +432 -0
- package/dist/transports/base_output.js +1231 -0
- package/dist/transports/base_transport.d.ts +223 -0
- package/dist/transports/base_transport.js +167 -0
- package/dist/transports/daily/index.d.ts +2 -0
- package/dist/transports/daily/index.js +9 -0
- package/dist/transports/heygen/index.d.ts +2 -0
- package/dist/transports/heygen/index.js +9 -0
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/lemonslice/index.d.ts +2 -0
- package/dist/transports/lemonslice/index.js +9 -0
- package/dist/transports/livekit/index.d.ts +2 -0
- package/dist/transports/livekit/index.js +9 -0
- package/dist/transports/local/index.d.ts +2 -0
- package/dist/transports/local/index.js +9 -0
- package/dist/transports/moq/index.d.ts +2 -0
- package/dist/transports/moq/index.js +9 -0
- package/dist/transports/smallwebrtc/index.d.ts +2 -0
- package/dist/transports/smallwebrtc/index.js +9 -0
- package/dist/transports/tavus/index.d.ts +2 -0
- package/dist/transports/tavus/index.js +9 -0
- package/dist/transports/video_in_sampler.d.ts +157 -0
- package/dist/transports/video_in_sampler.js +258 -0
- package/dist/transports/vonage/index.d.ts +2 -0
- package/dist/transports/vonage/index.js +9 -0
- package/dist/transports/websocket/index.d.ts +2 -0
- package/dist/transports/websocket/index.js +9 -0
- package/dist/transports/whatsapp/index.d.ts +2 -0
- package/dist/transports/whatsapp/index.js +9 -0
- package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
- package/dist/turns/eager_end_of_turn_mixin.js +122 -0
- package/dist/turns/empty_user_turn.d.ts +55 -0
- package/dist/turns/empty_user_turn.js +53 -0
- package/dist/turns/index.d.ts +2 -0
- package/dist/turns/index.js +8 -0
- package/dist/turns/speculation_gate.d.ts +169 -0
- package/dist/turns/speculation_gate.js +294 -0
- package/dist/turns/types.d.ts +33 -0
- package/dist/turns/types.js +35 -0
- package/dist/turns/user_idle_controller.d.ts +94 -0
- package/dist/turns/user_idle_controller.js +187 -0
- package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
- package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
- package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
- package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
- package/dist/turns/user_mute/index.d.ts +6 -0
- package/dist/turns/user_mute/index.js +11 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
- package/dist/turns/user_start/index.d.ts +8 -0
- package/dist/turns/user_start/index.js +16 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
- package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
- package/dist/turns/user_stop/eager_match_policy.js +50 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
- package/dist/turns/user_stop/index.d.ts +10 -0
- package/dist/turns/user_stop/index.js +15 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
- package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
- package/dist/turns/user_turn_completion_mixin.js +591 -0
- package/dist/turns/user_turn_controller.d.ts +134 -0
- package/dist/turns/user_turn_controller.js +335 -0
- package/dist/turns/user_turn_processor.d.ts +87 -0
- package/dist/turns/user_turn_processor.js +180 -0
- package/dist/turns/user_turn_strategies.d.ts +187 -0
- package/dist/turns/user_turn_strategies.js +222 -0
- package/dist/utils/async_tool_cancellation.d.ts +35 -0
- package/dist/utils/async_tool_cancellation.js +78 -0
- package/dist/utils/asyncio/index.d.ts +2 -0
- package/dist/utils/asyncio/index.js +7 -0
- package/dist/utils/asyncio/task_manager.d.ts +49 -0
- package/dist/utils/asyncio/task_manager.js +105 -0
- package/dist/utils/base_object.d.ts +76 -0
- package/dist/utils/base_object.js +154 -0
- package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
- package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
- package/dist/utils/context/audio_context_manager.d.ts +131 -0
- package/dist/utils/context/audio_context_manager.js +233 -0
- package/dist/utils/context/index.d.ts +2 -0
- package/dist/utils/context/index.js +7 -0
- package/dist/utils/context/llm_context_summarization.d.ts +258 -0
- package/dist/utils/context/llm_context_summarization.js +511 -0
- package/dist/utils/context/text_segment_map.d.ts +611 -0
- package/dist/utils/context/text_segment_map.js +1132 -0
- package/dist/utils/context/word_completion_tracker.d.ts +273 -0
- package/dist/utils/context/word_completion_tracker.js +441 -0
- package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
- package/dist/utils/context/word_timestamp_tracker.js +98 -0
- package/dist/utils/deprecation.d.ts +28 -0
- package/dist/utils/deprecation.js +75 -0
- package/dist/utils/env.d.ts +38 -0
- package/dist/utils/env.js +62 -0
- package/dist/utils/errors.d.ts +75 -0
- package/dist/utils/errors.js +202 -0
- package/dist/utils/file_resolver.d.ts +126 -0
- package/dist/utils/file_resolver.js +314 -0
- package/dist/utils/file_storage.d.ts +115 -0
- package/dist/utils/file_storage.js +178 -0
- package/dist/utils/frame_queue.d.ts +36 -0
- package/dist/utils/frame_queue.js +66 -0
- package/dist/utils/http.d.ts +39 -0
- package/dist/utils/http.js +53 -0
- package/dist/utils/image.d.ts +14 -0
- package/dist/utils/image.js +63 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jpeg_encoder.d.ts +14 -0
- package/dist/utils/jpeg_encoder.js +315 -0
- package/dist/utils/log_config.d.ts +34 -0
- package/dist/utils/log_config.js +76 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/mixin.d.ts +14 -0
- package/dist/utils/mixin.js +63 -0
- package/dist/utils/network.d.ts +73 -0
- package/dist/utils/network.js +90 -0
- package/dist/utils/security/allowed_origins.d.ts +16 -0
- package/dist/utils/security/allowed_origins.js +34 -0
- package/dist/utils/security/index.d.ts +2 -0
- package/dist/utils/security/index.js +7 -0
- package/dist/utils/security/redaction.d.ts +27 -0
- package/dist/utils/security/redaction.js +123 -0
- package/dist/utils/security/ssrf.d.ts +79 -0
- package/dist/utils/security/ssrf.js +327 -0
- package/dist/utils/shared.d.ts +35 -0
- package/dist/utils/shared.js +136 -0
- package/dist/utils/startup.d.ts +17 -0
- package/dist/utils/startup.js +130 -0
- package/dist/utils/string.d.ts +116 -0
- package/dist/utils/string.js +460 -0
- package/dist/utils/sync/base_notifier.d.ts +25 -0
- package/dist/utils/sync/base_notifier.js +16 -0
- package/dist/utils/sync/event_notifier.d.ts +38 -0
- package/dist/utils/sync/event_notifier.js +51 -0
- package/dist/utils/sync/index.d.ts +2 -0
- package/dist/utils/sync/index.js +7 -0
- package/dist/utils/text/alnum_utils.d.ts +109 -0
- package/dist/utils/text/alnum_utils.js +262 -0
- package/dist/utils/text/base_text_aggregator.d.ts +146 -0
- package/dist/utils/text/base_text_aggregator.js +102 -0
- package/dist/utils/text/base_text_filter.d.ts +54 -0
- package/dist/utils/text/base_text_filter.js +50 -0
- package/dist/utils/text/index.d.ts +2 -0
- package/dist/utils/text/index.js +7 -0
- package/dist/utils/text/markdown_text_filter.d.ts +147 -0
- package/dist/utils/text/markdown_text_filter.js +522 -0
- package/dist/utils/text/markup_utils.d.ts +54 -0
- package/dist/utils/text/markup_utils.js +156 -0
- package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
- package/dist/utils/text/pattern_pair_aggregator.js +478 -0
- package/dist/utils/text/phonemes.d.ts +60 -0
- package/dist/utils/text/phonemes.js +172 -0
- package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
- package/dist/utils/text/simple_text_aggregator.js +254 -0
- package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
- package/dist/utils/text/skip_tags_aggregator.js +147 -0
- package/dist/utils/text/transforms/acronyms.d.ts +21 -0
- package/dist/utils/text/transforms/acronyms.js +31 -0
- package/dist/utils/text/transforms/currency.d.ts +16 -0
- package/dist/utils/text/transforms/currency.js +56 -0
- package/dist/utils/text/transforms/dates.d.ts +18 -0
- package/dist/utils/text/transforms/dates.js +102 -0
- package/dist/utils/text/transforms/email.d.ts +17 -0
- package/dist/utils/text/transforms/email.js +35 -0
- package/dist/utils/text/transforms/index.d.ts +37 -0
- package/dist/utils/text/transforms/index.js +42 -0
- package/dist/utils/text/transforms/numbers.d.ts +25 -0
- package/dist/utils/text/transforms/numbers.js +59 -0
- package/dist/utils/text/transforms/percentages.d.ts +16 -0
- package/dist/utils/text/transforms/percentages.js +32 -0
- package/dist/utils/text/transforms/phone.d.ts +21 -0
- package/dist/utils/text/transforms/phone.js +39 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +112 -0
- package/dist/utils/text/transforms/replacements.d.ts +39 -0
- package/dist/utils/text/transforms/replacements.js +46 -0
- package/dist/utils/text/transforms/strip_markdown.d.ts +25 -0
- package/dist/utils/text/transforms/strip_markdown.js +60 -0
- package/dist/utils/text/transforms/units.d.ts +22 -0
- package/dist/utils/text/transforms/units.js +81 -0
- package/dist/utils/text/transforms/voice_formatter.d.ts +86 -0
- package/dist/utils/text/transforms/voice_formatter.js +98 -0
- package/dist/utils/text/unicode_digits.d.ts +3 -0
- package/dist/utils/text/unicode_digits.js +34 -0
- package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
- package/dist/utils/text/word_timestamp_utils.js +52 -0
- package/dist/utils/time.d.ts +13 -0
- package/dist/utils/time.js +31 -0
- package/dist/utils/tracing/index.d.ts +3 -0
- package/dist/utils/tracing/index.js +8 -0
- package/dist/utils/tracing/service_attributes.d.ts +198 -0
- package/dist/utils/tracing/service_attributes.js +434 -0
- package/dist/utils/tracing/service_decorators.d.ts +214 -0
- package/dist/utils/tracing/service_decorators.js +1662 -0
- package/dist/utils/tracing/setup.d.ts +107 -0
- package/dist/utils/tracing/setup.js +160 -0
- package/dist/utils/tracing/tracing_context.d.ts +55 -0
- package/dist/utils/tracing/tracing_context.js +97 -0
- package/dist/utils/tracing/turn_trace_observer.d.ts +95 -0
- package/dist/utils/tracing/turn_trace_observer.js +233 -0
- package/dist/utils/types.d.ts +80 -0
- package/dist/utils/types.js +108 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.js +22 -0
- package/dist/utils/yaml.d.ts +179 -0
- package/dist/utils/yaml.js +556 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +7 -0
- package/dist/workers/base_worker.d.ts +772 -0
- package/dist/workers/base_worker.js +1298 -0
- package/dist/workers/index.d.ts +2 -0
- package/dist/workers/index.js +8 -0
- package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
- package/dist/workers/llm/backend_llm_worker.js +1055 -0
- package/dist/workers/llm/index.d.ts +6 -0
- package/dist/workers/llm/index.js +11 -0
- package/dist/workers/llm/llm_context_worker.d.ts +66 -0
- package/dist/workers/llm/llm_context_worker.js +72 -0
- package/dist/workers/llm/llm_worker.d.ts +180 -0
- package/dist/workers/llm/llm_worker.js +323 -0
- package/dist/workers/llm/tool_decorator.d.ts +68 -0
- package/dist/workers/llm/tool_decorator.js +60 -0
- package/dist/workers/proxy/index.d.ts +3 -0
- package/dist/workers/proxy/index.js +9 -0
- package/dist/workers/proxy/websocket/client.d.ts +110 -0
- package/dist/workers/proxy/websocket/client.js +196 -0
- package/dist/workers/proxy/websocket/index.d.ts +3 -0
- package/dist/workers/proxy/websocket/index.js +10 -0
- package/dist/workers/runner.d.ts +268 -0
- package/dist/workers/runner.js +489 -0
- package/dist/workers/ui/index.d.ts +22 -0
- package/dist/workers/ui/index.js +27 -0
- package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
- package/dist/workers/ui/ui_event_decorator.js +75 -0
- package/dist/workers/ui/ui_job_context.d.ts +12 -0
- package/dist/workers/ui/ui_job_context.js +17 -0
- package/dist/workers/ui/ui_prompts.d.ts +21 -0
- package/dist/workers/ui/ui_prompts.js +41 -0
- package/dist/workers/ui/ui_tools.d.ts +32 -0
- package/dist/workers/ui/ui_tools.js +112 -0
- package/dist/workers/ui/ui_worker.d.ts +571 -0
- package/dist/workers/ui/ui_worker.js +1156 -0
- package/package.json +61 -3
- package/README.md +0 -5
|
@@ -0,0 +1,450 @@
|
|
|
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/pipeline/job_context.py
|
|
6
|
+
/**
|
|
7
|
+
* Worker group types for structured concurrent worker execution.
|
|
8
|
+
*
|
|
9
|
+
* Porting notes:
|
|
10
|
+
* - `async with ctx:` becomes `await ctx.run(async (ctx) => { ... })`, or the
|
|
11
|
+
* explicit `await ctx.enter()` / `await ctx.exit(error)` pair.
|
|
12
|
+
* - `async for event in ctx` is `for await (const event of ctx)`.
|
|
13
|
+
* - The deprecated `resolve_job_params()` (and the per-argument job spelling
|
|
14
|
+
* it absorbs) is not ported.
|
|
15
|
+
*/
|
|
16
|
+
import { Event, Queue, shield } from "@pipedog/asyncio";
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for a job sent to a single worker.
|
|
19
|
+
*
|
|
20
|
+
* - `name`: optional job name, routing the request to the matching
|
|
21
|
+
* `job({ name })` handler on the worker.
|
|
22
|
+
* - `payload`: optional structured data describing the work.
|
|
23
|
+
* - `timeout`: optional timeout in seconds, covering both the wait for the
|
|
24
|
+
* worker to become ready and the job itself.
|
|
25
|
+
* - `label`: optional human-readable description of the work, e.g.
|
|
26
|
+
* `"Research: Radiohead"`. A `UIWorker` titles the client's progress card
|
|
27
|
+
* with it.
|
|
28
|
+
* - `cancellable`: whether an external requester, such as the client UI, may
|
|
29
|
+
* ask for the job to be cancelled. Cancellation the worker initiates itself
|
|
30
|
+
* (shutdown, timeout, `cancelOnError`) proceeds either way.
|
|
31
|
+
*/
|
|
32
|
+
export class JobParams {
|
|
33
|
+
name;
|
|
34
|
+
payload;
|
|
35
|
+
timeout;
|
|
36
|
+
label;
|
|
37
|
+
cancellable;
|
|
38
|
+
constructor(options = {}) {
|
|
39
|
+
this.name = options.name ?? null;
|
|
40
|
+
this.payload = options.payload ?? null;
|
|
41
|
+
this.timeout = options.timeout ?? null;
|
|
42
|
+
this.label = options.label ?? null;
|
|
43
|
+
this.cancellable = options.cancellable ?? true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Configuration for a job sent to several workers at once.
|
|
48
|
+
*
|
|
49
|
+
* Carries every `JobParams` field, which apply to the group as a whole, plus
|
|
50
|
+
* how the group reacts to one of its workers failing.
|
|
51
|
+
*
|
|
52
|
+
* - `cancelOnError`: whether a worker responding with an error status cancels
|
|
53
|
+
* the rest of the group.
|
|
54
|
+
*/
|
|
55
|
+
export class JobGroupParams extends JobParams {
|
|
56
|
+
cancelOnError;
|
|
57
|
+
constructor(options = {}) {
|
|
58
|
+
super(options);
|
|
59
|
+
this.cancelOnError = options.cancelOnError ?? true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Status of a completed worker.
|
|
64
|
+
*
|
|
65
|
+
* String values, so they compare naturally with plain strings and serialize
|
|
66
|
+
* without extra handling.
|
|
67
|
+
*
|
|
68
|
+
* - `COMPLETED`: the worker finished successfully.
|
|
69
|
+
* - `CANCELLED`: the worker was cancelled by the requester.
|
|
70
|
+
* - `FAILED`: the worker failed due to a logical or business error.
|
|
71
|
+
* - `ERROR`: the worker encountered an unexpected runtime error.
|
|
72
|
+
*/
|
|
73
|
+
export const JobStatus = {
|
|
74
|
+
COMPLETED: "completed",
|
|
75
|
+
CANCELLED: "cancelled",
|
|
76
|
+
FAILED: "failed",
|
|
77
|
+
ERROR: "error",
|
|
78
|
+
};
|
|
79
|
+
/** Raised when a worker is cancelled due to a worker error or timeout. */
|
|
80
|
+
export class JobError extends Error {
|
|
81
|
+
name = "JobError";
|
|
82
|
+
}
|
|
83
|
+
/** Raised when a worker group is cancelled due to a worker error or timeout. */
|
|
84
|
+
export class JobGroupError extends Error {
|
|
85
|
+
name = "JobGroupError";
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Collected results from a completed job group.
|
|
89
|
+
*
|
|
90
|
+
* - `jobId`: the shared job identifier.
|
|
91
|
+
* - `responses`: collected responses keyed by worker name.
|
|
92
|
+
*/
|
|
93
|
+
export class JobGroupResponse {
|
|
94
|
+
jobId;
|
|
95
|
+
responses;
|
|
96
|
+
constructor(options) {
|
|
97
|
+
this.jobId = options.jobId;
|
|
98
|
+
this.responses = options.responses;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* An event received from a worker during a single-worker job.
|
|
103
|
+
*
|
|
104
|
+
* - `type`: the event type.
|
|
105
|
+
* - `data`: optional event payload.
|
|
106
|
+
*/
|
|
107
|
+
export class JobEvent {
|
|
108
|
+
static UPDATE = "update";
|
|
109
|
+
static STREAM_START = "stream_start";
|
|
110
|
+
static STREAM_DATA = "stream_data";
|
|
111
|
+
static STREAM_END = "stream_end";
|
|
112
|
+
type;
|
|
113
|
+
data;
|
|
114
|
+
constructor(options) {
|
|
115
|
+
this.type = options.type;
|
|
116
|
+
this.data = options.data ?? null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* An event received from a worker during job group execution.
|
|
121
|
+
*
|
|
122
|
+
* - `type`: the event type.
|
|
123
|
+
* - `workerName`: the name of the worker that sent the event.
|
|
124
|
+
* - `data`: optional event payload.
|
|
125
|
+
*/
|
|
126
|
+
export class JobGroupEvent {
|
|
127
|
+
static UPDATE = "update";
|
|
128
|
+
static STREAM_START = "stream_start";
|
|
129
|
+
static STREAM_DATA = "stream_data";
|
|
130
|
+
static STREAM_END = "stream_end";
|
|
131
|
+
type;
|
|
132
|
+
workerName;
|
|
133
|
+
data;
|
|
134
|
+
constructor(options) {
|
|
135
|
+
this.type = options.type;
|
|
136
|
+
this.workerName = options.workerName;
|
|
137
|
+
this.data = options.data ?? null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Tracks a group of workers launched together.
|
|
142
|
+
*
|
|
143
|
+
* - `jobId`: shared identifier for all workers in this group.
|
|
144
|
+
* - `workerNames`: names of the workers in the group, in dispatch order.
|
|
145
|
+
* - `responses`: collected responses keyed by worker name.
|
|
146
|
+
* - `timeoutTask`: optional task that cancels the group on timeout.
|
|
147
|
+
* - `cancelOnError`: whether to cancel the group if a worker errors.
|
|
148
|
+
* - `label`: optional human-readable description of the work, from
|
|
149
|
+
* `JobGroupParams.label`.
|
|
150
|
+
* - `cancellable`: whether an external requester may ask for the group to be
|
|
151
|
+
* cancelled, from `JobGroupParams.cancellable`.
|
|
152
|
+
* - `terminated`: names of the workers that have reached a terminal state,
|
|
153
|
+
* whether by responding or by ending their stream.
|
|
154
|
+
* - `eventQueue`: optional queue for streaming events to a `JobGroupContext`
|
|
155
|
+
* async iterator.
|
|
156
|
+
*/
|
|
157
|
+
export class JobGroup {
|
|
158
|
+
jobId;
|
|
159
|
+
workerNames;
|
|
160
|
+
responses;
|
|
161
|
+
timeoutTask;
|
|
162
|
+
cancelOnError;
|
|
163
|
+
label;
|
|
164
|
+
cancellable;
|
|
165
|
+
terminated;
|
|
166
|
+
eventQueue;
|
|
167
|
+
_done = new Event();
|
|
168
|
+
_error = null;
|
|
169
|
+
constructor(options) {
|
|
170
|
+
this.jobId = options.jobId;
|
|
171
|
+
this.workerNames = options.workerNames;
|
|
172
|
+
this.responses = options.responses ?? {};
|
|
173
|
+
this.timeoutTask = options.timeoutTask ?? null;
|
|
174
|
+
this.cancelOnError = options.cancelOnError ?? true;
|
|
175
|
+
this.label = options.label ?? null;
|
|
176
|
+
this.cancellable = options.cancellable ?? true;
|
|
177
|
+
this.terminated = options.terminated ?? new Set();
|
|
178
|
+
this.eventQueue = options.eventQueue ?? null;
|
|
179
|
+
}
|
|
180
|
+
/** Whether the group has completed or failed. */
|
|
181
|
+
get isDone() {
|
|
182
|
+
return this._done.isSet();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Wait for all workers in the group to respond.
|
|
186
|
+
*
|
|
187
|
+
* @throws JobGroupError If the group was cancelled due to error or timeout.
|
|
188
|
+
*/
|
|
189
|
+
async wait() {
|
|
190
|
+
await this._done.wait();
|
|
191
|
+
if (this._error) {
|
|
192
|
+
throw new JobGroupError(this._error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Signal that all workers have responded. */
|
|
196
|
+
complete() {
|
|
197
|
+
this._done.set();
|
|
198
|
+
if (this.eventQueue) {
|
|
199
|
+
this.eventQueue.putNowait(null);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Signal that the group was cancelled.
|
|
204
|
+
*
|
|
205
|
+
* @param reason Human-readable reason for the failure.
|
|
206
|
+
*/
|
|
207
|
+
fail(reason = null) {
|
|
208
|
+
this._error = reason;
|
|
209
|
+
this._done.set();
|
|
210
|
+
if (this.eventQueue) {
|
|
211
|
+
this.eventQueue.putNowait(null);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
toString() {
|
|
215
|
+
return `JobGroup(job_id=${this.jobId}, worker_names=${JSON.stringify(this.workerNames)})`;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Async context manager and iterator for structured job group execution.
|
|
220
|
+
*
|
|
221
|
+
* Sends job requests on enter, waits for all responses on exit. Supports
|
|
222
|
+
* `for await` to receive intermediate events (updates and streaming data)
|
|
223
|
+
* from workers while waiting for completion.
|
|
224
|
+
*
|
|
225
|
+
* On normal completion, results are available via `responses`. On worker
|
|
226
|
+
* error (with `cancelOnError: true`) or timeout, throws `JobGroupError`. If
|
|
227
|
+
* the block throws, remaining jobs are cancelled.
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* const tg = this.jobGroup(["w1", "w2"], { params: new JobGroupParams({ payload: data }) });
|
|
231
|
+
* await tg.run(async (tg) => {
|
|
232
|
+
* for await (const event of tg) {
|
|
233
|
+
* console.log(`${event.workerName} [${event.type}]:`, event.data);
|
|
234
|
+
* }
|
|
235
|
+
* });
|
|
236
|
+
*
|
|
237
|
+
* for (const [name, result] of Object.entries(tg.responses)) {
|
|
238
|
+
* console.log(name, result);
|
|
239
|
+
* }
|
|
240
|
+
*/
|
|
241
|
+
export class JobGroupContext {
|
|
242
|
+
_worker;
|
|
243
|
+
_workerNames;
|
|
244
|
+
_params;
|
|
245
|
+
_group = null;
|
|
246
|
+
/**
|
|
247
|
+
* Initialize the JobGroupContext.
|
|
248
|
+
*
|
|
249
|
+
* @param worker The parent `BaseWorker` that owns this job group.
|
|
250
|
+
* @param workerNames Names of the workers to send the job to.
|
|
251
|
+
* @param options.params How to run the group. Defaults to `JobGroupParams` defaults.
|
|
252
|
+
*/
|
|
253
|
+
constructor(worker, workerNames, options = {}) {
|
|
254
|
+
this._worker = worker;
|
|
255
|
+
this._workerNames = workerNames;
|
|
256
|
+
this._params = options.params ?? new JobGroupParams();
|
|
257
|
+
}
|
|
258
|
+
/** The shared job identifier for this group. */
|
|
259
|
+
get jobId() {
|
|
260
|
+
if (!this._group) {
|
|
261
|
+
throw new Error("Job group has not been started");
|
|
262
|
+
}
|
|
263
|
+
return this._group.jobId;
|
|
264
|
+
}
|
|
265
|
+
/** Collected responses keyed by worker name. */
|
|
266
|
+
get responses() {
|
|
267
|
+
if (!this._group) {
|
|
268
|
+
throw new Error("Job group has not been started");
|
|
269
|
+
}
|
|
270
|
+
return this._group.responses;
|
|
271
|
+
}
|
|
272
|
+
async *[Symbol.asyncIterator]() {
|
|
273
|
+
for (;;) {
|
|
274
|
+
if (!this._group?.eventQueue)
|
|
275
|
+
return;
|
|
276
|
+
const event = await this._group.eventQueue.get();
|
|
277
|
+
if (event === null)
|
|
278
|
+
return;
|
|
279
|
+
yield event;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/** Send the job requests (`__aenter__`). */
|
|
283
|
+
async enter() {
|
|
284
|
+
const group = await this._worker.createJobGroupAndRequestJob([...this._workerNames], {
|
|
285
|
+
params: this._params,
|
|
286
|
+
});
|
|
287
|
+
group.eventQueue = new Queue();
|
|
288
|
+
this._group = group;
|
|
289
|
+
return this;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Leave the block (`__aexit__`): cancel the remaining jobs if the block
|
|
293
|
+
* threw, otherwise wait for every response.
|
|
294
|
+
*
|
|
295
|
+
* @param error What the block threw, if anything (`undefined` when it
|
|
296
|
+
* completed normally).
|
|
297
|
+
*/
|
|
298
|
+
async exit(error) {
|
|
299
|
+
if (error !== undefined) {
|
|
300
|
+
if (this._group && this._worker.jobGroups.has(this._group.jobId)) {
|
|
301
|
+
// Shield the cleanup so it completes even if the surrounding worker
|
|
302
|
+
// is being cancelled (e.g. tool interruption).
|
|
303
|
+
const jobId = this._group.jobId;
|
|
304
|
+
await shield(() => this._worker.cancelJobGroup(jobId, { reason: "context exited with error" }));
|
|
305
|
+
}
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
if (this._group === null)
|
|
309
|
+
throw new Error("Job group has not been started");
|
|
310
|
+
await this._group.wait();
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Run `fn` inside the context, as `async with` does: enter, run the block,
|
|
314
|
+
* then exit. An error thrown by the block cancels the group and is
|
|
315
|
+
* re-thrown.
|
|
316
|
+
*/
|
|
317
|
+
async run(fn) {
|
|
318
|
+
await this.enter();
|
|
319
|
+
let result;
|
|
320
|
+
try {
|
|
321
|
+
result = await fn(this);
|
|
322
|
+
}
|
|
323
|
+
catch (e) {
|
|
324
|
+
await this.exit(e ?? new Error("context exited with error"));
|
|
325
|
+
throw e;
|
|
326
|
+
}
|
|
327
|
+
await this.exit();
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Async context manager and iterator for a single-worker job.
|
|
333
|
+
*
|
|
334
|
+
* Sends a job request on enter, waits for the response on exit. Supports
|
|
335
|
+
* `for await` to receive intermediate events (updates and streaming data)
|
|
336
|
+
* from the worker while waiting for completion.
|
|
337
|
+
*
|
|
338
|
+
* On normal completion, the result is available via `response`. On worker
|
|
339
|
+
* error or timeout, throws `JobError`. If the block throws, the job is
|
|
340
|
+
* cancelled.
|
|
341
|
+
*
|
|
342
|
+
* @example
|
|
343
|
+
* const t = this.job("worker", { params: new JobParams({ payload: data }) });
|
|
344
|
+
* await t.run(async (t) => {
|
|
345
|
+
* for await (const event of t) {
|
|
346
|
+
* console.log(`[${event.type}]:`, event.data);
|
|
347
|
+
* }
|
|
348
|
+
* });
|
|
349
|
+
*
|
|
350
|
+
* console.log(t.response);
|
|
351
|
+
*/
|
|
352
|
+
export class JobContext {
|
|
353
|
+
_worker;
|
|
354
|
+
_workerName;
|
|
355
|
+
_params;
|
|
356
|
+
_group = null;
|
|
357
|
+
/**
|
|
358
|
+
* Initialize the JobContext.
|
|
359
|
+
*
|
|
360
|
+
* @param worker The parent `BaseWorker` that owns this job.
|
|
361
|
+
* @param workerName Name of the worker to send the job to.
|
|
362
|
+
* @param options.params How to run the job. Defaults to `JobParams` defaults.
|
|
363
|
+
*/
|
|
364
|
+
constructor(worker, workerName, options = {}) {
|
|
365
|
+
this._worker = worker;
|
|
366
|
+
this._workerName = workerName;
|
|
367
|
+
this._params = options.params ?? new JobParams();
|
|
368
|
+
}
|
|
369
|
+
/** The job identifier. */
|
|
370
|
+
get jobId() {
|
|
371
|
+
if (!this._group) {
|
|
372
|
+
throw new Error("Job has not been started");
|
|
373
|
+
}
|
|
374
|
+
return this._group.jobId;
|
|
375
|
+
}
|
|
376
|
+
/** The worker's response payload. */
|
|
377
|
+
get response() {
|
|
378
|
+
if (!this._group) {
|
|
379
|
+
throw new Error("Job has not been started");
|
|
380
|
+
}
|
|
381
|
+
return this._group.responses[this._workerName] ?? {};
|
|
382
|
+
}
|
|
383
|
+
async *[Symbol.asyncIterator]() {
|
|
384
|
+
for (;;) {
|
|
385
|
+
if (!this._group?.eventQueue)
|
|
386
|
+
return;
|
|
387
|
+
const event = await this._group.eventQueue.get();
|
|
388
|
+
if (event === null)
|
|
389
|
+
return;
|
|
390
|
+
yield new JobEvent({ type: event.type, data: event.data });
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/** Send the job request (`__aenter__`). */
|
|
394
|
+
async enter() {
|
|
395
|
+
const group = await this._worker.createJobGroupAndRequestJob([this._workerName], {
|
|
396
|
+
params: new JobGroupParams({ ...this._params }),
|
|
397
|
+
});
|
|
398
|
+
group.eventQueue = new Queue();
|
|
399
|
+
this._group = group;
|
|
400
|
+
return this;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Leave the block (`__aexit__`): cancel the job if the block threw,
|
|
404
|
+
* otherwise wait for the response.
|
|
405
|
+
*
|
|
406
|
+
* @param error What the block threw, if anything (`undefined` when it
|
|
407
|
+
* completed normally).
|
|
408
|
+
* @throws JobError If the worker failed or timed out.
|
|
409
|
+
*/
|
|
410
|
+
async exit(error) {
|
|
411
|
+
if (error !== undefined) {
|
|
412
|
+
if (this._group && this._worker.jobGroups.has(this._group.jobId)) {
|
|
413
|
+
// Shield the cleanup so it completes even if the surrounding worker
|
|
414
|
+
// is being cancelled (e.g. tool interruption).
|
|
415
|
+
const jobId = this._group.jobId;
|
|
416
|
+
await shield(() => this._worker.cancelJobGroup(jobId, { reason: "context exited with error" }));
|
|
417
|
+
}
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
if (this._group === null)
|
|
421
|
+
throw new Error("Job has not been started");
|
|
422
|
+
try {
|
|
423
|
+
await this._group.wait();
|
|
424
|
+
}
|
|
425
|
+
catch (e) {
|
|
426
|
+
if (e instanceof JobGroupError) {
|
|
427
|
+
throw new JobError(e.message, { cause: e });
|
|
428
|
+
}
|
|
429
|
+
throw e;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Run `fn` inside the context, as `async with` does: enter, run the block,
|
|
434
|
+
* then exit. An error thrown by the block cancels the job and is re-thrown.
|
|
435
|
+
*/
|
|
436
|
+
async run(fn) {
|
|
437
|
+
await this.enter();
|
|
438
|
+
let result;
|
|
439
|
+
try {
|
|
440
|
+
result = await fn(this);
|
|
441
|
+
}
|
|
442
|
+
catch (e) {
|
|
443
|
+
await this.exit(e ?? new Error("context exited with error"));
|
|
444
|
+
throw e;
|
|
445
|
+
}
|
|
446
|
+
await this.exit();
|
|
447
|
+
return result;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=job_context.js.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Decorator for marking worker methods as job handlers. */
|
|
2
|
+
type AnyFn = (...args: any[]) => any;
|
|
3
|
+
/** A function marked by `job()`. */
|
|
4
|
+
export type JobHandler<F extends AnyFn = AnyFn> = F & {
|
|
5
|
+
isJobHandler: true;
|
|
6
|
+
jobName: string;
|
|
7
|
+
jobSequential: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Mark a worker method as a job handler.
|
|
11
|
+
*
|
|
12
|
+
* Decorated methods are automatically collected by `BaseWorker` at
|
|
13
|
+
* initialization and dispatched when matching job requests arrive. Each
|
|
14
|
+
* request runs in its own task so the bus message loop is never blocked.
|
|
15
|
+
*
|
|
16
|
+
* The returned decorator works both as a standard (TC39) method decorator and
|
|
17
|
+
* as a plain function, since runtimes that strip types (Node) do not run
|
|
18
|
+
* decorator syntax.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* class MyWorker extends BaseWorker {
|
|
22
|
+
* async onResearch(message: BusJobRequestMessage): Promise<void> { ... }
|
|
23
|
+
* async onWrite(message: BusJobRequestMessage): Promise<void> { ... }
|
|
24
|
+
* static {
|
|
25
|
+
* job({ name: "research" })(this.prototype.onResearch);
|
|
26
|
+
* job({ name: "write", sequential: true })(this.prototype.onWrite);
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* @param options.name Job name to match. The handler only receives requests
|
|
31
|
+
* with a matching name.
|
|
32
|
+
* @param options.sequential When true, requests with this name run one at a
|
|
33
|
+
* time in FIFO order. Concurrent requests wait for the previous one to
|
|
34
|
+
* finish before running. When false (the default), multiple requests run
|
|
35
|
+
* concurrently. The wait time counts against the requester's timeout, so a
|
|
36
|
+
* slow predecessor can cause queued requests to time out before they start.
|
|
37
|
+
*/
|
|
38
|
+
export declare function job(options: {
|
|
39
|
+
name: string;
|
|
40
|
+
sequential?: boolean;
|
|
41
|
+
}): <F extends AnyFn>(fn: F, _context?: unknown) => F;
|
|
42
|
+
/**
|
|
43
|
+
* Collect all `job` decorated bound methods from an object.
|
|
44
|
+
*
|
|
45
|
+
* Walks the prototype chain from the object's own class up, so an override in
|
|
46
|
+
* a subclass shadows the parent's method of the same name.
|
|
47
|
+
*
|
|
48
|
+
* @returns A map from job name to the bound method. Each bound method keeps
|
|
49
|
+
* the `jobSequential` flag of the decorated function.
|
|
50
|
+
* @throws Error If two handlers handle the same job name.
|
|
51
|
+
*/
|
|
52
|
+
export declare function _collectJobHandlers(obj: object): Map<string, AnyFn>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=job_decorator.d.ts.map
|
|
@@ -0,0 +1,92 @@
|
|
|
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/pipeline/job_decorator.py
|
|
6
|
+
/**
|
|
7
|
+
* Mark a worker method as a job handler.
|
|
8
|
+
*
|
|
9
|
+
* Decorated methods are automatically collected by `BaseWorker` at
|
|
10
|
+
* initialization and dispatched when matching job requests arrive. Each
|
|
11
|
+
* request runs in its own task so the bus message loop is never blocked.
|
|
12
|
+
*
|
|
13
|
+
* The returned decorator works both as a standard (TC39) method decorator and
|
|
14
|
+
* as a plain function, since runtimes that strip types (Node) do not run
|
|
15
|
+
* decorator syntax.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* class MyWorker extends BaseWorker {
|
|
19
|
+
* async onResearch(message: BusJobRequestMessage): Promise<void> { ... }
|
|
20
|
+
* async onWrite(message: BusJobRequestMessage): Promise<void> { ... }
|
|
21
|
+
* static {
|
|
22
|
+
* job({ name: "research" })(this.prototype.onResearch);
|
|
23
|
+
* job({ name: "write", sequential: true })(this.prototype.onWrite);
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* @param options.name Job name to match. The handler only receives requests
|
|
28
|
+
* with a matching name.
|
|
29
|
+
* @param options.sequential When true, requests with this name run one at a
|
|
30
|
+
* time in FIFO order. Concurrent requests wait for the previous one to
|
|
31
|
+
* finish before running. When false (the default), multiple requests run
|
|
32
|
+
* concurrently. The wait time counts against the requester's timeout, so a
|
|
33
|
+
* slow predecessor can cause queued requests to time out before they start.
|
|
34
|
+
*/
|
|
35
|
+
export function job(options) {
|
|
36
|
+
const name = options.name;
|
|
37
|
+
const sequential = options.sequential ?? false;
|
|
38
|
+
return function decorator(fn, _context) {
|
|
39
|
+
const handler = fn;
|
|
40
|
+
handler.isJobHandler = true;
|
|
41
|
+
handler.jobName = name;
|
|
42
|
+
handler.jobSequential = sequential;
|
|
43
|
+
return fn;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Collect all `job` decorated bound methods from an object.
|
|
48
|
+
*
|
|
49
|
+
* Walks the prototype chain from the object's own class up, so an override in
|
|
50
|
+
* a subclass shadows the parent's method of the same name.
|
|
51
|
+
*
|
|
52
|
+
* @returns A map from job name to the bound method. Each bound method keeps
|
|
53
|
+
* the `jobSequential` flag of the decorated function.
|
|
54
|
+
* @throws Error If two handlers handle the same job name.
|
|
55
|
+
*/
|
|
56
|
+
export function _collectJobHandlers(obj) {
|
|
57
|
+
const seen = new Set();
|
|
58
|
+
const handlers = new Map();
|
|
59
|
+
const handlerNames = new Map();
|
|
60
|
+
let proto = Object.getPrototypeOf(obj);
|
|
61
|
+
while (proto !== null && proto !== Object.prototype) {
|
|
62
|
+
for (const attrName of Object.getOwnPropertyNames(proto)) {
|
|
63
|
+
if (seen.has(attrName)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
seen.add(attrName);
|
|
67
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, attrName);
|
|
68
|
+
// Skip accessors so collecting never runs a getter.
|
|
69
|
+
const val = descriptor && "value" in descriptor ? descriptor.value : undefined;
|
|
70
|
+
if (typeof val === "function" && val.isJobHandler === true) {
|
|
71
|
+
const jobName = val.jobName;
|
|
72
|
+
if (handlers.has(jobName)) {
|
|
73
|
+
const existing = handlerNames.get(jobName);
|
|
74
|
+
throw new Error(`Duplicate @job handler for '${jobName}': ` +
|
|
75
|
+
`'${attrName}' conflicts with '${existing}'`);
|
|
76
|
+
}
|
|
77
|
+
const method = obj[attrName];
|
|
78
|
+
// Python's bound method still exposes the function's attributes
|
|
79
|
+
// (`handler.job_sequential`); copy them onto the bound function.
|
|
80
|
+
const bound = method.bind(obj);
|
|
81
|
+
bound.isJobHandler = true;
|
|
82
|
+
bound.jobName = jobName;
|
|
83
|
+
bound.jobSequential = val.jobSequential;
|
|
84
|
+
handlers.set(jobName, bound);
|
|
85
|
+
handlerNames.set(jobName, attrName);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
proto = Object.getPrototypeOf(proto);
|
|
89
|
+
}
|
|
90
|
+
return handlers;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=job_decorator.js.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/** LLM switcher for switching between different LLMs at runtime, with different switching strategies. */
|
|
2
|
+
import { type Frame } from "../frames/frames.ts";
|
|
3
|
+
import type { LLMContext } from "../processors/aggregators/llm_context.ts";
|
|
4
|
+
import type { FrameDirection } from "../processors/frame_processor.ts";
|
|
5
|
+
import type { FunctionCallHandler, LLMService } from "../services/llm_service.ts";
|
|
6
|
+
import { ServiceSwitcher, type ServiceSwitcherOptions, type ServiceSwitcherStrategy, type ServiceSwitcherStrategyManual } from "./service_switcher.ts";
|
|
7
|
+
type AnyLLMService = LLMService<any>;
|
|
8
|
+
/** Options forwarded to the active LLM's `runInference()`. */
|
|
9
|
+
export type LLMSwitcherRunInferenceOptions = Parameters<AnyLLMService["runInference"]>[1];
|
|
10
|
+
/**
|
|
11
|
+
* A pipeline that switches between different LLMs at runtime.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const llmSwitcher = new LLMSwitcher([openaiLlm, anthropicLlm]);
|
|
15
|
+
*/
|
|
16
|
+
export declare class LLMSwitcher<S extends ServiceSwitcherStrategy = ServiceSwitcherStrategyManual> extends ServiceSwitcher<S> {
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the service switcher with a list of LLMs and a switching strategy.
|
|
19
|
+
*
|
|
20
|
+
* @param llms List of LLM services to switch between.
|
|
21
|
+
* @param options.strategyType The strategy class to use for switching
|
|
22
|
+
* between LLMs. Defaults to `ServiceSwitcherStrategyManual`.
|
|
23
|
+
*/
|
|
24
|
+
constructor(llms: AnyLLMService[], options?: ServiceSwitcherOptions<S>);
|
|
25
|
+
/**
|
|
26
|
+
* Process a frame, syncing context tool handlers on all member LLMs.
|
|
27
|
+
*
|
|
28
|
+
* On an `LLMContextFrame`, the handlers advertised in the context are synced
|
|
29
|
+
* on every member LLM — active or not — so that tools listed via
|
|
30
|
+
* `new LLMContext({ tools: [...] })` keep working across service switches.
|
|
31
|
+
*
|
|
32
|
+
* This is needed because member LLMs sit behind per-branch filters: only the
|
|
33
|
+
* active LLM receives the context frame and would otherwise sync its
|
|
34
|
+
* handlers, leaving inactive LLMs out of step with the advertised tools.
|
|
35
|
+
*
|
|
36
|
+
* @param frame The frame to process.
|
|
37
|
+
* @param direction The direction of frame flow.
|
|
38
|
+
*/
|
|
39
|
+
processFrame(frame: Frame, direction: FrameDirection): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Sync the context's tool handlers on every member LLM.
|
|
42
|
+
*
|
|
43
|
+
* @param tools The advertised tools whose handlers should be synced on all
|
|
44
|
+
* member LLMs.
|
|
45
|
+
*/
|
|
46
|
+
protected _syncRegisteredToolHandlers(tools: unknown): void;
|
|
47
|
+
/** The list of LLMs managed by this switcher. */
|
|
48
|
+
get llms(): AnyLLMService[];
|
|
49
|
+
/** The currently active LLM. */
|
|
50
|
+
get activeLlm(): AnyLLMService;
|
|
51
|
+
/**
|
|
52
|
+
* Run a one-shot, out-of-band (i.e. out-of-pipeline) inference with the
|
|
53
|
+
* given LLM context, using the currently active LLM.
|
|
54
|
+
*
|
|
55
|
+
* @param context The LLM context containing conversation history.
|
|
56
|
+
* @param options Additional options forwarded to the active LLM's
|
|
57
|
+
* `runInference` (e.g. maxTokens, systemInstruction).
|
|
58
|
+
* @returns The LLM's response as a string, or null if no response is generated.
|
|
59
|
+
*/
|
|
60
|
+
runInference(context: LLMContext, options?: LLMSwitcherRunInferenceOptions): Promise<string | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Register a function handler for LLM function calls, on all LLMs, active or not.
|
|
63
|
+
*
|
|
64
|
+
* @param functionName The name of the function to handle. Use null to handle
|
|
65
|
+
* all function calls with a catch-all handler.
|
|
66
|
+
* @param handler The function handler. Should accept a single
|
|
67
|
+
* FunctionCallParams parameter.
|
|
68
|
+
* @param options.cancelOnInterruption Whether to cancel this function call
|
|
69
|
+
* when an interruption occurs. Defaults to null (fall back to the
|
|
70
|
+
* `toolOptions()` value on the handler, then to true).
|
|
71
|
+
* @param options.timeoutSecs Optional timeout in seconds for the function call.
|
|
72
|
+
* @param options.cancellableByLlm Whether the LLM may cancel this call while
|
|
73
|
+
* it runs, through the `cancel_<name>` tool advertised alongside it. Pair
|
|
74
|
+
* it with `cancelOnInterruption: false`. Defaults to null (fall back to the
|
|
75
|
+
* `toolOptions()` value, then to false).
|
|
76
|
+
*/
|
|
77
|
+
registerFunction(functionName: string | null, handler: FunctionCallHandler, options?: {
|
|
78
|
+
cancelOnInterruption?: boolean | null;
|
|
79
|
+
timeoutSecs?: number | null;
|
|
80
|
+
cancellableByLlm?: boolean | null;
|
|
81
|
+
}): void;
|
|
82
|
+
}
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=llm_switcher.d.ts.map
|