@librechat/agents 3.3.3 → 3.3.5

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 (274) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +2 -1
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/constants.cjs +21 -0
  4. package/dist/cjs/common/constants.cjs.map +1 -1
  5. package/dist/cjs/events.cjs +10 -1
  6. package/dist/cjs/events.cjs.map +1 -1
  7. package/dist/cjs/graphs/Graph.cjs +793 -111
  8. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs +3 -1
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  11. package/dist/cjs/hooks/HookRegistry.cjs +25 -0
  12. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  13. package/dist/cjs/hooks/index.cjs +12 -0
  14. package/dist/cjs/hooks/index.cjs.map +1 -1
  15. package/dist/cjs/hooks/types.cjs +1 -0
  16. package/dist/cjs/hooks/types.cjs.map +1 -1
  17. package/dist/cjs/langfuse.cjs +8 -0
  18. package/dist/cjs/langfuse.cjs.map +1 -1
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -6
  20. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  21. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +38 -13
  22. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  23. package/dist/cjs/llm/google/utils/common.cjs +19 -7
  24. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  25. package/dist/cjs/llm/invoke.cjs +331 -5
  26. package/dist/cjs/llm/invoke.cjs.map +1 -1
  27. package/dist/cjs/llm/openai/index.cjs +41 -5
  28. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  29. package/dist/cjs/llm/openai/utils/index.cjs +25 -4
  30. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  31. package/dist/cjs/llm/openrouter/index.cjs +4 -1
  32. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  33. package/dist/cjs/llm/preempt.cjs +132 -0
  34. package/dist/cjs/llm/preempt.cjs.map +1 -0
  35. package/dist/cjs/main.cjs +36 -5
  36. package/dist/cjs/messages/alternation.cjs +92 -0
  37. package/dist/cjs/messages/alternation.cjs.map +1 -0
  38. package/dist/cjs/messages/cache.cjs +54 -33
  39. package/dist/cjs/messages/cache.cjs.map +1 -1
  40. package/dist/cjs/messages/contextPruning.cjs +17 -43
  41. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  42. package/dist/cjs/messages/core.cjs +315 -23
  43. package/dist/cjs/messages/core.cjs.map +1 -1
  44. package/dist/cjs/messages/format.cjs +290 -60
  45. package/dist/cjs/messages/format.cjs.map +1 -1
  46. package/dist/cjs/messages/handoffCue.cjs +63 -0
  47. package/dist/cjs/messages/handoffCue.cjs.map +1 -0
  48. package/dist/cjs/messages/index.cjs +4 -1
  49. package/dist/cjs/messages/injected.cjs +60 -0
  50. package/dist/cjs/messages/injected.cjs.map +1 -0
  51. package/dist/cjs/messages/prune.cjs +503 -127
  52. package/dist/cjs/messages/prune.cjs.map +1 -1
  53. package/dist/cjs/run.cjs +80 -7
  54. package/dist/cjs/run.cjs.map +1 -1
  55. package/dist/cjs/session/handlers.cjs +18 -9
  56. package/dist/cjs/session/handlers.cjs.map +1 -1
  57. package/dist/cjs/stream.cjs +35 -10
  58. package/dist/cjs/stream.cjs.map +1 -1
  59. package/dist/cjs/summarization/node.cjs +28 -14
  60. package/dist/cjs/summarization/node.cjs.map +1 -1
  61. package/dist/cjs/tools/ToolNode.cjs +56 -63
  62. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  63. package/dist/cjs/tools/search/keenable-scraper.cjs +90 -0
  64. package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -0
  65. package/dist/cjs/tools/search/tool.cjs +9 -1
  66. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  67. package/dist/cjs/tools/toolOutputReferences.cjs +6 -0
  68. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  69. package/dist/cjs/utils/index.cjs +1 -1
  70. package/dist/cjs/utils/llm.cjs +1 -1
  71. package/dist/cjs/utils/llm.cjs.map +1 -1
  72. package/dist/cjs/utils/tokens.cjs +307 -20
  73. package/dist/cjs/utils/tokens.cjs.map +1 -1
  74. package/dist/cjs/utils/toolContent.cjs +1514 -0
  75. package/dist/cjs/utils/toolContent.cjs.map +1 -0
  76. package/dist/esm/agents/AgentContext.mjs +2 -1
  77. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  78. package/dist/esm/common/constants.mjs +19 -1
  79. package/dist/esm/common/constants.mjs.map +1 -1
  80. package/dist/esm/events.mjs +10 -1
  81. package/dist/esm/events.mjs.map +1 -1
  82. package/dist/esm/graphs/Graph.mjs +798 -116
  83. package/dist/esm/graphs/Graph.mjs.map +1 -1
  84. package/dist/esm/graphs/MultiAgentGraph.mjs +3 -1
  85. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  86. package/dist/esm/hooks/HookRegistry.mjs +25 -0
  87. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  88. package/dist/esm/hooks/index.mjs +12 -1
  89. package/dist/esm/hooks/index.mjs.map +1 -1
  90. package/dist/esm/hooks/types.mjs +1 -0
  91. package/dist/esm/hooks/types.mjs.map +1 -1
  92. package/dist/esm/langfuse.mjs +9 -1
  93. package/dist/esm/langfuse.mjs.map +1 -1
  94. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -6
  95. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  96. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +38 -13
  97. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  98. package/dist/esm/llm/google/utils/common.mjs +19 -7
  99. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  100. package/dist/esm/llm/invoke.mjs +332 -8
  101. package/dist/esm/llm/invoke.mjs.map +1 -1
  102. package/dist/esm/llm/openai/index.mjs +41 -5
  103. package/dist/esm/llm/openai/index.mjs.map +1 -1
  104. package/dist/esm/llm/openai/utils/index.mjs +25 -4
  105. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  106. package/dist/esm/llm/openrouter/index.mjs +4 -1
  107. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  108. package/dist/esm/llm/preempt.mjs +131 -0
  109. package/dist/esm/llm/preempt.mjs.map +1 -0
  110. package/dist/esm/main.mjs +14 -11
  111. package/dist/esm/messages/alternation.mjs +91 -0
  112. package/dist/esm/messages/alternation.mjs.map +1 -0
  113. package/dist/esm/messages/cache.mjs +55 -34
  114. package/dist/esm/messages/cache.mjs.map +1 -1
  115. package/dist/esm/messages/contextPruning.mjs +17 -43
  116. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  117. package/dist/esm/messages/core.mjs +305 -24
  118. package/dist/esm/messages/core.mjs.map +1 -1
  119. package/dist/esm/messages/format.mjs +290 -61
  120. package/dist/esm/messages/format.mjs.map +1 -1
  121. package/dist/esm/messages/handoffCue.mjs +61 -0
  122. package/dist/esm/messages/handoffCue.mjs.map +1 -0
  123. package/dist/esm/messages/index.mjs +4 -1
  124. package/dist/esm/messages/injected.mjs +60 -0
  125. package/dist/esm/messages/injected.mjs.map +1 -0
  126. package/dist/esm/messages/prune.mjs +500 -128
  127. package/dist/esm/messages/prune.mjs.map +1 -1
  128. package/dist/esm/run.mjs +80 -7
  129. package/dist/esm/run.mjs.map +1 -1
  130. package/dist/esm/session/handlers.mjs +19 -10
  131. package/dist/esm/session/handlers.mjs.map +1 -1
  132. package/dist/esm/stream.mjs +34 -11
  133. package/dist/esm/stream.mjs.map +1 -1
  134. package/dist/esm/summarization/node.mjs +28 -14
  135. package/dist/esm/summarization/node.mjs.map +1 -1
  136. package/dist/esm/tools/ToolNode.mjs +56 -63
  137. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  138. package/dist/esm/tools/search/keenable-scraper.mjs +88 -0
  139. package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -0
  140. package/dist/esm/tools/search/tool.mjs +9 -1
  141. package/dist/esm/tools/search/tool.mjs.map +1 -1
  142. package/dist/esm/tools/toolOutputReferences.mjs +6 -0
  143. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  144. package/dist/esm/utils/index.mjs +1 -1
  145. package/dist/esm/utils/llm.mjs +1 -1
  146. package/dist/esm/utils/llm.mjs.map +1 -1
  147. package/dist/esm/utils/tokens.mjs +307 -21
  148. package/dist/esm/utils/tokens.mjs.map +1 -1
  149. package/dist/esm/utils/toolContent.mjs +1503 -0
  150. package/dist/esm/utils/toolContent.mjs.map +1 -0
  151. package/dist/types/common/constants.d.ts +18 -0
  152. package/dist/types/graphs/Graph.d.ts +139 -2
  153. package/dist/types/hooks/HookRegistry.d.ts +15 -0
  154. package/dist/types/hooks/index.d.ts +12 -1
  155. package/dist/types/hooks/types.d.ts +45 -6
  156. package/dist/types/index.d.ts +1 -1
  157. package/dist/types/llm/invoke.d.ts +34 -1
  158. package/dist/types/llm/openai/index.d.ts +4 -0
  159. package/dist/types/llm/openai/utils/index.d.ts +2 -0
  160. package/dist/types/llm/openrouter/index.d.ts +5 -0
  161. package/dist/types/llm/preempt.d.ts +40 -0
  162. package/dist/types/messages/alternation.d.ts +23 -0
  163. package/dist/types/messages/contextPruning.d.ts +2 -1
  164. package/dist/types/messages/core.d.ts +36 -0
  165. package/dist/types/messages/format.d.ts +6 -0
  166. package/dist/types/messages/handoffCue.d.ts +40 -0
  167. package/dist/types/messages/index.d.ts +3 -0
  168. package/dist/types/messages/injected.d.ts +3 -0
  169. package/dist/types/messages/prune.d.ts +16 -12
  170. package/dist/types/run.d.ts +7 -0
  171. package/dist/types/stream.d.ts +14 -0
  172. package/dist/types/tools/ToolNode.d.ts +0 -7
  173. package/dist/types/tools/search/keenable-scraper.d.ts +15 -0
  174. package/dist/types/tools/search/types.d.ts +31 -2
  175. package/dist/types/types/graph.d.ts +8 -1
  176. package/dist/types/types/run.d.ts +65 -0
  177. package/dist/types/types/stream.d.ts +1 -26
  178. package/dist/types/utils/tokens.d.ts +7 -0
  179. package/dist/types/utils/toolContent.d.ts +107 -0
  180. package/package.json +1 -1
  181. package/src/__tests__/stream.eagerEventExecution.test.ts +74 -0
  182. package/src/agents/AgentContext.ts +1 -0
  183. package/src/{splitStream.test.ts → aggregator.test.ts} +59 -666
  184. package/src/common/constants.ts +21 -0
  185. package/src/events.ts +15 -1
  186. package/src/graphs/Graph.ts +1261 -198
  187. package/src/graphs/MultiAgentGraph.ts +6 -1
  188. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1139 -4
  189. package/src/graphs/__tests__/Graph.preemptSignal.test.ts +126 -0
  190. package/src/hooks/HookRegistry.ts +40 -0
  191. package/src/hooks/__tests__/preemptBoundary.test.ts +152 -0
  192. package/src/hooks/index.ts +16 -2
  193. package/src/hooks/types.ts +47 -3
  194. package/src/index.ts +1 -1
  195. package/src/langfuse.ts +26 -1
  196. package/src/llm/anthropic/utils/message_inputs.ts +158 -12
  197. package/src/llm/anthropic/utils/tool-id-normalization.test.ts +109 -0
  198. package/src/llm/bedrock/utils/message_inputs.test.ts +131 -1
  199. package/src/llm/bedrock/utils/message_inputs.ts +100 -24
  200. package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +15 -0
  201. package/src/llm/google/utils/common.test.ts +75 -9
  202. package/src/llm/google/utils/common.ts +34 -3
  203. package/src/llm/invoke.alternation.test.ts +87 -0
  204. package/src/llm/invoke.handoffCue.test.ts +112 -0
  205. package/src/llm/invoke.test.ts +488 -0
  206. package/src/llm/invoke.ts +611 -8
  207. package/src/llm/openai/index.ts +106 -6
  208. package/src/llm/openai/utils/index.ts +109 -53
  209. package/src/llm/openai/utils/messages.test.ts +330 -1
  210. package/src/llm/openrouter/index.ts +12 -2
  211. package/src/llm/openrouter/reasoning.test.ts +314 -0
  212. package/src/llm/preempt.test.ts +323 -0
  213. package/src/llm/preempt.ts +178 -0
  214. package/src/messages/__tests__/observationMasking.test.ts +93 -2
  215. package/src/messages/alternation.test.ts +212 -0
  216. package/src/messages/alternation.ts +112 -0
  217. package/src/messages/cache.tail.test.ts +193 -0
  218. package/src/messages/cache.test.ts +113 -0
  219. package/src/messages/cache.ts +92 -60
  220. package/src/messages/contextPruning.test.ts +184 -0
  221. package/src/messages/contextPruning.ts +49 -42
  222. package/src/messages/core.ts +653 -40
  223. package/src/messages/ensureThinkingBlock.test.ts +49 -1
  224. package/src/messages/foldToollessToolBlocks.test.ts +163 -5
  225. package/src/messages/format.ts +454 -91
  226. package/src/messages/formatAgentMessages.steer.test.ts +267 -0
  227. package/src/messages/formatAgentMessages.test.ts +604 -14
  228. package/src/messages/formatAgentMessages.tools.test.ts +103 -0
  229. package/src/messages/handoffCue.test.ts +96 -0
  230. package/src/messages/handoffCue.ts +78 -0
  231. package/src/messages/index.ts +3 -0
  232. package/src/messages/injected.test.ts +90 -0
  233. package/src/messages/injected.ts +74 -0
  234. package/src/messages/prune.ts +996 -183
  235. package/src/run.ts +91 -6
  236. package/src/scripts/preempt-probe.ts +330 -0
  237. package/src/scripts/preempt-scenarios.ts +388 -0
  238. package/src/session/handlers.ts +32 -12
  239. package/src/specs/handoffCue.test.ts +165 -0
  240. package/src/specs/langfuse-callbacks.test.ts +352 -2
  241. package/src/specs/preemptSeal.test.ts +309 -0
  242. package/src/specs/prune.test.ts +1083 -6
  243. package/src/specs/summarization-unit.test.ts +105 -0
  244. package/src/specs/tokens.test.ts +609 -32
  245. package/src/stream.dispatch.test.ts +63 -0
  246. package/src/stream.ts +59 -23
  247. package/src/summarization/__tests__/node.test.ts +77 -0
  248. package/src/summarization/node.ts +46 -18
  249. package/src/tools/ToolNode.ts +150 -99
  250. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +148 -1
  251. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +112 -3
  252. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +32 -0
  253. package/src/tools/__tests__/directToolHooks.test.ts +255 -7
  254. package/src/tools/search/keenable-scraper.test.ts +153 -0
  255. package/src/tools/search/keenable-scraper.ts +137 -0
  256. package/src/tools/search/tool.ts +13 -2
  257. package/src/tools/search/types.ts +50 -3
  258. package/src/tools/toolOutputReferences.ts +6 -0
  259. package/src/types/graph.ts +12 -1
  260. package/src/types/run.ts +67 -0
  261. package/src/types/stream.ts +1 -42
  262. package/src/utils/llm.test.ts +18 -0
  263. package/src/utils/llm.ts +4 -1
  264. package/src/utils/tokens.ts +586 -31
  265. package/src/utils/toolContent.test.ts +1432 -0
  266. package/src/utils/toolContent.ts +2707 -0
  267. package/dist/cjs/splitStream.cjs +0 -151
  268. package/dist/cjs/splitStream.cjs.map +0 -1
  269. package/dist/esm/splitStream.mjs +0 -150
  270. package/dist/esm/splitStream.mjs.map +0 -1
  271. package/dist/types/mockStream.d.ts +0 -32
  272. package/dist/types/splitStream.d.ts +0 -37
  273. package/src/mockStream.ts +0 -99
  274. package/src/splitStream.ts +0 -234
