illuma-agents 1.0.8 → 1.0.10

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 (250) hide show
  1. package/LICENSE +1 -5
  2. package/dist/cjs/common/enum.cjs +1 -2
  3. package/dist/cjs/common/enum.cjs.map +1 -1
  4. package/dist/cjs/events.cjs +11 -0
  5. package/dist/cjs/events.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +2 -1
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/instrumentation.cjs +3 -1
  9. package/dist/cjs/instrumentation.cjs.map +1 -1
  10. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  11. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -2
  12. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  13. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  14. package/dist/cjs/llm/bedrock/index.cjs +99 -0
  15. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  16. package/dist/cjs/llm/fake.cjs.map +1 -1
  17. package/dist/cjs/llm/openai/index.cjs +102 -0
  18. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  19. package/dist/cjs/llm/openai/utils/index.cjs +87 -1
  20. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  21. package/dist/cjs/llm/openrouter/index.cjs +175 -1
  22. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  23. package/dist/cjs/llm/providers.cjs +13 -16
  24. package/dist/cjs/llm/providers.cjs.map +1 -1
  25. package/dist/cjs/llm/text.cjs.map +1 -1
  26. package/dist/cjs/messages/core.cjs +14 -14
  27. package/dist/cjs/messages/core.cjs.map +1 -1
  28. package/dist/cjs/messages/ids.cjs.map +1 -1
  29. package/dist/cjs/messages/prune.cjs.map +1 -1
  30. package/dist/cjs/run.cjs +18 -1
  31. package/dist/cjs/run.cjs.map +1 -1
  32. package/dist/cjs/splitStream.cjs.map +1 -1
  33. package/dist/cjs/stream.cjs +24 -1
  34. package/dist/cjs/stream.cjs.map +1 -1
  35. package/dist/cjs/tools/ToolNode.cjs +20 -1
  36. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  37. package/dist/cjs/tools/handlers.cjs +29 -25
  38. package/dist/cjs/tools/handlers.cjs.map +1 -1
  39. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  40. package/dist/cjs/tools/search/content.cjs.map +1 -1
  41. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  42. package/dist/cjs/tools/search/format.cjs.map +1 -1
  43. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  44. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  45. package/dist/cjs/tools/search/schema.cjs +27 -25
  46. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  47. package/dist/cjs/tools/search/search.cjs +6 -1
  48. package/dist/cjs/tools/search/search.cjs.map +1 -1
  49. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  50. package/dist/cjs/tools/search/tool.cjs +182 -35
  51. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  52. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  53. package/dist/cjs/utils/graph.cjs.map +1 -1
  54. package/dist/cjs/utils/llm.cjs +0 -1
  55. package/dist/cjs/utils/llm.cjs.map +1 -1
  56. package/dist/cjs/utils/misc.cjs.map +1 -1
  57. package/dist/cjs/utils/run.cjs.map +1 -1
  58. package/dist/cjs/utils/title.cjs +7 -7
  59. package/dist/cjs/utils/title.cjs.map +1 -1
  60. package/dist/esm/common/enum.mjs +1 -2
  61. package/dist/esm/common/enum.mjs.map +1 -1
  62. package/dist/esm/events.mjs +11 -0
  63. package/dist/esm/events.mjs.map +1 -1
  64. package/dist/esm/graphs/Graph.mjs +2 -1
  65. package/dist/esm/graphs/Graph.mjs.map +1 -1
  66. package/dist/esm/instrumentation.mjs +3 -1
  67. package/dist/esm/instrumentation.mjs.map +1 -1
  68. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  69. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -2
  70. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  71. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  72. package/dist/esm/llm/bedrock/index.mjs +97 -0
  73. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  74. package/dist/esm/llm/fake.mjs.map +1 -1
  75. package/dist/esm/llm/openai/index.mjs +103 -1
  76. package/dist/esm/llm/openai/index.mjs.map +1 -1
  77. package/dist/esm/llm/openai/utils/index.mjs +88 -2
  78. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  79. package/dist/esm/llm/openrouter/index.mjs +175 -1
  80. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  81. package/dist/esm/llm/providers.mjs +2 -5
  82. package/dist/esm/llm/providers.mjs.map +1 -1
  83. package/dist/esm/llm/text.mjs.map +1 -1
  84. package/dist/esm/messages/core.mjs +14 -14
  85. package/dist/esm/messages/core.mjs.map +1 -1
  86. package/dist/esm/messages/ids.mjs.map +1 -1
  87. package/dist/esm/messages/prune.mjs.map +1 -1
  88. package/dist/esm/run.mjs +18 -1
  89. package/dist/esm/run.mjs.map +1 -1
  90. package/dist/esm/splitStream.mjs.map +1 -1
  91. package/dist/esm/stream.mjs +24 -1
  92. package/dist/esm/stream.mjs.map +1 -1
  93. package/dist/esm/tools/ToolNode.mjs +20 -1
  94. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  95. package/dist/esm/tools/handlers.mjs +30 -26
  96. package/dist/esm/tools/handlers.mjs.map +1 -1
  97. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  98. package/dist/esm/tools/search/content.mjs.map +1 -1
  99. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  100. package/dist/esm/tools/search/format.mjs.map +1 -1
  101. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  102. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  103. package/dist/esm/tools/search/schema.mjs +27 -25
  104. package/dist/esm/tools/search/schema.mjs.map +1 -1
  105. package/dist/esm/tools/search/search.mjs +6 -1
  106. package/dist/esm/tools/search/search.mjs.map +1 -1
  107. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  108. package/dist/esm/tools/search/tool.mjs +182 -35
  109. package/dist/esm/tools/search/tool.mjs.map +1 -1
  110. package/dist/esm/tools/search/utils.mjs.map +1 -1
  111. package/dist/esm/utils/graph.mjs.map +1 -1
  112. package/dist/esm/utils/llm.mjs +0 -1
  113. package/dist/esm/utils/llm.mjs.map +1 -1
  114. package/dist/esm/utils/misc.mjs.map +1 -1
  115. package/dist/esm/utils/run.mjs.map +1 -1
  116. package/dist/esm/utils/title.mjs +7 -7
  117. package/dist/esm/utils/title.mjs.map +1 -1
  118. package/dist/types/common/enum.d.ts +1 -2
  119. package/dist/types/llm/bedrock/index.d.ts +36 -0
  120. package/dist/types/llm/openai/index.d.ts +1 -0
  121. package/dist/types/llm/openai/utils/index.d.ts +10 -1
  122. package/dist/types/llm/openrouter/index.d.ts +4 -1
  123. package/dist/types/tools/search/types.d.ts +2 -0
  124. package/dist/types/types/llm.d.ts +3 -8
  125. package/package.json +16 -12
  126. package/src/common/enum.ts +1 -2
  127. package/src/common/index.ts +1 -1
  128. package/src/events.ts +11 -0
  129. package/src/graphs/Graph.ts +2 -1
  130. package/src/instrumentation.ts +25 -22
  131. package/src/llm/anthropic/llm.spec.ts +1442 -1442
  132. package/src/llm/anthropic/types.ts +140 -140
  133. package/src/llm/anthropic/utils/message_inputs.ts +757 -660
  134. package/src/llm/anthropic/utils/output_parsers.ts +133 -133
  135. package/src/llm/anthropic/utils/tools.ts +29 -29
  136. package/src/llm/bedrock/index.ts +128 -0
  137. package/src/llm/fake.ts +133 -133
  138. package/src/llm/google/llm.spec.ts +3 -1
  139. package/src/llm/google/utils/tools.ts +160 -160
  140. package/src/llm/openai/index.ts +126 -0
  141. package/src/llm/openai/types.ts +24 -24
  142. package/src/llm/openai/utils/index.ts +116 -1
  143. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -90
  144. package/src/llm/openrouter/index.ts +222 -1
  145. package/src/llm/providers.ts +2 -7
  146. package/src/llm/text.ts +94 -94
  147. package/src/messages/core.ts +463 -463
  148. package/src/messages/formatAgentMessages.tools.test.ts +400 -400
  149. package/src/messages/formatMessage.test.ts +693 -693
  150. package/src/messages/ids.ts +26 -26
  151. package/src/messages/prune.ts +567 -567
  152. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -81
  153. package/src/mockStream.ts +98 -98
  154. package/src/prompts/collab.ts +5 -5
  155. package/src/prompts/index.ts +1 -1
  156. package/src/prompts/taskmanager.ts +61 -61
  157. package/src/run.ts +22 -4
  158. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  159. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  160. package/src/scripts/args.ts +48 -48
  161. package/src/scripts/caching.ts +123 -123
  162. package/src/scripts/code_exec_files.ts +193 -193
  163. package/src/scripts/empty_input.ts +137 -137
  164. package/src/scripts/memory.ts +97 -97
  165. package/src/scripts/test-tools-before-handoff.ts +1 -5
  166. package/src/scripts/thinking.ts +149 -149
  167. package/src/scripts/tools.ts +1 -4
  168. package/src/specs/anthropic.simple.test.ts +67 -0
  169. package/src/specs/spec.utils.ts +3 -3
  170. package/src/specs/token-distribution-edge-case.test.ts +316 -316
  171. package/src/specs/tool-error.test.ts +193 -193
  172. package/src/splitStream.test.ts +691 -691
  173. package/src/splitStream.ts +234 -234
  174. package/src/stream.test.ts +94 -94
  175. package/src/stream.ts +30 -1
  176. package/src/tools/ToolNode.ts +24 -1
  177. package/src/tools/handlers.ts +32 -28
  178. package/src/tools/search/anthropic.ts +51 -51
  179. package/src/tools/search/content.test.ts +173 -173
  180. package/src/tools/search/content.ts +147 -147
  181. package/src/tools/search/direct-url.test.ts +530 -0
  182. package/src/tools/search/firecrawl.ts +210 -210
  183. package/src/tools/search/format.ts +250 -250
  184. package/src/tools/search/highlights.ts +320 -320
  185. package/src/tools/search/index.ts +2 -2
  186. package/src/tools/search/jina-reranker.test.ts +126 -126
  187. package/src/tools/search/output.md +2775 -2775
  188. package/src/tools/search/rerankers.ts +242 -242
  189. package/src/tools/search/schema.ts +65 -63
  190. package/src/tools/search/search.ts +766 -759
  191. package/src/tools/search/serper-scraper.ts +155 -155
  192. package/src/tools/search/test.html +883 -883
  193. package/src/tools/search/test.md +642 -642
  194. package/src/tools/search/test.ts +159 -159
  195. package/src/tools/search/tool.ts +641 -471
  196. package/src/tools/search/types.ts +689 -687
  197. package/src/tools/search/utils.ts +79 -79
  198. package/src/types/index.ts +6 -6
  199. package/src/types/llm.ts +2 -8
  200. package/src/utils/graph.ts +10 -10
  201. package/src/utils/llm.ts +26 -27
  202. package/src/utils/llmConfig.ts +13 -5
  203. package/src/utils/logging.ts +48 -48
  204. package/src/utils/misc.ts +57 -57
  205. package/src/utils/run.ts +100 -100
  206. package/src/utils/title.ts +165 -165
  207. package/dist/cjs/llm/ollama/index.cjs +0 -70
  208. package/dist/cjs/llm/ollama/index.cjs.map +0 -1
  209. package/dist/cjs/llm/ollama/utils.cjs +0 -158
  210. package/dist/cjs/llm/ollama/utils.cjs.map +0 -1
  211. package/dist/esm/llm/ollama/index.mjs +0 -68
  212. package/dist/esm/llm/ollama/index.mjs.map +0 -1
  213. package/dist/esm/llm/ollama/utils.mjs +0 -155
  214. package/dist/esm/llm/ollama/utils.mjs.map +0 -1
  215. package/dist/types/llm/ollama/index.d.ts +0 -8
  216. package/dist/types/llm/ollama/utils.d.ts +0 -7
  217. package/src/llm/ollama/index.ts +0 -92
  218. package/src/llm/ollama/utils.ts +0 -193
  219. package/src/proto/CollabGraph.ts +0 -269
  220. package/src/proto/TaskManager.ts +0 -243
  221. package/src/proto/collab.ts +0 -200
  222. package/src/proto/collab_design.ts +0 -184
  223. package/src/proto/collab_design_v2.ts +0 -224
  224. package/src/proto/collab_design_v3.ts +0 -255
  225. package/src/proto/collab_design_v4.ts +0 -220
  226. package/src/proto/collab_design_v5.ts +0 -251
  227. package/src/proto/collab_graph.ts +0 -181
  228. package/src/proto/collab_original.ts +0 -123
  229. package/src/proto/example.ts +0 -93
  230. package/src/proto/example_new.ts +0 -68
  231. package/src/proto/example_old.ts +0 -201
  232. package/src/proto/example_test.ts +0 -152
  233. package/src/proto/example_test_anthropic.ts +0 -100
  234. package/src/proto/log_stream.ts +0 -202
  235. package/src/proto/main_collab_community_event.ts +0 -133
  236. package/src/proto/main_collab_design_v2.ts +0 -96
  237. package/src/proto/main_collab_design_v4.ts +0 -100
  238. package/src/proto/main_collab_design_v5.ts +0 -135
  239. package/src/proto/main_collab_global_analysis.ts +0 -122
  240. package/src/proto/main_collab_hackathon_event.ts +0 -153
  241. package/src/proto/main_collab_space_mission.ts +0 -153
  242. package/src/proto/main_philosophy.ts +0 -210
  243. package/src/proto/original_script.ts +0 -126
  244. package/src/proto/standard.ts +0 -100
  245. package/src/proto/stream.ts +0 -56
  246. package/src/proto/tasks.ts +0 -118
  247. package/src/proto/tools/global_analysis_tools.ts +0 -86
  248. package/src/proto/tools/space_mission_tools.ts +0 -60
  249. package/src/proto/vertexai.ts +0 -54
  250. package/src/scripts/image.ts +0 -178
