@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,107 @@
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/pipeline/llm_switcher.py
6
+ /** LLM switcher for switching between different LLMs at runtime, with different switching strategies. */
7
+ import { LLMContextFrame } from "../frames/frames.js";
8
+ import { ServiceSwitcher, } from "./service_switcher.js";
9
+ /**
10
+ * A pipeline that switches between different LLMs at runtime.
11
+ *
12
+ * @example
13
+ * const llmSwitcher = new LLMSwitcher([openaiLlm, anthropicLlm]);
14
+ */
15
+ export class LLMSwitcher extends ServiceSwitcher {
16
+ /**
17
+ * Initialize the service switcher with a list of LLMs and a switching strategy.
18
+ *
19
+ * @param llms List of LLM services to switch between.
20
+ * @param options.strategyType The strategy class to use for switching
21
+ * between LLMs. Defaults to `ServiceSwitcherStrategyManual`.
22
+ */
23
+ constructor(llms, options = {}) {
24
+ super(llms, options);
25
+ }
26
+ /**
27
+ * Process a frame, syncing context tool handlers on all member LLMs.
28
+ *
29
+ * On an `LLMContextFrame`, the handlers advertised in the context are synced
30
+ * on every member LLM — active or not — so that tools listed via
31
+ * `new LLMContext({ tools: [...] })` keep working across service switches.
32
+ *
33
+ * This is needed because member LLMs sit behind per-branch filters: only the
34
+ * active LLM receives the context frame and would otherwise sync its
35
+ * handlers, leaving inactive LLMs out of step with the advertised tools.
36
+ *
37
+ * @param frame The frame to process.
38
+ * @param direction The direction of frame flow.
39
+ */
40
+ async processFrame(frame, direction) {
41
+ await super.processFrame(frame, direction);
42
+ if (frame instanceof LLMContextFrame) {
43
+ this._syncRegisteredToolHandlers(frame.context.tools);
44
+ }
45
+ }
46
+ /**
47
+ * Sync the context's tool handlers on every member LLM.
48
+ *
49
+ * @param tools The advertised tools whose handlers should be synced on all
50
+ * member LLMs.
51
+ */
52
+ _syncRegisteredToolHandlers(tools) {
53
+ for (const llm of this.llms) {
54
+ // Protected on LLMService; the switcher drives its members' sync, as upstream does.
55
+ llm._syncRegisteredToolHandlers(tools);
56
+ }
57
+ }
58
+ /** The list of LLMs managed by this switcher. */
59
+ get llms() {
60
+ return this.services;
61
+ }
62
+ /** The currently active LLM. */
63
+ get activeLlm() {
64
+ return this.strategy.activeService;
65
+ }
66
+ /**
67
+ * Run a one-shot, out-of-band (i.e. out-of-pipeline) inference with the
68
+ * given LLM context, using the currently active LLM.
69
+ *
70
+ * @param context The LLM context containing conversation history.
71
+ * @param options Additional options forwarded to the active LLM's
72
+ * `runInference` (e.g. maxTokens, systemInstruction).
73
+ * @returns The LLM's response as a string, or null if no response is generated.
74
+ */
75
+ async runInference(context, options = {}) {
76
+ if (this.activeLlm) {
77
+ return await this.activeLlm.runInference(context, options);
78
+ }
79
+ return null;
80
+ }
81
+ /**
82
+ * Register a function handler for LLM function calls, on all LLMs, active or not.
83
+ *
84
+ * @param functionName The name of the function to handle. Use null to handle
85
+ * all function calls with a catch-all handler.
86
+ * @param handler The function handler. Should accept a single
87
+ * FunctionCallParams parameter.
88
+ * @param options.cancelOnInterruption Whether to cancel this function call
89
+ * when an interruption occurs. Defaults to null (fall back to the
90
+ * `toolOptions()` value on the handler, then to true).
91
+ * @param options.timeoutSecs Optional timeout in seconds for the function call.
92
+ * @param options.cancellableByLlm Whether the LLM may cancel this call while
93
+ * it runs, through the `cancel_<name>` tool advertised alongside it. Pair
94
+ * it with `cancelOnInterruption: false`. Defaults to null (fall back to the
95
+ * `toolOptions()` value, then to false).
96
+ */
97
+ registerFunction(functionName, handler, options = {}) {
98
+ for (const llm of this.llms) {
99
+ llm.registerFunction(functionName, handler, {
100
+ cancelOnInterruption: options.cancelOnInterruption ?? null,
101
+ timeoutSecs: options.timeoutSecs ?? null,
102
+ cancellableByLlm: options.cancellableByLlm ?? null,
103
+ });
104
+ }
105
+ }
106
+ }
107
+ //# sourceMappingURL=llm_switcher.js.map
@@ -0,0 +1,435 @@
1
+ /**
2
+ * An LLM with a backend: a conversational frontend delegating the rest.
3
+ *
4
+ * The frontend is any LLM service, text or speech-to-speech, and holds the
5
+ * conversation. The backend is a `BackendLLMWorker` running a heavier model
6
+ * with the tools, and does the work the frontend hands off. `LLMWithBackend`
7
+ * wraps the frontend so the pair drops into a pipeline where an LLM goes, and
8
+ * installs the tools that join them.
9
+ *
10
+ * The two exchange messages. The frontend's `delegate` tool puts a message to
11
+ * the backend and returns at once; what the backend has to say comes back as a
12
+ * stream of outputs, each appended to the frontend's conversation as a message
13
+ * marked `Backend:`, spoken or silent as the backend's flag says. A second
14
+ * request joins the first, and a correction changes or stops it. How a request
15
+ * is worded is the `BackendRequestStrategy`'s business, and the
16
+ * `BackendConnector` owns the tools, the session with the backend, and how
17
+ * each output is rendered into the conversation.
18
+ */
19
+ import { Event, type Task } from "@pipedog/asyncio";
20
+ import { FunctionSchema } from "../adapters/schemas/function_schema.ts";
21
+ import { LLMMessagesAppendFrame } from "../frames/frames.ts";
22
+ import { type LLMContextMessage } from "../processors/aggregators/llm_context.ts";
23
+ import type { FrameProcessorSetup } from "../processors/frame_processor.ts";
24
+ import { type FunctionCallParams, type LLMService } from "../services/llm_service.ts";
25
+ import type { BaseWorker } from "../workers/base_worker.ts";
26
+ import { _BackendSession, type BackendEvent, BackendLLMWorker, BackendOutput, BackendToolCall } from "../workers/llm/backend_llm_worker.ts";
27
+ import { Pipeline } from "./pipeline.ts";
28
+ type AnyLLMService = LLMService<any>;
29
+ /** Name of the tool the frontend calls to delegate. */
30
+ export declare const DELEGATE_TOOL_NAME = "delegate";
31
+ /** How a backend output is marked in the frontend's conversation. */
32
+ export declare const BACKEND_MESSAGE_PREFIX = "Backend: ";
33
+ /** How a backend reasoning summary is marked in the frontend's conversation. */
34
+ export declare const BACKEND_THOUGHT_PREFIX = "Backend (thinking): ";
35
+ /**
36
+ * How a backend note, text its model wrote without the mark that asks for the
37
+ * user to be told it, is marked in the frontend's conversation.
38
+ */
39
+ export declare const BACKEND_NOTE_PREFIX = "Backend (note): ";
40
+ /** How a function call the backend is making is marked in the frontend's conversation. */
41
+ export declare const BACKEND_WORKING_PREFIX = "Backend (working): ";
42
+ /** Every mark a rendered backend message can open with. */
43
+ export declare const BACKEND_PREFIXES: readonly string[];
44
+ /**
45
+ * Carried on each spoken backend message, so the frontend relays it on
46
+ * whatever turn it lands on, a user's turn included, where the standing
47
+ * instruction alone leaves it unsaid.
48
+ */
49
+ export declare const RELAY_NOTE: string;
50
+ /** Where the request strategy's own guidance goes in `FRONTEND_PAIRING_INSTRUCTION`. */
51
+ export declare const STRATEGY_PLACEHOLDER = "{strategy}";
52
+ /**
53
+ * How the frontend's model works with a backend, appended to its system
54
+ * instruction: when and how to delegate, that to the user there is one
55
+ * assistant, what to do after delegating, and what to do with the backend's
56
+ * messages. The request strategy's guidance (how the request is worded) goes
57
+ * where `STRATEGY_PLACEHOLDER` stands, inside the delegating paragraph. The
58
+ * frontend's own system instruction says what the backend is for.
59
+ * `new BackendConnector({ frontendPairingInstruction })` replaces it.
60
+ *
61
+ * The order of the paragraphs matters, and the placeholder's place inside the
62
+ * first one: with the one-assistant paragraph first, or the strategy's
63
+ * guidance in a paragraph of its own, gpt-4.1 answers a user's "never mind"
64
+ * with "I won't make any changes" and no delegate call in nearly every run,
65
+ * where this order delegates the stop every time.
66
+ */
67
+ export declare const FRONTEND_PAIRING_INSTRUCTION: string;
68
+ /** The transcript strategy's guidance, in the pairing instruction's delegating paragraph. */
69
+ export declare const TRANSCRIPT_FRONTEND_INSTRUCTION: string;
70
+ /** How the transcript strategy describes the `delegate` tool. */
71
+ export declare const TRANSCRIPT_TOOL_DESCRIPTION: string;
72
+ /** The explicit strategy's guidance, in the pairing instruction's delegating paragraph. */
73
+ export declare const EXPLICIT_FRONTEND_INSTRUCTION: string;
74
+ /** How the explicit strategy describes the `delegate` tool. */
75
+ export declare const EXPLICIT_TOOL_DESCRIPTION: string;
76
+ export interface ConnectorContextOptions {
77
+ /** Name of the backend worker, local or registered elsewhere. */
78
+ backendName: string;
79
+ /** Whether the frontend is a speech-to-speech service. */
80
+ frontendIsRealtime: boolean;
81
+ }
82
+ /**
83
+ * What a connector needs to know about the layers it joins.
84
+ *
85
+ * - `backendName`: name of the backend worker, local or registered elsewhere.
86
+ * - `frontendIsRealtime`: whether the frontend is a speech-to-speech service,
87
+ * whose context can lag the audio, which changes how a delegation words its
88
+ * request.
89
+ */
90
+ export declare class ConnectorContext {
91
+ backendName: string;
92
+ frontendIsRealtime: boolean;
93
+ constructor(options: ConnectorContextOptions);
94
+ }
95
+ /**
96
+ * Defines the `delegate` tool the frontend calls, and turns a call into the
97
+ * request the backend receives.
98
+ *
99
+ * The tool's parameters are this strategy's to declare, so the connector's
100
+ * handler has one signature and reads whatever was declared back from
101
+ * `params.arguments` in `composeRequest`.
102
+ */
103
+ export declare class BackendRequestStrategy {
104
+ /** JSON-schema properties of the `delegate` tool; empty when it takes none. */
105
+ toolParameters: Record<string, unknown>;
106
+ /** Which of the properties are required. */
107
+ toolRequired: string[];
108
+ /**
109
+ * The strategy's guidance to the frontend model, if any: how the request is
110
+ * worded. It goes where the pairing instruction's `STRATEGY_PLACEHOLDER`
111
+ * stands.
112
+ */
113
+ frontendInstruction: string | null;
114
+ /** How the `delegate` tool is described to the frontend model. */
115
+ toolDescription: string;
116
+ /**
117
+ * Whether the strategy reads the conversation from the frontend's context,
118
+ * so it needs that context to be current when the `delegate` tool runs. A
119
+ * speech-to-speech frontend's context lags the audio, so the connector
120
+ * refuses such a strategy there.
121
+ */
122
+ requiresContext: boolean;
123
+ /**
124
+ * Turn a `delegate` call into the text put to the backend.
125
+ *
126
+ * @param params The call, carrying the arguments the tool declared and the
127
+ * frontend's context.
128
+ * @returns The request text, or null when the call carries nothing new for
129
+ * the backend, in which case nothing is sent.
130
+ */
131
+ composeRequest(_params: FunctionCallParams): Promise<string | null>;
132
+ }
133
+ export interface TranscriptBackendRequestStrategyOptions {
134
+ /**
135
+ * The strategy's guidance to the frontend model, placed in the pairing
136
+ * instruction: that a delegation hands over the whole conversation, unworded.
137
+ */
138
+ frontendInstruction?: string | null;
139
+ /** How the `delegate` tool is described. */
140
+ toolDescription?: string;
141
+ /** What the backend should do with the transcript, placed after it. */
142
+ requestInstruction?: string;
143
+ }
144
+ /**
145
+ * Hands the backend the conversation and lets it work out the request.
146
+ *
147
+ * The frontend model calls the tool with no arguments; the request is the
148
+ * transcript of what was said since the previous delegation (the whole
149
+ * conversation the first time), rendered by `_renderTranscriptRequest`. The
150
+ * backend's own messages in the conversation are left out: the backend
151
+ * already has what it said. The default for a text frontend, whose context is
152
+ * current when the tool runs.
153
+ *
154
+ * The cursor assumes the conversation accrues. A rewritten context or a failed
155
+ * delegation's turns are not re-sent; the user's next request carries what
156
+ * matters. A call that finds no new turn since the previous delegation sends
157
+ * nothing.
158
+ */
159
+ export declare class TranscriptBackendRequestStrategy extends BackendRequestStrategy {
160
+ requiresContext: boolean;
161
+ protected _requestInstruction: string;
162
+ protected _delegatedThrough: number;
163
+ /** Initialize the strategy. */
164
+ constructor(options?: TranscriptBackendRequestStrategyOptions);
165
+ /** Render the turns since the previous delegation as the request. */
166
+ composeRequest(params: FunctionCallParams): Promise<string | null>;
167
+ }
168
+ export interface ExplicitBackendRequestStrategyOptions {
169
+ /**
170
+ * The strategy's guidance to the frontend model, placed in the pairing
171
+ * instruction: how to word the request.
172
+ */
173
+ frontendInstruction?: string | null;
174
+ /** How the `delegate` tool is described. */
175
+ toolDescription?: string;
176
+ /** What the backend should do with the request, placed after it. */
177
+ requestInstruction?: string;
178
+ }
179
+ /**
180
+ * Has the frontend model word the request itself.
181
+ *
182
+ * The tool takes a `request` argument, which is sent to the backend as it
183
+ * stands. The default for a speech-to-speech frontend, which responds to audio
184
+ * before the transcript of that audio reaches its context, so the turns that
185
+ * prompted a handoff may not be recorded when the tool runs.
186
+ */
187
+ export declare class ExplicitBackendRequestStrategy extends BackendRequestStrategy {
188
+ toolParameters: Record<string, unknown>;
189
+ toolRequired: string[];
190
+ protected _requestInstruction: string;
191
+ /** Initialize the strategy. */
192
+ constructor(options?: ExplicitBackendRequestStrategyOptions);
193
+ /** Send the model's request as it stands, with the reporting expectation after it. */
194
+ composeRequest(params: FunctionCallParams): Promise<string | null>;
195
+ }
196
+ /** Whether a context message is one the connector rendered from a backend output. */
197
+ export declare function _isBackendMessage(message: LLMContextMessage): boolean;
198
+ export interface BackendConnectorOptions {
199
+ /** How a `delegate` call becomes the backend's request. Picked by frontend kind when omitted. */
200
+ requestStrategy?: BackendRequestStrategy | null;
201
+ /**
202
+ * How the model works with a backend, appended to its system instruction:
203
+ * `FRONTEND_PAIRING_INSTRUCTION` unless given. One of its own has to say
204
+ * what that one says: when and how to delegate, that to the user there is
205
+ * one assistant, what to do after delegating, and what to do with the
206
+ * backend's messages. The request strategy's guidance goes where
207
+ * `STRATEGY_PLACEHOLDER` stands, or after the text when it has none.
208
+ */
209
+ frontendPairingInstruction?: string;
210
+ /**
211
+ * Whether the frontend runs again as soon as a delegation is sent, which is
212
+ * where its acknowledgement comes from: a text model's tool-call turn
213
+ * carries no prose. Off for a frontend that announces a handoff itself.
214
+ * Defaults to true.
215
+ */
216
+ respondOnDelegate?: boolean;
217
+ /**
218
+ * How long the backend may take to acknowledge a message, including the
219
+ * wait for it to become ready. Defaults to 30.
220
+ */
221
+ timeoutSecs?: number | null;
222
+ /**
223
+ * Whether to send every exchange with the backend to the client as an RTVI
224
+ * server message (`type` `"llm-with-backend"`): each request, output,
225
+ * tool-call phase, error and idle. For debugging; a client's event log shows
226
+ * them. Defaults to false.
227
+ */
228
+ clientTrace?: boolean;
229
+ }
230
+ /**
231
+ * Joins the two layers: the tools the frontend calls, the session with the
232
+ * backend, and what each output becomes.
233
+ *
234
+ * A request strategy defines the `delegate` tool and composes the request. It
235
+ * may be given, or left to the connector to pick by frontend kind once bound:
236
+ * `TranscriptBackendRequestStrategy` for a text frontend,
237
+ * `ExplicitBackendRequestStrategy` for a speech-to-speech one, whose context
238
+ * lags the audio. A given strategy that reads the frontend's context
239
+ * (`BackendRequestStrategy.requiresContext`) is refused for a speech-to-speech
240
+ * frontend.
241
+ *
242
+ * The connector holds the session with the backend for the frontend's life,
243
+ * and turns each output the backend sends into a message appended to the
244
+ * frontend's conversation with `renderOutput`, run or not as the output's
245
+ * `prefersSpoken` flag says. The function calls the backend makes on the way
246
+ * are reported in the frontend's pipeline for clients to show; nothing else in
247
+ * the pipeline sees them.
248
+ *
249
+ * @example
250
+ * const connector = new BackendConnector({ respondOnDelegate: false });
251
+ */
252
+ export declare class BackendConnector {
253
+ protected _requestStrategy: BackendRequestStrategy | null;
254
+ protected _frontendPairingInstruction: string;
255
+ protected _respondOnDelegate: boolean;
256
+ protected _timeoutSecs: number | null;
257
+ protected _clientTrace: boolean;
258
+ protected _context: ConnectorContext | null;
259
+ protected _tools: FunctionSchema[];
260
+ protected _session: _BackendSession | null;
261
+ protected _sessionOpen: Event;
262
+ /** Initialize the connector. */
263
+ constructor(options?: BackendConnectorOptions);
264
+ /** The request strategy in use. Available once bound. */
265
+ get requestStrategy(): BackendRequestStrategy;
266
+ /** The tools to install on the frontend. Available once bound. */
267
+ get tools(): FunctionSchema[];
268
+ /** The `delegate` tool. Available once bound. */
269
+ get tool(): FunctionSchema;
270
+ /**
271
+ * What is appended to the frontend's system instruction: the pairing
272
+ * instruction with the strategy's guidance in place. Available once bound.
273
+ */
274
+ get frontendInstruction(): string | null;
275
+ /** The session with the backend, while one is open. */
276
+ get session(): _BackendSession | null;
277
+ /**
278
+ * Settle the strategy for the layers being joined and build the tools.
279
+ *
280
+ * @param context The layers.
281
+ * @throws Error If the frontend is speech-to-speech and the strategy reads
282
+ * the frontend's context, which lags the audio there.
283
+ */
284
+ bind(context: ConnectorContext): void;
285
+ /**
286
+ * Build the tools to install on the frontend: `delegate`.
287
+ *
288
+ * Override to install tools of another shape entirely; the service reads
289
+ * nothing else from the connector but `frontendInstruction`.
290
+ *
291
+ * @returns The tools, each carrying its handler.
292
+ */
293
+ buildTools(): FunctionSchema[];
294
+ /**
295
+ * Hold the session with the backend, delivering what it produces, until cancelled.
296
+ *
297
+ * @param worker The pipeline worker the frontend runs in.
298
+ * @param frontend The frontend service, which takes the deliveries.
299
+ */
300
+ runSession(worker: BaseWorker, frontend: AnyLLMService): Promise<void>;
301
+ /** The session, once it is open; waits for it up to the timeout. */
302
+ protected _openSession(): Promise<_BackendSession>;
303
+ /**
304
+ * Put the request a `delegate` call carries to the backend, and settle the call at once.
305
+ *
306
+ * @param params The `delegate` call.
307
+ */
308
+ delegate(params: FunctionCallParams): Promise<void>;
309
+ /**
310
+ * Deliver one thing the backend produced to the frontend.
311
+ *
312
+ * An output becomes a message appended to the frontend's conversation, which
313
+ * runs the frontend when the output asks to be spoken. A function call phase
314
+ * is reported as the `ExternalFunctionCall*Frame` for it, which the RTVI
315
+ * observer turns into function-call events. An error becomes a spoken
316
+ * message, so the user hears the work stopped. The appended messages are
317
+ * uninterruptible: one queued while the bot speaks waits behind that speech,
318
+ * and an interruption clears the speech but must leave the message to be
319
+ * recorded.
320
+ *
321
+ * @param frontend The frontend service.
322
+ * @param event What the backend produced.
323
+ */
324
+ deliver(frontend: AnyLLMService, event: BackendEvent): Promise<void>;
325
+ /** Send one exchange with the backend to the client, when tracing is on. */
326
+ protected _trace(frontend: AnyLLMService, data: Record<string, unknown>): Promise<void>;
327
+ /** Queue a message into the frontend's conversation, past any interruption on the way. */
328
+ protected _append(frontend: AnyLLMService, frame: LLMMessagesAppendFrame): Promise<void>;
329
+ /**
330
+ * Render a backend output as the message the frontend's conversation takes in.
331
+ *
332
+ * Override for another wording, role, or to leave some outputs out by
333
+ * returning null. The default marks the message so the frontend can tell it
334
+ * from the user's and its own, and so the transcript request strategy can
335
+ * leave it out of what it sends the backend: a spoken output as `Backend:`
336
+ * with `RELAY_NOTE` after it, a silent one as `Backend (note):`, a reasoning
337
+ * summary as `Backend (thinking):`.
338
+ *
339
+ * @param output The output.
340
+ * @returns The message, or null to deliver nothing for this output.
341
+ */
342
+ renderOutput(output: BackendOutput): LLMContextMessage | null;
343
+ /**
344
+ * Render a phase of a backend function call as a message the frontend's
345
+ * conversation takes in, silently.
346
+ *
347
+ * The default records each call as it starts, with its arguments, so the
348
+ * frontend can say what the backend is doing if asked; the other phases are
349
+ * not recorded. Override to record more, less, or nothing.
350
+ *
351
+ * @param call The phase of the call.
352
+ * @returns The message, or null to record nothing for this phase.
353
+ */
354
+ renderToolCall(call: BackendToolCall): LLMContextMessage | null;
355
+ }
356
+ export interface LLMWithBackendOptions {
357
+ /** The conversational LLM service, text or speech-to-speech. */
358
+ frontend: AnyLLMService;
359
+ /**
360
+ * The backend worker, or the name of one registered elsewhere (in the app,
361
+ * or in another process on a shared bus). A worker given here is added to
362
+ * the pipeline worker at setup.
363
+ */
364
+ backend: BackendLLMWorker | string;
365
+ /** How delegation works. A default `BackendConnector` when omitted. */
366
+ connector?: BackendConnector | null;
367
+ }
368
+ /**
369
+ * A conversational LLM, kept fast and light, with a backend that does the
370
+ * work it hands off.
371
+ *
372
+ * **Alpha.** The API is unstable: names, arguments, the strategies and the job
373
+ * contract are likely to change between releases.
374
+ *
375
+ * Put it where the LLM goes in a pipeline. It is a `Pipeline`, not an
376
+ * `LLMService`: functions, settings updates, event handlers and a
377
+ * `FlowManager` go on `frontend`. It wraps the frontend service, installs the
378
+ * connector's tools on it as built-in tools, appends the connector's guidance
379
+ * to the frontend's system instruction, adds a local backend worker to the
380
+ * pipeline worker so the app never wires it up, and holds the session with
381
+ * the backend for the pipeline's life. A built-in tool is sent on every
382
+ * inference beside whatever tools the frontend has, and never enters the
383
+ * context's tool set, so a tool change announced to the model never mentions
384
+ * it. The tools are the backend's; the frontend has `delegate` and no more,
385
+ * though a tool it must keep, in its context or configured on the service,
386
+ * stays.
387
+ *
388
+ * The guidance is the connector's pairing instruction (how to work with a
389
+ * backend: when and how to delegate, and what to do with the backend's
390
+ * messages) with the strategy's (how the request is worded) in place. The
391
+ * frontend's own system instruction is the place to say what the backend is
392
+ * for, in plain words, as the backend's own instruction does: no tool names,
393
+ * nothing to update when a tool changes.
394
+ *
395
+ * @example
396
+ * const llm = new LLMWithBackend({
397
+ * frontend: new OpenAILLMService({ ... }),
398
+ * backend: new BackendLLMWorker({
399
+ * llm: new AnthropicLLMService({ ... }),
400
+ * context: new LLMContext({ tools: [getWeather] }),
401
+ * }),
402
+ * });
403
+ * const pipeline = new Pipeline([transport.input(), stt, userAgg, llm, tts, transport.output(), assistantAgg]);
404
+ */
405
+ export declare class LLMWithBackend extends Pipeline {
406
+ protected _frontend: AnyLLMService;
407
+ protected _backend: BackendLLMWorker | string;
408
+ protected _connector: BackendConnector;
409
+ protected _sessionTask: Task<unknown> | null;
410
+ /**
411
+ * Initialize the service.
412
+ *
413
+ * @throws Error If the frontend service declines the role, or the
414
+ * connector's request strategy reads the frontend's context and the
415
+ * frontend is speech-to-speech.
416
+ */
417
+ constructor(options: LLMWithBackendOptions);
418
+ /** The frontend LLM service. */
419
+ get frontend(): AnyLLMService;
420
+ /** The backend worker, or its name. */
421
+ get backend(): BackendLLMWorker | string;
422
+ /** The connector joining the two layers. */
423
+ get connector(): BackendConnector;
424
+ /** The `delegate` tool installed on the frontend. */
425
+ get tool(): FunctionSchema;
426
+ /**
427
+ * Register a local backend worker as a child of the pipeline worker, set up
428
+ * the frontend, and open the session.
429
+ */
430
+ setup(setup: FrameProcessorSetup): Promise<void>;
431
+ /** Close the session with the backend, then clean up the frontend. */
432
+ cleanup(): Promise<void>;
433
+ }
434
+ export {};
435
+ //# sourceMappingURL=llm_with_backend.d.ts.map