@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
|
@@ -534,7 +534,7 @@ class MultiAgentGraph extends StandardGraph {
|
|
|
534
534
|
'This is a bug: createWorkflow() should have populated the subgraph registry.');
|
|
535
535
|
}
|
|
536
536
|
const state = getCurrentTaskInput();
|
|
537
|
-
let childMessages = [...state.messages];
|
|
537
|
+
let childMessages = MultiAgentGraph.prepareHandoffMessages([...state.messages]);
|
|
538
538
|
/** Inject instructions as HumanMessage if provided by the parent LLM */
|
|
539
539
|
if (hasPromptInput &&
|
|
540
540
|
promptKey in input &&
|
|
@@ -682,6 +682,110 @@ class MultiAgentGraph extends StandardGraph {
|
|
|
682
682
|
* @param agentId - The agent ID to check for handoff reception
|
|
683
683
|
* @returns Object with filtered messages, extracted instructions, source agent, and parallel siblings
|
|
684
684
|
*/
|
|
685
|
+
/**
|
|
686
|
+
* Prepare messages for a handoff child agent.
|
|
687
|
+
*
|
|
688
|
+
* Handles two problems:
|
|
689
|
+
* 1. **Orphaned tool_use**: The parent's AI message contains a `tool_use` block
|
|
690
|
+
* for the handoff tool itself, with no matching `tool_result`. Providers
|
|
691
|
+
* (Bedrock/Anthropic) reject this.
|
|
692
|
+
* 2. **Paired tool_use/tool_result in history**: The child may not have the same
|
|
693
|
+
* tools as the parent. Bedrock requires `toolConfig` when tool_use/tool_result
|
|
694
|
+
* blocks exist in the message history. Compacting these into text summaries
|
|
695
|
+
* avoids the requirement and reduces context bloat.
|
|
696
|
+
*
|
|
697
|
+
* Strategy:
|
|
698
|
+
* - Remove orphaned tool_use blocks (no matching tool_result)
|
|
699
|
+
* - Compact paired tool_use/tool_result interactions into text summaries
|
|
700
|
+
*/
|
|
701
|
+
static prepareHandoffMessages(messages) {
|
|
702
|
+
if (messages.length === 0)
|
|
703
|
+
return messages;
|
|
704
|
+
/** Collect all tool_result IDs so we know which tool_use blocks are paired */
|
|
705
|
+
const pairedToolCallIds = new Set();
|
|
706
|
+
for (const msg of messages) {
|
|
707
|
+
if (msg.getType() === 'tool') {
|
|
708
|
+
const tm = msg;
|
|
709
|
+
if (tm.tool_call_id) {
|
|
710
|
+
pairedToolCallIds.add(tm.tool_call_id);
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* Pass 1: Remove orphaned tool_use blocks (no matching tool_result).
|
|
716
|
+
* Also skip ToolMessages since we'll compact paired ones in pass 2.
|
|
717
|
+
*/
|
|
718
|
+
const cleaned = [];
|
|
719
|
+
for (const msg of messages) {
|
|
720
|
+
/** Skip all ToolMessages — paired ones will be compacted in pass 2 */
|
|
721
|
+
if (msg.getType() === 'tool') {
|
|
722
|
+
continue;
|
|
723
|
+
}
|
|
724
|
+
if (msg.getType() !== 'ai') {
|
|
725
|
+
cleaned.push(msg);
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
const aiMsg = msg;
|
|
729
|
+
const toolCalls = aiMsg.tool_calls ?? [];
|
|
730
|
+
if (toolCalls.length === 0) {
|
|
731
|
+
cleaned.push(msg);
|
|
732
|
+
continue;
|
|
733
|
+
}
|
|
734
|
+
/** Extract text content from the AI message */
|
|
735
|
+
const textContent = typeof aiMsg.content === 'string'
|
|
736
|
+
? aiMsg.content
|
|
737
|
+
: Array.isArray(aiMsg.content)
|
|
738
|
+
? aiMsg.content
|
|
739
|
+
.filter((b) => b.type === 'text' && 'text' in b)
|
|
740
|
+
.map((b) => b.text ?? '')
|
|
741
|
+
.join('\n')
|
|
742
|
+
: '';
|
|
743
|
+
/** Build text summaries of paired tool calls */
|
|
744
|
+
const toolSummaries = [];
|
|
745
|
+
for (const tc of toolCalls) {
|
|
746
|
+
if (tc.id != null && pairedToolCallIds.has(tc.id)) {
|
|
747
|
+
/** Find the matching ToolMessage result */
|
|
748
|
+
const toolResult = messages.find((m) => m.getType() === 'tool' && m.tool_call_id === tc.id);
|
|
749
|
+
const resultContent = toolResult
|
|
750
|
+
? typeof toolResult.content === 'string'
|
|
751
|
+
? toolResult.content.slice(0, 500)
|
|
752
|
+
: '[complex result]'
|
|
753
|
+
: '[no result]';
|
|
754
|
+
toolSummaries.push(`[Tool "${tc.name}": ${resultContent}]`);
|
|
755
|
+
}
|
|
756
|
+
// Orphaned tool_use blocks (no matching result) are silently dropped
|
|
757
|
+
}
|
|
758
|
+
/** Reconstruct as plain text AI message (no tool_calls) */
|
|
759
|
+
const parts = [textContent, ...toolSummaries].filter(Boolean);
|
|
760
|
+
if (parts.length > 0) {
|
|
761
|
+
cleaned.push(new AIMessage({
|
|
762
|
+
content: parts.join('\n\n'),
|
|
763
|
+
id: aiMsg.id,
|
|
764
|
+
}));
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Ensure messages end with a HumanMessage.
|
|
769
|
+
* After stripping tool artifacts, the last message may be an AIMessage
|
|
770
|
+
* (orchestrator's reasoning before the handoff). Some providers (Bedrock,
|
|
771
|
+
* Google/VertexAI) reject conversations ending with an assistant message.
|
|
772
|
+
* Convert the trailing AIMessage to a HumanMessage to preserve any useful
|
|
773
|
+
* context (e.g., compacted tool summaries) while satisfying the API requirement.
|
|
774
|
+
*/
|
|
775
|
+
if (cleaned.length > 0 && cleaned[cleaned.length - 1].getType() === 'ai') {
|
|
776
|
+
const lastAI = cleaned[cleaned.length - 1];
|
|
777
|
+
const content = typeof lastAI.content === 'string'
|
|
778
|
+
? lastAI.content
|
|
779
|
+
: '';
|
|
780
|
+
if (content.trim()) {
|
|
781
|
+
cleaned[cleaned.length - 1] = new HumanMessage(`[Context from orchestrator]: ${content}`);
|
|
782
|
+
}
|
|
783
|
+
else {
|
|
784
|
+
cleaned.pop();
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
return cleaned;
|
|
788
|
+
}
|
|
685
789
|
processTransferReception(messages, agentId) {
|
|
686
790
|
if (messages.length === 0)
|
|
687
791
|
return null;
|