@strands-agents/sdk 0.5.0 → 0.7.0
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 +64 -0
- package/dist/src/__fixtures__/agent-helpers.d.ts +37 -4
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +31 -4
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/metrics-helpers.d.ts +55 -0
- package/dist/src/__fixtures__/metrics-helpers.d.ts.map +1 -0
- package/dist/src/__fixtures__/metrics-helpers.js +57 -0
- package/dist/src/__fixtures__/metrics-helpers.js.map +1 -0
- package/dist/src/__fixtures__/mock-message-model.d.ts +8 -4
- package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-message-model.js +25 -7
- package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
- package/dist/src/__fixtures__/mock-meter.d.ts +32 -0
- package/dist/src/__fixtures__/mock-meter.d.ts.map +1 -0
- package/dist/src/__fixtures__/mock-meter.js +47 -0
- package/dist/src/__fixtures__/mock-meter.js.map +1 -0
- package/dist/src/__fixtures__/mock-plugin.d.ts +13 -0
- package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -0
- package/dist/src/__fixtures__/{mock-hook-provider.js → mock-plugin.js} +8 -5
- package/dist/src/__fixtures__/mock-plugin.js.map +1 -0
- package/dist/src/__fixtures__/mock-storage-provider.d.ts +5 -0
- package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-storage-provider.js +23 -6
- package/dist/src/__fixtures__/mock-storage-provider.js.map +1 -1
- package/dist/src/__fixtures__/slim-types.d.ts +2 -1
- package/dist/src/__fixtures__/slim-types.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +5 -2
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/__tests__/index.test.js +21 -0
- package/dist/src/__tests__/index.test.js.map +1 -1
- package/dist/src/__tests__/mcp.test.js +45 -15
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/__tests__/mime.test.d.ts +2 -0
- package/dist/src/__tests__/mime.test.d.ts.map +1 -0
- package/dist/src/__tests__/mime.test.js +83 -0
- package/dist/src/__tests__/mime.test.js.map +1 -0
- package/dist/src/__tests__/state-store.test.d.ts +2 -0
- package/dist/src/__tests__/state-store.test.d.ts.map +1 -0
- package/dist/src/__tests__/{app-state.test.js → state-store.test.js} +86 -51
- package/dist/src/__tests__/state-store.test.js.map +1 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.js +364 -0
- package/dist/src/a2a/__tests__/a2a-agent.test.js.map +1 -0
- package/dist/src/a2a/__tests__/adapters.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/adapters.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/adapters.test.js +151 -0
- package/dist/src/a2a/__tests__/adapters.test.js.map +1 -0
- package/dist/src/a2a/__tests__/executor.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/executor.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/executor.test.js +196 -0
- package/dist/src/a2a/__tests__/executor.test.js.map +1 -0
- package/dist/src/a2a/__tests__/server.test.d.ts +2 -0
- package/dist/src/a2a/__tests__/server.test.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/server.test.js +51 -0
- package/dist/src/a2a/__tests__/server.test.js.map +1 -0
- package/dist/src/a2a/__tests__/server.test.node.d.ts +2 -0
- package/dist/src/a2a/__tests__/server.test.node.d.ts.map +1 -0
- package/dist/src/a2a/__tests__/server.test.node.js +110 -0
- package/dist/src/a2a/__tests__/server.test.node.js.map +1 -0
- package/dist/src/a2a/a2a-agent.d.ts +132 -0
- package/dist/src/a2a/a2a-agent.d.ts.map +1 -0
- package/dist/src/a2a/a2a-agent.js +255 -0
- package/dist/src/a2a/a2a-agent.js.map +1 -0
- package/dist/src/a2a/adapters.d.ts +27 -0
- package/dist/src/a2a/adapters.d.ts.map +1 -0
- package/dist/src/a2a/adapters.js +175 -0
- package/dist/src/a2a/adapters.js.map +1 -0
- package/dist/src/a2a/events.d.ts +42 -0
- package/dist/src/a2a/events.d.ts.map +1 -0
- package/dist/src/a2a/events.js +35 -0
- package/dist/src/a2a/events.js.map +1 -0
- package/dist/src/a2a/executor.d.ts +57 -0
- package/dist/src/a2a/executor.d.ts.map +1 -0
- package/dist/src/a2a/executor.js +130 -0
- package/dist/src/a2a/executor.js.map +1 -0
- package/dist/src/a2a/express-server.d.ts +67 -0
- package/dist/src/a2a/express-server.d.ts.map +1 -0
- package/dist/src/a2a/express-server.js +95 -0
- package/dist/src/a2a/express-server.js.map +1 -0
- package/dist/src/a2a/index.d.ts +16 -0
- package/dist/src/a2a/index.d.ts.map +1 -0
- package/dist/src/a2a/index.js +16 -0
- package/dist/src/a2a/index.js.map +1 -0
- package/dist/src/a2a/logging.d.ts +8 -0
- package/dist/src/a2a/logging.d.ts.map +1 -0
- package/dist/src/a2a/logging.js +15 -0
- package/dist/src/a2a/logging.js.map +1 -0
- package/dist/src/a2a/server.d.ts +67 -0
- package/dist/src/a2a/server.d.ts.map +1 -0
- package/dist/src/a2a/server.js +67 -0
- package/dist/src/a2a/server.js.map +1 -0
- package/dist/src/agent/__tests__/agent.hook.test.js +87 -51
- package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.test.js +176 -101
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.tracer.test.js +10 -10
- package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -1
- package/dist/src/agent/__tests__/snapshot.test.js +11 -11
- package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
- package/dist/src/agent/agent.d.ts +71 -58
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +177 -93
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/snapshot.d.ts.map +1 -1
- package/dist/src/agent/snapshot.js +3 -2
- package/dist/src/agent/snapshot.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +100 -0
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +26 -10
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +84 -21
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.d.ts +87 -0
- package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -0
- package/dist/src/conversation-manager/conversation-manager.js +59 -0
- package/dist/src/conversation-manager/conversation-manager.js.map +1 -0
- package/dist/src/conversation-manager/index.d.ts +1 -0
- package/dist/src/conversation-manager/index.d.ts.map +1 -1
- package/dist/src/conversation-manager/index.js +1 -0
- package/dist/src/conversation-manager/index.js.map +1 -1
- package/dist/src/conversation-manager/null-conversation-manager.d.ts +12 -8
- package/dist/src/conversation-manager/null-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/null-conversation-manager.js +13 -7
- package/dist/src/conversation-manager/null-conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +28 -19
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +44 -36
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/errors.d.ts +6 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +9 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/hooks/__tests__/events.test.js +2 -0
- package/dist/src/hooks/__tests__/events.test.js.map +1 -1
- package/dist/src/hooks/__tests__/registry.test.js +10 -154
- package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +60 -44
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js +11 -11
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +4 -4
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +2 -2
- package/dist/src/hooks/registry.d.ts +1 -32
- package/dist/src/hooks/registry.d.ts.map +1 -1
- package/dist/src/hooks/registry.js +1 -47
- package/dist/src/hooks/registry.js.map +1 -1
- package/dist/src/hooks/types.d.ts +0 -31
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +30 -15
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +21 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp.d.ts +38 -0
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +23 -6
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/mime.d.ts +24 -0
- package/dist/src/mime.d.ts.map +1 -0
- package/dist/src/mime.js +82 -0
- package/dist/src/mime.js.map +1 -0
- package/dist/src/models/__tests__/anthropic.test.js +78 -1
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +2050 -131
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/gemini.test.js +100 -1
- package/dist/src/models/__tests__/gemini.test.js.map +1 -1
- package/dist/src/models/__tests__/model.test.js +131 -0
- package/dist/src/models/__tests__/model.test.js.map +1 -1
- package/dist/src/models/__tests__/openai.test.js +184 -32
- package/dist/src/models/__tests__/openai.test.js.map +1 -1
- package/dist/src/models/__tests__/streaming.test.d.ts +2 -0
- package/dist/src/models/__tests__/streaming.test.d.ts.map +1 -0
- package/dist/src/models/__tests__/streaming.test.js +50 -0
- package/dist/src/models/__tests__/streaming.test.js.map +1 -0
- package/dist/src/models/anthropic.d.ts.map +1 -1
- package/dist/src/models/anthropic.js +6 -7
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts +144 -11
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +416 -28
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/gemini/adapters.d.ts.map +1 -1
- package/dist/src/models/gemini/adapters.js +65 -14
- package/dist/src/models/gemini/adapters.js.map +1 -1
- package/dist/src/models/model.d.ts +18 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +57 -11
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/openai.d.ts +15 -0
- package/dist/src/models/openai.d.ts.map +1 -1
- package/dist/src/models/openai.js +108 -64
- package/dist/src/models/openai.js.map +1 -1
- package/dist/src/models/streaming.d.ts +88 -2
- package/dist/src/models/streaming.d.ts.map +1 -1
- package/dist/src/models/streaming.js +26 -0
- package/dist/src/models/streaming.js.map +1 -1
- package/dist/src/multiagent/__tests__/events.test.js +41 -8
- package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/graph.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/graph.test.js +453 -0
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/nodes.test.js +34 -16
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/queue.test.js +22 -0
- package/dist/src/multiagent/__tests__/queue.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/swarm.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/swarm.test.js +264 -0
- package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -0
- package/dist/src/multiagent/edge.d.ts +9 -2
- package/dist/src/multiagent/edge.d.ts.map +1 -1
- package/dist/src/multiagent/events.d.ts +63 -15
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +28 -3
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +135 -0
- package/dist/src/multiagent/graph.d.ts.map +1 -0
- package/dist/src/multiagent/graph.js +400 -0
- package/dist/src/multiagent/graph.js.map +1 -0
- package/dist/src/multiagent/index.d.ts +8 -3
- package/dist/src/multiagent/index.d.ts.map +1 -1
- package/dist/src/multiagent/index.js +3 -1
- package/dist/src/multiagent/index.js.map +1 -1
- package/dist/src/multiagent/multiagent.d.ts +41 -0
- package/dist/src/multiagent/multiagent.d.ts.map +1 -0
- package/dist/src/multiagent/multiagent.js +2 -0
- package/dist/src/multiagent/multiagent.js.map +1 -0
- package/dist/src/multiagent/nodes.d.ts +24 -25
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +42 -15
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/plugins.d.ts +70 -0
- package/dist/src/multiagent/plugins.d.ts.map +1 -0
- package/dist/src/multiagent/plugins.js +70 -0
- package/dist/src/multiagent/plugins.js.map +1 -0
- package/dist/src/multiagent/queue.d.ts +6 -0
- package/dist/src/multiagent/queue.d.ts.map +1 -1
- package/dist/src/multiagent/queue.js +13 -0
- package/dist/src/multiagent/queue.js.map +1 -1
- package/dist/src/multiagent/state.d.ts +4 -2
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js +5 -2
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +112 -0
- package/dist/src/multiagent/swarm.d.ts.map +1 -0
- package/dist/src/multiagent/swarm.js +256 -0
- package/dist/src/multiagent/swarm.js.map +1 -0
- package/dist/src/plugins/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/plugins/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/plugins/__tests__/plugin.test.js +114 -0
- package/dist/src/plugins/__tests__/plugin.test.js.map +1 -0
- package/dist/src/plugins/__tests__/registry.test.d.ts +2 -0
- package/dist/src/plugins/__tests__/registry.test.d.ts.map +1 -0
- package/dist/src/plugins/__tests__/registry.test.js +147 -0
- package/dist/src/plugins/__tests__/registry.test.js.map +1 -0
- package/dist/src/plugins/index.d.ts +30 -0
- package/dist/src/plugins/index.d.ts.map +1 -0
- package/dist/src/plugins/index.js +30 -0
- package/dist/src/plugins/index.js.map +1 -0
- package/dist/src/plugins/plugin.d.ts +74 -0
- package/dist/src/plugins/plugin.d.ts.map +1 -0
- package/dist/src/plugins/plugin.js +8 -0
- package/dist/src/plugins/plugin.js.map +1 -0
- package/dist/src/plugins/registry.d.ts +25 -0
- package/dist/src/plugins/registry.d.ts.map +1 -0
- package/dist/src/plugins/registry.js +41 -0
- package/dist/src/plugins/registry.js.map +1 -0
- package/dist/src/registry/__tests__/tool-registry.test.d.ts +2 -0
- package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +1 -0
- package/dist/src/registry/__tests__/tool-registry.test.js +124 -0
- package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -0
- package/dist/src/registry/tool-registry.d.ts +32 -20
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +60 -158
- package/dist/src/registry/tool-registry.js.map +1 -1
- package/dist/src/session/__tests__/file-storage.test.node.js +75 -15
- package/dist/src/session/__tests__/file-storage.test.node.js.map +1 -1
- package/dist/src/session/__tests__/s3-storage.test.d.ts +2 -0
- package/dist/src/session/__tests__/s3-storage.test.d.ts.map +1 -0
- package/dist/src/session/__tests__/{s3-storage.test.node.js → s3-storage.test.js} +161 -75
- package/dist/src/session/__tests__/s3-storage.test.js.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.d.ts +2 -0
- package/dist/src/session/__tests__/session-manager.test.d.ts.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.js +443 -0
- package/dist/src/session/__tests__/session-manager.test.js.map +1 -0
- package/dist/src/session/__tests__/validation.test.js +28 -1
- package/dist/src/session/__tests__/validation.test.js.map +1 -1
- package/dist/src/session/file-storage.d.ts +53 -27
- package/dist/src/session/file-storage.d.ts.map +1 -1
- package/dist/src/session/file-storage.js +103 -52
- package/dist/src/session/file-storage.js.map +1 -1
- package/dist/src/session/index.d.ts +6 -14
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +4 -13
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/s3-storage.d.ts +49 -20
- package/dist/src/session/s3-storage.d.ts.map +1 -1
- package/dist/src/session/s3-storage.js +120 -35
- package/dist/src/session/s3-storage.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +87 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +128 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/storage.d.ts +20 -12
- package/dist/src/session/storage.d.ts.map +1 -1
- package/dist/src/session/types.d.ts +8 -20
- package/dist/src/session/types.d.ts.map +1 -1
- package/dist/src/session/validation.d.ts +7 -0
- package/dist/src/session/validation.d.ts.map +1 -1
- package/dist/src/session/validation.js +12 -0
- package/dist/src/session/validation.js.map +1 -1
- package/dist/src/{app-state.d.ts → state-store.d.ts} +11 -11
- package/dist/src/state-store.d.ts.map +1 -0
- package/dist/src/{app-state.js → state-store.js} +8 -7
- package/dist/src/state-store.js.map +1 -0
- package/dist/src/structured-output/__tests__/context.test.js +13 -13
- package/dist/src/structured-output/__tests__/context.test.js.map +1 -1
- package/dist/src/structured-output/context.js +1 -1
- package/dist/src/structured-output/context.js.map +1 -1
- package/dist/src/telemetry/__tests__/config.test.d.ts +2 -0
- package/dist/src/telemetry/__tests__/config.test.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.js +64 -0
- package/dist/src/telemetry/__tests__/config.test.js.map +1 -0
- package/dist/src/telemetry/__tests__/config.test.node.js +66 -36
- package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -1
- package/dist/src/telemetry/__tests__/meter.test.d.ts +2 -0
- package/dist/src/telemetry/__tests__/meter.test.d.ts.map +1 -0
- package/dist/src/telemetry/__tests__/meter.test.js +624 -0
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -0
- package/dist/src/telemetry/__tests__/tracer.test.node.js +123 -2
- package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -1
- package/dist/src/telemetry/config.d.ts +104 -23
- package/dist/src/telemetry/config.d.ts.map +1 -1
- package/dist/src/telemetry/config.js +152 -43
- package/dist/src/telemetry/config.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +10 -7
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +9 -6
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/meter.d.ts +296 -0
- package/dist/src/telemetry/meter.d.ts.map +1 -0
- package/dist/src/telemetry/meter.js +365 -0
- package/dist/src/telemetry/meter.js.map +1 -0
- package/dist/src/telemetry/tracer.d.ts +27 -0
- package/dist/src/telemetry/tracer.d.ts.map +1 -1
- package/dist/src/telemetry/tracer.js +79 -4
- package/dist/src/telemetry/tracer.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +2 -0
- package/dist/src/telemetry/types.d.ts.map +1 -1
- package/dist/src/telemetry/utils.d.ts +10 -0
- package/dist/src/telemetry/utils.d.ts.map +1 -0
- package/dist/src/telemetry/utils.js +13 -0
- package/dist/src/telemetry/utils.js.map +1 -0
- package/dist/src/tools/__tests__/tool-factory.test.d.ts +2 -0
- package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +1 -0
- package/dist/src/tools/__tests__/tool-factory.test.js +98 -0
- package/dist/src/tools/__tests__/tool-factory.test.js.map +1 -0
- package/dist/src/tools/__tests__/tool.test.js +22 -1
- package/dist/src/tools/__tests__/tool.test.js.map +1 -1
- package/dist/src/tools/__tests__/zod-tool.test-d.js +1 -1
- package/dist/src/tools/__tests__/zod-tool.test-d.js.map +1 -1
- package/dist/src/tools/__tests__/zod-tool.test.js +3 -4
- package/dist/src/tools/__tests__/zod-tool.test.js.map +1 -1
- package/dist/src/tools/function-tool.d.ts +26 -3
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +88 -3
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/tool-factory.d.ts +22 -0
- package/dist/src/tools/tool-factory.d.ts.map +1 -0
- package/dist/src/tools/tool-factory.js +55 -0
- package/dist/src/tools/tool-factory.js.map +1 -0
- package/dist/src/tools/tool.d.ts +2 -2
- package/dist/src/tools/tool.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.d.ts +55 -52
- package/dist/src/tools/zod-tool.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.js +7 -61
- package/dist/src/tools/zod-tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/agent.test.js +11 -0
- package/dist/src/types/__tests__/agent.test.js.map +1 -1
- package/dist/src/types/__tests__/citations.test.d.ts +2 -0
- package/dist/src/types/__tests__/citations.test.d.ts.map +1 -0
- package/dist/src/types/__tests__/citations.test.js +104 -0
- package/dist/src/types/__tests__/citations.test.js.map +1 -0
- package/dist/src/types/__tests__/media.test.js +22 -16
- package/dist/src/types/__tests__/media.test.js.map +1 -1
- package/dist/src/types/__tests__/messages.test.js +26 -0
- package/dist/src/types/__tests__/messages.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +82 -7
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +9 -0
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/citations.d.ts +180 -0
- package/dist/src/types/citations.d.ts.map +1 -0
- package/dist/src/types/citations.js +45 -0
- package/dist/src/types/citations.js.map +1 -0
- package/dist/src/types/media.d.ts +27 -30
- package/dist/src/types/media.d.ts.map +1 -1
- package/dist/src/types/media.js +15 -56
- package/dist/src/types/media.js.map +1 -1
- package/dist/src/types/messages.d.ts +23 -5
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +26 -26
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/types/serializable.d.ts +34 -4
- package/dist/src/types/serializable.d.ts.map +1 -1
- package/dist/src/types/serializable.js +31 -2
- package/dist/src/types/serializable.js.map +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +5 -4
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
- package/dist/src/vended-tools/bash/bash.js +1 -2
- package/dist/src/vended-tools/bash/bash.js.map +1 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +1 -0
- package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.js +11 -4
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -0
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts +1 -1
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts.map +1 -1
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js +3 -3
- package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js.map +1 -1
- package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts.map +1 -1
- package/dist/src/vended-tools/file-editor/index.js.map +1 -0
- package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts.map +1 -1
- package/dist/src/vended-tools/file-editor/types.js.map +1 -0
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +1 -0
- package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js.map +1 -1
- package/dist/src/vended-tools/http-request/http-request.d.ts.map +1 -0
- package/dist/src/vended-tools/{http_request → http-request}/http-request.js +1 -2
- package/dist/src/vended-tools/http-request/http-request.js.map +1 -0
- package/dist/src/vended-tools/{http_request → http-request}/index.d.ts.map +1 -1
- package/dist/src/vended-tools/http-request/index.js.map +1 -0
- package/dist/src/vended-tools/{http_request → http-request}/types.d.ts.map +1 -1
- package/dist/src/vended-tools/http-request/types.js.map +1 -0
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +5 -4
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
- package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
- package/dist/src/vended-tools/notebook/notebook.js +2 -2
- package/dist/src/vended-tools/notebook/notebook.js.map +1 -1
- package/package.json +66 -12
- package/dist/src/__fixtures__/mock-hook-provider.d.ts +0 -10
- package/dist/src/__fixtures__/mock-hook-provider.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-hook-provider.js.map +0 -1
- package/dist/src/__tests__/app-state.test.d.ts +0 -2
- package/dist/src/__tests__/app-state.test.d.ts.map +0 -1
- package/dist/src/__tests__/app-state.test.js.map +0 -1
- package/dist/src/app-state.d.ts.map +0 -1
- package/dist/src/app-state.js.map +0 -1
- package/dist/src/multiagent/base.d.ts +0 -25
- package/dist/src/multiagent/base.d.ts.map +0 -1
- package/dist/src/multiagent/base.js +0 -2
- package/dist/src/multiagent/base.js.map +0 -1
- package/dist/src/registry/registry.d.ts +0 -117
- package/dist/src/registry/registry.d.ts.map +0 -1
- package/dist/src/registry/registry.js +0 -298
- package/dist/src/registry/registry.js.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.node.d.ts +0 -2
- package/dist/src/session/__tests__/s3-storage.test.node.d.ts.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.node.js.map +0 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts.map +0 -1
- package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +0 -1
- package/dist/src/vended-tools/file_editor/index.js.map +0 -1
- package/dist/src/vended-tools/file_editor/types.js.map +0 -1
- package/dist/src/vended-tools/http_request/__tests__/http-request.test.d.ts.map +0 -1
- package/dist/src/vended-tools/http_request/http-request.d.ts.map +0 -1
- package/dist/src/vended-tools/http_request/http-request.js.map +0 -1
- package/dist/src/vended-tools/http_request/index.js.map +0 -1
- package/dist/src/vended-tools/http_request/types.js.map +0 -1
- /package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.d.ts +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/index.js +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts +0 -0
- /package/dist/src/vended-tools/{file_editor → file-editor}/types.js +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/http-request.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/index.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/index.js +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/types.d.ts +0 -0
- /package/dist/src/vended-tools/{http_request → http-request}/types.js +0 -0
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html
|
|
8
8
|
*/
|
|
9
|
-
import { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, DocumentFormat, ImageFormat, } from '@aws-sdk/client-bedrock-runtime';
|
|
9
|
+
import { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, DocumentFormat, ImageFormat, VideoFormat, } from '@aws-sdk/client-bedrock-runtime';
|
|
10
10
|
import { Model } from '../models/model.js';
|
|
11
11
|
import { ContextWindowOverflowError, ModelThrottledError, normalizeError } from '../errors.js';
|
|
12
12
|
import { ensureDefined } from '../types/validation.js';
|
|
@@ -24,6 +24,12 @@ const DEFAULT_BEDROCK_REGION_SUPPORTS_FIP = false;
|
|
|
24
24
|
* @see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ToolResultBlock.html
|
|
25
25
|
*/
|
|
26
26
|
const MODELS_INCLUDE_STATUS = ['anthropic.claude'];
|
|
27
|
+
/**
|
|
28
|
+
* Models that support the Anthropic-style prompt caching strategy.
|
|
29
|
+
* Used to auto-detect when `cacheConfig.strategy` is `'auto'`.
|
|
30
|
+
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html
|
|
31
|
+
*/
|
|
32
|
+
const MODELS_SUPPORTING_ANTHROPIC_CACHING = ['anthropic', 'claude'];
|
|
27
33
|
/**
|
|
28
34
|
* Error messages that indicate context window overflow.
|
|
29
35
|
* Used to detect when input exceeds the model's context window.
|
|
@@ -44,6 +50,14 @@ const STOP_REASON_MAP = {
|
|
|
44
50
|
content_filtered: 'contentFiltered',
|
|
45
51
|
guardrail_intervened: 'guardrailIntervened',
|
|
46
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* Default message for redacted input.
|
|
55
|
+
*/
|
|
56
|
+
const DEFAULT_REDACT_INPUT_MESSAGE = '[User input redacted.]';
|
|
57
|
+
/**
|
|
58
|
+
* Default message for redacted output.
|
|
59
|
+
*/
|
|
60
|
+
const DEFAULT_REDACT_OUTPUT_MESSAGE = '[Assistant output redacted.]';
|
|
47
61
|
/**
|
|
48
62
|
* Converts a snake_case string to camelCase.
|
|
49
63
|
* Used for mapping unknown stop reasons from Bedrock to SDK format.
|
|
@@ -105,7 +119,7 @@ export class BedrockModel extends Model {
|
|
|
105
119
|
* modelId: 'global.anthropic.claude-sonnet-4-5-20250929-v1:0',
|
|
106
120
|
* maxTokens: 2048,
|
|
107
121
|
* temperature: 0.8,
|
|
108
|
-
*
|
|
122
|
+
* cacheConfig: { strategy: 'auto' }
|
|
109
123
|
* })
|
|
110
124
|
*
|
|
111
125
|
* // With client configuration
|
|
@@ -141,6 +155,41 @@ export class BedrockModel extends Model {
|
|
|
141
155
|
}
|
|
142
156
|
applyDefaultRegion(this._client.config);
|
|
143
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Returns the cache strategy for this model based on its model ID.
|
|
160
|
+
* Returns the appropriate cache strategy name, or null if automatic caching is not supported.
|
|
161
|
+
*
|
|
162
|
+
* @returns Cache strategy name or null
|
|
163
|
+
*/
|
|
164
|
+
_getCacheStrategy() {
|
|
165
|
+
return MODELS_SUPPORTING_ANTHROPIC_CACHING.some((pattern) => this._config.modelId?.includes(pattern))
|
|
166
|
+
? 'anthropic'
|
|
167
|
+
: null;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Determines if caching should be enabled.
|
|
171
|
+
* Returns true when:
|
|
172
|
+
* - strategy is 'anthropic' (explicit enable)
|
|
173
|
+
* - strategy is 'auto' and model supports caching (auto-detect)
|
|
174
|
+
*
|
|
175
|
+
* @returns True if caching should be enabled
|
|
176
|
+
*/
|
|
177
|
+
_shouldEnableCaching() {
|
|
178
|
+
const cacheConfig = this._config.cacheConfig;
|
|
179
|
+
if (!cacheConfig) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
let strategy = cacheConfig.strategy;
|
|
183
|
+
if (strategy === 'auto') {
|
|
184
|
+
const detectedStrategy = this._getCacheStrategy();
|
|
185
|
+
if (!detectedStrategy) {
|
|
186
|
+
logger.warn(`model_id=<${this._config.modelId}> | cache_config is enabled but this model does not support automatic caching`);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
strategy = detectedStrategy;
|
|
190
|
+
}
|
|
191
|
+
return strategy === 'anthropic';
|
|
192
|
+
}
|
|
144
193
|
/**
|
|
145
194
|
* Updates the model configuration.
|
|
146
195
|
* Merges the provided configuration with existing settings.
|
|
@@ -212,10 +261,12 @@ export class BedrockModel extends Model {
|
|
|
212
261
|
const response = await this._client.send(command);
|
|
213
262
|
// Stream the response
|
|
214
263
|
if (response.stream) {
|
|
264
|
+
let lastStopReason;
|
|
215
265
|
for await (const chunk of response.stream) {
|
|
216
266
|
// Map Bedrock events to SDK events
|
|
217
|
-
const
|
|
218
|
-
|
|
267
|
+
const result = this._mapStreamedBedrockEventToSDKEvent(chunk, lastStopReason);
|
|
268
|
+
lastStopReason = result.stopReason;
|
|
269
|
+
for (const event of result.events) {
|
|
219
270
|
yield event;
|
|
220
271
|
}
|
|
221
272
|
}
|
|
@@ -251,21 +302,12 @@ export class BedrockModel extends Model {
|
|
|
251
302
|
modelId: this._config.modelId,
|
|
252
303
|
messages: this._formatMessages(messages),
|
|
253
304
|
};
|
|
254
|
-
// Add system prompt
|
|
305
|
+
// Add system prompt
|
|
255
306
|
if (options?.systemPrompt !== undefined) {
|
|
256
307
|
if (typeof options.systemPrompt === 'string') {
|
|
257
|
-
|
|
258
|
-
const system = [{ text: options.systemPrompt }];
|
|
259
|
-
if (this._config.cachePrompt) {
|
|
260
|
-
system.push({ cachePoint: { type: this._config.cachePrompt } });
|
|
261
|
-
}
|
|
262
|
-
request.system = system;
|
|
308
|
+
request.system = [{ text: options.systemPrompt }];
|
|
263
309
|
}
|
|
264
310
|
else if (options.systemPrompt.length > 0) {
|
|
265
|
-
// Array path: use as-is, but warn if cachePrompt config is also set
|
|
266
|
-
if (this._config.cachePrompt) {
|
|
267
|
-
logger.warn('cachePrompt config is ignored when systemPrompt is an array, use explicit cache points instead');
|
|
268
|
-
}
|
|
269
311
|
request.system = options.systemPrompt.map((block) => this._formatContentBlock(block));
|
|
270
312
|
}
|
|
271
313
|
}
|
|
@@ -278,10 +320,8 @@ export class BedrockModel extends Model {
|
|
|
278
320
|
inputSchema: { json: spec.inputSchema },
|
|
279
321
|
},
|
|
280
322
|
}));
|
|
281
|
-
if (this.
|
|
282
|
-
tools.push({
|
|
283
|
-
cachePoint: { type: this._config.cacheTools },
|
|
284
|
-
});
|
|
323
|
+
if (this._shouldEnableCaching()) {
|
|
324
|
+
tools.push({ cachePoint: { type: 'default' } });
|
|
285
325
|
}
|
|
286
326
|
const toolConfig = {
|
|
287
327
|
tools: tools,
|
|
@@ -316,6 +356,17 @@ export class BedrockModel extends Model {
|
|
|
316
356
|
if (this._config.additionalArgs) {
|
|
317
357
|
Object.assign(request, this._config.additionalArgs);
|
|
318
358
|
}
|
|
359
|
+
// Add guardrail configuration
|
|
360
|
+
if (this._config.guardrailConfig) {
|
|
361
|
+
request.guardrailConfig = {
|
|
362
|
+
guardrailIdentifier: this._config.guardrailConfig.guardrailIdentifier,
|
|
363
|
+
guardrailVersion: this._config.guardrailConfig.guardrailVersion,
|
|
364
|
+
trace: this._config.guardrailConfig.trace ?? 'enabled',
|
|
365
|
+
...(this._config.guardrailConfig.streamProcessingMode && {
|
|
366
|
+
streamProcessingMode: this._config.guardrailConfig.streamProcessingMode,
|
|
367
|
+
}),
|
|
368
|
+
};
|
|
369
|
+
}
|
|
319
370
|
return request;
|
|
320
371
|
}
|
|
321
372
|
/**
|
|
@@ -325,15 +376,140 @@ export class BedrockModel extends Model {
|
|
|
325
376
|
* @returns Bedrock-formatted messages
|
|
326
377
|
*/
|
|
327
378
|
_formatMessages(messages) {
|
|
328
|
-
|
|
379
|
+
// Pre-compute the index of the last user message containing text/image content
|
|
380
|
+
// This ensures guardContent wrapping is maintained across tool execution cycles
|
|
381
|
+
const lastUserTextIdx = this._config.guardrailConfig?.guardLatestUserMessage
|
|
382
|
+
? this._findLastUserTextMessageIndex(messages)
|
|
383
|
+
: undefined;
|
|
384
|
+
const formattedMessages = messages.reduce((acc, message, idx) => {
|
|
385
|
+
const shouldApplyGuardBlocks = idx === lastUserTextIdx;
|
|
329
386
|
const content = message.content
|
|
330
|
-
.map((block) =>
|
|
387
|
+
.map((block) => {
|
|
388
|
+
const formattedBlock = this._formatContentBlock(block);
|
|
389
|
+
return shouldApplyGuardBlocks ? this._applyGuardBlocks(formattedBlock) : formattedBlock;
|
|
390
|
+
})
|
|
331
391
|
.filter((block) => block !== undefined);
|
|
332
392
|
if (content.length > 0) {
|
|
333
393
|
acc.push({ role: message.role, content });
|
|
334
394
|
}
|
|
335
395
|
return acc;
|
|
336
396
|
}, []);
|
|
397
|
+
// Inject cache point if caching is enabled
|
|
398
|
+
if (this._shouldEnableCaching()) {
|
|
399
|
+
this._injectCachePoint(formattedMessages);
|
|
400
|
+
}
|
|
401
|
+
return formattedMessages;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Inject a cache point at the end of the last user message.
|
|
405
|
+
* Strips any existing cache points from all messages first.
|
|
406
|
+
*
|
|
407
|
+
* @param messages - List of messages to inject cache point into (modified in place)
|
|
408
|
+
*/
|
|
409
|
+
_injectCachePoint(messages) {
|
|
410
|
+
if (messages.length === 0) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
let lastUserIdx = null;
|
|
414
|
+
// Strip existing cache points and find last user message
|
|
415
|
+
for (let msgIdx = 0; msgIdx < messages.length; msgIdx++) {
|
|
416
|
+
const msg = messages[msgIdx];
|
|
417
|
+
if (!msg)
|
|
418
|
+
continue;
|
|
419
|
+
const content = msg.content ?? [];
|
|
420
|
+
for (let blockIdx = content.length - 1; blockIdx >= 0; blockIdx--) {
|
|
421
|
+
const block = content[blockIdx];
|
|
422
|
+
if (block && 'cachePoint' in block) {
|
|
423
|
+
content.splice(blockIdx, 1);
|
|
424
|
+
logger.warn(`msg_idx=<${msgIdx}>, block_idx=<${blockIdx}> | stripped existing cache point (auto mode manages cache points)`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
if (msg.role === 'user') {
|
|
428
|
+
lastUserIdx = msgIdx;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// Add cache point to last user message
|
|
432
|
+
if (lastUserIdx !== null) {
|
|
433
|
+
const lastMsg = messages[lastUserIdx];
|
|
434
|
+
if (lastMsg && lastMsg.content) {
|
|
435
|
+
lastMsg.content.push({ cachePoint: { type: 'default' } });
|
|
436
|
+
logger.debug(`msg_idx=<${lastUserIdx}> | added cache point to last user message`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Wraps a formatted content block in guardContent for guardrail evaluation.
|
|
442
|
+
*
|
|
443
|
+
* When guardLatestUserMessage is enabled, this method wraps text and image blocks
|
|
444
|
+
* in guardContent blocks to signal to Bedrock's guardrails to evaluate only that content.
|
|
445
|
+
* Other content types (toolUse, toolResult, etc.) pass through unchanged.
|
|
446
|
+
*
|
|
447
|
+
* @param formattedBlock - The formatted content block to potentially wrap
|
|
448
|
+
* @returns The block wrapped in guardContent if applicable, or the original block
|
|
449
|
+
*/
|
|
450
|
+
_applyGuardBlocks(formattedBlock) {
|
|
451
|
+
if (formattedBlock === undefined) {
|
|
452
|
+
return undefined;
|
|
453
|
+
}
|
|
454
|
+
if ('text' in formattedBlock) {
|
|
455
|
+
return {
|
|
456
|
+
guardContent: {
|
|
457
|
+
text: {
|
|
458
|
+
text: formattedBlock.text,
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
if ('image' in formattedBlock) {
|
|
464
|
+
// Extract image data and validate for guardContent compatibility
|
|
465
|
+
const imageBlock = formattedBlock.image;
|
|
466
|
+
if (!imageBlock?.format || !imageBlock?.source) {
|
|
467
|
+
return formattedBlock;
|
|
468
|
+
}
|
|
469
|
+
const format = imageBlock.format;
|
|
470
|
+
// Bedrock guardrails only support png/jpeg formats
|
|
471
|
+
if (format !== 'png' && format !== 'jpeg') {
|
|
472
|
+
console.warn(`Image format '${format}' not supported by Bedrock guardrails, skipping guardContent wrap`);
|
|
473
|
+
return formattedBlock;
|
|
474
|
+
}
|
|
475
|
+
// Bedrock guardrails only support bytes source (not S3 or URL)
|
|
476
|
+
if (!('bytes' in imageBlock.source)) {
|
|
477
|
+
console.warn('Image source must be bytes for Bedrock guardrails, skipping guardContent wrap');
|
|
478
|
+
return formattedBlock;
|
|
479
|
+
}
|
|
480
|
+
return {
|
|
481
|
+
guardContent: {
|
|
482
|
+
image: {
|
|
483
|
+
format: format,
|
|
484
|
+
source: imageBlock.source,
|
|
485
|
+
},
|
|
486
|
+
},
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
// Other content types (toolUse, toolResult, etc.) pass through unchanged
|
|
490
|
+
return formattedBlock;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Find the index of the last user message containing text or image content.
|
|
494
|
+
*
|
|
495
|
+
* This is used for guardLatestUserMessage guardrail evaluation to ensure that guardContent
|
|
496
|
+
* wrapping targets the correct message even when toolResult messages (role='user') follow
|
|
497
|
+
* the actual user text/image input during tool execution cycles.
|
|
498
|
+
*
|
|
499
|
+
* @param messages - Array of messages to search
|
|
500
|
+
* @returns Index of the last user message with text/image content, or undefined if not found
|
|
501
|
+
*/
|
|
502
|
+
_findLastUserTextMessageIndex(messages) {
|
|
503
|
+
for (let idx = messages.length - 1; idx >= 0; idx--) {
|
|
504
|
+
const msg = messages[idx];
|
|
505
|
+
if (msg === undefined)
|
|
506
|
+
continue;
|
|
507
|
+
if (msg.role === 'user' &&
|
|
508
|
+
msg.content.some((block) => block.type === 'textBlock' || block.type === 'imageBlock')) {
|
|
509
|
+
return idx;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return undefined;
|
|
337
513
|
}
|
|
338
514
|
/**
|
|
339
515
|
* Determines whether to include the status field in tool results.
|
|
@@ -382,6 +558,30 @@ export class BedrockModel extends Model {
|
|
|
382
558
|
return { text: content.text };
|
|
383
559
|
case 'jsonBlock':
|
|
384
560
|
return { json: content.json };
|
|
561
|
+
case 'imageBlock':
|
|
562
|
+
return {
|
|
563
|
+
image: {
|
|
564
|
+
format: content.format,
|
|
565
|
+
source: this._formatMediaSource(content.source),
|
|
566
|
+
},
|
|
567
|
+
};
|
|
568
|
+
case 'videoBlock':
|
|
569
|
+
return {
|
|
570
|
+
video: {
|
|
571
|
+
format: content.format === '3gp' ? 'three_gp' : content.format,
|
|
572
|
+
source: this._formatMediaSource(content.source),
|
|
573
|
+
},
|
|
574
|
+
};
|
|
575
|
+
case 'documentBlock':
|
|
576
|
+
return {
|
|
577
|
+
document: {
|
|
578
|
+
name: content.name,
|
|
579
|
+
format: content.format,
|
|
580
|
+
source: this._formatDocumentSource(content.source),
|
|
581
|
+
...(content.citations && { citations: content.citations }),
|
|
582
|
+
...(content.context && { context: content.context }),
|
|
583
|
+
},
|
|
584
|
+
};
|
|
385
585
|
}
|
|
386
586
|
});
|
|
387
587
|
return {
|
|
@@ -440,6 +640,13 @@ export class BedrockModel extends Model {
|
|
|
440
640
|
...(block.context && { context: block.context }),
|
|
441
641
|
},
|
|
442
642
|
};
|
|
643
|
+
case 'citationsBlock':
|
|
644
|
+
return {
|
|
645
|
+
citationsContent: {
|
|
646
|
+
citations: block.citations.map((c) => this._mapCitationToBedrock(c)),
|
|
647
|
+
content: block.content,
|
|
648
|
+
},
|
|
649
|
+
};
|
|
443
650
|
case 'guardContentBlock': {
|
|
444
651
|
if (block.text) {
|
|
445
652
|
return {
|
|
@@ -494,8 +701,8 @@ export class BedrockModel extends Model {
|
|
|
494
701
|
case 'videoSourceS3Location':
|
|
495
702
|
return {
|
|
496
703
|
s3Location: {
|
|
497
|
-
uri: source.
|
|
498
|
-
...(source.
|
|
704
|
+
uri: source.location.uri,
|
|
705
|
+
...(source.location.bucketOwner && { bucketOwner: source.location.bucketOwner }),
|
|
499
706
|
},
|
|
500
707
|
};
|
|
501
708
|
default:
|
|
@@ -530,8 +737,8 @@ export class BedrockModel extends Model {
|
|
|
530
737
|
case 'documentSourceS3Location':
|
|
531
738
|
return {
|
|
532
739
|
s3Location: {
|
|
533
|
-
uri: source.
|
|
534
|
-
...(source.
|
|
740
|
+
uri: source.location.uri,
|
|
741
|
+
...(source.location.bucketOwner && { bucketOwner: source.location.bucketOwner }),
|
|
535
742
|
},
|
|
536
743
|
};
|
|
537
744
|
default:
|
|
@@ -591,6 +798,19 @@ export class BedrockModel extends Model {
|
|
|
591
798
|
}
|
|
592
799
|
events.push({ type: 'modelContentBlockStopEvent' });
|
|
593
800
|
},
|
|
801
|
+
citationsContent: (block) => {
|
|
802
|
+
if (!block)
|
|
803
|
+
return;
|
|
804
|
+
events.push({ type: 'modelContentBlockStartEvent' });
|
|
805
|
+
const mapped = this._mapBedrockCitationsData(block);
|
|
806
|
+
const delta = {
|
|
807
|
+
type: 'citationsDelta',
|
|
808
|
+
citations: mapped.citations,
|
|
809
|
+
content: mapped.content,
|
|
810
|
+
};
|
|
811
|
+
events.push({ type: 'modelContentBlockDeltaEvent', delta });
|
|
812
|
+
events.push({ type: 'modelContentBlockStopEvent' });
|
|
813
|
+
},
|
|
594
814
|
};
|
|
595
815
|
const content = ensureDefined(message.content, 'message.content');
|
|
596
816
|
content.forEach((block) => {
|
|
@@ -624,6 +844,16 @@ export class BedrockModel extends Model {
|
|
|
624
844
|
latencyMs: ensureDefined(event.metrics.latencyMs, 'metrics.latencyMs'),
|
|
625
845
|
};
|
|
626
846
|
}
|
|
847
|
+
// Handle trace and guardrail check for non-streaming responses
|
|
848
|
+
if (event.trace) {
|
|
849
|
+
metadataEvent.trace = event.trace;
|
|
850
|
+
// Check for blocked guardrails and emit redaction events
|
|
851
|
+
if (this._config.guardrailConfig && event.trace.guardrail && stopReasonRaw === 'guardrail_intervened') {
|
|
852
|
+
for (const redactionEvent of this._generateRedactionEvents(event.trace.guardrail)) {
|
|
853
|
+
events.push(redactionEvent);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
}
|
|
627
857
|
events.push(metadataEvent);
|
|
628
858
|
return events;
|
|
629
859
|
}
|
|
@@ -631,10 +861,12 @@ export class BedrockModel extends Model {
|
|
|
631
861
|
* Maps a Bedrock event to SDK streaming events.
|
|
632
862
|
*
|
|
633
863
|
* @param chunk - Bedrock event chunk
|
|
634
|
-
* @
|
|
864
|
+
* @param lastStopReason - Stop reason from previous messageStop event
|
|
865
|
+
* @returns Object containing events array and optional stopReason
|
|
635
866
|
*/
|
|
636
|
-
_mapStreamedBedrockEventToSDKEvent(chunk) {
|
|
867
|
+
_mapStreamedBedrockEventToSDKEvent(chunk, lastStopReason) {
|
|
637
868
|
const events = [];
|
|
869
|
+
let stopReason = lastStopReason;
|
|
638
870
|
// Extract the event type key
|
|
639
871
|
const eventType = ensureDefined(Object.keys(chunk)[0], 'eventType');
|
|
640
872
|
const eventData = chunk[eventType];
|
|
@@ -695,6 +927,17 @@ export class BedrockModel extends Model {
|
|
|
695
927
|
events.push({ type: 'modelContentBlockDeltaEvent', delta: reasoningDelta });
|
|
696
928
|
}
|
|
697
929
|
},
|
|
930
|
+
citationsContent: (block) => {
|
|
931
|
+
if (!block)
|
|
932
|
+
return;
|
|
933
|
+
const mapped = this._mapBedrockCitationsData(block);
|
|
934
|
+
const delta = {
|
|
935
|
+
type: 'citationsDelta',
|
|
936
|
+
citations: mapped.citations,
|
|
937
|
+
content: mapped.content,
|
|
938
|
+
};
|
|
939
|
+
events.push({ type: 'modelContentBlockDeltaEvent', delta });
|
|
940
|
+
},
|
|
698
941
|
};
|
|
699
942
|
for (const key in delta) {
|
|
700
943
|
if (key in deltaHandlers) {
|
|
@@ -717,6 +960,7 @@ export class BedrockModel extends Model {
|
|
|
717
960
|
case 'messageStop': {
|
|
718
961
|
const data = eventData;
|
|
719
962
|
const stopReasonRaw = ensureDefined(data.stopReason, 'messageStop.stopReason');
|
|
963
|
+
stopReason = stopReasonRaw;
|
|
720
964
|
const event = {
|
|
721
965
|
type: 'modelMessageStopEvent',
|
|
722
966
|
stopReason: this._transformStopReason(stopReasonRaw, data),
|
|
@@ -754,6 +998,12 @@ export class BedrockModel extends Model {
|
|
|
754
998
|
}
|
|
755
999
|
if (data.trace) {
|
|
756
1000
|
event.trace = data.trace;
|
|
1001
|
+
// Check for blocked guardrails in trace and emit redaction events
|
|
1002
|
+
if (this._config.guardrailConfig && data.trace.guardrail && lastStopReason === 'guardrail_intervened') {
|
|
1003
|
+
for (const redactionEvent of this._generateRedactionEvents(data.trace.guardrail)) {
|
|
1004
|
+
events.push(redactionEvent);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
757
1007
|
}
|
|
758
1008
|
events.push(event);
|
|
759
1009
|
break;
|
|
@@ -774,7 +1024,7 @@ export class BedrockModel extends Model {
|
|
|
774
1024
|
logger.warn(`event_type=<${eventType}> | unsupported bedrock event type`);
|
|
775
1025
|
break;
|
|
776
1026
|
}
|
|
777
|
-
return events;
|
|
1027
|
+
return stopReason !== undefined ? { events, stopReason } : { events };
|
|
778
1028
|
}
|
|
779
1029
|
/**
|
|
780
1030
|
* Transforms a Bedrock stop reason into the SDK's format.
|
|
@@ -803,6 +1053,144 @@ export class BedrockModel extends Model {
|
|
|
803
1053
|
}
|
|
804
1054
|
return mappedStopReason;
|
|
805
1055
|
}
|
|
1056
|
+
/**
|
|
1057
|
+
* Maps a Bedrock object-key citation location to the SDK's type-field format.
|
|
1058
|
+
*
|
|
1059
|
+
* Bedrock uses object-key discrimination (`{ documentChar: { ... } }`) while the SDK uses
|
|
1060
|
+
* type-field discrimination (`{ type: 'documentChar', ... }`). Also normalizes Bedrock's
|
|
1061
|
+
* `searchResultLocation` key to the shorter `searchResult`.
|
|
1062
|
+
*
|
|
1063
|
+
* @param bedrockLocation - Bedrock citation location with object-key discrimination
|
|
1064
|
+
* @returns SDK CitationLocation with type field discrimination
|
|
1065
|
+
*/
|
|
1066
|
+
_mapBedrockCitationLocation(bedrockLocation) {
|
|
1067
|
+
if (bedrockLocation.documentChar) {
|
|
1068
|
+
const loc = bedrockLocation.documentChar;
|
|
1069
|
+
return { type: 'documentChar', documentIndex: loc.documentIndex, start: loc.start, end: loc.end };
|
|
1070
|
+
}
|
|
1071
|
+
if (bedrockLocation.documentPage) {
|
|
1072
|
+
const loc = bedrockLocation.documentPage;
|
|
1073
|
+
return { type: 'documentPage', documentIndex: loc.documentIndex, start: loc.start, end: loc.end };
|
|
1074
|
+
}
|
|
1075
|
+
if (bedrockLocation.documentChunk) {
|
|
1076
|
+
const loc = bedrockLocation.documentChunk;
|
|
1077
|
+
return { type: 'documentChunk', documentIndex: loc.documentIndex, start: loc.start, end: loc.end };
|
|
1078
|
+
}
|
|
1079
|
+
if (bedrockLocation.searchResultLocation) {
|
|
1080
|
+
const loc = bedrockLocation.searchResultLocation;
|
|
1081
|
+
return { type: 'searchResult', searchResultIndex: loc.searchResultIndex, start: loc.start, end: loc.end };
|
|
1082
|
+
}
|
|
1083
|
+
if (bedrockLocation.web) {
|
|
1084
|
+
const loc = bedrockLocation.web;
|
|
1085
|
+
return { type: 'web', url: loc.url, ...(loc.domain && { domain: loc.domain }) };
|
|
1086
|
+
}
|
|
1087
|
+
logger.warn(`citation_location=<${JSON.stringify(bedrockLocation)}> | unknown citation location type`);
|
|
1088
|
+
return undefined;
|
|
1089
|
+
}
|
|
1090
|
+
/**
|
|
1091
|
+
* Maps a Bedrock CitationsContentBlock to SDK CitationsBlockData.
|
|
1092
|
+
*
|
|
1093
|
+
* @param bedrockData - Bedrock CitationsContentBlock
|
|
1094
|
+
* @returns SDK CitationsBlockData with type-field CitationLocations
|
|
1095
|
+
*/
|
|
1096
|
+
_mapBedrockCitationsData(bedrockData) {
|
|
1097
|
+
return {
|
|
1098
|
+
citations: (bedrockData.citations ?? [])
|
|
1099
|
+
.map((citation) => {
|
|
1100
|
+
const location = citation.location ? this._mapBedrockCitationLocation(citation.location) : undefined;
|
|
1101
|
+
if (!location)
|
|
1102
|
+
return undefined;
|
|
1103
|
+
return {
|
|
1104
|
+
source: citation.source ?? '',
|
|
1105
|
+
title: citation.title ?? '',
|
|
1106
|
+
sourceContent: (citation.sourceContent ?? []).map((sc) => ({ text: sc.text })),
|
|
1107
|
+
location,
|
|
1108
|
+
};
|
|
1109
|
+
})
|
|
1110
|
+
.filter((c) => c !== undefined),
|
|
1111
|
+
content: (bedrockData.content ?? []).map((gc) => ({ text: gc.text })),
|
|
1112
|
+
};
|
|
1113
|
+
}
|
|
1114
|
+
/**
|
|
1115
|
+
* Maps an SDK Citation to Bedrock's Citation format.
|
|
1116
|
+
*
|
|
1117
|
+
* @param citation - SDK Citation with type-field location
|
|
1118
|
+
* @returns Bedrock Citation with object-key location
|
|
1119
|
+
*/
|
|
1120
|
+
_mapCitationToBedrock(citation) {
|
|
1121
|
+
return {
|
|
1122
|
+
location: this._mapCitationLocationToBedrock(citation.location),
|
|
1123
|
+
sourceContent: citation.sourceContent.map((sc) => ({ text: sc.text })),
|
|
1124
|
+
source: citation.source,
|
|
1125
|
+
title: citation.title,
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
/**
|
|
1129
|
+
* Maps an SDK CitationLocation to Bedrock's object-key format.
|
|
1130
|
+
*
|
|
1131
|
+
* @param location - SDK CitationLocation with type field
|
|
1132
|
+
* @returns Bedrock CitationLocation with object-key discrimination
|
|
1133
|
+
*/
|
|
1134
|
+
_mapCitationLocationToBedrock(location) {
|
|
1135
|
+
switch (location.type) {
|
|
1136
|
+
case 'documentChar': {
|
|
1137
|
+
const { type: _, ...fields } = location;
|
|
1138
|
+
return { documentChar: fields };
|
|
1139
|
+
}
|
|
1140
|
+
case 'documentPage': {
|
|
1141
|
+
const { type: _, ...fields } = location;
|
|
1142
|
+
return { documentPage: fields };
|
|
1143
|
+
}
|
|
1144
|
+
case 'documentChunk': {
|
|
1145
|
+
const { type: _, ...fields } = location;
|
|
1146
|
+
return { documentChunk: fields };
|
|
1147
|
+
}
|
|
1148
|
+
case 'searchResult': {
|
|
1149
|
+
const { type: _, ...fields } = location;
|
|
1150
|
+
return { searchResultLocation: fields };
|
|
1151
|
+
}
|
|
1152
|
+
case 'web':
|
|
1153
|
+
return { web: { url: location.url, ...(location.domain && { domain: location.domain }) } };
|
|
1154
|
+
default:
|
|
1155
|
+
return location;
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
/**
|
|
1159
|
+
* Generate redaction events based on guardrail configuration.
|
|
1160
|
+
*
|
|
1161
|
+
* @param guardrailData - The guardrail trace assessment data
|
|
1162
|
+
* @returns Array of redaction events to emit
|
|
1163
|
+
*/
|
|
1164
|
+
_generateRedactionEvents(guardrailData) {
|
|
1165
|
+
const events = [];
|
|
1166
|
+
const redaction = this._config.guardrailConfig?.redaction;
|
|
1167
|
+
// Default: redact input is true unless explicitly set to false
|
|
1168
|
+
if (redaction?.input !== false) {
|
|
1169
|
+
logger.debug('redacting input due to guardrail');
|
|
1170
|
+
events.push({
|
|
1171
|
+
type: 'modelRedactionEvent',
|
|
1172
|
+
inputRedaction: {
|
|
1173
|
+
replaceContent: redaction?.inputMessage ?? DEFAULT_REDACT_INPUT_MESSAGE,
|
|
1174
|
+
},
|
|
1175
|
+
});
|
|
1176
|
+
}
|
|
1177
|
+
// Only redact output if explicitly enabled
|
|
1178
|
+
if (redaction?.output) {
|
|
1179
|
+
logger.debug('redacting output due to guardrail');
|
|
1180
|
+
const outputRedactionEvent = {
|
|
1181
|
+
type: 'modelRedactionEvent',
|
|
1182
|
+
outputRedaction: {
|
|
1183
|
+
replaceContent: redaction?.outputMessage ?? DEFAULT_REDACT_OUTPUT_MESSAGE,
|
|
1184
|
+
},
|
|
1185
|
+
};
|
|
1186
|
+
// Include the original model output if available
|
|
1187
|
+
if (guardrailData.modelOutput && guardrailData.modelOutput.length > 0) {
|
|
1188
|
+
outputRedactionEvent.outputRedaction.redactedContent = guardrailData.modelOutput.join('');
|
|
1189
|
+
}
|
|
1190
|
+
events.push(outputRedactionEvent);
|
|
1191
|
+
}
|
|
1192
|
+
return events;
|
|
1193
|
+
}
|
|
806
1194
|
}
|
|
807
1195
|
/**
|
|
808
1196
|
* Adds middleware to override the Authorization header with a Bearer token.
|