@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,219 @@
1
+ import { type Frame, LLMContextSummaryRequestFrame, LLMContextSummaryResultFrame, LLMFullResponseStartFrame, LLMSummarizeContextFrame } from "../../frames/frames.ts";
2
+ import type { LLMService } from "../../services/llm_service.ts";
3
+ import { BaseObject } from "../../utils/base_object.ts";
4
+ import { LLMAutoContextSummarizationConfig, type LLMContextSummaryConfig } from "../../utils/context/llm_context_summarization.ts";
5
+ import type { FrameProcessorSetup } from "../frame_processor.ts";
6
+ import { type LLMContext, type LLMContextMessage } from "./llm_context.ts";
7
+ export interface SummaryAppliedEventOptions {
8
+ /** Number of messages before summarization. */
9
+ originalMessageCount: number;
10
+ /** Number of messages after summarization. */
11
+ newMessageCount: number;
12
+ /** Number of messages that were compressed into the summary. */
13
+ summarizedMessageCount: number;
14
+ /** Number of recent messages preserved uncompressed. */
15
+ preservedMessageCount: number;
16
+ }
17
+ /**
18
+ * Event data emitted when context summarization completes successfully.
19
+ *
20
+ * - `originalMessageCount`: Number of messages before summarization.
21
+ * - `newMessageCount`: Number of messages after summarization.
22
+ * - `summarizedMessageCount`: Number of messages that were compressed into the summary.
23
+ * - `preservedMessageCount`: Number of recent messages preserved uncompressed.
24
+ */
25
+ export declare class SummaryAppliedEvent {
26
+ originalMessageCount: number;
27
+ newMessageCount: number;
28
+ summarizedMessageCount: number;
29
+ preservedMessageCount: number;
30
+ constructor(options: SummaryAppliedEventOptions);
31
+ }
32
+ export interface LLMContextSummarizerOptions {
33
+ /** The LLM context to monitor and summarize. */
34
+ context: LLMContext;
35
+ /**
36
+ * Auto-summarization configuration controlling both trigger thresholds and
37
+ * default summary generation parameters. If null, uses default
38
+ * `LLMAutoContextSummarizationConfig` values.
39
+ */
40
+ config?: LLMAutoContextSummarizationConfig | null;
41
+ /**
42
+ * Whether to automatically trigger summarization when thresholds are
43
+ * reached. When false, summarization only happens when an
44
+ * `LLMSummarizeContextFrame` is pushed into the pipeline. Defaults to true.
45
+ */
46
+ autoTrigger?: boolean;
47
+ }
48
+ /**
49
+ * Summarizer for managing LLM context summarization.
50
+ *
51
+ * This class manages context summarization, either automatically when token
52
+ * or message limits are reached, or on-demand when an
53
+ * `LLMSummarizeContextFrame` is received. It monitors the LLM context size,
54
+ * triggers summarization requests, and applies the results to compress
55
+ * conversation history.
56
+ *
57
+ * When `autoTrigger` is true (the default), summarization is triggered
58
+ * automatically based on the configured thresholds in
59
+ * `LLMAutoContextSummarizationConfig`. When `autoTrigger` is false, threshold
60
+ * checks are skipped and summarization only happens when an
61
+ * `LLMSummarizeContextFrame` is explicitly pushed into the pipeline.
62
+ *
63
+ * Both modes can coexist: set `autoTrigger: true` and also push
64
+ * `LLMSummarizeContextFrame` at any time to force an immediate summarization
65
+ * (subject to the `_summarizationInProgress` guard).
66
+ *
67
+ * Event handlers available:
68
+ *
69
+ * - on_request_summarization: Emitted when summarization should be triggered.
70
+ * The aggregator should broadcast this frame to the LLM service.
71
+ * - on_summary_applied: Emitted after a summary has been successfully applied
72
+ * to the context. Receives a SummaryAppliedEvent with metrics about the
73
+ * compression.
74
+ *
75
+ * @example
76
+ * summarizer.eventHandler("on_request_summarization", async (summarizer, frame: LLMContextSummaryRequestFrame) => {
77
+ * await aggregator.broadcastFrame(LLMContextSummaryRequestFrame, {
78
+ * requestId: frame.requestId,
79
+ * context: frame.context,
80
+ * // ...
81
+ * });
82
+ * });
83
+ *
84
+ * summarizer.eventHandler("on_summary_applied", async (summarizer, event: SummaryAppliedEvent) => {
85
+ * logger.info(`Compressed ${event.originalMessageCount} -> ${event.newMessageCount} messages`);
86
+ * });
87
+ */
88
+ export declare class LLMContextSummarizer extends BaseObject {
89
+ protected _context: LLMContext;
90
+ protected _autoConfig: LLMAutoContextSummarizationConfig;
91
+ protected _autoTrigger: boolean;
92
+ protected _summarizationInProgress: boolean;
93
+ protected _pendingSummaryRequestId: string | null;
94
+ protected _summaryMessage: LLMContextMessage | null;
95
+ /** Initialize the context summarizer. */
96
+ constructor(options: LLMContextSummarizerOptions);
97
+ /**
98
+ * Return 1 if the first message is a system message, else 0.
99
+ *
100
+ * Mirrors the messages[0] system-message check used elsewhere when
101
+ * selecting messages to summarize and when reconstructing the context after
102
+ * a summary, so the message count stays consistent with what those steps
103
+ * actually preserve.
104
+ *
105
+ * @param messages The context messages to check.
106
+ * @returns 1 if `messages[0]` is a system message, otherwise 0.
107
+ */
108
+ protected static _leadingSystemMessageCount(messages: LLMContextMessage[]): number;
109
+ /**
110
+ * Count the conversation messages added since the last applied summary.
111
+ *
112
+ * Excludes the leading system message, if present, and the summary message
113
+ * injected by the last summary while it still sits directly after it. Both
114
+ * are computed from the current context so that replacing the messages (for
115
+ * example, resetting the conversation) resets the count as well.
116
+ *
117
+ * @returns The number of messages that count toward `maxUnsummarizedMessages`.
118
+ */
119
+ protected _messagesSinceSummary(): number;
120
+ /**
121
+ * Set up the summarizer.
122
+ *
123
+ * @param setup Configuration object containing setup parameters.
124
+ */
125
+ setup(setup: FrameProcessorSetup | unknown): Promise<void>;
126
+ /** Cleanup the summarizer. */
127
+ cleanup(): Promise<void>;
128
+ /**
129
+ * Process an incoming frame to detect when summarization is needed.
130
+ *
131
+ * @param frame The frame to be processed.
132
+ */
133
+ processFrame(frame: Frame): Promise<void>;
134
+ /**
135
+ * Handle LLM response start to check if summarization is needed.
136
+ *
137
+ * @param frame The LLM response start frame.
138
+ */
139
+ protected _handleLlmResponseStart(_frame: LLMFullResponseStartFrame): Promise<void>;
140
+ /**
141
+ * Handle an explicit on-demand summarization request.
142
+ *
143
+ * Reuses the same `_requestSummarization()` code path as auto mode, so
144
+ * bookkeeping (`_summarizationInProgress`, `_pendingSummaryRequestId`) is
145
+ * always updated correctly.
146
+ *
147
+ * @param frame The manual summarization request frame, optionally carrying
148
+ * a per-request LLMContextSummaryConfig.
149
+ */
150
+ protected _handleManualSummarizationRequest(frame: LLMSummarizeContextFrame): Promise<void>;
151
+ /** Handle interruption by canceling summarization in progress. */
152
+ protected _handleInterruption(): Promise<void>;
153
+ /** Cancel pending summarization. */
154
+ protected _clearSummarizationState(): Promise<void>;
155
+ /**
156
+ * Determine if context summarization should be triggered.
157
+ *
158
+ * Evaluates whether the current context has reached either the token
159
+ * threshold or message count threshold that warrants compression. Either
160
+ * threshold can be null to disable that check; at least one must be set
161
+ * (enforced at config construction time).
162
+ *
163
+ * @returns True when `autoTrigger` is enabled, no summarization is in
164
+ * progress, and either the token count exceeds `maxContextTokens` or the
165
+ * message count since the last summary exceeds `maxUnsummarizedMessages`
166
+ * (whichever of the two is set).
167
+ */
168
+ protected _shouldSummarize(): boolean;
169
+ /**
170
+ * Request context summarization from LLM service.
171
+ *
172
+ * Creates a summarization request frame and either handles it directly
173
+ * using a dedicated LLM (if configured) or emits it via event handler for
174
+ * the pipeline's primary LLM. Tracks the request ID to match async
175
+ * responses and prevent race conditions.
176
+ *
177
+ * @param configOverride Optional per-request summary configuration. If
178
+ * provided, overrides the default summary generation settings from
179
+ * `this._autoConfig.summaryConfig`.
180
+ */
181
+ protected _requestSummarization(configOverride?: LLMContextSummaryConfig | null): Promise<void>;
182
+ /**
183
+ * Generate summary using a dedicated LLM service.
184
+ *
185
+ * Calls the dedicated LLM's `_generateSummary` directly and feeds the
186
+ * result back through `_handleSummaryResult`, bypassing the pipeline.
187
+ *
188
+ * @param llm The dedicated LLM service to use for summarization.
189
+ * @param frame The summarization request frame.
190
+ */
191
+ protected _generateSummaryWithDedicatedLlm(llm: LLMService, frame: LLMContextSummaryRequestFrame): Promise<void>;
192
+ /**
193
+ * Handle context summarization result from LLM service.
194
+ *
195
+ * Processes the summary result by validating the request ID, checking for
196
+ * errors, validating context state, and applying the summary.
197
+ *
198
+ * @param frame The summary result frame containing the generated summary.
199
+ */
200
+ protected _handleSummaryResult(frame: LLMContextSummaryResultFrame): Promise<void>;
201
+ /**
202
+ * Validate that context state is still valid for applying summary.
203
+ *
204
+ * @param lastSummarizedIndex The index of the last summarized message.
205
+ * @returns True if the context state is still consistent with the summary.
206
+ */
207
+ protected _validateSummaryContext(lastSummarizedIndex: number): boolean;
208
+ /**
209
+ * Apply summary to compress the conversation context.
210
+ *
211
+ * Reconstructs the context with:
212
+ * [first_system_message] + [summary_message] + [recent_messages]
213
+ *
214
+ * @param summary The generated summary text.
215
+ * @param lastSummarizedIndex Index of the last message that was summarized.
216
+ */
217
+ protected _applySummary(summary: string, lastSummarizedIndex: number): Promise<void>;
218
+ }
219
+ //# sourceMappingURL=llm_context_summarizer.d.ts.map
@@ -0,0 +1,447 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/processors/aggregators/llm_context_summarizer.py
6
+ /** This module defines a summarizer for managing LLM context summarization. */
7
+ import { rethrowIfCancelled, TimeoutError, waitFor } from "@pipedog/asyncio";
8
+ import { InterruptionFrame, LLMContextSummaryRequestFrame, LLMContextSummaryResultFrame, LLMFullResponseStartFrame, LLMSummarizeContextFrame, } from "../../frames/frames.js";
9
+ import { BaseObject } from "../../utils/base_object.js";
10
+ import { DEFAULT_SUMMARIZATION_TIMEOUT, LLMAutoContextSummarizationConfig, LLMContextSummarizationUtil, } from "../../utils/context/llm_context_summarization.js";
11
+ import { logger } from "../../utils/logger.js";
12
+ import { LLMSpecificMessage } from "./llm_context.js";
13
+ /**
14
+ * Event data emitted when context summarization completes successfully.
15
+ *
16
+ * - `originalMessageCount`: Number of messages before summarization.
17
+ * - `newMessageCount`: Number of messages after summarization.
18
+ * - `summarizedMessageCount`: Number of messages that were compressed into the summary.
19
+ * - `preservedMessageCount`: Number of recent messages preserved uncompressed.
20
+ */
21
+ export class SummaryAppliedEvent {
22
+ originalMessageCount;
23
+ newMessageCount;
24
+ summarizedMessageCount;
25
+ preservedMessageCount;
26
+ constructor(options) {
27
+ this.originalMessageCount = options.originalMessageCount;
28
+ this.newMessageCount = options.newMessageCount;
29
+ this.summarizedMessageCount = options.summarizedMessageCount;
30
+ this.preservedMessageCount = options.preservedMessageCount;
31
+ }
32
+ }
33
+ /**
34
+ * Summarizer for managing LLM context summarization.
35
+ *
36
+ * This class manages context summarization, either automatically when token
37
+ * or message limits are reached, or on-demand when an
38
+ * `LLMSummarizeContextFrame` is received. It monitors the LLM context size,
39
+ * triggers summarization requests, and applies the results to compress
40
+ * conversation history.
41
+ *
42
+ * When `autoTrigger` is true (the default), summarization is triggered
43
+ * automatically based on the configured thresholds in
44
+ * `LLMAutoContextSummarizationConfig`. When `autoTrigger` is false, threshold
45
+ * checks are skipped and summarization only happens when an
46
+ * `LLMSummarizeContextFrame` is explicitly pushed into the pipeline.
47
+ *
48
+ * Both modes can coexist: set `autoTrigger: true` and also push
49
+ * `LLMSummarizeContextFrame` at any time to force an immediate summarization
50
+ * (subject to the `_summarizationInProgress` guard).
51
+ *
52
+ * Event handlers available:
53
+ *
54
+ * - on_request_summarization: Emitted when summarization should be triggered.
55
+ * The aggregator should broadcast this frame to the LLM service.
56
+ * - on_summary_applied: Emitted after a summary has been successfully applied
57
+ * to the context. Receives a SummaryAppliedEvent with metrics about the
58
+ * compression.
59
+ *
60
+ * @example
61
+ * summarizer.eventHandler("on_request_summarization", async (summarizer, frame: LLMContextSummaryRequestFrame) => {
62
+ * await aggregator.broadcastFrame(LLMContextSummaryRequestFrame, {
63
+ * requestId: frame.requestId,
64
+ * context: frame.context,
65
+ * // ...
66
+ * });
67
+ * });
68
+ *
69
+ * summarizer.eventHandler("on_summary_applied", async (summarizer, event: SummaryAppliedEvent) => {
70
+ * logger.info(`Compressed ${event.originalMessageCount} -> ${event.newMessageCount} messages`);
71
+ * });
72
+ */
73
+ export class LLMContextSummarizer extends BaseObject {
74
+ _context;
75
+ _autoConfig;
76
+ _autoTrigger;
77
+ _summarizationInProgress = false;
78
+ _pendingSummaryRequestId = null;
79
+ // The summary message injected by the last applied summary, tracked by
80
+ // identity so the message-count trigger can exclude it only while it is
81
+ // still at the head of the context.
82
+ _summaryMessage = null;
83
+ /** Initialize the context summarizer. */
84
+ constructor(options) {
85
+ super();
86
+ this._context = options.context;
87
+ this._autoConfig = options.config || new LLMAutoContextSummarizationConfig();
88
+ this._autoTrigger = options.autoTrigger ?? true;
89
+ this._registerEventHandler("on_request_summarization", true);
90
+ this._registerEventHandler("on_summary_applied");
91
+ }
92
+ /**
93
+ * Return 1 if the first message is a system message, else 0.
94
+ *
95
+ * Mirrors the messages[0] system-message check used elsewhere when
96
+ * selecting messages to summarize and when reconstructing the context after
97
+ * a summary, so the message count stays consistent with what those steps
98
+ * actually preserve.
99
+ *
100
+ * @param messages The context messages to check.
101
+ * @returns 1 if `messages[0]` is a system message, otherwise 0.
102
+ */
103
+ static _leadingSystemMessageCount(messages) {
104
+ const first = messages[0];
105
+ if (first !== undefined && !(first instanceof LLMSpecificMessage) && first.role === "system") {
106
+ return 1;
107
+ }
108
+ return 0;
109
+ }
110
+ /**
111
+ * Count the conversation messages added since the last applied summary.
112
+ *
113
+ * Excludes the leading system message, if present, and the summary message
114
+ * injected by the last summary while it still sits directly after it. Both
115
+ * are computed from the current context so that replacing the messages (for
116
+ * example, resetting the conversation) resets the count as well.
117
+ *
118
+ * @returns The number of messages that count toward `maxUnsummarizedMessages`.
119
+ */
120
+ _messagesSinceSummary() {
121
+ const messages = this._context.messages;
122
+ let excluded = LLMContextSummarizer._leadingSystemMessageCount(messages);
123
+ if (this._summaryMessage !== null &&
124
+ messages.length > excluded &&
125
+ messages[excluded] === this._summaryMessage) {
126
+ excluded += 1;
127
+ }
128
+ return messages.length - excluded;
129
+ }
130
+ /**
131
+ * Set up the summarizer.
132
+ *
133
+ * @param setup Configuration object containing setup parameters.
134
+ */
135
+ async setup(setup) {
136
+ await super.setup(setup.taskManager);
137
+ }
138
+ /** Cleanup the summarizer. */
139
+ async cleanup() {
140
+ await super.cleanup();
141
+ await this._clearSummarizationState();
142
+ }
143
+ /**
144
+ * Process an incoming frame to detect when summarization is needed.
145
+ *
146
+ * @param frame The frame to be processed.
147
+ */
148
+ async processFrame(frame) {
149
+ if (frame instanceof LLMFullResponseStartFrame) {
150
+ await this._handleLlmResponseStart(frame);
151
+ }
152
+ else if (frame instanceof LLMSummarizeContextFrame) {
153
+ await this._handleManualSummarizationRequest(frame);
154
+ }
155
+ else if (frame instanceof LLMContextSummaryResultFrame) {
156
+ await this._handleSummaryResult(frame);
157
+ }
158
+ else if (frame instanceof InterruptionFrame) {
159
+ await this._handleInterruption();
160
+ }
161
+ }
162
+ /**
163
+ * Handle LLM response start to check if summarization is needed.
164
+ *
165
+ * @param frame The LLM response start frame.
166
+ */
167
+ async _handleLlmResponseStart(_frame) {
168
+ if (this._shouldSummarize()) {
169
+ await this._requestSummarization();
170
+ }
171
+ }
172
+ /**
173
+ * Handle an explicit on-demand summarization request.
174
+ *
175
+ * Reuses the same `_requestSummarization()` code path as auto mode, so
176
+ * bookkeeping (`_summarizationInProgress`, `_pendingSummaryRequestId`) is
177
+ * always updated correctly.
178
+ *
179
+ * @param frame The manual summarization request frame, optionally carrying
180
+ * a per-request LLMContextSummaryConfig.
181
+ */
182
+ async _handleManualSummarizationRequest(frame) {
183
+ if (this._summarizationInProgress) {
184
+ logger.debug(`${this}: Summarization already in progress, ignoring manual request`);
185
+ return;
186
+ }
187
+ await this._requestSummarization(frame.config);
188
+ }
189
+ /** Handle interruption by canceling summarization in progress. */
190
+ async _handleInterruption() {
191
+ // Reset summarization state to allow new requests. This is necessary
192
+ // because the request frame (LLMContextSummaryRequestFrame) may have been
193
+ // cancelled during interruption. We preserve _pendingSummaryRequestId to
194
+ // handle the response frame (LLMContextSummaryResultFrame), which is
195
+ // uninterruptible and will still be delivered.
196
+ this._summarizationInProgress = false;
197
+ }
198
+ /** Cancel pending summarization. */
199
+ async _clearSummarizationState() {
200
+ if (this._summarizationInProgress) {
201
+ logger.debug(`${this}: Clearing pending summarization`);
202
+ this._summarizationInProgress = false;
203
+ this._pendingSummaryRequestId = null;
204
+ }
205
+ }
206
+ /**
207
+ * Determine if context summarization should be triggered.
208
+ *
209
+ * Evaluates whether the current context has reached either the token
210
+ * threshold or message count threshold that warrants compression. Either
211
+ * threshold can be null to disable that check; at least one must be set
212
+ * (enforced at config construction time).
213
+ *
214
+ * @returns True when `autoTrigger` is enabled, no summarization is in
215
+ * progress, and either the token count exceeds `maxContextTokens` or the
216
+ * message count since the last summary exceeds `maxUnsummarizedMessages`
217
+ * (whichever of the two is set).
218
+ */
219
+ _shouldSummarize() {
220
+ logger.trace(`${this}: Checking if context summarization is needed`);
221
+ if (!this._autoTrigger) {
222
+ return false;
223
+ }
224
+ if (this._summarizationInProgress) {
225
+ logger.debug(`${this}: Summarization already in progress`);
226
+ return false;
227
+ }
228
+ // Estimate tokens in context
229
+ const totalTokens = LLMContextSummarizationUtil.estimateContextTokens(this._context);
230
+ const numMessages = this._context.messages.length;
231
+ // Check if we've reached the token limit
232
+ const tokenLimit = this._autoConfig.maxContextTokens;
233
+ const tokenLimitExceeded = tokenLimit !== null && totalTokens >= tokenLimit;
234
+ // Check if we've exceeded max unsummarized messages
235
+ const messagesSinceSummary = this._messagesSinceSummary();
236
+ const messageThreshold = this._autoConfig.maxUnsummarizedMessages;
237
+ const messageThresholdExceeded = messageThreshold !== null && messagesSinceSummary >= messageThreshold;
238
+ logger.trace(`${this}: Context has ${numMessages} messages, ` +
239
+ `~${totalTokens} tokens (limit: ${tokenLimit !== null ? tokenLimit : "disabled"}), ` +
240
+ `${messagesSinceSummary} messages since last summary ` +
241
+ `(message threshold: ${messageThreshold !== null ? messageThreshold : "disabled"})`);
242
+ // Trigger if either limit is exceeded
243
+ if (!tokenLimitExceeded && !messageThresholdExceeded) {
244
+ logger.trace(`${this}: Neither token limit nor message threshold exceeded, skipping summarization`);
245
+ return false;
246
+ }
247
+ const reason = [];
248
+ if (tokenLimitExceeded) {
249
+ reason.push(`~${totalTokens} tokens (>=${tokenLimit} limit)`);
250
+ }
251
+ if (messageThresholdExceeded) {
252
+ reason.push(`${messagesSinceSummary} messages (>=${messageThreshold} threshold)`);
253
+ }
254
+ logger.debug(`${this}: ✓ Summarization needed - ${reason.join(", ")}`);
255
+ return true;
256
+ }
257
+ /**
258
+ * Request context summarization from LLM service.
259
+ *
260
+ * Creates a summarization request frame and either handles it directly
261
+ * using a dedicated LLM (if configured) or emits it via event handler for
262
+ * the pipeline's primary LLM. Tracks the request ID to match async
263
+ * responses and prevent race conditions.
264
+ *
265
+ * @param configOverride Optional per-request summary configuration. If
266
+ * provided, overrides the default summary generation settings from
267
+ * `this._autoConfig.summaryConfig`.
268
+ */
269
+ async _requestSummarization(configOverride = null) {
270
+ // Generate unique request ID
271
+ const requestId = crypto.randomUUID();
272
+ const summaryConfig = configOverride || this._autoConfig.summaryConfig;
273
+ // Mark summarization in progress
274
+ this._summarizationInProgress = true;
275
+ this._pendingSummaryRequestId = requestId;
276
+ logger.debug(`${this}: Sending summarization request (request_id=${requestId})`);
277
+ // Create the request frame
278
+ const requestFrame = new LLMContextSummaryRequestFrame({
279
+ requestId,
280
+ context: this._context,
281
+ minMessagesToKeep: summaryConfig.minMessagesAfterSummary,
282
+ targetContextTokens: summaryConfig.targetContextTokens,
283
+ summarizationPrompt: summaryConfig.summaryPrompt,
284
+ summarizationTimeout: summaryConfig.summarizationTimeout,
285
+ });
286
+ if (summaryConfig.llm) {
287
+ // Use dedicated LLM directly — no need to involve the pipeline
288
+ const llm = summaryConfig.llm;
289
+ this.taskManager.createTask(() => this._generateSummaryWithDedicatedLlm(llm, requestFrame), `${this}-dedicated-llm-summary`);
290
+ }
291
+ else {
292
+ // Emit event for aggregator to broadcast to the pipeline LLM
293
+ await this._callEventHandler("on_request_summarization", requestFrame);
294
+ }
295
+ }
296
+ /**
297
+ * Generate summary using a dedicated LLM service.
298
+ *
299
+ * Calls the dedicated LLM's `_generateSummary` directly and feeds the
300
+ * result back through `_handleSummaryResult`, bypassing the pipeline.
301
+ *
302
+ * @param llm The dedicated LLM service to use for summarization.
303
+ * @param frame The summarization request frame.
304
+ */
305
+ async _generateSummaryWithDedicatedLlm(llm, frame) {
306
+ // Python `or`: a 0 timeout also falls back to the default.
307
+ const timeout = frame.summarizationTimeout || DEFAULT_SUMMARIZATION_TIMEOUT;
308
+ let resultFrame;
309
+ try {
310
+ const generator = llm;
311
+ const [summary, lastIndex] = await waitFor(() => generator._generateSummary(frame), timeout);
312
+ resultFrame = new LLMContextSummaryResultFrame({
313
+ requestId: frame.requestId,
314
+ summary,
315
+ lastSummarizedIndex: lastIndex,
316
+ });
317
+ }
318
+ catch (e) {
319
+ rethrowIfCancelled(e);
320
+ let error;
321
+ if (e instanceof TimeoutError) {
322
+ error = `Context summarization timed out after ${timeout}s`;
323
+ }
324
+ else {
325
+ error = `Error generating context summary: ${e instanceof Error ? e.message : String(e)}`;
326
+ }
327
+ logger.error(`${this}: ${error}`);
328
+ resultFrame = new LLMContextSummaryResultFrame({
329
+ requestId: frame.requestId,
330
+ summary: "",
331
+ lastSummarizedIndex: -1,
332
+ error,
333
+ });
334
+ }
335
+ await this._handleSummaryResult(resultFrame);
336
+ }
337
+ /**
338
+ * Handle context summarization result from LLM service.
339
+ *
340
+ * Processes the summary result by validating the request ID, checking for
341
+ * errors, validating context state, and applying the summary.
342
+ *
343
+ * @param frame The summary result frame containing the generated summary.
344
+ */
345
+ async _handleSummaryResult(frame) {
346
+ logger.debug(`${this}: Received summary result (request_id=${frame.requestId})`);
347
+ // Check if this is the result we're waiting for. Both auto and manual
348
+ // summarization set _pendingSummaryRequestId via _requestSummarization(),
349
+ // so this check always applies.
350
+ if (frame.requestId !== this._pendingSummaryRequestId) {
351
+ logger.debug(`${this}: Ignoring stale summary result (request_id=${frame.requestId})`);
352
+ return;
353
+ }
354
+ // Clear pending state
355
+ await this._clearSummarizationState();
356
+ // Check for errors
357
+ if (frame.error) {
358
+ logger.error(`${this}: Context summarization failed: ${frame.error}`);
359
+ return;
360
+ }
361
+ // Validate context state
362
+ if (!this._validateSummaryContext(frame.lastSummarizedIndex)) {
363
+ logger.warning(`${this}: Context state changed, skipping summary application`);
364
+ return;
365
+ }
366
+ // Apply summary
367
+ await this._applySummary(frame.summary, frame.lastSummarizedIndex);
368
+ }
369
+ /**
370
+ * Validate that context state is still valid for applying summary.
371
+ *
372
+ * @param lastSummarizedIndex The index of the last summarized message.
373
+ * @returns True if the context state is still consistent with the summary.
374
+ */
375
+ _validateSummaryContext(lastSummarizedIndex) {
376
+ if (lastSummarizedIndex < 0) {
377
+ return false;
378
+ }
379
+ // Check if we still have enough messages
380
+ if (lastSummarizedIndex >= this._context.messages.length) {
381
+ return false;
382
+ }
383
+ const minKeep = this._autoConfig.summaryConfig.minMessagesAfterSummary;
384
+ const remaining = this._context.messages.length - 1 - lastSummarizedIndex;
385
+ if (remaining < minKeep) {
386
+ return false;
387
+ }
388
+ return true;
389
+ }
390
+ /**
391
+ * Apply summary to compress the conversation context.
392
+ *
393
+ * Reconstructs the context with:
394
+ * [first_system_message] + [summary_message] + [recent_messages]
395
+ *
396
+ * @param summary The generated summary text.
397
+ * @param lastSummarizedIndex Index of the last message that was summarized.
398
+ */
399
+ async _applySummary(summary, lastSummarizedIndex) {
400
+ const config = this._autoConfig.summaryConfig;
401
+ const messages = this._context.messages;
402
+ // Preserve the first message if it is a system message (initial system
403
+ // prompt). Only messages[0] is treated as the system preamble — system
404
+ // messages at other positions are mid-conversation injections and are not
405
+ // preserved separately (they will be part of the summary or the recent
406
+ // messages).
407
+ const numSystemPreserved = LLMContextSummarizer._leadingSystemMessageCount(messages);
408
+ const firstSystemMsg = numSystemPreserved ? messages[0] : null;
409
+ // Get recent messages to keep
410
+ const recentMessages = messages.slice(lastSummarizedIndex + 1);
411
+ // Create summary message as a user message (the summary is context
412
+ // provided *to* the assistant, not something the assistant said)
413
+ const summaryContent = formatSummaryTemplate(config.summaryMessageTemplate, summary);
414
+ const summaryMessage = { role: "user", content: summaryContent };
415
+ // Reconstruct context
416
+ const newMessages = [];
417
+ if (firstSystemMsg) {
418
+ newMessages.push(firstSystemMsg);
419
+ }
420
+ newMessages.push(summaryMessage);
421
+ newMessages.push(...recentMessages);
422
+ // Update context
423
+ const originalMessageCount = messages.length;
424
+ this._context.setMessages(newMessages);
425
+ this._summaryMessage = summaryMessage;
426
+ // Messages actually summarized = index range minus the preserved system message
427
+ const summarizedCount = lastSummarizedIndex + 1 - numSystemPreserved;
428
+ logger.info(`${this}: Applied context summary, compressed ${summarizedCount} messages ` +
429
+ `into summary. Context now has ${newMessages.length} messages (was ${originalMessageCount})`);
430
+ // Emit event for observability
431
+ const event = new SummaryAppliedEvent({
432
+ originalMessageCount,
433
+ newMessageCount: newMessages.length,
434
+ summarizedMessageCount: summarizedCount,
435
+ preservedMessageCount: recentMessages.length + numSystemPreserved,
436
+ });
437
+ await this._callEventHandler("on_summary_applied", event);
438
+ }
439
+ }
440
+ /**
441
+ * Python `template.format(summary=summary)`: replaces `{summary}` and
442
+ * unescapes doubled braces.
443
+ */
444
+ function formatSummaryTemplate(template, summary) {
445
+ return template.replace(/\{\{|\}\}|\{summary\}/g, (m) => m === "{{" ? "{" : m === "}}" ? "}" : summary);
446
+ }
447
+ //# sourceMappingURL=llm_context_summarizer.js.map