@illuma-ai/agents 1.1.21 → 1.1.23
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/dist/cjs/graphs/Graph.cjs +12 -1
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +105 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/run.cjs +20 -9
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +12 -1
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +105 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/run.mjs +20 -9
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/types/graphs/MultiAgentGraph.d.ts +17 -0
- package/package.json +1 -1
- package/src/graphs/Graph.ts +13 -1
- package/src/graphs/MultiAgentGraph.ts +128 -1
- package/src/graphs/__tests__/multi-agent-delegate.test.ts +205 -0
- package/src/run.ts +20 -11
- package/src/scripts/test-bedrock-handoff-autonomous.ts +231 -0
- package/src/utils/llm.ts +1 -0
- package/src/agents/AgentContext.js +0 -782
- package/src/agents/AgentContext.test.js +0 -421
- package/src/agents/__tests__/AgentContext.test.js +0 -678
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js +0 -117
- package/src/common/enum.js +0 -192
- package/src/common/index.js +0 -3
- package/src/events.js +0 -166
- package/src/graphs/Graph.js +0 -1857
- package/src/graphs/MultiAgentGraph.js +0 -1092
- package/src/graphs/__tests__/structured-output.integration.test.js +0 -624
- package/src/graphs/__tests__/structured-output.test.js +0 -144
- package/src/graphs/contextManagement.e2e.test.js +0 -718
- package/src/graphs/contextManagement.test.js +0 -485
- package/src/graphs/handoffValidation.test.js +0 -276
- package/src/graphs/index.js +0 -3
- package/src/index.js +0 -28
- package/src/instrumentation.js +0 -21
- package/src/llm/anthropic/index.js +0 -319
- package/src/llm/anthropic/types.js +0 -46
- package/src/llm/anthropic/utils/message_inputs.js +0 -627
- package/src/llm/anthropic/utils/message_outputs.js +0 -290
- package/src/llm/anthropic/utils/output_parsers.js +0 -89
- package/src/llm/anthropic/utils/tools.js +0 -25
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js +0 -392
- package/src/llm/bedrock/index.js +0 -303
- package/src/llm/bedrock/types.js +0 -2
- package/src/llm/bedrock/utils/index.js +0 -6
- package/src/llm/bedrock/utils/message_inputs.js +0 -463
- package/src/llm/bedrock/utils/message_outputs.js +0 -269
- package/src/llm/fake.js +0 -92
- package/src/llm/google/index.js +0 -215
- package/src/llm/google/types.js +0 -12
- package/src/llm/google/utils/common.js +0 -670
- package/src/llm/google/utils/tools.js +0 -111
- package/src/llm/google/utils/zod_to_genai_parameters.js +0 -47
- package/src/llm/openai/index.js +0 -1033
- package/src/llm/openai/types.js +0 -2
- package/src/llm/openai/utils/index.js +0 -756
- package/src/llm/openai/utils/isReasoningModel.test.js +0 -79
- package/src/llm/openrouter/index.js +0 -261
- package/src/llm/openrouter/reasoning.test.js +0 -181
- package/src/llm/providers.js +0 -36
- package/src/llm/text.js +0 -65
- package/src/llm/vertexai/index.js +0 -402
- package/src/messages/__tests__/tools.test.js +0 -392
- package/src/messages/cache.js +0 -404
- package/src/messages/cache.test.js +0 -1167
- package/src/messages/content.js +0 -48
- package/src/messages/content.test.js +0 -314
- package/src/messages/core.js +0 -359
- package/src/messages/ensureThinkingBlock.test.js +0 -997
- package/src/messages/format.js +0 -973
- package/src/messages/formatAgentMessages.test.js +0 -2278
- package/src/messages/formatAgentMessages.tools.test.js +0 -362
- package/src/messages/formatMessage.test.js +0 -608
- package/src/messages/ids.js +0 -18
- package/src/messages/index.js +0 -9
- package/src/messages/labelContentByAgent.test.js +0 -725
- package/src/messages/prune.js +0 -438
- package/src/messages/reducer.js +0 -60
- package/src/messages/shiftIndexTokenCountMap.test.js +0 -63
- package/src/messages/summarize.js +0 -146
- package/src/messages/summarize.test.js +0 -332
- package/src/messages/tools.js +0 -90
- package/src/mockStream.js +0 -81
- package/src/prompts/collab.js +0 -7
- package/src/prompts/index.js +0 -3
- package/src/prompts/taskmanager.js +0 -58
- package/src/run.js +0 -427
- package/src/schemas/index.js +0 -3
- package/src/schemas/schema-preparation.test.js +0 -370
- package/src/schemas/validate.js +0 -314
- package/src/schemas/validate.test.js +0 -264
- package/src/scripts/abort.js +0 -127
- package/src/scripts/ant_web_search.js +0 -130
- package/src/scripts/ant_web_search_edge_case.js +0 -133
- package/src/scripts/ant_web_search_error_edge_case.js +0 -119
- package/src/scripts/args.js +0 -41
- package/src/scripts/bedrock-cache-debug.js +0 -186
- package/src/scripts/bedrock-content-aggregation-test.js +0 -195
- package/src/scripts/bedrock-merge-test.js +0 -80
- package/src/scripts/bedrock-parallel-tools-test.js +0 -150
- package/src/scripts/caching.js +0 -106
- package/src/scripts/cli.js +0 -152
- package/src/scripts/cli2.js +0 -119
- package/src/scripts/cli3.js +0 -163
- package/src/scripts/cli4.js +0 -165
- package/src/scripts/cli5.js +0 -165
- package/src/scripts/code_exec.js +0 -171
- package/src/scripts/code_exec_files.js +0 -180
- package/src/scripts/code_exec_multi_session.js +0 -185
- package/src/scripts/code_exec_ptc.js +0 -265
- package/src/scripts/code_exec_session.js +0 -217
- package/src/scripts/code_exec_simple.js +0 -120
- package/src/scripts/content.js +0 -111
- package/src/scripts/empty_input.js +0 -125
- package/src/scripts/handoff-test.js +0 -96
- package/src/scripts/image.js +0 -138
- package/src/scripts/memory.js +0 -83
- package/src/scripts/multi-agent-chain.js +0 -271
- package/src/scripts/multi-agent-conditional.js +0 -185
- package/src/scripts/multi-agent-document-review-chain.js +0 -171
- package/src/scripts/multi-agent-hybrid-flow.js +0 -264
- package/src/scripts/multi-agent-parallel-start.js +0 -214
- package/src/scripts/multi-agent-parallel.js +0 -346
- package/src/scripts/multi-agent-sequence.js +0 -184
- package/src/scripts/multi-agent-supervisor.js +0 -324
- package/src/scripts/multi-agent-test.js +0 -147
- package/src/scripts/parallel-asymmetric-tools-test.js +0 -202
- package/src/scripts/parallel-full-metadata-test.js +0 -176
- package/src/scripts/parallel-tools-test.js +0 -256
- package/src/scripts/programmatic_exec.js +0 -277
- package/src/scripts/programmatic_exec_agent.js +0 -168
- package/src/scripts/search.js +0 -118
- package/src/scripts/sequential-full-metadata-test.js +0 -143
- package/src/scripts/simple.js +0 -174
- package/src/scripts/single-agent-metadata-test.js +0 -152
- package/src/scripts/stream.js +0 -113
- package/src/scripts/test-custom-prompt-key.js +0 -132
- package/src/scripts/test-handoff-input.js +0 -143
- package/src/scripts/test-handoff-preamble.js +0 -227
- package/src/scripts/test-handoff-steering.js +0 -353
- package/src/scripts/test-multi-agent-list-handoff.js +0 -318
- package/src/scripts/test-parallel-agent-labeling.js +0 -253
- package/src/scripts/test-parallel-handoffs.js +0 -229
- package/src/scripts/test-thinking-handoff-bedrock.js +0 -132
- package/src/scripts/test-thinking-handoff.js +0 -132
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js +0 -140
- package/src/scripts/test-tool-before-handoff-role-order.js +0 -223
- package/src/scripts/test-tools-before-handoff.js +0 -187
- package/src/scripts/test_code_api.js +0 -263
- package/src/scripts/thinking-bedrock.js +0 -128
- package/src/scripts/thinking-vertexai.js +0 -130
- package/src/scripts/thinking.js +0 -134
- package/src/scripts/tool_search.js +0 -114
- package/src/scripts/tools.js +0 -125
- package/src/specs/agent-handoffs-bedrock.integration.test.js +0 -280
- package/src/specs/agent-handoffs.test.js +0 -924
- package/src/specs/anthropic.simple.test.js +0 -287
- package/src/specs/azure.simple.test.js +0 -381
- package/src/specs/cache.simple.test.js +0 -282
- package/src/specs/custom-event-await.test.js +0 -148
- package/src/specs/deepseek.simple.test.js +0 -189
- package/src/specs/emergency-prune.test.js +0 -308
- package/src/specs/moonshot.simple.test.js +0 -237
- package/src/specs/observability.integration.test.js +0 -1337
- package/src/specs/openai.simple.test.js +0 -233
- package/src/specs/openrouter.simple.test.js +0 -202
- package/src/specs/prune.test.js +0 -733
- package/src/specs/reasoning.test.js +0 -144
- package/src/specs/spec.utils.js +0 -4
- package/src/specs/thinking-handoff.test.js +0 -486
- package/src/specs/thinking-prune.test.js +0 -600
- package/src/specs/token-distribution-edge-case.test.js +0 -246
- package/src/specs/token-memoization.test.js +0 -32
- package/src/specs/tokens.test.js +0 -49
- package/src/specs/tool-error.test.js +0 -139
- package/src/splitStream.js +0 -204
- package/src/splitStream.test.js +0 -504
- package/src/stream.js +0 -650
- package/src/stream.test.js +0 -225
- package/src/test/mockTools.js +0 -340
- package/src/tools/BrowserTools.js +0 -245
- package/src/tools/Calculator.js +0 -38
- package/src/tools/Calculator.test.js +0 -225
- package/src/tools/CodeExecutor.js +0 -233
- package/src/tools/ProgrammaticToolCalling.js +0 -602
- package/src/tools/StreamingToolCallBuffer.js +0 -179
- package/src/tools/ToolNode.js +0 -930
- package/src/tools/ToolSearch.js +0 -904
- package/src/tools/__tests__/BrowserTools.test.js +0 -306
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +0 -276
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js +0 -807
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js +0 -175
- package/src/tools/__tests__/ToolApproval.test.js +0 -675
- package/src/tools/__tests__/ToolNode.recovery.test.js +0 -200
- package/src/tools/__tests__/ToolNode.session.test.js +0 -319
- package/src/tools/__tests__/ToolSearch.integration.test.js +0 -125
- package/src/tools/__tests__/ToolSearch.test.js +0 -812
- package/src/tools/__tests__/handlers.test.js +0 -799
- package/src/tools/__tests__/truncation-recovery.integration.test.js +0 -362
- package/src/tools/handlers.js +0 -306
- package/src/tools/schema.js +0 -25
- package/src/tools/search/anthropic.js +0 -34
- package/src/tools/search/content.js +0 -116
- package/src/tools/search/content.test.js +0 -133
- package/src/tools/search/firecrawl.js +0 -173
- package/src/tools/search/format.js +0 -198
- package/src/tools/search/highlights.js +0 -241
- package/src/tools/search/index.js +0 -3
- package/src/tools/search/jina-reranker.test.js +0 -106
- package/src/tools/search/rerankers.js +0 -165
- package/src/tools/search/schema.js +0 -102
- package/src/tools/search/search.js +0 -561
- package/src/tools/search/serper-scraper.js +0 -126
- package/src/tools/search/test.js +0 -129
- package/src/tools/search/tool.js +0 -453
- package/src/tools/search/types.js +0 -2
- package/src/tools/search/utils.js +0 -59
- package/src/types/graph.js +0 -24
- package/src/types/graph.test.js +0 -192
- package/src/types/index.js +0 -7
- package/src/types/llm.js +0 -2
- package/src/types/messages.js +0 -2
- package/src/types/run.js +0 -2
- package/src/types/stream.js +0 -2
- package/src/types/tools.js +0 -2
- package/src/utils/contextAnalytics.js +0 -79
- package/src/utils/contextAnalytics.test.js +0 -166
- package/src/utils/events.js +0 -26
- package/src/utils/graph.js +0 -11
- package/src/utils/handlers.js +0 -65
- package/src/utils/index.js +0 -10
- package/src/utils/llm.js +0 -21
- package/src/utils/llmConfig.js +0 -205
- package/src/utils/logging.js +0 -37
- package/src/utils/misc.js +0 -51
- package/src/utils/run.js +0 -69
- package/src/utils/schema.js +0 -21
- package/src/utils/title.js +0 -119
- package/src/utils/tokens.js +0 -92
- package/src/utils/toonFormat.js +0 -379
package/src/messages/core.js
DELETED
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
// src/messages.ts
|
|
2
|
-
import { AIMessageChunk, HumanMessage, AIMessage, } from '@langchain/core/messages';
|
|
3
|
-
import { Providers, MessageTypes } from '@/common';
|
|
4
|
-
export function getConverseOverrideMessage({ userMessage, lastMessageX, lastMessageY, }) {
|
|
5
|
-
const content = `
|
|
6
|
-
User: ${userMessage[1]}
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
# YOU HAVE ALREADY RESPONDED TO THE LATEST USER MESSAGE:
|
|
10
|
-
|
|
11
|
-
# Observations:
|
|
12
|
-
- ${lastMessageX?.content}
|
|
13
|
-
|
|
14
|
-
# Tool Calls:
|
|
15
|
-
- ${lastMessageX?.tool_calls?.join('\n- ')}
|
|
16
|
-
|
|
17
|
-
# Tool Responses:
|
|
18
|
-
- ${lastMessageY.content}
|
|
19
|
-
`;
|
|
20
|
-
return new HumanMessage(content);
|
|
21
|
-
}
|
|
22
|
-
const _allowedTypes = ['image_url', 'text', 'tool_use', 'tool_result'];
|
|
23
|
-
const allowedTypesByProvider = {
|
|
24
|
-
default: _allowedTypes,
|
|
25
|
-
[Providers.ANTHROPIC]: [..._allowedTypes, 'thinking', 'redacted_thinking'],
|
|
26
|
-
[Providers.BEDROCK]: [..._allowedTypes, 'reasoning_content'],
|
|
27
|
-
[Providers.OPENAI]: _allowedTypes,
|
|
28
|
-
};
|
|
29
|
-
const modifyContent = ({ provider, messageType, content, }) => {
|
|
30
|
-
const allowedTypes = allowedTypesByProvider[provider] ?? allowedTypesByProvider.default;
|
|
31
|
-
return content.map((item) => {
|
|
32
|
-
if (item &&
|
|
33
|
-
typeof item === 'object' &&
|
|
34
|
-
'type' in item &&
|
|
35
|
-
item.type != null &&
|
|
36
|
-
item.type) {
|
|
37
|
-
let newType = item.type;
|
|
38
|
-
if (newType.endsWith('_delta')) {
|
|
39
|
-
newType = newType.replace('_delta', '');
|
|
40
|
-
}
|
|
41
|
-
if (!allowedTypes.includes(newType)) {
|
|
42
|
-
newType = 'text';
|
|
43
|
-
}
|
|
44
|
-
/* Handle the edge case for empty object 'tool_use' input in AI messages */
|
|
45
|
-
if (messageType === 'ai' &&
|
|
46
|
-
newType === 'tool_use' &&
|
|
47
|
-
'input' in item &&
|
|
48
|
-
item.input === '') {
|
|
49
|
-
return { ...item, type: newType, input: '{}' };
|
|
50
|
-
}
|
|
51
|
-
return { ...item, type: newType };
|
|
52
|
-
}
|
|
53
|
-
return item;
|
|
54
|
-
});
|
|
55
|
-
};
|
|
56
|
-
function reduceBlocks(blocks) {
|
|
57
|
-
const reduced = [];
|
|
58
|
-
for (const block of blocks) {
|
|
59
|
-
const lastBlock = reduced[reduced.length - 1];
|
|
60
|
-
// Merge consecutive 'reasoning_content'
|
|
61
|
-
if (block.type === 'reasoning_content' &&
|
|
62
|
-
lastBlock?.type === 'reasoning_content') {
|
|
63
|
-
// append text if exists
|
|
64
|
-
if (block.reasoningText?.text != null && block.reasoningText.text) {
|
|
65
|
-
lastBlock.reasoningText.text =
|
|
66
|
-
(lastBlock.reasoningText?.text ?? '') + block.reasoningText.text;
|
|
67
|
-
}
|
|
68
|
-
// preserve the signature if exists
|
|
69
|
-
if (block.reasoningText?.signature != null &&
|
|
70
|
-
block.reasoningText.signature) {
|
|
71
|
-
lastBlock.reasoningText.signature = block.reasoningText.signature;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Merge consecutive 'text'
|
|
75
|
-
else if (block.type === 'text' && lastBlock?.type === 'text') {
|
|
76
|
-
lastBlock.text += block.text;
|
|
77
|
-
}
|
|
78
|
-
// add a new block as it's a different type or first element
|
|
79
|
-
else {
|
|
80
|
-
// deep copy to avoid mutation of original
|
|
81
|
-
reduced.push(JSON.parse(JSON.stringify(block)));
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return reduced;
|
|
85
|
-
}
|
|
86
|
-
export function modifyDeltaProperties(provider, obj) {
|
|
87
|
-
if (!obj || typeof obj !== 'object')
|
|
88
|
-
return obj;
|
|
89
|
-
const messageType = obj._getType
|
|
90
|
-
? obj._getType()
|
|
91
|
-
: '';
|
|
92
|
-
if (provider === Providers.BEDROCK && Array.isArray(obj.content)) {
|
|
93
|
-
obj.content = reduceBlocks(obj.content);
|
|
94
|
-
}
|
|
95
|
-
if (Array.isArray(obj.content)) {
|
|
96
|
-
obj.content = modifyContent({
|
|
97
|
-
provider,
|
|
98
|
-
messageType,
|
|
99
|
-
content: obj.content,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
if (obj.lc_kwargs &&
|
|
103
|
-
Array.isArray(obj.lc_kwargs.content)) {
|
|
104
|
-
if (provider === Providers.BEDROCK) {
|
|
105
|
-
obj.lc_kwargs.content = reduceBlocks(obj.lc_kwargs.content);
|
|
106
|
-
}
|
|
107
|
-
obj.lc_kwargs.content = modifyContent({
|
|
108
|
-
provider,
|
|
109
|
-
messageType,
|
|
110
|
-
content: obj.lc_kwargs.content,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
return obj;
|
|
114
|
-
}
|
|
115
|
-
export function formatAnthropicMessage(message) {
|
|
116
|
-
if (!message.tool_calls || message.tool_calls.length === 0) {
|
|
117
|
-
return new AIMessage({ content: message.content });
|
|
118
|
-
}
|
|
119
|
-
const toolCallMap = new Map(message.tool_calls.map((tc) => [tc.id, tc]));
|
|
120
|
-
let formattedContent;
|
|
121
|
-
if (Array.isArray(message.content)) {
|
|
122
|
-
formattedContent = message.content.reduce((acc, item) => {
|
|
123
|
-
if (typeof item === 'object') {
|
|
124
|
-
const extendedItem = item;
|
|
125
|
-
if (extendedItem.type === 'text' &&
|
|
126
|
-
extendedItem.text != null &&
|
|
127
|
-
extendedItem.text) {
|
|
128
|
-
acc.push({ type: 'text', text: extendedItem.text });
|
|
129
|
-
}
|
|
130
|
-
else if (extendedItem.type === 'tool_use' &&
|
|
131
|
-
extendedItem.id != null &&
|
|
132
|
-
extendedItem.id) {
|
|
133
|
-
const toolCall = toolCallMap.get(extendedItem.id);
|
|
134
|
-
if (toolCall) {
|
|
135
|
-
acc.push({
|
|
136
|
-
type: 'tool_use',
|
|
137
|
-
id: extendedItem.id,
|
|
138
|
-
name: toolCall.name,
|
|
139
|
-
input: toolCall.args,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
else if ('input' in extendedItem &&
|
|
144
|
-
extendedItem.input != null &&
|
|
145
|
-
extendedItem.input) {
|
|
146
|
-
try {
|
|
147
|
-
const parsedInput = JSON.parse(extendedItem.input);
|
|
148
|
-
const toolCall = message.tool_calls?.find((tc) => tc.args.input === parsedInput.input);
|
|
149
|
-
if (toolCall) {
|
|
150
|
-
acc.push({
|
|
151
|
-
type: 'tool_use',
|
|
152
|
-
id: toolCall.id,
|
|
153
|
-
name: toolCall.name,
|
|
154
|
-
input: toolCall.args,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
if (extendedItem.input) {
|
|
160
|
-
acc.push({ type: 'text', text: extendedItem.input });
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else if (typeof item === 'string') {
|
|
166
|
-
acc.push({ type: 'text', text: item });
|
|
167
|
-
}
|
|
168
|
-
return acc;
|
|
169
|
-
}, []);
|
|
170
|
-
}
|
|
171
|
-
else if (typeof message.content === 'string') {
|
|
172
|
-
formattedContent = message.content;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
formattedContent = [];
|
|
176
|
-
}
|
|
177
|
-
// const formattedToolCalls: ToolCall[] = message.tool_calls.map(toolCall => ({
|
|
178
|
-
// id: toolCall.id ?? '',
|
|
179
|
-
// name: toolCall.name,
|
|
180
|
-
// args: toolCall.args,
|
|
181
|
-
// type: 'tool_call',
|
|
182
|
-
// }));
|
|
183
|
-
const formattedToolCalls = message.tool_calls.map((toolCall) => ({
|
|
184
|
-
id: toolCall.id ?? '',
|
|
185
|
-
type: 'function',
|
|
186
|
-
function: {
|
|
187
|
-
name: toolCall.name,
|
|
188
|
-
arguments: toolCall.args,
|
|
189
|
-
},
|
|
190
|
-
}));
|
|
191
|
-
return new AIMessage({
|
|
192
|
-
content: formattedContent,
|
|
193
|
-
tool_calls: formattedToolCalls,
|
|
194
|
-
additional_kwargs: {
|
|
195
|
-
...message.additional_kwargs,
|
|
196
|
-
},
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
export function convertMessagesToContent(messages) {
|
|
200
|
-
const processedContent = [];
|
|
201
|
-
const addContentPart = (message) => {
|
|
202
|
-
const content = message?.lc_kwargs.content != null
|
|
203
|
-
? message.lc_kwargs.content
|
|
204
|
-
: message?.content;
|
|
205
|
-
if (content === undefined) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
if (typeof content === 'string') {
|
|
209
|
-
processedContent.push({
|
|
210
|
-
type: 'text',
|
|
211
|
-
text: content,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
else if (Array.isArray(content)) {
|
|
215
|
-
const filteredContent = content.filter((item) => item != null && item.type !== 'tool_use');
|
|
216
|
-
processedContent.push(...filteredContent);
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
let currentAIMessageIndex = -1;
|
|
220
|
-
const toolCallMap = new Map();
|
|
221
|
-
for (let i = 0; i < messages.length; i++) {
|
|
222
|
-
const message = messages[i];
|
|
223
|
-
const messageType = message?._getType();
|
|
224
|
-
if (messageType === 'ai' &&
|
|
225
|
-
(message.tool_calls?.length ?? 0) > 0) {
|
|
226
|
-
const tool_calls = message.tool_calls || [];
|
|
227
|
-
for (const tool_call of tool_calls) {
|
|
228
|
-
if (tool_call.id == null || !tool_call.id) {
|
|
229
|
-
continue;
|
|
230
|
-
}
|
|
231
|
-
toolCallMap.set(tool_call.id, tool_call);
|
|
232
|
-
}
|
|
233
|
-
addContentPart(message);
|
|
234
|
-
currentAIMessageIndex = processedContent.length - 1;
|
|
235
|
-
continue;
|
|
236
|
-
}
|
|
237
|
-
else if (messageType === 'tool' &&
|
|
238
|
-
message.tool_call_id) {
|
|
239
|
-
const id = message.tool_call_id;
|
|
240
|
-
const output = message.content;
|
|
241
|
-
const tool_call = toolCallMap.get(id);
|
|
242
|
-
if (currentAIMessageIndex === -1) {
|
|
243
|
-
processedContent.push({ type: 'text', text: '' });
|
|
244
|
-
currentAIMessageIndex = processedContent.length - 1;
|
|
245
|
-
}
|
|
246
|
-
const contentPart = processedContent[currentAIMessageIndex];
|
|
247
|
-
processedContent.push({
|
|
248
|
-
type: 'tool_call',
|
|
249
|
-
tool_call: Object.assign({}, tool_call, { output }),
|
|
250
|
-
});
|
|
251
|
-
const tool_call_ids = contentPart.tool_call_ids || [];
|
|
252
|
-
tool_call_ids.push(id);
|
|
253
|
-
contentPart.tool_call_ids = tool_call_ids;
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
else if (messageType !== 'ai') {
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
addContentPart(message);
|
|
260
|
-
}
|
|
261
|
-
return processedContent;
|
|
262
|
-
}
|
|
263
|
-
export function formatAnthropicArtifactContent(messages) {
|
|
264
|
-
const lastMessage = messages[messages.length - 1];
|
|
265
|
-
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
266
|
-
if (lastMessage.getType() !== 'tool')
|
|
267
|
-
return;
|
|
268
|
-
const lastToolMessage = lastMessage;
|
|
269
|
-
// Find the latest AIMessage with tool_calls that this tool message belongs to
|
|
270
|
-
const latestAIParentIndex = findLastIndex(messages, (msg) => (msg instanceof AIMessageChunk &&
|
|
271
|
-
(msg.tool_calls?.length ?? 0) > 0 &&
|
|
272
|
-
msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??
|
|
273
|
-
false);
|
|
274
|
-
if (latestAIParentIndex === -1)
|
|
275
|
-
return;
|
|
276
|
-
// Check if any tool message after the AI message has array artifact content
|
|
277
|
-
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
278
|
-
const hasArtifactContent = messages.some((msg, i) => i > latestAIParentIndex &&
|
|
279
|
-
msg.getType() === MessageTypes.TOOL &&
|
|
280
|
-
msg.artifact != null &&
|
|
281
|
-
msg.artifact?.content != null &&
|
|
282
|
-
Array.isArray(msg.artifact.content));
|
|
283
|
-
if (!hasArtifactContent)
|
|
284
|
-
return;
|
|
285
|
-
const message = messages[latestAIParentIndex];
|
|
286
|
-
const toolCallIds = message.tool_calls?.map((tc) => tc.id) ?? [];
|
|
287
|
-
for (let j = latestAIParentIndex + 1; j < messages.length; j++) {
|
|
288
|
-
const msg = messages[j];
|
|
289
|
-
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
290
|
-
if (msg.getType() === MessageTypes.TOOL &&
|
|
291
|
-
toolCallIds.includes(msg.tool_call_id) &&
|
|
292
|
-
msg.artifact != null &&
|
|
293
|
-
Array.isArray(msg.artifact?.content) &&
|
|
294
|
-
Array.isArray(msg.content)) {
|
|
295
|
-
msg.content = msg.content.concat(msg.artifact.content);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
export function formatArtifactPayload(messages) {
|
|
300
|
-
const lastMessageY = messages[messages.length - 1];
|
|
301
|
-
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
302
|
-
if (lastMessageY.getType() !== 'tool')
|
|
303
|
-
return;
|
|
304
|
-
const lastToolMessage = lastMessageY;
|
|
305
|
-
// Find the latest AIMessage with tool_calls that this tool message belongs to
|
|
306
|
-
const latestAIParentIndex = findLastIndex(messages, (msg) => (msg instanceof AIMessageChunk &&
|
|
307
|
-
(msg.tool_calls?.length ?? 0) > 0 &&
|
|
308
|
-
msg.tool_calls?.some((tc) => tc.id === lastToolMessage.tool_call_id)) ??
|
|
309
|
-
false);
|
|
310
|
-
if (latestAIParentIndex === -1)
|
|
311
|
-
return;
|
|
312
|
-
// Check if any tool message after the AI message has array artifact content
|
|
313
|
-
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
314
|
-
const hasArtifactContent = messages.some((msg, i) => i > latestAIParentIndex &&
|
|
315
|
-
msg.getType() === MessageTypes.TOOL &&
|
|
316
|
-
msg.artifact != null &&
|
|
317
|
-
msg.artifact?.content != null &&
|
|
318
|
-
Array.isArray(msg.artifact.content));
|
|
319
|
-
if (!hasArtifactContent)
|
|
320
|
-
return;
|
|
321
|
-
// Collect all relevant tool messages and their artifacts
|
|
322
|
-
// Use getType() instead of instanceof to avoid module mismatch issues
|
|
323
|
-
const relevantMessages = messages
|
|
324
|
-
.slice(latestAIParentIndex + 1)
|
|
325
|
-
.filter((msg) => msg.getType() === MessageTypes.TOOL);
|
|
326
|
-
// Aggregate all content and artifacts
|
|
327
|
-
const aggregatedContent = [];
|
|
328
|
-
relevantMessages.forEach((msg) => {
|
|
329
|
-
if (!Array.isArray(msg.artifact?.content)) {
|
|
330
|
-
return;
|
|
331
|
-
}
|
|
332
|
-
let currentContent = msg.content;
|
|
333
|
-
if (!Array.isArray(currentContent)) {
|
|
334
|
-
currentContent = [
|
|
335
|
-
{
|
|
336
|
-
type: 'text',
|
|
337
|
-
text: msg.content,
|
|
338
|
-
},
|
|
339
|
-
];
|
|
340
|
-
}
|
|
341
|
-
aggregatedContent.push(...currentContent);
|
|
342
|
-
msg.content =
|
|
343
|
-
'Tool response is included in the next message as a Human message';
|
|
344
|
-
aggregatedContent.push(...msg.artifact.content);
|
|
345
|
-
});
|
|
346
|
-
// Add single HumanMessage with all aggregated content
|
|
347
|
-
if (aggregatedContent.length > 0) {
|
|
348
|
-
messages.push(new HumanMessage({ content: aggregatedContent }));
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
export function findLastIndex(array, predicate) {
|
|
352
|
-
for (let i = array.length - 1; i >= 0; i--) {
|
|
353
|
-
if (predicate(array[i])) {
|
|
354
|
-
return i;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return -1;
|
|
358
|
-
}
|
|
359
|
-
//# sourceMappingURL=core.js.map
|