@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,241 @@
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/openai/decisions/classifier.py
6
+ /**
7
+ * Classifier backed by OpenAI's Decisions API.
8
+ *
9
+ * `OpenAIDecisionsClassifier` turns each question into a request and each
10
+ * reply into a result, through an `OpenAIDecisionsClient`.
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, toFloat } from "../../http_client.js";
17
+ import { DEFAULT_BASE_URL, DEFAULT_MODEL, DEFAULT_TIMEOUT, OpenAIDecisionsClient, } from "./client.js";
18
+ /** The most options the Decisions API takes in one choice question. */
19
+ export const OPENAI_DECISIONS_MAX_CHOICE_OPTIONS = 255;
20
+ /** The most images the Decisions API takes in one request. */
21
+ export const OPENAI_DECISIONS_MAX_IMAGES = 128;
22
+ /**
23
+ * Answers questions by asking OpenAI's Decisions API.
24
+ *
25
+ * Structured state, instructions and descriptions are sent as JSON. Build
26
+ * one with an API key to get a client of its own, or pass an
27
+ * `OpenAIDecisionsClient` to share one between several classifiers. A client
28
+ * the classifier created is closed in `cleanup()`; a shared one is left to
29
+ * whoever made it.
30
+ *
31
+ * The Decisions API can see images: up to `OPENAI_DECISIONS_MAX_IMAGES` per
32
+ * call.
33
+ *
34
+ * @example
35
+ * const classifier = new OpenAIDecisionsClassifier({ apiKey: process.env.OPENAI_API_KEY });
36
+ */
37
+ export class OpenAIDecisionsClassifier extends BaseClassifier {
38
+ _ownsClient;
39
+ _client;
40
+ constructor(options = {}) {
41
+ super(options);
42
+ this._ownsClient = options.client == null;
43
+ let client = options.client ?? null;
44
+ if (!client) {
45
+ if (!options.apiKey) {
46
+ throw new Error("OpenAIDecisionsClassifier needs an API key or an OpenAIDecisionsClient");
47
+ }
48
+ client = new OpenAIDecisionsClient({
49
+ apiKey: options.apiKey,
50
+ model: options.model ?? DEFAULT_MODEL,
51
+ baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
52
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
53
+ });
54
+ }
55
+ this._client = client;
56
+ }
57
+ /** The client this classifier asks through. */
58
+ get client() {
59
+ return this._client;
60
+ }
61
+ /**
62
+ * Open the connection to OpenAI ahead of the first question.
63
+ *
64
+ * A connection that cannot be opened now is only a warning: the first
65
+ * question opens it itself.
66
+ *
67
+ * @param taskManager The task manager of the owner.
68
+ */
69
+ async setup(taskManager) {
70
+ await super.setup(taskManager);
71
+ try {
72
+ await this._client.connect();
73
+ }
74
+ catch (e) {
75
+ if (!(e instanceof ClassifierError)) {
76
+ throw e;
77
+ }
78
+ logger.warning(`${this}: ${e.message}`);
79
+ }
80
+ }
81
+ /** Close the client if this classifier created it. */
82
+ async cleanup() {
83
+ await super.cleanup();
84
+ if (this._ownsClient) {
85
+ await this._client.close();
86
+ }
87
+ }
88
+ /** The decision model the questions go to. */
89
+ get model() {
90
+ return this._client.model;
91
+ }
92
+ /** The Decisions API can see images. */
93
+ get supportsImages() {
94
+ return true;
95
+ }
96
+ /** Answer the questions in one request. */
97
+ async _ask(state, questions, images = []) {
98
+ if (images.length > OPENAI_DECISIONS_MAX_IMAGES) {
99
+ throw new ClassifierError(`OpenAI Decisions takes at most ${OPENAI_DECISIONS_MAX_IMAGES} images, got ${images.length}`);
100
+ }
101
+ const openaiQuestions = {};
102
+ for (const [name, q] of Object.entries(questions)) {
103
+ openaiQuestions[name] = this._toOpenai(q);
104
+ }
105
+ const [answers, usage] = await this._client.ask(this._input(state, images), openaiQuestions);
106
+ const results = {};
107
+ for (const [name, question] of Object.entries(questions)) {
108
+ results[name] = this._fromOpenai(name, question, answers[name]);
109
+ }
110
+ return [
111
+ results,
112
+ new LLMTokenUsage({
113
+ promptTokens: usage.inputTokens,
114
+ completionTokens: usage.outputTokens,
115
+ totalTokens: usage.inputTokens + usage.outputTokens,
116
+ }),
117
+ ];
118
+ }
119
+ /** The request's input: the state as text, or a user message with any images first. */
120
+ _input(state, images) {
121
+ const text = this._text(state);
122
+ if (images.length === 0) {
123
+ return text;
124
+ }
125
+ const content = images.map((image) => ({
126
+ type: "input_image",
127
+ image_url: `data:${image.contentType};base64,${bytesToBase64(image.data)}`,
128
+ }));
129
+ content.push({ type: "input_text", text });
130
+ return [{ role: "user", content }];
131
+ }
132
+ /** A question in the Decisions API's own format. */
133
+ _toOpenai(question) {
134
+ if (question instanceof YesNoQuestion) {
135
+ // A predicate has no field for what counts as each answer, so it goes
136
+ // in the instructions.
137
+ const lines = [this._text(question.instructions)];
138
+ if (question.yes !== null) {
139
+ lines.push(`Yes means: ${this._text(question.yes)}`);
140
+ }
141
+ if (question.no !== null) {
142
+ lines.push(`No means: ${this._text(question.no)}`);
143
+ }
144
+ return { type: "predicate", instructions: lines.join("\n") };
145
+ }
146
+ if (question instanceof ChoiceQuestion) {
147
+ const count = Object.keys(question.options).length;
148
+ if (count > OPENAI_DECISIONS_MAX_CHOICE_OPTIONS) {
149
+ throw new ClassifierError(`OpenAI Decisions takes at most ${OPENAI_DECISIONS_MAX_CHOICE_OPTIONS} options, got ${count}`);
150
+ }
151
+ return {
152
+ type: "choice",
153
+ instructions: this._text(question.instructions),
154
+ choices: Object.entries(question.options).map(([option, description]) => description === null
155
+ ? { value: option }
156
+ : { value: option, description: this._text(description) }),
157
+ };
158
+ }
159
+ return {
160
+ type: "score",
161
+ instructions: this._text(question.instructions),
162
+ levels: question.levels.map((level) => ({ label: this._text(level) })),
163
+ };
164
+ }
165
+ /** A result built from the Decisions API's answer to the question. */
166
+ _fromOpenai(name, question, answer) {
167
+ if (answer.type === "refusal") {
168
+ throw new ClassifierError(`OpenAI Decisions refused to answer '${name}'`);
169
+ }
170
+ if (question instanceof YesNoQuestion) {
171
+ return new YesNoResult({ probability: this._number(answer, "probability") });
172
+ }
173
+ if (question instanceof ChoiceQuestion) {
174
+ const choice = String(answer.choice ?? "");
175
+ if (!Object.hasOwn(question.options, choice)) {
176
+ throw new ClassifierError(`OpenAI Decisions chose '${choice}', which is not an option`);
177
+ }
178
+ const probabilities = this._probabilities(answer, Object.keys(question.options));
179
+ return new ChoiceResult({
180
+ choice,
181
+ probabilities,
182
+ confidence: this._number(answer, "confidence"),
183
+ });
184
+ }
185
+ // The Decisions API keys level probabilities by position.
186
+ const positions = question.levels.map((_level, index) => String(index));
187
+ const probabilities = this._probabilities(answer, positions);
188
+ return new ScoreResult({
189
+ score: this._number(answer, "score"),
190
+ levels: question.levels.map((level, index) => new ScoreLevel({ level, probability: probabilities[positions[index]] ?? 0 })),
191
+ confidence: this._number(answer, "confidence"),
192
+ });
193
+ }
194
+ /** Text for the Decisions API: a string as is, structured data as JSON. */
195
+ _text(value) {
196
+ return typeof value === "string" ? value : JSON.stringify(value, null, 2);
197
+ }
198
+ /** The number the API wrote under `key`, or a ClassifierError if it did not. */
199
+ _number(answer, key) {
200
+ try {
201
+ if (!Object.hasOwn(answer, key)) {
202
+ throw new RangeError(key);
203
+ }
204
+ return toFloat(answer[key]);
205
+ }
206
+ catch (e) {
207
+ rethrowIfCancelled(e);
208
+ throw new ClassifierError(`OpenAI Decisions reply has no usable '${key}'`, { cause: e });
209
+ }
210
+ }
211
+ /**
212
+ * The probability the API gave for each key, 0 for the ones it left out.
213
+ *
214
+ * The API lists probabilities as `{"value", "probability"}` items, where
215
+ * the value is a choice's option or a level's position.
216
+ */
217
+ _probabilities(answer, keys) {
218
+ const given = answer.probabilities;
219
+ const byValue = new Map();
220
+ for (const item of Array.isArray(given) ? given : []) {
221
+ if (isDict(item)) {
222
+ byValue.set(pyStr(item.value), item.probability ?? null);
223
+ }
224
+ }
225
+ try {
226
+ return Object.fromEntries(keys.map((key) => [key, toFloat(byValue.has(key) ? byValue.get(key) : 0.0)]));
227
+ }
228
+ catch (e) {
229
+ rethrowIfCancelled(e);
230
+ throw new ClassifierError(`OpenAI Decisions reply has an unusable probability: ${e.message}`, { cause: e });
231
+ }
232
+ }
233
+ }
234
+ /** Python's `str()` for a JSON value, so a missing value reads `None` as upstream's does. */
235
+ function pyStr(value) {
236
+ if (value === undefined || value === null) {
237
+ return "None";
238
+ }
239
+ return String(value);
240
+ }
241
+ //# sourceMappingURL=classifier.js.map
@@ -0,0 +1,108 @@
1
+ /**
2
+ * HTTP client for OpenAI's Decisions API.
3
+ *
4
+ * One `OpenAIDecisionsClient` holds one connection pool, adds the auth
5
+ * header, retries when OpenAI is busy, and counts the tokens every request
6
+ * used. Several `OpenAIDecisionsClassifier` instances can share one.
7
+ *
8
+ * PORTING NOTE: upstream uses `httpx` with HTTP/2 and a 240 s keep-alive;
9
+ * here requests go through `fetch` (see `../../http_client.ts`), and
10
+ * connection reuse is left to the runtime.
11
+ */
12
+ import { Lock } from "@pipedog/asyncio";
13
+ import { HttpClient, type HttpResponse } from "../../http_client.ts";
14
+ /** Where the API is served. */
15
+ export declare const DEFAULT_BASE_URL = "https://api.openai.com/v1";
16
+ /** The decision model to ask. */
17
+ export declare const DEFAULT_MODEL = "gpt-6-luna";
18
+ /** Seconds to wait for a reply before giving up. */
19
+ export declare const DEFAULT_TIMEOUT = 10;
20
+ export interface OpenAIDecisionsUsageOptions {
21
+ /** Tokens sent. */
22
+ inputTokens?: number;
23
+ /** Tokens received. */
24
+ outputTokens?: number;
25
+ }
26
+ /**
27
+ * Tokens the Decisions API used: for one request, or over every request.
28
+ *
29
+ * `OpenAIDecisionsClient.usage` holds the total over every request.
30
+ */
31
+ export declare class OpenAIDecisionsUsage {
32
+ inputTokens: number;
33
+ outputTokens: number;
34
+ constructor(options?: OpenAIDecisionsUsageOptions);
35
+ /** Build a usage from the API's wire format (`input_tokens`, `output_tokens`). */
36
+ static fromDict(data: Record<string, unknown>): OpenAIDecisionsUsage;
37
+ }
38
+ export interface OpenAIDecisionsClientOptions {
39
+ /** OpenAI API key. */
40
+ apiKey: string;
41
+ /**
42
+ * Where the API is served, such as `https://eu.api.openai.com/v1` for data
43
+ * residency in Europe.
44
+ */
45
+ baseUrl?: string;
46
+ /** The decision model to ask. */
47
+ model?: string;
48
+ /** Seconds to wait for a reply before giving up. */
49
+ timeout?: number;
50
+ /** How many times to retry a request OpenAI refused because it was busy. */
51
+ maxRetries?: number;
52
+ /** The transport requests go through; the global `fetch` by default. */
53
+ fetch?: typeof fetch;
54
+ }
55
+ /**
56
+ * HTTP client for OpenAI's `decisions` endpoint.
57
+ *
58
+ * Many small requests can be in flight at the same time. Retries with
59
+ * backoff when OpenAI answers 429 or 503. Counts the tokens every request
60
+ * used in `usage`. Errors carry the reason OpenAI gave.
61
+ *
62
+ * `connect()` opens the connection ahead of the first question, and
63
+ * `close()` releases it.
64
+ */
65
+ export declare class OpenAIDecisionsClient {
66
+ protected _model: string;
67
+ protected _maxRetries: number;
68
+ protected _usage: OpenAIDecisionsUsage;
69
+ protected _connected: boolean;
70
+ protected _connectLock: Lock;
71
+ protected _http: HttpClient;
72
+ constructor(options: OpenAIDecisionsClientOptions);
73
+ /** The decision model the questions go to. */
74
+ get model(): string;
75
+ /** Tokens used so far, over every request. */
76
+ get usage(): OpenAIDecisionsUsage;
77
+ /**
78
+ * Open the connection to OpenAI.
79
+ *
80
+ * Looks up the model, a cheap request that also checks the key and whether
81
+ * it has access to the model. Connects once: a client shared by several
82
+ * classifiers is asked by each of them, and only the first call sends
83
+ * anything.
84
+ *
85
+ * @throws ClassifierError If OpenAI could not be reached or refused the request.
86
+ */
87
+ connect(): Promise<void>;
88
+ /** Close the connection pool. */
89
+ close(): Promise<void>;
90
+ /**
91
+ * Send questions about one state and return OpenAI's answers.
92
+ *
93
+ * @param state What the questions are about, as the request's `input`:
94
+ * text, or user messages.
95
+ * @param questions The questions by name, each in OpenAI's own format: a
96
+ * `type` of `predicate`, `choice` or `score`, `instructions`, and
97
+ * `choices` or `levels`.
98
+ * @returns The answers by the same names, in OpenAI's own format, and the
99
+ * tokens the request used.
100
+ * @throws ClassifierError If OpenAI rejected the request, kept refusing it
101
+ * because it was busy, could not be reached, or left a question
102
+ * unanswered.
103
+ */
104
+ ask(state: string | Record<string, unknown>[], questions: Readonly<Record<string, Record<string, unknown>>>): Promise<[Record<string, Record<string, unknown>>, OpenAIDecisionsUsage]>;
105
+ /** A failed response's HTTP status and the reason OpenAI gave. */
106
+ protected _failure(response: HttpResponse): string;
107
+ }
108
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1,234 @@
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/openai/decisions/client.py
6
+ /**
7
+ * HTTP client for OpenAI's Decisions API.
8
+ *
9
+ * One `OpenAIDecisionsClient` holds one connection pool, adds the auth
10
+ * header, retries when OpenAI is busy, and counts the tokens every request
11
+ * used. Several `OpenAIDecisionsClassifier` instances can share one.
12
+ *
13
+ * PORTING NOTE: upstream uses `httpx` with HTTP/2 and a 240 s keep-alive;
14
+ * here requests go through `fetch` (see `../../http_client.ts`), and
15
+ * connection reuse is left to the runtime.
16
+ */
17
+ import { Lock, rethrowIfCancelled, sleep } from "@pipedog/asyncio";
18
+ import { logger } from "../../../utils/logger.js";
19
+ import { exponentialBackoffTime } from "../../../utils/network.js";
20
+ import { ClassifierError } from "../../base_classifier.js";
21
+ import { errorRepr, HttpClient, HttpError, isDict } from "../../http_client.js";
22
+ /** OpenAI answers a request with this status when the caller is rate limited. */
23
+ const TOO_MANY_REQUESTS = 429;
24
+ /** OpenAI answers a request with this status when it is temporarily overloaded. */
25
+ const OVERLOADED = 503;
26
+ /** Where the API is served. */
27
+ export const DEFAULT_BASE_URL = "https://api.openai.com/v1";
28
+ /** The decision model to ask. */
29
+ export const DEFAULT_MODEL = "gpt-6-luna";
30
+ /** Seconds to wait for a reply before giving up. */
31
+ export const DEFAULT_TIMEOUT = 10.0;
32
+ /**
33
+ * Tokens the Decisions API used: for one request, or over every request.
34
+ *
35
+ * `OpenAIDecisionsClient.usage` holds the total over every request.
36
+ */
37
+ export class OpenAIDecisionsUsage {
38
+ inputTokens;
39
+ outputTokens;
40
+ constructor(options = {}) {
41
+ this.inputTokens = options.inputTokens ?? 0;
42
+ this.outputTokens = options.outputTokens ?? 0;
43
+ }
44
+ /** Build a usage from the API's wire format (`input_tokens`, `output_tokens`). */
45
+ static fromDict(data) {
46
+ return new OpenAIDecisionsUsage({
47
+ inputTokens: data.input_tokens ?? 0,
48
+ outputTokens: data.output_tokens ?? 0,
49
+ });
50
+ }
51
+ }
52
+ /**
53
+ * HTTP client for OpenAI's `decisions` endpoint.
54
+ *
55
+ * Many small requests can be in flight at the same time. Retries with
56
+ * backoff when OpenAI answers 429 or 503. Counts the tokens every request
57
+ * used in `usage`. Errors carry the reason OpenAI gave.
58
+ *
59
+ * `connect()` opens the connection ahead of the first question, and
60
+ * `close()` releases it.
61
+ */
62
+ export class OpenAIDecisionsClient {
63
+ _model;
64
+ _maxRetries;
65
+ _usage = new OpenAIDecisionsUsage();
66
+ _connected = false;
67
+ _connectLock = new Lock();
68
+ _http;
69
+ constructor(options) {
70
+ if (!options.apiKey) {
71
+ throw new Error("OpenAIDecisionsClient needs an API key");
72
+ }
73
+ this._model = options.model ?? DEFAULT_MODEL;
74
+ this._maxRetries = options.maxRetries ?? 3;
75
+ this._http = new HttpClient({
76
+ baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
77
+ headers: { Authorization: `Bearer ${options.apiKey}` },
78
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
79
+ fetch: options.fetch,
80
+ });
81
+ }
82
+ /** The decision model the questions go to. */
83
+ get model() {
84
+ return this._model;
85
+ }
86
+ /** Tokens used so far, over every request. */
87
+ get usage() {
88
+ return this._usage;
89
+ }
90
+ /**
91
+ * Open the connection to OpenAI.
92
+ *
93
+ * Looks up the model, a cheap request that also checks the key and whether
94
+ * it has access to the model. Connects once: a client shared by several
95
+ * classifiers is asked by each of them, and only the first call sends
96
+ * anything.
97
+ *
98
+ * @throws ClassifierError If OpenAI could not be reached or refused the request.
99
+ */
100
+ async connect() {
101
+ await this._connectLock.run(async () => {
102
+ if (this._connected) {
103
+ return;
104
+ }
105
+ let response;
106
+ try {
107
+ response = await this._http.get(`/models/${this._model}`);
108
+ }
109
+ catch (e) {
110
+ if (e instanceof HttpError) {
111
+ throw new ClassifierError(`could not connect to OpenAI Decisions: ${e.message}`, {
112
+ cause: e,
113
+ });
114
+ }
115
+ throw e;
116
+ }
117
+ if (response.statusCode !== 200) {
118
+ throw new ClassifierError(`OpenAI Decisions refused the connection: ${this._failure(response)}`);
119
+ }
120
+ this._connected = true;
121
+ });
122
+ }
123
+ /** Close the connection pool. */
124
+ async close() {
125
+ this._connected = false;
126
+ await this._http.aclose();
127
+ }
128
+ /**
129
+ * Send questions about one state and return OpenAI's answers.
130
+ *
131
+ * @param state What the questions are about, as the request's `input`:
132
+ * text, or user messages.
133
+ * @param questions The questions by name, each in OpenAI's own format: a
134
+ * `type` of `predicate`, `choice` or `score`, `instructions`, and
135
+ * `choices` or `levels`.
136
+ * @returns The answers by the same names, in OpenAI's own format, and the
137
+ * tokens the request used.
138
+ * @throws ClassifierError If OpenAI rejected the request, kept refusing it
139
+ * because it was busy, could not be reached, or left a question
140
+ * unanswered.
141
+ */
142
+ async ask(state, questions) {
143
+ const body = {
144
+ model: this._model,
145
+ input: state,
146
+ questions: Object.entries(questions).map(([name, question]) => ({ name, ...question })),
147
+ };
148
+ let attempt = 0;
149
+ while (true) {
150
+ attempt += 1;
151
+ let response;
152
+ try {
153
+ response = await this._http.post("/decisions", { json: body });
154
+ }
155
+ catch (e) {
156
+ if (e instanceof HttpError) {
157
+ // Some errors, such as a timeout, carry no useful message.
158
+ throw new ClassifierError(`OpenAI Decisions request failed: ${errorRepr(e)}`, {
159
+ cause: e,
160
+ });
161
+ }
162
+ throw e;
163
+ }
164
+ if (response.statusCode === TOO_MANY_REQUESTS || response.statusCode === OVERLOADED) {
165
+ if (attempt > this._maxRetries) {
166
+ throw new ClassifierError(`OpenAI Decisions is busy (${this._failure(response)}) after ${attempt} attempts`);
167
+ }
168
+ const wait = exponentialBackoffTime(attempt, 0.25, 2.0, 0.25);
169
+ logger.debug(`OpenAI Decisions answered ${response.statusCode}, retrying in ${wait}s`);
170
+ await sleep(wait);
171
+ continue;
172
+ }
173
+ if (response.statusCode !== 200) {
174
+ throw new ClassifierError(`OpenAI Decisions rejected the request: ${this._failure(response)}`);
175
+ }
176
+ let data;
177
+ try {
178
+ data = response.json();
179
+ }
180
+ catch (e) {
181
+ rethrowIfCancelled(e);
182
+ throw new ClassifierError(`OpenAI Decisions reply is not valid JSON: ${e.message}`, { cause: e });
183
+ }
184
+ if (!isDict(data)) {
185
+ throw new ClassifierError("OpenAI Decisions reply is not a JSON object");
186
+ }
187
+ const usage = data.usage;
188
+ const requestUsage = isDict(usage)
189
+ ? OpenAIDecisionsUsage.fromDict(usage)
190
+ : new OpenAIDecisionsUsage();
191
+ this._usage.inputTokens += requestUsage.inputTokens;
192
+ this._usage.outputTokens += requestUsage.outputTokens;
193
+ const answers = data.answers;
194
+ if (!Array.isArray(answers)) {
195
+ throw new ClassifierError("OpenAI Decisions reply has no answers");
196
+ }
197
+ // Answers come back as a list, each carrying its question's name.
198
+ const byName = new Map();
199
+ for (const answer of answers) {
200
+ if (isDict(answer) && typeof answer.name === "string") {
201
+ byName.set(answer.name, answer);
202
+ }
203
+ }
204
+ const missing = Object.keys(questions).filter((name) => !byName.has(name));
205
+ if (missing.length > 0) {
206
+ throw new ClassifierError(`OpenAI Decisions reply has no answer for ${missing.join(", ")}`);
207
+ }
208
+ const result = {};
209
+ for (const name of Object.keys(questions)) {
210
+ result[name] = byName.get(name);
211
+ }
212
+ return [result, requestUsage];
213
+ }
214
+ }
215
+ /** A failed response's HTTP status and the reason OpenAI gave. */
216
+ _failure(response) {
217
+ const status = `HTTP ${response.statusCode}`;
218
+ let message;
219
+ try {
220
+ const data = response.json();
221
+ const error = isDict(data) ? data.error : undefined;
222
+ if (!isDict(error) || !("message" in error)) {
223
+ return status;
224
+ }
225
+ message = error.message;
226
+ }
227
+ catch (e) {
228
+ rethrowIfCancelled(e);
229
+ return status;
230
+ }
231
+ return message ? `${status}: ${message}` : status;
232
+ }
233
+ }
234
+ //# sourceMappingURL=client.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/classifiers/openai/decisions/__init__.py
6
+ // Upstream's `__init__.py` is empty: import the package's modules directly.
7
+ export {};
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,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/classifiers/openai/__init__.py
6
+ // Upstream's `__init__.py` is empty: import the package's modules directly.
7
+ export {};
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,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/classifiers/typesafe/__init__.py
6
+ // Upstream's `__init__.py` is empty: import the package's modules directly.
7
+ export {};
8
+ //# sourceMappingURL=index.js.map