@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.
Files changed (698) hide show
  1. package/LICENSE +25 -0
  2. package/NOTICE +9 -0
  3. package/dist/adapters/base_llm_adapter.d.ts +266 -0
  4. package/dist/adapters/base_llm_adapter.js +489 -0
  5. package/dist/adapters/index.d.ts +2 -0
  6. package/dist/adapters/index.js +8 -0
  7. package/dist/adapters/schemas/direct_function.d.ts +202 -0
  8. package/dist/adapters/schemas/direct_function.js +302 -0
  9. package/dist/adapters/schemas/function_schema.d.ts +67 -0
  10. package/dist/adapters/schemas/function_schema.js +72 -0
  11. package/dist/adapters/schemas/index.d.ts +2 -0
  12. package/dist/adapters/schemas/index.js +8 -0
  13. package/dist/adapters/schemas/tools_schema.d.ts +57 -0
  14. package/dist/adapters/schemas/tools_schema.js +79 -0
  15. package/dist/adapters/services/index.d.ts +2 -0
  16. package/dist/adapters/services/index.js +8 -0
  17. package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
  18. package/dist/adapters/services/open_ai_adapter.js +250 -0
  19. package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
  20. package/dist/audio/dtmf/dtmf_data.js +22 -0
  21. package/dist/audio/dtmf/index.d.ts +2 -0
  22. package/dist/audio/dtmf/index.js +8 -0
  23. package/dist/audio/dtmf/types.d.ts +31 -0
  24. package/dist/audio/dtmf/types.js +35 -0
  25. package/dist/audio/dtmf/utils.d.ts +13 -0
  26. package/dist/audio/dtmf/utils.js +62 -0
  27. package/dist/audio/filters/base_audio_filter.d.ts +51 -0
  28. package/dist/audio/filters/base_audio_filter.js +17 -0
  29. package/dist/audio/filters/index.d.ts +2 -0
  30. package/dist/audio/filters/index.js +8 -0
  31. package/dist/audio/index.d.ts +2 -0
  32. package/dist/audio/index.js +8 -0
  33. package/dist/audio/krisp_instance.d.ts +95 -0
  34. package/dist/audio/krisp_instance.js +229 -0
  35. package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
  36. package/dist/audio/mixers/base_audio_mixer.js +16 -0
  37. package/dist/audio/mixers/index.d.ts +2 -0
  38. package/dist/audio/mixers/index.js +8 -0
  39. package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
  40. package/dist/audio/resamplers/base_audio_resampler.js +35 -0
  41. package/dist/audio/resamplers/index.d.ts +2 -0
  42. package/dist/audio/resamplers/index.js +8 -0
  43. package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
  44. package/dist/audio/resamplers/resampy_resampler.js +15 -0
  45. package/dist/audio/resamplers/soxr_resampler.d.ts +54 -0
  46. package/dist/audio/resamplers/soxr_resampler.js +69 -0
  47. package/dist/audio/resamplers/soxr_stream_resampler.d.ts +75 -0
  48. package/dist/audio/resamplers/soxr_stream_resampler.js +146 -0
  49. package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
  50. package/dist/audio/turn/base_turn_analyzer.js +61 -0
  51. package/dist/audio/turn/index.d.ts +2 -0
  52. package/dist/audio/turn/index.js +8 -0
  53. package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
  54. package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
  55. package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
  56. package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
  57. package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
  58. package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +143 -0
  59. package/dist/audio/utils.d.ts +224 -0
  60. package/dist/audio/utils.js +634 -0
  61. package/dist/audio/vad/data/index.d.ts +2 -0
  62. package/dist/audio/vad/data/index.js +8 -0
  63. package/dist/audio/vad/index.d.ts +2 -0
  64. package/dist/audio/vad/index.js +8 -0
  65. package/dist/audio/vad/vad_analyzer.d.ts +126 -0
  66. package/dist/audio/vad/vad_analyzer.js +211 -0
  67. package/dist/audio/vad/vad_controller.d.ts +143 -0
  68. package/dist/audio/vad/vad_controller.js +228 -0
  69. package/dist/audio/volume.d.ts +38 -0
  70. package/dist/audio/volume.js +75 -0
  71. package/dist/bus/adapters/base.d.ts +35 -0
  72. package/dist/bus/adapters/base.js +19 -0
  73. package/dist/bus/adapters/index.d.ts +10 -0
  74. package/dist/bus/adapters/index.js +15 -0
  75. package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
  76. package/dist/bus/adapters/llm_context_adapter.js +82 -0
  77. package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
  78. package/dist/bus/adapters/tools_schema_adapter.js +70 -0
  79. package/dist/bus/bridge_processor.d.ts +111 -0
  80. package/dist/bus/bridge_processor.js +166 -0
  81. package/dist/bus/bus.d.ts +110 -0
  82. package/dist/bus/bus.js +200 -0
  83. package/dist/bus/index.d.ts +22 -0
  84. package/dist/bus/index.js +27 -0
  85. package/dist/bus/local/async_queue.d.ts +12 -0
  86. package/dist/bus/local/async_queue.js +21 -0
  87. package/dist/bus/local/index.d.ts +3 -0
  88. package/dist/bus/local/index.js +8 -0
  89. package/dist/bus/messages.d.ts +378 -0
  90. package/dist/bus/messages.js +357 -0
  91. package/dist/bus/network/index.d.ts +16 -0
  92. package/dist/bus/network/index.js +21 -0
  93. package/dist/bus/queue.d.ts +27 -0
  94. package/dist/bus/queue.js +51 -0
  95. package/dist/bus/serializers/base.d.ts +25 -0
  96. package/dist/bus/serializers/base.js +14 -0
  97. package/dist/bus/serializers/index.d.ts +9 -0
  98. package/dist/bus/serializers/index.js +14 -0
  99. package/dist/bus/serializers/json.d.ts +77 -0
  100. package/dist/bus/serializers/json.js +367 -0
  101. package/dist/bus/subscriber.d.ts +46 -0
  102. package/dist/bus/subscriber.js +27 -0
  103. package/dist/bus/ui/index.d.ts +3 -0
  104. package/dist/bus/ui/index.js +8 -0
  105. package/dist/bus/ui/messages.d.ts +186 -0
  106. package/dist/bus/ui/messages.js +171 -0
  107. package/dist/classifiers/base_classifier.d.ts +263 -0
  108. package/dist/classifiers/base_classifier.js +346 -0
  109. package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
  110. package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
  111. package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
  112. package/dist/classifiers/cloudflare/clef/client.js +234 -0
  113. package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
  114. package/dist/classifiers/cloudflare/clef/index.js +8 -0
  115. package/dist/classifiers/cloudflare/index.d.ts +2 -0
  116. package/dist/classifiers/cloudflare/index.js +8 -0
  117. package/dist/classifiers/http_client.d.ts +70 -0
  118. package/dist/classifiers/http_client.js +161 -0
  119. package/dist/classifiers/index.d.ts +2 -0
  120. package/dist/classifiers/index.js +8 -0
  121. package/dist/classifiers/jev/classifier.d.ts +8 -0
  122. package/dist/classifiers/jev/classifier.js +13 -0
  123. package/dist/classifiers/jev/client.d.ts +8 -0
  124. package/dist/classifiers/jev/client.js +13 -0
  125. package/dist/classifiers/jev/index.d.ts +2 -0
  126. package/dist/classifiers/jev/index.js +8 -0
  127. package/dist/classifiers/llm/classifier.d.ts +72 -0
  128. package/dist/classifiers/llm/classifier.js +304 -0
  129. package/dist/classifiers/llm/index.d.ts +2 -0
  130. package/dist/classifiers/llm/index.js +8 -0
  131. package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
  132. package/dist/classifiers/openai/decisions/classifier.js +241 -0
  133. package/dist/classifiers/openai/decisions/client.d.ts +108 -0
  134. package/dist/classifiers/openai/decisions/client.js +234 -0
  135. package/dist/classifiers/openai/decisions/index.d.ts +2 -0
  136. package/dist/classifiers/openai/decisions/index.js +8 -0
  137. package/dist/classifiers/openai/index.d.ts +2 -0
  138. package/dist/classifiers/openai/index.js +8 -0
  139. package/dist/classifiers/typesafe/index.d.ts +2 -0
  140. package/dist/classifiers/typesafe/index.js +8 -0
  141. package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
  142. package/dist/classifiers/typesafe/jev/classifier.js +220 -0
  143. package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
  144. package/dist/classifiers/typesafe/jev/client.js +233 -0
  145. package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
  146. package/dist/classifiers/typesafe/jev/index.js +8 -0
  147. package/dist/clocks/base_clock.d.ts +13 -0
  148. package/dist/clocks/base_clock.js +14 -0
  149. package/dist/clocks/index.d.ts +2 -0
  150. package/dist/clocks/index.js +8 -0
  151. package/dist/clocks/system_clock.d.ts +15 -0
  152. package/dist/clocks/system_clock.js +25 -0
  153. package/dist/frames/frames.d.ts +2533 -0
  154. package/dist/frames/frames.js +2485 -0
  155. package/dist/frames/index.d.ts +2 -0
  156. package/dist/frames/index.js +8 -0
  157. package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
  158. package/dist/frames/protobufs/frames_pb2.js +466 -0
  159. package/dist/index.d.ts +11 -0
  160. package/dist/index.js +56 -0
  161. package/dist/metrics/index.d.ts +2 -0
  162. package/dist/metrics/index.js +8 -0
  163. package/dist/metrics/metrics.d.ts +276 -0
  164. package/dist/metrics/metrics.js +254 -0
  165. package/dist/observers/base_observer.d.ts +173 -0
  166. package/dist/observers/base_observer.js +151 -0
  167. package/dist/observers/error_observer.d.ts +75 -0
  168. package/dist/observers/error_observer.js +87 -0
  169. package/dist/observers/function_call_observer.d.ts +157 -0
  170. package/dist/observers/function_call_observer.js +222 -0
  171. package/dist/observers/index.d.ts +2 -0
  172. package/dist/observers/index.js +8 -0
  173. package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
  174. package/dist/observers/loggers/debug_log_observer.js +228 -0
  175. package/dist/observers/loggers/index.d.ts +2 -0
  176. package/dist/observers/loggers/index.js +8 -0
  177. package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
  178. package/dist/observers/loggers/llm_log_observer.js +110 -0
  179. package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
  180. package/dist/observers/loggers/metrics_log_observer.js +186 -0
  181. package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
  182. package/dist/observers/loggers/transcription_log_observer.js +74 -0
  183. package/dist/observers/service_metrics_observer.d.ts +168 -0
  184. package/dist/observers/service_metrics_observer.js +236 -0
  185. package/dist/observers/speaking_observer.d.ts +104 -0
  186. package/dist/observers/speaking_observer.js +150 -0
  187. package/dist/observers/startup_timing_observer.d.ts +221 -0
  188. package/dist/observers/startup_timing_observer.js +365 -0
  189. package/dist/observers/turn_tracking_observer.d.ts +78 -0
  190. package/dist/observers/turn_tracking_observer.js +189 -0
  191. package/dist/observers/user_bot_latency_observer.d.ts +411 -0
  192. package/dist/observers/user_bot_latency_observer.js +974 -0
  193. package/dist/pipeline/base_pipeline.d.ts +49 -0
  194. package/dist/pipeline/base_pipeline.js +101 -0
  195. package/dist/pipeline/capabilities.d.ts +76 -0
  196. package/dist/pipeline/capabilities.js +97 -0
  197. package/dist/pipeline/index.d.ts +2 -0
  198. package/dist/pipeline/index.js +8 -0
  199. package/dist/pipeline/job_context.d.ts +317 -0
  200. package/dist/pipeline/job_context.js +450 -0
  201. package/dist/pipeline/job_decorator.d.ts +54 -0
  202. package/dist/pipeline/job_decorator.js +92 -0
  203. package/dist/pipeline/llm_switcher.d.ts +84 -0
  204. package/dist/pipeline/llm_switcher.js +107 -0
  205. package/dist/pipeline/llm_with_backend.d.ts +435 -0
  206. package/dist/pipeline/llm_with_backend.js +806 -0
  207. package/dist/pipeline/parallel_pipeline.d.ts +83 -0
  208. package/dist/pipeline/parallel_pipeline.js +200 -0
  209. package/dist/pipeline/pipeline.d.ts +126 -0
  210. package/dist/pipeline/pipeline.js +196 -0
  211. package/dist/pipeline/service_switcher.d.ts +287 -0
  212. package/dist/pipeline/service_switcher.js +509 -0
  213. package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
  214. package/dist/pipeline/sync_parallel_pipeline.js +387 -0
  215. package/dist/pipeline/worker.d.ts +814 -0
  216. package/dist/pipeline/worker.js +1639 -0
  217. package/dist/pipeline/worker_observer.d.ts +131 -0
  218. package/dist/pipeline/worker_observer.js +274 -0
  219. package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
  220. package/dist/pipeline/worker_ready_decorator.js +76 -0
  221. package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
  222. package/dist/processors/aggregators/async_tool_messages.js +291 -0
  223. package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
  224. package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
  225. package/dist/processors/aggregators/gated.d.ts +43 -0
  226. package/dist/processors/aggregators/gated.js +86 -0
  227. package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
  228. package/dist/processors/aggregators/gated_llm_context.js +86 -0
  229. package/dist/processors/aggregators/index.d.ts +2 -0
  230. package/dist/processors/aggregators/index.js +8 -0
  231. package/dist/processors/aggregators/llm_context.d.ts +370 -0
  232. package/dist/processors/aggregators/llm_context.js +580 -0
  233. package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
  234. package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
  235. package/dist/processors/aggregators/llm_response.d.ts +37 -0
  236. package/dist/processors/aggregators/llm_response.js +71 -0
  237. package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
  238. package/dist/processors/aggregators/llm_response_universal.js +2394 -0
  239. package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
  240. package/dist/processors/aggregators/llm_text_processor.js +102 -0
  241. package/dist/processors/aggregators/sentence.d.ts +39 -0
  242. package/dist/processors/aggregators/sentence.js +69 -0
  243. package/dist/processors/async_generator.d.ts +42 -0
  244. package/dist/processors/async_generator.js +76 -0
  245. package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
  246. package/dist/processors/audio/audio_buffer_processor.js +565 -0
  247. package/dist/processors/audio/index.d.ts +2 -0
  248. package/dist/processors/audio/index.js +8 -0
  249. package/dist/processors/audio/vad_processor.d.ts +67 -0
  250. package/dist/processors/audio/vad_processor.js +103 -0
  251. package/dist/processors/consumer_processor.d.ts +49 -0
  252. package/dist/processors/consumer_processor.js +85 -0
  253. package/dist/processors/filters/frame_filter.d.ts +39 -0
  254. package/dist/processors/filters/frame_filter.js +52 -0
  255. package/dist/processors/filters/function_filter.d.ts +59 -0
  256. package/dist/processors/filters/function_filter.js +78 -0
  257. package/dist/processors/filters/identity_filter.d.ts +33 -0
  258. package/dist/processors/filters/identity_filter.js +37 -0
  259. package/dist/processors/filters/index.d.ts +2 -0
  260. package/dist/processors/filters/index.js +8 -0
  261. package/dist/processors/filters/null_filter.d.ts +34 -0
  262. package/dist/processors/filters/null_filter.js +47 -0
  263. package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
  264. package/dist/processors/filters/wake_notifier_filter.js +49 -0
  265. package/dist/processors/frame_processor.d.ts +360 -0
  266. package/dist/processors/frame_processor.js +932 -0
  267. package/dist/processors/frameworks/index.d.ts +2 -0
  268. package/dist/processors/frameworks/index.js +8 -0
  269. package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
  270. package/dist/processors/frameworks/rtvi/frames.js +259 -0
  271. package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
  272. package/dist/processors/frameworks/rtvi/index.js +11 -0
  273. package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
  274. package/dist/processors/frameworks/rtvi/models.js +1807 -0
  275. package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
  276. package/dist/processors/frameworks/rtvi/observer.js +1113 -0
  277. package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
  278. package/dist/processors/frameworks/rtvi/processor.js +676 -0
  279. package/dist/processors/idle_frame_processor.d.ts +44 -0
  280. package/dist/processors/idle_frame_processor.js +86 -0
  281. package/dist/processors/index.d.ts +2 -0
  282. package/dist/processors/index.js +8 -0
  283. package/dist/processors/logger.d.ts +42 -0
  284. package/dist/processors/logger.js +87 -0
  285. package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
  286. package/dist/processors/metrics/frame_processor_metrics.js +372 -0
  287. package/dist/processors/metrics/index.d.ts +2 -0
  288. package/dist/processors/metrics/index.js +8 -0
  289. package/dist/processors/producer_processor.d.ts +68 -0
  290. package/dist/processors/producer_processor.js +78 -0
  291. package/dist/processors/text_transformer.d.ts +30 -0
  292. package/dist/processors/text_transformer.js +48 -0
  293. package/dist/registry/index.d.ts +3 -0
  294. package/dist/registry/index.js +8 -0
  295. package/dist/registry/registry.d.ts +69 -0
  296. package/dist/registry/registry.js +149 -0
  297. package/dist/registry/types.d.ts +47 -0
  298. package/dist/registry/types.js +39 -0
  299. package/dist/serializers/base_serializer.d.ts +94 -0
  300. package/dist/serializers/base_serializer.js +82 -0
  301. package/dist/serializers/index.d.ts +2 -0
  302. package/dist/serializers/index.js +8 -0
  303. package/dist/services/ai_service.d.ts +145 -0
  304. package/dist/services/ai_service.js +262 -0
  305. package/dist/services/anthropic/index.d.ts +2 -0
  306. package/dist/services/anthropic/index.js +7 -0
  307. package/dist/services/assemblyai/index.d.ts +2 -0
  308. package/dist/services/assemblyai/index.js +7 -0
  309. package/dist/services/asyncai/index.d.ts +2 -0
  310. package/dist/services/asyncai/index.js +7 -0
  311. package/dist/services/aws/index.d.ts +2 -0
  312. package/dist/services/aws/index.js +7 -0
  313. package/dist/services/azure/index.d.ts +2 -0
  314. package/dist/services/azure/index.js +7 -0
  315. package/dist/services/baseten/index.d.ts +2 -0
  316. package/dist/services/baseten/index.js +7 -0
  317. package/dist/services/bland/index.d.ts +2 -0
  318. package/dist/services/bland/index.js +7 -0
  319. package/dist/services/camb/index.d.ts +2 -0
  320. package/dist/services/camb/index.js +7 -0
  321. package/dist/services/cartesia/index.d.ts +2 -0
  322. package/dist/services/cartesia/index.js +7 -0
  323. package/dist/services/cerebras/index.d.ts +2 -0
  324. package/dist/services/cerebras/index.js +7 -0
  325. package/dist/services/crusoe/index.d.ts +2 -0
  326. package/dist/services/crusoe/index.js +7 -0
  327. package/dist/services/deepgram/index.d.ts +2 -0
  328. package/dist/services/deepgram/index.js +7 -0
  329. package/dist/services/deepseek/index.d.ts +2 -0
  330. package/dist/services/deepseek/index.js +7 -0
  331. package/dist/services/elevenlabs/index.d.ts +2 -0
  332. package/dist/services/elevenlabs/index.js +7 -0
  333. package/dist/services/fal/index.d.ts +2 -0
  334. package/dist/services/fal/index.js +7 -0
  335. package/dist/services/fireworks/index.d.ts +2 -0
  336. package/dist/services/fireworks/index.js +7 -0
  337. package/dist/services/fish/index.d.ts +2 -0
  338. package/dist/services/fish/index.js +7 -0
  339. package/dist/services/funasr/index.d.ts +3 -0
  340. package/dist/services/funasr/index.js +8 -0
  341. package/dist/services/gladia/index.d.ts +2 -0
  342. package/dist/services/gladia/index.js +7 -0
  343. package/dist/services/google/index.d.ts +2 -0
  344. package/dist/services/google/index.js +7 -0
  345. package/dist/services/gradium/index.d.ts +2 -0
  346. package/dist/services/gradium/index.js +7 -0
  347. package/dist/services/grok/index.d.ts +2 -0
  348. package/dist/services/grok/index.js +7 -0
  349. package/dist/services/groq/index.d.ts +2 -0
  350. package/dist/services/groq/index.js +7 -0
  351. package/dist/services/heygen/index.d.ts +2 -0
  352. package/dist/services/heygen/index.js +7 -0
  353. package/dist/services/hume/index.d.ts +2 -0
  354. package/dist/services/hume/index.js +7 -0
  355. package/dist/services/image_service.d.ts +52 -0
  356. package/dist/services/image_service.js +60 -0
  357. package/dist/services/inception/index.d.ts +2 -0
  358. package/dist/services/inception/index.js +7 -0
  359. package/dist/services/index.d.ts +2 -0
  360. package/dist/services/index.js +8 -0
  361. package/dist/services/inworld/index.d.ts +2 -0
  362. package/dist/services/inworld/index.js +7 -0
  363. package/dist/services/keenable/index.d.ts +2 -0
  364. package/dist/services/keenable/index.js +7 -0
  365. package/dist/services/kokoro/index.d.ts +2 -0
  366. package/dist/services/kokoro/index.js +7 -0
  367. package/dist/services/llm_service.d.ts +1106 -0
  368. package/dist/services/llm_service.js +2231 -0
  369. package/dist/services/mem0/index.d.ts +2 -0
  370. package/dist/services/mem0/index.js +7 -0
  371. package/dist/services/meta/index.d.ts +2 -0
  372. package/dist/services/meta/index.js +7 -0
  373. package/dist/services/minimax/index.d.ts +2 -0
  374. package/dist/services/minimax/index.js +7 -0
  375. package/dist/services/mistral/index.d.ts +2 -0
  376. package/dist/services/mistral/index.js +7 -0
  377. package/dist/services/moondream/index.d.ts +2 -0
  378. package/dist/services/moondream/index.js +7 -0
  379. package/dist/services/moonshine/index.d.ts +2 -0
  380. package/dist/services/moonshine/index.js +7 -0
  381. package/dist/services/nebius/index.d.ts +2 -0
  382. package/dist/services/nebius/index.js +7 -0
  383. package/dist/services/neuphonic/index.d.ts +2 -0
  384. package/dist/services/neuphonic/index.js +7 -0
  385. package/dist/services/novita/index.d.ts +2 -0
  386. package/dist/services/novita/index.js +7 -0
  387. package/dist/services/nvidia/index.d.ts +2 -0
  388. package/dist/services/nvidia/index.js +11 -0
  389. package/dist/services/ollama/index.d.ts +2 -0
  390. package/dist/services/ollama/index.js +7 -0
  391. package/dist/services/openai/index.d.ts +2 -0
  392. package/dist/services/openai/index.js +7 -0
  393. package/dist/services/openclaw/index.d.ts +14 -0
  394. package/dist/services/openclaw/index.js +19 -0
  395. package/dist/services/openrouter/index.d.ts +2 -0
  396. package/dist/services/openrouter/index.js +7 -0
  397. package/dist/services/perplexity/index.d.ts +2 -0
  398. package/dist/services/perplexity/index.js +7 -0
  399. package/dist/services/piper/index.d.ts +2 -0
  400. package/dist/services/piper/index.js +7 -0
  401. package/dist/services/pocket_tts/index.d.ts +2 -0
  402. package/dist/services/pocket_tts/index.js +7 -0
  403. package/dist/services/qwen/index.d.ts +2 -0
  404. package/dist/services/qwen/index.js +7 -0
  405. package/dist/services/resembleai/index.d.ts +2 -0
  406. package/dist/services/resembleai/index.js +7 -0
  407. package/dist/services/rime/index.d.ts +2 -0
  408. package/dist/services/rime/index.js +7 -0
  409. package/dist/services/sambanova/index.d.ts +2 -0
  410. package/dist/services/sambanova/index.js +7 -0
  411. package/dist/services/sarvam/index.d.ts +2 -0
  412. package/dist/services/sarvam/index.js +7 -0
  413. package/dist/services/settings.d.ts +356 -0
  414. package/dist/services/settings.js +437 -0
  415. package/dist/services/simli/index.d.ts +2 -0
  416. package/dist/services/simli/index.js +7 -0
  417. package/dist/services/smallest/index.d.ts +2 -0
  418. package/dist/services/smallest/index.js +7 -0
  419. package/dist/services/soniox/index.d.ts +2 -0
  420. package/dist/services/soniox/index.js +7 -0
  421. package/dist/services/speechify/index.d.ts +2 -0
  422. package/dist/services/speechify/index.js +7 -0
  423. package/dist/services/speechmatics/index.d.ts +2 -0
  424. package/dist/services/speechmatics/index.js +7 -0
  425. package/dist/services/stt_latency.d.ts +62 -0
  426. package/dist/services/stt_latency.js +71 -0
  427. package/dist/services/stt_service.d.ts +601 -0
  428. package/dist/services/stt_service.js +1044 -0
  429. package/dist/services/tavus/index.d.ts +2 -0
  430. package/dist/services/tavus/index.js +7 -0
  431. package/dist/services/together/index.d.ts +2 -0
  432. package/dist/services/together/index.js +7 -0
  433. package/dist/services/tts_service.d.ts +909 -0
  434. package/dist/services/tts_service.js +2018 -0
  435. package/dist/services/ultravox/index.d.ts +2 -0
  436. package/dist/services/ultravox/index.js +9 -0
  437. package/dist/services/vision_service.d.ts +56 -0
  438. package/dist/services/vision_service.js +62 -0
  439. package/dist/services/websocket_service.d.ts +213 -0
  440. package/dist/services/websocket_service.js +654 -0
  441. package/dist/services/whisper/index.d.ts +2 -0
  442. package/dist/services/whisper/index.js +9 -0
  443. package/dist/services/xai/index.d.ts +2 -0
  444. package/dist/services/xai/index.js +9 -0
  445. package/dist/services/xtts/index.d.ts +2 -0
  446. package/dist/services/xtts/index.js +9 -0
  447. package/dist/tests/index.d.ts +2 -0
  448. package/dist/tests/index.js +8 -0
  449. package/dist/tests/utils.d.ts +123 -0
  450. package/dist/tests/utils.js +212 -0
  451. package/dist/transcriptions/index.d.ts +2 -0
  452. package/dist/transcriptions/index.js +8 -0
  453. package/dist/transcriptions/language.d.ts +376 -0
  454. package/dist/transcriptions/language.js +543 -0
  455. package/dist/transports/base_input.d.ts +149 -0
  456. package/dist/transports/base_input.js +338 -0
  457. package/dist/transports/base_output.d.ts +432 -0
  458. package/dist/transports/base_output.js +1231 -0
  459. package/dist/transports/base_transport.d.ts +223 -0
  460. package/dist/transports/base_transport.js +167 -0
  461. package/dist/transports/daily/index.d.ts +2 -0
  462. package/dist/transports/daily/index.js +9 -0
  463. package/dist/transports/heygen/index.d.ts +2 -0
  464. package/dist/transports/heygen/index.js +9 -0
  465. package/dist/transports/index.d.ts +2 -0
  466. package/dist/transports/index.js +8 -0
  467. package/dist/transports/lemonslice/index.d.ts +2 -0
  468. package/dist/transports/lemonslice/index.js +9 -0
  469. package/dist/transports/livekit/index.d.ts +2 -0
  470. package/dist/transports/livekit/index.js +9 -0
  471. package/dist/transports/local/index.d.ts +2 -0
  472. package/dist/transports/local/index.js +9 -0
  473. package/dist/transports/moq/index.d.ts +2 -0
  474. package/dist/transports/moq/index.js +9 -0
  475. package/dist/transports/smallwebrtc/index.d.ts +2 -0
  476. package/dist/transports/smallwebrtc/index.js +9 -0
  477. package/dist/transports/tavus/index.d.ts +2 -0
  478. package/dist/transports/tavus/index.js +9 -0
  479. package/dist/transports/video_in_sampler.d.ts +157 -0
  480. package/dist/transports/video_in_sampler.js +258 -0
  481. package/dist/transports/vonage/index.d.ts +2 -0
  482. package/dist/transports/vonage/index.js +9 -0
  483. package/dist/transports/websocket/index.d.ts +2 -0
  484. package/dist/transports/websocket/index.js +9 -0
  485. package/dist/transports/whatsapp/index.d.ts +2 -0
  486. package/dist/transports/whatsapp/index.js +9 -0
  487. package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
  488. package/dist/turns/eager_end_of_turn_mixin.js +122 -0
  489. package/dist/turns/empty_user_turn.d.ts +55 -0
  490. package/dist/turns/empty_user_turn.js +53 -0
  491. package/dist/turns/index.d.ts +2 -0
  492. package/dist/turns/index.js +8 -0
  493. package/dist/turns/speculation_gate.d.ts +169 -0
  494. package/dist/turns/speculation_gate.js +294 -0
  495. package/dist/turns/types.d.ts +33 -0
  496. package/dist/turns/types.js +35 -0
  497. package/dist/turns/user_idle_controller.d.ts +94 -0
  498. package/dist/turns/user_idle_controller.js +187 -0
  499. package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
  500. package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
  501. package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
  502. package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
  503. package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
  504. package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
  505. package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
  506. package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
  507. package/dist/turns/user_mute/index.d.ts +6 -0
  508. package/dist/turns/user_mute/index.js +11 -0
  509. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
  510. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
  511. package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
  512. package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
  513. package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
  514. package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
  515. package/dist/turns/user_start/index.d.ts +8 -0
  516. package/dist/turns/user_start/index.js +16 -0
  517. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
  518. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
  519. package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
  520. package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
  521. package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
  522. package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
  523. package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
  524. package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
  525. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
  526. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
  527. package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
  528. package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
  529. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
  530. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
  531. package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
  532. package/dist/turns/user_stop/eager_match_policy.js +50 -0
  533. package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
  534. package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
  535. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
  536. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
  537. package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
  538. package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
  539. package/dist/turns/user_stop/index.d.ts +10 -0
  540. package/dist/turns/user_stop/index.js +15 -0
  541. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
  542. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
  543. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
  544. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
  545. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
  546. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
  547. package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
  548. package/dist/turns/user_turn_completion_mixin.js +591 -0
  549. package/dist/turns/user_turn_controller.d.ts +134 -0
  550. package/dist/turns/user_turn_controller.js +335 -0
  551. package/dist/turns/user_turn_processor.d.ts +87 -0
  552. package/dist/turns/user_turn_processor.js +180 -0
  553. package/dist/turns/user_turn_strategies.d.ts +187 -0
  554. package/dist/turns/user_turn_strategies.js +222 -0
  555. package/dist/utils/async_tool_cancellation.d.ts +35 -0
  556. package/dist/utils/async_tool_cancellation.js +78 -0
  557. package/dist/utils/asyncio/index.d.ts +2 -0
  558. package/dist/utils/asyncio/index.js +7 -0
  559. package/dist/utils/asyncio/task_manager.d.ts +49 -0
  560. package/dist/utils/asyncio/task_manager.js +105 -0
  561. package/dist/utils/base_object.d.ts +76 -0
  562. package/dist/utils/base_object.js +154 -0
  563. package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
  564. package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
  565. package/dist/utils/context/audio_context_manager.d.ts +131 -0
  566. package/dist/utils/context/audio_context_manager.js +233 -0
  567. package/dist/utils/context/index.d.ts +2 -0
  568. package/dist/utils/context/index.js +7 -0
  569. package/dist/utils/context/llm_context_summarization.d.ts +258 -0
  570. package/dist/utils/context/llm_context_summarization.js +511 -0
  571. package/dist/utils/context/text_segment_map.d.ts +611 -0
  572. package/dist/utils/context/text_segment_map.js +1132 -0
  573. package/dist/utils/context/word_completion_tracker.d.ts +273 -0
  574. package/dist/utils/context/word_completion_tracker.js +441 -0
  575. package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
  576. package/dist/utils/context/word_timestamp_tracker.js +98 -0
  577. package/dist/utils/deprecation.d.ts +28 -0
  578. package/dist/utils/deprecation.js +75 -0
  579. package/dist/utils/env.d.ts +38 -0
  580. package/dist/utils/env.js +62 -0
  581. package/dist/utils/errors.d.ts +75 -0
  582. package/dist/utils/errors.js +202 -0
  583. package/dist/utils/file_resolver.d.ts +126 -0
  584. package/dist/utils/file_resolver.js +314 -0
  585. package/dist/utils/file_storage.d.ts +99 -0
  586. package/dist/utils/file_storage.js +100 -0
  587. package/dist/utils/frame_queue.d.ts +36 -0
  588. package/dist/utils/frame_queue.js +66 -0
  589. package/dist/utils/http.d.ts +39 -0
  590. package/dist/utils/http.js +53 -0
  591. package/dist/utils/image.d.ts +15 -0
  592. package/dist/utils/image.js +30 -0
  593. package/dist/utils/index.d.ts +2 -0
  594. package/dist/utils/index.js +8 -0
  595. package/dist/utils/log_config.d.ts +34 -0
  596. package/dist/utils/log_config.js +76 -0
  597. package/dist/utils/logger.d.ts +40 -0
  598. package/dist/utils/logger.js +91 -0
  599. package/dist/utils/mixin.d.ts +14 -0
  600. package/dist/utils/mixin.js +63 -0
  601. package/dist/utils/network.d.ts +73 -0
  602. package/dist/utils/network.js +90 -0
  603. package/dist/utils/security/allowed_origins.d.ts +16 -0
  604. package/dist/utils/security/allowed_origins.js +34 -0
  605. package/dist/utils/security/index.d.ts +2 -0
  606. package/dist/utils/security/index.js +7 -0
  607. package/dist/utils/security/redaction.d.ts +27 -0
  608. package/dist/utils/security/redaction.js +123 -0
  609. package/dist/utils/security/ssrf.d.ts +79 -0
  610. package/dist/utils/security/ssrf.js +327 -0
  611. package/dist/utils/shared.d.ts +35 -0
  612. package/dist/utils/shared.js +136 -0
  613. package/dist/utils/startup.d.ts +17 -0
  614. package/dist/utils/startup.js +130 -0
  615. package/dist/utils/string.d.ts +116 -0
  616. package/dist/utils/string.js +460 -0
  617. package/dist/utils/sync/base_notifier.d.ts +25 -0
  618. package/dist/utils/sync/base_notifier.js +16 -0
  619. package/dist/utils/sync/event_notifier.d.ts +38 -0
  620. package/dist/utils/sync/event_notifier.js +51 -0
  621. package/dist/utils/sync/index.d.ts +2 -0
  622. package/dist/utils/sync/index.js +7 -0
  623. package/dist/utils/text/alnum_utils.d.ts +109 -0
  624. package/dist/utils/text/alnum_utils.js +262 -0
  625. package/dist/utils/text/base_text_aggregator.d.ts +146 -0
  626. package/dist/utils/text/base_text_aggregator.js +102 -0
  627. package/dist/utils/text/base_text_filter.d.ts +54 -0
  628. package/dist/utils/text/base_text_filter.js +50 -0
  629. package/dist/utils/text/index.d.ts +2 -0
  630. package/dist/utils/text/index.js +7 -0
  631. package/dist/utils/text/markdown_text_filter.d.ts +147 -0
  632. package/dist/utils/text/markdown_text_filter.js +522 -0
  633. package/dist/utils/text/markup_utils.d.ts +54 -0
  634. package/dist/utils/text/markup_utils.js +156 -0
  635. package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
  636. package/dist/utils/text/pattern_pair_aggregator.js +478 -0
  637. package/dist/utils/text/phonemes.d.ts +60 -0
  638. package/dist/utils/text/phonemes.js +172 -0
  639. package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
  640. package/dist/utils/text/simple_text_aggregator.js +254 -0
  641. package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
  642. package/dist/utils/text/skip_tags_aggregator.js +147 -0
  643. package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
  644. package/dist/utils/text/transforms/pronunciations.js +111 -0
  645. package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
  646. package/dist/utils/text/word_timestamp_utils.js +52 -0
  647. package/dist/utils/time.d.ts +13 -0
  648. package/dist/utils/time.js +31 -0
  649. package/dist/utils/tracing/index.d.ts +3 -0
  650. package/dist/utils/tracing/index.js +8 -0
  651. package/dist/utils/tracing/service_attributes.d.ts +198 -0
  652. package/dist/utils/tracing/service_attributes.js +434 -0
  653. package/dist/utils/tracing/service_decorators.d.ts +214 -0
  654. package/dist/utils/tracing/service_decorators.js +1662 -0
  655. package/dist/utils/tracing/setup.d.ts +95 -0
  656. package/dist/utils/tracing/setup.js +110 -0
  657. package/dist/utils/tracing/tracing_context.d.ts +55 -0
  658. package/dist/utils/tracing/tracing_context.js +97 -0
  659. package/dist/utils/tracing/turn_trace_observer.d.ts +90 -0
  660. package/dist/utils/tracing/turn_trace_observer.js +219 -0
  661. package/dist/utils/types.d.ts +80 -0
  662. package/dist/utils/types.js +108 -0
  663. package/dist/utils/utils.d.ts +5 -0
  664. package/dist/utils/utils.js +22 -0
  665. package/dist/utils/yaml.d.ts +64 -0
  666. package/dist/utils/yaml.js +41 -0
  667. package/dist/version.d.ts +3 -0
  668. package/dist/version.js +7 -0
  669. package/dist/workers/base_worker.d.ts +772 -0
  670. package/dist/workers/base_worker.js +1298 -0
  671. package/dist/workers/index.d.ts +2 -0
  672. package/dist/workers/index.js +8 -0
  673. package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
  674. package/dist/workers/llm/backend_llm_worker.js +1055 -0
  675. package/dist/workers/llm/index.d.ts +6 -0
  676. package/dist/workers/llm/index.js +11 -0
  677. package/dist/workers/llm/llm_context_worker.d.ts +66 -0
  678. package/dist/workers/llm/llm_context_worker.js +72 -0
  679. package/dist/workers/llm/llm_worker.d.ts +180 -0
  680. package/dist/workers/llm/llm_worker.js +323 -0
  681. package/dist/workers/llm/tool_decorator.d.ts +68 -0
  682. package/dist/workers/llm/tool_decorator.js +60 -0
  683. package/dist/workers/runner.d.ts +268 -0
  684. package/dist/workers/runner.js +489 -0
  685. package/dist/workers/ui/index.d.ts +22 -0
  686. package/dist/workers/ui/index.js +27 -0
  687. package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
  688. package/dist/workers/ui/ui_event_decorator.js +75 -0
  689. package/dist/workers/ui/ui_job_context.d.ts +12 -0
  690. package/dist/workers/ui/ui_job_context.js +17 -0
  691. package/dist/workers/ui/ui_prompts.d.ts +21 -0
  692. package/dist/workers/ui/ui_prompts.js +41 -0
  693. package/dist/workers/ui/ui_tools.d.ts +32 -0
  694. package/dist/workers/ui/ui_tools.js +112 -0
  695. package/dist/workers/ui/ui_worker.d.ts +571 -0
  696. package/dist/workers/ui/ui_worker.js +1156 -0
  697. package/package.json +46 -3
  698. package/README.md +0 -5
