@illuma-ai/agents 1.0.90 → 1.0.93
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/agents/AgentContext.cjs +98 -49
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/constants.cjs +25 -0
- package/dist/cjs/common/constants.cjs.map +1 -0
- package/dist/cjs/common/enum.cjs +30 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/events.cjs +9 -4
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +397 -92
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +223 -92
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +30 -14
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +43 -11
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +10 -7
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +32 -0
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +129 -101
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +489 -0
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -0
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +176 -0
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -0
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +1 -1
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +59 -5
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/text.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +80 -2
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +60 -27
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +131 -108
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +3 -0
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +265 -47
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +55 -2
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/summarize.cjs +170 -0
- package/dist/cjs/messages/summarize.cjs.map +1 -0
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/run.cjs +87 -30
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/schemas/validate.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +59 -25
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/AskUser.cjs +131 -0
- package/dist/cjs/tools/AskUser.cjs.map +1 -0
- package/dist/cjs/tools/BrowserTools.cjs +11 -7
- package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +46 -4
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +36 -53
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/StreamingToolCallBuffer.cjs +208 -0
- package/dist/cjs/tools/StreamingToolCallBuffer.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +333 -30
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +66 -30
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +94 -8
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/schema.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.map +1 -1
- package/dist/cjs/tools/search/search.cjs +1 -0
- 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.map +1 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/types/graph.cjs +1 -1
- package/dist/cjs/types/graph.cjs.map +1 -1
- package/dist/cjs/utils/contextAnalytics.cjs +23 -6
- package/dist/cjs/utils/contextAnalytics.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs.map +1 -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 +3 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/schema.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +33 -58
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/toolCallContinuation.cjs +55 -0
- package/dist/cjs/utils/toolCallContinuation.cjs.map +1 -0
- package/dist/cjs/utils/toonFormat.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +98 -49
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/constants.mjs +22 -0
- package/dist/esm/common/constants.mjs.map +1 -0
- package/dist/esm/common/enum.mjs +31 -1
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/events.mjs +9 -4
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +393 -88
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +224 -93
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +30 -14
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +43 -11
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +10 -7
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +32 -0
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +128 -101
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +484 -0
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -0
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +171 -0
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -0
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +1 -1
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +59 -5
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/text.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +80 -2
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +8 -3
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +131 -108
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +4 -1
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +267 -49
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +56 -4
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/summarize.mjs +161 -0
- package/dist/esm/messages/summarize.mjs.map +1 -0
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/run.mjs +88 -31
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/schemas/validate.mjs.map +1 -1
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +60 -26
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/AskUser.mjs +125 -0
- package/dist/esm/tools/AskUser.mjs.map +1 -0
- package/dist/esm/tools/BrowserTools.mjs +11 -7
- package/dist/esm/tools/BrowserTools.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +46 -4
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +37 -54
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/StreamingToolCallBuffer.mjs +206 -0
- package/dist/esm/tools/StreamingToolCallBuffer.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +333 -30
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +66 -30
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +95 -9
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/schema.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.map +1 -1
- package/dist/esm/tools/search/search.mjs +1 -0
- 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.map +1 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/types/graph.mjs +1 -1
- package/dist/esm/types/graph.mjs.map +1 -1
- package/dist/esm/utils/contextAnalytics.mjs +23 -6
- package/dist/esm/utils/contextAnalytics.mjs.map +1 -1
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs.map +1 -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 +3 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/schema.mjs.map +1 -1
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +33 -59
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/toolCallContinuation.mjs +52 -0
- package/dist/esm/utils/toolCallContinuation.mjs.map +1 -0
- package/dist/esm/utils/toonFormat.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +14 -7
- package/dist/types/common/constants.d.ts +18 -0
- package/dist/types/common/enum.d.ts +28 -0
- package/dist/types/common/index.d.ts +1 -0
- package/dist/types/events.d.ts +10 -3
- package/dist/types/graphs/Graph.d.ts +37 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/llm/anthropic/index.d.ts +7 -1
- package/dist/types/llm/anthropic/types.d.ts +5 -2
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/bedrock/index.d.ts +40 -33
- package/dist/types/llm/bedrock/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/google/index.d.ts +2 -3
- package/dist/types/llm/openrouter/index.d.ts +21 -1
- package/dist/types/llm/vertexai/index.d.ts +3 -2
- package/dist/types/messages/cache.d.ts +1 -1
- package/dist/types/messages/index.d.ts +1 -0
- package/dist/types/messages/prune.d.ts +2 -7
- package/dist/types/messages/summarize.d.ts +33 -0
- package/dist/types/run.d.ts +6 -0
- package/dist/types/tools/AskUser.d.ts +408 -0
- package/dist/types/tools/BrowserTools.d.ts +2 -2
- package/dist/types/tools/CodeExecutor.d.ts +2 -2
- package/dist/types/tools/StreamingToolCallBuffer.d.ts +106 -0
- package/dist/types/tools/ToolNode.d.ts +55 -3
- package/dist/types/tools/ToolSearch.d.ts +9 -5
- package/dist/types/tools/handlers.d.ts +2 -2
- package/dist/types/types/graph.d.ts +9 -2
- package/dist/types/types/llm.d.ts +8 -3
- package/dist/types/types/run.d.ts +2 -0
- package/dist/types/types/tools.d.ts +20 -2
- package/dist/types/utils/contextAnalytics.d.ts +5 -4
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/tokens.d.ts +6 -19
- package/dist/types/utils/toolCallContinuation.d.ts +30 -0
- package/package.json +15 -8
- package/src/agents/AgentContext.js +782 -0
- package/src/agents/AgentContext.js.map +1 -0
- package/src/agents/AgentContext.test.js +421 -0
- package/src/agents/AgentContext.test.js.map +1 -0
- package/src/agents/AgentContext.ts +132 -64
- package/src/agents/__tests__/AgentContext.test.js +678 -0
- package/src/agents/__tests__/AgentContext.test.js.map +1 -0
- package/src/agents/__tests__/AgentContext.test.ts +25 -4
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js +117 -0
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
- package/src/common/__tests__/enum.test.ts +135 -0
- package/src/common/constants.ts +21 -0
- package/src/common/enum.js +192 -0
- package/src/common/enum.js.map +1 -0
- package/src/common/enum.ts +30 -0
- package/src/common/index.js +3 -0
- package/src/common/index.js.map +1 -0
- package/src/common/index.ts +2 -1
- package/src/events.js +166 -0
- package/src/events.js.map +1 -0
- package/src/events.ts +11 -14
- package/src/graphs/Graph.js +1857 -0
- package/src/graphs/Graph.js.map +1 -0
- package/src/graphs/Graph.ts +580 -162
- package/src/graphs/MultiAgentGraph.js +1092 -0
- package/src/graphs/MultiAgentGraph.js.map +1 -0
- package/src/graphs/MultiAgentGraph.ts +331 -112
- package/src/graphs/__tests__/adaptive-thinking.test.ts +369 -0
- package/src/graphs/__tests__/graph-direct-tool-names.test.ts +210 -0
- package/src/graphs/__tests__/multi-agent-edges.test.ts +237 -0
- package/src/graphs/__tests__/structured-output.integration.test.js +624 -0
- package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
- package/src/graphs/__tests__/structured-output.test.js +144 -0
- package/src/graphs/__tests__/structured-output.test.js.map +1 -0
- package/src/graphs/contextManagement.e2e.test.js +718 -0
- package/src/graphs/contextManagement.e2e.test.js.map +1 -0
- package/src/graphs/contextManagement.e2e.test.ts +990 -0
- package/src/graphs/contextManagement.test.js +485 -0
- package/src/graphs/contextManagement.test.js.map +1 -0
- package/src/graphs/contextManagement.test.ts +625 -0
- package/src/graphs/handoffValidation.test.js +276 -0
- package/src/graphs/handoffValidation.test.js.map +1 -0
- package/src/graphs/handoffValidation.test.ts +353 -0
- package/src/graphs/index.js +3 -0
- package/src/graphs/index.js.map +1 -0
- package/src/index.js +28 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +13 -0
- package/src/instrumentation.js +21 -0
- package/src/instrumentation.js.map +1 -0
- package/src/instrumentation.ts +38 -17
- package/src/llm/anthropic/index.js +319 -0
- package/src/llm/anthropic/index.js.map +1 -0
- package/src/llm/anthropic/index.ts +68 -15
- package/src/llm/anthropic/llm.spec.ts +402 -0
- package/src/llm/anthropic/types.js +46 -0
- package/src/llm/anthropic/types.js.map +1 -0
- package/src/llm/anthropic/types.ts +8 -2
- package/src/llm/anthropic/utils/message_inputs.js +627 -0
- package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
- package/src/llm/anthropic/utils/message_inputs.ts +16 -33
- package/src/llm/anthropic/utils/message_outputs.js +290 -0
- package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
- package/src/llm/anthropic/utils/message_outputs.ts +40 -1
- package/src/llm/anthropic/utils/output_parsers.js +89 -0
- package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
- package/src/llm/anthropic/utils/tools.js +25 -0
- package/src/llm/anthropic/utils/tools.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js +392 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +24 -40
- package/src/llm/bedrock/index.js +303 -0
- package/src/llm/bedrock/index.js.map +1 -0
- package/src/llm/bedrock/index.ts +171 -134
- package/src/llm/bedrock/llm.spec.ts +395 -52
- package/src/llm/bedrock/types.js +2 -0
- package/src/llm/bedrock/types.js.map +1 -0
- package/src/llm/bedrock/utils/index.js +6 -0
- package/src/llm/bedrock/utils/index.js.map +1 -0
- package/src/llm/bedrock/utils/message_inputs.js +463 -0
- package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
- package/src/llm/bedrock/utils/message_inputs.ts +30 -5
- package/src/llm/bedrock/utils/message_outputs.js +269 -0
- package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
- package/src/llm/bedrock/utils/message_outputs.ts +70 -22
- package/src/llm/fake.js +92 -0
- package/src/llm/fake.js.map +1 -0
- package/src/llm/google/index.js +215 -0
- package/src/llm/google/index.js.map +1 -0
- package/src/llm/google/index.ts +2 -3
- package/src/llm/google/types.js +12 -0
- package/src/llm/google/types.js.map +1 -0
- package/src/llm/google/utils/common.js +670 -0
- package/src/llm/google/utils/common.js.map +1 -0
- package/src/llm/google/utils/tools.js +111 -0
- package/src/llm/google/utils/tools.js.map +1 -0
- package/src/llm/google/utils/zod_to_genai_parameters.js +47 -0
- package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
- package/src/llm/openai/index.js +1033 -0
- package/src/llm/openai/index.js.map +1 -0
- package/src/llm/openai/types.js +2 -0
- package/src/llm/openai/types.js.map +1 -0
- package/src/llm/openai/utils/index.js +756 -0
- package/src/llm/openai/utils/index.js.map +1 -0
- package/src/llm/openai/utils/isReasoningModel.test.js +79 -0
- package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
- package/src/llm/openrouter/index.js +261 -0
- package/src/llm/openrouter/index.js.map +1 -0
- package/src/llm/openrouter/index.ts +117 -6
- package/src/llm/openrouter/reasoning.test.js +181 -0
- package/src/llm/openrouter/reasoning.test.js.map +1 -0
- package/src/llm/openrouter/reasoning.test.ts +207 -0
- package/src/llm/providers.js +36 -0
- package/src/llm/providers.js.map +1 -0
- package/src/llm/text.js +65 -0
- package/src/llm/text.js.map +1 -0
- package/src/llm/vertexai/index.js +402 -0
- package/src/llm/vertexai/index.js.map +1 -0
- package/src/llm/vertexai/index.ts +115 -5
- package/src/llm/vertexai/llm.spec.ts +114 -0
- package/src/messages/__tests__/tools.test.js +392 -0
- package/src/messages/__tests__/tools.test.js.map +1 -0
- package/src/messages/cache.js +404 -0
- package/src/messages/cache.js.map +1 -0
- package/src/messages/cache.test.js +1167 -0
- package/src/messages/cache.test.js.map +1 -0
- package/src/messages/cache.test.ts +178 -16
- package/src/messages/cache.ts +152 -147
- package/src/messages/content.js +48 -0
- package/src/messages/content.js.map +1 -0
- package/src/messages/content.test.js +314 -0
- package/src/messages/content.test.js.map +1 -0
- package/src/messages/core.js +359 -0
- package/src/messages/core.js.map +1 -0
- package/src/messages/core.ts +5 -0
- package/src/messages/ensureThinkingBlock.test.js +997 -0
- package/src/messages/ensureThinkingBlock.test.js.map +1 -0
- package/src/messages/ensureThinkingBlock.test.ts +751 -10
- package/src/messages/format.js +973 -0
- package/src/messages/format.js.map +1 -0
- package/src/messages/format.ts +334 -57
- package/src/messages/formatAgentMessages.test.js +2278 -0
- package/src/messages/formatAgentMessages.test.js.map +1 -0
- package/src/messages/formatAgentMessages.test.ts +1175 -1
- package/src/messages/formatAgentMessages.tools.test.js +362 -0
- package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
- package/src/messages/formatMessage.test.js +608 -0
- package/src/messages/formatMessage.test.js.map +1 -0
- package/src/messages/ids.js +18 -0
- package/src/messages/ids.js.map +1 -0
- package/src/messages/index.js +9 -0
- package/src/messages/index.js.map +1 -0
- package/src/messages/index.ts +1 -0
- package/src/messages/labelContentByAgent.test.js +725 -0
- package/src/messages/labelContentByAgent.test.js.map +1 -0
- package/src/messages/prune.js +438 -0
- package/src/messages/prune.js.map +1 -0
- package/src/messages/prune.ts +87 -25
- package/src/messages/reducer.js +60 -0
- package/src/messages/reducer.js.map +1 -0
- package/src/messages/shiftIndexTokenCountMap.test.js +63 -0
- package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
- package/src/messages/summarize.js +146 -0
- package/src/messages/summarize.js.map +1 -0
- package/src/messages/summarize.test.js +332 -0
- package/src/messages/summarize.test.js.map +1 -0
- package/src/messages/summarize.test.ts +466 -0
- package/src/messages/summarize.ts +222 -0
- package/src/messages/tools.js +90 -0
- package/src/messages/tools.js.map +1 -0
- package/src/mockStream.js +81 -0
- package/src/mockStream.js.map +1 -0
- package/src/prompts/collab.js +7 -0
- package/src/prompts/collab.js.map +1 -0
- package/src/prompts/index.js +3 -0
- package/src/prompts/index.js.map +1 -0
- package/src/prompts/taskmanager.js +58 -0
- package/src/prompts/taskmanager.js.map +1 -0
- package/src/run.js +427 -0
- package/src/run.js.map +1 -0
- package/src/run.ts +101 -33
- package/src/schemas/index.js +3 -0
- package/src/schemas/index.js.map +1 -0
- package/src/schemas/schema-preparation.test.js +370 -0
- package/src/schemas/schema-preparation.test.js.map +1 -0
- package/src/schemas/validate.js +314 -0
- package/src/schemas/validate.js.map +1 -0
- package/src/schemas/validate.test.js +264 -0
- package/src/schemas/validate.test.js.map +1 -0
- package/src/scripts/abort.js +127 -0
- package/src/scripts/abort.js.map +1 -0
- package/src/scripts/ant_web_search.js +130 -0
- package/src/scripts/ant_web_search.js.map +1 -0
- package/src/scripts/ant_web_search.ts +1 -0
- package/src/scripts/ant_web_search_edge_case.js +133 -0
- package/src/scripts/ant_web_search_edge_case.js.map +1 -0
- package/src/scripts/ant_web_search_edge_case.ts +1 -0
- package/src/scripts/ant_web_search_error_edge_case.js +119 -0
- package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
- package/src/scripts/ant_web_search_error_edge_case.ts +1 -0
- package/src/scripts/args.js +41 -0
- package/src/scripts/args.js.map +1 -0
- package/src/scripts/bedrock-cache-debug.js +186 -0
- package/src/scripts/bedrock-cache-debug.js.map +1 -0
- package/src/scripts/bedrock-cache-debug.ts +250 -0
- package/src/scripts/bedrock-content-aggregation-test.js +195 -0
- package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
- package/src/scripts/bedrock-content-aggregation-test.ts +266 -0
- package/src/scripts/bedrock-merge-test.js +80 -0
- package/src/scripts/bedrock-merge-test.js.map +1 -0
- package/src/scripts/bedrock-merge-test.ts +107 -0
- package/src/scripts/bedrock-parallel-tools-test.js +150 -0
- package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
- package/src/scripts/bedrock-parallel-tools-test.ts +204 -0
- package/src/scripts/caching.js +106 -0
- package/src/scripts/caching.js.map +1 -0
- package/src/scripts/caching.ts +1 -0
- package/src/scripts/cli.js +152 -0
- package/src/scripts/cli.js.map +1 -0
- package/src/scripts/cli2.js +119 -0
- package/src/scripts/cli2.js.map +1 -0
- package/src/scripts/cli3.js +163 -0
- package/src/scripts/cli3.js.map +1 -0
- package/src/scripts/cli4.js +165 -0
- package/src/scripts/cli4.js.map +1 -0
- package/src/scripts/cli5.js +165 -0
- package/src/scripts/cli5.js.map +1 -0
- package/src/scripts/code_exec.js +171 -0
- package/src/scripts/code_exec.js.map +1 -0
- package/src/scripts/code_exec.ts +1 -0
- package/src/scripts/code_exec_files.js +180 -0
- package/src/scripts/code_exec_files.js.map +1 -0
- package/src/scripts/code_exec_files.ts +1 -0
- package/src/scripts/code_exec_multi_session.js +185 -0
- package/src/scripts/code_exec_multi_session.js.map +1 -0
- package/src/scripts/code_exec_multi_session.ts +9 -13
- package/src/scripts/code_exec_ptc.js +265 -0
- package/src/scripts/code_exec_ptc.js.map +1 -0
- package/src/scripts/code_exec_ptc.ts +1 -0
- package/src/scripts/code_exec_session.js +217 -0
- package/src/scripts/code_exec_session.js.map +1 -0
- package/src/scripts/code_exec_session.ts +1 -0
- package/src/scripts/code_exec_simple.js +120 -0
- package/src/scripts/code_exec_simple.js.map +1 -0
- package/src/scripts/code_exec_simple.ts +1 -0
- package/src/scripts/content.js +111 -0
- package/src/scripts/content.js.map +1 -0
- package/src/scripts/content.ts +1 -0
- package/src/scripts/empty_input.js +125 -0
- package/src/scripts/empty_input.js.map +1 -0
- package/src/scripts/handoff-test.js +96 -0
- package/src/scripts/handoff-test.js.map +1 -0
- package/src/scripts/image.js +138 -0
- package/src/scripts/image.js.map +1 -0
- package/src/scripts/image.ts +3 -1
- package/src/scripts/memory.js +83 -0
- package/src/scripts/memory.js.map +1 -0
- package/src/scripts/memory.ts +16 -6
- package/src/scripts/multi-agent-chain.js +271 -0
- package/src/scripts/multi-agent-chain.js.map +1 -0
- package/src/scripts/multi-agent-chain.ts +1 -0
- package/src/scripts/multi-agent-conditional.js +185 -0
- package/src/scripts/multi-agent-conditional.js.map +1 -0
- package/src/scripts/multi-agent-conditional.ts +1 -0
- package/src/scripts/multi-agent-document-review-chain.js +171 -0
- package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
- package/src/scripts/multi-agent-document-review-chain.ts +1 -0
- package/src/scripts/multi-agent-hybrid-flow.js +264 -0
- package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
- package/src/scripts/multi-agent-hybrid-flow.ts +1 -0
- package/src/scripts/multi-agent-parallel-start.js +214 -0
- package/src/scripts/multi-agent-parallel-start.js.map +1 -0
- package/src/scripts/multi-agent-parallel-start.ts +4 -4
- package/src/scripts/multi-agent-parallel.js +346 -0
- package/src/scripts/multi-agent-parallel.js.map +1 -0
- package/src/scripts/multi-agent-parallel.ts +1 -0
- package/src/scripts/multi-agent-sequence.js +184 -0
- package/src/scripts/multi-agent-sequence.js.map +1 -0
- package/src/scripts/multi-agent-sequence.ts +4 -4
- package/src/scripts/multi-agent-supervisor.js +324 -0
- package/src/scripts/multi-agent-supervisor.js.map +1 -0
- package/src/scripts/multi-agent-supervisor.ts +1 -0
- package/src/scripts/multi-agent-test.js +147 -0
- package/src/scripts/multi-agent-test.js.map +1 -0
- package/src/scripts/multi-agent-test.ts +1 -0
- package/src/scripts/parallel-asymmetric-tools-test.js +202 -0
- package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
- package/src/scripts/parallel-asymmetric-tools-test.ts +1 -0
- package/src/scripts/parallel-full-metadata-test.js +176 -0
- package/src/scripts/parallel-full-metadata-test.js.map +1 -0
- package/src/scripts/parallel-full-metadata-test.ts +1 -0
- package/src/scripts/parallel-tools-test.js +256 -0
- package/src/scripts/parallel-tools-test.js.map +1 -0
- package/src/scripts/parallel-tools-test.ts +1 -0
- package/src/scripts/poc-multi-agent-comprehensive.ts +1222 -0
- package/src/scripts/programmatic_exec.js +277 -0
- package/src/scripts/programmatic_exec.js.map +1 -0
- package/src/scripts/programmatic_exec_agent.js +168 -0
- package/src/scripts/programmatic_exec_agent.js.map +1 -0
- package/src/scripts/programmatic_exec_agent.ts +1 -0
- package/src/scripts/search.js +118 -0
- package/src/scripts/search.js.map +1 -0
- package/src/scripts/search.ts +1 -0
- package/src/scripts/sequential-full-metadata-test.js +143 -0
- package/src/scripts/sequential-full-metadata-test.js.map +1 -0
- package/src/scripts/sequential-full-metadata-test.ts +1 -0
- package/src/scripts/simple.js +174 -0
- package/src/scripts/simple.js.map +1 -0
- package/src/scripts/simple.ts +2 -1
- package/src/scripts/single-agent-metadata-test.js +152 -0
- package/src/scripts/single-agent-metadata-test.js.map +1 -0
- package/src/scripts/single-agent-metadata-test.ts +4 -6
- package/src/scripts/stream.js +113 -0
- package/src/scripts/stream.js.map +1 -0
- package/src/scripts/stream.ts +1 -0
- package/src/scripts/test-custom-prompt-key.js +132 -0
- package/src/scripts/test-custom-prompt-key.js.map +1 -0
- package/src/scripts/test-handoff-input.js +143 -0
- package/src/scripts/test-handoff-input.js.map +1 -0
- package/src/scripts/test-handoff-preamble.js +227 -0
- package/src/scripts/test-handoff-preamble.js.map +1 -0
- package/src/scripts/test-handoff-preamble.ts +1 -0
- package/src/scripts/test-handoff-steering.js +353 -0
- package/src/scripts/test-handoff-steering.js.map +1 -0
- package/src/scripts/test-handoff-steering.ts +430 -0
- package/src/scripts/test-multi-agent-list-handoff.js +318 -0
- package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
- package/src/scripts/test-multi-agent-list-handoff.ts +1 -0
- package/src/scripts/test-parallel-agent-labeling.js +253 -0
- package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
- package/src/scripts/test-parallel-agent-labeling.ts +2 -0
- package/src/scripts/test-parallel-handoffs.js +229 -0
- package/src/scripts/test-parallel-handoffs.js.map +1 -0
- package/src/scripts/test-parallel-handoffs.ts +1 -0
- package/src/scripts/test-thinking-handoff-bedrock.js +132 -0
- package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-handoff-bedrock.ts +1 -0
- package/src/scripts/test-thinking-handoff.js +132 -0
- package/src/scripts/test-thinking-handoff.js.map +1 -0
- package/src/scripts/test-thinking-handoff.ts +1 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js +140 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +166 -0
- package/src/scripts/test-tool-before-handoff-role-order.js +223 -0
- package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
- package/src/scripts/test-tool-before-handoff-role-order.ts +276 -0
- package/src/scripts/test-tools-before-handoff.js +187 -0
- package/src/scripts/test-tools-before-handoff.js.map +1 -0
- package/src/scripts/test-tools-before-handoff.ts +4 -8
- package/src/scripts/test_code_api.js +263 -0
- package/src/scripts/test_code_api.js.map +1 -0
- package/src/scripts/thinking-bedrock.js +128 -0
- package/src/scripts/thinking-bedrock.js.map +1 -0
- package/src/scripts/thinking-bedrock.ts +1 -0
- package/src/scripts/thinking-vertexai.js +130 -0
- package/src/scripts/thinking-vertexai.js.map +1 -0
- package/src/scripts/thinking-vertexai.ts +168 -0
- package/src/scripts/thinking.js +134 -0
- package/src/scripts/thinking.js.map +1 -0
- package/src/scripts/thinking.ts +1 -0
- package/src/scripts/tool_search.js +114 -0
- package/src/scripts/tool_search.js.map +1 -0
- package/src/scripts/tools.js +125 -0
- package/src/scripts/tools.js.map +1 -0
- package/src/scripts/tools.ts +5 -19
- package/src/specs/agent-handoffs-bedrock.integration.test.js +280 -0
- package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
- package/src/specs/agent-handoffs-bedrock.integration.test.ts +412 -375
- package/src/specs/agent-handoffs.test.js +924 -0
- package/src/specs/agent-handoffs.test.js.map +1 -0
- package/src/specs/agent-handoffs.test.ts +152 -39
- package/src/specs/anthropic.simple.test.js +287 -0
- package/src/specs/anthropic.simple.test.js.map +1 -0
- package/src/specs/anthropic.simple.test.ts +7 -4
- package/src/specs/azure.simple.test.js +381 -0
- package/src/specs/azure.simple.test.js.map +1 -0
- package/src/specs/azure.simple.test.ts +143 -5
- package/src/specs/cache.simple.test.js +282 -0
- package/src/specs/cache.simple.test.js.map +1 -0
- package/src/specs/cache.simple.test.ts +9 -2
- package/src/specs/custom-event-await.test.js +148 -0
- package/src/specs/custom-event-await.test.js.map +1 -0
- package/src/specs/custom-event-await.test.ts +215 -0
- package/src/specs/deepseek.simple.test.js +189 -0
- package/src/specs/deepseek.simple.test.js.map +1 -0
- package/src/specs/deepseek.simple.test.ts +4 -2
- package/src/specs/emergency-prune.test.js +308 -0
- package/src/specs/emergency-prune.test.js.map +1 -0
- package/src/specs/moonshot.simple.test.js +237 -0
- package/src/specs/moonshot.simple.test.js.map +1 -0
- package/src/specs/moonshot.simple.test.ts +6 -2
- package/src/specs/observability.integration.test.js +1337 -0
- package/src/specs/observability.integration.test.js.map +1 -0
- package/src/specs/observability.integration.test.ts +2223 -0
- package/src/specs/openai.simple.test.js +233 -0
- package/src/specs/openai.simple.test.js.map +1 -0
- package/src/specs/openai.simple.test.ts +4 -2
- package/src/specs/openrouter.simple.test.js +202 -0
- package/src/specs/openrouter.simple.test.js.map +1 -0
- package/src/specs/openrouter.simple.test.ts +165 -4
- package/src/specs/prune.test.js +733 -0
- package/src/specs/prune.test.js.map +1 -0
- package/src/specs/prune.test.ts +1 -0
- package/src/specs/reasoning.test.js +144 -0
- package/src/specs/reasoning.test.js.map +1 -0
- package/src/specs/reasoning.test.ts +2 -2
- package/src/specs/spec.utils.js +4 -0
- package/src/specs/spec.utils.js.map +1 -0
- package/src/specs/thinking-handoff.test.js +486 -0
- package/src/specs/thinking-handoff.test.js.map +1 -0
- package/src/specs/thinking-handoff.test.ts +3 -2
- package/src/specs/thinking-prune.test.js +600 -0
- package/src/specs/thinking-prune.test.js.map +1 -0
- package/src/specs/token-distribution-edge-case.test.js +246 -0
- package/src/specs/token-distribution-edge-case.test.js.map +1 -0
- package/src/specs/token-memoization.test.js +32 -0
- package/src/specs/token-memoization.test.js.map +1 -0
- package/src/specs/token-memoization.test.ts +14 -5
- package/src/specs/tokens.test.js +49 -0
- package/src/specs/tokens.test.js.map +1 -0
- package/src/specs/tokens.test.ts +64 -0
- package/src/specs/tool-error.test.js +139 -0
- package/src/specs/tool-error.test.js.map +1 -0
- package/src/specs/tool-error.test.ts +2 -2
- package/src/splitStream.js +204 -0
- package/src/splitStream.js.map +1 -0
- package/src/splitStream.test.js +504 -0
- package/src/splitStream.test.js.map +1 -0
- package/src/stream.js +650 -0
- package/src/stream.js.map +1 -0
- package/src/stream.test.js +225 -0
- package/src/stream.test.js.map +1 -0
- package/src/stream.test.ts +25 -15
- package/src/stream.ts +82 -32
- package/src/test/mockTools.js +340 -0
- package/src/test/mockTools.js.map +1 -0
- package/src/tools/AskUser.ts +159 -0
- package/src/tools/BrowserTools.js +245 -0
- package/src/tools/BrowserTools.js.map +1 -0
- package/src/tools/BrowserTools.ts +12 -8
- package/src/tools/Calculator.js +38 -0
- package/src/tools/Calculator.js.map +1 -0
- package/src/tools/Calculator.test.js +225 -0
- package/src/tools/Calculator.test.js.map +1 -0
- package/src/tools/CodeExecutor.js +233 -0
- package/src/tools/CodeExecutor.js.map +1 -0
- package/src/tools/CodeExecutor.selfhealing.test.ts +435 -0
- package/src/tools/CodeExecutor.ts +62 -4
- package/src/tools/ProgrammaticToolCalling.js +602 -0
- package/src/tools/ProgrammaticToolCalling.js.map +1 -0
- package/src/tools/ProgrammaticToolCalling.ts +40 -52
- package/src/tools/StreamingToolCallBuffer.js +179 -0
- package/src/tools/StreamingToolCallBuffer.js.map +1 -0
- package/src/tools/StreamingToolCallBuffer.ts +218 -0
- package/src/tools/ToolNode.js +930 -0
- package/src/tools/ToolNode.js.map +1 -0
- package/src/tools/ToolNode.ts +454 -41
- package/src/tools/ToolSearch.js +904 -0
- package/src/tools/ToolSearch.js.map +1 -0
- package/src/tools/ToolSearch.ts +84 -33
- package/src/tools/__tests__/AskUser.test.ts +537 -0
- package/src/tools/__tests__/BrowserTools.test.js +306 -0
- package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
- package/src/tools/__tests__/BrowserTools.test.ts +131 -6
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +276 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js +807 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js +175 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.ts +263 -0
- package/src/tools/__tests__/ToolApproval.test.js +675 -0
- package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
- package/src/tools/__tests__/ToolApproval.test.ts +194 -20
- package/src/tools/__tests__/ToolNode.hitl.test.ts +267 -0
- package/src/tools/__tests__/ToolNode.recovery.test.js +200 -0
- package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.recovery.test.ts +276 -0
- package/src/tools/__tests__/ToolNode.session.test.js +319 -0
- package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.session.test.ts +465 -0
- package/src/tools/__tests__/ToolSearch.integration.test.js +125 -0
- package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.test.js +812 -0
- package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.test.ts +78 -5
- package/src/tools/__tests__/handlers.test.js +799 -0
- package/src/tools/__tests__/handlers.test.js.map +1 -0
- package/src/tools/__tests__/handlers.test.ts +1100 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.js +362 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.ts +560 -0
- package/src/tools/handlers.js +306 -0
- package/src/tools/handlers.js.map +1 -0
- package/src/tools/handlers.ts +119 -16
- package/src/tools/schema.js +25 -0
- package/src/tools/schema.js.map +1 -0
- package/src/tools/search/anthropic.js +34 -0
- package/src/tools/search/anthropic.js.map +1 -0
- package/src/tools/search/content.js +116 -0
- package/src/tools/search/content.js.map +1 -0
- package/src/tools/search/content.test.js +133 -0
- package/src/tools/search/content.test.js.map +1 -0
- package/src/tools/search/firecrawl.js +173 -0
- package/src/tools/search/firecrawl.js.map +1 -0
- package/src/tools/search/format.js +198 -0
- package/src/tools/search/format.js.map +1 -0
- package/src/tools/search/highlights.js +241 -0
- package/src/tools/search/highlights.js.map +1 -0
- package/src/tools/search/index.js +3 -0
- package/src/tools/search/index.js.map +1 -0
- package/src/tools/search/jina-reranker.test.js +106 -0
- package/src/tools/search/jina-reranker.test.js.map +1 -0
- package/src/tools/search/rerankers.js +165 -0
- package/src/tools/search/rerankers.js.map +1 -0
- package/src/tools/search/schema.js +102 -0
- package/src/tools/search/schema.js.map +1 -0
- package/src/tools/search/search.js +561 -0
- package/src/tools/search/search.js.map +1 -0
- package/src/tools/search/serper-scraper.js +126 -0
- package/src/tools/search/serper-scraper.js.map +1 -0
- package/src/tools/search/test.js +129 -0
- package/src/tools/search/test.js.map +1 -0
- package/src/tools/search/tool.js +453 -0
- package/src/tools/search/tool.js.map +1 -0
- package/src/tools/search/types.js +2 -0
- package/src/tools/search/types.js.map +1 -0
- package/src/tools/search/utils.js +59 -0
- package/src/tools/search/utils.js.map +1 -0
- package/src/types/graph.js +24 -0
- package/src/types/graph.js.map +1 -0
- package/src/types/graph.test.js +192 -0
- package/src/types/graph.test.js.map +1 -0
- package/src/types/graph.ts +26 -6
- package/src/types/index.js +7 -0
- package/src/types/index.js.map +1 -0
- package/src/types/llm.js +2 -0
- package/src/types/llm.js.map +1 -0
- package/src/types/llm.ts +8 -3
- package/src/types/messages.js +2 -0
- package/src/types/messages.js.map +1 -0
- package/src/types/run.js +2 -0
- package/src/types/run.js.map +1 -0
- package/src/types/run.ts +2 -0
- package/src/types/stream.js +2 -0
- package/src/types/stream.js.map +1 -0
- package/src/types/tools.js +2 -0
- package/src/types/tools.js.map +1 -0
- package/src/types/tools.ts +21 -2
- package/src/utils/contextAnalytics.js +79 -0
- package/src/utils/contextAnalytics.js.map +1 -0
- package/src/utils/contextAnalytics.test.js +166 -0
- package/src/utils/contextAnalytics.test.js.map +1 -0
- package/src/utils/contextAnalytics.test.ts +222 -0
- package/src/utils/contextAnalytics.ts +27 -9
- package/src/utils/events.js +26 -0
- package/src/utils/events.js.map +1 -0
- package/src/utils/graph.js +11 -0
- package/src/utils/graph.js.map +1 -0
- package/src/utils/handlers.js +65 -0
- package/src/utils/handlers.js.map +1 -0
- package/src/utils/index.js +10 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/llm.js +21 -0
- package/src/utils/llm.js.map +1 -0
- package/src/utils/llmConfig.js +205 -0
- package/src/utils/llmConfig.js.map +1 -0
- package/src/utils/llmConfig.ts +5 -5
- package/src/utils/logging.js +37 -0
- package/src/utils/logging.js.map +1 -0
- package/src/utils/misc.js +51 -0
- package/src/utils/misc.js.map +1 -0
- package/src/utils/run.js +69 -0
- package/src/utils/run.js.map +1 -0
- package/src/utils/run.ts +108 -106
- package/src/utils/schema.js +21 -0
- package/src/utils/schema.js.map +1 -0
- package/src/utils/title.js +119 -0
- package/src/utils/title.js.map +1 -0
- package/src/utils/tokens.js +92 -0
- package/src/utils/tokens.js.map +1 -0
- package/src/utils/tokens.ts +118 -142
- package/src/utils/toolCallContinuation.ts +55 -0
- package/src/utils/toonFormat.js +379 -0
- package/src/utils/toonFormat.js.map +1 -0
|
@@ -767,7 +767,7 @@ describe('formatAgentMessages', () => {
|
|
|
767
767
|
expect(result.messages[1].content).toHaveLength(2);
|
|
768
768
|
});
|
|
769
769
|
|
|
770
|
-
it('should
|
|
770
|
+
it('should strip THINK content and join TEXT parts as string', () => {
|
|
771
771
|
const payload = [
|
|
772
772
|
{
|
|
773
773
|
role: 'assistant',
|
|
@@ -829,6 +829,190 @@ describe('formatAgentMessages', () => {
|
|
|
829
829
|
);
|
|
830
830
|
});
|
|
831
831
|
|
|
832
|
+
it('should strip reasoning_content blocks and join TEXT parts as string', () => {
|
|
833
|
+
const payload = [
|
|
834
|
+
{
|
|
835
|
+
role: 'assistant',
|
|
836
|
+
content: [
|
|
837
|
+
{ type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
|
|
838
|
+
{
|
|
839
|
+
type: ContentTypes.REASONING_CONTENT,
|
|
840
|
+
reasoningText: { text: 'Thinking deeply...', signature: 'sig123' },
|
|
841
|
+
index: 0,
|
|
842
|
+
},
|
|
843
|
+
{ type: ContentTypes.TEXT, [ContentTypes.TEXT]: 'The answer is 42.' },
|
|
844
|
+
],
|
|
845
|
+
},
|
|
846
|
+
];
|
|
847
|
+
|
|
848
|
+
const result = formatAgentMessages(payload);
|
|
849
|
+
|
|
850
|
+
expect(result.messages).toHaveLength(1);
|
|
851
|
+
expect(result.messages[0]).toBeInstanceOf(AIMessage);
|
|
852
|
+
expect(result.messages[0].content).toBe('The answer is 42.');
|
|
853
|
+
expect(JSON.stringify(result.messages[0].content)).not.toContain(
|
|
854
|
+
'reasoning_content'
|
|
855
|
+
);
|
|
856
|
+
});
|
|
857
|
+
|
|
858
|
+
it('should strip thinking blocks and join TEXT parts as string', () => {
|
|
859
|
+
const payload = [
|
|
860
|
+
{
|
|
861
|
+
role: 'assistant',
|
|
862
|
+
content: [
|
|
863
|
+
{
|
|
864
|
+
type: ContentTypes.THINKING,
|
|
865
|
+
thinking: 'Internal reasoning...',
|
|
866
|
+
signature: 'sig456',
|
|
867
|
+
},
|
|
868
|
+
{
|
|
869
|
+
type: ContentTypes.TEXT,
|
|
870
|
+
[ContentTypes.TEXT]: 'Here is my answer.',
|
|
871
|
+
},
|
|
872
|
+
],
|
|
873
|
+
},
|
|
874
|
+
];
|
|
875
|
+
|
|
876
|
+
const result = formatAgentMessages(payload);
|
|
877
|
+
|
|
878
|
+
expect(result.messages).toHaveLength(1);
|
|
879
|
+
expect(result.messages[0]).toBeInstanceOf(AIMessage);
|
|
880
|
+
expect(result.messages[0].content).toBe('Here is my answer.');
|
|
881
|
+
expect(JSON.stringify(result.messages[0].content)).not.toContain(
|
|
882
|
+
'thinking'
|
|
883
|
+
);
|
|
884
|
+
});
|
|
885
|
+
|
|
886
|
+
it('should strip redacted_thinking blocks and join TEXT parts as string', () => {
|
|
887
|
+
const payload = [
|
|
888
|
+
{
|
|
889
|
+
role: 'assistant',
|
|
890
|
+
content: [
|
|
891
|
+
{ type: 'redacted_thinking', data: 'REDACTED_SIGNATURE' },
|
|
892
|
+
{
|
|
893
|
+
type: ContentTypes.TEXT,
|
|
894
|
+
[ContentTypes.TEXT]: 'Here is my answer.',
|
|
895
|
+
},
|
|
896
|
+
],
|
|
897
|
+
},
|
|
898
|
+
];
|
|
899
|
+
|
|
900
|
+
const result = formatAgentMessages(payload);
|
|
901
|
+
|
|
902
|
+
expect(result.messages).toHaveLength(1);
|
|
903
|
+
expect(result.messages[0]).toBeInstanceOf(AIMessage);
|
|
904
|
+
expect(result.messages[0].content).toBe('Here is my answer.');
|
|
905
|
+
expect(JSON.stringify(result.messages[0].content)).not.toContain(
|
|
906
|
+
'redacted_thinking'
|
|
907
|
+
);
|
|
908
|
+
});
|
|
909
|
+
|
|
910
|
+
it('should produce no AIMessage when only reasoning_content and whitespace text are present', () => {
|
|
911
|
+
const payload = [
|
|
912
|
+
{
|
|
913
|
+
role: 'assistant',
|
|
914
|
+
content: [
|
|
915
|
+
{ type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
|
|
916
|
+
{
|
|
917
|
+
type: ContentTypes.REASONING_CONTENT,
|
|
918
|
+
reasoningText: { text: 'Silent reasoning', signature: 'sig' },
|
|
919
|
+
},
|
|
920
|
+
],
|
|
921
|
+
},
|
|
922
|
+
];
|
|
923
|
+
|
|
924
|
+
const result = formatAgentMessages(payload);
|
|
925
|
+
|
|
926
|
+
expect(result.messages).toHaveLength(0);
|
|
927
|
+
});
|
|
928
|
+
|
|
929
|
+
it('should drop whitespace-only text parts from non-reasoning messages', () => {
|
|
930
|
+
const payload = [
|
|
931
|
+
{
|
|
932
|
+
role: 'assistant',
|
|
933
|
+
content: [
|
|
934
|
+
{ type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
|
|
935
|
+
{
|
|
936
|
+
type: ContentTypes.TEXT,
|
|
937
|
+
[ContentTypes.TEXT]: 'Actual content here.',
|
|
938
|
+
},
|
|
939
|
+
{ type: ContentTypes.TEXT, [ContentTypes.TEXT]: ' ' },
|
|
940
|
+
],
|
|
941
|
+
},
|
|
942
|
+
];
|
|
943
|
+
|
|
944
|
+
const result = formatAgentMessages(payload);
|
|
945
|
+
|
|
946
|
+
expect(result.messages).toHaveLength(1);
|
|
947
|
+
expect(result.messages[0]).toBeInstanceOf(AIMessage);
|
|
948
|
+
const content = result.messages[0].content;
|
|
949
|
+
expect(Array.isArray(content)).toBe(true);
|
|
950
|
+
expect(
|
|
951
|
+
(content as { type: string; text?: string }[]).every(
|
|
952
|
+
(p) => (p.text ?? '').trim() !== ''
|
|
953
|
+
)
|
|
954
|
+
).toBe(true);
|
|
955
|
+
});
|
|
956
|
+
|
|
957
|
+
it('should preserve whitespace-only text that has tool_call_ids (common Bedrock pattern)', () => {
|
|
958
|
+
const payload = [
|
|
959
|
+
{
|
|
960
|
+
role: 'assistant',
|
|
961
|
+
content: [
|
|
962
|
+
{
|
|
963
|
+
type: ContentTypes.TEXT,
|
|
964
|
+
[ContentTypes.TEXT]: '\n\n',
|
|
965
|
+
tool_call_ids: ['tc-1'],
|
|
966
|
+
},
|
|
967
|
+
{
|
|
968
|
+
type: ContentTypes.TOOL_CALL,
|
|
969
|
+
tool_call: {
|
|
970
|
+
id: 'tc-1',
|
|
971
|
+
name: 'search',
|
|
972
|
+
args: '{"query":"test"}',
|
|
973
|
+
output: 'Results here',
|
|
974
|
+
},
|
|
975
|
+
},
|
|
976
|
+
],
|
|
977
|
+
},
|
|
978
|
+
];
|
|
979
|
+
|
|
980
|
+
const result = formatAgentMessages(payload);
|
|
981
|
+
|
|
982
|
+
expect(result.messages).toHaveLength(2);
|
|
983
|
+
expect(result.messages[0]).toBeInstanceOf(AIMessage);
|
|
984
|
+
expect(result.messages[1]).toBeInstanceOf(ToolMessage);
|
|
985
|
+
expect((result.messages[0] as AIMessage).tool_calls).toHaveLength(1);
|
|
986
|
+
expect((result.messages[1] as ToolMessage).tool_call_id).toBe('tc-1');
|
|
987
|
+
});
|
|
988
|
+
|
|
989
|
+
it('should handle whitespace-only text without tool_call_ids before a tool call', () => {
|
|
990
|
+
const payload = [
|
|
991
|
+
{
|
|
992
|
+
role: 'assistant',
|
|
993
|
+
content: [
|
|
994
|
+
{ type: ContentTypes.TEXT, [ContentTypes.TEXT]: '\n\n' },
|
|
995
|
+
{
|
|
996
|
+
type: ContentTypes.TOOL_CALL,
|
|
997
|
+
tool_call: {
|
|
998
|
+
id: 'tc-2',
|
|
999
|
+
name: 'search',
|
|
1000
|
+
args: '{"query":"test"}',
|
|
1001
|
+
output: 'Results here',
|
|
1002
|
+
},
|
|
1003
|
+
},
|
|
1004
|
+
],
|
|
1005
|
+
},
|
|
1006
|
+
];
|
|
1007
|
+
|
|
1008
|
+
const result = formatAgentMessages(payload);
|
|
1009
|
+
|
|
1010
|
+
expect(result.messages).toHaveLength(2);
|
|
1011
|
+
expect(result.messages[0]).toBeInstanceOf(AIMessage);
|
|
1012
|
+
expect(result.messages[1]).toBeInstanceOf(ToolMessage);
|
|
1013
|
+
expect((result.messages[0] as AIMessage).tool_calls).toHaveLength(1);
|
|
1014
|
+
});
|
|
1015
|
+
|
|
832
1016
|
it('should exclude ERROR type content parts', () => {
|
|
833
1017
|
const payload = [
|
|
834
1018
|
{
|
|
@@ -1510,4 +1694,994 @@ describe('formatAgentMessages', () => {
|
|
|
1510
1694
|
expect(result.messages[1].name).toBe('search');
|
|
1511
1695
|
expect(result.messages[1].content).toBe('');
|
|
1512
1696
|
});
|
|
1697
|
+
|
|
1698
|
+
describe('proportional token distribution', () => {
|
|
1699
|
+
it('should distribute tokens proportionally based on content length', () => {
|
|
1700
|
+
const payload = [
|
|
1701
|
+
{
|
|
1702
|
+
role: 'assistant',
|
|
1703
|
+
content: [
|
|
1704
|
+
{
|
|
1705
|
+
type: ContentTypes.TEXT,
|
|
1706
|
+
[ContentTypes.TEXT]: 'Short text',
|
|
1707
|
+
tool_call_ids: ['tool_1'],
|
|
1708
|
+
},
|
|
1709
|
+
{
|
|
1710
|
+
type: ContentTypes.TOOL_CALL,
|
|
1711
|
+
tool_call: {
|
|
1712
|
+
id: 'tool_1',
|
|
1713
|
+
name: 'search',
|
|
1714
|
+
args: '{"query":"test"}',
|
|
1715
|
+
output:
|
|
1716
|
+
'A much longer tool result that contains significantly more content than the original message text',
|
|
1717
|
+
},
|
|
1718
|
+
},
|
|
1719
|
+
],
|
|
1720
|
+
},
|
|
1721
|
+
];
|
|
1722
|
+
|
|
1723
|
+
const indexTokenCountMap = { 0: 100 };
|
|
1724
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
1725
|
+
|
|
1726
|
+
expect(result.messages).toHaveLength(2);
|
|
1727
|
+
const aiTokens = result.indexTokenCountMap?.[0] ?? 0;
|
|
1728
|
+
const toolTokens = result.indexTokenCountMap?.[1] ?? 0;
|
|
1729
|
+
expect(aiTokens + toolTokens).toBe(100);
|
|
1730
|
+
expect(toolTokens).toBeGreaterThan(aiTokens);
|
|
1731
|
+
});
|
|
1732
|
+
|
|
1733
|
+
it('should give the vast majority of tokens to a large tool result vs tiny AI message', () => {
|
|
1734
|
+
const bigOutput = 'x'.repeat(10000);
|
|
1735
|
+
const payload = [
|
|
1736
|
+
{
|
|
1737
|
+
role: 'assistant',
|
|
1738
|
+
content: [
|
|
1739
|
+
{
|
|
1740
|
+
type: ContentTypes.TEXT,
|
|
1741
|
+
[ContentTypes.TEXT]: 'ok',
|
|
1742
|
+
tool_call_ids: ['tool_1'],
|
|
1743
|
+
},
|
|
1744
|
+
{
|
|
1745
|
+
type: ContentTypes.TOOL_CALL,
|
|
1746
|
+
tool_call: {
|
|
1747
|
+
id: 'tool_1',
|
|
1748
|
+
name: 'snapshot',
|
|
1749
|
+
args: '{}',
|
|
1750
|
+
output: bigOutput,
|
|
1751
|
+
},
|
|
1752
|
+
},
|
|
1753
|
+
],
|
|
1754
|
+
},
|
|
1755
|
+
];
|
|
1756
|
+
|
|
1757
|
+
const indexTokenCountMap = { 0: 5000 };
|
|
1758
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
1759
|
+
|
|
1760
|
+
expect(result.messages).toHaveLength(2);
|
|
1761
|
+
const aiTokens = result.indexTokenCountMap?.[0] ?? 0;
|
|
1762
|
+
const toolTokens = result.indexTokenCountMap?.[1] ?? 0;
|
|
1763
|
+
expect(aiTokens + toolTokens).toBe(5000);
|
|
1764
|
+
expect(toolTokens).toBeGreaterThan(4900);
|
|
1765
|
+
expect(aiTokens).toBeLessThan(100);
|
|
1766
|
+
});
|
|
1767
|
+
|
|
1768
|
+
it('should fall back to even distribution when all content lengths are zero', () => {
|
|
1769
|
+
const payload = [
|
|
1770
|
+
{
|
|
1771
|
+
role: 'assistant',
|
|
1772
|
+
content: [
|
|
1773
|
+
{
|
|
1774
|
+
type: ContentTypes.TEXT,
|
|
1775
|
+
[ContentTypes.TEXT]: '',
|
|
1776
|
+
tool_call_ids: ['tool_1'],
|
|
1777
|
+
},
|
|
1778
|
+
{
|
|
1779
|
+
type: ContentTypes.TOOL_CALL,
|
|
1780
|
+
tool_call: {
|
|
1781
|
+
id: 'tool_1',
|
|
1782
|
+
name: 'noop',
|
|
1783
|
+
args: '{}',
|
|
1784
|
+
output: '',
|
|
1785
|
+
},
|
|
1786
|
+
},
|
|
1787
|
+
],
|
|
1788
|
+
},
|
|
1789
|
+
];
|
|
1790
|
+
|
|
1791
|
+
const indexTokenCountMap = { 0: 20 };
|
|
1792
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
1793
|
+
|
|
1794
|
+
expect(result.messages).toHaveLength(2);
|
|
1795
|
+
const aiTokens = result.indexTokenCountMap?.[0] ?? 0;
|
|
1796
|
+
const toolTokens = result.indexTokenCountMap?.[1] ?? 0;
|
|
1797
|
+
expect(aiTokens + toolTokens).toBe(20);
|
|
1798
|
+
expect(aiTokens).toBeGreaterThanOrEqual(0);
|
|
1799
|
+
expect(toolTokens).toBeGreaterThanOrEqual(0);
|
|
1800
|
+
});
|
|
1801
|
+
|
|
1802
|
+
it('should handle odd token counts without losing remainder', () => {
|
|
1803
|
+
const payload = [
|
|
1804
|
+
{
|
|
1805
|
+
role: 'assistant',
|
|
1806
|
+
content: [
|
|
1807
|
+
{
|
|
1808
|
+
type: ContentTypes.TEXT,
|
|
1809
|
+
[ContentTypes.TEXT]: 'abc',
|
|
1810
|
+
tool_call_ids: ['tool_1', 'tool_2', 'tool_3'],
|
|
1811
|
+
},
|
|
1812
|
+
{
|
|
1813
|
+
type: ContentTypes.TOOL_CALL,
|
|
1814
|
+
tool_call: {
|
|
1815
|
+
id: 'tool_1',
|
|
1816
|
+
name: 'a',
|
|
1817
|
+
args: '{}',
|
|
1818
|
+
output: 'abc',
|
|
1819
|
+
},
|
|
1820
|
+
},
|
|
1821
|
+
{
|
|
1822
|
+
type: ContentTypes.TOOL_CALL,
|
|
1823
|
+
tool_call: {
|
|
1824
|
+
id: 'tool_2',
|
|
1825
|
+
name: 'b',
|
|
1826
|
+
args: '{}',
|
|
1827
|
+
output: 'abc',
|
|
1828
|
+
},
|
|
1829
|
+
},
|
|
1830
|
+
{
|
|
1831
|
+
type: ContentTypes.TOOL_CALL,
|
|
1832
|
+
tool_call: {
|
|
1833
|
+
id: 'tool_3',
|
|
1834
|
+
name: 'c',
|
|
1835
|
+
args: '{}',
|
|
1836
|
+
output: 'abc',
|
|
1837
|
+
},
|
|
1838
|
+
},
|
|
1839
|
+
],
|
|
1840
|
+
},
|
|
1841
|
+
];
|
|
1842
|
+
|
|
1843
|
+
const indexTokenCountMap = { 0: 7 };
|
|
1844
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
1845
|
+
|
|
1846
|
+
expect(result.messages).toHaveLength(4);
|
|
1847
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
1848
|
+
(sum, v) => sum + v,
|
|
1849
|
+
0
|
|
1850
|
+
);
|
|
1851
|
+
expect(total).toBe(7);
|
|
1852
|
+
for (let i = 0; i < result.messages.length; i++) {
|
|
1853
|
+
expect(result.indexTokenCountMap?.[i]).toBeGreaterThanOrEqual(0);
|
|
1854
|
+
}
|
|
1855
|
+
});
|
|
1856
|
+
|
|
1857
|
+
it('should never produce negative token counts', () => {
|
|
1858
|
+
const payload = [
|
|
1859
|
+
{
|
|
1860
|
+
role: 'assistant',
|
|
1861
|
+
content: [
|
|
1862
|
+
{
|
|
1863
|
+
type: ContentTypes.TEXT,
|
|
1864
|
+
[ContentTypes.TEXT]: 'a',
|
|
1865
|
+
tool_call_ids: ['t1', 't2', 't3', 't4', 't5'],
|
|
1866
|
+
},
|
|
1867
|
+
{
|
|
1868
|
+
type: ContentTypes.TOOL_CALL,
|
|
1869
|
+
tool_call: { id: 't1', name: 'x', args: '{}', output: 'b' },
|
|
1870
|
+
},
|
|
1871
|
+
{
|
|
1872
|
+
type: ContentTypes.TOOL_CALL,
|
|
1873
|
+
tool_call: { id: 't2', name: 'x', args: '{}', output: 'c' },
|
|
1874
|
+
},
|
|
1875
|
+
{
|
|
1876
|
+
type: ContentTypes.TOOL_CALL,
|
|
1877
|
+
tool_call: { id: 't3', name: 'x', args: '{}', output: 'd' },
|
|
1878
|
+
},
|
|
1879
|
+
{
|
|
1880
|
+
type: ContentTypes.TOOL_CALL,
|
|
1881
|
+
tool_call: { id: 't4', name: 'x', args: '{}', output: 'e' },
|
|
1882
|
+
},
|
|
1883
|
+
{
|
|
1884
|
+
type: ContentTypes.TOOL_CALL,
|
|
1885
|
+
tool_call: { id: 't5', name: 'x', args: '{}', output: 'f' },
|
|
1886
|
+
},
|
|
1887
|
+
],
|
|
1888
|
+
},
|
|
1889
|
+
];
|
|
1890
|
+
|
|
1891
|
+
const indexTokenCountMap = { 0: 3 };
|
|
1892
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
1893
|
+
|
|
1894
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
1895
|
+
(sum, v) => sum + v,
|
|
1896
|
+
0
|
|
1897
|
+
);
|
|
1898
|
+
expect(total).toBe(3);
|
|
1899
|
+
for (const val of Object.values(result.indexTokenCountMap || {})) {
|
|
1900
|
+
expect(val).toBeGreaterThanOrEqual(0);
|
|
1901
|
+
}
|
|
1902
|
+
});
|
|
1903
|
+
|
|
1904
|
+
it('should handle single token budget distributed across many messages', () => {
|
|
1905
|
+
const payload = [
|
|
1906
|
+
{
|
|
1907
|
+
role: 'assistant',
|
|
1908
|
+
content: [
|
|
1909
|
+
{
|
|
1910
|
+
type: ContentTypes.TEXT,
|
|
1911
|
+
[ContentTypes.TEXT]: 'hello',
|
|
1912
|
+
tool_call_ids: ['t1', 't2'],
|
|
1913
|
+
},
|
|
1914
|
+
{
|
|
1915
|
+
type: ContentTypes.TOOL_CALL,
|
|
1916
|
+
tool_call: {
|
|
1917
|
+
id: 't1',
|
|
1918
|
+
name: 'a',
|
|
1919
|
+
args: '{}',
|
|
1920
|
+
output: 'result one',
|
|
1921
|
+
},
|
|
1922
|
+
},
|
|
1923
|
+
{
|
|
1924
|
+
type: ContentTypes.TOOL_CALL,
|
|
1925
|
+
tool_call: {
|
|
1926
|
+
id: 't2',
|
|
1927
|
+
name: 'b',
|
|
1928
|
+
args: '{}',
|
|
1929
|
+
output: 'result two',
|
|
1930
|
+
},
|
|
1931
|
+
},
|
|
1932
|
+
],
|
|
1933
|
+
},
|
|
1934
|
+
];
|
|
1935
|
+
|
|
1936
|
+
const indexTokenCountMap = { 0: 1 };
|
|
1937
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
1938
|
+
|
|
1939
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
1940
|
+
(sum, v) => sum + v,
|
|
1941
|
+
0
|
|
1942
|
+
);
|
|
1943
|
+
expect(total).toBe(1);
|
|
1944
|
+
for (const val of Object.values(result.indexTokenCountMap || {})) {
|
|
1945
|
+
expect(val).toBeGreaterThanOrEqual(0);
|
|
1946
|
+
}
|
|
1947
|
+
});
|
|
1948
|
+
|
|
1949
|
+
it('should handle zero token budget', () => {
|
|
1950
|
+
const payload = [
|
|
1951
|
+
{
|
|
1952
|
+
role: 'assistant',
|
|
1953
|
+
content: [
|
|
1954
|
+
{
|
|
1955
|
+
type: ContentTypes.TEXT,
|
|
1956
|
+
[ContentTypes.TEXT]: 'hello',
|
|
1957
|
+
tool_call_ids: ['t1'],
|
|
1958
|
+
},
|
|
1959
|
+
{
|
|
1960
|
+
type: ContentTypes.TOOL_CALL,
|
|
1961
|
+
tool_call: { id: 't1', name: 'a', args: '{}', output: 'world' },
|
|
1962
|
+
},
|
|
1963
|
+
],
|
|
1964
|
+
},
|
|
1965
|
+
];
|
|
1966
|
+
|
|
1967
|
+
const indexTokenCountMap = { 0: 0 };
|
|
1968
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
1969
|
+
|
|
1970
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
1971
|
+
(sum, v) => sum + v,
|
|
1972
|
+
0
|
|
1973
|
+
);
|
|
1974
|
+
expect(total).toBe(0);
|
|
1975
|
+
});
|
|
1976
|
+
|
|
1977
|
+
it('should distribute tokens proportionally with 5 tool calls of varying sizes', () => {
|
|
1978
|
+
const payload = [
|
|
1979
|
+
{
|
|
1980
|
+
role: 'assistant',
|
|
1981
|
+
content: [
|
|
1982
|
+
{
|
|
1983
|
+
type: ContentTypes.TEXT,
|
|
1984
|
+
[ContentTypes.TEXT]: 'I will perform multiple operations.',
|
|
1985
|
+
tool_call_ids: ['t1', 't2', 't3', 't4', 't5'],
|
|
1986
|
+
},
|
|
1987
|
+
{
|
|
1988
|
+
type: ContentTypes.TOOL_CALL,
|
|
1989
|
+
tool_call: {
|
|
1990
|
+
id: 't1',
|
|
1991
|
+
name: 'navigate',
|
|
1992
|
+
args: '{"url":"https://example.com"}',
|
|
1993
|
+
output: 'Navigated successfully.',
|
|
1994
|
+
},
|
|
1995
|
+
},
|
|
1996
|
+
{
|
|
1997
|
+
type: ContentTypes.TOOL_CALL,
|
|
1998
|
+
tool_call: {
|
|
1999
|
+
id: 't2',
|
|
2000
|
+
name: 'snapshot',
|
|
2001
|
+
args: '{}',
|
|
2002
|
+
output: 'x'.repeat(5000),
|
|
2003
|
+
},
|
|
2004
|
+
},
|
|
2005
|
+
{
|
|
2006
|
+
type: ContentTypes.TOOL_CALL,
|
|
2007
|
+
tool_call: {
|
|
2008
|
+
id: 't3',
|
|
2009
|
+
name: 'click',
|
|
2010
|
+
args: '{"selector":"#btn"}',
|
|
2011
|
+
output: 'Clicked.',
|
|
2012
|
+
},
|
|
2013
|
+
},
|
|
2014
|
+
{
|
|
2015
|
+
type: ContentTypes.TOOL_CALL,
|
|
2016
|
+
tool_call: {
|
|
2017
|
+
id: 't4',
|
|
2018
|
+
name: 'snapshot',
|
|
2019
|
+
args: '{}',
|
|
2020
|
+
output: 'y'.repeat(8000),
|
|
2021
|
+
},
|
|
2022
|
+
},
|
|
2023
|
+
{
|
|
2024
|
+
type: ContentTypes.TOOL_CALL,
|
|
2025
|
+
tool_call: {
|
|
2026
|
+
id: 't5',
|
|
2027
|
+
name: 'extract',
|
|
2028
|
+
args: '{"selector":"h1"}',
|
|
2029
|
+
output: 'Page Title',
|
|
2030
|
+
},
|
|
2031
|
+
},
|
|
2032
|
+
],
|
|
2033
|
+
},
|
|
2034
|
+
];
|
|
2035
|
+
|
|
2036
|
+
const indexTokenCountMap = { 0: 3000 };
|
|
2037
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2038
|
+
|
|
2039
|
+
expect(result.messages).toHaveLength(6);
|
|
2040
|
+
|
|
2041
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2042
|
+
(sum, v) => sum + v,
|
|
2043
|
+
0
|
|
2044
|
+
);
|
|
2045
|
+
expect(total).toBe(3000);
|
|
2046
|
+
|
|
2047
|
+
const snapshotIdx1 = 2;
|
|
2048
|
+
const snapshotIdx2 = 4;
|
|
2049
|
+
const bigSnapshotTokens =
|
|
2050
|
+
(result.indexTokenCountMap?.[snapshotIdx1] ?? 0) +
|
|
2051
|
+
(result.indexTokenCountMap?.[snapshotIdx2] ?? 0);
|
|
2052
|
+
expect(bigSnapshotTokens).toBeGreaterThan(2500);
|
|
2053
|
+
|
|
2054
|
+
for (const val of Object.values(result.indexTokenCountMap || {})) {
|
|
2055
|
+
expect(val).toBeGreaterThanOrEqual(0);
|
|
2056
|
+
}
|
|
2057
|
+
});
|
|
2058
|
+
|
|
2059
|
+
it('should handle HN-like payload: AI with 18 tool calls and large snapshot results', () => {
|
|
2060
|
+
const smallOutput = 'Successfully navigated to page.';
|
|
2061
|
+
const hugeSnapshot = 'uid=8_0 RootWebArea ' + 'x'.repeat(20000);
|
|
2062
|
+
|
|
2063
|
+
const toolCalls: Array<{
|
|
2064
|
+
type: string;
|
|
2065
|
+
tool_call: { id: string; name: string; args: string; output: string };
|
|
2066
|
+
}> = [];
|
|
2067
|
+
const toolCallIds: string[] = [];
|
|
2068
|
+
|
|
2069
|
+
for (let i = 0; i < 18; i++) {
|
|
2070
|
+
const id = `tool_${i}`;
|
|
2071
|
+
toolCallIds.push(id);
|
|
2072
|
+
const isSnapshot = i % 3 === 1;
|
|
2073
|
+
toolCalls.push({
|
|
2074
|
+
type: ContentTypes.TOOL_CALL,
|
|
2075
|
+
tool_call: {
|
|
2076
|
+
id,
|
|
2077
|
+
name: isSnapshot ? 'take_snapshot' : 'navigate_page',
|
|
2078
|
+
args: isSnapshot ? '{}' : `{"url":"https://example.com/${i}"}`,
|
|
2079
|
+
output: isSnapshot ? hugeSnapshot : smallOutput,
|
|
2080
|
+
},
|
|
2081
|
+
});
|
|
2082
|
+
}
|
|
2083
|
+
|
|
2084
|
+
const payload = [
|
|
2085
|
+
{
|
|
2086
|
+
role: 'user',
|
|
2087
|
+
content: 'Look up top 5 posts on HN',
|
|
2088
|
+
},
|
|
2089
|
+
{
|
|
2090
|
+
role: 'assistant',
|
|
2091
|
+
content: [
|
|
2092
|
+
{
|
|
2093
|
+
type: ContentTypes.TEXT,
|
|
2094
|
+
[ContentTypes.TEXT]: '',
|
|
2095
|
+
tool_call_ids: toolCallIds,
|
|
2096
|
+
},
|
|
2097
|
+
...toolCalls,
|
|
2098
|
+
],
|
|
2099
|
+
},
|
|
2100
|
+
];
|
|
2101
|
+
|
|
2102
|
+
const indexTokenCountMap = { 0: 20, 1: 10000 };
|
|
2103
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2104
|
+
|
|
2105
|
+
expect(result.messages.length).toBeGreaterThan(2);
|
|
2106
|
+
|
|
2107
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2108
|
+
(sum, v) => sum + v,
|
|
2109
|
+
0
|
|
2110
|
+
);
|
|
2111
|
+
expect(total).toBe(10020);
|
|
2112
|
+
|
|
2113
|
+
expect(result.indexTokenCountMap?.[0]).toBe(20);
|
|
2114
|
+
|
|
2115
|
+
let snapshotTokenTotal = 0;
|
|
2116
|
+
let navTokenTotal = 0;
|
|
2117
|
+
for (let i = 1; i < result.messages.length; i++) {
|
|
2118
|
+
const tokens = result.indexTokenCountMap?.[i] ?? 0;
|
|
2119
|
+
expect(tokens).toBeGreaterThanOrEqual(0);
|
|
2120
|
+
|
|
2121
|
+
if (result.messages[i] instanceof ToolMessage) {
|
|
2122
|
+
const content = result.messages[i].content;
|
|
2123
|
+
if (typeof content === 'string' && content.length > 1000) {
|
|
2124
|
+
snapshotTokenTotal += tokens;
|
|
2125
|
+
} else {
|
|
2126
|
+
navTokenTotal += tokens;
|
|
2127
|
+
}
|
|
2128
|
+
}
|
|
2129
|
+
}
|
|
2130
|
+
|
|
2131
|
+
expect(snapshotTokenTotal).toBeGreaterThan(navTokenTotal);
|
|
2132
|
+
});
|
|
2133
|
+
|
|
2134
|
+
it('should complete proportional distribution within reasonable time for large payloads', () => {
|
|
2135
|
+
const toolCalls: Array<{
|
|
2136
|
+
type: string;
|
|
2137
|
+
tool_call: { id: string; name: string; args: string; output: string };
|
|
2138
|
+
}> = [];
|
|
2139
|
+
const toolCallIds: string[] = [];
|
|
2140
|
+
|
|
2141
|
+
for (let i = 0; i < 50; i++) {
|
|
2142
|
+
const id = `tool_${i}`;
|
|
2143
|
+
toolCallIds.push(id);
|
|
2144
|
+
toolCalls.push({
|
|
2145
|
+
type: ContentTypes.TOOL_CALL,
|
|
2146
|
+
tool_call: {
|
|
2147
|
+
id,
|
|
2148
|
+
name: `tool_${i}`,
|
|
2149
|
+
args: JSON.stringify({ data: 'x'.repeat(100) }),
|
|
2150
|
+
output: 'y'.repeat(Math.floor(Math.random() * 10000)),
|
|
2151
|
+
},
|
|
2152
|
+
});
|
|
2153
|
+
}
|
|
2154
|
+
|
|
2155
|
+
const payload = [
|
|
2156
|
+
{
|
|
2157
|
+
role: 'assistant',
|
|
2158
|
+
content: [
|
|
2159
|
+
{
|
|
2160
|
+
type: ContentTypes.TEXT,
|
|
2161
|
+
[ContentTypes.TEXT]: 'Processing...',
|
|
2162
|
+
tool_call_ids: toolCallIds,
|
|
2163
|
+
},
|
|
2164
|
+
...toolCalls,
|
|
2165
|
+
],
|
|
2166
|
+
},
|
|
2167
|
+
];
|
|
2168
|
+
|
|
2169
|
+
const indexTokenCountMap = { 0: 50000 };
|
|
2170
|
+
|
|
2171
|
+
const start = performance.now();
|
|
2172
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2173
|
+
const elapsed = performance.now() - start;
|
|
2174
|
+
|
|
2175
|
+
// PERF: Allow headroom for TOON compression applied to 50 tool outputs
|
|
2176
|
+
expect(elapsed).toBeLessThan(2000);
|
|
2177
|
+
|
|
2178
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2179
|
+
(sum, v) => sum + v,
|
|
2180
|
+
0
|
|
2181
|
+
);
|
|
2182
|
+
expect(total).toBe(50000);
|
|
2183
|
+
});
|
|
2184
|
+
|
|
2185
|
+
it('should always preserve total token count across multiple original messages', () => {
|
|
2186
|
+
const payload = [
|
|
2187
|
+
{ role: 'user', content: 'Hello' },
|
|
2188
|
+
{
|
|
2189
|
+
role: 'assistant',
|
|
2190
|
+
content: [
|
|
2191
|
+
{
|
|
2192
|
+
type: ContentTypes.TEXT,
|
|
2193
|
+
[ContentTypes.TEXT]: 'Let me search.',
|
|
2194
|
+
tool_call_ids: ['t1'],
|
|
2195
|
+
},
|
|
2196
|
+
{
|
|
2197
|
+
type: ContentTypes.TOOL_CALL,
|
|
2198
|
+
tool_call: {
|
|
2199
|
+
id: 't1',
|
|
2200
|
+
name: 'search',
|
|
2201
|
+
args: '{"q":"test"}',
|
|
2202
|
+
output:
|
|
2203
|
+
'Found 10 results with detailed descriptions: ' +
|
|
2204
|
+
'z'.repeat(500),
|
|
2205
|
+
},
|
|
2206
|
+
},
|
|
2207
|
+
],
|
|
2208
|
+
},
|
|
2209
|
+
{ role: 'user', content: 'Thanks' },
|
|
2210
|
+
{ role: 'assistant', content: 'You are welcome!' },
|
|
2211
|
+
];
|
|
2212
|
+
|
|
2213
|
+
const indexTokenCountMap = { 0: 5, 1: 200, 2: 3, 3: 8 };
|
|
2214
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2215
|
+
|
|
2216
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2217
|
+
(sum, v) => sum + v,
|
|
2218
|
+
0
|
|
2219
|
+
);
|
|
2220
|
+
expect(total).toBe(216);
|
|
2221
|
+
|
|
2222
|
+
for (const val of Object.values(result.indexTokenCountMap || {})) {
|
|
2223
|
+
expect(val).toBeGreaterThanOrEqual(0);
|
|
2224
|
+
expect(Number.isInteger(val)).toBe(true);
|
|
2225
|
+
}
|
|
2226
|
+
});
|
|
2227
|
+
|
|
2228
|
+
it('should produce integer token counts (no floating point)', () => {
|
|
2229
|
+
const payload = [
|
|
2230
|
+
{
|
|
2231
|
+
role: 'assistant',
|
|
2232
|
+
content: [
|
|
2233
|
+
{
|
|
2234
|
+
type: ContentTypes.TEXT,
|
|
2235
|
+
[ContentTypes.TEXT]: 'abc',
|
|
2236
|
+
tool_call_ids: ['t1', 't2', 't3'],
|
|
2237
|
+
},
|
|
2238
|
+
{
|
|
2239
|
+
type: ContentTypes.TOOL_CALL,
|
|
2240
|
+
tool_call: { id: 't1', name: 'a', args: '{}', output: 'defgh' },
|
|
2241
|
+
},
|
|
2242
|
+
{
|
|
2243
|
+
type: ContentTypes.TOOL_CALL,
|
|
2244
|
+
tool_call: { id: 't2', name: 'b', args: '{}', output: 'ij' },
|
|
2245
|
+
},
|
|
2246
|
+
{
|
|
2247
|
+
type: ContentTypes.TOOL_CALL,
|
|
2248
|
+
tool_call: {
|
|
2249
|
+
id: 't3',
|
|
2250
|
+
name: 'c',
|
|
2251
|
+
args: '{}',
|
|
2252
|
+
output: 'klmnopqrst',
|
|
2253
|
+
},
|
|
2254
|
+
},
|
|
2255
|
+
],
|
|
2256
|
+
},
|
|
2257
|
+
];
|
|
2258
|
+
|
|
2259
|
+
const indexTokenCountMap = { 0: 97 };
|
|
2260
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2261
|
+
|
|
2262
|
+
for (const val of Object.values(result.indexTokenCountMap || {})) {
|
|
2263
|
+
expect(Number.isInteger(val)).toBe(true);
|
|
2264
|
+
}
|
|
2265
|
+
|
|
2266
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2267
|
+
(sum, v) => sum + v,
|
|
2268
|
+
0
|
|
2269
|
+
);
|
|
2270
|
+
expect(total).toBe(97);
|
|
2271
|
+
});
|
|
2272
|
+
|
|
2273
|
+
it('should account for tool call args in content length calculation', () => {
|
|
2274
|
+
const payload = [
|
|
2275
|
+
{
|
|
2276
|
+
role: 'assistant',
|
|
2277
|
+
content: [
|
|
2278
|
+
{
|
|
2279
|
+
type: ContentTypes.TEXT,
|
|
2280
|
+
[ContentTypes.TEXT]: 'x',
|
|
2281
|
+
tool_call_ids: ['t1', 't2'],
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
type: ContentTypes.TOOL_CALL,
|
|
2285
|
+
tool_call: {
|
|
2286
|
+
id: 't1',
|
|
2287
|
+
name: 'tiny_tool',
|
|
2288
|
+
args: '{}',
|
|
2289
|
+
output: 'small',
|
|
2290
|
+
},
|
|
2291
|
+
},
|
|
2292
|
+
{
|
|
2293
|
+
type: ContentTypes.TOOL_CALL,
|
|
2294
|
+
tool_call: {
|
|
2295
|
+
id: 't2',
|
|
2296
|
+
name: 'big_args_tool',
|
|
2297
|
+
args: JSON.stringify({ data: 'a'.repeat(5000) }),
|
|
2298
|
+
output: 'small',
|
|
2299
|
+
},
|
|
2300
|
+
},
|
|
2301
|
+
],
|
|
2302
|
+
},
|
|
2303
|
+
];
|
|
2304
|
+
|
|
2305
|
+
const indexTokenCountMap = { 0: 1000 };
|
|
2306
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2307
|
+
|
|
2308
|
+
expect(result.messages).toHaveLength(3);
|
|
2309
|
+
|
|
2310
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2311
|
+
(sum, v) => sum + v,
|
|
2312
|
+
0
|
|
2313
|
+
);
|
|
2314
|
+
expect(total).toBe(1000);
|
|
2315
|
+
|
|
2316
|
+
for (const val of Object.values(result.indexTokenCountMap || {})) {
|
|
2317
|
+
expect(val).toBeGreaterThanOrEqual(0);
|
|
2318
|
+
}
|
|
2319
|
+
});
|
|
2320
|
+
|
|
2321
|
+
it('should not throw when indexTokenCountMap has undefined values for some indices', () => {
|
|
2322
|
+
const payload = [
|
|
2323
|
+
{ role: 'user', content: 'Hello' },
|
|
2324
|
+
{
|
|
2325
|
+
role: 'assistant',
|
|
2326
|
+
content: [
|
|
2327
|
+
{
|
|
2328
|
+
type: ContentTypes.TEXT,
|
|
2329
|
+
[ContentTypes.TEXT]: 'response',
|
|
2330
|
+
tool_call_ids: ['t1'],
|
|
2331
|
+
},
|
|
2332
|
+
{
|
|
2333
|
+
type: ContentTypes.TOOL_CALL,
|
|
2334
|
+
tool_call: {
|
|
2335
|
+
id: 't1',
|
|
2336
|
+
name: 'search',
|
|
2337
|
+
args: '{}',
|
|
2338
|
+
output: 'result',
|
|
2339
|
+
},
|
|
2340
|
+
},
|
|
2341
|
+
],
|
|
2342
|
+
},
|
|
2343
|
+
];
|
|
2344
|
+
|
|
2345
|
+
const indexTokenCountMap: Record<number, number | undefined> = {
|
|
2346
|
+
0: undefined,
|
|
2347
|
+
1: 50,
|
|
2348
|
+
};
|
|
2349
|
+
|
|
2350
|
+
expect(() => {
|
|
2351
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2352
|
+
expect(result.indexTokenCountMap).toBeDefined();
|
|
2353
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2354
|
+
(sum, v) => sum + v,
|
|
2355
|
+
0
|
|
2356
|
+
);
|
|
2357
|
+
expect(total).toBe(50);
|
|
2358
|
+
}).not.toThrow();
|
|
2359
|
+
});
|
|
2360
|
+
|
|
2361
|
+
it('should not throw when indexTokenCountMap is sparse (missing indices)', () => {
|
|
2362
|
+
const payload = [
|
|
2363
|
+
{ role: 'user', content: 'Hello' },
|
|
2364
|
+
{ role: 'assistant', content: 'World' },
|
|
2365
|
+
{ role: 'user', content: 'Bye' },
|
|
2366
|
+
];
|
|
2367
|
+
|
|
2368
|
+
const indexTokenCountMap = { 0: 5, 2: 3 };
|
|
2369
|
+
|
|
2370
|
+
expect(() => {
|
|
2371
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2372
|
+
expect(result.indexTokenCountMap).toBeDefined();
|
|
2373
|
+
expect(result.indexTokenCountMap?.[0]).toBe(5);
|
|
2374
|
+
expect(result.indexTokenCountMap?.[2]).toBe(3);
|
|
2375
|
+
}).not.toThrow();
|
|
2376
|
+
});
|
|
2377
|
+
|
|
2378
|
+
it('should not throw when indexTokenCountMap has extra indices beyond payload', () => {
|
|
2379
|
+
const payload = [{ role: 'user', content: 'Hello' }];
|
|
2380
|
+
|
|
2381
|
+
const indexTokenCountMap = { 0: 5, 1: 10, 2: 15, 99: 999 };
|
|
2382
|
+
|
|
2383
|
+
expect(() => {
|
|
2384
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2385
|
+
expect(result.indexTokenCountMap?.[0]).toBe(5);
|
|
2386
|
+
}).not.toThrow();
|
|
2387
|
+
});
|
|
2388
|
+
|
|
2389
|
+
it('should not throw with empty payload and non-empty indexTokenCountMap', () => {
|
|
2390
|
+
const payload: Array<{ role: string; content: string }> = [];
|
|
2391
|
+
const indexTokenCountMap = { 0: 100 };
|
|
2392
|
+
|
|
2393
|
+
expect(() => {
|
|
2394
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2395
|
+
expect(result.messages).toHaveLength(0);
|
|
2396
|
+
}).not.toThrow();
|
|
2397
|
+
});
|
|
2398
|
+
|
|
2399
|
+
it('should not throw when assistant message content is empty array', () => {
|
|
2400
|
+
const payload = [
|
|
2401
|
+
{
|
|
2402
|
+
role: 'assistant',
|
|
2403
|
+
content: [] as Array<{ type: string; text?: string }>,
|
|
2404
|
+
},
|
|
2405
|
+
];
|
|
2406
|
+
|
|
2407
|
+
const indexTokenCountMap = { 0: 50 };
|
|
2408
|
+
|
|
2409
|
+
expect(() => {
|
|
2410
|
+
formatAgentMessages(payload, indexTokenCountMap);
|
|
2411
|
+
}).not.toThrow();
|
|
2412
|
+
});
|
|
2413
|
+
|
|
2414
|
+
it('should not throw when tool call output is null or undefined', () => {
|
|
2415
|
+
const payload = [
|
|
2416
|
+
{
|
|
2417
|
+
role: 'assistant',
|
|
2418
|
+
content: [
|
|
2419
|
+
{
|
|
2420
|
+
type: ContentTypes.TEXT,
|
|
2421
|
+
[ContentTypes.TEXT]: 'calling tools',
|
|
2422
|
+
tool_call_ids: ['t1', 't2'],
|
|
2423
|
+
},
|
|
2424
|
+
{
|
|
2425
|
+
type: ContentTypes.TOOL_CALL,
|
|
2426
|
+
tool_call: {
|
|
2427
|
+
id: 't1',
|
|
2428
|
+
name: 'search',
|
|
2429
|
+
args: '{}',
|
|
2430
|
+
output: null as unknown as string,
|
|
2431
|
+
},
|
|
2432
|
+
},
|
|
2433
|
+
{
|
|
2434
|
+
type: ContentTypes.TOOL_CALL,
|
|
2435
|
+
tool_call: {
|
|
2436
|
+
id: 't2',
|
|
2437
|
+
name: 'fetch',
|
|
2438
|
+
args: '{}',
|
|
2439
|
+
output: undefined as unknown as string,
|
|
2440
|
+
},
|
|
2441
|
+
},
|
|
2442
|
+
],
|
|
2443
|
+
},
|
|
2444
|
+
];
|
|
2445
|
+
|
|
2446
|
+
const indexTokenCountMap = { 0: 30 };
|
|
2447
|
+
|
|
2448
|
+
expect(() => {
|
|
2449
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2450
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2451
|
+
(sum, v) => sum + v,
|
|
2452
|
+
0
|
|
2453
|
+
);
|
|
2454
|
+
expect(total).toBe(30);
|
|
2455
|
+
}).not.toThrow();
|
|
2456
|
+
});
|
|
2457
|
+
|
|
2458
|
+
it('should not throw when tool call args are deeply nested objects', () => {
|
|
2459
|
+
const deepArgs = { a: { b: { c: { d: { e: { f: 'deep' } } } } } };
|
|
2460
|
+
const payload = [
|
|
2461
|
+
{
|
|
2462
|
+
role: 'assistant',
|
|
2463
|
+
content: [
|
|
2464
|
+
{
|
|
2465
|
+
type: ContentTypes.TEXT,
|
|
2466
|
+
[ContentTypes.TEXT]: 'deep call',
|
|
2467
|
+
tool_call_ids: ['t1'],
|
|
2468
|
+
},
|
|
2469
|
+
{
|
|
2470
|
+
type: ContentTypes.TOOL_CALL,
|
|
2471
|
+
tool_call: {
|
|
2472
|
+
id: 't1',
|
|
2473
|
+
name: 'deep_tool',
|
|
2474
|
+
args: JSON.stringify(deepArgs),
|
|
2475
|
+
output: 'done',
|
|
2476
|
+
},
|
|
2477
|
+
},
|
|
2478
|
+
],
|
|
2479
|
+
},
|
|
2480
|
+
];
|
|
2481
|
+
|
|
2482
|
+
const indexTokenCountMap = { 0: 100 };
|
|
2483
|
+
|
|
2484
|
+
expect(() => {
|
|
2485
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2486
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2487
|
+
(sum, v) => sum + v,
|
|
2488
|
+
0
|
|
2489
|
+
);
|
|
2490
|
+
expect(total).toBe(100);
|
|
2491
|
+
}).not.toThrow();
|
|
2492
|
+
});
|
|
2493
|
+
|
|
2494
|
+
it('should not throw when tool call args are not valid JSON strings', () => {
|
|
2495
|
+
const payload = [
|
|
2496
|
+
{
|
|
2497
|
+
role: 'assistant',
|
|
2498
|
+
content: [
|
|
2499
|
+
{
|
|
2500
|
+
type: ContentTypes.TEXT,
|
|
2501
|
+
[ContentTypes.TEXT]: 'bad args',
|
|
2502
|
+
tool_call_ids: ['t1'],
|
|
2503
|
+
},
|
|
2504
|
+
{
|
|
2505
|
+
type: ContentTypes.TOOL_CALL,
|
|
2506
|
+
tool_call: {
|
|
2507
|
+
id: 't1',
|
|
2508
|
+
name: 'tool',
|
|
2509
|
+
args: '{not valid json!!!',
|
|
2510
|
+
output: 'output',
|
|
2511
|
+
},
|
|
2512
|
+
},
|
|
2513
|
+
],
|
|
2514
|
+
},
|
|
2515
|
+
];
|
|
2516
|
+
|
|
2517
|
+
const indexTokenCountMap = { 0: 40 };
|
|
2518
|
+
|
|
2519
|
+
expect(() => {
|
|
2520
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2521
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2522
|
+
(sum, v) => sum + v,
|
|
2523
|
+
0
|
|
2524
|
+
);
|
|
2525
|
+
expect(total).toBe(40);
|
|
2526
|
+
}).not.toThrow();
|
|
2527
|
+
});
|
|
2528
|
+
|
|
2529
|
+
it('should not throw when content array has mixed types including unexpected values', () => {
|
|
2530
|
+
const payload = [
|
|
2531
|
+
{
|
|
2532
|
+
role: 'assistant',
|
|
2533
|
+
content: [
|
|
2534
|
+
{ type: ContentTypes.TEXT, [ContentTypes.TEXT]: 'hello' },
|
|
2535
|
+
null as unknown as { type: string },
|
|
2536
|
+
undefined as unknown as { type: string },
|
|
2537
|
+
{ type: 'unknown_type', something: 'weird' },
|
|
2538
|
+
],
|
|
2539
|
+
},
|
|
2540
|
+
];
|
|
2541
|
+
|
|
2542
|
+
const indexTokenCountMap = { 0: 25 };
|
|
2543
|
+
|
|
2544
|
+
expect(() => {
|
|
2545
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2546
|
+
expect(result.indexTokenCountMap?.[0]).toBe(25);
|
|
2547
|
+
}).not.toThrow();
|
|
2548
|
+
});
|
|
2549
|
+
|
|
2550
|
+
it('should not throw when tool call has empty name and empty args', () => {
|
|
2551
|
+
const payload = [
|
|
2552
|
+
{
|
|
2553
|
+
role: 'assistant',
|
|
2554
|
+
content: [
|
|
2555
|
+
{
|
|
2556
|
+
type: ContentTypes.TEXT,
|
|
2557
|
+
[ContentTypes.TEXT]: 'test',
|
|
2558
|
+
tool_call_ids: ['t1'],
|
|
2559
|
+
},
|
|
2560
|
+
{
|
|
2561
|
+
type: ContentTypes.TOOL_CALL,
|
|
2562
|
+
tool_call: {
|
|
2563
|
+
id: 't1',
|
|
2564
|
+
name: '',
|
|
2565
|
+
args: '',
|
|
2566
|
+
output: 'some output',
|
|
2567
|
+
},
|
|
2568
|
+
},
|
|
2569
|
+
],
|
|
2570
|
+
},
|
|
2571
|
+
];
|
|
2572
|
+
|
|
2573
|
+
const indexTokenCountMap = { 0: 50 };
|
|
2574
|
+
|
|
2575
|
+
expect(() => {
|
|
2576
|
+
formatAgentMessages(payload, indexTokenCountMap);
|
|
2577
|
+
}).not.toThrow();
|
|
2578
|
+
});
|
|
2579
|
+
|
|
2580
|
+
it('should not throw when all content parts are filtered out (THINK + ERROR only)', () => {
|
|
2581
|
+
const payload = [
|
|
2582
|
+
{
|
|
2583
|
+
role: 'assistant',
|
|
2584
|
+
content: [
|
|
2585
|
+
{ type: ContentTypes.THINK, [ContentTypes.THINK]: 'thinking...' },
|
|
2586
|
+
{ type: ContentTypes.ERROR, [ContentTypes.ERROR]: 'error...' },
|
|
2587
|
+
],
|
|
2588
|
+
},
|
|
2589
|
+
];
|
|
2590
|
+
|
|
2591
|
+
const indexTokenCountMap = { 0: 100 };
|
|
2592
|
+
|
|
2593
|
+
expect(() => {
|
|
2594
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2595
|
+
expect(Object.keys(result.indexTokenCountMap || {}).length).toBe(0);
|
|
2596
|
+
}).not.toThrow();
|
|
2597
|
+
});
|
|
2598
|
+
|
|
2599
|
+
it('should not throw with very large token count values', () => {
|
|
2600
|
+
const payload = [
|
|
2601
|
+
{
|
|
2602
|
+
role: 'assistant',
|
|
2603
|
+
content: [
|
|
2604
|
+
{
|
|
2605
|
+
type: ContentTypes.TEXT,
|
|
2606
|
+
[ContentTypes.TEXT]: 'big tokens',
|
|
2607
|
+
tool_call_ids: ['t1'],
|
|
2608
|
+
},
|
|
2609
|
+
{
|
|
2610
|
+
type: ContentTypes.TOOL_CALL,
|
|
2611
|
+
tool_call: { id: 't1', name: 'a', args: '{}', output: 'b' },
|
|
2612
|
+
},
|
|
2613
|
+
],
|
|
2614
|
+
},
|
|
2615
|
+
];
|
|
2616
|
+
|
|
2617
|
+
const indexTokenCountMap = { 0: Number.MAX_SAFE_INTEGER };
|
|
2618
|
+
|
|
2619
|
+
expect(() => {
|
|
2620
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2621
|
+
const total = Object.values(result.indexTokenCountMap || {}).reduce(
|
|
2622
|
+
(sum, v) => sum + v,
|
|
2623
|
+
0
|
|
2624
|
+
);
|
|
2625
|
+
expect(total).toBe(Number.MAX_SAFE_INTEGER);
|
|
2626
|
+
}).not.toThrow();
|
|
2627
|
+
});
|
|
2628
|
+
|
|
2629
|
+
it('should not throw when multiple payload messages expand and some have undefined token counts', () => {
|
|
2630
|
+
const payload = [
|
|
2631
|
+
{ role: 'user', content: 'msg1' },
|
|
2632
|
+
{
|
|
2633
|
+
role: 'assistant',
|
|
2634
|
+
content: [
|
|
2635
|
+
{
|
|
2636
|
+
type: ContentTypes.TEXT,
|
|
2637
|
+
[ContentTypes.TEXT]: 'response with tool',
|
|
2638
|
+
tool_call_ids: ['t1'],
|
|
2639
|
+
},
|
|
2640
|
+
{
|
|
2641
|
+
type: ContentTypes.TOOL_CALL,
|
|
2642
|
+
tool_call: {
|
|
2643
|
+
id: 't1',
|
|
2644
|
+
name: 'search',
|
|
2645
|
+
args: '{}',
|
|
2646
|
+
output: 'found',
|
|
2647
|
+
},
|
|
2648
|
+
},
|
|
2649
|
+
],
|
|
2650
|
+
},
|
|
2651
|
+
{ role: 'user', content: 'msg2' },
|
|
2652
|
+
{
|
|
2653
|
+
role: 'assistant',
|
|
2654
|
+
content: [
|
|
2655
|
+
{
|
|
2656
|
+
type: ContentTypes.TEXT,
|
|
2657
|
+
[ContentTypes.TEXT]: 'another response',
|
|
2658
|
+
tool_call_ids: ['t2'],
|
|
2659
|
+
},
|
|
2660
|
+
{
|
|
2661
|
+
type: ContentTypes.TOOL_CALL,
|
|
2662
|
+
tool_call: {
|
|
2663
|
+
id: 't2',
|
|
2664
|
+
name: 'fetch',
|
|
2665
|
+
args: '{}',
|
|
2666
|
+
output: 'data',
|
|
2667
|
+
},
|
|
2668
|
+
},
|
|
2669
|
+
],
|
|
2670
|
+
},
|
|
2671
|
+
];
|
|
2672
|
+
|
|
2673
|
+
const indexTokenCountMap: Record<number, number | undefined> = {
|
|
2674
|
+
0: 5,
|
|
2675
|
+
1: undefined,
|
|
2676
|
+
2: 3,
|
|
2677
|
+
3: 80,
|
|
2678
|
+
};
|
|
2679
|
+
|
|
2680
|
+
expect(() => {
|
|
2681
|
+
const result = formatAgentMessages(payload, indexTokenCountMap);
|
|
2682
|
+
expect(result.indexTokenCountMap).toBeDefined();
|
|
2683
|
+
expect(result.indexTokenCountMap?.[0]).toBe(5);
|
|
2684
|
+
}).not.toThrow();
|
|
2685
|
+
});
|
|
2686
|
+
});
|
|
1513
2687
|
});
|