@@ -1,81 +1,81 @@
1
- import { shiftIndexTokenCountMap } from './format';
2
-
3
- describe('shiftIndexTokenCountMap', () => {
4
- it('should add a system message token count at index 0 and shift all other indices', () => {
5
- const originalMap: Record<number, number> = {
6
- 0: 10,
7
- 1: 20,
8
- 2: 30
9
- };
10
-
11
- const systemMessageTokenCount = 15;
12
-
13
- const result = shiftIndexTokenCountMap(originalMap, systemMessageTokenCount);
14
-
15
- // Check that the system message token count is at index 0
16
- expect(result[0]).toBe(15);
17
-
18
- // Check that all other indices are shifted by 1
19
- expect(result[1]).toBe(10);
20
- expect(result[2]).toBe(20);
21
- expect(result[3]).toBe(30);
22
-
23
- // Check that the original map is not modified
24
- expect(originalMap[0]).toBe(10);
25
- expect(originalMap[1]).toBe(20);
26
- expect(originalMap[2]).toBe(30);
27
- });
28
-
29
- it('should handle an empty map', () => {
30
- const emptyMap: Record<number, number> = {};
31
- const systemMessageTokenCount = 15;
32
-
33
- const result = shiftIndexTokenCountMap(emptyMap, systemMessageTokenCount);
34
-
35
- // Check that only the system message token count is in the result
36
- expect(Object.keys(result).length).toBe(1);
37
- expect(result[0]).toBe(15);
38
- });
39
-
40
- it('should handle non-sequential indices', () => {
41
- const nonSequentialMap: Record<number, number> = {
42
- 0: 10,
43
- 2: 20,
44
- 5: 30
45
- };
46
-
47
- const systemMessageTokenCount = 15;
48
-
49
- const result = shiftIndexTokenCountMap(nonSequentialMap, systemMessageTokenCount);
50
-
51
- // Check that the system message token count is at index 0
52
- expect(result[0]).toBe(15);
53
-
54
- // Check that all other indices are shifted by 1
55
- expect(result[1]).toBe(10);
56
- expect(result[3]).toBe(20);
57
- expect(result[6]).toBe(30);
58
- });
59
-
60
- it('should handle string keys', () => {
61
- // TypeScript will convert string keys to numbers when accessing the object
62
- const mapWithStringKeys: Record<string, number> = {
63
- '0': 10,
64
- '1': 20,
65
- '2': 30
66
- };
67
-
68
- const systemMessageTokenCount = 15;
69
-
70
- // Cast to Record<number, number> to match the function signature
71
- const result = shiftIndexTokenCountMap(mapWithStringKeys as unknown as Record<number, number>, systemMessageTokenCount);
72
-
73
- // Check that the system message token count is at index 0
74
- expect(result[0]).toBe(15);
75
-
76
- // Check that all other indices are shifted by 1
77
- expect(result[1]).toBe(10);
78
- expect(result[2]).toBe(20);
79
- expect(result[3]).toBe(30);
80
- });
81
- });
1
+ import { shiftIndexTokenCountMap } from './format';
2
+
3
+ describe('shiftIndexTokenCountMap', () => {
4
+ it('should add a system message token count at index 0 and shift all other indices', () => {
5
+ const originalMap: Record<number, number> = {
6
+ 0: 10,
7
+ 1: 20,
8
+ 2: 30
9
+ };
10
+
11
+ const systemMessageTokenCount = 15;
12
+
13
+ const result = shiftIndexTokenCountMap(originalMap, systemMessageTokenCount);
14
+
15
+ // Check that the system message token count is at index 0
16
+ expect(result[0]).toBe(15);
17
+
18
+ // Check that all other indices are shifted by 1
19
+ expect(result[1]).toBe(10);
20
+ expect(result[2]).toBe(20);
21
+ expect(result[3]).toBe(30);
22
+
23
+ // Check that the original map is not modified
24
+ expect(originalMap[0]).toBe(10);
25
+ expect(originalMap[1]).toBe(20);
26
+ expect(originalMap[2]).toBe(30);
27
+ });
28
+
29
+ it('should handle an empty map', () => {
30
+ const emptyMap: Record<number, number> = {};
31
+ const systemMessageTokenCount = 15;
32
+
33
+ const result = shiftIndexTokenCountMap(emptyMap, systemMessageTokenCount);
34
+
35
+ // Check that only the system message token count is in the result
36
+ expect(Object.keys(result).length).toBe(1);
37
+ expect(result[0]).toBe(15);
38
+ });
39
+
40
+ it('should handle non-sequential indices', () => {
41
+ const nonSequentialMap: Record<number, number> = {
42
+ 0: 10,
43
+ 2: 20,
44
+ 5: 30
45
+ };
46
+
47
+ const systemMessageTokenCount = 15;
48
+
49
+ const result = shiftIndexTokenCountMap(nonSequentialMap, systemMessageTokenCount);
50
+
51
+ // Check that the system message token count is at index 0
52
+ expect(result[0]).toBe(15);
53
+
54
+ // Check that all other indices are shifted by 1
55
+ expect(result[1]).toBe(10);
56
+ expect(result[3]).toBe(20);
57
+ expect(result[6]).toBe(30);
58
+ });
59
+
60
+ it('should handle string keys', () => {
61
+ // TypeScript will convert string keys to numbers when accessing the object
62
+ const mapWithStringKeys: Record<string, number> = {
63
+ '0': 10,
64
+ '1': 20,
65
+ '2': 30
66
+ };
67
+
68
+ const systemMessageTokenCount = 15;
69
+
70
+ // Cast to Record<number, number> to match the function signature
71
+ const result = shiftIndexTokenCountMap(mapWithStringKeys as unknown as Record<number, number>, systemMessageTokenCount);
72
+
73
+ // Check that the system message token count is at index 0
74
+ expect(result[0]).toBe(15);
75
+
76
+ // Check that all other indices are shifted by 1
77
+ expect(result[1]).toBe(10);
78
+ expect(result[2]).toBe(20);
79
+ expect(result[3]).toBe(30);
80
+ });
81
+ });
package/src/mockStream.ts CHANGED
@@ -1,99 +1,99 @@
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
- })();
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
99
  */