@@ -0,0 +1,243 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/turns/user_start/krisp_viva_ip_user_turn_start_strategy.py
6
+ /**
7
+ * User turn start strategy using Krisp Interruption Prediction (IP).
8
+ *
9
+ * This strategy uses Krisp's IP model to distinguish genuine user interruptions
10
+ * from backchannels (e.g. "uh-huh", "yeah"). Instead of triggering a user turn
11
+ * on every VAD speech event, it collects audio after VAD detects speech and runs
12
+ * the IP model to predict whether the speech is a real interruption.
13
+ *
14
+ * Only when the IP model's probability exceeds the configured threshold is
15
+ * `triggerUserTurnStarted()` called. This prevents the bot from being
16
+ * interrupted by brief acknowledgements or filler words.
17
+ *
18
+ * PARTIAL PORT: the Krisp SDK (`krisp_audio`) is a native Python module with no
19
+ * runtime-agnostic JS equivalent. The strategy logic is ported; creating the IP
20
+ * session (`_createIpSession`) is a stub that throws "not ported yet".
21
+ * Subclasses (or tests) can override it to supply a `KrispIpSession`.
22
+ */
23
+ import { rethrowIfCancelled } from "@pipedog/asyncio";
24
+ import { intToKrispFrameDuration, intToKrispSampleRate, KrispVivaSDKManager, } from "../../audio/krisp_instance.js";
25
+ import { BotStoppedSpeakingFrame, InputAudioRawFrame, VADUserStartedSpeakingFrame, VADUserStoppedSpeakingFrame, } from "../../frames/frames.js";
26
+ import { getEnv } from "../../utils/env.js";
27
+ import { logger } from "../../utils/logger.js";
28
+ import { ProcessFrameResult } from "../types.js";
29
+ import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
30
+ /**
31
+ * User turn start strategy using Krisp VIVA Interruption Prediction.
32
+ *
33
+ * When VAD detects user speech, this strategy feeds audio frames into
34
+ * the Krisp VIVA IP model. The model outputs a probability indicating
35
+ * whether the speech is a genuine interruption (as opposed to a
36
+ * backchannel). A user turn is triggered only when this probability
37
+ * exceeds the configured threshold.
38
+ *
39
+ * This strategy is designed to work alongside other start strategies
40
+ * (e.g. `TranscriptionUserTurnStartStrategy` as a fallback) via the
41
+ * strategy list in `UserTurnStrategies`.
42
+ *
43
+ * @example
44
+ * const strategies = new UserTurnStrategies({
45
+ * start: [
46
+ * new KrispVivaIPUserTurnStartStrategy({
47
+ * modelPath: "/path/to/ip_model.kef",
48
+ * threshold: 0.5,
49
+ * }),
50
+ * new TranscriptionUserTurnStartStrategy(),
51
+ * ],
52
+ * });
53
+ */
54
+ export class KrispVivaIPUserTurnStartStrategy extends BaseUserTurnStartStrategy {
55
+ _threshold;
56
+ _frameDurationMs;
57
+ _apiKey;
58
+ _modelPath;
59
+ _sdkAcquired = false;
60
+ _ipSession = null;
61
+ _samplesPerFrame = null;
62
+ _sampleRate = null;
63
+ // State tracking
64
+ _speechActive = false;
65
+ _audioBuffer = new Uint8Array(0);
66
+ _decisionMade = false;
67
+ constructor(options = {}) {
68
+ super(options);
69
+ this._threshold = options.threshold ?? 0.5;
70
+ this._frameDurationMs = options.frameDurationMs ?? 20;
71
+ this._apiKey = options.apiKey ?? "";
72
+ const modelPath = options.modelPath || getEnv("KRISP_VIVA_IP_MODEL_PATH");
73
+ if (!modelPath) {
74
+ throw new Error("IP model path must be provided via model_path or " +
75
+ "KRISP_VIVA_IP_MODEL_PATH environment variable.");
76
+ }
77
+ if (!modelPath.endsWith(".kef")) {
78
+ throw new Error("Model is expected with .kef extension");
79
+ }
80
+ // Upstream also checks that the file exists; core has no filesystem
81
+ // access, so that check is left to the Krisp runtime that loads it.
82
+ this._modelPath = modelPath;
83
+ // Acquire SDK
84
+ try {
85
+ KrispVivaSDKManager.acquire(this._apiKey);
86
+ this._sdkAcquired = true;
87
+ }
88
+ catch (e) {
89
+ rethrowIfCancelled(e);
90
+ throw new Error(`Failed to initialize Krisp SDK: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
91
+ }
92
+ }
93
+ /** Release Krisp SDK resources. */
94
+ async cleanup() {
95
+ if (this._sdkAcquired) {
96
+ try {
97
+ this._ipSession = null;
98
+ KrispVivaSDKManager.release();
99
+ this._sdkAcquired = false;
100
+ }
101
+ catch (e) {
102
+ rethrowIfCancelled(e);
103
+ logger.error(`Error cleaning up Krisp VIVA IP strategy: ${e instanceof Error ? e.message : String(e)}`, e);
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Create a Krisp IP session for the given sample rate.
109
+ *
110
+ * STUB: needs the Krisp SDK (`krisp_audio.IpFloat.create`), which has no JS
111
+ * equivalent yet. Override to supply a session.
112
+ */
113
+ _createIpSession(sampleRate) {
114
+ // Validate the configuration as the SDK config would.
115
+ intToKrispSampleRate(sampleRate);
116
+ intToKrispFrameDuration(this._frameDurationMs);
117
+ throw new Error(`not ported yet: Krisp VIVA IP session (model ${this._modelPath}) requires the Krisp SDK`);
118
+ }
119
+ /**
120
+ * Create or re-create the IP session when sample rate changes.
121
+ *
122
+ * @param sampleRate Audio sample rate in Hz.
123
+ */
124
+ _ensureSession(sampleRate) {
125
+ if (this._sampleRate === sampleRate && this._ipSession !== null) {
126
+ return;
127
+ }
128
+ this._sampleRate = sampleRate;
129
+ this._samplesPerFrame = Math.trunc((sampleRate * this._frameDurationMs) / 1000);
130
+ this._ipSession = this._createIpSession(sampleRate);
131
+ logger.debug(`Krisp VIVA IP session created (sample_rate=${sampleRate})`);
132
+ }
133
+ /** Reset speech tracking state for the next candidate interruption. */
134
+ _resetState() {
135
+ this._speechActive = false;
136
+ this._audioBuffer = new Uint8Array(0);
137
+ this._decisionMade = false;
138
+ }
139
+ /** Ready the strategy for a new user turn. */
140
+ async handleUserTurnStarted() {
141
+ this._resetState();
142
+ }
143
+ /**
144
+ * Process a frame to detect genuine user interruptions.
145
+ *
146
+ * On `VADUserStartedSpeakingFrame`, begins collecting audio.
147
+ * On `InputAudioRawFrame`, feeds audio through the IP model and
148
+ * triggers a user turn if the interruption probability exceeds the
149
+ * threshold.
150
+ * On `VADUserStoppedSpeakingFrame` or `BotStoppedSpeakingFrame`,
151
+ * resets the candidate state.
152
+ *
153
+ * @param frame The incoming frame.
154
+ * @returns STOP if a genuine interruption was detected, CONTINUE otherwise.
155
+ */
156
+ async processFrame(frame) {
157
+ if (frame instanceof VADUserStartedSpeakingFrame) {
158
+ return await this._handleVadStarted(frame);
159
+ }
160
+ else if (frame instanceof InputAudioRawFrame) {
161
+ return await this._handleAudio(frame);
162
+ }
163
+ else if (frame instanceof VADUserStoppedSpeakingFrame ||
164
+ frame instanceof BotStoppedSpeakingFrame) {
165
+ return await this._handleReset(frame);
166
+ }
167
+ return ProcessFrameResult.CONTINUE;
168
+ }
169
+ /**
170
+ * Begin collecting audio for interruption classification.
171
+ *
172
+ * @returns Always CONTINUE; the decision is deferred until enough audio is processed.
173
+ */
174
+ async _handleVadStarted(_frame) {
175
+ logger.trace("Krisp VIVA IP: VAD speech started, collecting audio for classification");
176
+ this._speechActive = true;
177
+ this._decisionMade = false;
178
+ return ProcessFrameResult.CONTINUE;
179
+ }
180
+ /**
181
+ * Feed audio to the IP model and check for genuine interruption.
182
+ *
183
+ * Every frame is passed to the IP model regardless of speech state so
184
+ * that the model maintains continuous internal state (matching the
185
+ * standalone Krisp SDK behaviour). `_speechActive` is forwarded as
186
+ * the per-frame VAD input to the model and also gates the threshold
187
+ * evaluation.
188
+ *
189
+ * @param frame Raw audio input frame.
190
+ * @returns STOP if the model detects a genuine interruption, CONTINUE otherwise.
191
+ */
192
+ async _handleAudio(frame) {
193
+ this._ensureSession(frame.sampleRate);
194
+ if (this._ipSession === null || this._samplesPerFrame === null) {
195
+ logger.warning("IP session not ready, skipping frame");
196
+ return ProcessFrameResult.CONTINUE;
197
+ }
198
+ const buffer = new Uint8Array(this._audioBuffer.length + frame.audio.length);
199
+ buffer.set(this._audioBuffer, 0);
200
+ buffer.set(frame.audio, this._audioBuffer.length);
201
+ this._audioBuffer = buffer;
202
+ const totalSamples = Math.floor(this._audioBuffer.length / 2); // 2 bytes per int16 sample
203
+ const numCompleteFrames = Math.floor(totalSamples / this._samplesPerFrame);
204
+ if (numCompleteFrames === 0) {
205
+ return ProcessFrameResult.CONTINUE;
206
+ }
207
+ const completeSamplesCount = numCompleteFrames * this._samplesPerFrame;
208
+ const bytesToProcess = completeSamplesCount * 2;
209
+ // Copy so the Int16Array view is aligned regardless of the buffer offset.
210
+ const audioToProcess = this._audioBuffer.slice(0, bytesToProcess);
211
+ this._audioBuffer = this._audioBuffer.slice(bytesToProcess);
212
+ const audioInt16 = new Int16Array(audioToProcess.buffer, 0, completeSamplesCount);
213
+ const audioFloat32 = new Float32Array(completeSamplesCount);
214
+ for (let i = 0; i < completeSamplesCount; i++) {
215
+ audioFloat32[i] = audioInt16[i] / 32768.0;
216
+ }
217
+ for (let f = 0; f < numCompleteFrames; f++) {
218
+ const ipFrame = audioFloat32.subarray(f * this._samplesPerFrame, (f + 1) * this._samplesPerFrame);
219
+ const ipProb = this._ipSession.process(ipFrame, this._speechActive);
220
+ if (this._speechActive && !this._decisionMade && ipProb >= this._threshold) {
221
+ logger.debug(`Krisp VIVA IP: genuine interruption detected (prob=${ipProb.toFixed(3)}, ` +
222
+ `threshold=${this._threshold})`);
223
+ this._decisionMade = true;
224
+ await this.triggerUserTurnStarted();
225
+ return ProcessFrameResult.STOP;
226
+ }
227
+ }
228
+ return ProcessFrameResult.CONTINUE;
229
+ }
230
+ /**
231
+ * Reset state when the candidate interruption window ends.
232
+ *
233
+ * @returns Always CONTINUE.
234
+ */
235
+ async _handleReset(_frame) {
236
+ if (this._speechActive) {
237
+ logger.trace("Krisp VIVA IP: speech segment ended, resetting state");
238
+ this._resetState();
239
+ }
240
+ return ProcessFrameResult.CONTINUE;
241
+ }
242
+ }
243
+ //# sourceMappingURL=krisp_viva_ip_user_turn_start_strategy.js.map
@@ -0,0 +1,60 @@
1
+ /** User turn start strategy based on a minimum number of words spoken by the user. */
2
+ import { BotStartedSpeakingFrame, BotStoppedSpeakingFrame, type Frame, InterimTranscriptionFrame, TranscriptionFrame } from "../../frames/frames.ts";
3
+ import { ProcessFrameResult } from "../types.ts";
4
+ import { BaseUserTurnStartStrategy, type BaseUserTurnStartStrategyOptions } from "./base_user_turn_start_strategy.ts";
5
+ export interface MinWordsUserTurnStartStrategyOptions extends BaseUserTurnStartStrategyOptions {
6
+ /** Minimum number of spoken words required to trigger the start of a user turn. */
7
+ minWords: number;
8
+ /** Whether to consider interim transcription frames for earlier detection. */
9
+ useInterim?: boolean;
10
+ }
11
+ /**
12
+ * User turn start strategy based on a minimum number of words spoken by the user.
13
+ *
14
+ * This strategy signals the start of a user turn once the user has spoken at
15
+ * least a specified number of words, as determined from transcription frames.
16
+ * Optionally, interim transcriptions can be used for earlier detection.
17
+ */
18
+ export declare class MinWordsUserTurnStartStrategy extends BaseUserTurnStartStrategy {
19
+ protected _minWords: number;
20
+ protected _useInterim: boolean;
21
+ protected _botSpeaking: boolean;
22
+ constructor(options: MinWordsUserTurnStartStrategyOptions);
23
+ /**
24
+ * Ready the strategy for a new user turn.
25
+ *
26
+ * Clears the bot-speaking flag so the next turn's word counting starts
27
+ * from the single-word interruption threshold.
28
+ */
29
+ handleUserTurnStarted(): Promise<void>;
30
+ /**
31
+ * Process an incoming frame to detect the start of a user turn.
32
+ *
33
+ * This method updates internal state based on transcription frames and
34
+ * triggers the user turn once the minimum word count is reached.
35
+ *
36
+ * @param frame The frame to be analyzed.
37
+ * @returns STOP if the minimum word count was reached, CONTINUE otherwise.
38
+ */
39
+ processFrame(frame: Frame): Promise<ProcessFrameResult>;
40
+ /**
41
+ * Handle bot started speaking frame.
42
+ *
43
+ * If the bot is speaking we want to interrupt using min words.
44
+ */
45
+ protected _handleBotStartedSpeaking(_frame: BotStartedSpeakingFrame): Promise<void>;
46
+ /**
47
+ * Handle bot stopped speaking frame.
48
+ *
49
+ * If the bot is not speaking we want to interrupt if we get a single word.
50
+ */
51
+ protected _handleBotStoppedSpeaking(_frame: BotStoppedSpeakingFrame): Promise<void>;
52
+ /**
53
+ * Handle a transcription frame and check word count.
54
+ *
55
+ * @param frame The transcription frame to be processed.
56
+ * @returns STOP if the minimum word count was reached, CONTINUE otherwise.
57
+ */
58
+ protected _handleTranscription(frame: TranscriptionFrame | InterimTranscriptionFrame): Promise<ProcessFrameResult>;
59
+ }
60
+ //# sourceMappingURL=min_words_user_turn_start_strategy.d.ts.map
@@ -0,0 +1,102 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/turns/user_start/min_words_user_turn_start_strategy.py
6
+ /** User turn start strategy based on a minimum number of words spoken by the user. */
7
+ import { BotStartedSpeakingFrame, BotStoppedSpeakingFrame, InterimTranscriptionFrame, TranscriptionFrame, } from "../../frames/frames.js";
8
+ import { logger } from "../../utils/logger.js";
9
+ import { ProcessFrameResult } from "../types.js";
10
+ import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
11
+ /**
12
+ * User turn start strategy based on a minimum number of words spoken by the user.
13
+ *
14
+ * This strategy signals the start of a user turn once the user has spoken at
15
+ * least a specified number of words, as determined from transcription frames.
16
+ * Optionally, interim transcriptions can be used for earlier detection.
17
+ */
18
+ export class MinWordsUserTurnStartStrategy extends BaseUserTurnStartStrategy {
19
+ _minWords;
20
+ _useInterim;
21
+ _botSpeaking = false;
22
+ constructor(options) {
23
+ super(options);
24
+ this._minWords = options.minWords;
25
+ this._useInterim = options.useInterim ?? true;
26
+ }
27
+ /**
28
+ * Ready the strategy for a new user turn.
29
+ *
30
+ * Clears the bot-speaking flag so the next turn's word counting starts
31
+ * from the single-word interruption threshold.
32
+ */
33
+ async handleUserTurnStarted() {
34
+ this._botSpeaking = false;
35
+ }
36
+ /**
37
+ * Process an incoming frame to detect the start of a user turn.
38
+ *
39
+ * This method updates internal state based on transcription frames and
40
+ * triggers the user turn once the minimum word count is reached.
41
+ *
42
+ * @param frame The frame to be analyzed.
43
+ * @returns STOP if the minimum word count was reached, CONTINUE otherwise.
44
+ */
45
+ async processFrame(frame) {
46
+ if (frame instanceof BotStartedSpeakingFrame) {
47
+ await this._handleBotStartedSpeaking(frame);
48
+ }
49
+ else if (frame instanceof BotStoppedSpeakingFrame) {
50
+ await this._handleBotStoppedSpeaking(frame);
51
+ }
52
+ else if (frame instanceof TranscriptionFrame) {
53
+ return await this._handleTranscription(frame);
54
+ }
55
+ else if (frame instanceof InterimTranscriptionFrame && this._useInterim) {
56
+ return await this._handleTranscription(frame);
57
+ }
58
+ return ProcessFrameResult.CONTINUE;
59
+ }
60
+ /**
61
+ * Handle bot started speaking frame.
62
+ *
63
+ * If the bot is speaking we want to interrupt using min words.
64
+ */
65
+ async _handleBotStartedSpeaking(_frame) {
66
+ this._botSpeaking = true;
67
+ }
68
+ /**
69
+ * Handle bot stopped speaking frame.
70
+ *
71
+ * If the bot is not speaking we want to interrupt if we get a single word.
72
+ */
73
+ async _handleBotStoppedSpeaking(_frame) {
74
+ this._botSpeaking = false;
75
+ }
76
+ /**
77
+ * Handle a transcription frame and check word count.
78
+ *
79
+ * @param frame The transcription frame to be processed.
80
+ * @returns STOP if the minimum word count was reached, CONTINUE otherwise.
81
+ */
82
+ async _handleTranscription(frame) {
83
+ const minWords = this._botSpeaking ? this._minWords : 1;
84
+ // Python's str.split(): split on whitespace runs, ignoring leading/trailing.
85
+ const trimmed = frame.text.trim();
86
+ const wordCount = trimmed ? trimmed.split(/\s+/).length : 0;
87
+ const shouldTrigger = wordCount >= minWords;
88
+ const isInterim = frame instanceof InterimTranscriptionFrame;
89
+ logger.debug(`${this} should_trigger=${pyBool(shouldTrigger)} num_spoken_words=${wordCount} ` +
90
+ `min_words=${minWords} bot_speaking=${pyBool(this._botSpeaking)} interim_transcription=${pyBool(isInterim)}`);
91
+ if (shouldTrigger) {
92
+ await this.triggerUserTurnStarted();
93
+ return ProcessFrameResult.STOP;
94
+ }
95
+ await this.triggerResetAggregation();
96
+ return ProcessFrameResult.CONTINUE;
97
+ }
98
+ }
99
+ function pyBool(value) {
100
+ return value ? "True" : "False";
101
+ }
102
+ //# sourceMappingURL=min_words_user_turn_start_strategy.js.map
@@ -0,0 +1,29 @@
1
+ /** User turn start strategy based on transcriptions. */
2
+ import { type Frame } from "../../frames/frames.ts";
3
+ import { ProcessFrameResult } from "../types.ts";
4
+ import { BaseUserTurnStartStrategy, type BaseUserTurnStartStrategyOptions } from "./base_user_turn_start_strategy.ts";
5
+ export interface TranscriptionUserTurnStartStrategyOptions extends BaseUserTurnStartStrategyOptions {
6
+ /** Whether interim transcriptions also start a turn. */
7
+ useInterim?: boolean;
8
+ }
9
+ /**
10
+ * User turn start strategy based on transcriptions.
11
+ *
12
+ * This strategy signals the start of a user turn when a transcription is
13
+ * received while the bot is speaking. It is useful as a fallback in scenarios
14
+ * where VAD-based detection fails (for example, when the user speaks very
15
+ * softly) but the STT service still produces transcriptions.
16
+ */
17
+ export declare class TranscriptionUserTurnStartStrategy extends BaseUserTurnStartStrategy {
18
+ protected _useInterim: boolean;
19
+ /** Initialize transcription-based user turn start strategy. */
20
+ constructor(options?: TranscriptionUserTurnStartStrategyOptions);
21
+ /**
22
+ * Process an incoming frame to detect the start of a user turn.
23
+ *
24
+ * @param frame The frame to be processed.
25
+ * @returns STOP if a transcription was received, CONTINUE otherwise.
26
+ */
27
+ processFrame(frame: Frame): Promise<ProcessFrameResult>;
28
+ }
29
+ //# sourceMappingURL=transcription_user_turn_start_strategy.d.ts.map
@@ -0,0 +1,43 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/turns/user_start/transcription_user_turn_start_strategy.py
6
+ /** User turn start strategy based on transcriptions. */
7
+ import { InterimTranscriptionFrame, TranscriptionFrame } from "../../frames/frames.js";
8
+ import { ProcessFrameResult } from "../types.js";
9
+ import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
10
+ /**
11
+ * User turn start strategy based on transcriptions.
12
+ *
13
+ * This strategy signals the start of a user turn when a transcription is
14
+ * received while the bot is speaking. It is useful as a fallback in scenarios
15
+ * where VAD-based detection fails (for example, when the user speaks very
16
+ * softly) but the STT service still produces transcriptions.
17
+ */
18
+ export class TranscriptionUserTurnStartStrategy extends BaseUserTurnStartStrategy {
19
+ _useInterim;
20
+ /** Initialize transcription-based user turn start strategy. */
21
+ constructor(options = {}) {
22
+ super(options);
23
+ this._useInterim = options.useInterim ?? true;
24
+ }
25
+ /**
26
+ * Process an incoming frame to detect the start of a user turn.
27
+ *
28
+ * @param frame The frame to be processed.
29
+ * @returns STOP if a transcription was received, CONTINUE otherwise.
30
+ */
31
+ async processFrame(frame) {
32
+ if (frame instanceof InterimTranscriptionFrame && this._useInterim) {
33
+ await this.triggerUserTurnStarted();
34
+ return ProcessFrameResult.STOP;
35
+ }
36
+ else if (frame instanceof TranscriptionFrame) {
37
+ await this.triggerUserTurnStarted();
38
+ return ProcessFrameResult.STOP;
39
+ }
40
+ return ProcessFrameResult.CONTINUE;
41
+ }
42
+ }
43
+ //# sourceMappingURL=transcription_user_turn_start_strategy.js.map
@@ -0,0 +1,20 @@
1
+ /** User turn start strategy based on VAD events. */
2
+ import { type Frame } from "../../frames/frames.ts";
3
+ import { ProcessFrameResult } from "../types.ts";
4
+ import { BaseUserTurnStartStrategy } from "./base_user_turn_start_strategy.ts";
5
+ /**
6
+ * User turn start strategy based on VAD (Voice Activity Detection).
7
+ *
8
+ * This strategy assumes the user turn starts as soon as a VAD frame indicates
9
+ * that the user has started speaking.
10
+ */
11
+ export declare class VADUserTurnStartStrategy extends BaseUserTurnStartStrategy {
12
+ /**
13
+ * Process an incoming frame to detect user turn start.
14
+ *
15
+ * @param frame The frame to be analyzed.
16
+ * @returns STOP if the user started speaking, CONTINUE otherwise.
17
+ */
18
+ processFrame(frame: Frame): Promise<ProcessFrameResult>;
19
+ }
20
+ //# sourceMappingURL=vad_user_turn_start_strategy.d.ts.map
@@ -0,0 +1,31 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/turns/user_start/vad_user_turn_start_strategy.py
6
+ /** User turn start strategy based on VAD events. */
7
+ import { VADUserStartedSpeakingFrame } from "../../frames/frames.js";
8
+ import { ProcessFrameResult } from "../types.js";
9
+ import { BaseUserTurnStartStrategy } from "./base_user_turn_start_strategy.js";
10
+ /**
11
+ * User turn start strategy based on VAD (Voice Activity Detection).
12
+ *
13
+ * This strategy assumes the user turn starts as soon as a VAD frame indicates
14
+ * that the user has started speaking.
15
+ */
16
+ export class VADUserTurnStartStrategy extends BaseUserTurnStartStrategy {
17
+ /**
18
+ * Process an incoming frame to detect user turn start.
19
+ *
20
+ * @param frame The frame to be analyzed.
21
+ * @returns STOP if the user started speaking, CONTINUE otherwise.
22
+ */
23
+ async processFrame(frame) {
24
+ if (frame instanceof VADUserStartedSpeakingFrame) {
25
+ await this.triggerUserTurnStarted();
26
+ return ProcessFrameResult.STOP;
27
+ }
28
+ return ProcessFrameResult.CONTINUE;
29
+ }
30
+ }
31
+ //# sourceMappingURL=vad_user_turn_start_strategy.js.map
@@ -0,0 +1,141 @@
1
+ /** User turn start strategy that gates interaction behind wake phrase detection. */
2
+ import { Event, type Task } from "@pipedog/asyncio";
3
+ import { type Frame } from "../../frames/frames.ts";
4
+ import type { FrameProcessorSetup } from "../../processors/frame_processor.ts";
5
+ import { ProcessFrameResult } from "../types.ts";
6
+ import { BaseUserTurnStartStrategy, type BaseUserTurnStartStrategyOptions } from "./base_user_turn_start_strategy.ts";
7
+ /** Internal state for wake phrase detection. */
8
+ export declare const _WakeState: {
9
+ readonly IDLE: "idle";
10
+ readonly AWAKE: "awake";
11
+ };
12
+ export type _WakeState = (typeof _WakeState)[keyof typeof _WakeState];
13
+ export interface WakePhraseUserTurnStartStrategyOptions extends BaseUserTurnStartStrategyOptions {
14
+ /** List of wake phrases to detect. */
15
+ phrases: string[];
16
+ /**
17
+ * Inactivity timeout in seconds before returning to IDLE. In timeout mode,
18
+ * the timer resets on activity. In single activation mode, acts as a
19
+ * keepalive window after wake phrase detection.
20
+ */
21
+ timeout?: number;
22
+ /**
23
+ * If true, the wake phrase is required before every turn. The strategy
24
+ * returns to IDLE after each turn completes.
25
+ */
26
+ singleActivation?: boolean;
27
+ }
28
+ /**
29
+ * User turn start strategy that requires a wake phrase before interaction.
30
+ *
31
+ * Blocks subsequent strategies until a wake phrase is detected in a final
32
+ * transcription. After detection, allows interaction for a configurable
33
+ * timeout period before requiring the wake phrase again. Use
34
+ * `singleActivation: true` to require the wake phrase before every turn.
35
+ *
36
+ * This strategy should be placed first in the start strategies list.
37
+ *
38
+ * Event handlers available:
39
+ *
40
+ * - on_wake_phrase_detected: Called when a wake phrase is matched.
41
+ * - on_wake_phrase_timeout: Called when the inactivity timeout expires
42
+ * (timeout mode only).
43
+ *
44
+ * @example
45
+ * // Timeout mode (default): wake phrase unlocks interaction for 10s
46
+ * const strategy = new WakePhraseUserTurnStartStrategy({
47
+ * phrases: ["hey pipecat", "ok pipecat"],
48
+ * timeout: 10.0,
49
+ * });
50
+ *
51
+ * // Single activation: wake phrase required before every turn
52
+ * const single = new WakePhraseUserTurnStartStrategy({
53
+ * phrases: ["hey pipecat"],
54
+ * singleActivation: true,
55
+ * });
56
+ *
57
+ * strategy.eventHandler("on_wake_phrase_detected", async (strategy, phrase) => { ... });
58
+ * strategy.eventHandler("on_wake_phrase_timeout", async (strategy) => { ... });
59
+ *
60
+ * `timeout`: In timeout mode, the timer resets on activity (user, bot speech).
61
+ * In single activation mode, acts as a keepalive window — the strategy stays
62
+ * AWAKE for this duration after wake phrase detection, allowing the current
63
+ * turn to complete before returning to IDLE.
64
+ */
65
+ export declare class WakePhraseUserTurnStartStrategy extends BaseUserTurnStartStrategy {
66
+ protected _phrases: string[];
67
+ protected _timeout: number;
68
+ protected _singleActivation: boolean;
69
+ protected _patterns: RegExp[];
70
+ protected _state: _WakeState;
71
+ protected _accumulatedText: string;
72
+ protected _timeoutEvent: Event;
73
+ protected _timeoutTask: Task<unknown> | null;
74
+ constructor(options: WakePhraseUserTurnStartStrategyOptions);
75
+ /** Returns the current wake state. */
76
+ get state(): _WakeState;
77
+ /**
78
+ * Set up the strategy.
79
+ *
80
+ * @param setup Configuration object containing setup parameters.
81
+ */
82
+ setup(setup: FrameProcessorSetup): Promise<void>;
83
+ /** Cleanup the strategy. */
84
+ cleanup(): Promise<void>;
85
+ /**
86
+ * Ready the strategy for a new user turn.
87
+ *
88
+ * In timeout mode, preserves state and refreshes the timeout — a turn
89
+ * starting is the activity that keeps the strategy awake. In single
90
+ * activation mode, does nothing: the keepalive timeout (started when the
91
+ * wake phrase was detected) handles the transition back to IDLE.
92
+ */
93
+ handleUserTurnStarted(): Promise<void>;
94
+ /**
95
+ * Process an incoming frame for wake phrase detection or passthrough.
96
+ *
97
+ * @param frame The frame to be processed.
98
+ * @returns STOP when the wake phrase is detected or when in IDLE state
99
+ * (blocks subsequent strategies), CONTINUE when in AWAKE state (allows
100
+ * subsequent strategies to proceed).
101
+ */
102
+ processFrame(frame: Frame): Promise<ProcessFrameResult>;
103
+ /**
104
+ * Process a frame while in IDLE state.
105
+ *
106
+ * Only final `TranscriptionFrame` instances are checked for wake phrase
107
+ * matches. When a match is found, a user turn start is triggered.
108
+ * Transcription frames that don't match have their text cleared so that
109
+ * pre-wake-phrase speech is not added to the LLM context. All frames
110
+ * return STOP to block subsequent strategies.
111
+ */
112
+ protected _processIdle(frame: Frame): Promise<ProcessFrameResult>;
113
+ /**
114
+ * Process a frame while in AWAKE state.
115
+ *
116
+ * Refreshes the timeout on activity frames (timeout mode only). Returns
117
+ * CONTINUE so subsequent strategies can process the frame.
118
+ */
119
+ protected _processAwake(frame: Frame): Promise<ProcessFrameResult>;
120
+ /** Strip punctuation from text, keeping only letters, digits, and whitespace. */
121
+ protected static _stripPunctuation(text: string): string;
122
+ /**
123
+ * Check if the accumulated text contains a wake phrase.
124
+ *
125
+ * Punctuation is stripped before matching so that STT output like
126
+ * "Hey, Pipecat!" still matches the phrase "hey pipecat".
127
+ *
128
+ * @param text New transcription text to append and check.
129
+ * @returns True if a wake phrase was found, false otherwise.
130
+ */
131
+ protected _checkWakePhrase(text: string): boolean;
132
+ /** Transition from IDLE to AWAKE state. */
133
+ protected _transitionToAwake(phrase: string): void;
134
+ /** Transition from AWAKE to IDLE state. */
135
+ protected _transitionToIdle(): void;
136
+ /** Refresh the inactivity timeout. */
137
+ protected _refreshTimeout(): void;
138
+ /** Background task that monitors inactivity timeout. */
139
+ protected _timeoutTaskHandler(): Promise<void>;
140
+ }
141
+ //# sourceMappingURL=wake_phrase_user_turn_start_strategy.d.ts.map