@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,372 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/processors/metrics/frame_processor_metrics.py
6
+ /** Frame processor metrics collection and reporting. */
7
+ import { time } from "@pipedog/asyncio";
8
+ import { detectSpeechOnset } from "../../audio/utils.js";
9
+ import { MetricsFrame } from "../../frames/frames.js";
10
+ import { LLMUsageMetricsData, MetricsData, ProcessingMetricsData, STTUsageMetricsData, TextAggregationMetricsData, TTFAMetricsData, TTFATMetricsData, TTFBMetricsData, TTSUsageMetricsData, } from "../../metrics/metrics.js";
11
+ import { BaseObject } from "../../utils/base_object.js";
12
+ import { logger } from "../../utils/logger.js";
13
+ function concatBytes(a, b) {
14
+ const out = new Uint8Array(a.length + b.length);
15
+ out.set(a, 0);
16
+ out.set(b, a.length);
17
+ return out;
18
+ }
19
+ /**
20
+ * Metrics collection and reporting for frame processors.
21
+ *
22
+ * Provides comprehensive metrics tracking for frame processing operations,
23
+ * including timing measurements, resource usage, and performance analytics.
24
+ * Supports TTFB tracking, TTFA tracking, processing duration metrics, and
25
+ * usage statistics for LLM, STT, and TTS operations.
26
+ */
27
+ export class FrameProcessorMetrics extends BaseObject {
28
+ // Cap on buffered audio while waiting for a TTFA speech onset, so a response
29
+ // that is all silence (or never becomes audible) can't grow the buffer without
30
+ // bound.
31
+ static _TTFA_MAX_BUFFER_SECONDS = 3.0;
32
+ _startTtfbTime = 0;
33
+ _startProcessingTime = 0;
34
+ _startTextAggregationTime = 0;
35
+ _lastTtfbTime = 0;
36
+ _shouldReportTtfb = true;
37
+ // TTFA (time-to-first-audio) state. TTFA extends TTFB: scanning for the
38
+ // first audible sample begins when TTFB stops (see stopTtfbMetrics).
39
+ // Audio is buffered across chunks until a sustained onset is confirmed.
40
+ _ttfaActive = false;
41
+ _ttfaBuffer = new Uint8Array(0);
42
+ // TTFAT (time-to-first-answer-token) state. TTFAT extends TTFB the same
43
+ // way, so it keeps the request start that stopTtfbMetrics clears.
44
+ _ttfatActive = false;
45
+ _startTtfatTime = 0;
46
+ // Set by setProcessorName() / setCoreMetricsData(); FrameProcessor sets it
47
+ // right after construction.
48
+ _coreMetricsData;
49
+ /**
50
+ * The current TTFB value in seconds, or null if not measured.
51
+ */
52
+ get ttfb() {
53
+ if (this._lastTtfbTime > 0) {
54
+ return this._lastTtfbTime;
55
+ }
56
+ // If TTFB is in progress, calculate current value
57
+ if (this._startTtfbTime > 0) {
58
+ return time() - this._startTtfbTime;
59
+ }
60
+ return null;
61
+ }
62
+ /** Get the processor name from core metrics data. */
63
+ _processorName() {
64
+ return this._coreMetricsData.processor;
65
+ }
66
+ /** Get the model name from core metrics data. */
67
+ _modelName() {
68
+ return this._coreMetricsData.model;
69
+ }
70
+ /**
71
+ * Set the core metrics data for this collector.
72
+ *
73
+ * @param data The core metrics data containing processor and model information.
74
+ */
75
+ setCoreMetricsData(data) {
76
+ this._coreMetricsData = data;
77
+ }
78
+ /**
79
+ * Set the processor name for metrics reporting.
80
+ *
81
+ * @param name The name of the processor to use in metrics.
82
+ */
83
+ setProcessorName(name) {
84
+ this._coreMetricsData = new MetricsData({ processor: name });
85
+ }
86
+ /**
87
+ * Start measuring time-to-first-byte (TTFB).
88
+ *
89
+ * @param options.startTime Optional timestamp to use as the start time. If
90
+ * null, uses the current time.
91
+ * @param options.reportOnlyInitialTtfb Whether to report only the first TTFB measurement.
92
+ */
93
+ async startTtfbMetrics(options) {
94
+ // A response that was interrupted before its first answer token leaves
95
+ // TTFAT armed; drop it so this request measures its own. This is TTFAT
96
+ // state rather than TTFB reporting policy, so it happens regardless of
97
+ // whether this request's TTFB will be reported.
98
+ this._ttfatActive = false;
99
+ this._startTtfatTime = 0;
100
+ if (this._shouldReportTtfb) {
101
+ // `||` on purpose: upstream uses `start_time or time.time()`.
102
+ this._startTtfbTime = options.startTime || time();
103
+ this._lastTtfbTime = 0;
104
+ this._shouldReportTtfb = !options.reportOnlyInitialTtfb;
105
+ }
106
+ }
107
+ /**
108
+ * Abandon the current TTFB measurement without reporting it.
109
+ *
110
+ * For a request whose response never came: there is no interval to
111
+ * report, and leaving the measurement open would let the next unrelated
112
+ * output be measured against it.
113
+ */
114
+ async cancelTtfbMetrics() {
115
+ this._startTtfbTime = 0;
116
+ }
117
+ /**
118
+ * Stop TTFB measurement and generate metrics frame.
119
+ *
120
+ * TTFB ends at the first output the service produces, of any kind —
121
+ * including content a caller never sees, such as an LLM's reasoning. Events
122
+ * that merely acknowledge the request (an HTTP response head, a stream-open
123
+ * or keepalive event) carry no output and must not stop it, or TTFB
124
+ * measures connection setup rather than the service's response.
125
+ *
126
+ * Only the first call per measurement takes effect, so services can call
127
+ * this from every branch that handles output rather than tracking which
128
+ * arrived first.
129
+ *
130
+ * @param options.endTime Optional timestamp to use as the end time. If null,
131
+ * uses the current time.
132
+ * @returns MetricsFrame containing TTFB data, or null if not measuring.
133
+ */
134
+ async stopTtfbMetrics(options = {}) {
135
+ if (this._startTtfbTime === 0) {
136
+ return null;
137
+ }
138
+ const endTime = options.endTime || time();
139
+ if (endTime < this._startTtfbTime) {
140
+ // The output being measured predates the request it is measured
141
+ // from, so it cannot be a response to it -- a caller measuring to a
142
+ // stale timestamp, or a wall clock that stepped backwards mid
143
+ // measurement. Either way there is no interval to report.
144
+ logger.warning(`${this._processorName()} TTFB not reported: output predates the ` +
145
+ `start of the measurement by ${(this._startTtfbTime - endTime).toFixed(3)}s`);
146
+ this._startTtfbTime = 0;
147
+ return null;
148
+ }
149
+ this._lastTtfbTime = endTime - this._startTtfbTime;
150
+ logger.debug(`${this._processorName()} TTFB: ${this._lastTtfbTime.toFixed(3)}s`);
151
+ const ttfb = new TTFBMetricsData({
152
+ processor: this._processorName(),
153
+ value: this._lastTtfbTime,
154
+ model: this._modelName(),
155
+ });
156
+ // The first byte has arrived; begin scanning leading silence so TTFA can
157
+ // be reported as TTFB plus the silence duration (see processTtfaMetrics).
158
+ this._ttfaActive = true;
159
+ this._ttfaBuffer = new Uint8Array(0);
160
+ // Likewise for TTFAT, which needs the request start that is cleared below
161
+ // (see stopTtfatMetrics).
162
+ this._ttfatActive = true;
163
+ this._startTtfatTime = this._startTtfbTime;
164
+ this._startTtfbTime = 0;
165
+ return new MetricsFrame({ data: [ttfb] });
166
+ }
167
+ /**
168
+ * Scan buffered audio for speech onset and report TTFA.
169
+ *
170
+ * TTFA extends TTFB: once `stopTtfbMetrics` records the first byte, audio
171
+ * is buffered across chunks (the leading silence may span several, and
172
+ * onset confirmation needs a little audio past it) and scanned for a
173
+ * sustained speech onset. When found, TTFB plus the leading-silence
174
+ * duration is emitted and measuring stops until the next response.
175
+ *
176
+ * @param options.audio Raw PCM audio bytes (16-bit signed integers).
177
+ * @param options.sampleRate Sample rate of the audio in Hz.
178
+ * @param options.numChannels Number of interleaved audio channels.
179
+ * @returns MetricsFrame containing TTFA data once onset is confirmed,
180
+ * otherwise null.
181
+ */
182
+ async processTtfaMetrics(options) {
183
+ const { audio, sampleRate, numChannels } = options;
184
+ if (!this._ttfaActive || sampleRate <= 0) {
185
+ return null;
186
+ }
187
+ this._ttfaBuffer = concatBytes(this._ttfaBuffer, audio);
188
+ const onset = detectSpeechOnset(this._ttfaBuffer, sampleRate, numChannels);
189
+ if (onset === null || onset === undefined) {
190
+ // No confirmed onset yet. Bound memory against pathologically long
191
+ // (or never-arriving) silence by giving up past a sane limit.
192
+ const maxSeconds = FrameProcessorMetrics._TTFA_MAX_BUFFER_SECONDS;
193
+ const maxBytes = Math.trunc(maxSeconds * sampleRate * Math.max(numChannels, 1) * 2);
194
+ if (this._ttfaBuffer.length >= maxBytes) {
195
+ logger.debug(`${this._processorName()} TTFA: no onset within ` +
196
+ `${maxSeconds.toFixed(0)}s of audio; not reporting`);
197
+ this._ttfaActive = false;
198
+ this._ttfaBuffer = new Uint8Array(0);
199
+ }
200
+ return null;
201
+ }
202
+ const silenceDuration = onset / sampleRate;
203
+ const value = this._lastTtfbTime + silenceDuration;
204
+ logger.debug(`${this._processorName()} TTFA: ${value.toFixed(3)}s (${silenceDuration.toFixed(3)}s leading silence)`);
205
+ const ttfa = new TTFAMetricsData({
206
+ processor: this._processorName(),
207
+ ttfa: value,
208
+ leadingSilence: silenceDuration,
209
+ ttfb: this._lastTtfbTime,
210
+ model: this._modelName(),
211
+ });
212
+ this._ttfaActive = false;
213
+ this._ttfaBuffer = new Uint8Array(0);
214
+ return new MetricsFrame({ data: [ttfa] });
215
+ }
216
+ /**
217
+ * Stop TTFAT measurement and generate metrics frame.
218
+ *
219
+ * TTFAT extends TTFB: it runs from the same request start but ends at the
220
+ * first token of the answer the caller sees, so anything the model streams
221
+ * first — reasoning, most often — falls between the two. Measuring it at
222
+ * the point a service produces the token, rather than where the pipeline
223
+ * releases it, keeps buffering downstream of the service out of the number.
224
+ *
225
+ * Only the first call per measurement takes effect, so services can call
226
+ * this from every branch that produces an answer — streamed text, and the
227
+ * start of a tool call on a turn that answers with one instead of text.
228
+ *
229
+ * @param options.endTime Optional timestamp to use as the end time. If null,
230
+ * uses the current time.
231
+ * @returns MetricsFrame containing TTFAT data, or null if not measuring.
232
+ */
233
+ async stopTtfatMetrics(options = {}) {
234
+ if (!this._ttfatActive || this._startTtfatTime === 0) {
235
+ return null;
236
+ }
237
+ const endTime = options.endTime || time();
238
+ const value = endTime - this._startTtfatTime;
239
+ const thinkingTime = value - this._lastTtfbTime;
240
+ logger.debug(`${this._processorName()} TTFAT: ${value.toFixed(3)}s (${thinkingTime.toFixed(3)}s thinking)`);
241
+ const ttfat = new TTFATMetricsData({
242
+ processor: this._processorName(),
243
+ ttfat: value,
244
+ ttfb: this._lastTtfbTime,
245
+ thinkingTime,
246
+ model: this._modelName(),
247
+ });
248
+ this._ttfatActive = false;
249
+ this._startTtfatTime = 0;
250
+ return new MetricsFrame({ data: [ttfat] });
251
+ }
252
+ /**
253
+ * Start measuring processing time.
254
+ *
255
+ * @param options.startTime Optional timestamp to use as the start time. If
256
+ * null, uses the current time.
257
+ */
258
+ async startProcessingMetrics(options = {}) {
259
+ this._startProcessingTime = options.startTime || time();
260
+ }
261
+ /**
262
+ * Stop processing time measurement and generate metrics frame.
263
+ *
264
+ * @param options.endTime Optional timestamp to use as the end time. If null,
265
+ * uses the current time.
266
+ * @returns MetricsFrame containing processing duration data, or null if not measuring.
267
+ */
268
+ async stopProcessingMetrics(options = {}) {
269
+ if (this._startProcessingTime === 0) {
270
+ return null;
271
+ }
272
+ const endTime = options.endTime || time();
273
+ const value = endTime - this._startProcessingTime;
274
+ logger.debug(`${this._processorName()} processing time: ${value.toFixed(3)}s`);
275
+ const processing = new ProcessingMetricsData({
276
+ processor: this._processorName(),
277
+ value,
278
+ model: this._modelName(),
279
+ });
280
+ this._startProcessingTime = 0;
281
+ return new MetricsFrame({ data: [processing] });
282
+ }
283
+ /**
284
+ * Record LLM token usage metrics.
285
+ *
286
+ * @param tokens Token usage information including prompt and completion tokens.
287
+ * @returns MetricsFrame containing LLM usage data.
288
+ */
289
+ async startLlmUsageMetrics(tokens) {
290
+ let logstr = `${this._processorName()} prompt tokens: ${tokens.promptTokens}, completion tokens: ${tokens.completionTokens}`;
291
+ if (tokens.cacheReadInputTokens) {
292
+ logstr += `, cache read input tokens: ${tokens.cacheReadInputTokens}`;
293
+ }
294
+ if (tokens.cacheCreationInputTokens) {
295
+ logstr += `, cache creation input tokens: ${tokens.cacheCreationInputTokens}`;
296
+ }
297
+ if (tokens.reasoningTokens) {
298
+ logstr += `, reasoning tokens: ${tokens.reasoningTokens}`;
299
+ }
300
+ if (tokens.inputAudioTokens) {
301
+ logstr += `, input audio tokens: ${tokens.inputAudioTokens}`;
302
+ }
303
+ if (tokens.outputAudioTokens) {
304
+ logstr += `, output audio tokens: ${tokens.outputAudioTokens}`;
305
+ }
306
+ if (tokens.cacheReadInputAudioTokens) {
307
+ logstr += `, cache read input audio tokens: ${tokens.cacheReadInputAudioTokens}`;
308
+ }
309
+ logger.debug(logstr);
310
+ const value = new LLMUsageMetricsData({
311
+ processor: this._processorName(),
312
+ model: this._modelName(),
313
+ value: tokens,
314
+ });
315
+ return new MetricsFrame({ data: [value] });
316
+ }
317
+ /**
318
+ * Record STT usage metrics.
319
+ *
320
+ * @param usage Usage information for the STT operation.
321
+ * @returns MetricsFrame containing STT usage data.
322
+ */
323
+ async startSttUsageMetrics(usage) {
324
+ logger.debug(`${this._processorName()} usage audio seconds: ${usage.audioSeconds.toFixed(3)}`);
325
+ const value = new STTUsageMetricsData({
326
+ processor: this._processorName(),
327
+ model: this._modelName(),
328
+ value: usage,
329
+ });
330
+ return new MetricsFrame({ data: [value] });
331
+ }
332
+ /**
333
+ * Record TTS character usage metrics.
334
+ *
335
+ * @param text The text being processed by TTS.
336
+ * @returns MetricsFrame containing TTS usage data.
337
+ */
338
+ async startTtsUsageMetrics(text) {
339
+ const characters = new TTSUsageMetricsData({
340
+ processor: this._processorName(),
341
+ model: this._modelName(),
342
+ // Python's len() counts code points, not UTF-16 units.
343
+ value: [...text].length,
344
+ });
345
+ logger.debug(`${this._processorName()} usage characters: ${characters.value}`);
346
+ return new MetricsFrame({ data: [characters] });
347
+ }
348
+ /** Start measuring text aggregation time (first token to first sentence). */
349
+ async startTextAggregationMetrics() {
350
+ this._startTextAggregationTime = time();
351
+ }
352
+ /**
353
+ * Stop text aggregation measurement and generate metrics frame.
354
+ *
355
+ * @returns MetricsFrame containing text aggregation time, or null if not measuring.
356
+ */
357
+ async stopTextAggregationMetrics() {
358
+ if (this._startTextAggregationTime === 0) {
359
+ return null;
360
+ }
361
+ const value = time() - this._startTextAggregationTime;
362
+ logger.debug(`${this._processorName()} text aggregation time: ${value}`);
363
+ const aggregation = new TextAggregationMetricsData({
364
+ processor: this._processorName(),
365
+ value,
366
+ model: this._modelName(),
367
+ });
368
+ this._startTextAggregationTime = 0;
369
+ return new MetricsFrame({ data: [aggregation] });
370
+ }
371
+ }
372
+ //# sourceMappingURL=frame_processor_metrics.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.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/processors/metrics/__init__.py
6
+ // The upstream package initializer is empty; import the modules directly.
7
+ export {};
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,68 @@
1
+ /** Producer processor for frame filtering and distribution. */
2
+ import { Queue } from "@pipedog/asyncio";
3
+ import type { Frame } from "../frames/frames.ts";
4
+ import { type FrameDirection, FrameProcessor } from "./frame_processor.ts";
5
+ /** Async function transforming a frame before it is handed on. */
6
+ export type FrameTransformer = (frame: Frame) => Promise<Frame>;
7
+ /** Async function deciding whether a frame should be produced. */
8
+ export type FrameFilter = (frame: Frame) => Promise<boolean>;
9
+ /**
10
+ * Default transformer that returns the frame unchanged.
11
+ *
12
+ * @param frame The frame to transform.
13
+ * @returns The same frame without modifications.
14
+ */
15
+ export declare function identityTransformer(frame: Frame): Promise<Frame>;
16
+ export interface ProducerProcessorOptions {
17
+ /**
18
+ * Async function that determines if a frame should be produced. Must return
19
+ * true for frames to be sent to consumers.
20
+ */
21
+ filter: FrameFilter;
22
+ /**
23
+ * Async function to transform frames before sending to consumers. Defaults
24
+ * to `identityTransformer` which returns frames unchanged.
25
+ */
26
+ transformer?: FrameTransformer;
27
+ /**
28
+ * Whether to pass frames through to the next processor. If true, all frames
29
+ * continue downstream regardless of filter result.
30
+ */
31
+ passthrough?: boolean;
32
+ }
33
+ /**
34
+ * A processor that filters frames and distributes them to multiple consumers.
35
+ *
36
+ * This processor receives frames, applies a filter to determine which frames
37
+ * should be sent to consumers (ConsumerProcessor), optionally transforms those
38
+ * frames, and distributes them to registered consumer queues. It can also pass
39
+ * frames through to the next processor in the pipeline.
40
+ */
41
+ export declare class ProducerProcessor extends FrameProcessor {
42
+ protected _filter: FrameFilter;
43
+ protected _transformer: FrameTransformer;
44
+ protected _passthrough: boolean;
45
+ protected _consumers: Queue<Frame>[];
46
+ /** Initialize the producer processor. */
47
+ constructor(options: ProducerProcessorOptions);
48
+ /**
49
+ * Add a new consumer and return its associated queue.
50
+ *
51
+ * @returns The queue for the newly added consumer.
52
+ */
53
+ addConsumer(): Queue<Frame>;
54
+ /**
55
+ * Process an incoming frame and determine whether to produce it.
56
+ *
57
+ * If the frame meets the filter criteria, it will be transformed and added
58
+ * to all consumer queues. If passthrough is enabled, the original frame will
59
+ * also be sent downstream.
60
+ *
61
+ * @param frame The frame to process.
62
+ * @param direction The direction of the frame flow.
63
+ */
64
+ processFrame(frame: Frame, direction: FrameDirection): Promise<void>;
65
+ /** Produce a frame to all consumers. */
66
+ protected _produce(frame: Frame): Promise<void>;
67
+ }
68
+ //# sourceMappingURL=producer_processor.d.ts.map
@@ -0,0 +1,78 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/processors/producer_processor.py
6
+ /** Producer processor for frame filtering and distribution. */
7
+ import { Queue } from "@pipedog/asyncio";
8
+ import { FrameProcessor } from "./frame_processor.js";
9
+ /**
10
+ * Default transformer that returns the frame unchanged.
11
+ *
12
+ * @param frame The frame to transform.
13
+ * @returns The same frame without modifications.
14
+ */
15
+ export async function identityTransformer(frame) {
16
+ return frame;
17
+ }
18
+ /**
19
+ * A processor that filters frames and distributes them to multiple consumers.
20
+ *
21
+ * This processor receives frames, applies a filter to determine which frames
22
+ * should be sent to consumers (ConsumerProcessor), optionally transforms those
23
+ * frames, and distributes them to registered consumer queues. It can also pass
24
+ * frames through to the next processor in the pipeline.
25
+ */
26
+ export class ProducerProcessor extends FrameProcessor {
27
+ _filter;
28
+ _transformer;
29
+ _passthrough;
30
+ _consumers = [];
31
+ /** Initialize the producer processor. */
32
+ constructor(options) {
33
+ super();
34
+ this._filter = options.filter;
35
+ this._transformer = options.transformer ?? identityTransformer;
36
+ this._passthrough = options.passthrough ?? true;
37
+ }
38
+ /**
39
+ * Add a new consumer and return its associated queue.
40
+ *
41
+ * @returns The queue for the newly added consumer.
42
+ */
43
+ addConsumer() {
44
+ const queue = new Queue();
45
+ this._consumers.push(queue);
46
+ return queue;
47
+ }
48
+ /**
49
+ * Process an incoming frame and determine whether to produce it.
50
+ *
51
+ * If the frame meets the filter criteria, it will be transformed and added
52
+ * to all consumer queues. If passthrough is enabled, the original frame will
53
+ * also be sent downstream.
54
+ *
55
+ * @param frame The frame to process.
56
+ * @param direction The direction of the frame flow.
57
+ */
58
+ async processFrame(frame, direction) {
59
+ await super.processFrame(frame, direction);
60
+ if (await this._filter(frame)) {
61
+ await this._produce(frame);
62
+ if (this._passthrough) {
63
+ await this.pushFrame(frame, direction);
64
+ }
65
+ }
66
+ else {
67
+ await this.pushFrame(frame, direction);
68
+ }
69
+ }
70
+ /** Produce a frame to all consumers. */
71
+ async _produce(frame) {
72
+ for (const consumer of this._consumers) {
73
+ const newFrame = await this._transformer(frame);
74
+ await consumer.put(newFrame);
75
+ }
76
+ }
77
+ }
78
+ //# sourceMappingURL=producer_processor.js.map
@@ -0,0 +1,30 @@
1
+ /** Stateless text transformation processor for Pipecat. */
2
+ import { type Frame } from "../frames/frames.ts";
3
+ import { type FrameDirection, FrameProcessor } from "./frame_processor.ts";
4
+ /** A text transformation, synchronous or asynchronous. */
5
+ export type TextTransformFn = (text: string) => string | Promise<string>;
6
+ /**
7
+ * Processor that applies transformation functions to text frames.
8
+ *
9
+ * This processor intercepts TextFrame objects and applies a user-provided
10
+ * transformation function to the text content. The function can be either
11
+ * synchronous or asynchronous.
12
+ */
13
+ export declare class StatelessTextTransformer extends FrameProcessor {
14
+ protected _transformFn: TextTransformFn;
15
+ /**
16
+ * Initialize the text transformer.
17
+ *
18
+ * @param transformFn Function to apply to text content. Can be synchronous
19
+ * (string -> string) or asynchronous (string -> Promise<string>).
20
+ */
21
+ constructor(transformFn: TextTransformFn);
22
+ /**
23
+ * Process frames, applying transformation to text frames.
24
+ *
25
+ * @param frame The frame to process.
26
+ * @param direction The direction of frame flow in the pipeline.
27
+ */
28
+ processFrame(frame: Frame, direction: FrameDirection): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=text_transformer.d.ts.map
@@ -0,0 +1,48 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/processors/text_transformer.py
6
+ /** Stateless text transformation processor for Pipecat. */
7
+ import { TextFrame } from "../frames/frames.js";
8
+ import { FrameProcessor } from "./frame_processor.js";
9
+ /**
10
+ * Processor that applies transformation functions to text frames.
11
+ *
12
+ * This processor intercepts TextFrame objects and applies a user-provided
13
+ * transformation function to the text content. The function can be either
14
+ * synchronous or asynchronous.
15
+ */
16
+ export class StatelessTextTransformer extends FrameProcessor {
17
+ _transformFn;
18
+ /**
19
+ * Initialize the text transformer.
20
+ *
21
+ * @param transformFn Function to apply to text content. Can be synchronous
22
+ * (string -> string) or asynchronous (string -> Promise<string>).
23
+ */
24
+ constructor(transformFn) {
25
+ super();
26
+ this._transformFn = transformFn;
27
+ }
28
+ /**
29
+ * Process frames, applying transformation to text frames.
30
+ *
31
+ * @param frame The frame to process.
32
+ * @param direction The direction of frame flow in the pipeline.
33
+ */
34
+ async processFrame(frame, direction) {
35
+ await super.processFrame(frame, direction);
36
+ if (frame instanceof TextFrame) {
37
+ let result = this._transformFn(frame.text);
38
+ if (result instanceof Promise) {
39
+ result = await result;
40
+ }
41
+ await this.pushFrame(new TextFrame({ text: result }));
42
+ }
43
+ else {
44
+ await this.pushFrame(frame, direction);
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=text_transformer.js.map
@@ -0,0 +1,3 @@
1
+ /** Worker registry for tracking known workers across runners. */
2
+ export { WorkerRegistry } from "./registry.ts";
3
+ //# sourceMappingURL=index.d.ts.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/registry/__init__.py
6
+ /** Worker registry for tracking known workers across runners. */
7
+ export { WorkerRegistry } from "./registry.js";
8
+ //# sourceMappingURL=index.js.map