@@ -1,151 +0,0 @@
1
- require("./common/enum.cjs");
2
- require("./common/index.cjs");
3
- let nanoid = require("nanoid");
4
- //#region src/splitStream.ts
5
- const SEPARATORS = [
6
- ". ",
7
- "?",
8
- "!",
9
- "۔",
10
- "- ",
11
- "。",
12
- "‥",
13
- ";",
14
- "¡",
15
- "¿",
16
- "\n",
17
- "```"
18
- ];
19
- var SplitStreamHandler = class {
20
- inCodeBlock = false;
21
- inThinkBlock = false;
22
- accumulate;
23
- tokens = [];
24
- lastToken = "";
25
- reasoningTokens = [];
26
- currentStepId;
27
- currentMessageId;
28
- currentType;
29
- currentLength = 0;
30
- reasoningKey = "reasoning_content";
31
- currentIndex = -1;
32
- blockThreshold = 4500;
33
- /** The run ID AKA the Message ID associated with the complete generation */
34
- runId;
35
- handlers;
36
- constructor({ runId, handlers, accumulate, reasoningKey, blockThreshold }) {
37
- this.runId = runId;
38
- this.handlers = handlers;
39
- if (reasoningKey) this.reasoningKey = reasoningKey;
40
- if (blockThreshold != null) this.blockThreshold = blockThreshold;
41
- this.accumulate = accumulate ?? false;
42
- }
43
- getMessageId = () => {
44
- const messageId = this.currentMessageId;
45
- if (messageId != null && messageId) return messageId;
46
- };
47
- createMessageStep = (type) => {
48
- if (type != null && this.currentType !== type) this.currentType = type;
49
- this.currentLength = 0;
50
- this.currentIndex += 1;
51
- this.currentStepId = `step_${(0, nanoid.nanoid)()}`;
52
- this.currentMessageId = `msg_${(0, nanoid.nanoid)()}`;
53
- return [this.currentStepId, this.currentMessageId];
54
- };
55
- dispatchRunStep = (stepId, stepDetails) => {
56
- const runStep = {
57
- id: stepId,
58
- runId: this.runId,
59
- type: stepDetails.type,
60
- index: this.currentIndex,
61
- stepDetails
62
- };
63
- this.handlers?.["on_run_step"]?.({
64
- event: "on_run_step",
65
- data: runStep
66
- });
67
- };
68
- dispatchMessageDelta = (stepId, delta) => {
69
- const messageDelta = {
70
- id: stepId,
71
- delta
72
- };
73
- this.handlers?.["on_message_delta"]?.({
74
- event: "on_message_delta",
75
- data: messageDelta
76
- });
77
- };
78
- dispatchReasoningDelta = (stepId, delta) => {
79
- const reasoningDelta = {
80
- id: stepId,
81
- delta
82
- };
83
- this.handlers?.["on_reasoning_delta"]?.({
84
- event: "on_reasoning_delta",
85
- data: reasoningDelta
86
- });
87
- };
88
- handleContent = (content, _type) => {
89
- let type = _type;
90
- if (this.inThinkBlock && type === "text") type = "think";
91
- if (this.accumulate) if (type === "think") this.reasoningTokens.push(content);
92
- else this.tokens.push(content);
93
- if (this.currentType !== type) {
94
- const [newStepId, newMessageId] = this.createMessageStep(type);
95
- this.dispatchRunStep(newStepId, {
96
- type: "message_creation",
97
- message_creation: { message_id: newMessageId }
98
- });
99
- }
100
- const stepId = this.currentStepId ?? "";
101
- if (type === "think") this.dispatchReasoningDelta(stepId, { content: [{
102
- type: "think",
103
- think: content
104
- }] });
105
- else this.dispatchMessageDelta(stepId, { content: [{
106
- type: "text",
107
- text: content
108
- }] });
109
- this.currentLength += content.length;
110
- if (this.inCodeBlock) return;
111
- if (this.currentLength > this.blockThreshold && SEPARATORS.some((sep) => content.includes(sep))) {
112
- const [newStepId, newMessageId] = this.createMessageStep(type);
113
- this.dispatchRunStep(newStepId, {
114
- type: "message_creation",
115
- message_creation: { message_id: newMessageId }
116
- });
117
- }
118
- };
119
- getDeltaContent(chunk) {
120
- return (chunk?.choices?.[0]?.delta)?.content ?? "";
121
- }
122
- getReasoningDelta(chunk) {
123
- return (chunk?.choices?.[0]?.delta)?.[this.reasoningKey] ?? "";
124
- }
125
- handle(chunk) {
126
- if (!chunk) return;
127
- const content = this.getDeltaContent(chunk);
128
- const reasoning_content = this.getReasoningDelta(chunk);
129
- if (!content.length && !reasoning_content.length) return;
130
- if (content.includes("```")) this.inCodeBlock = !this.inCodeBlock;
131
- if (content.includes("<think>") && !this.inCodeBlock) this.inThinkBlock = true;
132
- else if (this.lastToken.includes("</think>") && !this.inCodeBlock) this.inThinkBlock = false;
133
- this.lastToken = content;
134
- if (!(this.getMessageId() ?? "")) {
135
- const initialContentType = this.inThinkBlock ? "think" : "text";
136
- const initialType = reasoning_content ? "think" : initialContentType;
137
- const [stepId, message_id] = this.createMessageStep(initialType);
138
- this.dispatchRunStep(stepId, {
139
- type: "message_creation",
140
- message_creation: { message_id }
141
- });
142
- }
143
- if (reasoning_content) this.handleContent(reasoning_content, "think");
144
- else this.handleContent(content, "text");
145
- }
146
- };
147
- //#endregion
148
- exports.SEPARATORS = SEPARATORS;
149
- exports.SplitStreamHandler = SplitStreamHandler;
150
-
151
- //# sourceMappingURL=splitStream.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"splitStream.cjs","names":[],"sources":["../../src/splitStream.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes } from '@/common';\n\nexport const SEPARATORS = [\n '. ',\n '?',\n '!',\n '۔',\n '- ',\n '。',\n '‥',\n ';',\n '¡',\n '¿',\n '\\n',\n '```',\n];\n\nexport class SplitStreamHandler {\n private inCodeBlock = false;\n private inThinkBlock = false;\n private accumulate: boolean;\n tokens: string[] = [];\n lastToken = '';\n reasoningTokens: string[] = [];\n currentStepId?: string;\n currentMessageId?: string;\n currentType?: ContentTypes.TEXT | ContentTypes.THINK;\n currentLength = 0;\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentIndex = -1;\n blockThreshold = 4500;\n /** The run ID AKA the Message ID associated with the complete generation */\n runId: string;\n handlers?: t.SplitStreamHandlers;\n constructor({\n runId,\n handlers,\n accumulate,\n reasoningKey,\n blockThreshold,\n }: {\n runId: string;\n accumulate?: boolean;\n handlers: t.SplitStreamHandlers;\n blockThreshold?: number;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n }) {\n this.runId = runId;\n this.handlers = handlers;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (blockThreshold != null) {\n this.blockThreshold = blockThreshold;\n }\n this.accumulate = accumulate ?? false;\n }\n getMessageId = (): string | undefined => {\n const messageId = this.currentMessageId;\n if (messageId != null && messageId) {\n return messageId;\n }\n return undefined;\n };\n createMessageStep = (\n type?: ContentTypes.TEXT | ContentTypes.THINK\n ): [string, string] => {\n if (type != null && this.currentType !== type) {\n this.currentType = type;\n }\n this.currentLength = 0;\n this.currentIndex += 1;\n this.currentStepId = `step_${nanoid()}`;\n this.currentMessageId = `msg_${nanoid()}`;\n return [this.currentStepId, this.currentMessageId];\n };\n dispatchRunStep = (stepId: string, stepDetails: t.StepDetails): void => {\n const runStep: t.RunStep = {\n id: stepId,\n runId: this.runId,\n type: stepDetails.type,\n index: this.currentIndex,\n stepDetails,\n // usage: null,\n };\n this.handlers?.[GraphEvents.ON_RUN_STEP]?.({\n event: GraphEvents.ON_RUN_STEP,\n data: runStep,\n });\n };\n dispatchMessageDelta = (stepId: string, delta: t.MessageDelta): void => {\n const messageDelta: t.MessageDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_MESSAGE_DELTA]?.({\n event: GraphEvents.ON_MESSAGE_DELTA,\n data: messageDelta,\n });\n };\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_REASONING_DELTA]?.({\n event: GraphEvents.ON_REASONING_DELTA,\n data: reasoningDelta,\n });\n };\n handleContent = (\n content: string,\n _type: ContentTypes.TEXT | ContentTypes.THINK\n ): void => {\n let type = _type;\n if (this.inThinkBlock && type === ContentTypes.TEXT) {\n type = ContentTypes.THINK;\n }\n if (this.accumulate) {\n if (type === ContentTypes.THINK) {\n this.reasoningTokens.push(content);\n } else {\n this.tokens.push(content);\n }\n }\n\n if (this.currentType !== type) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n\n const stepId = this.currentStepId ?? '';\n if (type === ContentTypes.THINK) {\n this.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n } else {\n this.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n }\n\n this.currentLength += content.length;\n if (this.inCodeBlock) {\n return;\n }\n\n if (\n this.currentLength > this.blockThreshold &&\n SEPARATORS.some((sep) => content.includes(sep))\n ) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n };\n getDeltaContent(chunk?: t.CustomChunk): string {\n return (chunk?.choices?.[0]?.delta as t.CustomChunkDelta)?.content ?? '';\n }\n getReasoningDelta(chunk?: t.CustomChunk): string {\n return (\n (chunk?.choices?.[0]?.delta as t.CustomChunkDelta)?.[this.reasoningKey] ??\n ''\n );\n }\n handle(chunk?: t.CustomChunk): void {\n if (!chunk) {\n return;\n }\n\n const content = this.getDeltaContent(chunk);\n const reasoning_content = this.getReasoningDelta(chunk);\n if (!content.length && !reasoning_content.length) {\n return;\n }\n\n if (content.includes('```')) {\n this.inCodeBlock = !this.inCodeBlock;\n }\n\n if (content.includes('<think>') && !this.inCodeBlock) {\n this.inThinkBlock = true;\n } else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {\n this.inThinkBlock = false;\n }\n\n this.lastToken = content;\n\n const message_id = this.getMessageId() ?? '';\n\n if (!message_id) {\n const initialContentType = this.inThinkBlock\n ? ContentTypes.THINK\n : ContentTypes.TEXT;\n const initialType = reasoning_content\n ? ContentTypes.THINK\n : initialContentType;\n const [stepId, message_id] = this.createMessageStep(initialType);\n this.dispatchRunStep(stepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n if (reasoning_content) {\n this.handleContent(reasoning_content, ContentTypes.THINK);\n } else {\n this.handleContent(content, ContentTypes.TEXT);\n }\n }\n}\n"],"mappings":";;;;AAIA,MAAa,aAAa;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAa,qBAAb,MAAgC;CAC9B,cAAsB;CACtB,eAAuB;CACvB;CACA,SAAmB,CAAC;CACpB,YAAY;CACZ,kBAA4B,CAAC;CAC7B;CACA;CACA;CACA,gBAAgB;CAChB,eAAkD;CAClD,eAAe;CACf,iBAAiB;;CAEjB;CACA;CACA,YAAY,EACV,OACA,UACA,YACA,cACA,kBAOC;EACD,KAAK,QAAQ;EACb,KAAK,WAAW;EAChB,IAAI,cACF,KAAK,eAAe;EAEtB,IAAI,kBAAkB,MACpB,KAAK,iBAAiB;EAExB,KAAK,aAAa,cAAc;CAClC;CACA,qBAAyC;EACvC,MAAM,YAAY,KAAK;EACvB,IAAI,aAAa,QAAQ,WACvB,OAAO;CAGX;CACA,qBACE,SACqB;EACrB,IAAI,QAAQ,QAAQ,KAAK,gBAAgB,MACvC,KAAK,cAAc;EAErB,KAAK,gBAAgB;EACrB,KAAK,gBAAgB;EACrB,KAAK,gBAAgB,SAAA,GAAA,OAAA,OAAA,CAAe;EACpC,KAAK,mBAAmB,QAAA,GAAA,OAAA,OAAA,CAAc;EACtC,OAAO,CAAC,KAAK,eAAe,KAAK,gBAAgB;CACnD;CACA,mBAAmB,QAAgB,gBAAqC;EACtE,MAAM,UAAqB;GACzB,IAAI;GACJ,OAAO,KAAK;GACZ,MAAM,YAAY;GAClB,OAAO,KAAK;GACZ;EAEF;EACA,KAAK,WAAA,cAAmC,GAAG;GACzC,OAAA;GACA,MAAM;EACR,CAAC;CACH;CACA,wBAAwB,QAAgB,UAAgC;EACtE,MAAM,eAAoC;GACxC,IAAI;GACJ;EACF;EACA,KAAK,WAAA,mBAAwC,GAAG;GAC9C,OAAA;GACA,MAAM;EACR,CAAC;CACH;CACA,0BAA0B,QAAgB,UAAkC;EAC1E,MAAM,iBAAwC;GAC5C,IAAI;GACJ;EACF;EACA,KAAK,WAAA,qBAA0C,GAAG;GAChD,OAAA;GACA,MAAM;EACR,CAAC;CACH;CACA,iBACE,SACA,UACS;EACT,IAAI,OAAO;EACX,IAAI,KAAK,gBAAgB,SAAA,QACvB,OAAA;EAEF,IAAI,KAAK,YACP,IAAI,SAAA,SACF,KAAK,gBAAgB,KAAK,OAAO;OAEjC,KAAK,OAAO,KAAK,OAAO;EAI5B,IAAI,KAAK,gBAAgB,MAAM;GAC7B,MAAM,CAAC,WAAW,gBAAgB,KAAK,kBAAkB,IAAI;GAC7D,KAAK,gBAAgB,WAAW;IAC9B,MAAA;IACA,kBAAkB,EAChB,YAAY,aACd;GACF,CAAC;EACH;EAEA,MAAM,SAAS,KAAK,iBAAiB;EACrC,IAAI,SAAA,SACF,KAAK,uBAAuB,QAAQ,EAClC,SAAS,CACP;GACE,MAAA;GACA,OAAO;EACT,CACF,EACF,CAAC;OAED,KAAK,qBAAqB,QAAQ,EAChC,SAAS,CACP;GACE,MAAA;GACA,MAAM;EACR,CACF,EACF,CAAC;EAGH,KAAK,iBAAiB,QAAQ;EAC9B,IAAI,KAAK,aACP;EAGF,IACE,KAAK,gBAAgB,KAAK,kBAC1B,WAAW,MAAM,QAAQ,QAAQ,SAAS,GAAG,CAAC,GAC9C;GACA,MAAM,CAAC,WAAW,gBAAgB,KAAK,kBAAkB,IAAI;GAC7D,KAAK,gBAAgB,WAAW;IAC9B,MAAA;IACA,kBAAkB,EAChB,YAAY,aACd;GACF,CAAC;EACH;CACF;CACA,gBAAgB,OAA+B;EAC7C,QAAQ,OAAO,UAAU,EAAE,EAAE,MAAA,EAA8B,WAAW;CACxE;CACA,kBAAkB,OAA+B;EAC/C,QACG,OAAO,UAAU,EAAE,EAAE,MAAA,GAA+B,KAAK,iBAC1D;CAEJ;CACA,OAAO,OAA6B;EAClC,IAAI,CAAC,OACH;EAGF,MAAM,UAAU,KAAK,gBAAgB,KAAK;EAC1C,MAAM,oBAAoB,KAAK,kBAAkB,KAAK;EACtD,IAAI,CAAC,QAAQ,UAAU,CAAC,kBAAkB,QACxC;EAGF,IAAI,QAAQ,SAAS,KAAK,GACxB,KAAK,cAAc,CAAC,KAAK;EAG3B,IAAI,QAAQ,SAAS,SAAS,KAAK,CAAC,KAAK,aACvC,KAAK,eAAe;OACf,IAAI,KAAK,UAAU,SAAS,UAAU,KAAK,CAAC,KAAK,aACtD,KAAK,eAAe;EAGtB,KAAK,YAAY;EAIjB,IAAI,EAFe,KAAK,aAAa,KAAK,KAEzB;GACf,MAAM,qBAAqB,KAAK,eAAA,UAAA;GAGhC,MAAM,cAAc,oBAAA,UAEhB;GACJ,MAAM,CAAC,QAAQ,cAAc,KAAK,kBAAkB,WAAW;GAC/D,KAAK,gBAAgB,QAAQ;IAC3B,MAAA;IACA,kBAAkB,EAChB,WACF;GACF,CAAC;EACH;EAEA,IAAI,mBACF,KAAK,cAAc,mBAAA,OAAqC;OAExD,KAAK,cAAc,SAAA,MAA0B;CAEjD;AACF"}
@@ -1,150 +0,0 @@
1
- import "./common/enum.mjs";
2
- import "./common/index.mjs";
3
- import { nanoid } from "nanoid";
4
- //#region src/splitStream.ts
5
- const SEPARATORS = [
6
- ". ",
7
- "?",
8
- "!",
9
- "۔",
10
- "- ",
11
- "。",
12
- "‥",
13
- ";",
14
- "¡",
15
- "¿",
16
- "\n",
17
- "```"
18
- ];
19
- var SplitStreamHandler = class {
20
- inCodeBlock = false;
21
- inThinkBlock = false;
22
- accumulate;
23
- tokens = [];
24
- lastToken = "";
25
- reasoningTokens = [];
26
- currentStepId;
27
- currentMessageId;
28
- currentType;
29
- currentLength = 0;
30
- reasoningKey = "reasoning_content";
31
- currentIndex = -1;
32
- blockThreshold = 4500;
33
- /** The run ID AKA the Message ID associated with the complete generation */
34
- runId;
35
- handlers;
36
- constructor({ runId, handlers, accumulate, reasoningKey, blockThreshold }) {
37
- this.runId = runId;
38
- this.handlers = handlers;
39
- if (reasoningKey) this.reasoningKey = reasoningKey;
40
- if (blockThreshold != null) this.blockThreshold = blockThreshold;
41
- this.accumulate = accumulate ?? false;
42
- }
43
- getMessageId = () => {
44
- const messageId = this.currentMessageId;
45
- if (messageId != null && messageId) return messageId;
46
- };
47
- createMessageStep = (type) => {
48
- if (type != null && this.currentType !== type) this.currentType = type;
49
- this.currentLength = 0;
50
- this.currentIndex += 1;
51
- this.currentStepId = `step_${nanoid()}`;
52
- this.currentMessageId = `msg_${nanoid()}`;
53
- return [this.currentStepId, this.currentMessageId];
54
- };
55
- dispatchRunStep = (stepId, stepDetails) => {
56
- const runStep = {
57
- id: stepId,
58
- runId: this.runId,
59
- type: stepDetails.type,
60
- index: this.currentIndex,
61
- stepDetails
62
- };
63
- this.handlers?.["on_run_step"]?.({
64
- event: "on_run_step",
65
- data: runStep
66
- });
67
- };
68
- dispatchMessageDelta = (stepId, delta) => {
69
- const messageDelta = {
70
- id: stepId,
71
- delta
72
- };
73
- this.handlers?.["on_message_delta"]?.({
74
- event: "on_message_delta",
75
- data: messageDelta
76
- });
77
- };
78
- dispatchReasoningDelta = (stepId, delta) => {
79
- const reasoningDelta = {
80
- id: stepId,
81
- delta
82
- };
83
- this.handlers?.["on_reasoning_delta"]?.({
84
- event: "on_reasoning_delta",
85
- data: reasoningDelta
86
- });
87
- };
88
- handleContent = (content, _type) => {
89
- let type = _type;
90
- if (this.inThinkBlock && type === "text") type = "think";
91
- if (this.accumulate) if (type === "think") this.reasoningTokens.push(content);
92
- else this.tokens.push(content);
93
- if (this.currentType !== type) {
94
- const [newStepId, newMessageId] = this.createMessageStep(type);
95
- this.dispatchRunStep(newStepId, {
96
- type: "message_creation",
97
- message_creation: { message_id: newMessageId }
98
- });
99
- }
100
- const stepId = this.currentStepId ?? "";
101
- if (type === "think") this.dispatchReasoningDelta(stepId, { content: [{
102
- type: "think",
103
- think: content
104
- }] });
105
- else this.dispatchMessageDelta(stepId, { content: [{
106
- type: "text",
107
- text: content
108
- }] });
109
- this.currentLength += content.length;
110
- if (this.inCodeBlock) return;
111
- if (this.currentLength > this.blockThreshold && SEPARATORS.some((sep) => content.includes(sep))) {
112
- const [newStepId, newMessageId] = this.createMessageStep(type);
113
- this.dispatchRunStep(newStepId, {
114
- type: "message_creation",
115
- message_creation: { message_id: newMessageId }
116
- });
117
- }
118
- };
119
- getDeltaContent(chunk) {
120
- return (chunk?.choices?.[0]?.delta)?.content ?? "";
121
- }
122
- getReasoningDelta(chunk) {
123
- return (chunk?.choices?.[0]?.delta)?.[this.reasoningKey] ?? "";
124
- }
125
- handle(chunk) {
126
- if (!chunk) return;
127
- const content = this.getDeltaContent(chunk);
128
- const reasoning_content = this.getReasoningDelta(chunk);
129
- if (!content.length && !reasoning_content.length) return;
130
- if (content.includes("```")) this.inCodeBlock = !this.inCodeBlock;
131
- if (content.includes("<think>") && !this.inCodeBlock) this.inThinkBlock = true;
132
- else if (this.lastToken.includes("</think>") && !this.inCodeBlock) this.inThinkBlock = false;
133
- this.lastToken = content;
134
- if (!(this.getMessageId() ?? "")) {
135
- const initialContentType = this.inThinkBlock ? "think" : "text";
136
- const initialType = reasoning_content ? "think" : initialContentType;
137
- const [stepId, message_id] = this.createMessageStep(initialType);
138
- this.dispatchRunStep(stepId, {
139
- type: "message_creation",
140
- message_creation: { message_id }
141
- });
142
- }
143
- if (reasoning_content) this.handleContent(reasoning_content, "think");
144
- else this.handleContent(content, "text");
145
- }
146
- };
147
- //#endregion
148
- export { SEPARATORS, SplitStreamHandler };
149
-
150
- //# sourceMappingURL=splitStream.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"splitStream.mjs","names":[],"sources":["../../src/splitStream.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes } from '@/common';\n\nexport const SEPARATORS = [\n '. ',\n '?',\n '!',\n '۔',\n '- ',\n '。',\n '‥',\n ';',\n '¡',\n '¿',\n '\\n',\n '```',\n];\n\nexport class SplitStreamHandler {\n private inCodeBlock = false;\n private inThinkBlock = false;\n private accumulate: boolean;\n tokens: string[] = [];\n lastToken = '';\n reasoningTokens: string[] = [];\n currentStepId?: string;\n currentMessageId?: string;\n currentType?: ContentTypes.TEXT | ContentTypes.THINK;\n currentLength = 0;\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentIndex = -1;\n blockThreshold = 4500;\n /** The run ID AKA the Message ID associated with the complete generation */\n runId: string;\n handlers?: t.SplitStreamHandlers;\n constructor({\n runId,\n handlers,\n accumulate,\n reasoningKey,\n blockThreshold,\n }: {\n runId: string;\n accumulate?: boolean;\n handlers: t.SplitStreamHandlers;\n blockThreshold?: number;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n }) {\n this.runId = runId;\n this.handlers = handlers;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (blockThreshold != null) {\n this.blockThreshold = blockThreshold;\n }\n this.accumulate = accumulate ?? false;\n }\n getMessageId = (): string | undefined => {\n const messageId = this.currentMessageId;\n if (messageId != null && messageId) {\n return messageId;\n }\n return undefined;\n };\n createMessageStep = (\n type?: ContentTypes.TEXT | ContentTypes.THINK\n ): [string, string] => {\n if (type != null && this.currentType !== type) {\n this.currentType = type;\n }\n this.currentLength = 0;\n this.currentIndex += 1;\n this.currentStepId = `step_${nanoid()}`;\n this.currentMessageId = `msg_${nanoid()}`;\n return [this.currentStepId, this.currentMessageId];\n };\n dispatchRunStep = (stepId: string, stepDetails: t.StepDetails): void => {\n const runStep: t.RunStep = {\n id: stepId,\n runId: this.runId,\n type: stepDetails.type,\n index: this.currentIndex,\n stepDetails,\n // usage: null,\n };\n this.handlers?.[GraphEvents.ON_RUN_STEP]?.({\n event: GraphEvents.ON_RUN_STEP,\n data: runStep,\n });\n };\n dispatchMessageDelta = (stepId: string, delta: t.MessageDelta): void => {\n const messageDelta: t.MessageDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_MESSAGE_DELTA]?.({\n event: GraphEvents.ON_MESSAGE_DELTA,\n data: messageDelta,\n });\n };\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_REASONING_DELTA]?.({\n event: GraphEvents.ON_REASONING_DELTA,\n data: reasoningDelta,\n });\n };\n handleContent = (\n content: string,\n _type: ContentTypes.TEXT | ContentTypes.THINK\n ): void => {\n let type = _type;\n if (this.inThinkBlock && type === ContentTypes.TEXT) {\n type = ContentTypes.THINK;\n }\n if (this.accumulate) {\n if (type === ContentTypes.THINK) {\n this.reasoningTokens.push(content);\n } else {\n this.tokens.push(content);\n }\n }\n\n if (this.currentType !== type) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n\n const stepId = this.currentStepId ?? '';\n if (type === ContentTypes.THINK) {\n this.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n } else {\n this.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n }\n\n this.currentLength += content.length;\n if (this.inCodeBlock) {\n return;\n }\n\n if (\n this.currentLength > this.blockThreshold &&\n SEPARATORS.some((sep) => content.includes(sep))\n ) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n };\n getDeltaContent(chunk?: t.CustomChunk): string {\n return (chunk?.choices?.[0]?.delta as t.CustomChunkDelta)?.content ?? '';\n }\n getReasoningDelta(chunk?: t.CustomChunk): string {\n return (\n (chunk?.choices?.[0]?.delta as t.CustomChunkDelta)?.[this.reasoningKey] ??\n ''\n );\n }\n handle(chunk?: t.CustomChunk): void {\n if (!chunk) {\n return;\n }\n\n const content = this.getDeltaContent(chunk);\n const reasoning_content = this.getReasoningDelta(chunk);\n if (!content.length && !reasoning_content.length) {\n return;\n }\n\n if (content.includes('```')) {\n this.inCodeBlock = !this.inCodeBlock;\n }\n\n if (content.includes('<think>') && !this.inCodeBlock) {\n this.inThinkBlock = true;\n } else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {\n this.inThinkBlock = false;\n }\n\n this.lastToken = content;\n\n const message_id = this.getMessageId() ?? '';\n\n if (!message_id) {\n const initialContentType = this.inThinkBlock\n ? ContentTypes.THINK\n : ContentTypes.TEXT;\n const initialType = reasoning_content\n ? ContentTypes.THINK\n : initialContentType;\n const [stepId, message_id] = this.createMessageStep(initialType);\n this.dispatchRunStep(stepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n if (reasoning_content) {\n this.handleContent(reasoning_content, ContentTypes.THINK);\n } else {\n this.handleContent(content, ContentTypes.TEXT);\n }\n }\n}\n"],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- import type * as t from '@/types';
2
- export declare const createMockStream: (options?: {
3
- text?: string;
4
- reasoningText?: string;
5
- streamRate?: number;
6
- reasoningKey?: "reasoning" | "reasoning_content";
7
- }) => () => AsyncGenerator<t.CustomChunk>;
8
- /**
9
- (async function testStream(): Promise<void> {
10
- const runId = nanoid();
11
-
12
- const streamHandler = new SplitStreamHandler({
13
- runId,
14
- handlers: {
15
- [GraphEvents.ON_RUN_STEP]: (data): void => {
16
- console.dir(data, { depth: null });
17
- },
18
- [GraphEvents.ON_MESSAGE_DELTA]: (): void => {
19
- // console.dir(data, { depth: null });
20
- },
21
- },
22
- });
23
- const stream = createMockStream({
24
- reasoningText: 'This is a test reasoning text.',
25
- streamRate: 5,
26
- })();
27
-
28
- for await (const chunk of stream) {
29
- streamHandler.handle(chunk);
30
- }
31
- })();
32
- */
@@ -1,37 +0,0 @@
1
- import type * as t from '@/types';
2
- import { ContentTypes } from '@/common';
3
- export declare const SEPARATORS: string[];
4
- export declare class SplitStreamHandler {
5
- private inCodeBlock;
6
- private inThinkBlock;
7
- private accumulate;
8
- tokens: string[];
9
- lastToken: string;
10
- reasoningTokens: string[];
11
- currentStepId?: string;
12
- currentMessageId?: string;
13
- currentType?: ContentTypes.TEXT | ContentTypes.THINK;
14
- currentLength: number;
15
- reasoningKey: 'reasoning_content' | 'reasoning';
16
- currentIndex: number;
17
- blockThreshold: number;
18
- /** The run ID AKA the Message ID associated with the complete generation */
19
- runId: string;
20
- handlers?: t.SplitStreamHandlers;
21
- constructor({ runId, handlers, accumulate, reasoningKey, blockThreshold, }: {
22
- runId: string;
23
- accumulate?: boolean;
24
- handlers: t.SplitStreamHandlers;
25
- blockThreshold?: number;
26
- reasoningKey?: 'reasoning_content' | 'reasoning';
27
- });
28
- getMessageId: () => string | undefined;
29
- createMessageStep: (type?: ContentTypes.TEXT | ContentTypes.THINK) => [string, string];
30
- dispatchRunStep: (stepId: string, stepDetails: t.StepDetails) => void;
31
- dispatchMessageDelta: (stepId: string, delta: t.MessageDelta) => void;
32
- dispatchReasoningDelta: (stepId: string, delta: t.ReasoningDelta) => void;
33
- handleContent: (content: string, _type: ContentTypes.TEXT | ContentTypes.THINK) => void;
34
- getDeltaContent(chunk?: t.CustomChunk): string;
35
- getReasoningDelta(chunk?: t.CustomChunk): string;
36
- handle(chunk?: t.CustomChunk): void;
37
- }
package/src/mockStream.ts DELETED
@@ -1,99 +0,0 @@
1
-
2
- // import { nanoid } from 'nanoid';
3
- import type OpenAITypes from 'openai';
4
- import type * as t from '@/types';
5
- // import { SplitStreamHandler } from '@/splitStream';
6
- // import { GraphEvents } from '@/common';
7
- import { sleep } from '@/utils';
8
-
9
- const choiceProps: OpenAITypes.Chat.Completions.ChatCompletionChunk.Choice = { finish_reason: null, index: 0, delta: {} };
10
- const reasoningSplitRegex = /(?<=\s+)|(?=\s+)/;
11
- const contentSplitRegex = /(?<=<\/?think>)|(?=<\/?think>)|(?<=\s+)|(?=\s+)/;
12
- export const createMockStream = (options: {
13
- text?: string;
14
- reasoningText?: string;
15
- streamRate?: number;
16
- reasoningKey?: 'reasoning' | 'reasoning_content';
17
- } = {}) => {
18
- const {
19
- text,
20
- reasoningText,
21
- streamRate = 25,
22
- reasoningKey = 'reasoning_content'
23
- } = options;
24
-
25
- return async function* mockOpenAIStream(): AsyncGenerator<t.CustomChunk> {
26
- const content = text ?? `Here's a sample message that includes code:
27
- \`\`\`python
28
- def hello_world():
29
- print("Hello, World!")
30
- # This is a long code block
31
- # That shouldn't be split
32
- return True
33
- \`\`\`
34
- Now we're back to regular text. This is a very long sentence that should probably be split at some point because it exceeds our threshold and contains multiple natural breaking points. Let's see how it handles this case properly.
35
-
36
- Here's another code block:
37
- \`\`\`javascript
38
- console.log("Another test");
39
- // More code here
40
- \`\`\`
41
- And finally some more regular text to test our splitting logic.`;
42
-
43
- if (reasoningText != null && reasoningText) {
44
- // Split reasoning text into "token-like" chunks
45
- const reasoningTokens = reasoningText.split(reasoningSplitRegex);
46
- for (const token of reasoningTokens) {
47
- yield {
48
- choices: [{
49
- ...choiceProps,
50
- delta: {
51
- [reasoningKey]: token,
52
- },
53
- }]
54
- };
55
- await sleep(streamRate);
56
- }
57
- }
58
-
59
- // Split main content into "token-like" chunks
60
- const tokens = content.split(contentSplitRegex);
61
- for (const token of tokens) {
62
- yield {
63
- choices: [{
64
- ...choiceProps,
65
- delta: {
66
- content: token
67
- }
68
- }]
69
- };
70
- await sleep(streamRate);
71
- }
72
- };
73
- };
74
-
75
- /**
76
- (async function testStream(): Promise<void> {
77
- const runId = nanoid();
78
-
79
- const streamHandler = new SplitStreamHandler({
80
- runId,
81
- handlers: {
82
- [GraphEvents.ON_RUN_STEP]: (data): void => {
83
- console.dir(data, { depth: null });
84
- },
85
- [GraphEvents.ON_MESSAGE_DELTA]: (): void => {
86
- // console.dir(data, { depth: null });
87
- },
88
- },
89
- });
90
- const stream = createMockStream({
91
- reasoningText: 'This is a test reasoning text.',
92
- streamRate: 5,
93
- })();
94
-
95
- for await (const chunk of stream) {
96
- streamHandler.handle(chunk);
97
- }
98
- })();
99
- */