@pipedog/core 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +25 -0
- package/NOTICE +9 -0
- package/dist/adapters/base_llm_adapter.d.ts +266 -0
- package/dist/adapters/base_llm_adapter.js +489 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/schemas/direct_function.d.ts +202 -0
- package/dist/adapters/schemas/direct_function.js +302 -0
- package/dist/adapters/schemas/function_schema.d.ts +67 -0
- package/dist/adapters/schemas/function_schema.js +72 -0
- package/dist/adapters/schemas/index.d.ts +2 -0
- package/dist/adapters/schemas/index.js +8 -0
- package/dist/adapters/schemas/tools_schema.d.ts +57 -0
- package/dist/adapters/schemas/tools_schema.js +79 -0
- package/dist/adapters/services/index.d.ts +2 -0
- package/dist/adapters/services/index.js +8 -0
- package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
- package/dist/adapters/services/open_ai_adapter.js +250 -0
- package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
- package/dist/audio/dtmf/dtmf_data.js +22 -0
- package/dist/audio/dtmf/index.d.ts +2 -0
- package/dist/audio/dtmf/index.js +8 -0
- package/dist/audio/dtmf/types.d.ts +31 -0
- package/dist/audio/dtmf/types.js +35 -0
- package/dist/audio/dtmf/utils.d.ts +13 -0
- package/dist/audio/dtmf/utils.js +62 -0
- package/dist/audio/filters/base_audio_filter.d.ts +51 -0
- package/dist/audio/filters/base_audio_filter.js +17 -0
- package/dist/audio/filters/index.d.ts +2 -0
- package/dist/audio/filters/index.js +8 -0
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/krisp_instance.d.ts +95 -0
- package/dist/audio/krisp_instance.js +229 -0
- package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
- package/dist/audio/mixers/base_audio_mixer.js +16 -0
- package/dist/audio/mixers/index.d.ts +2 -0
- package/dist/audio/mixers/index.js +8 -0
- package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
- package/dist/audio/resamplers/base_audio_resampler.js +35 -0
- package/dist/audio/resamplers/index.d.ts +2 -0
- package/dist/audio/resamplers/index.js +8 -0
- package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
- package/dist/audio/resamplers/resampy_resampler.js +15 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +54 -0
- package/dist/audio/resamplers/soxr_resampler.js +69 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +75 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +146 -0
- package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
- package/dist/audio/turn/base_turn_analyzer.js +61 -0
- package/dist/audio/turn/index.d.ts +2 -0
- package/dist/audio/turn/index.js +8 -0
- package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
- package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +143 -0
- package/dist/audio/utils.d.ts +224 -0
- package/dist/audio/utils.js +634 -0
- package/dist/audio/vad/data/index.d.ts +2 -0
- package/dist/audio/vad/data/index.js +8 -0
- package/dist/audio/vad/index.d.ts +2 -0
- package/dist/audio/vad/index.js +8 -0
- package/dist/audio/vad/vad_analyzer.d.ts +126 -0
- package/dist/audio/vad/vad_analyzer.js +211 -0
- package/dist/audio/vad/vad_controller.d.ts +143 -0
- package/dist/audio/vad/vad_controller.js +228 -0
- package/dist/audio/volume.d.ts +38 -0
- package/dist/audio/volume.js +75 -0
- package/dist/bus/adapters/base.d.ts +35 -0
- package/dist/bus/adapters/base.js +19 -0
- package/dist/bus/adapters/index.d.ts +10 -0
- package/dist/bus/adapters/index.js +15 -0
- package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
- package/dist/bus/adapters/llm_context_adapter.js +82 -0
- package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
- package/dist/bus/adapters/tools_schema_adapter.js +70 -0
- package/dist/bus/bridge_processor.d.ts +111 -0
- package/dist/bus/bridge_processor.js +166 -0
- package/dist/bus/bus.d.ts +110 -0
- package/dist/bus/bus.js +200 -0
- package/dist/bus/index.d.ts +22 -0
- package/dist/bus/index.js +27 -0
- package/dist/bus/local/async_queue.d.ts +12 -0
- package/dist/bus/local/async_queue.js +21 -0
- package/dist/bus/local/index.d.ts +3 -0
- package/dist/bus/local/index.js +8 -0
- package/dist/bus/messages.d.ts +378 -0
- package/dist/bus/messages.js +357 -0
- package/dist/bus/network/index.d.ts +16 -0
- package/dist/bus/network/index.js +21 -0
- package/dist/bus/queue.d.ts +27 -0
- package/dist/bus/queue.js +51 -0
- package/dist/bus/serializers/base.d.ts +25 -0
- package/dist/bus/serializers/base.js +14 -0
- package/dist/bus/serializers/index.d.ts +9 -0
- package/dist/bus/serializers/index.js +14 -0
- package/dist/bus/serializers/json.d.ts +77 -0
- package/dist/bus/serializers/json.js +367 -0
- package/dist/bus/subscriber.d.ts +46 -0
- package/dist/bus/subscriber.js +27 -0
- package/dist/bus/ui/index.d.ts +3 -0
- package/dist/bus/ui/index.js +8 -0
- package/dist/bus/ui/messages.d.ts +186 -0
- package/dist/bus/ui/messages.js +171 -0
- package/dist/classifiers/base_classifier.d.ts +263 -0
- package/dist/classifiers/base_classifier.js +346 -0
- package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
- package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
- package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
- package/dist/classifiers/cloudflare/clef/client.js +234 -0
- package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/clef/index.js +8 -0
- package/dist/classifiers/cloudflare/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/index.js +8 -0
- package/dist/classifiers/http_client.d.ts +70 -0
- package/dist/classifiers/http_client.js +161 -0
- package/dist/classifiers/index.d.ts +2 -0
- package/dist/classifiers/index.js +8 -0
- package/dist/classifiers/jev/classifier.d.ts +8 -0
- package/dist/classifiers/jev/classifier.js +13 -0
- package/dist/classifiers/jev/client.d.ts +8 -0
- package/dist/classifiers/jev/client.js +13 -0
- package/dist/classifiers/jev/index.d.ts +2 -0
- package/dist/classifiers/jev/index.js +8 -0
- package/dist/classifiers/llm/classifier.d.ts +72 -0
- package/dist/classifiers/llm/classifier.js +304 -0
- package/dist/classifiers/llm/index.d.ts +2 -0
- package/dist/classifiers/llm/index.js +8 -0
- package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
- package/dist/classifiers/openai/decisions/classifier.js +241 -0
- package/dist/classifiers/openai/decisions/client.d.ts +108 -0
- package/dist/classifiers/openai/decisions/client.js +234 -0
- package/dist/classifiers/openai/decisions/index.d.ts +2 -0
- package/dist/classifiers/openai/decisions/index.js +8 -0
- package/dist/classifiers/openai/index.d.ts +2 -0
- package/dist/classifiers/openai/index.js +8 -0
- package/dist/classifiers/typesafe/index.d.ts +2 -0
- package/dist/classifiers/typesafe/index.js +8 -0
- package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
- package/dist/classifiers/typesafe/jev/classifier.js +220 -0
- package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
- package/dist/classifiers/typesafe/jev/client.js +233 -0
- package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
- package/dist/classifiers/typesafe/jev/index.js +8 -0
- package/dist/clocks/base_clock.d.ts +13 -0
- package/dist/clocks/base_clock.js +14 -0
- package/dist/clocks/index.d.ts +2 -0
- package/dist/clocks/index.js +8 -0
- package/dist/clocks/system_clock.d.ts +15 -0
- package/dist/clocks/system_clock.js +25 -0
- package/dist/frames/frames.d.ts +2533 -0
- package/dist/frames/frames.js +2485 -0
- package/dist/frames/index.d.ts +2 -0
- package/dist/frames/index.js +8 -0
- package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
- package/dist/frames/protobufs/frames_pb2.js +466 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +56 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/metrics.d.ts +276 -0
- package/dist/metrics/metrics.js +254 -0
- package/dist/observers/base_observer.d.ts +173 -0
- package/dist/observers/base_observer.js +151 -0
- package/dist/observers/error_observer.d.ts +75 -0
- package/dist/observers/error_observer.js +87 -0
- package/dist/observers/function_call_observer.d.ts +157 -0
- package/dist/observers/function_call_observer.js +222 -0
- package/dist/observers/index.d.ts +2 -0
- package/dist/observers/index.js +8 -0
- package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
- package/dist/observers/loggers/debug_log_observer.js +228 -0
- package/dist/observers/loggers/index.d.ts +2 -0
- package/dist/observers/loggers/index.js +8 -0
- package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
- package/dist/observers/loggers/llm_log_observer.js +110 -0
- package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
- package/dist/observers/loggers/metrics_log_observer.js +186 -0
- package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
- package/dist/observers/loggers/transcription_log_observer.js +74 -0
- package/dist/observers/service_metrics_observer.d.ts +168 -0
- package/dist/observers/service_metrics_observer.js +236 -0
- package/dist/observers/speaking_observer.d.ts +104 -0
- package/dist/observers/speaking_observer.js +150 -0
- package/dist/observers/startup_timing_observer.d.ts +221 -0
- package/dist/observers/startup_timing_observer.js +365 -0
- package/dist/observers/turn_tracking_observer.d.ts +78 -0
- package/dist/observers/turn_tracking_observer.js +189 -0
- package/dist/observers/user_bot_latency_observer.d.ts +411 -0
- package/dist/observers/user_bot_latency_observer.js +974 -0
- package/dist/pipeline/base_pipeline.d.ts +49 -0
- package/dist/pipeline/base_pipeline.js +101 -0
- package/dist/pipeline/capabilities.d.ts +76 -0
- package/dist/pipeline/capabilities.js +97 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.js +8 -0
- package/dist/pipeline/job_context.d.ts +317 -0
- package/dist/pipeline/job_context.js +450 -0
- package/dist/pipeline/job_decorator.d.ts +54 -0
- package/dist/pipeline/job_decorator.js +92 -0
- package/dist/pipeline/llm_switcher.d.ts +84 -0
- package/dist/pipeline/llm_switcher.js +107 -0
- package/dist/pipeline/llm_with_backend.d.ts +435 -0
- package/dist/pipeline/llm_with_backend.js +806 -0
- package/dist/pipeline/parallel_pipeline.d.ts +83 -0
- package/dist/pipeline/parallel_pipeline.js +200 -0
- package/dist/pipeline/pipeline.d.ts +126 -0
- package/dist/pipeline/pipeline.js +196 -0
- package/dist/pipeline/service_switcher.d.ts +287 -0
- package/dist/pipeline/service_switcher.js +509 -0
- package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
- package/dist/pipeline/sync_parallel_pipeline.js +387 -0
- package/dist/pipeline/worker.d.ts +814 -0
- package/dist/pipeline/worker.js +1639 -0
- package/dist/pipeline/worker_observer.d.ts +131 -0
- package/dist/pipeline/worker_observer.js +274 -0
- package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
- package/dist/pipeline/worker_ready_decorator.js +76 -0
- package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
- package/dist/processors/aggregators/async_tool_messages.js +291 -0
- package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
- package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
- package/dist/processors/aggregators/gated.d.ts +43 -0
- package/dist/processors/aggregators/gated.js +86 -0
- package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
- package/dist/processors/aggregators/gated_llm_context.js +86 -0
- package/dist/processors/aggregators/index.d.ts +2 -0
- package/dist/processors/aggregators/index.js +8 -0
- package/dist/processors/aggregators/llm_context.d.ts +370 -0
- package/dist/processors/aggregators/llm_context.js +580 -0
- package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
- package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
- package/dist/processors/aggregators/llm_response.d.ts +37 -0
- package/dist/processors/aggregators/llm_response.js +71 -0
- package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
- package/dist/processors/aggregators/llm_response_universal.js +2394 -0
- package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
- package/dist/processors/aggregators/llm_text_processor.js +102 -0
- package/dist/processors/aggregators/sentence.d.ts +39 -0
- package/dist/processors/aggregators/sentence.js +69 -0
- package/dist/processors/async_generator.d.ts +42 -0
- package/dist/processors/async_generator.js +76 -0
- package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
- package/dist/processors/audio/audio_buffer_processor.js +565 -0
- package/dist/processors/audio/index.d.ts +2 -0
- package/dist/processors/audio/index.js +8 -0
- package/dist/processors/audio/vad_processor.d.ts +67 -0
- package/dist/processors/audio/vad_processor.js +103 -0
- package/dist/processors/consumer_processor.d.ts +49 -0
- package/dist/processors/consumer_processor.js +85 -0
- package/dist/processors/filters/frame_filter.d.ts +39 -0
- package/dist/processors/filters/frame_filter.js +52 -0
- package/dist/processors/filters/function_filter.d.ts +59 -0
- package/dist/processors/filters/function_filter.js +78 -0
- package/dist/processors/filters/identity_filter.d.ts +33 -0
- package/dist/processors/filters/identity_filter.js +37 -0
- package/dist/processors/filters/index.d.ts +2 -0
- package/dist/processors/filters/index.js +8 -0
- package/dist/processors/filters/null_filter.d.ts +34 -0
- package/dist/processors/filters/null_filter.js +47 -0
- package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
- package/dist/processors/filters/wake_notifier_filter.js +49 -0
- package/dist/processors/frame_processor.d.ts +360 -0
- package/dist/processors/frame_processor.js +932 -0
- package/dist/processors/frameworks/index.d.ts +2 -0
- package/dist/processors/frameworks/index.js +8 -0
- package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
- package/dist/processors/frameworks/rtvi/frames.js +259 -0
- package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
- package/dist/processors/frameworks/rtvi/index.js +11 -0
- package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
- package/dist/processors/frameworks/rtvi/models.js +1807 -0
- package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
- package/dist/processors/frameworks/rtvi/observer.js +1113 -0
- package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
- package/dist/processors/frameworks/rtvi/processor.js +676 -0
- package/dist/processors/idle_frame_processor.d.ts +44 -0
- package/dist/processors/idle_frame_processor.js +86 -0
- package/dist/processors/index.d.ts +2 -0
- package/dist/processors/index.js +8 -0
- package/dist/processors/logger.d.ts +42 -0
- package/dist/processors/logger.js +87 -0
- package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
- package/dist/processors/metrics/frame_processor_metrics.js +372 -0
- package/dist/processors/metrics/index.d.ts +2 -0
- package/dist/processors/metrics/index.js +8 -0
- package/dist/processors/producer_processor.d.ts +68 -0
- package/dist/processors/producer_processor.js +78 -0
- package/dist/processors/text_transformer.d.ts +30 -0
- package/dist/processors/text_transformer.js +48 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry.d.ts +69 -0
- package/dist/registry/registry.js +149 -0
- package/dist/registry/types.d.ts +47 -0
- package/dist/registry/types.js +39 -0
- package/dist/serializers/base_serializer.d.ts +94 -0
- package/dist/serializers/base_serializer.js +82 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.js +8 -0
- package/dist/services/ai_service.d.ts +145 -0
- package/dist/services/ai_service.js +262 -0
- package/dist/services/anthropic/index.d.ts +2 -0
- package/dist/services/anthropic/index.js +7 -0
- package/dist/services/assemblyai/index.d.ts +2 -0
- package/dist/services/assemblyai/index.js +7 -0
- package/dist/services/asyncai/index.d.ts +2 -0
- package/dist/services/asyncai/index.js +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.js +7 -0
- package/dist/services/azure/index.d.ts +2 -0
- package/dist/services/azure/index.js +7 -0
- package/dist/services/baseten/index.d.ts +2 -0
- package/dist/services/baseten/index.js +7 -0
- package/dist/services/bland/index.d.ts +2 -0
- package/dist/services/bland/index.js +7 -0
- package/dist/services/camb/index.d.ts +2 -0
- package/dist/services/camb/index.js +7 -0
- package/dist/services/cartesia/index.d.ts +2 -0
- package/dist/services/cartesia/index.js +7 -0
- package/dist/services/cerebras/index.d.ts +2 -0
- package/dist/services/cerebras/index.js +7 -0
- package/dist/services/crusoe/index.d.ts +2 -0
- package/dist/services/crusoe/index.js +7 -0
- package/dist/services/deepgram/index.d.ts +2 -0
- package/dist/services/deepgram/index.js +7 -0
- package/dist/services/deepseek/index.d.ts +2 -0
- package/dist/services/deepseek/index.js +7 -0
- package/dist/services/elevenlabs/index.d.ts +2 -0
- package/dist/services/elevenlabs/index.js +7 -0
- package/dist/services/fal/index.d.ts +2 -0
- package/dist/services/fal/index.js +7 -0
- package/dist/services/fireworks/index.d.ts +2 -0
- package/dist/services/fireworks/index.js +7 -0
- package/dist/services/fish/index.d.ts +2 -0
- package/dist/services/fish/index.js +7 -0
- package/dist/services/funasr/index.d.ts +3 -0
- package/dist/services/funasr/index.js +8 -0
- package/dist/services/gladia/index.d.ts +2 -0
- package/dist/services/gladia/index.js +7 -0
- package/dist/services/google/index.d.ts +2 -0
- package/dist/services/google/index.js +7 -0
- package/dist/services/gradium/index.d.ts +2 -0
- package/dist/services/gradium/index.js +7 -0
- package/dist/services/grok/index.d.ts +2 -0
- package/dist/services/grok/index.js +7 -0
- package/dist/services/groq/index.d.ts +2 -0
- package/dist/services/groq/index.js +7 -0
- package/dist/services/heygen/index.d.ts +2 -0
- package/dist/services/heygen/index.js +7 -0
- package/dist/services/hume/index.d.ts +2 -0
- package/dist/services/hume/index.js +7 -0
- package/dist/services/image_service.d.ts +52 -0
- package/dist/services/image_service.js +60 -0
- package/dist/services/inception/index.d.ts +2 -0
- package/dist/services/inception/index.js +7 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +8 -0
- package/dist/services/inworld/index.d.ts +2 -0
- package/dist/services/inworld/index.js +7 -0
- package/dist/services/keenable/index.d.ts +2 -0
- package/dist/services/keenable/index.js +7 -0
- package/dist/services/kokoro/index.d.ts +2 -0
- package/dist/services/kokoro/index.js +7 -0
- package/dist/services/llm_service.d.ts +1106 -0
- package/dist/services/llm_service.js +2231 -0
- package/dist/services/mem0/index.d.ts +2 -0
- package/dist/services/mem0/index.js +7 -0
- package/dist/services/meta/index.d.ts +2 -0
- package/dist/services/meta/index.js +7 -0
- package/dist/services/minimax/index.d.ts +2 -0
- package/dist/services/minimax/index.js +7 -0
- package/dist/services/mistral/index.d.ts +2 -0
- package/dist/services/mistral/index.js +7 -0
- package/dist/services/moondream/index.d.ts +2 -0
- package/dist/services/moondream/index.js +7 -0
- package/dist/services/moonshine/index.d.ts +2 -0
- package/dist/services/moonshine/index.js +7 -0
- package/dist/services/nebius/index.d.ts +2 -0
- package/dist/services/nebius/index.js +7 -0
- package/dist/services/neuphonic/index.d.ts +2 -0
- package/dist/services/neuphonic/index.js +7 -0
- package/dist/services/novita/index.d.ts +2 -0
- package/dist/services/novita/index.js +7 -0
- package/dist/services/nvidia/index.d.ts +2 -0
- package/dist/services/nvidia/index.js +11 -0
- package/dist/services/ollama/index.d.ts +2 -0
- package/dist/services/ollama/index.js +7 -0
- package/dist/services/openai/index.d.ts +2 -0
- package/dist/services/openai/index.js +7 -0
- package/dist/services/openclaw/index.d.ts +14 -0
- package/dist/services/openclaw/index.js +19 -0
- package/dist/services/openrouter/index.d.ts +2 -0
- package/dist/services/openrouter/index.js +7 -0
- package/dist/services/perplexity/index.d.ts +2 -0
- package/dist/services/perplexity/index.js +7 -0
- package/dist/services/piper/index.d.ts +2 -0
- package/dist/services/piper/index.js +7 -0
- package/dist/services/pocket_tts/index.d.ts +2 -0
- package/dist/services/pocket_tts/index.js +7 -0
- package/dist/services/qwen/index.d.ts +2 -0
- package/dist/services/qwen/index.js +7 -0
- package/dist/services/resembleai/index.d.ts +2 -0
- package/dist/services/resembleai/index.js +7 -0
- package/dist/services/rime/index.d.ts +2 -0
- package/dist/services/rime/index.js +7 -0
- package/dist/services/sambanova/index.d.ts +2 -0
- package/dist/services/sambanova/index.js +7 -0
- package/dist/services/sarvam/index.d.ts +2 -0
- package/dist/services/sarvam/index.js +7 -0
- package/dist/services/settings.d.ts +356 -0
- package/dist/services/settings.js +437 -0
- package/dist/services/simli/index.d.ts +2 -0
- package/dist/services/simli/index.js +7 -0
- package/dist/services/smallest/index.d.ts +2 -0
- package/dist/services/smallest/index.js +7 -0
- package/dist/services/soniox/index.d.ts +2 -0
- package/dist/services/soniox/index.js +7 -0
- package/dist/services/speechify/index.d.ts +2 -0
- package/dist/services/speechify/index.js +7 -0
- package/dist/services/speechmatics/index.d.ts +2 -0
- package/dist/services/speechmatics/index.js +7 -0
- package/dist/services/stt_latency.d.ts +62 -0
- package/dist/services/stt_latency.js +71 -0
- package/dist/services/stt_service.d.ts +601 -0
- package/dist/services/stt_service.js +1044 -0
- package/dist/services/tavus/index.d.ts +2 -0
- package/dist/services/tavus/index.js +7 -0
- package/dist/services/together/index.d.ts +2 -0
- package/dist/services/together/index.js +7 -0
- package/dist/services/tts_service.d.ts +909 -0
- package/dist/services/tts_service.js +2018 -0
- package/dist/services/ultravox/index.d.ts +2 -0
- package/dist/services/ultravox/index.js +9 -0
- package/dist/services/vision_service.d.ts +56 -0
- package/dist/services/vision_service.js +62 -0
- package/dist/services/websocket_service.d.ts +213 -0
- package/dist/services/websocket_service.js +654 -0
- package/dist/services/whisper/index.d.ts +2 -0
- package/dist/services/whisper/index.js +9 -0
- package/dist/services/xai/index.d.ts +2 -0
- package/dist/services/xai/index.js +9 -0
- package/dist/services/xtts/index.d.ts +2 -0
- package/dist/services/xtts/index.js +9 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.js +8 -0
- package/dist/tests/utils.d.ts +123 -0
- package/dist/tests/utils.js +212 -0
- package/dist/transcriptions/index.d.ts +2 -0
- package/dist/transcriptions/index.js +8 -0
- package/dist/transcriptions/language.d.ts +376 -0
- package/dist/transcriptions/language.js +543 -0
- package/dist/transports/base_input.d.ts +149 -0
- package/dist/transports/base_input.js +338 -0
- package/dist/transports/base_output.d.ts +432 -0
- package/dist/transports/base_output.js +1231 -0
- package/dist/transports/base_transport.d.ts +223 -0
- package/dist/transports/base_transport.js +167 -0
- package/dist/transports/daily/index.d.ts +2 -0
- package/dist/transports/daily/index.js +9 -0
- package/dist/transports/heygen/index.d.ts +2 -0
- package/dist/transports/heygen/index.js +9 -0
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/lemonslice/index.d.ts +2 -0
- package/dist/transports/lemonslice/index.js +9 -0
- package/dist/transports/livekit/index.d.ts +2 -0
- package/dist/transports/livekit/index.js +9 -0
- package/dist/transports/local/index.d.ts +2 -0
- package/dist/transports/local/index.js +9 -0
- package/dist/transports/moq/index.d.ts +2 -0
- package/dist/transports/moq/index.js +9 -0
- package/dist/transports/smallwebrtc/index.d.ts +2 -0
- package/dist/transports/smallwebrtc/index.js +9 -0
- package/dist/transports/tavus/index.d.ts +2 -0
- package/dist/transports/tavus/index.js +9 -0
- package/dist/transports/video_in_sampler.d.ts +157 -0
- package/dist/transports/video_in_sampler.js +258 -0
- package/dist/transports/vonage/index.d.ts +2 -0
- package/dist/transports/vonage/index.js +9 -0
- package/dist/transports/websocket/index.d.ts +2 -0
- package/dist/transports/websocket/index.js +9 -0
- package/dist/transports/whatsapp/index.d.ts +2 -0
- package/dist/transports/whatsapp/index.js +9 -0
- package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
- package/dist/turns/eager_end_of_turn_mixin.js +122 -0
- package/dist/turns/empty_user_turn.d.ts +55 -0
- package/dist/turns/empty_user_turn.js +53 -0
- package/dist/turns/index.d.ts +2 -0
- package/dist/turns/index.js +8 -0
- package/dist/turns/speculation_gate.d.ts +169 -0
- package/dist/turns/speculation_gate.js +294 -0
- package/dist/turns/types.d.ts +33 -0
- package/dist/turns/types.js +35 -0
- package/dist/turns/user_idle_controller.d.ts +94 -0
- package/dist/turns/user_idle_controller.js +187 -0
- package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
- package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
- package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
- package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
- package/dist/turns/user_mute/index.d.ts +6 -0
- package/dist/turns/user_mute/index.js +11 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
- package/dist/turns/user_start/index.d.ts +8 -0
- package/dist/turns/user_start/index.js +16 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
- package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
- package/dist/turns/user_stop/eager_match_policy.js +50 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
- package/dist/turns/user_stop/index.d.ts +10 -0
- package/dist/turns/user_stop/index.js +15 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
- package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
- package/dist/turns/user_turn_completion_mixin.js +591 -0
- package/dist/turns/user_turn_controller.d.ts +134 -0
- package/dist/turns/user_turn_controller.js +335 -0
- package/dist/turns/user_turn_processor.d.ts +87 -0
- package/dist/turns/user_turn_processor.js +180 -0
- package/dist/turns/user_turn_strategies.d.ts +187 -0
- package/dist/turns/user_turn_strategies.js +222 -0
- package/dist/utils/async_tool_cancellation.d.ts +35 -0
- package/dist/utils/async_tool_cancellation.js +78 -0
- package/dist/utils/asyncio/index.d.ts +2 -0
- package/dist/utils/asyncio/index.js +7 -0
- package/dist/utils/asyncio/task_manager.d.ts +49 -0
- package/dist/utils/asyncio/task_manager.js +105 -0
- package/dist/utils/base_object.d.ts +76 -0
- package/dist/utils/base_object.js +154 -0
- package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
- package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
- package/dist/utils/context/audio_context_manager.d.ts +131 -0
- package/dist/utils/context/audio_context_manager.js +233 -0
- package/dist/utils/context/index.d.ts +2 -0
- package/dist/utils/context/index.js +7 -0
- package/dist/utils/context/llm_context_summarization.d.ts +258 -0
- package/dist/utils/context/llm_context_summarization.js +511 -0
- package/dist/utils/context/text_segment_map.d.ts +611 -0
- package/dist/utils/context/text_segment_map.js +1132 -0
- package/dist/utils/context/word_completion_tracker.d.ts +273 -0
- package/dist/utils/context/word_completion_tracker.js +441 -0
- package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
- package/dist/utils/context/word_timestamp_tracker.js +98 -0
- package/dist/utils/deprecation.d.ts +28 -0
- package/dist/utils/deprecation.js +75 -0
- package/dist/utils/env.d.ts +38 -0
- package/dist/utils/env.js +62 -0
- package/dist/utils/errors.d.ts +75 -0
- package/dist/utils/errors.js +202 -0
- package/dist/utils/file_resolver.d.ts +126 -0
- package/dist/utils/file_resolver.js +314 -0
- package/dist/utils/file_storage.d.ts +99 -0
- package/dist/utils/file_storage.js +100 -0
- package/dist/utils/frame_queue.d.ts +36 -0
- package/dist/utils/frame_queue.js +66 -0
- package/dist/utils/http.d.ts +39 -0
- package/dist/utils/http.js +53 -0
- package/dist/utils/image.d.ts +15 -0
- package/dist/utils/image.js +30 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/log_config.d.ts +34 -0
- package/dist/utils/log_config.js +76 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/mixin.d.ts +14 -0
- package/dist/utils/mixin.js +63 -0
- package/dist/utils/network.d.ts +73 -0
- package/dist/utils/network.js +90 -0
- package/dist/utils/security/allowed_origins.d.ts +16 -0
- package/dist/utils/security/allowed_origins.js +34 -0
- package/dist/utils/security/index.d.ts +2 -0
- package/dist/utils/security/index.js +7 -0
- package/dist/utils/security/redaction.d.ts +27 -0
- package/dist/utils/security/redaction.js +123 -0
- package/dist/utils/security/ssrf.d.ts +79 -0
- package/dist/utils/security/ssrf.js +327 -0
- package/dist/utils/shared.d.ts +35 -0
- package/dist/utils/shared.js +136 -0
- package/dist/utils/startup.d.ts +17 -0
- package/dist/utils/startup.js +130 -0
- package/dist/utils/string.d.ts +116 -0
- package/dist/utils/string.js +460 -0
- package/dist/utils/sync/base_notifier.d.ts +25 -0
- package/dist/utils/sync/base_notifier.js +16 -0
- package/dist/utils/sync/event_notifier.d.ts +38 -0
- package/dist/utils/sync/event_notifier.js +51 -0
- package/dist/utils/sync/index.d.ts +2 -0
- package/dist/utils/sync/index.js +7 -0
- package/dist/utils/text/alnum_utils.d.ts +109 -0
- package/dist/utils/text/alnum_utils.js +262 -0
- package/dist/utils/text/base_text_aggregator.d.ts +146 -0
- package/dist/utils/text/base_text_aggregator.js +102 -0
- package/dist/utils/text/base_text_filter.d.ts +54 -0
- package/dist/utils/text/base_text_filter.js +50 -0
- package/dist/utils/text/index.d.ts +2 -0
- package/dist/utils/text/index.js +7 -0
- package/dist/utils/text/markdown_text_filter.d.ts +147 -0
- package/dist/utils/text/markdown_text_filter.js +522 -0
- package/dist/utils/text/markup_utils.d.ts +54 -0
- package/dist/utils/text/markup_utils.js +156 -0
- package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
- package/dist/utils/text/pattern_pair_aggregator.js +478 -0
- package/dist/utils/text/phonemes.d.ts +60 -0
- package/dist/utils/text/phonemes.js +172 -0
- package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
- package/dist/utils/text/simple_text_aggregator.js +254 -0
- package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
- package/dist/utils/text/skip_tags_aggregator.js +147 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +111 -0
- package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
- package/dist/utils/text/word_timestamp_utils.js +52 -0
- package/dist/utils/time.d.ts +13 -0
- package/dist/utils/time.js +31 -0
- package/dist/utils/tracing/index.d.ts +3 -0
- package/dist/utils/tracing/index.js +8 -0
- package/dist/utils/tracing/service_attributes.d.ts +198 -0
- package/dist/utils/tracing/service_attributes.js +434 -0
- package/dist/utils/tracing/service_decorators.d.ts +214 -0
- package/dist/utils/tracing/service_decorators.js +1662 -0
- package/dist/utils/tracing/setup.d.ts +95 -0
- package/dist/utils/tracing/setup.js +110 -0
- package/dist/utils/tracing/tracing_context.d.ts +55 -0
- package/dist/utils/tracing/tracing_context.js +97 -0
- package/dist/utils/tracing/turn_trace_observer.d.ts +90 -0
- package/dist/utils/tracing/turn_trace_observer.js +219 -0
- package/dist/utils/types.d.ts +80 -0
- package/dist/utils/types.js +108 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.js +22 -0
- package/dist/utils/yaml.d.ts +64 -0
- package/dist/utils/yaml.js +41 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +7 -0
- package/dist/workers/base_worker.d.ts +772 -0
- package/dist/workers/base_worker.js +1298 -0
- package/dist/workers/index.d.ts +2 -0
- package/dist/workers/index.js +8 -0
- package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
- package/dist/workers/llm/backend_llm_worker.js +1055 -0
- package/dist/workers/llm/index.d.ts +6 -0
- package/dist/workers/llm/index.js +11 -0
- package/dist/workers/llm/llm_context_worker.d.ts +66 -0
- package/dist/workers/llm/llm_context_worker.js +72 -0
- package/dist/workers/llm/llm_worker.d.ts +180 -0
- package/dist/workers/llm/llm_worker.js +323 -0
- package/dist/workers/llm/tool_decorator.d.ts +68 -0
- package/dist/workers/llm/tool_decorator.js +60 -0
- package/dist/workers/runner.d.ts +268 -0
- package/dist/workers/runner.js +489 -0
- package/dist/workers/ui/index.d.ts +22 -0
- package/dist/workers/ui/index.js +27 -0
- package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
- package/dist/workers/ui/ui_event_decorator.js +75 -0
- package/dist/workers/ui/ui_job_context.d.ts +12 -0
- package/dist/workers/ui/ui_job_context.js +17 -0
- package/dist/workers/ui/ui_prompts.d.ts +21 -0
- package/dist/workers/ui/ui_prompts.js +41 -0
- package/dist/workers/ui/ui_tools.d.ts +32 -0
- package/dist/workers/ui/ui_tools.js +112 -0
- package/dist/workers/ui/ui_worker.d.ts +571 -0
- package/dist/workers/ui/ui_worker.js +1156 -0
- package/package.json +46 -3
- package/README.md +0 -5
|
@@ -0,0 +1,511 @@
|
|
|
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/utils/context/llm_context_summarization.py
|
|
6
|
+
/**
|
|
7
|
+
* Utility for context summarization in LLM services.
|
|
8
|
+
*
|
|
9
|
+
* This module provides reusable functionality for automatically compressing
|
|
10
|
+
* conversation context when token limits are reached, enabling efficient
|
|
11
|
+
* long-running conversations.
|
|
12
|
+
*
|
|
13
|
+
* The deprecated `LLMContextSummarizationConfig` is not ported; use
|
|
14
|
+
* `LLMAutoContextSummarizationConfig` with a nested `LLMContextSummaryConfig`.
|
|
15
|
+
*/
|
|
16
|
+
import { LLMSpecificMessage, } from "../../processors/aggregators/llm_context.js";
|
|
17
|
+
import { logger } from "../logger.js";
|
|
18
|
+
/** Fallback timeout (seconds) used when summarizationTimeout is null. */
|
|
19
|
+
export const DEFAULT_SUMMARIZATION_TIMEOUT = 120.0;
|
|
20
|
+
// Token estimation constants
|
|
21
|
+
/** Industry-standard heuristic: 1 token ≈ 4 characters. */
|
|
22
|
+
export const CHARS_PER_TOKEN = 4;
|
|
23
|
+
/** Estimated structural overhead per message. */
|
|
24
|
+
export const TOKEN_OVERHEAD_PER_MESSAGE = 10;
|
|
25
|
+
/** Rough estimate for image content. */
|
|
26
|
+
export const IMAGE_TOKEN_ESTIMATE = 500;
|
|
27
|
+
/** Keep summary at 80% of available space for safety. */
|
|
28
|
+
export const SUMMARY_TOKEN_BUFFER = 0.8;
|
|
29
|
+
/** Minimum tokens to allocate for summary. */
|
|
30
|
+
export const MIN_SUMMARY_TOKENS = 100;
|
|
31
|
+
export const DEFAULT_SUMMARIZATION_PROMPT = `You are summarizing a conversation between a user and an AI assistant.
|
|
32
|
+
|
|
33
|
+
Your task:
|
|
34
|
+
1. Create a concise summary that preserves:
|
|
35
|
+
- Key facts, decisions, and agreements
|
|
36
|
+
- Important context needed to continue the conversation
|
|
37
|
+
- User preferences and requirements mentioned
|
|
38
|
+
- Any unresolved questions or action items
|
|
39
|
+
|
|
40
|
+
2. Format:
|
|
41
|
+
- Use clear, factual statements
|
|
42
|
+
- Group related information
|
|
43
|
+
- Prioritize information likely to be referenced later
|
|
44
|
+
- Keep the summary concise to fit within the specified token budget
|
|
45
|
+
|
|
46
|
+
3. Omit:
|
|
47
|
+
- Greetings and small talk
|
|
48
|
+
- Redundant information
|
|
49
|
+
- Tangential discussions that were resolved
|
|
50
|
+
|
|
51
|
+
The conversation transcript follows. Generate only the summary, no other text.`;
|
|
52
|
+
/**
|
|
53
|
+
* Configuration for summary generation parameters.
|
|
54
|
+
*
|
|
55
|
+
* Contains settings that control how a summary is generated. Used by both
|
|
56
|
+
* automatic and manual summarization modes. See
|
|
57
|
+
* `LLMContextSummaryConfigOptions` for the fields.
|
|
58
|
+
*/
|
|
59
|
+
export class LLMContextSummaryConfig {
|
|
60
|
+
targetContextTokens;
|
|
61
|
+
minMessagesAfterSummary;
|
|
62
|
+
summarizationPrompt;
|
|
63
|
+
summaryMessageTemplate;
|
|
64
|
+
llm;
|
|
65
|
+
summarizationTimeout;
|
|
66
|
+
/**
|
|
67
|
+
* @throws Error If a parameter is out of range (upstream: ValueError).
|
|
68
|
+
*/
|
|
69
|
+
constructor(options = {}) {
|
|
70
|
+
this.targetContextTokens = options.targetContextTokens ?? 6000;
|
|
71
|
+
this.minMessagesAfterSummary = options.minMessagesAfterSummary ?? 4;
|
|
72
|
+
this.summarizationPrompt = options.summarizationPrompt ?? null;
|
|
73
|
+
this.summaryMessageTemplate =
|
|
74
|
+
options.summaryMessageTemplate ?? "Conversation summary: {summary}";
|
|
75
|
+
this.llm = options.llm ?? null;
|
|
76
|
+
this.summarizationTimeout = options.summarizationTimeout ?? DEFAULT_SUMMARIZATION_TIMEOUT;
|
|
77
|
+
// Validate configuration parameters.
|
|
78
|
+
if (this.targetContextTokens <= 0) {
|
|
79
|
+
throw new Error("target_context_tokens must be positive");
|
|
80
|
+
}
|
|
81
|
+
if (this.minMessagesAfterSummary < 0) {
|
|
82
|
+
throw new Error("min_messages_after_summary must be non-negative");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The summarization prompt to use: the custom prompt if set, otherwise the
|
|
87
|
+
* default summarization prompt.
|
|
88
|
+
*/
|
|
89
|
+
get summaryPrompt() {
|
|
90
|
+
return this.summarizationPrompt || DEFAULT_SUMMARIZATION_PROMPT;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Configuration for automatic context summarization.
|
|
95
|
+
*
|
|
96
|
+
* Controls when conversation context is automatically compressed and how
|
|
97
|
+
* that summary is generated. Summarization is triggered when either the
|
|
98
|
+
* token limit or the unsummarized message count threshold is exceeded.
|
|
99
|
+
*
|
|
100
|
+
* At least one of `maxContextTokens` and `maxUnsummarizedMessages` must be
|
|
101
|
+
* set. Set the other to null to disable that threshold.
|
|
102
|
+
*/
|
|
103
|
+
export class LLMAutoContextSummarizationConfig {
|
|
104
|
+
maxContextTokens;
|
|
105
|
+
maxUnsummarizedMessages;
|
|
106
|
+
summaryConfig;
|
|
107
|
+
/**
|
|
108
|
+
* @throws Error If a parameter is out of range (upstream: ValueError).
|
|
109
|
+
*/
|
|
110
|
+
constructor(options = {}) {
|
|
111
|
+
this.maxContextTokens =
|
|
112
|
+
options.maxContextTokens === undefined ? 8000 : options.maxContextTokens;
|
|
113
|
+
this.maxUnsummarizedMessages =
|
|
114
|
+
options.maxUnsummarizedMessages === undefined ? 20 : options.maxUnsummarizedMessages;
|
|
115
|
+
this.summaryConfig = options.summaryConfig ?? new LLMContextSummaryConfig();
|
|
116
|
+
// Validate configuration parameters.
|
|
117
|
+
if (this.maxContextTokens === null && this.maxUnsummarizedMessages === null) {
|
|
118
|
+
throw new Error("At least one of max_context_tokens and max_unsummarized_messages must be set");
|
|
119
|
+
}
|
|
120
|
+
if (this.maxContextTokens !== null && this.maxContextTokens <= 0) {
|
|
121
|
+
throw new Error("max_context_tokens must be positive");
|
|
122
|
+
}
|
|
123
|
+
if (this.maxUnsummarizedMessages !== null && this.maxUnsummarizedMessages < 1) {
|
|
124
|
+
throw new Error("max_unsummarized_messages must be at least 1");
|
|
125
|
+
}
|
|
126
|
+
// Auto-adjust targetContextTokens if it exceeds maxContextTokens
|
|
127
|
+
if (this.maxContextTokens !== null &&
|
|
128
|
+
this.summaryConfig.targetContextTokens > this.maxContextTokens) {
|
|
129
|
+
// Use 80% of maxContextTokens as a reasonable default
|
|
130
|
+
this.summaryConfig.targetContextTokens = Math.trunc(this.maxContextTokens * 0.8);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Result of the getMessagesToSummarize operation.
|
|
136
|
+
*
|
|
137
|
+
* - `messages`: Messages to include in the summary.
|
|
138
|
+
* - `lastSummarizedIndex`: Index of the last message being summarized.
|
|
139
|
+
*/
|
|
140
|
+
export class LLMMessagesToSummarize {
|
|
141
|
+
messages;
|
|
142
|
+
lastSummarizedIndex;
|
|
143
|
+
constructor(options) {
|
|
144
|
+
this.messages = options.messages;
|
|
145
|
+
this.lastSummarizedIndex = options.lastSummarizedIndex;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function isDict(value) {
|
|
149
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
150
|
+
}
|
|
151
|
+
/** A standard (OpenAI-format) message seen as a dict, as upstream reads it. */
|
|
152
|
+
function asDict(message) {
|
|
153
|
+
return message;
|
|
154
|
+
}
|
|
155
|
+
function getString(dict, key, fallback) {
|
|
156
|
+
const value = dict[key];
|
|
157
|
+
return value === undefined || value === null ? fallback : String(value);
|
|
158
|
+
}
|
|
159
|
+
/** Python's `json.loads(...)`, returning undefined instead of raising. */
|
|
160
|
+
function tryParseJson(content) {
|
|
161
|
+
try {
|
|
162
|
+
return JSON.parse(content);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Utility providing context summarization capabilities for LLM processing.
|
|
170
|
+
*
|
|
171
|
+
* This utility enables automatic conversation context compression when token
|
|
172
|
+
* limits are reached. It provides functionality for both aggregators
|
|
173
|
+
* (which decide when to summarize) and LLM services (which generate summaries).
|
|
174
|
+
*
|
|
175
|
+
* Key features:
|
|
176
|
+
* - Token estimation using character-count heuristics (chars / 4)
|
|
177
|
+
* - Smart message selection (preserves system messages and recent context)
|
|
178
|
+
* - Function call awareness (avoids summarizing incomplete tool interactions)
|
|
179
|
+
* - Flexible transcript formatting for summarization
|
|
180
|
+
* - Maximum summary token calculation with safety buffers
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* // Use the static methods directly on the class:
|
|
184
|
+
* const tokens = LLMContextSummarizationUtil.estimateContextTokens(context);
|
|
185
|
+
* const result = LLMContextSummarizationUtil.getMessagesToSummarize(context, 4);
|
|
186
|
+
* const transcript = LLMContextSummarizationUtil.formatMessagesForSummary(messages);
|
|
187
|
+
*
|
|
188
|
+
* Note: token estimation uses the industry-standard heuristic of 1 token ≈ 4 characters.
|
|
189
|
+
*/
|
|
190
|
+
export class LLMContextSummarizationUtil {
|
|
191
|
+
/**
|
|
192
|
+
* Estimate token count for text using character count heuristic.
|
|
193
|
+
*
|
|
194
|
+
* Uses the industry-standard approximation of 1 token ≈ 4 characters.
|
|
195
|
+
* This works well across different content types (prose, code, etc.)
|
|
196
|
+
* and languages.
|
|
197
|
+
*
|
|
198
|
+
* Note: for more accurate token counts, use the model's official tokenizer.
|
|
199
|
+
* This is a rough estimate suitable for threshold checks and budgeting.
|
|
200
|
+
*
|
|
201
|
+
* @param text Text to estimate tokens for.
|
|
202
|
+
* @returns Estimated token count (characters / 4, rounded down).
|
|
203
|
+
*/
|
|
204
|
+
static estimateTokens(text) {
|
|
205
|
+
if (!text) {
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
|
208
|
+
// Count code points, as Python's len() does.
|
|
209
|
+
let length = 0;
|
|
210
|
+
for (const _ of text)
|
|
211
|
+
length++;
|
|
212
|
+
return Math.floor(length / CHARS_PER_TOKEN);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Estimate total token count for a context.
|
|
216
|
+
*
|
|
217
|
+
* Calculates an approximate token count by analyzing all messages,
|
|
218
|
+
* including text content, tool calls, and structural overhead.
|
|
219
|
+
*
|
|
220
|
+
* @param context LLM context to estimate.
|
|
221
|
+
* @returns The estimated total token count, covering message content (text
|
|
222
|
+
* and images), tool calls and their arguments, tool results, and
|
|
223
|
+
* `TOKEN_OVERHEAD_PER_MESSAGE` of structural overhead per message.
|
|
224
|
+
*/
|
|
225
|
+
static estimateContextTokens(context) {
|
|
226
|
+
let total = 0;
|
|
227
|
+
for (const message of context.messages) {
|
|
228
|
+
// LLMSpecificMessage holds service-specific data (e.g. thinking blocks,
|
|
229
|
+
// thought signatures). Skipping them here for now.
|
|
230
|
+
if (message instanceof LLMSpecificMessage) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const msg = asDict(message);
|
|
234
|
+
// Role and structure overhead
|
|
235
|
+
total += TOKEN_OVERHEAD_PER_MESSAGE;
|
|
236
|
+
// Message content
|
|
237
|
+
const content = msg.content ?? "";
|
|
238
|
+
if (typeof content === "string") {
|
|
239
|
+
total += LLMContextSummarizationUtil.estimateTokens(content);
|
|
240
|
+
}
|
|
241
|
+
else if (Array.isArray(content)) {
|
|
242
|
+
for (const item of content) {
|
|
243
|
+
if (isDict(item)) {
|
|
244
|
+
const itemType = item.type ?? "";
|
|
245
|
+
// Text content
|
|
246
|
+
if (itemType === "text") {
|
|
247
|
+
total += LLMContextSummarizationUtil.estimateTokens(getString(item, "text", ""));
|
|
248
|
+
}
|
|
249
|
+
// Image content
|
|
250
|
+
else if (itemType === "image_url" || itemType === "image") {
|
|
251
|
+
// Images are expensive, rough estimate
|
|
252
|
+
total += IMAGE_TOKEN_ESTIMATE;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Tool calls
|
|
258
|
+
if ("tool_calls" in msg) {
|
|
259
|
+
const toolCalls = msg.tool_calls;
|
|
260
|
+
if (Array.isArray(toolCalls)) {
|
|
261
|
+
for (const toolCall of toolCalls) {
|
|
262
|
+
if (isDict(toolCall)) {
|
|
263
|
+
const func = toolCall.function ?? {};
|
|
264
|
+
if (isDict(func)) {
|
|
265
|
+
total += LLMContextSummarizationUtil.estimateTokens(getString(func, "name", "") + getString(func, "arguments", ""));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Tool call ID
|
|
272
|
+
if ("tool_call_id" in msg) {
|
|
273
|
+
total += TOKEN_OVERHEAD_PER_MESSAGE;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return total;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Return true if a tool message content represents an unresolved call.
|
|
280
|
+
*
|
|
281
|
+
* A tool message is considered pending (unresolved) when its content is
|
|
282
|
+
* the synchronous `"IN_PROGRESS"` sentinel or the async
|
|
283
|
+
* `{"type": "async_tool", "status": "started"}` marker — both indicate
|
|
284
|
+
* that the actual result has not yet been written back to the context.
|
|
285
|
+
*
|
|
286
|
+
* @param content The `content` field of a tool-role context message.
|
|
287
|
+
* @returns True if the tool call should be treated as still in progress.
|
|
288
|
+
*/
|
|
289
|
+
static _isToolMessagePending(content) {
|
|
290
|
+
if (content === "IN_PROGRESS") {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
const parsed = tryParseJson(content);
|
|
294
|
+
if (isDict(parsed) && parsed.type === "async_tool" && parsed.status === "started") {
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Find the earliest message index with incomplete function calls.
|
|
301
|
+
*
|
|
302
|
+
* Scans messages from `startIdx` up to (but not including) `summaryEnd`
|
|
303
|
+
* to identify tool calls whose responses either don't exist yet, fall in
|
|
304
|
+
* the kept portion of the context (>= summaryEnd), or are still marked as
|
|
305
|
+
* `IN_PROGRESS` (async calls whose results have not yet arrived).
|
|
306
|
+
*
|
|
307
|
+
* This prevents summarizing tool call requests when their responses would
|
|
308
|
+
* remain in the kept context as orphans, which the OpenAI API rejects,
|
|
309
|
+
* and avoids summarizing async function calls before their results arrive.
|
|
310
|
+
*
|
|
311
|
+
* @param messages List of messages to check.
|
|
312
|
+
* @param startIdx Index to start checking from.
|
|
313
|
+
* @param summaryEnd Exclusive upper bound for the scan (the first kept
|
|
314
|
+
* message index). Only tool responses within this range count as
|
|
315
|
+
* completing a call; responses beyond it are treated as absent, leaving
|
|
316
|
+
* the call "in progress".
|
|
317
|
+
* @returns Index of first message with function call in progress, or -1 if
|
|
318
|
+
* all function calls are complete within the scanned range.
|
|
319
|
+
*/
|
|
320
|
+
static _getEarliestFunctionCallNotResolvedInRange(messages, startIdx, summaryEnd) {
|
|
321
|
+
// Track tool call IDs mapped to their message index
|
|
322
|
+
const pendingToolCalls = new Map();
|
|
323
|
+
for (let i = startIdx; i < summaryEnd; i++) {
|
|
324
|
+
const message = messages[i];
|
|
325
|
+
// LLMSpecificMessage instances (e.g. thinking blocks) never carry
|
|
326
|
+
// tool_call or tool_call_id fields, so they cannot affect the
|
|
327
|
+
// pending-call tracking.
|
|
328
|
+
if (message instanceof LLMSpecificMessage) {
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const msg = asDict(message);
|
|
332
|
+
const role = msg.role;
|
|
333
|
+
// Check for tool calls in assistant messages
|
|
334
|
+
if (role === "assistant" && "tool_calls" in msg) {
|
|
335
|
+
const toolCalls = msg.tool_calls ?? [];
|
|
336
|
+
if (Array.isArray(toolCalls)) {
|
|
337
|
+
for (const toolCall of toolCalls) {
|
|
338
|
+
if (isDict(toolCall)) {
|
|
339
|
+
const toolCallId = toolCall.id;
|
|
340
|
+
if (toolCallId) {
|
|
341
|
+
pendingToolCalls.set(String(toolCallId), i);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// Check for tool results — treat IN_PROGRESS and async "started"
|
|
348
|
+
// messages as still pending so they are not summarized away before
|
|
349
|
+
// their results arrive.
|
|
350
|
+
if (role === "tool") {
|
|
351
|
+
const toolCallId = msg.tool_call_id;
|
|
352
|
+
if (toolCallId && pendingToolCalls.has(String(toolCallId))) {
|
|
353
|
+
let content = msg.content ?? "";
|
|
354
|
+
if (typeof content !== "string") {
|
|
355
|
+
content = "";
|
|
356
|
+
}
|
|
357
|
+
if (!LLMContextSummarizationUtil._isToolMessagePending(content)) {
|
|
358
|
+
pendingToolCalls.delete(String(toolCallId));
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// Check for async tool completion — a developer message with
|
|
363
|
+
// {"type": "async_tool", "status": "finished"} signals that the
|
|
364
|
+
// async result has arrived and the call is now resolved.
|
|
365
|
+
if (role === "developer") {
|
|
366
|
+
const content = msg.content ?? "";
|
|
367
|
+
if (typeof content !== "string") {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
const parsed = tryParseJson(content);
|
|
371
|
+
if (isDict(parsed) && parsed.type === "async_tool" && parsed.status === "finished") {
|
|
372
|
+
const toolCallId = parsed.tool_call_id;
|
|
373
|
+
if (toolCallId && pendingToolCalls.has(String(toolCallId))) {
|
|
374
|
+
pendingToolCalls.delete(String(toolCallId));
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// If we have pending tool calls, return the earliest index
|
|
380
|
+
if (pendingToolCalls.size > 0) {
|
|
381
|
+
return Math.min(...pendingToolCalls.values());
|
|
382
|
+
}
|
|
383
|
+
return -1;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Determine which messages should be included in summarization.
|
|
387
|
+
*
|
|
388
|
+
* Intelligently selects messages for summarization while preserving:
|
|
389
|
+
* - The first system message (defines assistant behavior)
|
|
390
|
+
* - The last N messages (maintains immediate conversation context)
|
|
391
|
+
* - Incomplete function call sequences (preserves tool interaction integrity)
|
|
392
|
+
*
|
|
393
|
+
* @param context The LLM context containing all messages.
|
|
394
|
+
* @param minMessagesToKeep Number of recent messages to exclude from summarization.
|
|
395
|
+
* @returns LLMMessagesToSummarize containing the messages to summarize and
|
|
396
|
+
* the index of the last message included.
|
|
397
|
+
*/
|
|
398
|
+
static getMessagesToSummarize(context, minMessagesToKeep) {
|
|
399
|
+
const messages = context.messages;
|
|
400
|
+
if (messages.length <= minMessagesToKeep) {
|
|
401
|
+
return new LLMMessagesToSummarize({ messages: [], lastSummarizedIndex: -1 });
|
|
402
|
+
}
|
|
403
|
+
// Check if the first message is a system message (initial system prompt).
|
|
404
|
+
// Only messages[0] is treated as the system message to preserve — system
|
|
405
|
+
// messages at other positions are mid-conversation injections and should
|
|
406
|
+
// be included in the summarization range.
|
|
407
|
+
const firstMsg = messages.length > 0 ? messages[0] : undefined;
|
|
408
|
+
const firstIsSystem = firstMsg !== undefined &&
|
|
409
|
+
!(firstMsg instanceof LLMSpecificMessage) &&
|
|
410
|
+
asDict(firstMsg).role === "system";
|
|
411
|
+
// Start summarization after the initial system message if present
|
|
412
|
+
const summaryStart = firstIsSystem ? 1 : 0;
|
|
413
|
+
// Get messages to keep (last N messages)
|
|
414
|
+
let summaryEnd = messages.length - minMessagesToKeep;
|
|
415
|
+
if (summaryStart >= summaryEnd) {
|
|
416
|
+
return new LLMMessagesToSummarize({ messages: [], lastSummarizedIndex: -1 });
|
|
417
|
+
}
|
|
418
|
+
// Check for function calls in progress in the range we want to summarize
|
|
419
|
+
const functionCallStart = LLMContextSummarizationUtil._getEarliestFunctionCallNotResolvedInRange(messages, summaryStart, summaryEnd);
|
|
420
|
+
if (functionCallStart >= 0 && functionCallStart < summaryEnd) {
|
|
421
|
+
// Stop summarization before the function call
|
|
422
|
+
logger.debug(`ContextSummarization: Found function call in progress at index ${functionCallStart}, ` +
|
|
423
|
+
`stopping summary before it (was going to summarize up to ${summaryEnd})`);
|
|
424
|
+
// Count how many messages we're skipping
|
|
425
|
+
const skippedMessages = summaryEnd - functionCallStart;
|
|
426
|
+
summaryEnd = functionCallStart;
|
|
427
|
+
if (skippedMessages > 0) {
|
|
428
|
+
logger.info(`ContextSummarization: Skipping ${skippedMessages} messages with ` +
|
|
429
|
+
"function calls in progress (will summarize after results are available)");
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (summaryStart >= summaryEnd) {
|
|
433
|
+
return new LLMMessagesToSummarize({ messages: [], lastSummarizedIndex: -1 });
|
|
434
|
+
}
|
|
435
|
+
const messagesToSummarize = messages.slice(summaryStart, summaryEnd);
|
|
436
|
+
const lastSummarizedIndex = summaryEnd - 1;
|
|
437
|
+
return new LLMMessagesToSummarize({
|
|
438
|
+
messages: messagesToSummarize,
|
|
439
|
+
lastSummarizedIndex,
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Format messages as a transcript for summarization.
|
|
444
|
+
*
|
|
445
|
+
* @param messages Messages to format.
|
|
446
|
+
* @returns Formatted transcript string.
|
|
447
|
+
*/
|
|
448
|
+
static formatMessagesForSummary(messages) {
|
|
449
|
+
const transcriptParts = [];
|
|
450
|
+
for (const message of messages) {
|
|
451
|
+
// LLMSpecificMessage holds service-specific internal data (e.g.
|
|
452
|
+
// Anthropic thinking blocks, Gemini thought signatures). This data is
|
|
453
|
+
// not meaningful as plain text for a summarization transcript, and the
|
|
454
|
+
// summarizer LLM would not know how to interpret it. The
|
|
455
|
+
// conversational content of those turns is already captured by the
|
|
456
|
+
// accompanying standard assistant message.
|
|
457
|
+
if (message instanceof LLMSpecificMessage) {
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
const msg = asDict(message);
|
|
461
|
+
const role = getString(msg, "role", "unknown");
|
|
462
|
+
const content = msg.content === undefined ? "" : msg.content;
|
|
463
|
+
// Handle different content types
|
|
464
|
+
let text;
|
|
465
|
+
if (typeof content === "string") {
|
|
466
|
+
text = content;
|
|
467
|
+
}
|
|
468
|
+
else if (Array.isArray(content)) {
|
|
469
|
+
const textParts = [];
|
|
470
|
+
for (const item of content) {
|
|
471
|
+
if (isDict(item) && item.type === "text") {
|
|
472
|
+
textParts.push(getString(item, "text", ""));
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
text = textParts.join(" ");
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
// Python's str(): a null content reads "None", as upstream formats it.
|
|
479
|
+
text = content === null || content === undefined ? "None" : String(content);
|
|
480
|
+
}
|
|
481
|
+
if (text) {
|
|
482
|
+
// Capitalize role for readability
|
|
483
|
+
const formattedRole = role.toUpperCase();
|
|
484
|
+
transcriptParts.push(`${formattedRole}: ${text}`);
|
|
485
|
+
}
|
|
486
|
+
// Include tool calls if present
|
|
487
|
+
if ("tool_calls" in msg) {
|
|
488
|
+
const toolCalls = msg.tool_calls ?? [];
|
|
489
|
+
if (Array.isArray(toolCalls)) {
|
|
490
|
+
for (const toolCall of toolCalls) {
|
|
491
|
+
if (isDict(toolCall)) {
|
|
492
|
+
const func = toolCall.function ?? {};
|
|
493
|
+
if (isDict(func)) {
|
|
494
|
+
const name = getString(func, "name", "unknown");
|
|
495
|
+
const args = getString(func, "arguments", "");
|
|
496
|
+
transcriptParts.push(`TOOL_CALL: ${name}(${args})`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// Include tool results
|
|
503
|
+
if (role === "tool") {
|
|
504
|
+
const toolCallId = getString(msg, "tool_call_id", "unknown");
|
|
505
|
+
transcriptParts.push(`TOOL_RESULT[${toolCallId}]: ${text}`);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return transcriptParts.join("\n\n");
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=llm_context_summarization.js.map
|