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.
- package/LICENSE +1 -5
- package/dist/cjs/common/enum.cjs +1 -2
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -2
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +99 -0
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs +13 -16
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/text.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +14 -14
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/run.cjs +10 -1
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +4 -1
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +10 -1
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +29 -25
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
- package/dist/cjs/tools/search/content.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/schema.cjs +25 -25
- package/dist/cjs/tools/search/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +6 -1
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +162 -35
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/llm.cjs +0 -1
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs +7 -7
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/esm/common/enum.mjs +1 -2
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -2
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +97 -0
- package/dist/esm/llm/bedrock/index.mjs.map +1 -0
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs +2 -5
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/text.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +14 -14
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/run.mjs +10 -1
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +4 -1
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +10 -1
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +30 -26
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/search/anthropic.mjs.map +1 -1
- package/dist/esm/tools/search/content.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/schema.mjs +25 -25
- package/dist/esm/tools/search/schema.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +6 -1
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +162 -35
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/llm.mjs +0 -1
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/title.mjs +7 -7
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/types/common/enum.d.ts +1 -2
- package/dist/types/llm/bedrock/index.d.ts +36 -0
- package/dist/types/tools/search/types.d.ts +2 -0
- package/dist/types/types/llm.d.ts +3 -8
- package/package.json +15 -11
- package/src/common/enum.ts +1 -2
- package/src/common/index.ts +1 -1
- package/src/instrumentation.ts +22 -22
- package/src/llm/anthropic/llm.spec.ts +1442 -1442
- package/src/llm/anthropic/types.ts +140 -140
- package/src/llm/anthropic/utils/message_inputs.ts +757 -660
- package/src/llm/anthropic/utils/output_parsers.ts +133 -133
- package/src/llm/anthropic/utils/tools.ts +29 -29
- package/src/llm/bedrock/index.ts +128 -0
- package/src/llm/fake.ts +133 -133
- package/src/llm/google/utils/tools.ts +160 -160
- package/src/llm/openai/types.ts +24 -24
- package/src/llm/openai/utils/isReasoningModel.test.ts +90 -90
- package/src/llm/providers.ts +2 -7
- package/src/llm/text.ts +94 -94
- package/src/messages/core.ts +463 -463
- package/src/messages/formatAgentMessages.tools.test.ts +400 -400
- package/src/messages/formatMessage.test.ts +693 -693
- package/src/messages/ids.ts +26 -26
- package/src/messages/prune.ts +567 -567
- package/src/messages/shiftIndexTokenCountMap.test.ts +81 -81
- package/src/mockStream.ts +98 -98
- package/src/prompts/collab.ts +5 -5
- package/src/prompts/index.ts +1 -1
- package/src/prompts/taskmanager.ts +61 -61
- package/src/run.ts +13 -4
- package/src/scripts/ant_web_search_edge_case.ts +162 -0
- package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
- package/src/scripts/args.ts +48 -48
- package/src/scripts/caching.ts +123 -123
- package/src/scripts/code_exec_files.ts +193 -193
- package/src/scripts/empty_input.ts +137 -137
- package/src/scripts/image.ts +178 -178
- package/src/scripts/memory.ts +97 -97
- package/src/scripts/thinking.ts +149 -149
- package/src/specs/anthropic.simple.test.ts +67 -0
- package/src/specs/spec.utils.ts +3 -3
- package/src/specs/token-distribution-edge-case.test.ts +316 -316
- package/src/specs/tool-error.test.ts +193 -193
- package/src/splitStream.test.ts +691 -691
- package/src/splitStream.ts +234 -234
- package/src/stream.test.ts +94 -94
- package/src/stream.ts +4 -1
- package/src/tools/ToolNode.ts +12 -1
- package/src/tools/handlers.ts +32 -28
- package/src/tools/search/anthropic.ts +51 -51
- package/src/tools/search/content.test.ts +173 -173
- package/src/tools/search/content.ts +147 -147
- package/src/tools/search/direct-url.test.ts +530 -0
- package/src/tools/search/firecrawl.ts +210 -210
- package/src/tools/search/format.ts +250 -250
- package/src/tools/search/highlights.ts +320 -320
- package/src/tools/search/index.ts +2 -2
- package/src/tools/search/jina-reranker.test.ts +126 -126
- package/src/tools/search/output.md +2775 -2775
- package/src/tools/search/rerankers.ts +242 -242
- package/src/tools/search/schema.ts +63 -63
- package/src/tools/search/search.ts +766 -759
- package/src/tools/search/serper-scraper.ts +155 -155
- package/src/tools/search/test.html +883 -883
- package/src/tools/search/test.md +642 -642
- package/src/tools/search/test.ts +159 -159
- package/src/tools/search/tool.ts +619 -471
- package/src/tools/search/types.ts +689 -687
- package/src/tools/search/utils.ts +79 -79
- package/src/types/index.ts +6 -6
- package/src/types/llm.ts +2 -8
- package/src/utils/graph.ts +10 -10
- package/src/utils/llm.ts +26 -27
- package/src/utils/llmConfig.ts +5 -3
- package/src/utils/logging.ts +48 -48
- package/src/utils/misc.ts +57 -57
- package/src/utils/run.ts +100 -100
- package/src/utils/title.ts +165 -165
- package/dist/cjs/llm/ollama/index.cjs +0 -70
- package/dist/cjs/llm/ollama/index.cjs.map +0 -1
- package/dist/cjs/llm/ollama/utils.cjs +0 -158
- package/dist/cjs/llm/ollama/utils.cjs.map +0 -1
- package/dist/esm/llm/ollama/index.mjs +0 -68
- package/dist/esm/llm/ollama/index.mjs.map +0 -1
- package/dist/esm/llm/ollama/utils.mjs +0 -155
- package/dist/esm/llm/ollama/utils.mjs.map +0 -1
- package/dist/types/llm/ollama/index.d.ts +0 -8
- package/dist/types/llm/ollama/utils.d.ts +0 -7
- package/src/llm/ollama/index.ts +0 -92
- package/src/llm/ollama/utils.ts +0 -193
- package/src/proto/CollabGraph.ts +0 -269
- package/src/proto/TaskManager.ts +0 -243
- package/src/proto/collab.ts +0 -200
- package/src/proto/collab_design.ts +0 -184
- package/src/proto/collab_design_v2.ts +0 -224
- package/src/proto/collab_design_v3.ts +0 -255
- package/src/proto/collab_design_v4.ts +0 -220
- package/src/proto/collab_design_v5.ts +0 -251
- package/src/proto/collab_graph.ts +0 -181
- package/src/proto/collab_original.ts +0 -123
- package/src/proto/example.ts +0 -93
- package/src/proto/example_new.ts +0 -68
- package/src/proto/example_old.ts +0 -201
- package/src/proto/example_test.ts +0 -152
- package/src/proto/example_test_anthropic.ts +0 -100
- package/src/proto/log_stream.ts +0 -202
- package/src/proto/main_collab_community_event.ts +0 -133
- package/src/proto/main_collab_design_v2.ts +0 -96
- package/src/proto/main_collab_design_v4.ts +0 -100
- package/src/proto/main_collab_design_v5.ts +0 -135
- package/src/proto/main_collab_global_analysis.ts +0 -122
- package/src/proto/main_collab_hackathon_event.ts +0 -153
- package/src/proto/main_collab_space_mission.ts +0 -153
- package/src/proto/main_philosophy.ts +0 -210
- package/src/proto/original_script.ts +0 -126
- package/src/proto/standard.ts +0 -100
- package/src/proto/stream.ts +0 -56
- package/src/proto/tasks.ts +0 -118
- package/src/proto/tools/global_analysis_tools.ts +0 -86
- package/src/proto/tools/space_mission_tools.ts +0 -60
- 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
|
*/
|
package/src/prompts/collab.ts
CHANGED
|
@@ -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.`;
|
package/src/prompts/index.ts
CHANGED
|
@@ -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 = (
|
|
435
|
-
|
|
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] : [],
|