@@ -1,6 +1,6 @@
1
- // src/prompts/collab.ts
2
- export const supervisorPrompt = `You are a supervisor tasked with managing a conversation between the
3
- following workers: {members}. Given the following user request,
4
- respond with the worker to act next. Each worker will perform a
5
- task and respond with their results and status. Multiple workers can work at once, and they can use multiple tools at once. Each worker can run their tools multiple times per task. When finished,
1
+ // src/prompts/collab.ts
2
+ export const supervisorPrompt = `You are a supervisor tasked with managing a conversation between the
3
+ following workers: {members}. Given the following user request,
4
+ respond with the worker to act next. Each worker will perform a
5
+ task and respond with their results and status. Multiple workers can work at once, and they can use multiple tools at once. Each worker can run their tools multiple times per task. When finished,
6
6
  respond with FINISH.`;
@@ -1,2 +1,2 @@
1
- export * from './collab';
1
+ export * from './collab';
2
2
  export * from './taskmanager';
@@ -1,61 +1,61 @@
1
- export const taskManagerPrompt = `You are a Task Manager responsible for efficiently coordinating a team of specialized workers: {members}. Your PRIMARY and SOLE OBJECTIVE is to fulfill the user's specific request as quickly and effectively as possible.
2
-
3
- CRITICAL GUIDELINES:
4
- 1. The user's request is your CHIEF CONCERN. Every action must directly contribute to fulfilling this request.
5
- 2. Aim to complete the entire task in NO MORE THAN 2-3 TURNS, unless explicitly instructed otherwise.
6
- 3. Eliminate all superfluous activity. Each task must be essential to achieving the user's goal.
7
- 4. Assign no more than 5 tasks per turn, and only if absolutely necessary.
8
- 5. Be concise and direct in your task assignments.
9
- 6. End the process IMMEDIATELY once the user's request is fulfilled by setting 'end' to true and assigning no new tasks.
10
-
11
- Your responsibilities:
12
- 1. Analyze the user's request and break it down into the minimum necessary subtasks.
13
- 2. Assign these essential tasks to the most appropriate team members based on their skills and tools.
14
- 3. Prioritize tasks to ensure the most efficient path to completion.
15
- 4. Continuously evaluate if the user's request has been fully addressed.
16
- 5. End the process IMMEDIATELY once the user's request is fulfilled.
17
-
18
- Task Assignment Guidelines:
19
- - Assign only the most crucial tasks required to meet the user's needs.
20
- - Multiple tasks can be assigned to the same team member if it improves efficiency.
21
- - Always specify the tool to use if applicable.
22
- - Consider task dependencies to minimize the number of turns.
23
-
24
- After each round:
25
- - Critically assess if the user's request has been fully addressed.
26
- - If more work is genuinely needed, assign only the most essential remaining tasks.
27
- - If the user's request has been fulfilled or can be fulfilled with the results at hand, set 'end' to true and assign no new tasks.
28
-
29
- REMEMBER: Your success is measured by how quickly and effectively you fulfill the user's request, not by the number of tasks assigned or turns taken. Excessive deliberation or unnecessary tasks are counterproductive. Focus solely on the user's needs and conclude the process as soon as those needs are met.`;
30
-
31
- export const assignTasksFunctionDescription = 'Assign the minimum necessary tasks to team members to fulfill the user\'s request as quickly as possible. Assign up to 5 tasks maximum per turn, only if absolutely necessary. Each task must specify the team member, a concise description, and the tool to use if applicable.';
32
-
33
- export const assignTasksFunctionParameters = {
34
- type: 'object',
35
- properties: {
36
- tasks: {
37
- type: 'array',
38
- items: {
39
- type: 'object',
40
- properties: {
41
- member: { type: 'string', description: 'Name of the team member assigned to the task' },
42
- description: { type: 'string', description: 'Concise description of the essential task to be performed' },
43
- tool: { type: 'string', description: 'Specific tool to be used for the task, if applicable' },
44
- },
45
- required: ['member', 'description'],
46
- },
47
- description: 'List of essential tasks to be assigned, maximum 5 tasks per turn.',
48
- },
49
- },
50
- required: ['tasks'],
51
- };
52
-
53
- export const endProcessFunctionDescription = 'End the process when the user\'s request has been fulfilled.';
54
-
55
- export const endProcessFunctionParameters = {
56
- type: 'object',
57
- properties: {
58
- reason: { type: 'string', description: 'Brief explanation of why the process is ending' },
59
- },
60
- required: ['reason'],
61
- };
1
+ export const taskManagerPrompt = `You are a Task Manager responsible for efficiently coordinating a team of specialized workers: {members}. Your PRIMARY and SOLE OBJECTIVE is to fulfill the user's specific request as quickly and effectively as possible.
2
+
3
+ CRITICAL GUIDELINES:
4
+ 1. The user's request is your CHIEF CONCERN. Every action must directly contribute to fulfilling this request.
5
+ 2. Aim to complete the entire task in NO MORE THAN 2-3 TURNS, unless explicitly instructed otherwise.
6
+ 3. Eliminate all superfluous activity. Each task must be essential to achieving the user's goal.
7
+ 4. Assign no more than 5 tasks per turn, and only if absolutely necessary.
8
+ 5. Be concise and direct in your task assignments.
9
+ 6. End the process IMMEDIATELY once the user's request is fulfilled by setting 'end' to true and assigning no new tasks.
10
+
11
+ Your responsibilities:
12
+ 1. Analyze the user's request and break it down into the minimum necessary subtasks.
13
+ 2. Assign these essential tasks to the most appropriate team members based on their skills and tools.
14
+ 3. Prioritize tasks to ensure the most efficient path to completion.
15
+ 4. Continuously evaluate if the user's request has been fully addressed.
16
+ 5. End the process IMMEDIATELY once the user's request is fulfilled.
17
+
18
+ Task Assignment Guidelines:
19
+ - Assign only the most crucial tasks required to meet the user's needs.
20
+ - Multiple tasks can be assigned to the same team member if it improves efficiency.
21
+ - Always specify the tool to use if applicable.
22
+ - Consider task dependencies to minimize the number of turns.
23
+
24
+ After each round:
25
+ - Critically assess if the user's request has been fully addressed.
26
+ - If more work is genuinely needed, assign only the most essential remaining tasks.
27
+ - If the user's request has been fulfilled or can be fulfilled with the results at hand, set 'end' to true and assign no new tasks.
28
+
29
+ REMEMBER: Your success is measured by how quickly and effectively you fulfill the user's request, not by the number of tasks assigned or turns taken. Excessive deliberation or unnecessary tasks are counterproductive. Focus solely on the user's needs and conclude the process as soon as those needs are met.`;
30
+
31
+ export const assignTasksFunctionDescription = 'Assign the minimum necessary tasks to team members to fulfill the user\'s request as quickly as possible. Assign up to 5 tasks maximum per turn, only if absolutely necessary. Each task must specify the team member, a concise description, and the tool to use if applicable.';
32
+
33
+ export const assignTasksFunctionParameters = {
34
+ type: 'object',
35
+ properties: {
36
+ tasks: {
37
+ type: 'array',
38
+ items: {
39
+ type: 'object',
40
+ properties: {
41
+ member: { type: 'string', description: 'Name of the team member assigned to the task' },
42
+ description: { type: 'string', description: 'Concise description of the essential task to be performed' },
43
+ tool: { type: 'string', description: 'Specific tool to be used for the task, if applicable' },
44
+ },
45
+ required: ['member', 'description'],
46
+ },
47
+ description: 'List of essential tasks to be assigned, maximum 5 tasks per turn.',
48
+ },
49
+ },
50
+ required: ['tasks'],
51
+ };
52
+
53
+ export const endProcessFunctionDescription = 'End the process when the user\'s request has been fulfilled.';
54
+
55
+ export const endProcessFunctionParameters = {
56
+ type: 'object',
57
+ properties: {
58
+ reason: { type: 'string', description: 'Brief explanation of why the process is ending' },
59
+ },
60
+ required: ['reason'],
61
+ };
package/src/run.ts CHANGED
@@ -197,7 +197,7 @@ export class Run<_T extends t.BaseGraphState> {
197
197
  }
198
198
  const handler = this.handlerRegistry?.getHandler(eventName);
199
199
  if (handler && this.Graph) {
200
- await handler.handle(
200
+ return await handler.handle(
201
201
  eventName,
202
202
  data as
203
203
  | t.StreamEventData
@@ -276,6 +276,15 @@ export class Run<_T extends t.BaseGraphState> {
276
276
 
277
277
  const stream = this.graphRunnable.streamEvents(inputs, config, {
278
278
  raiseError: true,
279
+ /**
280
+ * Prevent EventStreamCallbackHandler from processing custom events.
281
+ * Custom events are already handled via our createCustomEventCallback()
282
+ * which routes them through the handlerRegistry.
283
+ * Without this flag, EventStreamCallbackHandler throws errors when
284
+ * custom events are dispatched for run IDs not in its internal map
285
+ * (due to timing issues in parallel execution or after run cleanup).
286
+ */
287
+ ignoreCustomEvent: true,
279
288
  });
280
289
 
281
290
  for await (const event of stream) {
@@ -283,6 +292,15 @@ export class Run<_T extends t.BaseGraphState> {
283
292
 
284
293
  const eventName: t.EventName = info.event;
285
294
 
295
+ // Debug: log tool-related events
296
+ if (eventName.includes('tool')) {
297
+ console.log('[AgentRun] Tool event received:', eventName, {
298
+ hasData: !!data,
299
+ dataKeys: data ? Object.keys(data) : [],
300
+ outputType: data?.output ? typeof data.output : 'none',
301
+ });
302
+ }
303
+
286
304
  /** Skip custom events as they're handled by our callback */
287
305
  if (eventName === GraphEvents.ON_CUSTOM_EVENT) {
288
306
  continue;
@@ -431,9 +449,9 @@ export class Run<_T extends t.BaseGraphState> {
431
449
  } catch (_e) {
432
450
  // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
433
451
  // But preserve langfuse handler if it exists
434
- const langfuseHandler = (invokeConfig.callbacks as t.ProvidedCallbacks)?.find(
435
- (cb) => cb instanceof CallbackHandler
436
- );
452
+ const langfuseHandler = (
453
+ invokeConfig.callbacks as t.ProvidedCallbacks
454
+ )?.find((cb) => cb instanceof CallbackHandler);
437
455
  const { callbacks: _cb, ...rest } = invokeConfig;
438
456
  const safeConfig = Object.assign({}, rest, {
439
457
  callbacks: langfuseHandler ? [langfuseHandler] : [],