@librechat/agents 3.3.4 → 3.3.6

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 (263) hide show
  1. package/dist/cjs/common/constants.cjs +21 -0
  2. package/dist/cjs/common/constants.cjs.map +1 -1
  3. package/dist/cjs/events.cjs +10 -1
  4. package/dist/cjs/events.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +456 -7
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/hooks/HookRegistry.cjs +25 -0
  8. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  9. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +1 -1
  10. package/dist/cjs/hooks/index.cjs +12 -0
  11. package/dist/cjs/hooks/index.cjs.map +1 -1
  12. package/dist/cjs/hooks/types.cjs +1 -0
  13. package/dist/cjs/hooks/types.cjs.map +1 -1
  14. package/dist/cjs/langfuse.cjs +8 -0
  15. package/dist/cjs/langfuse.cjs.map +1 -1
  16. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +1 -3
  17. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  18. package/dist/cjs/llm/invoke.cjs +268 -3
  19. package/dist/cjs/llm/invoke.cjs.map +1 -1
  20. package/dist/cjs/llm/openai/index.cjs +51 -6
  21. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  22. package/dist/cjs/llm/preempt.cjs +132 -0
  23. package/dist/cjs/llm/preempt.cjs.map +1 -0
  24. package/dist/cjs/main.cjs +31 -3
  25. package/dist/cjs/messages/alternation.cjs +92 -0
  26. package/dist/cjs/messages/alternation.cjs.map +1 -0
  27. package/dist/cjs/messages/format.cjs +72 -0
  28. package/dist/cjs/messages/format.cjs.map +1 -1
  29. package/dist/cjs/messages/handoffCue.cjs +63 -0
  30. package/dist/cjs/messages/handoffCue.cjs.map +1 -0
  31. package/dist/cjs/messages/index.cjs +3 -0
  32. package/dist/cjs/messages/injected.cjs +60 -0
  33. package/dist/cjs/messages/injected.cjs.map +1 -0
  34. package/dist/cjs/run.cjs +80 -7
  35. package/dist/cjs/run.cjs.map +1 -1
  36. package/dist/cjs/session/JsonlSessionStore.cjs +1 -1
  37. package/dist/cjs/session/handlers.cjs +18 -9
  38. package/dist/cjs/session/handlers.cjs.map +1 -1
  39. package/dist/cjs/stream.cjs +34 -8
  40. package/dist/cjs/stream.cjs.map +1 -1
  41. package/dist/cjs/tools/BashExecutor.cjs +3 -1
  42. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  43. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +2 -0
  44. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  45. package/dist/cjs/tools/CodeExecutor.cjs +19 -16
  46. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  47. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +2 -0
  48. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  49. package/dist/cjs/tools/ReadFile.cjs +8 -4
  50. package/dist/cjs/tools/ReadFile.cjs.map +1 -1
  51. package/dist/cjs/tools/SkillTool.cjs +2 -0
  52. package/dist/cjs/tools/SkillTool.cjs.map +1 -1
  53. package/dist/cjs/tools/SubagentTool.cjs +3 -0
  54. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  55. package/dist/cjs/tools/ToolNode.cjs +91 -50
  56. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  57. package/dist/cjs/tools/ToolSearch.cjs +5 -1
  58. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  59. package/dist/cjs/tools/intentArg.cjs +230 -0
  60. package/dist/cjs/tools/intentArg.cjs.map +1 -0
  61. package/dist/cjs/tools/local/CompileCheckTool.cjs +3 -2
  62. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  63. package/dist/cjs/tools/local/LocalCodingTools.cjs +13 -12
  64. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  65. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +2 -2
  66. package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
  67. package/dist/cjs/tools/search/keenable-scraper.cjs +90 -0
  68. package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -0
  69. package/dist/cjs/tools/search/schema.cjs +2 -0
  70. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  71. package/dist/cjs/tools/search/tool.cjs +40 -2
  72. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  73. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -0
  74. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  75. package/dist/cjs/tools/toolOutputReferences.cjs +41 -7
  76. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  77. package/dist/esm/common/constants.mjs +19 -1
  78. package/dist/esm/common/constants.mjs.map +1 -1
  79. package/dist/esm/events.mjs +10 -1
  80. package/dist/esm/events.mjs.map +1 -1
  81. package/dist/esm/graphs/Graph.mjs +455 -6
  82. package/dist/esm/graphs/Graph.mjs.map +1 -1
  83. package/dist/esm/hooks/HookRegistry.mjs +25 -0
  84. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  85. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +1 -1
  86. package/dist/esm/hooks/index.mjs +12 -1
  87. package/dist/esm/hooks/index.mjs.map +1 -1
  88. package/dist/esm/hooks/types.mjs +1 -0
  89. package/dist/esm/hooks/types.mjs.map +1 -1
  90. package/dist/esm/langfuse.mjs +9 -1
  91. package/dist/esm/langfuse.mjs.map +1 -1
  92. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +1 -3
  93. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  94. package/dist/esm/llm/invoke.mjs +270 -6
  95. package/dist/esm/llm/invoke.mjs.map +1 -1
  96. package/dist/esm/llm/openai/index.mjs +51 -6
  97. package/dist/esm/llm/openai/index.mjs.map +1 -1
  98. package/dist/esm/llm/preempt.mjs +131 -0
  99. package/dist/esm/llm/preempt.mjs.map +1 -0
  100. package/dist/esm/main.mjs +11 -7
  101. package/dist/esm/messages/alternation.mjs +91 -0
  102. package/dist/esm/messages/alternation.mjs.map +1 -0
  103. package/dist/esm/messages/format.mjs +72 -0
  104. package/dist/esm/messages/format.mjs.map +1 -1
  105. package/dist/esm/messages/handoffCue.mjs +61 -0
  106. package/dist/esm/messages/handoffCue.mjs.map +1 -0
  107. package/dist/esm/messages/index.mjs +3 -0
  108. package/dist/esm/messages/injected.mjs +60 -0
  109. package/dist/esm/messages/injected.mjs.map +1 -0
  110. package/dist/esm/run.mjs +80 -7
  111. package/dist/esm/run.mjs.map +1 -1
  112. package/dist/esm/session/JsonlSessionStore.mjs +1 -1
  113. package/dist/esm/session/handlers.mjs +19 -10
  114. package/dist/esm/session/handlers.mjs.map +1 -1
  115. package/dist/esm/stream.mjs +33 -9
  116. package/dist/esm/stream.mjs.map +1 -1
  117. package/dist/esm/tools/BashExecutor.mjs +3 -1
  118. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  119. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +2 -0
  120. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  121. package/dist/esm/tools/CodeExecutor.mjs +19 -16
  122. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  123. package/dist/esm/tools/ProgrammaticToolCalling.mjs +2 -0
  124. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  125. package/dist/esm/tools/ReadFile.mjs +8 -4
  126. package/dist/esm/tools/ReadFile.mjs.map +1 -1
  127. package/dist/esm/tools/SkillTool.mjs +2 -0
  128. package/dist/esm/tools/SkillTool.mjs.map +1 -1
  129. package/dist/esm/tools/SubagentTool.mjs +3 -0
  130. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  131. package/dist/esm/tools/ToolNode.mjs +91 -51
  132. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  133. package/dist/esm/tools/ToolSearch.mjs +5 -1
  134. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  135. package/dist/esm/tools/intentArg.mjs +220 -0
  136. package/dist/esm/tools/intentArg.mjs.map +1 -0
  137. package/dist/esm/tools/local/CompileCheckTool.mjs +3 -2
  138. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  139. package/dist/esm/tools/local/LocalCodingTools.mjs +13 -12
  140. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  141. package/dist/esm/tools/local/LocalExecutionEngine.mjs +2 -2
  142. package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
  143. package/dist/esm/tools/search/keenable-scraper.mjs +88 -0
  144. package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -0
  145. package/dist/esm/tools/search/schema.mjs +2 -0
  146. package/dist/esm/tools/search/schema.mjs.map +1 -1
  147. package/dist/esm/tools/search/tool.mjs +40 -3
  148. package/dist/esm/tools/search/tool.mjs.map +1 -1
  149. package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -0
  150. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  151. package/dist/esm/tools/toolOutputReferences.mjs +41 -7
  152. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  153. package/dist/types/common/constants.d.ts +18 -0
  154. package/dist/types/graphs/Graph.d.ts +138 -1
  155. package/dist/types/hooks/HookRegistry.d.ts +15 -0
  156. package/dist/types/hooks/index.d.ts +12 -1
  157. package/dist/types/hooks/types.d.ts +45 -6
  158. package/dist/types/index.d.ts +2 -1
  159. package/dist/types/llm/invoke.d.ts +7 -0
  160. package/dist/types/llm/openai/index.d.ts +0 -11
  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/handoffCue.d.ts +40 -0
  164. package/dist/types/messages/index.d.ts +3 -0
  165. package/dist/types/messages/injected.d.ts +3 -0
  166. package/dist/types/run.d.ts +7 -0
  167. package/dist/types/stream.d.ts +14 -0
  168. package/dist/types/tools/BashExecutor.d.ts +18 -0
  169. package/dist/types/tools/CodeExecutor.d.ts +18 -0
  170. package/dist/types/tools/ReadFile.d.ts +18 -0
  171. package/dist/types/tools/SkillTool.d.ts +18 -0
  172. package/dist/types/tools/SubagentTool.d.ts +9 -0
  173. package/dist/types/tools/ToolNode.d.ts +37 -12
  174. package/dist/types/tools/ToolSearch.d.ts +18 -0
  175. package/dist/types/tools/intentArg.d.ts +119 -0
  176. package/dist/types/tools/ptcTimeout.d.ts +2 -0
  177. package/dist/types/tools/search/keenable-scraper.d.ts +15 -0
  178. package/dist/types/tools/search/schema.d.ts +18 -0
  179. package/dist/types/tools/search/tool.d.ts +18 -0
  180. package/dist/types/tools/search/types.d.ts +31 -2
  181. package/dist/types/tools/toolOutputReferences.d.ts +12 -2
  182. package/dist/types/types/graph.d.ts +8 -1
  183. package/dist/types/types/run.d.ts +65 -0
  184. package/dist/types/types/stream.d.ts +12 -25
  185. package/dist/types/types/tools.d.ts +27 -2
  186. package/package.json +1 -1
  187. package/src/{splitStream.test.ts → aggregator.test.ts} +59 -666
  188. package/src/common/constants.ts +21 -0
  189. package/src/events.ts +15 -1
  190. package/src/graphs/Graph.ts +568 -3
  191. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +18 -7
  192. package/src/graphs/__tests__/Graph.preemptSignal.test.ts +126 -0
  193. package/src/hooks/HookRegistry.ts +40 -0
  194. package/src/hooks/__tests__/preemptBoundary.test.ts +152 -0
  195. package/src/hooks/index.ts +16 -2
  196. package/src/hooks/types.ts +47 -3
  197. package/src/index.ts +2 -1
  198. package/src/langfuse.ts +26 -1
  199. package/src/llm/bedrock/utils/message_inputs.test.ts +82 -0
  200. package/src/llm/bedrock/utils/message_inputs.ts +14 -11
  201. package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +15 -0
  202. package/src/llm/invoke.alternation.test.ts +87 -0
  203. package/src/llm/invoke.handoffCue.test.ts +112 -0
  204. package/src/llm/invoke.ts +417 -8
  205. package/src/llm/openai/index.ts +74 -10
  206. package/src/llm/openai/llm.spec.ts +105 -0
  207. package/src/llm/preempt.test.ts +323 -0
  208. package/src/llm/preempt.ts +178 -0
  209. package/src/messages/alternation.test.ts +212 -0
  210. package/src/messages/alternation.ts +112 -0
  211. package/src/messages/format.ts +91 -0
  212. package/src/messages/formatAgentMessages.steer.test.ts +267 -0
  213. package/src/messages/handoffCue.test.ts +96 -0
  214. package/src/messages/handoffCue.ts +78 -0
  215. package/src/messages/index.ts +3 -0
  216. package/src/messages/injected.test.ts +90 -0
  217. package/src/messages/injected.ts +74 -0
  218. package/src/run.ts +91 -6
  219. package/src/scripts/preempt-probe.ts +330 -0
  220. package/src/scripts/preempt-scenarios.ts +388 -0
  221. package/src/session/handlers.ts +32 -12
  222. package/src/specs/handoffCue.test.ts +165 -0
  223. package/src/specs/langfuse-callbacks.test.ts +352 -2
  224. package/src/specs/preemptSeal.test.ts +309 -0
  225. package/src/stream.dispatch.test.ts +63 -0
  226. package/src/stream.ts +48 -9
  227. package/src/tools/BashExecutor.ts +6 -0
  228. package/src/tools/BashProgrammaticToolCalling.ts +2 -0
  229. package/src/tools/CodeExecutor.ts +6 -0
  230. package/src/tools/ProgrammaticToolCalling.ts +2 -0
  231. package/src/tools/ReadFile.ts +2 -0
  232. package/src/tools/SkillTool.ts +2 -0
  233. package/src/tools/SubagentTool.ts +3 -0
  234. package/src/tools/ToolNode.ts +193 -74
  235. package/src/tools/ToolSearch.ts +3 -0
  236. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +174 -0
  237. package/src/tools/__tests__/intentArg.test.ts +281 -0
  238. package/src/tools/__tests__/intentCoverage.test.ts +139 -0
  239. package/src/tools/__tests__/toolOutputReferences.test.ts +83 -0
  240. package/src/tools/intentArg.ts +323 -0
  241. package/src/tools/local/CompileCheckTool.ts +4 -3
  242. package/src/tools/local/LocalCodingTools.ts +14 -13
  243. package/src/tools/ptcTimeout.ts +2 -0
  244. package/src/tools/search/keenable-scraper.test.ts +153 -0
  245. package/src/tools/search/keenable-scraper.ts +137 -0
  246. package/src/tools/search/outcome.test.ts +90 -0
  247. package/src/tools/search/schema.ts +3 -0
  248. package/src/tools/search/tool.ts +60 -3
  249. package/src/tools/search/types.ts +50 -3
  250. package/src/tools/subagent/SubagentExecutor.ts +2 -1
  251. package/src/tools/toolOutputReferences.ts +77 -9
  252. package/src/types/graph.ts +12 -1
  253. package/src/types/run.ts +67 -0
  254. package/src/types/stream.ts +12 -41
  255. package/src/types/tools.ts +24 -2
  256. package/dist/cjs/splitStream.cjs +0 -151
  257. package/dist/cjs/splitStream.cjs.map +0 -1
  258. package/dist/esm/splitStream.mjs +0 -150
  259. package/dist/esm/splitStream.mjs.map +0 -1
  260. package/dist/types/mockStream.d.ts +0 -32
  261. package/dist/types/splitStream.d.ts +0 -37
  262. package/src/mockStream.ts +0 -99
  263. package/src/splitStream.ts +0 -234
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
- */
@@ -1,234 +0,0 @@
1
- import { nanoid } from 'nanoid';
2
- import type * as t from '@/types';
3
- import { ContentTypes, GraphEvents, StepTypes } from '@/common';
4
-
5
- export const SEPARATORS = [
6
- '. ',
7
- '?',
8
- '!',
9
- '۔',
10
- '- ',
11
- '。',
12
- '‥',
13
- ';',
14
- '¡',
15
- '¿',
16
- '\n',
17
- '```',
18
- ];
19
-
20
- export class SplitStreamHandler {
21
- private inCodeBlock = false;
22
- private inThinkBlock = false;
23
- private accumulate: boolean;
24
- tokens: string[] = [];
25
- lastToken = '';
26
- reasoningTokens: string[] = [];
27
- currentStepId?: string;
28
- currentMessageId?: string;
29
- currentType?: ContentTypes.TEXT | ContentTypes.THINK;
30
- currentLength = 0;
31
- reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';
32
- currentIndex = -1;
33
- blockThreshold = 4500;
34
- /** The run ID AKA the Message ID associated with the complete generation */
35
- runId: string;
36
- handlers?: t.SplitStreamHandlers;
37
- constructor({
38
- runId,
39
- handlers,
40
- accumulate,
41
- reasoningKey,
42
- blockThreshold,
43
- }: {
44
- runId: string;
45
- accumulate?: boolean;
46
- handlers: t.SplitStreamHandlers;
47
- blockThreshold?: number;
48
- reasoningKey?: 'reasoning_content' | 'reasoning';
49
- }) {
50
- this.runId = runId;
51
- this.handlers = handlers;
52
- if (reasoningKey) {
53
- this.reasoningKey = reasoningKey;
54
- }
55
- if (blockThreshold != null) {
56
- this.blockThreshold = blockThreshold;
57
- }
58
- this.accumulate = accumulate ?? false;
59
- }
60
- getMessageId = (): string | undefined => {
61
- const messageId = this.currentMessageId;
62
- if (messageId != null && messageId) {
63
- return messageId;
64
- }
65
- return undefined;
66
- };
67
- createMessageStep = (
68
- type?: ContentTypes.TEXT | ContentTypes.THINK
69
- ): [string, string] => {
70
- if (type != null && this.currentType !== type) {
71
- this.currentType = type;
72
- }
73
- this.currentLength = 0;
74
- this.currentIndex += 1;
75
- this.currentStepId = `step_${nanoid()}`;
76
- this.currentMessageId = `msg_${nanoid()}`;
77
- return [this.currentStepId, this.currentMessageId];
78
- };
79
- dispatchRunStep = (stepId: string, stepDetails: t.StepDetails): void => {
80
- const runStep: t.RunStep = {
81
- id: stepId,
82
- runId: this.runId,
83
- type: stepDetails.type,
84
- index: this.currentIndex,
85
- stepDetails,
86
- // usage: null,
87
- };
88
- this.handlers?.[GraphEvents.ON_RUN_STEP]?.({
89
- event: GraphEvents.ON_RUN_STEP,
90
- data: runStep,
91
- });
92
- };
93
- dispatchMessageDelta = (stepId: string, delta: t.MessageDelta): void => {
94
- const messageDelta: t.MessageDeltaEvent = {
95
- id: stepId,
96
- delta,
97
- };
98
- this.handlers?.[GraphEvents.ON_MESSAGE_DELTA]?.({
99
- event: GraphEvents.ON_MESSAGE_DELTA,
100
- data: messageDelta,
101
- });
102
- };
103
- dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {
104
- const reasoningDelta: t.ReasoningDeltaEvent = {
105
- id: stepId,
106
- delta,
107
- };
108
- this.handlers?.[GraphEvents.ON_REASONING_DELTA]?.({
109
- event: GraphEvents.ON_REASONING_DELTA,
110
- data: reasoningDelta,
111
- });
112
- };
113
- handleContent = (
114
- content: string,
115
- _type: ContentTypes.TEXT | ContentTypes.THINK
116
- ): void => {
117
- let type = _type;
118
- if (this.inThinkBlock && type === ContentTypes.TEXT) {
119
- type = ContentTypes.THINK;
120
- }
121
- if (this.accumulate) {
122
- if (type === ContentTypes.THINK) {
123
- this.reasoningTokens.push(content);
124
- } else {
125
- this.tokens.push(content);
126
- }
127
- }
128
-
129
- if (this.currentType !== type) {
130
- const [newStepId, newMessageId] = this.createMessageStep(type);
131
- this.dispatchRunStep(newStepId, {
132
- type: StepTypes.MESSAGE_CREATION,
133
- message_creation: {
134
- message_id: newMessageId,
135
- },
136
- });
137
- }
138
-
139
- const stepId = this.currentStepId ?? '';
140
- if (type === ContentTypes.THINK) {
141
- this.dispatchReasoningDelta(stepId, {
142
- content: [
143
- {
144
- type: ContentTypes.THINK,
145
- think: content,
146
- },
147
- ],
148
- });
149
- } else {
150
- this.dispatchMessageDelta(stepId, {
151
- content: [
152
- {
153
- type: ContentTypes.TEXT,
154
- text: content,
155
- },
156
- ],
157
- });
158
- }
159
-
160
- this.currentLength += content.length;
161
- if (this.inCodeBlock) {
162
- return;
163
- }
164
-
165
- if (
166
- this.currentLength > this.blockThreshold &&
167
- SEPARATORS.some((sep) => content.includes(sep))
168
- ) {
169
- const [newStepId, newMessageId] = this.createMessageStep(type);
170
- this.dispatchRunStep(newStepId, {
171
- type: StepTypes.MESSAGE_CREATION,
172
- message_creation: {
173
- message_id: newMessageId,
174
- },
175
- });
176
- }
177
- };
178
- getDeltaContent(chunk?: t.CustomChunk): string {
179
- return (chunk?.choices?.[0]?.delta as t.CustomChunkDelta)?.content ?? '';
180
- }
181
- getReasoningDelta(chunk?: t.CustomChunk): string {
182
- return (
183
- (chunk?.choices?.[0]?.delta as t.CustomChunkDelta)?.[this.reasoningKey] ??
184
- ''
185
- );
186
- }
187
- handle(chunk?: t.CustomChunk): void {
188
- if (!chunk) {
189
- return;
190
- }
191
-
192
- const content = this.getDeltaContent(chunk);
193
- const reasoning_content = this.getReasoningDelta(chunk);
194
- if (!content.length && !reasoning_content.length) {
195
- return;
196
- }
197
-
198
- if (content.includes('```')) {
199
- this.inCodeBlock = !this.inCodeBlock;
200
- }
201
-
202
- if (content.includes('<think>') && !this.inCodeBlock) {
203
- this.inThinkBlock = true;
204
- } else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {
205
- this.inThinkBlock = false;
206
- }
207
-
208
- this.lastToken = content;
209
-
210
- const message_id = this.getMessageId() ?? '';
211
-
212
- if (!message_id) {
213
- const initialContentType = this.inThinkBlock
214
- ? ContentTypes.THINK
215
- : ContentTypes.TEXT;
216
- const initialType = reasoning_content
217
- ? ContentTypes.THINK
218
- : initialContentType;
219
- const [stepId, message_id] = this.createMessageStep(initialType);
220
- this.dispatchRunStep(stepId, {
221
- type: StepTypes.MESSAGE_CREATION,
222
- message_creation: {
223
- message_id,
224
- },
225
- });
226
- }
227
-
228
- if (reasoning_content) {
229
- this.handleContent(reasoning_content, ContentTypes.THINK);
230
- } else {
231
- this.handleContent(content, ContentTypes.TEXT);
232
- }
233
- }
234
- }