illuma-agents 1.0.8 → 1.0.9

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 (217) 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/instrumentation.cjs.map +1 -1
  5. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  6. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -2
  7. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  8. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  9. package/dist/cjs/llm/bedrock/index.cjs +99 -0
  10. package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
  11. package/dist/cjs/llm/fake.cjs.map +1 -1
  12. package/dist/cjs/llm/providers.cjs +13 -16
  13. package/dist/cjs/llm/providers.cjs.map +1 -1
  14. package/dist/cjs/llm/text.cjs.map +1 -1
  15. package/dist/cjs/messages/core.cjs +14 -14
  16. package/dist/cjs/messages/core.cjs.map +1 -1
  17. package/dist/cjs/messages/ids.cjs.map +1 -1
  18. package/dist/cjs/messages/prune.cjs.map +1 -1
  19. package/dist/cjs/run.cjs +10 -1
  20. package/dist/cjs/run.cjs.map +1 -1
  21. package/dist/cjs/splitStream.cjs.map +1 -1
  22. package/dist/cjs/stream.cjs +4 -1
  23. package/dist/cjs/stream.cjs.map +1 -1
  24. package/dist/cjs/tools/ToolNode.cjs +10 -1
  25. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  26. package/dist/cjs/tools/handlers.cjs +29 -25
  27. package/dist/cjs/tools/handlers.cjs.map +1 -1
  28. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  29. package/dist/cjs/tools/search/content.cjs.map +1 -1
  30. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  31. package/dist/cjs/tools/search/format.cjs.map +1 -1
  32. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  33. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  34. package/dist/cjs/tools/search/schema.cjs +25 -25
  35. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  36. package/dist/cjs/tools/search/search.cjs +6 -1
  37. package/dist/cjs/tools/search/search.cjs.map +1 -1
  38. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  39. package/dist/cjs/tools/search/tool.cjs +162 -35
  40. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  41. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  42. package/dist/cjs/utils/graph.cjs.map +1 -1
  43. package/dist/cjs/utils/llm.cjs +0 -1
  44. package/dist/cjs/utils/llm.cjs.map +1 -1
  45. package/dist/cjs/utils/misc.cjs.map +1 -1
  46. package/dist/cjs/utils/run.cjs.map +1 -1
  47. package/dist/cjs/utils/title.cjs +7 -7
  48. package/dist/cjs/utils/title.cjs.map +1 -1
  49. package/dist/esm/common/enum.mjs +1 -2
  50. package/dist/esm/common/enum.mjs.map +1 -1
  51. package/dist/esm/instrumentation.mjs.map +1 -1
  52. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  53. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -2
  54. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  55. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  56. package/dist/esm/llm/bedrock/index.mjs +97 -0
  57. package/dist/esm/llm/bedrock/index.mjs.map +1 -0
  58. package/dist/esm/llm/fake.mjs.map +1 -1
  59. package/dist/esm/llm/providers.mjs +2 -5
  60. package/dist/esm/llm/providers.mjs.map +1 -1
  61. package/dist/esm/llm/text.mjs.map +1 -1
  62. package/dist/esm/messages/core.mjs +14 -14
  63. package/dist/esm/messages/core.mjs.map +1 -1
  64. package/dist/esm/messages/ids.mjs.map +1 -1
  65. package/dist/esm/messages/prune.mjs.map +1 -1
  66. package/dist/esm/run.mjs +10 -1
  67. package/dist/esm/run.mjs.map +1 -1
  68. package/dist/esm/splitStream.mjs.map +1 -1
  69. package/dist/esm/stream.mjs +4 -1
  70. package/dist/esm/stream.mjs.map +1 -1
  71. package/dist/esm/tools/ToolNode.mjs +10 -1
  72. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  73. package/dist/esm/tools/handlers.mjs +30 -26
  74. package/dist/esm/tools/handlers.mjs.map +1 -1
  75. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  76. package/dist/esm/tools/search/content.mjs.map +1 -1
  77. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  78. package/dist/esm/tools/search/format.mjs.map +1 -1
  79. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  80. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  81. package/dist/esm/tools/search/schema.mjs +25 -25
  82. package/dist/esm/tools/search/schema.mjs.map +1 -1
  83. package/dist/esm/tools/search/search.mjs +6 -1
  84. package/dist/esm/tools/search/search.mjs.map +1 -1
  85. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  86. package/dist/esm/tools/search/tool.mjs +162 -35
  87. package/dist/esm/tools/search/tool.mjs.map +1 -1
  88. package/dist/esm/tools/search/utils.mjs.map +1 -1
  89. package/dist/esm/utils/graph.mjs.map +1 -1
  90. package/dist/esm/utils/llm.mjs +0 -1
  91. package/dist/esm/utils/llm.mjs.map +1 -1
  92. package/dist/esm/utils/misc.mjs.map +1 -1
  93. package/dist/esm/utils/run.mjs.map +1 -1
  94. package/dist/esm/utils/title.mjs +7 -7
  95. package/dist/esm/utils/title.mjs.map +1 -1
  96. package/dist/types/common/enum.d.ts +1 -2
  97. package/dist/types/llm/bedrock/index.d.ts +36 -0
  98. package/dist/types/tools/search/types.d.ts +2 -0
  99. package/dist/types/types/llm.d.ts +3 -8
  100. package/package.json +15 -11
  101. package/src/common/enum.ts +1 -2
  102. package/src/common/index.ts +1 -1
  103. package/src/instrumentation.ts +22 -22
  104. package/src/llm/anthropic/llm.spec.ts +1442 -1442
  105. package/src/llm/anthropic/types.ts +140 -140
  106. package/src/llm/anthropic/utils/message_inputs.ts +757 -660
  107. package/src/llm/anthropic/utils/output_parsers.ts +133 -133
  108. package/src/llm/anthropic/utils/tools.ts +29 -29
  109. package/src/llm/bedrock/index.ts +128 -0
  110. package/src/llm/fake.ts +133 -133
  111. package/src/llm/google/utils/tools.ts +160 -160
  112. package/src/llm/openai/types.ts +24 -24
  113. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -90
  114. package/src/llm/providers.ts +2 -7
  115. package/src/llm/text.ts +94 -94
  116. package/src/messages/core.ts +463 -463
  117. package/src/messages/formatAgentMessages.tools.test.ts +400 -400
  118. package/src/messages/formatMessage.test.ts +693 -693
  119. package/src/messages/ids.ts +26 -26
  120. package/src/messages/prune.ts +567 -567
  121. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -81
  122. package/src/mockStream.ts +98 -98
  123. package/src/prompts/collab.ts +5 -5
  124. package/src/prompts/index.ts +1 -1
  125. package/src/prompts/taskmanager.ts +61 -61
  126. package/src/run.ts +13 -4
  127. package/src/scripts/ant_web_search_edge_case.ts +162 -0
  128. package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
  129. package/src/scripts/args.ts +48 -48
  130. package/src/scripts/caching.ts +123 -123
  131. package/src/scripts/code_exec_files.ts +193 -193
  132. package/src/scripts/empty_input.ts +137 -137
  133. package/src/scripts/image.ts +178 -178
  134. package/src/scripts/memory.ts +97 -97
  135. package/src/scripts/thinking.ts +149 -149
  136. package/src/specs/anthropic.simple.test.ts +67 -0
  137. package/src/specs/spec.utils.ts +3 -3
  138. package/src/specs/token-distribution-edge-case.test.ts +316 -316
  139. package/src/specs/tool-error.test.ts +193 -193
  140. package/src/splitStream.test.ts +691 -691
  141. package/src/splitStream.ts +234 -234
  142. package/src/stream.test.ts +94 -94
  143. package/src/stream.ts +4 -1
  144. package/src/tools/ToolNode.ts +12 -1
  145. package/src/tools/handlers.ts +32 -28
  146. package/src/tools/search/anthropic.ts +51 -51
  147. package/src/tools/search/content.test.ts +173 -173
  148. package/src/tools/search/content.ts +147 -147
  149. package/src/tools/search/direct-url.test.ts +530 -0
  150. package/src/tools/search/firecrawl.ts +210 -210
  151. package/src/tools/search/format.ts +250 -250
  152. package/src/tools/search/highlights.ts +320 -320
  153. package/src/tools/search/index.ts +2 -2
  154. package/src/tools/search/jina-reranker.test.ts +126 -126
  155. package/src/tools/search/output.md +2775 -2775
  156. package/src/tools/search/rerankers.ts +242 -242
  157. package/src/tools/search/schema.ts +63 -63
  158. package/src/tools/search/search.ts +766 -759
  159. package/src/tools/search/serper-scraper.ts +155 -155
  160. package/src/tools/search/test.html +883 -883
  161. package/src/tools/search/test.md +642 -642
  162. package/src/tools/search/test.ts +159 -159
  163. package/src/tools/search/tool.ts +619 -471
  164. package/src/tools/search/types.ts +689 -687
  165. package/src/tools/search/utils.ts +79 -79
  166. package/src/types/index.ts +6 -6
  167. package/src/types/llm.ts +2 -8
  168. package/src/utils/graph.ts +10 -10
  169. package/src/utils/llm.ts +26 -27
  170. package/src/utils/llmConfig.ts +5 -3
  171. package/src/utils/logging.ts +48 -48
  172. package/src/utils/misc.ts +57 -57
  173. package/src/utils/run.ts +100 -100
  174. package/src/utils/title.ts +165 -165
  175. package/dist/cjs/llm/ollama/index.cjs +0 -70
  176. package/dist/cjs/llm/ollama/index.cjs.map +0 -1
  177. package/dist/cjs/llm/ollama/utils.cjs +0 -158
  178. package/dist/cjs/llm/ollama/utils.cjs.map +0 -1
  179. package/dist/esm/llm/ollama/index.mjs +0 -68
  180. package/dist/esm/llm/ollama/index.mjs.map +0 -1
  181. package/dist/esm/llm/ollama/utils.mjs +0 -155
  182. package/dist/esm/llm/ollama/utils.mjs.map +0 -1
  183. package/dist/types/llm/ollama/index.d.ts +0 -8
  184. package/dist/types/llm/ollama/utils.d.ts +0 -7
  185. package/src/llm/ollama/index.ts +0 -92
  186. package/src/llm/ollama/utils.ts +0 -193
  187. package/src/proto/CollabGraph.ts +0 -269
  188. package/src/proto/TaskManager.ts +0 -243
  189. package/src/proto/collab.ts +0 -200
  190. package/src/proto/collab_design.ts +0 -184
  191. package/src/proto/collab_design_v2.ts +0 -224
  192. package/src/proto/collab_design_v3.ts +0 -255
  193. package/src/proto/collab_design_v4.ts +0 -220
  194. package/src/proto/collab_design_v5.ts +0 -251
  195. package/src/proto/collab_graph.ts +0 -181
  196. package/src/proto/collab_original.ts +0 -123
  197. package/src/proto/example.ts +0 -93
  198. package/src/proto/example_new.ts +0 -68
  199. package/src/proto/example_old.ts +0 -201
  200. package/src/proto/example_test.ts +0 -152
  201. package/src/proto/example_test_anthropic.ts +0 -100
  202. package/src/proto/log_stream.ts +0 -202
  203. package/src/proto/main_collab_community_event.ts +0 -133
  204. package/src/proto/main_collab_design_v2.ts +0 -96
  205. package/src/proto/main_collab_design_v4.ts +0 -100
  206. package/src/proto/main_collab_design_v5.ts +0 -135
  207. package/src/proto/main_collab_global_analysis.ts +0 -122
  208. package/src/proto/main_collab_hackathon_event.ts +0 -153
  209. package/src/proto/main_collab_space_mission.ts +0 -153
  210. package/src/proto/main_philosophy.ts +0 -210
  211. package/src/proto/original_script.ts +0 -126
  212. package/src/proto/standard.ts +0 -100
  213. package/src/proto/stream.ts +0 -56
  214. package/src/proto/tasks.ts +0 -118
  215. package/src/proto/tools/global_analysis_tools.ts +0 -86
  216. package/src/proto/tools/space_mission_tools.ts +0 -60
  217. package/src/proto/vertexai.ts +0 -54
@@ -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) {
@@ -431,9 +440,9 @@ export class Run<_T extends t.BaseGraphState> {
431
440
  } catch (_e) {
432
441
  // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
433
442
  // But preserve langfuse handler if it exists
434
- const langfuseHandler = (invokeConfig.callbacks as t.ProvidedCallbacks)?.find(
435
- (cb) => cb instanceof CallbackHandler
436
- );
443
+ const langfuseHandler = (
444
+ invokeConfig.callbacks as t.ProvidedCallbacks
445
+ )?.find((cb) => cb instanceof CallbackHandler);
437
446
  const { callbacks: _cb, ...rest } = invokeConfig;
438
447
  const safeConfig = Object.assign({}, rest, {
439
448
  callbacks: langfuseHandler ? [langfuseHandler] : [],