@illuma-ai/agents 1.5.1 → 2.1.1
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/README.md +0 -62
- package/dist/cjs/agents/AgentContext.cjs +160 -259
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +12 -12
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +30 -13
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +1 -1
- package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/matchers.cjs +2 -2
- package/dist/cjs/hooks/matchers.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +1 -1
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +1 -5
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +33 -61
- package/dist/cjs/llm/bedrock/index.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 +10 -27
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +3 -84
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/memory/citations.cjs +4 -4
- package/dist/cjs/memory/citations.cjs.map +1 -1
- package/dist/cjs/memory/constants.cjs +17 -17
- package/dist/cjs/memory/constants.cjs.map +1 -1
- package/dist/cjs/memory/mmr.cjs +1 -1
- package/dist/cjs/memory/mmr.cjs.map +1 -1
- package/dist/cjs/memory/paths.cjs +1 -1
- package/dist/cjs/memory/paths.cjs.map +1 -1
- package/dist/cjs/memory/recallTracking.cjs +3 -3
- package/dist/cjs/memory/recallTracking.cjs.map +1 -1
- package/dist/cjs/memory/temporalDecay.cjs +2 -2
- package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +0 -89
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +13 -71
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +11 -21
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +13 -41
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +11 -16
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +78 -13
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
- package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
- package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
- package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/shared.cjs +1 -1
- package/dist/cjs/tools/memory/shared.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +3 -11
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +4 -28
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +3 -10
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +48 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/types/graph.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +160 -259
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +12 -12
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +30 -13
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
- package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +1 -1
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/matchers.mjs +2 -2
- package/dist/esm/hooks/matchers.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +1 -1
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +1 -5
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +34 -61
- package/dist/esm/llm/bedrock/index.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 +10 -27
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -5
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/memory/citations.mjs +4 -4
- package/dist/esm/memory/citations.mjs.map +1 -1
- package/dist/esm/memory/constants.mjs +17 -17
- package/dist/esm/memory/constants.mjs.map +1 -1
- package/dist/esm/memory/mmr.mjs +1 -1
- package/dist/esm/memory/mmr.mjs.map +1 -1
- package/dist/esm/memory/paths.mjs +1 -1
- package/dist/esm/memory/paths.mjs.map +1 -1
- package/dist/esm/memory/recallTracking.mjs +3 -3
- package/dist/esm/memory/recallTracking.mjs.map +1 -1
- package/dist/esm/memory/temporalDecay.mjs +2 -2
- package/dist/esm/memory/temporalDecay.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +0 -89
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +13 -71
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +12 -22
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +14 -41
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +12 -17
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +78 -13
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
- package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
- package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
- package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
- package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
- package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
- package/dist/esm/tools/memory/shared.mjs +1 -1
- package/dist/esm/tools/memory/shared.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +3 -11
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +4 -28
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +3 -10
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +48 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/types/graph.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +25 -95
- package/dist/types/common/enum.d.ts +12 -12
- package/dist/types/graphs/Graph.d.ts +2 -2
- package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
- package/dist/types/hooks/HookRegistry.d.ts +1 -1
- package/dist/types/hooks/matchers.d.ts +2 -2
- package/dist/types/hooks/types.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/llm/bedrock/index.d.ts +1 -54
- package/dist/types/llm/openai/index.d.ts +1 -1
- package/dist/types/memory/citations.d.ts +4 -4
- package/dist/types/memory/constants.d.ts +17 -17
- package/dist/types/memory/mmr.d.ts +3 -3
- package/dist/types/memory/paths.d.ts +1 -1
- package/dist/types/memory/temporalDecay.d.ts +2 -2
- package/dist/types/memory/types.d.ts +3 -3
- package/dist/types/messages/format.d.ts +2 -5
- package/dist/types/tools/CodeExecutor.d.ts +0 -6
- package/dist/types/tools/ToolNode.d.ts +3 -3
- package/dist/types/tools/memory/shared.d.ts +1 -1
- package/dist/types/tools/search/test.d.ts +1 -0
- package/dist/types/tools/search/types.d.ts +5 -99
- package/dist/types/tools/search/utils.d.ts +2 -2
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +29 -0
- package/dist/types/types/graph.d.ts +30 -34
- package/dist/types/types/index.d.ts +0 -1
- package/dist/types/types/messages.d.ts +1 -1
- package/dist/types/types/run.d.ts +1 -3
- package/dist/types/types/tools.d.ts +5 -14
- package/package.json +1 -61
- package/src/agents/AgentContext.test.ts +176 -0
- package/src/agents/AgentContext.ts +179 -305
- package/src/agents/__tests__/AgentContext.test.ts +0 -632
- package/src/common/__tests__/enum.test.ts +1 -1
- package/src/common/enum.ts +12 -12
- package/src/graphs/Graph.ts +32 -13
- package/src/graphs/MultiAgentGraph.ts +1 -1
- package/src/graphs/gapFeatures.test.ts +1 -1
- package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
- package/src/graphs/phases/memoryFlushPhase.ts +2 -2
- package/src/hooks/HookRegistry.ts +1 -1
- package/src/hooks/index.ts +1 -1
- package/src/hooks/matchers.ts +2 -2
- package/src/hooks/types.ts +1 -1
- package/src/index.ts +0 -6
- package/src/llm/anthropic/utils/message_inputs.ts +1 -10
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +18 -166
- package/src/llm/bedrock/index.ts +41 -116
- package/src/llm/openai/index.ts +2 -2
- package/src/llm/openai/utils/index.ts +14 -31
- package/src/memory/citations.ts +4 -4
- package/src/memory/constants.ts +17 -17
- package/src/memory/mmr.ts +3 -3
- package/src/memory/paths.ts +1 -1
- package/src/memory/recallTracking.ts +3 -3
- package/src/memory/temporalDecay.ts +2 -2
- package/src/memory/types.ts +3 -3
- package/src/messages/cache.test.ts +24 -62
- package/src/messages/cache.ts +0 -112
- package/src/messages/ensureThinkingBlock.test.ts +1 -1
- package/src/messages/format.ts +13 -92
- package/src/messages/formatAgentMessages.test.ts +1 -1
- package/src/scripts/subagent-configurable-inheritance.ts +263 -0
- package/src/scripts/subagent-event-driven-debug.ts +2 -2
- package/src/specs/anthropic.simple.test.ts +0 -61
- package/src/specs/prune.orphans.test.ts +1 -1
- package/src/tools/BashExecutor.ts +13 -37
- package/src/tools/CodeExecutor.ts +14 -59
- package/src/tools/ProgrammaticToolCalling.ts +14 -29
- package/src/tools/ToolNode.ts +75 -14
- package/src/tools/__tests__/CodeExecutor.test.ts +3 -3
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -60
- package/src/tools/__tests__/SubagentExecutor.test.ts +157 -0
- package/src/tools/memory/memoryAppendTool.ts +1 -1
- package/src/tools/memory/memoryGetTool.ts +2 -2
- package/src/tools/memory/memorySearchTool.ts +3 -3
- package/src/tools/memory/shared.ts +1 -1
- package/src/tools/search/output.md +2775 -0
- package/src/tools/search/search.ts +2 -12
- package/src/tools/search/test.html +884 -0
- package/src/tools/search/test.md +643 -0
- package/src/tools/search/test.ts +159 -0
- package/src/tools/search/tool.ts +2 -36
- package/src/tools/search/types.ts +8 -133
- package/src/tools/search/utils.ts +5 -13
- package/src/tools/subagent/SubagentExecutor.ts +78 -0
- package/src/types/graph.ts +27 -34
- package/src/types/index.ts +0 -1
- package/src/types/messages.ts +1 -1
- package/src/types/run.ts +1 -3
- package/src/types/tools.ts +5 -14
- package/dist/cjs/langchain/google-common.cjs +0 -3
- package/dist/cjs/langchain/google-common.cjs.map +0 -1
- package/dist/cjs/langchain/index.cjs +0 -86
- package/dist/cjs/langchain/index.cjs.map +0 -1
- package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
- package/dist/cjs/langchain/messages/tool.cjs +0 -3
- package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
- package/dist/cjs/langchain/messages.cjs +0 -51
- package/dist/cjs/langchain/messages.cjs.map +0 -1
- package/dist/cjs/langchain/openai.cjs +0 -3
- package/dist/cjs/langchain/openai.cjs.map +0 -1
- package/dist/cjs/langchain/prompts.cjs +0 -11
- package/dist/cjs/langchain/prompts.cjs.map +0 -1
- package/dist/cjs/langchain/runnables.cjs +0 -19
- package/dist/cjs/langchain/runnables.cjs.map +0 -1
- package/dist/cjs/langchain/tools.cjs +0 -23
- package/dist/cjs/langchain/tools.cjs.map +0 -1
- package/dist/cjs/langchain/utils/env.cjs +0 -11
- package/dist/cjs/langchain/utils/env.cjs.map +0 -1
- package/dist/cjs/llm/bedrock/cacheSupport.cjs +0 -55
- package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +0 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +0 -189
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +0 -1
- package/dist/cjs/tools/search/tavily-search.cjs +0 -372
- package/dist/cjs/tools/search/tavily-search.cjs.map +0 -1
- package/dist/cjs/types/agent-cache.cjs +0 -54
- package/dist/cjs/types/agent-cache.cjs.map +0 -1
- package/dist/esm/langchain/google-common.mjs +0 -2
- package/dist/esm/langchain/google-common.mjs.map +0 -1
- package/dist/esm/langchain/index.mjs +0 -5
- package/dist/esm/langchain/index.mjs.map +0 -1
- package/dist/esm/langchain/language_models/chat_models.mjs +0 -2
- package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
- package/dist/esm/langchain/messages/tool.mjs +0 -2
- package/dist/esm/langchain/messages/tool.mjs.map +0 -1
- package/dist/esm/langchain/messages.mjs +0 -2
- package/dist/esm/langchain/messages.mjs.map +0 -1
- package/dist/esm/langchain/openai.mjs +0 -2
- package/dist/esm/langchain/openai.mjs.map +0 -1
- package/dist/esm/langchain/prompts.mjs +0 -2
- package/dist/esm/langchain/prompts.mjs.map +0 -1
- package/dist/esm/langchain/runnables.mjs +0 -2
- package/dist/esm/langchain/runnables.mjs.map +0 -1
- package/dist/esm/langchain/tools.mjs +0 -2
- package/dist/esm/langchain/tools.mjs.map +0 -1
- package/dist/esm/langchain/utils/env.mjs +0 -2
- package/dist/esm/langchain/utils/env.mjs.map +0 -1
- package/dist/esm/llm/bedrock/cacheSupport.mjs +0 -52
- package/dist/esm/llm/bedrock/cacheSupport.mjs.map +0 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +0 -186
- package/dist/esm/tools/search/tavily-scraper.mjs.map +0 -1
- package/dist/esm/tools/search/tavily-search.mjs +0 -370
- package/dist/esm/tools/search/tavily-search.mjs.map +0 -1
- package/dist/esm/types/agent-cache.mjs +0 -52
- package/dist/esm/types/agent-cache.mjs.map +0 -1
- package/dist/types/langchain/google-common.d.ts +0 -1
- package/dist/types/langchain/index.d.ts +0 -8
- package/dist/types/langchain/language_models/chat_models.d.ts +0 -1
- package/dist/types/langchain/messages/tool.d.ts +0 -1
- package/dist/types/langchain/messages.d.ts +0 -2
- package/dist/types/langchain/openai.d.ts +0 -1
- package/dist/types/langchain/prompts.d.ts +0 -1
- package/dist/types/langchain/runnables.d.ts +0 -2
- package/dist/types/langchain/tools.d.ts +0 -2
- package/dist/types/langchain/utils/env.d.ts +0 -1
- package/dist/types/llm/bedrock/cacheSupport.d.ts +0 -35
- package/dist/types/tools/search/tavily-scraper.d.ts +0 -19
- package/dist/types/tools/search/tavily-search.d.ts +0 -4
- package/dist/types/tools/subagent/types.d.ts +0 -84
- package/dist/types/types/agent-cache.d.ts +0 -71
- package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +0 -259
- package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +0 -266
- package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +0 -342
- package/src/langchain/google-common.ts +0 -1
- package/src/langchain/index.ts +0 -8
- package/src/langchain/language_models/chat_models.ts +0 -1
- package/src/langchain/messages/tool.ts +0 -5
- package/src/langchain/messages.ts +0 -21
- package/src/langchain/openai.ts +0 -1
- package/src/langchain/prompts.ts +0 -1
- package/src/langchain/runnables.ts +0 -7
- package/src/langchain/tools.ts +0 -8
- package/src/langchain/utils/env.ts +0 -1
- package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -436
- package/src/llm/bedrock/cacheSupport.test.ts +0 -99
- package/src/llm/bedrock/cacheSupport.ts +0 -53
- package/src/tools/search/tavily-scraper.ts +0 -235
- package/src/tools/search/tavily-search.ts +0 -424
- package/src/tools/search/tavily.test.ts +0 -965
- package/src/tools/subagent/types.test.ts +0 -70
- package/src/tools/subagent/types.ts +0 -115
- package/src/types/agent-cache.ts +0 -74
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
/**
|
|
3
|
-
* LIVE Bedrock prompt-cache verification: cross-user, account-level.
|
|
4
|
-
*
|
|
5
|
-
* What this test proves:
|
|
6
|
-
*
|
|
7
|
-
* 1. The `cachePoint` block emitted inline by `buildSystemRunnable` for
|
|
8
|
-
* Bedrock actually causes Bedrock to write a cache entry.
|
|
9
|
-
* 2. The cache entry is keyed off the STABLE prefix only — two simulated
|
|
10
|
-
* users (Alice, Bob) with the SAME `agent.instructions` but DIFFERENT
|
|
11
|
-
* `additional_instructions` both hit the same cache entry.
|
|
12
|
-
* 3. Bedrock's prompt cache is account-scoped: a second AgentContext (a
|
|
13
|
-
* separate "user") in the SAME AWS account reads the cache that the
|
|
14
|
-
* first user populated.
|
|
15
|
-
*
|
|
16
|
-
* What it does NOT prove (out of scope for a unit-runner):
|
|
17
|
-
* - True concurrent multi-tenant load (this runs sequentially)
|
|
18
|
-
* - Cache TTL / eviction behavior
|
|
19
|
-
* - Behavior across AWS accounts (cache is account-scoped by design)
|
|
20
|
-
*
|
|
21
|
-
* Run with:
|
|
22
|
-
* BEDROCK_AWS_REGION=us-east-1 \
|
|
23
|
-
* BEDROCK_AWS_ACCESS_KEY_ID=... \
|
|
24
|
-
* BEDROCK_AWS_SECRET_ACCESS_KEY=... \
|
|
25
|
-
* npx jest src/agents/__tests__/AgentContext.crossUserCache.live.test.ts
|
|
26
|
-
*
|
|
27
|
-
* Skipped automatically if Bedrock credentials are not present.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
import { config } from 'dotenv';
|
|
31
|
-
config();
|
|
32
|
-
|
|
33
|
-
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
34
|
-
import type { BaseMessage, AIMessage } from '@langchain/core/messages';
|
|
35
|
-
import { IllumaBedrockConverse } from '@/llm/bedrock';
|
|
36
|
-
import { addBedrockCacheControl } from '@/messages/cache';
|
|
37
|
-
import { AgentContext } from '../AgentContext';
|
|
38
|
-
import { Providers } from '@/common';
|
|
39
|
-
import type * as t from '@/types';
|
|
40
|
-
|
|
41
|
-
const region =
|
|
42
|
-
process.env.BEDROCK_AWS_REGION ??
|
|
43
|
-
process.env.BEDROCK_AWS_DEFAULT_REGION ??
|
|
44
|
-
process.env.AWS_REGION ??
|
|
45
|
-
'us-east-1';
|
|
46
|
-
const accessKeyId =
|
|
47
|
-
process.env.BEDROCK_AWS_ACCESS_KEY_ID ?? process.env.AWS_ACCESS_KEY_ID;
|
|
48
|
-
const secretAccessKey =
|
|
49
|
-
process.env.BEDROCK_AWS_SECRET_ACCESS_KEY ??
|
|
50
|
-
process.env.AWS_SECRET_ACCESS_KEY;
|
|
51
|
-
|
|
52
|
-
const haveBedrock =
|
|
53
|
-
accessKeyId !== undefined &&
|
|
54
|
-
accessKeyId !== '' &&
|
|
55
|
-
secretAccessKey !== undefined &&
|
|
56
|
-
secretAccessKey !== '';
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Build a stable system prompt LARGER than the Bedrock cache write minimum.
|
|
60
|
-
* Anthropic Claude on Bedrock generally needs ≥ 1024 tokens before cache
|
|
61
|
-
* writes are honoured; we pad to ~2k tokens of stable text to be safe.
|
|
62
|
-
*/
|
|
63
|
-
const buildLargeStableInstructions = (): string => {
|
|
64
|
-
const header =
|
|
65
|
-
'You are a helpful assistant working as part of a multi-user platform.';
|
|
66
|
-
const padding = Array.from({ length: 80 }, (_, i) =>
|
|
67
|
-
`Rule ${i + 1}: When responding, prefer concise and accurate answers. Cite assumptions explicitly. Treat all users with respect. Do not hallucinate facts. If unsure, say so.`
|
|
68
|
-
).join('\n');
|
|
69
|
-
return `${header}\n\n${padding}`;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const STABLE_INSTRUCTIONS = buildLargeStableInstructions();
|
|
73
|
-
|
|
74
|
-
const describeFn = haveBedrock ? describe : describe.skip;
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Run one Bedrock call through the real AgentContext + IllumaBedrockConverse
|
|
78
|
-
* pipeline and return the raw usage_metadata so we can read
|
|
79
|
-
* `input_token_details.cache_read` / `cache_creation`.
|
|
80
|
-
*/
|
|
81
|
-
async function runOneTurn({
|
|
82
|
-
agentInstructions,
|
|
83
|
-
additionalInstructions,
|
|
84
|
-
userQuery,
|
|
85
|
-
agentId,
|
|
86
|
-
}: {
|
|
87
|
-
agentInstructions: string;
|
|
88
|
-
additionalInstructions: string;
|
|
89
|
-
userQuery: string;
|
|
90
|
-
agentId: string;
|
|
91
|
-
}): Promise<{
|
|
92
|
-
context: AgentContext;
|
|
93
|
-
usage: {
|
|
94
|
-
input_tokens?: number;
|
|
95
|
-
output_tokens?: number;
|
|
96
|
-
cache_read_input_tokens?: number;
|
|
97
|
-
cache_creation_input_tokens?: number;
|
|
98
|
-
};
|
|
99
|
-
systemPrefixSnapshot: string;
|
|
100
|
-
}> {
|
|
101
|
-
const ctx = AgentContext.fromConfig({
|
|
102
|
-
agentId,
|
|
103
|
-
provider: Providers.BEDROCK,
|
|
104
|
-
instructions: agentInstructions,
|
|
105
|
-
additional_instructions: additionalInstructions,
|
|
106
|
-
clientOptions: {
|
|
107
|
-
promptCache: true,
|
|
108
|
-
model: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
|
|
109
|
-
} as t.BedrockAnthropicClientOptions,
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const runnable = ctx.systemRunnable;
|
|
113
|
-
expect(runnable).toBeDefined();
|
|
114
|
-
|
|
115
|
-
/* Capture the cacheable prefix as a deterministic string snapshot so we
|
|
116
|
-
* can compare two contexts for byte-equality (cache stability rule). */
|
|
117
|
-
const systemArr = (await runnable!.invoke([])) as BaseMessage[];
|
|
118
|
-
const sysContent = systemArr[0].content as Array<Record<string, unknown>>;
|
|
119
|
-
/* Anything up to and including the cachePoint block forms the cache
|
|
120
|
-
* prefix — we serialize that slice for comparison. */
|
|
121
|
-
const cpIdx = sysContent.findIndex((b) => 'cachePoint' in b);
|
|
122
|
-
const prefixForCacheKey = JSON.stringify(
|
|
123
|
-
cpIdx >= 0 ? sysContent.slice(0, cpIdx + 1) : sysContent
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
const userMessages: BaseMessage[] = [new HumanMessage(userQuery)];
|
|
127
|
-
const allMessages = [...systemArr, ...userMessages];
|
|
128
|
-
const finalMessages = addBedrockCacheControl<BaseMessage>(allMessages);
|
|
129
|
-
|
|
130
|
-
/* System message must come through with cachePoint intact. Verify
|
|
131
|
-
* defensively before paying for the API call. */
|
|
132
|
-
const sys = finalMessages[0];
|
|
133
|
-
const sysOut = sys.content as Array<Record<string, unknown>>;
|
|
134
|
-
expect(sysOut.some((b) => 'cachePoint' in b)).toBe(true);
|
|
135
|
-
|
|
136
|
-
const llm = new IllumaBedrockConverse({
|
|
137
|
-
model: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
|
|
138
|
-
region,
|
|
139
|
-
credentials: {
|
|
140
|
-
accessKeyId: accessKeyId as string,
|
|
141
|
-
secretAccessKey: secretAccessKey as string,
|
|
142
|
-
},
|
|
143
|
-
promptCache: true,
|
|
144
|
-
streaming: false,
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
/* Use the non-streaming path so we can read usage metadata directly. */
|
|
148
|
-
const aiMessage = (await llm.invoke(finalMessages)) as AIMessage;
|
|
149
|
-
|
|
150
|
-
type UsageMeta = {
|
|
151
|
-
input_tokens?: number;
|
|
152
|
-
output_tokens?: number;
|
|
153
|
-
cache_read_input_tokens?: number;
|
|
154
|
-
cache_creation_input_tokens?: number;
|
|
155
|
-
input_token_details?: {
|
|
156
|
-
cache_read?: number;
|
|
157
|
-
cache_creation?: number;
|
|
158
|
-
};
|
|
159
|
-
};
|
|
160
|
-
type RespMeta = {
|
|
161
|
-
usage?: {
|
|
162
|
-
inputTokens?: number;
|
|
163
|
-
outputTokens?: number;
|
|
164
|
-
cacheReadInputTokens?: number;
|
|
165
|
-
cacheWriteInputTokens?: number;
|
|
166
|
-
};
|
|
167
|
-
};
|
|
168
|
-
const u = (aiMessage.usage_metadata ?? {}) as UsageMeta;
|
|
169
|
-
const rmUsage = ((aiMessage.response_metadata ?? {}) as RespMeta).usage ?? {};
|
|
170
|
-
|
|
171
|
-
/* LangChain Bedrock currently only surfaces basic input/output tokens in
|
|
172
|
-
* usage_metadata. Cache fields are in response_metadata.usage as
|
|
173
|
-
* cacheReadInputTokens / cacheWriteInputTokens. Read from both. */
|
|
174
|
-
const cache_read_input_tokens =
|
|
175
|
-
u.cache_read_input_tokens ??
|
|
176
|
-
u.input_token_details?.cache_read ??
|
|
177
|
-
rmUsage.cacheReadInputTokens ??
|
|
178
|
-
0;
|
|
179
|
-
const cache_creation_input_tokens =
|
|
180
|
-
u.cache_creation_input_tokens ??
|
|
181
|
-
u.input_token_details?.cache_creation ??
|
|
182
|
-
rmUsage.cacheWriteInputTokens ??
|
|
183
|
-
0;
|
|
184
|
-
|
|
185
|
-
return {
|
|
186
|
-
context: ctx,
|
|
187
|
-
usage: {
|
|
188
|
-
input_tokens: u.input_tokens,
|
|
189
|
-
output_tokens: u.output_tokens,
|
|
190
|
-
cache_read_input_tokens,
|
|
191
|
-
cache_creation_input_tokens,
|
|
192
|
-
},
|
|
193
|
-
systemPrefixSnapshot: prefixForCacheKey,
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
describeFn('LIVE: Bedrock cross-user prompt cache (account-scoped)', () => {
|
|
198
|
-
jest.setTimeout(120000);
|
|
199
|
-
|
|
200
|
-
test('two distinct users with same agent + different memory hit the SAME cache entry', async () => {
|
|
201
|
-
/* Step 1 — user "Alice" makes the first call. Cache is cold so this
|
|
202
|
-
* call writes the cache entry and pays cache_creation_input_tokens. */
|
|
203
|
-
const alice = await runOneTurn({
|
|
204
|
-
agentId: 'shared-agent',
|
|
205
|
-
agentInstructions: STABLE_INSTRUCTIONS,
|
|
206
|
-
additionalInstructions: 'User: Alice. Memories: meetings on Mondays.',
|
|
207
|
-
userQuery: 'Say hi in five words.',
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
console.log('Alice usage:', alice.usage);
|
|
211
|
-
|
|
212
|
-
/* Step 2 — user "Bob" makes the same agent's first call with DIFFERENT
|
|
213
|
-
* dynamic context (different additional_instructions). Bob's stable
|
|
214
|
-
* prefix is byte-identical to Alice's, so Bedrock should serve a cache
|
|
215
|
-
* read for the system prefix even though Bob has never called before. */
|
|
216
|
-
const bob = await runOneTurn({
|
|
217
|
-
agentId: 'shared-agent',
|
|
218
|
-
agentInstructions: STABLE_INSTRUCTIONS,
|
|
219
|
-
additionalInstructions: 'User: Bob. Memories: lives in Berlin.',
|
|
220
|
-
userQuery: 'Say hi in five words.',
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
console.log('Bob usage:', bob.usage);
|
|
224
|
-
|
|
225
|
-
/* CONTRACT 1: stable prefix is byte-identical across the two users.
|
|
226
|
-
* If this fails, the cross-user cache cannot work — the cache key
|
|
227
|
-
* would differ. */
|
|
228
|
-
expect(bob.systemPrefixSnapshot).toBe(alice.systemPrefixSnapshot);
|
|
229
|
-
|
|
230
|
-
/* CONTRACT 2: Bob's stable prefix is served from cache. We accept
|
|
231
|
-
* either cache_read > 0 (the strict assertion) OR a sane fallback if
|
|
232
|
-
* Bedrock cache is in cooldown — in which case we at least require
|
|
233
|
-
* Alice's call wrote one. */
|
|
234
|
-
const aliceWroteCache =
|
|
235
|
-
(alice.usage.cache_creation_input_tokens ?? 0) > 0 ||
|
|
236
|
-
(alice.usage.cache_read_input_tokens ?? 0) > 0;
|
|
237
|
-
const bobReadCache = (bob.usage.cache_read_input_tokens ?? 0) > 0;
|
|
238
|
-
|
|
239
|
-
if (!bobReadCache) {
|
|
240
|
-
console.warn(
|
|
241
|
-
'Bob did not see a cache_read. This usually means: ' +
|
|
242
|
-
'(a) cache write was below Bedrock minimum (try larger STABLE_INSTRUCTIONS), or ' +
|
|
243
|
-
'(b) the cachePoint reached Bedrock without an inference profile that supports caching. ' +
|
|
244
|
-
'Alice cache_creation_input_tokens=' +
|
|
245
|
-
alice.usage.cache_creation_input_tokens
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
expect(aliceWroteCache).toBe(true);
|
|
250
|
-
expect(bobReadCache).toBe(true);
|
|
251
|
-
|
|
252
|
-
/* CONTRACT 3: cost optimization is real. Bob's effective uncached
|
|
253
|
-
* input should be much smaller than Alice's first uncached input,
|
|
254
|
-
* because most of Bob's input was served from cache. */
|
|
255
|
-
const aliceUncached = alice.usage.input_tokens ?? 0;
|
|
256
|
-
const bobCacheRead = bob.usage.cache_read_input_tokens ?? 0;
|
|
257
|
-
expect(bobCacheRead).toBeGreaterThan(aliceUncached / 2);
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
test('5 concurrent users hitting same agent → all read from shared cache entry', async () => {
|
|
261
|
-
/* Simulates 5 concurrent users on the platform, each with their own
|
|
262
|
-
* AgentContext (different agentId, different additional_instructions
|
|
263
|
-
* a.k.a. memory) but identical agent.instructions. They fire requests
|
|
264
|
-
* in parallel via Promise.all — every one of them must read the
|
|
265
|
-
* shared system-prefix cache entry. */
|
|
266
|
-
const distinctUsers = [
|
|
267
|
-
{ id: 'user-1', memory: 'Alice — likes morning meetings.' },
|
|
268
|
-
{ id: 'user-2', memory: 'Bob — based in Berlin.' },
|
|
269
|
-
{ id: 'user-3', memory: 'Carol — works in finance.' },
|
|
270
|
-
{ id: 'user-4', memory: 'Dave — prefers detailed responses.' },
|
|
271
|
-
{ id: 'user-5', memory: 'Eve — uses voice transcription.' },
|
|
272
|
-
];
|
|
273
|
-
|
|
274
|
-
const results = await Promise.all(
|
|
275
|
-
distinctUsers.map((u) =>
|
|
276
|
-
runOneTurn({
|
|
277
|
-
agentId: u.id,
|
|
278
|
-
agentInstructions: STABLE_INSTRUCTIONS,
|
|
279
|
-
additionalInstructions: u.memory,
|
|
280
|
-
userQuery: 'reply with the word "ok"',
|
|
281
|
-
})
|
|
282
|
-
)
|
|
283
|
-
);
|
|
284
|
-
|
|
285
|
-
/* Each user got a usage breakdown — print so we have evidence. */
|
|
286
|
-
results.forEach((r, i) => {
|
|
287
|
-
console.log(
|
|
288
|
-
`Concurrent user ${distinctUsers[i].id}: cache_read=${r.usage.cache_read_input_tokens}, ` +
|
|
289
|
-
`cache_create=${r.usage.cache_creation_input_tokens}, input=${r.usage.input_tokens}`
|
|
290
|
-
);
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
/* Stable prefix must be byte-identical across ALL users — same cache key. */
|
|
294
|
-
const firstSnapshot = results[0].systemPrefixSnapshot;
|
|
295
|
-
for (let i = 1; i < results.length; i++) {
|
|
296
|
-
expect(results[i].systemPrefixSnapshot).toBe(firstSnapshot);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/* At least one user wrote cache OR all users read from a previously
|
|
300
|
-
* populated cache. (Re-running the test rapidly may show all 5 reading
|
|
301
|
-
* the cache from a prior run; first run will show one writing.) */
|
|
302
|
-
const totalReads = results.reduce(
|
|
303
|
-
(acc, r) => acc + (r.usage.cache_read_input_tokens ?? 0),
|
|
304
|
-
0
|
|
305
|
-
);
|
|
306
|
-
const totalWrites = results.reduce(
|
|
307
|
-
(acc, r) => acc + (r.usage.cache_creation_input_tokens ?? 0),
|
|
308
|
-
0
|
|
309
|
-
);
|
|
310
|
-
expect(totalReads + totalWrites).toBeGreaterThan(0);
|
|
311
|
-
|
|
312
|
-
/* Most users should read from cache. With 5 concurrent requests on a
|
|
313
|
-
* cold cache, exactly 1 may write and 4 may read; on a warm cache, 5
|
|
314
|
-
* read. Either way, at least 4 of 5 must show a cache_read. */
|
|
315
|
-
const usersWithCacheRead = results.filter(
|
|
316
|
-
(r) => (r.usage.cache_read_input_tokens ?? 0) > 0
|
|
317
|
-
).length;
|
|
318
|
-
expect(usersWithCacheRead).toBeGreaterThanOrEqual(4);
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
test('byte-identical agent.instructions across runs → cross-run cache hit (single user, two requests)', async () => {
|
|
322
|
-
/* Same user, two requests with same stable prefix and same dynamic
|
|
323
|
-
* context. Second request must read from cache. */
|
|
324
|
-
const r1 = await runOneTurn({
|
|
325
|
-
agentId: 'sticky-agent',
|
|
326
|
-
agentInstructions: STABLE_INSTRUCTIONS,
|
|
327
|
-
additionalInstructions: 'Session 1',
|
|
328
|
-
userQuery: 'one word: hi',
|
|
329
|
-
});
|
|
330
|
-
const r2 = await runOneTurn({
|
|
331
|
-
agentId: 'sticky-agent',
|
|
332
|
-
agentInstructions: STABLE_INSTRUCTIONS,
|
|
333
|
-
additionalInstructions: 'Session 1',
|
|
334
|
-
userQuery: 'one word: bye',
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
console.log('Run1 usage:', r1.usage);
|
|
338
|
-
console.log('Run2 usage:', r2.usage);
|
|
339
|
-
|
|
340
|
-
expect((r2.usage.cache_read_input_tokens ?? 0) > 0).toBe(true);
|
|
341
|
-
});
|
|
342
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type { GoogleAIToolType } from '@langchain/google-common';
|
package/src/langchain/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type { BindToolsInput } from '@langchain/core/language_models/chat_models';
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
AIMessage,
|
|
3
|
-
AIMessageChunk,
|
|
4
|
-
BaseMessage,
|
|
5
|
-
BaseMessageChunk,
|
|
6
|
-
HumanMessage,
|
|
7
|
-
SystemMessage,
|
|
8
|
-
ToolMessage,
|
|
9
|
-
getBufferString,
|
|
10
|
-
isAIMessage,
|
|
11
|
-
isBaseMessage,
|
|
12
|
-
isToolMessage,
|
|
13
|
-
} from '@langchain/core/messages';
|
|
14
|
-
|
|
15
|
-
export type {
|
|
16
|
-
BaseMessageFields,
|
|
17
|
-
MessageContent,
|
|
18
|
-
MessageContentText,
|
|
19
|
-
MessageContentImageUrl,
|
|
20
|
-
UsageMetadata,
|
|
21
|
-
} from '@langchain/core/messages';
|
package/src/langchain/openai.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type { AzureOpenAIInput } from '@langchain/openai';
|
package/src/langchain/prompts.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { PromptTemplate } from '@langchain/core/prompts';
|
package/src/langchain/tools.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { getEnvironmentVariable } from '@langchain/core/utils/env';
|