@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,219 @@
|
|
|
1
|
+
import { type Frame, LLMContextSummaryRequestFrame, LLMContextSummaryResultFrame, LLMFullResponseStartFrame, LLMSummarizeContextFrame } from "../../frames/frames.ts";
|
|
2
|
+
import type { LLMService } from "../../services/llm_service.ts";
|
|
3
|
+
import { BaseObject } from "../../utils/base_object.ts";
|
|
4
|
+
import { LLMAutoContextSummarizationConfig, type LLMContextSummaryConfig } from "../../utils/context/llm_context_summarization.ts";
|
|
5
|
+
import type { FrameProcessorSetup } from "../frame_processor.ts";
|
|
6
|
+
import { type LLMContext, type LLMContextMessage } from "./llm_context.ts";
|
|
7
|
+
export interface SummaryAppliedEventOptions {
|
|
8
|
+
/** Number of messages before summarization. */
|
|
9
|
+
originalMessageCount: number;
|
|
10
|
+
/** Number of messages after summarization. */
|
|
11
|
+
newMessageCount: number;
|
|
12
|
+
/** Number of messages that were compressed into the summary. */
|
|
13
|
+
summarizedMessageCount: number;
|
|
14
|
+
/** Number of recent messages preserved uncompressed. */
|
|
15
|
+
preservedMessageCount: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Event data emitted when context summarization completes successfully.
|
|
19
|
+
*
|
|
20
|
+
* - `originalMessageCount`: Number of messages before summarization.
|
|
21
|
+
* - `newMessageCount`: Number of messages after summarization.
|
|
22
|
+
* - `summarizedMessageCount`: Number of messages that were compressed into the summary.
|
|
23
|
+
* - `preservedMessageCount`: Number of recent messages preserved uncompressed.
|
|
24
|
+
*/
|
|
25
|
+
export declare class SummaryAppliedEvent {
|
|
26
|
+
originalMessageCount: number;
|
|
27
|
+
newMessageCount: number;
|
|
28
|
+
summarizedMessageCount: number;
|
|
29
|
+
preservedMessageCount: number;
|
|
30
|
+
constructor(options: SummaryAppliedEventOptions);
|
|
31
|
+
}
|
|
32
|
+
export interface LLMContextSummarizerOptions {
|
|
33
|
+
/** The LLM context to monitor and summarize. */
|
|
34
|
+
context: LLMContext;
|
|
35
|
+
/**
|
|
36
|
+
* Auto-summarization configuration controlling both trigger thresholds and
|
|
37
|
+
* default summary generation parameters. If null, uses default
|
|
38
|
+
* `LLMAutoContextSummarizationConfig` values.
|
|
39
|
+
*/
|
|
40
|
+
config?: LLMAutoContextSummarizationConfig | null;
|
|
41
|
+
/**
|
|
42
|
+
* Whether to automatically trigger summarization when thresholds are
|
|
43
|
+
* reached. When false, summarization only happens when an
|
|
44
|
+
* `LLMSummarizeContextFrame` is pushed into the pipeline. Defaults to true.
|
|
45
|
+
*/
|
|
46
|
+
autoTrigger?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Summarizer for managing LLM context summarization.
|
|
50
|
+
*
|
|
51
|
+
* This class manages context summarization, either automatically when token
|
|
52
|
+
* or message limits are reached, or on-demand when an
|
|
53
|
+
* `LLMSummarizeContextFrame` is received. It monitors the LLM context size,
|
|
54
|
+
* triggers summarization requests, and applies the results to compress
|
|
55
|
+
* conversation history.
|
|
56
|
+
*
|
|
57
|
+
* When `autoTrigger` is true (the default), summarization is triggered
|
|
58
|
+
* automatically based on the configured thresholds in
|
|
59
|
+
* `LLMAutoContextSummarizationConfig`. When `autoTrigger` is false, threshold
|
|
60
|
+
* checks are skipped and summarization only happens when an
|
|
61
|
+
* `LLMSummarizeContextFrame` is explicitly pushed into the pipeline.
|
|
62
|
+
*
|
|
63
|
+
* Both modes can coexist: set `autoTrigger: true` and also push
|
|
64
|
+
* `LLMSummarizeContextFrame` at any time to force an immediate summarization
|
|
65
|
+
* (subject to the `_summarizationInProgress` guard).
|
|
66
|
+
*
|
|
67
|
+
* Event handlers available:
|
|
68
|
+
*
|
|
69
|
+
* - on_request_summarization: Emitted when summarization should be triggered.
|
|
70
|
+
* The aggregator should broadcast this frame to the LLM service.
|
|
71
|
+
* - on_summary_applied: Emitted after a summary has been successfully applied
|
|
72
|
+
* to the context. Receives a SummaryAppliedEvent with metrics about the
|
|
73
|
+
* compression.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* summarizer.eventHandler("on_request_summarization", async (summarizer, frame: LLMContextSummaryRequestFrame) => {
|
|
77
|
+
* await aggregator.broadcastFrame(LLMContextSummaryRequestFrame, {
|
|
78
|
+
* requestId: frame.requestId,
|
|
79
|
+
* context: frame.context,
|
|
80
|
+
* // ...
|
|
81
|
+
* });
|
|
82
|
+
* });
|
|
83
|
+
*
|
|
84
|
+
* summarizer.eventHandler("on_summary_applied", async (summarizer, event: SummaryAppliedEvent) => {
|
|
85
|
+
* logger.info(`Compressed ${event.originalMessageCount} -> ${event.newMessageCount} messages`);
|
|
86
|
+
* });
|
|
87
|
+
*/
|
|
88
|
+
export declare class LLMContextSummarizer extends BaseObject {
|
|
89
|
+
protected _context: LLMContext;
|
|
90
|
+
protected _autoConfig: LLMAutoContextSummarizationConfig;
|
|
91
|
+
protected _autoTrigger: boolean;
|
|
92
|
+
protected _summarizationInProgress: boolean;
|
|
93
|
+
protected _pendingSummaryRequestId: string | null;
|
|
94
|
+
protected _summaryMessage: LLMContextMessage | null;
|
|
95
|
+
/** Initialize the context summarizer. */
|
|
96
|
+
constructor(options: LLMContextSummarizerOptions);
|
|
97
|
+
/**
|
|
98
|
+
* Return 1 if the first message is a system message, else 0.
|
|
99
|
+
*
|
|
100
|
+
* Mirrors the messages[0] system-message check used elsewhere when
|
|
101
|
+
* selecting messages to summarize and when reconstructing the context after
|
|
102
|
+
* a summary, so the message count stays consistent with what those steps
|
|
103
|
+
* actually preserve.
|
|
104
|
+
*
|
|
105
|
+
* @param messages The context messages to check.
|
|
106
|
+
* @returns 1 if `messages[0]` is a system message, otherwise 0.
|
|
107
|
+
*/
|
|
108
|
+
protected static _leadingSystemMessageCount(messages: LLMContextMessage[]): number;
|
|
109
|
+
/**
|
|
110
|
+
* Count the conversation messages added since the last applied summary.
|
|
111
|
+
*
|
|
112
|
+
* Excludes the leading system message, if present, and the summary message
|
|
113
|
+
* injected by the last summary while it still sits directly after it. Both
|
|
114
|
+
* are computed from the current context so that replacing the messages (for
|
|
115
|
+
* example, resetting the conversation) resets the count as well.
|
|
116
|
+
*
|
|
117
|
+
* @returns The number of messages that count toward `maxUnsummarizedMessages`.
|
|
118
|
+
*/
|
|
119
|
+
protected _messagesSinceSummary(): number;
|
|
120
|
+
/**
|
|
121
|
+
* Set up the summarizer.
|
|
122
|
+
*
|
|
123
|
+
* @param setup Configuration object containing setup parameters.
|
|
124
|
+
*/
|
|
125
|
+
setup(setup: FrameProcessorSetup | unknown): Promise<void>;
|
|
126
|
+
/** Cleanup the summarizer. */
|
|
127
|
+
cleanup(): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Process an incoming frame to detect when summarization is needed.
|
|
130
|
+
*
|
|
131
|
+
* @param frame The frame to be processed.
|
|
132
|
+
*/
|
|
133
|
+
processFrame(frame: Frame): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* Handle LLM response start to check if summarization is needed.
|
|
136
|
+
*
|
|
137
|
+
* @param frame The LLM response start frame.
|
|
138
|
+
*/
|
|
139
|
+
protected _handleLlmResponseStart(_frame: LLMFullResponseStartFrame): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Handle an explicit on-demand summarization request.
|
|
142
|
+
*
|
|
143
|
+
* Reuses the same `_requestSummarization()` code path as auto mode, so
|
|
144
|
+
* bookkeeping (`_summarizationInProgress`, `_pendingSummaryRequestId`) is
|
|
145
|
+
* always updated correctly.
|
|
146
|
+
*
|
|
147
|
+
* @param frame The manual summarization request frame, optionally carrying
|
|
148
|
+
* a per-request LLMContextSummaryConfig.
|
|
149
|
+
*/
|
|
150
|
+
protected _handleManualSummarizationRequest(frame: LLMSummarizeContextFrame): Promise<void>;
|
|
151
|
+
/** Handle interruption by canceling summarization in progress. */
|
|
152
|
+
protected _handleInterruption(): Promise<void>;
|
|
153
|
+
/** Cancel pending summarization. */
|
|
154
|
+
protected _clearSummarizationState(): Promise<void>;
|
|
155
|
+
/**
|
|
156
|
+
* Determine if context summarization should be triggered.
|
|
157
|
+
*
|
|
158
|
+
* Evaluates whether the current context has reached either the token
|
|
159
|
+
* threshold or message count threshold that warrants compression. Either
|
|
160
|
+
* threshold can be null to disable that check; at least one must be set
|
|
161
|
+
* (enforced at config construction time).
|
|
162
|
+
*
|
|
163
|
+
* @returns True when `autoTrigger` is enabled, no summarization is in
|
|
164
|
+
* progress, and either the token count exceeds `maxContextTokens` or the
|
|
165
|
+
* message count since the last summary exceeds `maxUnsummarizedMessages`
|
|
166
|
+
* (whichever of the two is set).
|
|
167
|
+
*/
|
|
168
|
+
protected _shouldSummarize(): boolean;
|
|
169
|
+
/**
|
|
170
|
+
* Request context summarization from LLM service.
|
|
171
|
+
*
|
|
172
|
+
* Creates a summarization request frame and either handles it directly
|
|
173
|
+
* using a dedicated LLM (if configured) or emits it via event handler for
|
|
174
|
+
* the pipeline's primary LLM. Tracks the request ID to match async
|
|
175
|
+
* responses and prevent race conditions.
|
|
176
|
+
*
|
|
177
|
+
* @param configOverride Optional per-request summary configuration. If
|
|
178
|
+
* provided, overrides the default summary generation settings from
|
|
179
|
+
* `this._autoConfig.summaryConfig`.
|
|
180
|
+
*/
|
|
181
|
+
protected _requestSummarization(configOverride?: LLMContextSummaryConfig | null): Promise<void>;
|
|
182
|
+
/**
|
|
183
|
+
* Generate summary using a dedicated LLM service.
|
|
184
|
+
*
|
|
185
|
+
* Calls the dedicated LLM's `_generateSummary` directly and feeds the
|
|
186
|
+
* result back through `_handleSummaryResult`, bypassing the pipeline.
|
|
187
|
+
*
|
|
188
|
+
* @param llm The dedicated LLM service to use for summarization.
|
|
189
|
+
* @param frame The summarization request frame.
|
|
190
|
+
*/
|
|
191
|
+
protected _generateSummaryWithDedicatedLlm(llm: LLMService, frame: LLMContextSummaryRequestFrame): Promise<void>;
|
|
192
|
+
/**
|
|
193
|
+
* Handle context summarization result from LLM service.
|
|
194
|
+
*
|
|
195
|
+
* Processes the summary result by validating the request ID, checking for
|
|
196
|
+
* errors, validating context state, and applying the summary.
|
|
197
|
+
*
|
|
198
|
+
* @param frame The summary result frame containing the generated summary.
|
|
199
|
+
*/
|
|
200
|
+
protected _handleSummaryResult(frame: LLMContextSummaryResultFrame): Promise<void>;
|
|
201
|
+
/**
|
|
202
|
+
* Validate that context state is still valid for applying summary.
|
|
203
|
+
*
|
|
204
|
+
* @param lastSummarizedIndex The index of the last summarized message.
|
|
205
|
+
* @returns True if the context state is still consistent with the summary.
|
|
206
|
+
*/
|
|
207
|
+
protected _validateSummaryContext(lastSummarizedIndex: number): boolean;
|
|
208
|
+
/**
|
|
209
|
+
* Apply summary to compress the conversation context.
|
|
210
|
+
*
|
|
211
|
+
* Reconstructs the context with:
|
|
212
|
+
* [first_system_message] + [summary_message] + [recent_messages]
|
|
213
|
+
*
|
|
214
|
+
* @param summary The generated summary text.
|
|
215
|
+
* @param lastSummarizedIndex Index of the last message that was summarized.
|
|
216
|
+
*/
|
|
217
|
+
protected _applySummary(summary: string, lastSummarizedIndex: number): Promise<void>;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=llm_context_summarizer.d.ts.map
|
|
@@ -0,0 +1,447 @@
|
|
|
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/processors/aggregators/llm_context_summarizer.py
|
|
6
|
+
/** This module defines a summarizer for managing LLM context summarization. */
|
|
7
|
+
import { rethrowIfCancelled, TimeoutError, waitFor } from "@pipedog/asyncio";
|
|
8
|
+
import { InterruptionFrame, LLMContextSummaryRequestFrame, LLMContextSummaryResultFrame, LLMFullResponseStartFrame, LLMSummarizeContextFrame, } from "../../frames/frames.js";
|
|
9
|
+
import { BaseObject } from "../../utils/base_object.js";
|
|
10
|
+
import { DEFAULT_SUMMARIZATION_TIMEOUT, LLMAutoContextSummarizationConfig, LLMContextSummarizationUtil, } from "../../utils/context/llm_context_summarization.js";
|
|
11
|
+
import { logger } from "../../utils/logger.js";
|
|
12
|
+
import { LLMSpecificMessage } from "./llm_context.js";
|
|
13
|
+
/**
|
|
14
|
+
* Event data emitted when context summarization completes successfully.
|
|
15
|
+
*
|
|
16
|
+
* - `originalMessageCount`: Number of messages before summarization.
|
|
17
|
+
* - `newMessageCount`: Number of messages after summarization.
|
|
18
|
+
* - `summarizedMessageCount`: Number of messages that were compressed into the summary.
|
|
19
|
+
* - `preservedMessageCount`: Number of recent messages preserved uncompressed.
|
|
20
|
+
*/
|
|
21
|
+
export class SummaryAppliedEvent {
|
|
22
|
+
originalMessageCount;
|
|
23
|
+
newMessageCount;
|
|
24
|
+
summarizedMessageCount;
|
|
25
|
+
preservedMessageCount;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.originalMessageCount = options.originalMessageCount;
|
|
28
|
+
this.newMessageCount = options.newMessageCount;
|
|
29
|
+
this.summarizedMessageCount = options.summarizedMessageCount;
|
|
30
|
+
this.preservedMessageCount = options.preservedMessageCount;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Summarizer for managing LLM context summarization.
|
|
35
|
+
*
|
|
36
|
+
* This class manages context summarization, either automatically when token
|
|
37
|
+
* or message limits are reached, or on-demand when an
|
|
38
|
+
* `LLMSummarizeContextFrame` is received. It monitors the LLM context size,
|
|
39
|
+
* triggers summarization requests, and applies the results to compress
|
|
40
|
+
* conversation history.
|
|
41
|
+
*
|
|
42
|
+
* When `autoTrigger` is true (the default), summarization is triggered
|
|
43
|
+
* automatically based on the configured thresholds in
|
|
44
|
+
* `LLMAutoContextSummarizationConfig`. When `autoTrigger` is false, threshold
|
|
45
|
+
* checks are skipped and summarization only happens when an
|
|
46
|
+
* `LLMSummarizeContextFrame` is explicitly pushed into the pipeline.
|
|
47
|
+
*
|
|
48
|
+
* Both modes can coexist: set `autoTrigger: true` and also push
|
|
49
|
+
* `LLMSummarizeContextFrame` at any time to force an immediate summarization
|
|
50
|
+
* (subject to the `_summarizationInProgress` guard).
|
|
51
|
+
*
|
|
52
|
+
* Event handlers available:
|
|
53
|
+
*
|
|
54
|
+
* - on_request_summarization: Emitted when summarization should be triggered.
|
|
55
|
+
* The aggregator should broadcast this frame to the LLM service.
|
|
56
|
+
* - on_summary_applied: Emitted after a summary has been successfully applied
|
|
57
|
+
* to the context. Receives a SummaryAppliedEvent with metrics about the
|
|
58
|
+
* compression.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* summarizer.eventHandler("on_request_summarization", async (summarizer, frame: LLMContextSummaryRequestFrame) => {
|
|
62
|
+
* await aggregator.broadcastFrame(LLMContextSummaryRequestFrame, {
|
|
63
|
+
* requestId: frame.requestId,
|
|
64
|
+
* context: frame.context,
|
|
65
|
+
* // ...
|
|
66
|
+
* });
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* summarizer.eventHandler("on_summary_applied", async (summarizer, event: SummaryAppliedEvent) => {
|
|
70
|
+
* logger.info(`Compressed ${event.originalMessageCount} -> ${event.newMessageCount} messages`);
|
|
71
|
+
* });
|
|
72
|
+
*/
|
|
73
|
+
export class LLMContextSummarizer extends BaseObject {
|
|
74
|
+
_context;
|
|
75
|
+
_autoConfig;
|
|
76
|
+
_autoTrigger;
|
|
77
|
+
_summarizationInProgress = false;
|
|
78
|
+
_pendingSummaryRequestId = null;
|
|
79
|
+
// The summary message injected by the last applied summary, tracked by
|
|
80
|
+
// identity so the message-count trigger can exclude it only while it is
|
|
81
|
+
// still at the head of the context.
|
|
82
|
+
_summaryMessage = null;
|
|
83
|
+
/** Initialize the context summarizer. */
|
|
84
|
+
constructor(options) {
|
|
85
|
+
super();
|
|
86
|
+
this._context = options.context;
|
|
87
|
+
this._autoConfig = options.config || new LLMAutoContextSummarizationConfig();
|
|
88
|
+
this._autoTrigger = options.autoTrigger ?? true;
|
|
89
|
+
this._registerEventHandler("on_request_summarization", true);
|
|
90
|
+
this._registerEventHandler("on_summary_applied");
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Return 1 if the first message is a system message, else 0.
|
|
94
|
+
*
|
|
95
|
+
* Mirrors the messages[0] system-message check used elsewhere when
|
|
96
|
+
* selecting messages to summarize and when reconstructing the context after
|
|
97
|
+
* a summary, so the message count stays consistent with what those steps
|
|
98
|
+
* actually preserve.
|
|
99
|
+
*
|
|
100
|
+
* @param messages The context messages to check.
|
|
101
|
+
* @returns 1 if `messages[0]` is a system message, otherwise 0.
|
|
102
|
+
*/
|
|
103
|
+
static _leadingSystemMessageCount(messages) {
|
|
104
|
+
const first = messages[0];
|
|
105
|
+
if (first !== undefined && !(first instanceof LLMSpecificMessage) && first.role === "system") {
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Count the conversation messages added since the last applied summary.
|
|
112
|
+
*
|
|
113
|
+
* Excludes the leading system message, if present, and the summary message
|
|
114
|
+
* injected by the last summary while it still sits directly after it. Both
|
|
115
|
+
* are computed from the current context so that replacing the messages (for
|
|
116
|
+
* example, resetting the conversation) resets the count as well.
|
|
117
|
+
*
|
|
118
|
+
* @returns The number of messages that count toward `maxUnsummarizedMessages`.
|
|
119
|
+
*/
|
|
120
|
+
_messagesSinceSummary() {
|
|
121
|
+
const messages = this._context.messages;
|
|
122
|
+
let excluded = LLMContextSummarizer._leadingSystemMessageCount(messages);
|
|
123
|
+
if (this._summaryMessage !== null &&
|
|
124
|
+
messages.length > excluded &&
|
|
125
|
+
messages[excluded] === this._summaryMessage) {
|
|
126
|
+
excluded += 1;
|
|
127
|
+
}
|
|
128
|
+
return messages.length - excluded;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Set up the summarizer.
|
|
132
|
+
*
|
|
133
|
+
* @param setup Configuration object containing setup parameters.
|
|
134
|
+
*/
|
|
135
|
+
async setup(setup) {
|
|
136
|
+
await super.setup(setup.taskManager);
|
|
137
|
+
}
|
|
138
|
+
/** Cleanup the summarizer. */
|
|
139
|
+
async cleanup() {
|
|
140
|
+
await super.cleanup();
|
|
141
|
+
await this._clearSummarizationState();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Process an incoming frame to detect when summarization is needed.
|
|
145
|
+
*
|
|
146
|
+
* @param frame The frame to be processed.
|
|
147
|
+
*/
|
|
148
|
+
async processFrame(frame) {
|
|
149
|
+
if (frame instanceof LLMFullResponseStartFrame) {
|
|
150
|
+
await this._handleLlmResponseStart(frame);
|
|
151
|
+
}
|
|
152
|
+
else if (frame instanceof LLMSummarizeContextFrame) {
|
|
153
|
+
await this._handleManualSummarizationRequest(frame);
|
|
154
|
+
}
|
|
155
|
+
else if (frame instanceof LLMContextSummaryResultFrame) {
|
|
156
|
+
await this._handleSummaryResult(frame);
|
|
157
|
+
}
|
|
158
|
+
else if (frame instanceof InterruptionFrame) {
|
|
159
|
+
await this._handleInterruption();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Handle LLM response start to check if summarization is needed.
|
|
164
|
+
*
|
|
165
|
+
* @param frame The LLM response start frame.
|
|
166
|
+
*/
|
|
167
|
+
async _handleLlmResponseStart(_frame) {
|
|
168
|
+
if (this._shouldSummarize()) {
|
|
169
|
+
await this._requestSummarization();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Handle an explicit on-demand summarization request.
|
|
174
|
+
*
|
|
175
|
+
* Reuses the same `_requestSummarization()` code path as auto mode, so
|
|
176
|
+
* bookkeeping (`_summarizationInProgress`, `_pendingSummaryRequestId`) is
|
|
177
|
+
* always updated correctly.
|
|
178
|
+
*
|
|
179
|
+
* @param frame The manual summarization request frame, optionally carrying
|
|
180
|
+
* a per-request LLMContextSummaryConfig.
|
|
181
|
+
*/
|
|
182
|
+
async _handleManualSummarizationRequest(frame) {
|
|
183
|
+
if (this._summarizationInProgress) {
|
|
184
|
+
logger.debug(`${this}: Summarization already in progress, ignoring manual request`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
await this._requestSummarization(frame.config);
|
|
188
|
+
}
|
|
189
|
+
/** Handle interruption by canceling summarization in progress. */
|
|
190
|
+
async _handleInterruption() {
|
|
191
|
+
// Reset summarization state to allow new requests. This is necessary
|
|
192
|
+
// because the request frame (LLMContextSummaryRequestFrame) may have been
|
|
193
|
+
// cancelled during interruption. We preserve _pendingSummaryRequestId to
|
|
194
|
+
// handle the response frame (LLMContextSummaryResultFrame), which is
|
|
195
|
+
// uninterruptible and will still be delivered.
|
|
196
|
+
this._summarizationInProgress = false;
|
|
197
|
+
}
|
|
198
|
+
/** Cancel pending summarization. */
|
|
199
|
+
async _clearSummarizationState() {
|
|
200
|
+
if (this._summarizationInProgress) {
|
|
201
|
+
logger.debug(`${this}: Clearing pending summarization`);
|
|
202
|
+
this._summarizationInProgress = false;
|
|
203
|
+
this._pendingSummaryRequestId = null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Determine if context summarization should be triggered.
|
|
208
|
+
*
|
|
209
|
+
* Evaluates whether the current context has reached either the token
|
|
210
|
+
* threshold or message count threshold that warrants compression. Either
|
|
211
|
+
* threshold can be null to disable that check; at least one must be set
|
|
212
|
+
* (enforced at config construction time).
|
|
213
|
+
*
|
|
214
|
+
* @returns True when `autoTrigger` is enabled, no summarization is in
|
|
215
|
+
* progress, and either the token count exceeds `maxContextTokens` or the
|
|
216
|
+
* message count since the last summary exceeds `maxUnsummarizedMessages`
|
|
217
|
+
* (whichever of the two is set).
|
|
218
|
+
*/
|
|
219
|
+
_shouldSummarize() {
|
|
220
|
+
logger.trace(`${this}: Checking if context summarization is needed`);
|
|
221
|
+
if (!this._autoTrigger) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
if (this._summarizationInProgress) {
|
|
225
|
+
logger.debug(`${this}: Summarization already in progress`);
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
// Estimate tokens in context
|
|
229
|
+
const totalTokens = LLMContextSummarizationUtil.estimateContextTokens(this._context);
|
|
230
|
+
const numMessages = this._context.messages.length;
|
|
231
|
+
// Check if we've reached the token limit
|
|
232
|
+
const tokenLimit = this._autoConfig.maxContextTokens;
|
|
233
|
+
const tokenLimitExceeded = tokenLimit !== null && totalTokens >= tokenLimit;
|
|
234
|
+
// Check if we've exceeded max unsummarized messages
|
|
235
|
+
const messagesSinceSummary = this._messagesSinceSummary();
|
|
236
|
+
const messageThreshold = this._autoConfig.maxUnsummarizedMessages;
|
|
237
|
+
const messageThresholdExceeded = messageThreshold !== null && messagesSinceSummary >= messageThreshold;
|
|
238
|
+
logger.trace(`${this}: Context has ${numMessages} messages, ` +
|
|
239
|
+
`~${totalTokens} tokens (limit: ${tokenLimit !== null ? tokenLimit : "disabled"}), ` +
|
|
240
|
+
`${messagesSinceSummary} messages since last summary ` +
|
|
241
|
+
`(message threshold: ${messageThreshold !== null ? messageThreshold : "disabled"})`);
|
|
242
|
+
// Trigger if either limit is exceeded
|
|
243
|
+
if (!tokenLimitExceeded && !messageThresholdExceeded) {
|
|
244
|
+
logger.trace(`${this}: Neither token limit nor message threshold exceeded, skipping summarization`);
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
const reason = [];
|
|
248
|
+
if (tokenLimitExceeded) {
|
|
249
|
+
reason.push(`~${totalTokens} tokens (>=${tokenLimit} limit)`);
|
|
250
|
+
}
|
|
251
|
+
if (messageThresholdExceeded) {
|
|
252
|
+
reason.push(`${messagesSinceSummary} messages (>=${messageThreshold} threshold)`);
|
|
253
|
+
}
|
|
254
|
+
logger.debug(`${this}: ✓ Summarization needed - ${reason.join(", ")}`);
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Request context summarization from LLM service.
|
|
259
|
+
*
|
|
260
|
+
* Creates a summarization request frame and either handles it directly
|
|
261
|
+
* using a dedicated LLM (if configured) or emits it via event handler for
|
|
262
|
+
* the pipeline's primary LLM. Tracks the request ID to match async
|
|
263
|
+
* responses and prevent race conditions.
|
|
264
|
+
*
|
|
265
|
+
* @param configOverride Optional per-request summary configuration. If
|
|
266
|
+
* provided, overrides the default summary generation settings from
|
|
267
|
+
* `this._autoConfig.summaryConfig`.
|
|
268
|
+
*/
|
|
269
|
+
async _requestSummarization(configOverride = null) {
|
|
270
|
+
// Generate unique request ID
|
|
271
|
+
const requestId = crypto.randomUUID();
|
|
272
|
+
const summaryConfig = configOverride || this._autoConfig.summaryConfig;
|
|
273
|
+
// Mark summarization in progress
|
|
274
|
+
this._summarizationInProgress = true;
|
|
275
|
+
this._pendingSummaryRequestId = requestId;
|
|
276
|
+
logger.debug(`${this}: Sending summarization request (request_id=${requestId})`);
|
|
277
|
+
// Create the request frame
|
|
278
|
+
const requestFrame = new LLMContextSummaryRequestFrame({
|
|
279
|
+
requestId,
|
|
280
|
+
context: this._context,
|
|
281
|
+
minMessagesToKeep: summaryConfig.minMessagesAfterSummary,
|
|
282
|
+
targetContextTokens: summaryConfig.targetContextTokens,
|
|
283
|
+
summarizationPrompt: summaryConfig.summaryPrompt,
|
|
284
|
+
summarizationTimeout: summaryConfig.summarizationTimeout,
|
|
285
|
+
});
|
|
286
|
+
if (summaryConfig.llm) {
|
|
287
|
+
// Use dedicated LLM directly — no need to involve the pipeline
|
|
288
|
+
const llm = summaryConfig.llm;
|
|
289
|
+
this.taskManager.createTask(() => this._generateSummaryWithDedicatedLlm(llm, requestFrame), `${this}-dedicated-llm-summary`);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
// Emit event for aggregator to broadcast to the pipeline LLM
|
|
293
|
+
await this._callEventHandler("on_request_summarization", requestFrame);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Generate summary using a dedicated LLM service.
|
|
298
|
+
*
|
|
299
|
+
* Calls the dedicated LLM's `_generateSummary` directly and feeds the
|
|
300
|
+
* result back through `_handleSummaryResult`, bypassing the pipeline.
|
|
301
|
+
*
|
|
302
|
+
* @param llm The dedicated LLM service to use for summarization.
|
|
303
|
+
* @param frame The summarization request frame.
|
|
304
|
+
*/
|
|
305
|
+
async _generateSummaryWithDedicatedLlm(llm, frame) {
|
|
306
|
+
// Python `or`: a 0 timeout also falls back to the default.
|
|
307
|
+
const timeout = frame.summarizationTimeout || DEFAULT_SUMMARIZATION_TIMEOUT;
|
|
308
|
+
let resultFrame;
|
|
309
|
+
try {
|
|
310
|
+
const generator = llm;
|
|
311
|
+
const [summary, lastIndex] = await waitFor(() => generator._generateSummary(frame), timeout);
|
|
312
|
+
resultFrame = new LLMContextSummaryResultFrame({
|
|
313
|
+
requestId: frame.requestId,
|
|
314
|
+
summary,
|
|
315
|
+
lastSummarizedIndex: lastIndex,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
rethrowIfCancelled(e);
|
|
320
|
+
let error;
|
|
321
|
+
if (e instanceof TimeoutError) {
|
|
322
|
+
error = `Context summarization timed out after ${timeout}s`;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
error = `Error generating context summary: ${e instanceof Error ? e.message : String(e)}`;
|
|
326
|
+
}
|
|
327
|
+
logger.error(`${this}: ${error}`);
|
|
328
|
+
resultFrame = new LLMContextSummaryResultFrame({
|
|
329
|
+
requestId: frame.requestId,
|
|
330
|
+
summary: "",
|
|
331
|
+
lastSummarizedIndex: -1,
|
|
332
|
+
error,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
await this._handleSummaryResult(resultFrame);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Handle context summarization result from LLM service.
|
|
339
|
+
*
|
|
340
|
+
* Processes the summary result by validating the request ID, checking for
|
|
341
|
+
* errors, validating context state, and applying the summary.
|
|
342
|
+
*
|
|
343
|
+
* @param frame The summary result frame containing the generated summary.
|
|
344
|
+
*/
|
|
345
|
+
async _handleSummaryResult(frame) {
|
|
346
|
+
logger.debug(`${this}: Received summary result (request_id=${frame.requestId})`);
|
|
347
|
+
// Check if this is the result we're waiting for. Both auto and manual
|
|
348
|
+
// summarization set _pendingSummaryRequestId via _requestSummarization(),
|
|
349
|
+
// so this check always applies.
|
|
350
|
+
if (frame.requestId !== this._pendingSummaryRequestId) {
|
|
351
|
+
logger.debug(`${this}: Ignoring stale summary result (request_id=${frame.requestId})`);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
// Clear pending state
|
|
355
|
+
await this._clearSummarizationState();
|
|
356
|
+
// Check for errors
|
|
357
|
+
if (frame.error) {
|
|
358
|
+
logger.error(`${this}: Context summarization failed: ${frame.error}`);
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
// Validate context state
|
|
362
|
+
if (!this._validateSummaryContext(frame.lastSummarizedIndex)) {
|
|
363
|
+
logger.warning(`${this}: Context state changed, skipping summary application`);
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
// Apply summary
|
|
367
|
+
await this._applySummary(frame.summary, frame.lastSummarizedIndex);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Validate that context state is still valid for applying summary.
|
|
371
|
+
*
|
|
372
|
+
* @param lastSummarizedIndex The index of the last summarized message.
|
|
373
|
+
* @returns True if the context state is still consistent with the summary.
|
|
374
|
+
*/
|
|
375
|
+
_validateSummaryContext(lastSummarizedIndex) {
|
|
376
|
+
if (lastSummarizedIndex < 0) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
// Check if we still have enough messages
|
|
380
|
+
if (lastSummarizedIndex >= this._context.messages.length) {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
const minKeep = this._autoConfig.summaryConfig.minMessagesAfterSummary;
|
|
384
|
+
const remaining = this._context.messages.length - 1 - lastSummarizedIndex;
|
|
385
|
+
if (remaining < minKeep) {
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Apply summary to compress the conversation context.
|
|
392
|
+
*
|
|
393
|
+
* Reconstructs the context with:
|
|
394
|
+
* [first_system_message] + [summary_message] + [recent_messages]
|
|
395
|
+
*
|
|
396
|
+
* @param summary The generated summary text.
|
|
397
|
+
* @param lastSummarizedIndex Index of the last message that was summarized.
|
|
398
|
+
*/
|
|
399
|
+
async _applySummary(summary, lastSummarizedIndex) {
|
|
400
|
+
const config = this._autoConfig.summaryConfig;
|
|
401
|
+
const messages = this._context.messages;
|
|
402
|
+
// Preserve the first message if it is a system message (initial system
|
|
403
|
+
// prompt). Only messages[0] is treated as the system preamble — system
|
|
404
|
+
// messages at other positions are mid-conversation injections and are not
|
|
405
|
+
// preserved separately (they will be part of the summary or the recent
|
|
406
|
+
// messages).
|
|
407
|
+
const numSystemPreserved = LLMContextSummarizer._leadingSystemMessageCount(messages);
|
|
408
|
+
const firstSystemMsg = numSystemPreserved ? messages[0] : null;
|
|
409
|
+
// Get recent messages to keep
|
|
410
|
+
const recentMessages = messages.slice(lastSummarizedIndex + 1);
|
|
411
|
+
// Create summary message as a user message (the summary is context
|
|
412
|
+
// provided *to* the assistant, not something the assistant said)
|
|
413
|
+
const summaryContent = formatSummaryTemplate(config.summaryMessageTemplate, summary);
|
|
414
|
+
const summaryMessage = { role: "user", content: summaryContent };
|
|
415
|
+
// Reconstruct context
|
|
416
|
+
const newMessages = [];
|
|
417
|
+
if (firstSystemMsg) {
|
|
418
|
+
newMessages.push(firstSystemMsg);
|
|
419
|
+
}
|
|
420
|
+
newMessages.push(summaryMessage);
|
|
421
|
+
newMessages.push(...recentMessages);
|
|
422
|
+
// Update context
|
|
423
|
+
const originalMessageCount = messages.length;
|
|
424
|
+
this._context.setMessages(newMessages);
|
|
425
|
+
this._summaryMessage = summaryMessage;
|
|
426
|
+
// Messages actually summarized = index range minus the preserved system message
|
|
427
|
+
const summarizedCount = lastSummarizedIndex + 1 - numSystemPreserved;
|
|
428
|
+
logger.info(`${this}: Applied context summary, compressed ${summarizedCount} messages ` +
|
|
429
|
+
`into summary. Context now has ${newMessages.length} messages (was ${originalMessageCount})`);
|
|
430
|
+
// Emit event for observability
|
|
431
|
+
const event = new SummaryAppliedEvent({
|
|
432
|
+
originalMessageCount,
|
|
433
|
+
newMessageCount: newMessages.length,
|
|
434
|
+
summarizedMessageCount: summarizedCount,
|
|
435
|
+
preservedMessageCount: recentMessages.length + numSystemPreserved,
|
|
436
|
+
});
|
|
437
|
+
await this._callEventHandler("on_summary_applied", event);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Python `template.format(summary=summary)`: replaces `{summary}` and
|
|
442
|
+
* unescapes doubled braces.
|
|
443
|
+
*/
|
|
444
|
+
function formatSummaryTemplate(template, summary) {
|
|
445
|
+
return template.replace(/\{\{|\}\}|\{summary\}/g, (m) => m === "{{" ? "{" : m === "}}" ? "}" : summary);
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=llm_context_summarizer.js.map
|