@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,346 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/classifiers/base_classifier.py
6
+ /**
7
+ * Classifiers answer typed questions about some state.
8
+ *
9
+ * A classifier is a plain object. Whoever needs answers creates one, keeps
10
+ * it, and calls it. It does not sit in a pipeline and no frames flow into it.
11
+ * A question is one of `YesNoQuestion`, `ChoiceQuestion` or `ScoreQuestion`.
12
+ * Questions are asked by name, several about one state at once:
13
+ * `BaseClassifier.ask()` takes any mix of kinds, and
14
+ * `BaseClassifier.yesNo()`, `BaseClassifier.choice()` and
15
+ * `BaseClassifier.score()` take questions of one kind and return typed
16
+ * results. Classifiers that can see images take `ClassifierImage` alongside
17
+ * the state.
18
+ */
19
+ import { monotonic } from "@pipedog/asyncio";
20
+ import { LLMUsageMetricsData, ProcessingMetricsData, } from "../metrics/metrics.js";
21
+ import { BaseObject } from "../utils/base_object.js";
22
+ import { encodeImage } from "../utils/image.js";
23
+ /** A classifier could not answer a question. */
24
+ export class ClassifierError extends Error {
25
+ name = "ClassifierError";
26
+ }
27
+ /** Whether the state meets a condition. */
28
+ export class YesNoQuestion {
29
+ instructions;
30
+ yes;
31
+ no;
32
+ constructor(options) {
33
+ this.instructions = options.instructions;
34
+ this.yes = options.yes ?? null;
35
+ this.no = options.no ?? null;
36
+ }
37
+ }
38
+ /** Which of several options fits the state. */
39
+ export class ChoiceQuestion {
40
+ instructions;
41
+ options;
42
+ constructor(options) {
43
+ this.instructions = options.instructions;
44
+ this.options = options.options;
45
+ }
46
+ }
47
+ /** Where the state falls on an ordered scale. */
48
+ export class ScoreQuestion {
49
+ instructions;
50
+ levels;
51
+ constructor(options) {
52
+ if (options.levels.length < 2) {
53
+ throw new Error("ScoreQuestion levels should have at least 2 items");
54
+ }
55
+ this.instructions = options.instructions;
56
+ this.levels = options.levels;
57
+ }
58
+ }
59
+ /** An encoded image the questions can look at, alongside the state. */
60
+ export class ClassifierImage {
61
+ data;
62
+ contentType;
63
+ constructor(options) {
64
+ const contentType = options.contentType;
65
+ // Upstream's pydantic Literal rejects any other given type.
66
+ if (contentType != null &&
67
+ contentType !== "image/png" &&
68
+ contentType !== "image/jpeg" &&
69
+ contentType !== "image/webp") {
70
+ throw new Error(`ClassifierImage takes PNG, JPEG or WebP, got ${contentType}`);
71
+ }
72
+ this.data = options.data;
73
+ this.contentType = contentType ?? ClassifierImage._contentType(options.data);
74
+ }
75
+ /**
76
+ * Build an image from an image frame, such as a frame from the user's camera.
77
+ *
78
+ * Raw pixels are encoded as a JPEG. A frame whose format is already a MIME
79
+ * type keeps its bytes.
80
+ *
81
+ * @param frame The image frame.
82
+ * @returns The image.
83
+ */
84
+ static async fromFrame(frame) {
85
+ const [data, contentType] = await encodeImage(frame.image, frame.size, frame.format);
86
+ return new ClassifierImage({ data, contentType: contentType });
87
+ }
88
+ /**
89
+ * The MIME type of the encoded image, or an error if it is not one
90
+ * classifiers take.
91
+ *
92
+ * PORTING NOTE: upstream opens the image with Pillow; this reads the
93
+ * format's signature bytes instead.
94
+ */
95
+ static _contentType(data) {
96
+ const contentType = sniffImageType(data);
97
+ if (contentType === null) {
98
+ throw new Error("ClassifierImage data is not an image");
99
+ }
100
+ if (contentType !== "image/png" &&
101
+ contentType !== "image/jpeg" &&
102
+ contentType !== "image/webp") {
103
+ throw new Error(`ClassifierImage takes PNG, JPEG or WebP, got ${contentType}`);
104
+ }
105
+ return contentType;
106
+ }
107
+ toString() {
108
+ return `ClassifierImage(content_type='${this.contentType}')`;
109
+ }
110
+ }
111
+ function startsWith(data, signature, offset = 0) {
112
+ if (data.length < offset + signature.length) {
113
+ return false;
114
+ }
115
+ return signature.every((b, i) => data[offset + i] === b);
116
+ }
117
+ const ascii = (s) => [...s].map((c) => c.charCodeAt(0));
118
+ /** The MIME type of an encoded image read from its signature, or null if unknown. */
119
+ function sniffImageType(data) {
120
+ if (startsWith(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))
121
+ return "image/png";
122
+ if (startsWith(data, [0xff, 0xd8, 0xff]))
123
+ return "image/jpeg";
124
+ if (startsWith(data, ascii("RIFF")) && startsWith(data, ascii("WEBP"), 8))
125
+ return "image/webp";
126
+ if (startsWith(data, ascii("GIF87a")) || startsWith(data, ascii("GIF89a")))
127
+ return "image/gif";
128
+ if (startsWith(data, ascii("BM")))
129
+ return "image/bmp";
130
+ if (startsWith(data, [0x49, 0x49, 0x2a, 0x00]) || startsWith(data, [0x4d, 0x4d, 0x00, 0x2a])) {
131
+ return "image/tiff";
132
+ }
133
+ if (startsWith(data, [0x00, 0x00, 0x01, 0x00]))
134
+ return "image/x-icon";
135
+ return null;
136
+ }
137
+ /** Answer to a `YesNoQuestion`. */
138
+ export class YesNoResult {
139
+ probability;
140
+ constructor(options) {
141
+ this.probability = options.probability;
142
+ }
143
+ /**
144
+ * Whether yes is the likelier answer.
145
+ *
146
+ * Callers that need more certainty than that compare `probability` with a
147
+ * threshold of their own.
148
+ */
149
+ get isYes() {
150
+ return this.probability >= 0.5;
151
+ }
152
+ }
153
+ /** Answer to a `ChoiceQuestion`. */
154
+ export class ChoiceResult {
155
+ choice;
156
+ probabilities;
157
+ confidence;
158
+ constructor(options) {
159
+ this.choice = options.choice;
160
+ this.probabilities = options.probabilities;
161
+ this.confidence = options.confidence;
162
+ }
163
+ }
164
+ /** One level of a `ScoreQuestion`'s scale and how likely it is. */
165
+ export class ScoreLevel {
166
+ level;
167
+ probability;
168
+ constructor(options) {
169
+ this.level = options.level;
170
+ this.probability = options.probability;
171
+ }
172
+ }
173
+ /** Answer to a `ScoreQuestion`. */
174
+ export class ScoreResult {
175
+ score;
176
+ levels;
177
+ confidence;
178
+ constructor(options) {
179
+ this.score = options.score;
180
+ this.levels = options.levels;
181
+ this.confidence = options.confidence;
182
+ }
183
+ /**
184
+ * How likely one level is.
185
+ *
186
+ * @param level The level as the question gave it.
187
+ * @returns The level's probability.
188
+ * @throws Error If the scale has no such level (upstream's KeyError).
189
+ */
190
+ probability(level) {
191
+ for (const item of this.levels) {
192
+ if (deepEqual(item.level, level)) {
193
+ return item.probability;
194
+ }
195
+ }
196
+ throw new Error(`not a level of this scale: ${JSON.stringify(level)}`);
197
+ }
198
+ }
199
+ /** Python `==` on JSON-like values: dicts compare regardless of key order. */
200
+ function deepEqual(a, b) {
201
+ if (a === b) {
202
+ return true;
203
+ }
204
+ if (Array.isArray(a) || Array.isArray(b)) {
205
+ return (Array.isArray(a) &&
206
+ Array.isArray(b) &&
207
+ a.length === b.length &&
208
+ a.every((v, i) => deepEqual(v, b[i])));
209
+ }
210
+ if (typeof a === "object" && typeof b === "object" && a !== null && b !== null) {
211
+ const ka = Object.keys(a);
212
+ const kb = Object.keys(b);
213
+ return (ka.length === kb.length &&
214
+ ka.every((k) => Object.hasOwn(b, k) &&
215
+ deepEqual(a[k], b[k])));
216
+ }
217
+ return false;
218
+ }
219
+ /**
220
+ * Answers typed questions about a state.
221
+ *
222
+ * Every question is about a `state`: plain text, or structured data such as
223
+ * a transcript with speaker labels or a trimmed screen snapshot. `ask()`
224
+ * answers any number of questions about one state, by name; the three typed
225
+ * methods are built on it and take questions of one kind. Subclasses
226
+ * implement `_ask()`.
227
+ *
228
+ * Classifiers that can see images say so in `supportsImages`, and then take
229
+ * `images` with the state. The others refuse them.
230
+ *
231
+ * An owner that runs inside a worker calls `setup()` with its task manager
232
+ * before the first question, and `cleanup()` when it is done.
233
+ *
234
+ * Event handlers available:
235
+ *
236
+ * - on_metrics: Called after every call with its metrics, the time it took
237
+ * and, when the classifier knows it, the tokens it used. A classifier
238
+ * cannot push frames, so the owner is the one to put them in a
239
+ * `MetricsFrame`.
240
+ *
241
+ * @example
242
+ * await this._classifier.setup(this.taskManager);
243
+ *
244
+ * this._classifier.eventHandler("on_metrics", async (classifier, data: MetricsData[]) => {
245
+ * await this.pushFrame(new MetricsFrame({ data }));
246
+ * });
247
+ */
248
+ export class BaseClassifier extends BaseObject {
249
+ constructor(options = {}) {
250
+ super(options);
251
+ this._registerEventHandler("on_metrics");
252
+ }
253
+ /** The model that answers, named in the metrics. */
254
+ get model() {
255
+ return null;
256
+ }
257
+ /** Whether questions can come with images. */
258
+ get supportsImages() {
259
+ return false;
260
+ }
261
+ /**
262
+ * Answer several questions about one state.
263
+ *
264
+ * @param state What the questions are about.
265
+ * @param questions The questions, by name.
266
+ * @param options Images the questions can look at, for a classifier that
267
+ * supports them.
268
+ * @returns One result per question, by the same names, each of the type
269
+ * its question calls for.
270
+ * @throws ClassifierError If the answers could not be produced, or not in
271
+ * time: every classifier answers or raises within a bound of its own, so
272
+ * a caller waiting on it is never left hanging. Also if images come to a
273
+ * classifier that cannot see them.
274
+ */
275
+ async ask(state, questions, options = {}) {
276
+ const images = options.images;
277
+ if (images && images.length > 0 && !this.supportsImages) {
278
+ throw new ClassifierError(`${this} cannot see images`);
279
+ }
280
+ const started = monotonic();
281
+ const [results, usage] = await this._ask(state, questions, [...(images ?? [])]);
282
+ await this._callEventHandler("on_metrics", this._metrics(monotonic() - started, usage));
283
+ return results;
284
+ }
285
+ /**
286
+ * Ask whether the state meets each condition.
287
+ *
288
+ * @param state What the questions are about.
289
+ * @param questions The questions, by name.
290
+ * @param options Images the questions can look at, for a classifier that
291
+ * supports them.
292
+ * @returns How likely each answer is yes, by the same names.
293
+ * @throws ClassifierError If the answers could not be produced.
294
+ */
295
+ async yesNo(state, questions, options = {}) {
296
+ return this._typed(await this.ask(state, questions, options), YesNoResult);
297
+ }
298
+ /**
299
+ * Ask which option fits the state, for each question.
300
+ *
301
+ * @param state What the questions are about.
302
+ * @param questions The questions, by name.
303
+ * @param options Images the questions can look at, for a classifier that
304
+ * supports them.
305
+ * @returns The option that fits and how likely each one is, by the same
306
+ * names.
307
+ * @throws ClassifierError If the answers could not be produced.
308
+ */
309
+ async choice(state, questions, options = {}) {
310
+ return this._typed(await this.ask(state, questions, options), ChoiceResult);
311
+ }
312
+ /**
313
+ * Ask where the state falls on each scale.
314
+ *
315
+ * @param state What the questions are about.
316
+ * @param questions The questions, by name.
317
+ * @param options Images the questions can look at, for a classifier that
318
+ * supports them.
319
+ * @returns The position on each scale and how likely each level is, by
320
+ * the same names.
321
+ * @throws ClassifierError If the answers could not be produced.
322
+ */
323
+ async score(state, questions, options = {}) {
324
+ return this._typed(await this.ask(state, questions, options), ScoreResult);
325
+ }
326
+ _metrics(seconds, usage) {
327
+ const data = [
328
+ new ProcessingMetricsData({ processor: this.name, model: this.model, value: seconds }),
329
+ ];
330
+ if (usage) {
331
+ data.push(new LLMUsageMetricsData({ processor: this.name, model: this.model, value: usage }));
332
+ }
333
+ return data;
334
+ }
335
+ _typed(results, resultType) {
336
+ const typed = {};
337
+ for (const [name, result] of Object.entries(results)) {
338
+ if (!(result instanceof resultType)) {
339
+ throw new ClassifierError(`expected a ${resultType.name} for '${name}', got ${result.constructor.name}`);
340
+ }
341
+ typed[name] = result;
342
+ }
343
+ return typed;
344
+ }
345
+ }
346
+ //# sourceMappingURL=base_classifier.js.map
@@ -0,0 +1,70 @@
1
+ import { LLMTokenUsage } from "../../../metrics/metrics.ts";
2
+ import type { BaseTaskManager } from "../../../utils/asyncio/task_manager.ts";
3
+ import { BaseClassifier, type BaseClassifierOptions, type ClassifierImage, type ClassifierQuestion, type ClassifierResult, type ClassifierValue } from "../../base_classifier.ts";
4
+ import { ClefClient } from "./client.ts";
5
+ /** The most options Clef takes in one choice question. */
6
+ export declare const CLEF_MAX_CHOICE_OPTIONS = 255;
7
+ /** The most images Clef takes in one request. */
8
+ export declare const CLEF_MAX_IMAGES = 4;
9
+ export interface ClefClassifierOptions extends BaseClassifierOptions {
10
+ /** Cloudflare account ID, when the classifier should have a client of its own. */
11
+ accountId?: string | null;
12
+ /** Cloudflare API token, when the classifier should have a client of its own. */
13
+ apiKey?: string | null;
14
+ /** A client to share. Either `client`, or both `accountId` and `apiKey`, are required. */
15
+ client?: ClefClient | null;
16
+ /** The Clef model a client of its own asks: `clef`, or `clef-flash` for faster answers. */
17
+ model?: string;
18
+ /** Seconds a client of its own waits for an answer. */
19
+ timeout?: number;
20
+ }
21
+ /**
22
+ * Answers questions by asking Clef.
23
+ *
24
+ * Build one with a Cloudflare account ID and API token to get a client of
25
+ * its own, or pass a `ClefClient` to share one between several classifiers.
26
+ * A client the classifier created is closed in `cleanup()`; a shared one is
27
+ * left to whoever made it.
28
+ *
29
+ * Clef can see images: up to `CLEF_MAX_IMAGES` per call, 4 MiB each and
30
+ * 8 MiB in all.
31
+ *
32
+ * @example
33
+ * const classifier = new ClefClassifier({
34
+ * accountId: process.env.CLOUDFLARE_ACCOUNT_ID,
35
+ * apiKey: process.env.CLOUDFLARE_API_KEY,
36
+ * });
37
+ */
38
+ export declare class ClefClassifier extends BaseClassifier {
39
+ protected _ownsClient: boolean;
40
+ protected _client: ClefClient;
41
+ constructor(options?: ClefClassifierOptions);
42
+ /** The client this classifier asks through. */
43
+ get client(): ClefClient;
44
+ /**
45
+ * Open the connection to Workers AI ahead of the first question.
46
+ *
47
+ * A connection that cannot be opened now is only a warning: the first
48
+ * question opens it itself.
49
+ *
50
+ * @param taskManager The task manager of the owner.
51
+ */
52
+ setup(taskManager: BaseTaskManager): Promise<void>;
53
+ /** Close the client if this classifier created it. */
54
+ cleanup(): Promise<void>;
55
+ /** The Clef model the questions go to. */
56
+ get model(): string;
57
+ /** Clef can see images. */
58
+ get supportsImages(): boolean;
59
+ /** Answer the questions in one request. */
60
+ protected _ask(state: ClassifierValue, questions: Readonly<Record<string, ClassifierQuestion>>, images?: readonly ClassifierImage[]): Promise<[Record<string, ClassifierResult>, LLMTokenUsage]>;
61
+ /** A question in Clef's own format. */
62
+ protected _toClef(question: ClassifierQuestion): Record<string, unknown>;
63
+ /** A result built from Clef's answer to the question. */
64
+ protected _fromClef(question: ClassifierQuestion, answer: Record<string, unknown>): ClassifierResult;
65
+ /** The number Clef wrote under `key`, or a ClassifierError if it did not. */
66
+ protected _number(answer: Record<string, unknown>, key: string): number;
67
+ /** The probability Clef wrote for each key, 0 for the ones it left out. */
68
+ protected _probabilities(answer: Record<string, unknown>, keys: string[]): Record<string, number>;
69
+ }
70
+ //# sourceMappingURL=classifier.d.ts.map
@@ -0,0 +1,204 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/classifiers/cloudflare/clef/classifier.py
6
+ /**
7
+ * Classifier backed by Clef, Cloudflare's decision model on Workers AI.
8
+ *
9
+ * `ClefClassifier` turns each question into a request and each reply into a
10
+ * result, through a `ClefClient`.
11
+ */
12
+ import { rethrowIfCancelled } from "@pipedog/asyncio";
13
+ import { LLMTokenUsage } from "../../../metrics/metrics.js";
14
+ import { logger } from "../../../utils/logger.js";
15
+ import { BaseClassifier, ChoiceQuestion, ChoiceResult, ClassifierError, ScoreLevel, ScoreResult, YesNoQuestion, YesNoResult, } from "../../base_classifier.js";
16
+ import { bytesToBase64, isDict, orEmpty, toFloat } from "../../http_client.js";
17
+ import { ClefClient, DEFAULT_MODEL, DEFAULT_TIMEOUT } from "./client.js";
18
+ /** The most options Clef takes in one choice question. */
19
+ export const CLEF_MAX_CHOICE_OPTIONS = 255;
20
+ /** The most images Clef takes in one request. */
21
+ export const CLEF_MAX_IMAGES = 4;
22
+ /**
23
+ * Answers questions by asking Clef.
24
+ *
25
+ * Build one with a Cloudflare account ID and API token to get a client of
26
+ * its own, or pass a `ClefClient` to share one between several classifiers.
27
+ * A client the classifier created is closed in `cleanup()`; a shared one is
28
+ * left to whoever made it.
29
+ *
30
+ * Clef can see images: up to `CLEF_MAX_IMAGES` per call, 4 MiB each and
31
+ * 8 MiB in all.
32
+ *
33
+ * @example
34
+ * const classifier = new ClefClassifier({
35
+ * accountId: process.env.CLOUDFLARE_ACCOUNT_ID,
36
+ * apiKey: process.env.CLOUDFLARE_API_KEY,
37
+ * });
38
+ */
39
+ export class ClefClassifier extends BaseClassifier {
40
+ _ownsClient;
41
+ _client;
42
+ constructor(options = {}) {
43
+ super(options);
44
+ this._ownsClient = options.client == null;
45
+ let client = options.client ?? null;
46
+ if (!client) {
47
+ if (!options.accountId || !options.apiKey) {
48
+ throw new Error("ClefClassifier needs an account ID and API key, or a ClefClient");
49
+ }
50
+ client = new ClefClient({
51
+ accountId: options.accountId,
52
+ apiKey: options.apiKey,
53
+ model: options.model ?? DEFAULT_MODEL,
54
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
55
+ });
56
+ }
57
+ this._client = client;
58
+ }
59
+ /** The client this classifier asks through. */
60
+ get client() {
61
+ return this._client;
62
+ }
63
+ /**
64
+ * Open the connection to Workers AI ahead of the first question.
65
+ *
66
+ * A connection that cannot be opened now is only a warning: the first
67
+ * question opens it itself.
68
+ *
69
+ * @param taskManager The task manager of the owner.
70
+ */
71
+ async setup(taskManager) {
72
+ await super.setup(taskManager);
73
+ try {
74
+ await this._client.connect();
75
+ }
76
+ catch (e) {
77
+ if (!(e instanceof ClassifierError)) {
78
+ throw e;
79
+ }
80
+ logger.warning(`${this}: ${e.message}`);
81
+ }
82
+ }
83
+ /** Close the client if this classifier created it. */
84
+ async cleanup() {
85
+ await super.cleanup();
86
+ if (this._ownsClient) {
87
+ await this._client.close();
88
+ }
89
+ }
90
+ /** The Clef model the questions go to. */
91
+ get model() {
92
+ return this._client.model;
93
+ }
94
+ /** Clef can see images. */
95
+ get supportsImages() {
96
+ return true;
97
+ }
98
+ /** Answer the questions in one request. */
99
+ async _ask(state, questions, images = []) {
100
+ if (images.length > CLEF_MAX_IMAGES) {
101
+ throw new ClassifierError(`Clef takes at most ${CLEF_MAX_IMAGES} images, got ${images.length}`);
102
+ }
103
+ const clefQuestions = {};
104
+ for (const [name, q] of Object.entries(questions)) {
105
+ clefQuestions[name] = this._toClef(q);
106
+ }
107
+ const [answers, usage] = await this._client.ask(state, clefQuestions, images.map((image) => ({
108
+ content_type: image.contentType,
109
+ base64: bytesToBase64(image.data),
110
+ })));
111
+ const results = {};
112
+ for (const [name, question] of Object.entries(questions)) {
113
+ results[name] = this._fromClef(question, answers[name]);
114
+ }
115
+ return [
116
+ results,
117
+ new LLMTokenUsage({
118
+ promptTokens: usage.inputTokens,
119
+ completionTokens: usage.outputTokens,
120
+ totalTokens: usage.inputTokens + usage.outputTokens,
121
+ }),
122
+ ];
123
+ }
124
+ /** A question in Clef's own format. */
125
+ _toClef(question) {
126
+ if (question instanceof YesNoQuestion) {
127
+ const clef = { type: "noul", instructions: question.instructions };
128
+ if (question.yes !== null || question.no !== null) {
129
+ clef.criteria = { true: orEmpty(question.yes), false: orEmpty(question.no) };
130
+ }
131
+ return clef;
132
+ }
133
+ if (question instanceof ChoiceQuestion) {
134
+ const count = Object.keys(question.options).length;
135
+ if (count > CLEF_MAX_CHOICE_OPTIONS) {
136
+ throw new ClassifierError(`Clef takes at most ${CLEF_MAX_CHOICE_OPTIONS} options, got ${count}`);
137
+ }
138
+ return {
139
+ type: "choice",
140
+ instructions: question.instructions,
141
+ criteria: question.options,
142
+ };
143
+ }
144
+ return { type: "score", instructions: question.instructions, criteria: question.levels };
145
+ }
146
+ /** A result built from Clef's answer to the question. */
147
+ _fromClef(question, answer) {
148
+ if (question instanceof YesNoQuestion) {
149
+ return new YesNoResult({ probability: this._number(answer, "noul") });
150
+ }
151
+ if (question instanceof ChoiceQuestion) {
152
+ const choice = String(answer.choice ?? "");
153
+ if (!Object.hasOwn(question.options, choice)) {
154
+ throw new ClassifierError(`Clef chose '${choice}', which is not an option`);
155
+ }
156
+ const probabilities = this._probabilities(answer, Object.keys(question.options));
157
+ return new ChoiceResult({
158
+ choice,
159
+ probabilities,
160
+ confidence: this._number(answer, "confidence"),
161
+ });
162
+ }
163
+ // Clef keys level probabilities by position.
164
+ const positions = question.levels.map((_level, index) => String(index));
165
+ const probabilities = this._probabilities(answer, positions);
166
+ return new ScoreResult({
167
+ score: this._number(answer, "score"),
168
+ levels: question.levels.map((level, index) => new ScoreLevel({ level, probability: probabilities[positions[index]] ?? 0 })),
169
+ confidence: this._number(answer, "confidence"),
170
+ });
171
+ }
172
+ /** The number Clef wrote under `key`, or a ClassifierError if it did not. */
173
+ _number(answer, key) {
174
+ try {
175
+ if (!Object.hasOwn(answer, key)) {
176
+ throw new RangeError(key);
177
+ }
178
+ return toFloat(answer[key]);
179
+ }
180
+ catch (e) {
181
+ rethrowIfCancelled(e);
182
+ throw new ClassifierError(`Clef reply has no usable '${key}'`, { cause: e });
183
+ }
184
+ }
185
+ /** The probability Clef wrote for each key, 0 for the ones it left out. */
186
+ _probabilities(answer, keys) {
187
+ // Python's `answer.get("probabilities") or {}`: an empty list is falsy too.
188
+ const raw = answer.probabilities;
189
+ const given = !raw || (Array.isArray(raw) && raw.length === 0) ? {} : raw;
190
+ try {
191
+ if (!isDict(given)) {
192
+ throw new TypeError("probabilities is not an object");
193
+ }
194
+ return Object.fromEntries(keys.map((key) => [key, toFloat(Object.hasOwn(given, key) ? given[key] : 0.0)]));
195
+ }
196
+ catch (e) {
197
+ rethrowIfCancelled(e);
198
+ throw new ClassifierError(`Clef reply has an unusable probability: ${e.message}`, {
199
+ cause: e,
200
+ });
201
+ }
202
+ }
203
+ }
204
+ //# sourceMappingURL=classifier.js.map