@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,70 @@
|
|
|
1
|
+
import { LLMTokenUsage } from "../../../metrics/metrics.ts";
|
|
2
|
+
import type { BaseTaskManager } from "../../../utils/asyncio/task_manager.ts";
|
|
3
|
+
import { BaseClassifier, type BaseClassifierOptions, type ClassifierImage, type ClassifierQuestion, type ClassifierResult, type ClassifierValue } from "../../base_classifier.ts";
|
|
4
|
+
import { JevClient } from "./client.ts";
|
|
5
|
+
/** The most options Jev takes in one choice question. */
|
|
6
|
+
export declare const JEV_MAX_CHOICE_OPTIONS = 255;
|
|
7
|
+
export interface JevClassifierOptions extends BaseClassifierOptions {
|
|
8
|
+
/** Jev API key, when the classifier should have a client of its own. */
|
|
9
|
+
apiKey?: string | null;
|
|
10
|
+
/** A client to share. One of `apiKey` and `client` is required. */
|
|
11
|
+
client?: JevClient | null;
|
|
12
|
+
/** The Jev model a client of its own asks. */
|
|
13
|
+
model?: string;
|
|
14
|
+
/** Where a client of its own sends its questions. */
|
|
15
|
+
baseUrl?: string;
|
|
16
|
+
/** Seconds a client of its own waits for an answer. */
|
|
17
|
+
timeout?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Answers questions by asking Jev.
|
|
21
|
+
*
|
|
22
|
+
* Jev's probabilities are calibrated. Build one with an API key to get a
|
|
23
|
+
* client of its own, or pass a `JevClient` to share one between several
|
|
24
|
+
* classifiers. A client the classifier created is closed in `cleanup()`; a
|
|
25
|
+
* shared one is left to whoever made it.
|
|
26
|
+
*
|
|
27
|
+
* Jev can see PNG and JPEG images, 256 to 1568 pixels on each side. It reads
|
|
28
|
+
* them as part of the state. TypeSafe offers images as a preview, so their
|
|
29
|
+
* limits may change between Jev releases.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const client = new JevClient({ apiKey: process.env.TYPESAFE_API_KEY! });
|
|
33
|
+
* const turnClassifier = new JevClassifier({ client });
|
|
34
|
+
* const voicemailClassifier = new JevClassifier({ client });
|
|
35
|
+
*/
|
|
36
|
+
export declare class JevClassifier extends BaseClassifier {
|
|
37
|
+
protected _ownsClient: boolean;
|
|
38
|
+
protected _client: JevClient;
|
|
39
|
+
constructor(options?: JevClassifierOptions);
|
|
40
|
+
/** The client this classifier asks through. */
|
|
41
|
+
get client(): JevClient;
|
|
42
|
+
/**
|
|
43
|
+
* Open the connection to Jev ahead of the first question.
|
|
44
|
+
*
|
|
45
|
+
* A connection that cannot be opened now is only a warning: the first
|
|
46
|
+
* question opens it itself.
|
|
47
|
+
*
|
|
48
|
+
* @param taskManager The task manager of the owner.
|
|
49
|
+
*/
|
|
50
|
+
setup(taskManager: BaseTaskManager): Promise<void>;
|
|
51
|
+
/** Close the client if this classifier created it. */
|
|
52
|
+
cleanup(): Promise<void>;
|
|
53
|
+
/** The Jev model the questions go to. */
|
|
54
|
+
get model(): string;
|
|
55
|
+
/** Jev can see images. */
|
|
56
|
+
get supportsImages(): boolean;
|
|
57
|
+
/** Answer the questions in one request. */
|
|
58
|
+
protected _ask(state: ClassifierValue, questions: Readonly<Record<string, ClassifierQuestion>>, images?: readonly ClassifierImage[]): Promise<[Record<string, ClassifierResult>, LLMTokenUsage]>;
|
|
59
|
+
/** An image in Jev's own format. */
|
|
60
|
+
protected _asset(image: ClassifierImage): Record<string, unknown>;
|
|
61
|
+
/** A question in Jev's own format. */
|
|
62
|
+
protected _toJev(question: ClassifierQuestion): Record<string, unknown>;
|
|
63
|
+
/** A result built from Jev's answer to the question. */
|
|
64
|
+
protected _fromJev(question: ClassifierQuestion, answer: Record<string, unknown>): ClassifierResult;
|
|
65
|
+
/** The number Jev wrote under `key`, or a ClassifierError if it did not. */
|
|
66
|
+
protected _number(answer: Record<string, unknown>, key: string): number;
|
|
67
|
+
/** The probability Jev wrote for each key, 0 for the ones it left out. */
|
|
68
|
+
protected _probabilities(answer: Record<string, unknown>, keys: string[]): Record<string, number>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -0,0 +1,220 @@
|
|
|
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/classifiers/typesafe/jev/classifier.py
|
|
6
|
+
/**
|
|
7
|
+
* Classifier backed by Jev, TypeSafe's hosted classification model.
|
|
8
|
+
*
|
|
9
|
+
* `JevClassifier` turns each question into a request and each reply into a
|
|
10
|
+
* result, through a `JevClient`.
|
|
11
|
+
*/
|
|
12
|
+
import { rethrowIfCancelled } from "@pipedog/asyncio";
|
|
13
|
+
import { LLMTokenUsage } from "../../../metrics/metrics.js";
|
|
14
|
+
import { logger } from "../../../utils/logger.js";
|
|
15
|
+
import { BaseClassifier, ChoiceQuestion, ChoiceResult, ClassifierError, ScoreLevel, ScoreResult, YesNoQuestion, YesNoResult, } from "../../base_classifier.js";
|
|
16
|
+
import { bytesToBase64, isDict, orEmpty, toFloat } from "../../http_client.js";
|
|
17
|
+
import { DEFAULT_BASE_URL, DEFAULT_MODEL, DEFAULT_TIMEOUT, JevClient } from "./client.js";
|
|
18
|
+
/** The most options Jev takes in one choice question. */
|
|
19
|
+
export const JEV_MAX_CHOICE_OPTIONS = 255;
|
|
20
|
+
/** Jev's name for each image type it reads. */
|
|
21
|
+
const JEV_IMAGE_FORMATS = { "image/png": "png", "image/jpeg": "jpg" };
|
|
22
|
+
/**
|
|
23
|
+
* Answers questions by asking Jev.
|
|
24
|
+
*
|
|
25
|
+
* Jev's probabilities are calibrated. Build one with an API key to get a
|
|
26
|
+
* client of its own, or pass a `JevClient` to share one between several
|
|
27
|
+
* classifiers. A client the classifier created is closed in `cleanup()`; a
|
|
28
|
+
* shared one is left to whoever made it.
|
|
29
|
+
*
|
|
30
|
+
* Jev can see PNG and JPEG images, 256 to 1568 pixels on each side. It reads
|
|
31
|
+
* them as part of the state. TypeSafe offers images as a preview, so their
|
|
32
|
+
* limits may change between Jev releases.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* const client = new JevClient({ apiKey: process.env.TYPESAFE_API_KEY! });
|
|
36
|
+
* const turnClassifier = new JevClassifier({ client });
|
|
37
|
+
* const voicemailClassifier = new JevClassifier({ client });
|
|
38
|
+
*/
|
|
39
|
+
export class JevClassifier extends BaseClassifier {
|
|
40
|
+
_ownsClient;
|
|
41
|
+
_client;
|
|
42
|
+
constructor(options = {}) {
|
|
43
|
+
super(options);
|
|
44
|
+
this._ownsClient = options.client == null;
|
|
45
|
+
let client = options.client ?? null;
|
|
46
|
+
if (!client) {
|
|
47
|
+
if (!options.apiKey) {
|
|
48
|
+
throw new Error("JevClassifier needs an API key or a JevClient");
|
|
49
|
+
}
|
|
50
|
+
client = new JevClient({
|
|
51
|
+
apiKey: options.apiKey,
|
|
52
|
+
model: options.model ?? DEFAULT_MODEL,
|
|
53
|
+
baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
|
|
54
|
+
timeout: options.timeout ?? DEFAULT_TIMEOUT,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
this._client = client;
|
|
58
|
+
}
|
|
59
|
+
/** The client this classifier asks through. */
|
|
60
|
+
get client() {
|
|
61
|
+
return this._client;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Open the connection to Jev ahead of the first question.
|
|
65
|
+
*
|
|
66
|
+
* A connection that cannot be opened now is only a warning: the first
|
|
67
|
+
* question opens it itself.
|
|
68
|
+
*
|
|
69
|
+
* @param taskManager The task manager of the owner.
|
|
70
|
+
*/
|
|
71
|
+
async setup(taskManager) {
|
|
72
|
+
await super.setup(taskManager);
|
|
73
|
+
try {
|
|
74
|
+
await this._client.connect();
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
if (!(e instanceof ClassifierError)) {
|
|
78
|
+
throw e;
|
|
79
|
+
}
|
|
80
|
+
logger.warning(`${this}: ${e.message}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Close the client if this classifier created it. */
|
|
84
|
+
async cleanup() {
|
|
85
|
+
await super.cleanup();
|
|
86
|
+
if (this._ownsClient) {
|
|
87
|
+
await this._client.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** The Jev model the questions go to. */
|
|
91
|
+
get model() {
|
|
92
|
+
return this._client.model;
|
|
93
|
+
}
|
|
94
|
+
/** Jev can see images. */
|
|
95
|
+
get supportsImages() {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
/** Answer the questions in one request. */
|
|
99
|
+
async _ask(state, questions, images = []) {
|
|
100
|
+
const assets = {};
|
|
101
|
+
for (const image of images) {
|
|
102
|
+
assets[crypto.randomUUID()] = this._asset(image);
|
|
103
|
+
}
|
|
104
|
+
let requestState = state;
|
|
105
|
+
if (Object.keys(assets).length > 0) {
|
|
106
|
+
// Jev reads an image wherever its reference appears, so the references
|
|
107
|
+
// go ahead of the state they come with.
|
|
108
|
+
requestState = { images: Object.keys(assets), state };
|
|
109
|
+
}
|
|
110
|
+
const jevQuestions = {};
|
|
111
|
+
for (const [name, q] of Object.entries(questions)) {
|
|
112
|
+
jevQuestions[name] = this._toJev(q);
|
|
113
|
+
}
|
|
114
|
+
const [answers, usage] = await this._client.ask(requestState, jevQuestions, assets);
|
|
115
|
+
const results = {};
|
|
116
|
+
for (const [name, question] of Object.entries(questions)) {
|
|
117
|
+
results[name] = this._fromJev(question, answers[name]);
|
|
118
|
+
}
|
|
119
|
+
return [
|
|
120
|
+
results,
|
|
121
|
+
new LLMTokenUsage({
|
|
122
|
+
promptTokens: usage.inputTokens,
|
|
123
|
+
completionTokens: usage.outputTokens,
|
|
124
|
+
totalTokens: usage.inputTokens + usage.outputTokens,
|
|
125
|
+
}),
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
/** An image in Jev's own format. */
|
|
129
|
+
_asset(image) {
|
|
130
|
+
const format = JEV_IMAGE_FORMATS[image.contentType];
|
|
131
|
+
if (!format) {
|
|
132
|
+
throw new ClassifierError(`Jev takes PNG or JPEG images, got ${image.contentType}`);
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
type: "image",
|
|
136
|
+
format,
|
|
137
|
+
data_base64: bytesToBase64(image.data),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** A question in Jev's own format. */
|
|
141
|
+
_toJev(question) {
|
|
142
|
+
if (question instanceof YesNoQuestion) {
|
|
143
|
+
const jev = { type: "noul", instructions: question.instructions };
|
|
144
|
+
if (question.yes !== null || question.no !== null) {
|
|
145
|
+
jev.criteria = { true: orEmpty(question.yes), false: orEmpty(question.no) };
|
|
146
|
+
}
|
|
147
|
+
return jev;
|
|
148
|
+
}
|
|
149
|
+
if (question instanceof ChoiceQuestion) {
|
|
150
|
+
const count = Object.keys(question.options).length;
|
|
151
|
+
if (count > JEV_MAX_CHOICE_OPTIONS) {
|
|
152
|
+
throw new ClassifierError(`Jev takes at most ${JEV_MAX_CHOICE_OPTIONS} options, got ${count}`);
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
type: "choice",
|
|
156
|
+
instructions: question.instructions,
|
|
157
|
+
criteria: question.options,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return { type: "score", instructions: question.instructions, criteria: question.levels };
|
|
161
|
+
}
|
|
162
|
+
/** A result built from Jev's answer to the question. */
|
|
163
|
+
_fromJev(question, answer) {
|
|
164
|
+
if (question instanceof YesNoQuestion) {
|
|
165
|
+
return new YesNoResult({ probability: this._number(answer, "noul") });
|
|
166
|
+
}
|
|
167
|
+
if (question instanceof ChoiceQuestion) {
|
|
168
|
+
const choice = String(answer.choice ?? "");
|
|
169
|
+
if (!Object.hasOwn(question.options, choice)) {
|
|
170
|
+
throw new ClassifierError(`Jev chose '${choice}', which is not an option`);
|
|
171
|
+
}
|
|
172
|
+
const probabilities = this._probabilities(answer, Object.keys(question.options));
|
|
173
|
+
return new ChoiceResult({
|
|
174
|
+
choice,
|
|
175
|
+
probabilities,
|
|
176
|
+
confidence: this._number(answer, "confidence"),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Jev keys level probabilities by position.
|
|
180
|
+
const positions = question.levels.map((_level, index) => String(index));
|
|
181
|
+
const probabilities = this._probabilities(answer, positions);
|
|
182
|
+
return new ScoreResult({
|
|
183
|
+
score: this._number(answer, "score"),
|
|
184
|
+
levels: question.levels.map((level, index) => new ScoreLevel({ level, probability: probabilities[positions[index]] ?? 0 })),
|
|
185
|
+
confidence: this._number(answer, "confidence"),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/** The number Jev wrote under `key`, or a ClassifierError if it did not. */
|
|
189
|
+
_number(answer, key) {
|
|
190
|
+
try {
|
|
191
|
+
if (!Object.hasOwn(answer, key)) {
|
|
192
|
+
throw new RangeError(key);
|
|
193
|
+
}
|
|
194
|
+
return toFloat(answer[key]);
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
rethrowIfCancelled(e);
|
|
198
|
+
throw new ClassifierError(`Jev reply has no usable '${key}'`, { cause: e });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/** The probability Jev wrote for each key, 0 for the ones it left out. */
|
|
202
|
+
_probabilities(answer, keys) {
|
|
203
|
+
// Python's `answer.get("probabilities") or {}`: an empty list is falsy too.
|
|
204
|
+
const raw = answer.probabilities;
|
|
205
|
+
const given = !raw || (Array.isArray(raw) && raw.length === 0) ? {} : raw;
|
|
206
|
+
try {
|
|
207
|
+
if (!isDict(given)) {
|
|
208
|
+
throw new TypeError("probabilities is not an object");
|
|
209
|
+
}
|
|
210
|
+
return Object.fromEntries(keys.map((key) => [key, toFloat(Object.hasOwn(given, key) ? given[key] : 0.0)]));
|
|
211
|
+
}
|
|
212
|
+
catch (e) {
|
|
213
|
+
rethrowIfCancelled(e);
|
|
214
|
+
throw new ClassifierError(`Jev reply has an unusable probability: ${e.message}`, {
|
|
215
|
+
cause: e,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=classifier.js.map
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for Jev, TypeSafe's hosted classification model.
|
|
3
|
+
*
|
|
4
|
+
* One `JevClient` holds one connection pool, adds the auth header, retries
|
|
5
|
+
* when Jev is busy, and counts the tokens every request used. Several
|
|
6
|
+
* `JevClassifier` instances can share one.
|
|
7
|
+
*
|
|
8
|
+
* PORTING NOTE: upstream uses `httpx` with HTTP/2 and a 240 s keep-alive;
|
|
9
|
+
* here requests go through `fetch` (see `../../http_client.ts`), and
|
|
10
|
+
* connection reuse is left to the runtime.
|
|
11
|
+
*/
|
|
12
|
+
import { Lock } from "@pipedog/asyncio";
|
|
13
|
+
import { HttpClient, type HttpResponse } from "../../http_client.ts";
|
|
14
|
+
/** Where the API is served. */
|
|
15
|
+
export declare const DEFAULT_BASE_URL = "https://api.typesafe.ai";
|
|
16
|
+
/** The Jev model to ask. Pinned so thresholds tuned against it hold. */
|
|
17
|
+
export declare const DEFAULT_MODEL = "jev-1.13.0";
|
|
18
|
+
/** Seconds to wait for a reply before giving up. */
|
|
19
|
+
export declare const DEFAULT_TIMEOUT = 10;
|
|
20
|
+
export interface JevUsageOptions {
|
|
21
|
+
/** Tokens sent. */
|
|
22
|
+
inputTokens?: number;
|
|
23
|
+
/** Tokens received. */
|
|
24
|
+
outputTokens?: number;
|
|
25
|
+
}
|
|
26
|
+
/** Tokens Jev used: for one request, or over every request in `JevClient.usage`. */
|
|
27
|
+
export declare class JevUsage {
|
|
28
|
+
inputTokens: number;
|
|
29
|
+
outputTokens: number;
|
|
30
|
+
constructor(options?: JevUsageOptions);
|
|
31
|
+
/** Build a usage from Jev's wire format (`input_tokens`, `output_tokens`). */
|
|
32
|
+
static fromDict(data: Record<string, unknown>): JevUsage;
|
|
33
|
+
}
|
|
34
|
+
export interface JevClientOptions {
|
|
35
|
+
/** Jev API key. */
|
|
36
|
+
apiKey: string;
|
|
37
|
+
/** Where the API is served. */
|
|
38
|
+
baseUrl?: string;
|
|
39
|
+
/**
|
|
40
|
+
* The Jev model to ask. Pinned so thresholds tuned against it keep
|
|
41
|
+
* holding; `jev-latest` follows TypeSafe's newest release.
|
|
42
|
+
*/
|
|
43
|
+
model?: string;
|
|
44
|
+
/** Seconds to wait for a reply before giving up. */
|
|
45
|
+
timeout?: number;
|
|
46
|
+
/** How many times to retry a request Jev refused because it was busy. */
|
|
47
|
+
maxRetries?: number;
|
|
48
|
+
/** The transport requests go through; the global `fetch` by default. */
|
|
49
|
+
fetch?: typeof fetch;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* HTTP client for Jev's `systemone` endpoint.
|
|
53
|
+
*
|
|
54
|
+
* Many small requests can be in flight at the same time. Retries with
|
|
55
|
+
* backoff when Jev answers 429 or 529. Counts the tokens every request used
|
|
56
|
+
* in `usage`.
|
|
57
|
+
*
|
|
58
|
+
* `connect()` opens the connection ahead of the first question, and
|
|
59
|
+
* `close()` releases it.
|
|
60
|
+
*/
|
|
61
|
+
export declare class JevClient {
|
|
62
|
+
protected _model: string;
|
|
63
|
+
protected _maxRetries: number;
|
|
64
|
+
protected _usage: JevUsage;
|
|
65
|
+
protected _connected: boolean;
|
|
66
|
+
protected _connectLock: Lock;
|
|
67
|
+
protected _http: HttpClient;
|
|
68
|
+
constructor(options: JevClientOptions);
|
|
69
|
+
/** The Jev model the questions go to. */
|
|
70
|
+
get model(): string;
|
|
71
|
+
/** Tokens used so far, over every request. */
|
|
72
|
+
get usage(): JevUsage;
|
|
73
|
+
/**
|
|
74
|
+
* Open the connection to Jev.
|
|
75
|
+
*
|
|
76
|
+
* Lists the models, the cheapest request there is, so the first question
|
|
77
|
+
* finds the connection already open. Connects once: a client shared by
|
|
78
|
+
* several classifiers is asked by each of them, and only the first call
|
|
79
|
+
* sends anything.
|
|
80
|
+
*
|
|
81
|
+
* @throws ClassifierError If Jev could not be reached or refused the request.
|
|
82
|
+
*/
|
|
83
|
+
connect(): Promise<void>;
|
|
84
|
+
/** Close the connection pool. */
|
|
85
|
+
close(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Send questions about one state and return Jev's answers.
|
|
88
|
+
*
|
|
89
|
+
* @param state What the questions are about.
|
|
90
|
+
* @param questions The questions by name, each in Jev's own format: a
|
|
91
|
+
* `type` of `noul`, `choice` or `score`, `instructions`, and `criteria`.
|
|
92
|
+
* @param assets Images by reference, each in Jev's own format: a `format`
|
|
93
|
+
* and the `data_base64` bytes. Each reference must appear in the state or
|
|
94
|
+
* the questions, where Jev reads the image in its place.
|
|
95
|
+
* @returns The answers by the same names, in Jev's own format, and the
|
|
96
|
+
* tokens the request used.
|
|
97
|
+
* @throws ClassifierError If Jev rejected the request, kept refusing it
|
|
98
|
+
* because it was busy, could not be reached, or left a question
|
|
99
|
+
* unanswered.
|
|
100
|
+
*/
|
|
101
|
+
ask(state: unknown, questions: Readonly<Record<string, Record<string, unknown>>>, assets?: Readonly<Record<string, Record<string, unknown>>> | null): Promise<[Record<string, Record<string, unknown>>, JevUsage]>;
|
|
102
|
+
/** The reason Jev gave for rejecting a request, if it gave one. */
|
|
103
|
+
protected _errorMessage(response: HttpResponse): string | null;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1,233 @@
|
|
|
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/classifiers/typesafe/jev/client.py
|
|
6
|
+
/**
|
|
7
|
+
* HTTP client for Jev, TypeSafe's hosted classification model.
|
|
8
|
+
*
|
|
9
|
+
* One `JevClient` holds one connection pool, adds the auth header, retries
|
|
10
|
+
* when Jev is busy, and counts the tokens every request used. Several
|
|
11
|
+
* `JevClassifier` instances can share one.
|
|
12
|
+
*
|
|
13
|
+
* PORTING NOTE: upstream uses `httpx` with HTTP/2 and a 240 s keep-alive;
|
|
14
|
+
* here requests go through `fetch` (see `../../http_client.ts`), and
|
|
15
|
+
* connection reuse is left to the runtime.
|
|
16
|
+
*/
|
|
17
|
+
import { Lock, rethrowIfCancelled, sleep } from "@pipedog/asyncio";
|
|
18
|
+
import { logger } from "../../../utils/logger.js";
|
|
19
|
+
import { exponentialBackoffTime } from "../../../utils/network.js";
|
|
20
|
+
import { ClassifierError } from "../../base_classifier.js";
|
|
21
|
+
import { errorRepr, HttpClient, HttpError, isDict } from "../../http_client.js";
|
|
22
|
+
/** Jev answers a request with this status when the caller is rate limited. */
|
|
23
|
+
const TOO_MANY_REQUESTS = 429;
|
|
24
|
+
/** Jev answers a request with this status when it is temporarily overloaded. */
|
|
25
|
+
const OVERLOADED = 529;
|
|
26
|
+
/** Jev reads images only in requests that send this header. */
|
|
27
|
+
const IMAGES_HEADER = "TypeSafe-Danger-Zone-Images";
|
|
28
|
+
/** Where the API is served. */
|
|
29
|
+
export const DEFAULT_BASE_URL = "https://api.typesafe.ai";
|
|
30
|
+
/** The Jev model to ask. Pinned so thresholds tuned against it hold. */
|
|
31
|
+
export const DEFAULT_MODEL = "jev-1.13.0";
|
|
32
|
+
/** Seconds to wait for a reply before giving up. */
|
|
33
|
+
export const DEFAULT_TIMEOUT = 10.0;
|
|
34
|
+
/** Tokens Jev used: for one request, or over every request in `JevClient.usage`. */
|
|
35
|
+
export class JevUsage {
|
|
36
|
+
inputTokens;
|
|
37
|
+
outputTokens;
|
|
38
|
+
constructor(options = {}) {
|
|
39
|
+
this.inputTokens = options.inputTokens ?? 0;
|
|
40
|
+
this.outputTokens = options.outputTokens ?? 0;
|
|
41
|
+
}
|
|
42
|
+
/** Build a usage from Jev's wire format (`input_tokens`, `output_tokens`). */
|
|
43
|
+
static fromDict(data) {
|
|
44
|
+
return new JevUsage({
|
|
45
|
+
inputTokens: data.input_tokens ?? 0,
|
|
46
|
+
outputTokens: data.output_tokens ?? 0,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* HTTP client for Jev's `systemone` endpoint.
|
|
52
|
+
*
|
|
53
|
+
* Many small requests can be in flight at the same time. Retries with
|
|
54
|
+
* backoff when Jev answers 429 or 529. Counts the tokens every request used
|
|
55
|
+
* in `usage`.
|
|
56
|
+
*
|
|
57
|
+
* `connect()` opens the connection ahead of the first question, and
|
|
58
|
+
* `close()` releases it.
|
|
59
|
+
*/
|
|
60
|
+
export class JevClient {
|
|
61
|
+
_model;
|
|
62
|
+
_maxRetries;
|
|
63
|
+
_usage = new JevUsage();
|
|
64
|
+
_connected = false;
|
|
65
|
+
_connectLock = new Lock();
|
|
66
|
+
_http;
|
|
67
|
+
constructor(options) {
|
|
68
|
+
if (!options.apiKey) {
|
|
69
|
+
throw new Error("JevClient needs an API key");
|
|
70
|
+
}
|
|
71
|
+
this._model = options.model ?? DEFAULT_MODEL;
|
|
72
|
+
this._maxRetries = options.maxRetries ?? 3;
|
|
73
|
+
this._http = new HttpClient({
|
|
74
|
+
baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
|
|
75
|
+
headers: { Authorization: `Bearer ${options.apiKey}` },
|
|
76
|
+
timeout: options.timeout ?? DEFAULT_TIMEOUT,
|
|
77
|
+
fetch: options.fetch,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** The Jev model the questions go to. */
|
|
81
|
+
get model() {
|
|
82
|
+
return this._model;
|
|
83
|
+
}
|
|
84
|
+
/** Tokens used so far, over every request. */
|
|
85
|
+
get usage() {
|
|
86
|
+
return this._usage;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Open the connection to Jev.
|
|
90
|
+
*
|
|
91
|
+
* Lists the models, the cheapest request there is, so the first question
|
|
92
|
+
* finds the connection already open. Connects once: a client shared by
|
|
93
|
+
* several classifiers is asked by each of them, and only the first call
|
|
94
|
+
* sends anything.
|
|
95
|
+
*
|
|
96
|
+
* @throws ClassifierError If Jev could not be reached or refused the request.
|
|
97
|
+
*/
|
|
98
|
+
async connect() {
|
|
99
|
+
await this._connectLock.run(async () => {
|
|
100
|
+
if (this._connected) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
let response;
|
|
104
|
+
try {
|
|
105
|
+
response = await this._http.get("/v1/models");
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
if (e instanceof HttpError) {
|
|
109
|
+
throw new ClassifierError(`could not connect to Jev: ${e.message}`, { cause: e });
|
|
110
|
+
}
|
|
111
|
+
throw e;
|
|
112
|
+
}
|
|
113
|
+
if (response.statusCode !== 200) {
|
|
114
|
+
throw new ClassifierError(`Jev refused the connection: HTTP ${response.statusCode}`);
|
|
115
|
+
}
|
|
116
|
+
this._connected = true;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Close the connection pool. */
|
|
120
|
+
async close() {
|
|
121
|
+
this._connected = false;
|
|
122
|
+
await this._http.aclose();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Send questions about one state and return Jev's answers.
|
|
126
|
+
*
|
|
127
|
+
* @param state What the questions are about.
|
|
128
|
+
* @param questions The questions by name, each in Jev's own format: a
|
|
129
|
+
* `type` of `noul`, `choice` or `score`, `instructions`, and `criteria`.
|
|
130
|
+
* @param assets Images by reference, each in Jev's own format: a `format`
|
|
131
|
+
* and the `data_base64` bytes. Each reference must appear in the state or
|
|
132
|
+
* the questions, where Jev reads the image in its place.
|
|
133
|
+
* @returns The answers by the same names, in Jev's own format, and the
|
|
134
|
+
* tokens the request used.
|
|
135
|
+
* @throws ClassifierError If Jev rejected the request, kept refusing it
|
|
136
|
+
* because it was busy, could not be reached, or left a question
|
|
137
|
+
* unanswered.
|
|
138
|
+
*/
|
|
139
|
+
async ask(state, questions, assets = null) {
|
|
140
|
+
const body = {
|
|
141
|
+
model: this._model,
|
|
142
|
+
state,
|
|
143
|
+
questions: { ...questions },
|
|
144
|
+
};
|
|
145
|
+
const headers = {};
|
|
146
|
+
if (assets && Object.keys(assets).length > 0) {
|
|
147
|
+
body.assets = { ...assets };
|
|
148
|
+
headers[IMAGES_HEADER] = "true";
|
|
149
|
+
}
|
|
150
|
+
let attempt = 0;
|
|
151
|
+
while (true) {
|
|
152
|
+
attempt += 1;
|
|
153
|
+
let response;
|
|
154
|
+
try {
|
|
155
|
+
response = await this._http.post("/v1/systemone", { json: body, headers });
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
if (e instanceof HttpError) {
|
|
159
|
+
// Some errors, such as a timeout, carry no useful message.
|
|
160
|
+
throw new ClassifierError(`Jev request failed: ${errorRepr(e)}`, { cause: e });
|
|
161
|
+
}
|
|
162
|
+
throw e;
|
|
163
|
+
}
|
|
164
|
+
if (response.statusCode === TOO_MANY_REQUESTS || response.statusCode === OVERLOADED) {
|
|
165
|
+
if (attempt > this._maxRetries) {
|
|
166
|
+
throw new ClassifierError(`Jev is busy (HTTP ${response.statusCode}) after ${attempt} attempts`);
|
|
167
|
+
}
|
|
168
|
+
const wait = exponentialBackoffTime(attempt, 0.25, 2.0, 0.25);
|
|
169
|
+
logger.debug(`Jev answered ${response.statusCode}, retrying in ${wait}s`);
|
|
170
|
+
await sleep(wait);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (response.statusCode !== 200) {
|
|
174
|
+
let message = `Jev rejected the request: HTTP ${response.statusCode}`;
|
|
175
|
+
const reason = this._errorMessage(response);
|
|
176
|
+
if (reason) {
|
|
177
|
+
message += `: ${reason}`;
|
|
178
|
+
}
|
|
179
|
+
throw new ClassifierError(message);
|
|
180
|
+
}
|
|
181
|
+
let data;
|
|
182
|
+
try {
|
|
183
|
+
data = response.json();
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
rethrowIfCancelled(e);
|
|
187
|
+
throw new ClassifierError(`Jev reply is not valid JSON: ${e.message}`, {
|
|
188
|
+
cause: e,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (!isDict(data)) {
|
|
192
|
+
throw new ClassifierError("Jev reply is not a JSON object");
|
|
193
|
+
}
|
|
194
|
+
const usage = data.usage;
|
|
195
|
+
const requestUsage = isDict(usage) ? JevUsage.fromDict(usage) : new JevUsage();
|
|
196
|
+
this._usage.inputTokens += requestUsage.inputTokens;
|
|
197
|
+
this._usage.outputTokens += requestUsage.outputTokens;
|
|
198
|
+
const answers = data.answers;
|
|
199
|
+
if (!isDict(answers)) {
|
|
200
|
+
throw new ClassifierError("Jev reply has no answers");
|
|
201
|
+
}
|
|
202
|
+
const missing = Object.keys(questions).filter((name) => !isDict(answers[name]));
|
|
203
|
+
if (missing.length > 0) {
|
|
204
|
+
throw new ClassifierError(`Jev reply has no answer for ${missing.join(", ")}`);
|
|
205
|
+
}
|
|
206
|
+
const result = {};
|
|
207
|
+
for (const name of Object.keys(questions)) {
|
|
208
|
+
result[name] = answers[name];
|
|
209
|
+
}
|
|
210
|
+
return [result, requestUsage];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/** The reason Jev gave for rejecting a request, if it gave one. */
|
|
214
|
+
_errorMessage(response) {
|
|
215
|
+
let detail;
|
|
216
|
+
try {
|
|
217
|
+
const data = response.json();
|
|
218
|
+
if (!isDict(data)) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
detail = data.detail;
|
|
222
|
+
}
|
|
223
|
+
catch (e) {
|
|
224
|
+
rethrowIfCancelled(e);
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
if (isDict(detail)) {
|
|
228
|
+
detail = detail.message;
|
|
229
|
+
}
|
|
230
|
+
return typeof detail === "string" && detail ? detail : null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/classifiers/typesafe/jev/__init__.py
|
|
6
|
+
// Upstream's `__init__.py` is empty: import the package's modules directly.
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base class for clock implementations.
|
|
3
|
+
*
|
|
4
|
+
* Provides a common interface for timing operations used in Pipecat
|
|
5
|
+
* for synchronization, scheduling, and time-based processing.
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class BaseClock {
|
|
8
|
+
/** Get the current time value (unit and reference depend on the implementation). */
|
|
9
|
+
abstract getTime(): number;
|
|
10
|
+
/** Start or initialize the clock. Call before `getTime()`. */
|
|
11
|
+
abstract start(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=base_clock.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
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/clocks/base_clock.py
|
|
6
|
+
/**
|
|
7
|
+
* Abstract base class for clock implementations.
|
|
8
|
+
*
|
|
9
|
+
* Provides a common interface for timing operations used in Pipecat
|
|
10
|
+
* for synchronization, scheduling, and time-based processing.
|
|
11
|
+
*/
|
|
12
|
+
export class BaseClock {
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=base_clock.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/clocks/__init__.py
|
|
6
|
+
// Upstream's `__init__.py` is empty: import the package's modules directly.
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=index.js.map
|