@strands-agents/sdk 1.5.0 → 1.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/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +3 -0
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/agent/__tests__/agent.context-manager.test.js +0 -1
- package/dist/src/agent/__tests__/agent.context-manager.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.stateful-model.test.js +2 -2
- package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +1 -1
- package/dist/src/agent/agent.d.ts +8 -5
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +60 -33
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts +19 -0
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts.map +1 -0
- package/dist/src/context-manager/modes/agentic/agentic-context.js +245 -0
- package/dist/src/context-manager/modes/agentic/agentic-context.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js +332 -0
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.js +176 -0
- package/dist/src/conversation-manager/__tests__/context-compression.test.js.map +1 -0
- package/dist/src/conversation-manager/__tests__/pin.test.js +1 -1
- package/dist/src/conversation-manager/__tests__/pin.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +1 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +1 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts +2 -0
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts.map +1 -0
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js +138 -0
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js.map +1 -0
- package/dist/src/conversation-manager/compression/context-compression.d.ts +39 -0
- package/dist/src/conversation-manager/compression/context-compression.d.ts.map +1 -0
- package/dist/src/conversation-manager/compression/context-compression.js +150 -0
- package/dist/src/conversation-manager/compression/context-compression.js.map +1 -0
- package/dist/src/conversation-manager/{pin-message.d.ts → compression/pin-message.d.ts} +1 -1
- package/dist/src/conversation-manager/compression/pin-message.d.ts.map +1 -0
- package/dist/src/conversation-manager/{pin-message.js → compression/pin-message.js} +1 -1
- package/dist/src/conversation-manager/compression/pin-message.js.map +1 -0
- package/dist/src/conversation-manager/conversation-manager.d.ts +2 -0
- package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.js +2 -2
- package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +4 -35
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +0 -19
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.js +4 -107
- package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/injection/__tests__/message-injection.test.d.ts +2 -0
- package/dist/src/injection/__tests__/message-injection.test.d.ts.map +1 -0
- package/dist/src/injection/__tests__/message-injection.test.js +200 -0
- package/dist/src/injection/__tests__/message-injection.test.js.map +1 -0
- package/dist/src/injection/index.d.ts +6 -0
- package/dist/src/injection/index.d.ts.map +1 -0
- package/dist/src/injection/index.js +2 -0
- package/dist/src/injection/index.js.map +1 -0
- package/dist/src/injection/message-injection.d.ts +65 -0
- package/dist/src/injection/message-injection.d.ts.map +1 -0
- package/dist/src/injection/message-injection.js +134 -0
- package/dist/src/injection/message-injection.js.map +1 -0
- package/dist/src/injection/types.d.ts +63 -0
- package/dist/src/injection/types.d.ts.map +1 -0
- package/dist/src/injection/types.js +2 -0
- package/dist/src/injection/types.js.map +1 -0
- package/dist/src/injection/xml.d.ts +27 -0
- package/dist/src/injection/xml.d.ts.map +1 -0
- package/dist/src/injection/xml.js +31 -0
- package/dist/src/injection/xml.js.map +1 -0
- package/dist/src/memory/__tests__/memory-manager.test.js +188 -2
- package/dist/src/memory/__tests__/memory-manager.test.js.map +1 -1
- package/dist/src/memory/__tests__/memory-tracing.test.d.ts +2 -0
- package/dist/src/memory/__tests__/memory-tracing.test.d.ts.map +1 -0
- package/dist/src/memory/__tests__/memory-tracing.test.js +250 -0
- package/dist/src/memory/__tests__/memory-tracing.test.js.map +1 -0
- package/dist/src/memory/extraction/__tests__/extraction.test.js +41 -39
- package/dist/src/memory/extraction/__tests__/extraction.test.js.map +1 -1
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js +37 -1
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +1 -1
- package/dist/src/memory/extraction/coordinator.d.ts +6 -1
- package/dist/src/memory/extraction/coordinator.d.ts.map +1 -1
- package/dist/src/memory/extraction/coordinator.js +48 -10
- package/dist/src/memory/extraction/coordinator.js.map +1 -1
- package/dist/src/memory/extraction/model-extractor.d.ts.map +1 -1
- package/dist/src/memory/extraction/model-extractor.js +30 -9
- package/dist/src/memory/extraction/model-extractor.js.map +1 -1
- package/dist/src/memory/extraction/types.d.ts +7 -0
- package/dist/src/memory/extraction/types.d.ts.map +1 -1
- package/dist/src/memory/extraction/types.js.map +1 -1
- package/dist/src/memory/index.d.ts +2 -1
- package/dist/src/memory/index.d.ts.map +1 -1
- package/dist/src/memory/index.js.map +1 -1
- package/dist/src/memory/memory-manager.d.ts +64 -4
- package/dist/src/memory/memory-manager.d.ts.map +1 -1
- package/dist/src/memory/memory-manager.js +236 -36
- package/dist/src/memory/memory-manager.js.map +1 -1
- package/dist/src/memory/types.d.ts +72 -0
- package/dist/src/memory/types.d.ts.map +1 -1
- package/dist/src/middleware/__tests__/agent-middleware.test.js +0 -1
- package/dist/src/middleware/__tests__/agent-middleware.test.js.map +1 -1
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/copy-on-input.test.js +379 -0
- package/dist/src/middleware/__tests__/copy-on-input.test.js.map +1 -0
- package/dist/src/middleware/stages.d.ts +14 -7
- package/dist/src/middleware/stages.d.ts.map +1 -1
- package/dist/src/middleware/stages.js +3 -0
- package/dist/src/middleware/stages.js.map +1 -1
- package/dist/src/models/__tests__/google.test.js +41 -0
- package/dist/src/models/__tests__/google.test.js.map +1 -1
- package/dist/src/models/google/adapters.d.ts.map +1 -1
- package/dist/src/models/google/adapters.js +21 -3
- package/dist/src/models/google/adapters.js.map +1 -1
- package/dist/src/models/openai/__tests__/errors.test.js +9 -0
- package/dist/src/models/openai/__tests__/errors.test.js.map +1 -1
- package/dist/src/models/openai/__tests__/responses.test.js +47 -0
- package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
- package/dist/src/models/openai/errors.d.ts.map +1 -1
- package/dist/src/models/openai/errors.js +4 -1
- package/dist/src/models/openai/errors.js.map +1 -1
- package/dist/src/models/openai/responses-adapter.d.ts +1 -0
- package/dist/src/models/openai/responses-adapter.d.ts.map +1 -1
- package/dist/src/models/openai/responses-adapter.js +24 -10
- package/dist/src/models/openai/responses-adapter.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.test.js +22 -1
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +4 -1
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/sandbox/__tests__/docker.test.node.js +2 -2
- package/dist/src/sandbox/__tests__/docker.test.node.js.map +1 -1
- package/dist/src/sandbox/__tests__/ssh.test.node.js +2 -2
- package/dist/src/sandbox/__tests__/ssh.test.node.js.map +1 -1
- package/dist/src/sandbox/base.d.ts +0 -5
- package/dist/src/sandbox/base.d.ts.map +1 -1
- package/dist/src/sandbox/base.js +0 -5
- package/dist/src/sandbox/base.js.map +1 -1
- package/dist/src/sandbox/docker.d.ts.map +1 -1
- package/dist/src/sandbox/docker.js +2 -0
- package/dist/src/sandbox/docker.js.map +1 -1
- package/dist/src/sandbox/ssh.d.ts.map +1 -1
- package/dist/src/sandbox/ssh.js +2 -0
- package/dist/src/sandbox/ssh.js.map +1 -1
- package/dist/src/telemetry/__tests__/tracer.test.node.js +207 -9
- package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -1
- package/dist/src/telemetry/tracer.d.ts +82 -2
- package/dist/src/telemetry/tracer.d.ts.map +1 -1
- package/dist/src/telemetry/tracer.js +242 -3
- package/dist/src/telemetry/tracer.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +86 -1
- package/dist/src/telemetry/types.d.ts.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/json.js.map +1 -1
- package/dist/src/types/messages.d.ts +8 -0
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +13 -1
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts +2 -0
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js +756 -0
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js.map +1 -0
- package/dist/src/vended-interventions/cedar/cedar.d.ts +114 -0
- package/dist/src/vended-interventions/cedar/cedar.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/cedar.js +239 -0
- package/dist/src/vended-interventions/cedar/cedar.js.map +1 -0
- package/dist/src/vended-interventions/cedar/index.d.ts +3 -0
- package/dist/src/vended-interventions/cedar/index.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/index.js +2 -0
- package/dist/src/vended-interventions/cedar/index.js.map +1 -0
- package/dist/src/vended-interventions/cedar/schema-generator.d.ts +10 -0
- package/dist/src/vended-interventions/cedar/schema-generator.d.ts.map +1 -0
- package/dist/src/vended-interventions/cedar/schema-generator.js +38 -0
- package/dist/src/vended-interventions/cedar/schema-generator.js.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts +2 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/{bedrock-knowledge-base-store.test.js → bedrock-knowledge-base-store.test.node.js} +154 -7
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js.map +1 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts.map +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.js.map +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts +57 -0
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts.map +1 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js +86 -11
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js.map +1 -1
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js +96 -0
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js.map +1 -0
- package/dist/src/vended-plugins/context-injector/index.d.ts +25 -0
- package/dist/src/vended-plugins/context-injector/index.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-injector/index.js +23 -0
- package/dist/src/vended-plugins/context-injector/index.js.map +1 -0
- package/dist/src/vended-plugins/context-injector/plugin.d.ts +55 -0
- package/dist/src/vended-plugins/context-injector/plugin.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-injector/plugin.js +41 -0
- package/dist/src/vended-plugins/context-injector/plugin.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +43 -4
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +5 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +68 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/plugin.js +12 -2
- package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.d.ts +29 -1
- package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.js +76 -5
- package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
- package/dist/src/vended-plugins/index.d.ts +2 -1
- package/dist/src/vended-plugins/index.d.ts.map +1 -1
- package/dist/src/vended-plugins/index.js +2 -1
- package/dist/src/vended-plugins/index.js.map +1 -1
- package/dist/src/vended-plugins/skills/skill.d.ts.map +1 -1
- package/dist/src/vended-plugins/skills/skill.js +4 -2
- package/dist/src/vended-plugins/skills/skill.js.map +1 -1
- package/dist/src/vended-tools/http-request/http-request.js +1 -1
- package/dist/src/vended-tools/http-request/http-request.js.map +1 -1
- package/package.json +54 -36
- package/dist/src/conversation-manager/pin-message.d.ts.map +0 -1
- package/dist/src/conversation-manager/pin-message.js.map +0 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts +0 -2
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts.map +0 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js.map +0 -1
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { Agent } from '../../agent/agent.js';
|
|
3
|
+
import { MockMessageModel } from '../../__fixtures__/mock-message-model.js';
|
|
4
|
+
import { createMockTool } from '../../__fixtures__/tool-helpers.js';
|
|
5
|
+
import { InvokeModelStage, ExecuteToolStage, AgentStreamStage } from '../stages.js';
|
|
6
|
+
import { TextBlock, ToolResultBlock, Message } from '../../types/messages.js';
|
|
7
|
+
describe('InvokeModelStage copy-on-input isolation', () => {
|
|
8
|
+
describe('messages', () => {
|
|
9
|
+
it('middleware receives a deep copy of messages, not a reference to the agent array', async () => {
|
|
10
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
11
|
+
const agent = new Agent({ model, printer: false });
|
|
12
|
+
let receivedMessages;
|
|
13
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
14
|
+
receivedMessages = context.messages;
|
|
15
|
+
return yield* next(context);
|
|
16
|
+
});
|
|
17
|
+
await agent.invoke('Hello');
|
|
18
|
+
expect(receivedMessages).not.toBe(agent.messages);
|
|
19
|
+
});
|
|
20
|
+
it('mutating the context messages array does not affect agent.messages', async () => {
|
|
21
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
22
|
+
const agent = new Agent({ model, printer: false });
|
|
23
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
24
|
+
// Force-cast to bypass readonly for this mutation test
|
|
25
|
+
;
|
|
26
|
+
context.messages.push(new Message({ role: 'user', content: [new TextBlock('injected')] }));
|
|
27
|
+
return yield* next(context);
|
|
28
|
+
});
|
|
29
|
+
await agent.invoke('Hello');
|
|
30
|
+
// Agent messages should only contain the original user message + assistant response,
|
|
31
|
+
// not the injected one
|
|
32
|
+
const userMessages = agent.messages.filter((m) => m.role === 'user');
|
|
33
|
+
expect(userMessages).toHaveLength(1);
|
|
34
|
+
expect(userMessages[0].content[0]).toBeInstanceOf(TextBlock);
|
|
35
|
+
expect(userMessages[0].content[0].text).toBe('Hello');
|
|
36
|
+
});
|
|
37
|
+
it('message content blocks are deep copied (not shared references)', async () => {
|
|
38
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
39
|
+
const agent = new Agent({ model, printer: false });
|
|
40
|
+
let receivedContent;
|
|
41
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
42
|
+
receivedContent = context.messages[0]?.content[0];
|
|
43
|
+
return yield* next(context);
|
|
44
|
+
});
|
|
45
|
+
await agent.invoke('Hello');
|
|
46
|
+
// The content block in middleware should be a different instance
|
|
47
|
+
expect(receivedContent).not.toBe(agent.messages[0]?.content[0]);
|
|
48
|
+
});
|
|
49
|
+
it('message metadata is deep copied (not shared reference)', async () => {
|
|
50
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
51
|
+
const agent = new Agent({ model, printer: false });
|
|
52
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
53
|
+
const msg = context.messages[0];
|
|
54
|
+
if (msg?.metadata) {
|
|
55
|
+
msg.metadata.custom = { ...(msg.metadata.custom ?? {}), injected: 'value' };
|
|
56
|
+
}
|
|
57
|
+
return yield* next(context);
|
|
58
|
+
});
|
|
59
|
+
// Pre-set metadata on the agent's message so the middleware has something to mutate
|
|
60
|
+
agent.messages.push(new Message({
|
|
61
|
+
role: 'user',
|
|
62
|
+
content: [new TextBlock('Hello')],
|
|
63
|
+
metadata: { custom: { original: 'data' } },
|
|
64
|
+
}));
|
|
65
|
+
await agent.invoke('Hello');
|
|
66
|
+
const userMsg = agent.messages.find((m) => m.role === 'user' && m.metadata?.custom?.['original'] === 'data');
|
|
67
|
+
expect(userMsg?.metadata?.custom).toEqual({ original: 'data' });
|
|
68
|
+
expect(userMsg?.metadata?.custom).not.toHaveProperty('injected');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('systemPrompt', () => {
|
|
72
|
+
it('string systemPrompt is passed through (immutable primitive)', async () => {
|
|
73
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
74
|
+
const agent = new Agent({ model, printer: false, systemPrompt: 'Be helpful' });
|
|
75
|
+
let receivedPrompt;
|
|
76
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
77
|
+
receivedPrompt = context.systemPrompt;
|
|
78
|
+
return yield* next(context);
|
|
79
|
+
});
|
|
80
|
+
await agent.invoke('Hello');
|
|
81
|
+
expect(receivedPrompt).toBe('Be helpful');
|
|
82
|
+
});
|
|
83
|
+
it('array systemPrompt is deep copied', async () => {
|
|
84
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
85
|
+
const systemBlocks = [new TextBlock('Be helpful')];
|
|
86
|
+
const agent = new Agent({ model, printer: false, systemPrompt: systemBlocks });
|
|
87
|
+
let receivedPrompt;
|
|
88
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
89
|
+
receivedPrompt = context.systemPrompt;
|
|
90
|
+
return yield* next(context);
|
|
91
|
+
});
|
|
92
|
+
await agent.invoke('Hello');
|
|
93
|
+
expect(receivedPrompt).not.toBe(systemBlocks);
|
|
94
|
+
expect(Array.isArray(receivedPrompt)).toBe(true);
|
|
95
|
+
expect(receivedPrompt[0]).not.toBe(systemBlocks[0]);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('toolSpecs', () => {
|
|
99
|
+
it('toolSpecs are deep copied across invocations', async () => {
|
|
100
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
101
|
+
const tool = createMockTool('testTool', () => new ToolResultBlock({
|
|
102
|
+
toolUseId: 'tool-1',
|
|
103
|
+
status: 'success',
|
|
104
|
+
content: [new TextBlock('ok')],
|
|
105
|
+
}));
|
|
106
|
+
const agent = new Agent({ model, tools: [tool], printer: false });
|
|
107
|
+
const receivedSpecs = [];
|
|
108
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
109
|
+
receivedSpecs.push(context.toolSpecs);
|
|
110
|
+
return yield* next(context);
|
|
111
|
+
});
|
|
112
|
+
await agent.invoke('Hello');
|
|
113
|
+
await agent.invoke('Hello again');
|
|
114
|
+
// Each invocation should get a fresh copy
|
|
115
|
+
expect(receivedSpecs[0]).not.toBe(receivedSpecs[1]);
|
|
116
|
+
expect(receivedSpecs[0]).toEqual(receivedSpecs[1]);
|
|
117
|
+
expect(receivedSpecs[0]).toEqual(expect.arrayContaining([expect.objectContaining({ name: 'testTool' })]));
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('modelState', () => {
|
|
121
|
+
it('modelState is not exposed on the middleware context', async () => {
|
|
122
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
123
|
+
const agent = new Agent({ model, printer: false, systemPrompt: 'hi', modelState: { existing: 'value' } });
|
|
124
|
+
let contextKeys = [];
|
|
125
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
126
|
+
contextKeys = Object.keys(context);
|
|
127
|
+
return yield* next(context);
|
|
128
|
+
});
|
|
129
|
+
await agent.invoke('Hello');
|
|
130
|
+
expect(contextKeys.sort()).toEqual(['agent', 'invocationState', 'messages', 'projectedInputTokens', 'systemPrompt', 'toolSpecs'].sort());
|
|
131
|
+
});
|
|
132
|
+
it('model state changes are written back to agent.modelState after streaming', async () => {
|
|
133
|
+
const model = new MockMessageModel();
|
|
134
|
+
const originalStream = model.stream.bind(model);
|
|
135
|
+
model.stream = async function* (messages, options) {
|
|
136
|
+
options?.modelState?.set('responseId', 'resp_123');
|
|
137
|
+
yield* originalStream(messages, options);
|
|
138
|
+
};
|
|
139
|
+
model.addTurn({ type: 'textBlock', text: 'Hi' });
|
|
140
|
+
const agent = new Agent({ model, printer: false });
|
|
141
|
+
await agent.invoke('Hello');
|
|
142
|
+
expect(agent.modelState.getAll()).toEqual({ responseId: 'resp_123' });
|
|
143
|
+
});
|
|
144
|
+
it('model state deletions are synced back to agent.modelState', async () => {
|
|
145
|
+
const model = new MockMessageModel();
|
|
146
|
+
const originalStream = model.stream.bind(model);
|
|
147
|
+
model.stream = async function* (messages, options) {
|
|
148
|
+
options?.modelState?.delete('oldKey');
|
|
149
|
+
options?.modelState?.set('newKey', 'fresh');
|
|
150
|
+
yield* originalStream(messages, options);
|
|
151
|
+
};
|
|
152
|
+
model.addTurn({ type: 'textBlock', text: 'Hi' });
|
|
153
|
+
const agent = new Agent({ model, printer: false, modelState: { oldKey: 'stale' } });
|
|
154
|
+
await agent.invoke('Hello');
|
|
155
|
+
expect(agent.modelState.get('oldKey')).toBeUndefined();
|
|
156
|
+
expect(agent.modelState.get('newKey')).toBe('fresh');
|
|
157
|
+
});
|
|
158
|
+
it('middleware mutations to agent.modelState before next() do not affect the model call', async () => {
|
|
159
|
+
const model = new MockMessageModel();
|
|
160
|
+
const originalStream = model.stream.bind(model);
|
|
161
|
+
let modelReceivedState;
|
|
162
|
+
model.stream = async function* (messages, options) {
|
|
163
|
+
modelReceivedState = options?.modelState?.getAll();
|
|
164
|
+
yield* originalStream(messages, options);
|
|
165
|
+
};
|
|
166
|
+
model.addTurn({ type: 'textBlock', text: 'Hi' });
|
|
167
|
+
const agent = new Agent({ model, printer: false, modelState: { key: 'snapshotted' } });
|
|
168
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
169
|
+
agent.modelState.set('key', 'mutated-before-next');
|
|
170
|
+
agent.modelState.set('extra', 'injected');
|
|
171
|
+
return yield* next(context);
|
|
172
|
+
});
|
|
173
|
+
await agent.invoke('Hello');
|
|
174
|
+
expect(modelReceivedState).toEqual({ key: 'snapshotted' });
|
|
175
|
+
});
|
|
176
|
+
it('middleware mutations to agent.modelState after next() do not persist', async () => {
|
|
177
|
+
const model = new MockMessageModel();
|
|
178
|
+
const originalStream = model.stream.bind(model);
|
|
179
|
+
model.stream = async function* (messages, options) {
|
|
180
|
+
options?.modelState?.set('fromModel', 'model-wrote-this');
|
|
181
|
+
yield* originalStream(messages, options);
|
|
182
|
+
};
|
|
183
|
+
model.addTurn({ type: 'textBlock', text: 'Hi' });
|
|
184
|
+
const agent = new Agent({ model, printer: false, modelState: { key: 'original' } });
|
|
185
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
186
|
+
const result = yield* next(context);
|
|
187
|
+
agent.modelState.set('sneaky', 'should-be-gone');
|
|
188
|
+
agent.modelState.set('fromModel', 'overwritten');
|
|
189
|
+
return result;
|
|
190
|
+
});
|
|
191
|
+
await agent.invoke('Hello');
|
|
192
|
+
// Writeback happens after the full middleware chain, discarding any mutations
|
|
193
|
+
expect(agent.modelState.get('fromModel')).toBe('model-wrote-this');
|
|
194
|
+
expect(agent.modelState.get('sneaky')).toBeUndefined();
|
|
195
|
+
// 'key' persists because it was in the snapshot that the model received
|
|
196
|
+
expect(agent.modelState.get('key')).toBe('original');
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('invocationState', () => {
|
|
200
|
+
it('invocationState is shared by reference — mutations are visible on the result', async () => {
|
|
201
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
202
|
+
const agent = new Agent({ model, printer: false });
|
|
203
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
204
|
+
;
|
|
205
|
+
context.invocationState['middlewareTouched'] = true;
|
|
206
|
+
return yield* next(context);
|
|
207
|
+
});
|
|
208
|
+
const result = await agent.invoke('Hello', { invocationState: { myKey: 'myValue' } });
|
|
209
|
+
expect(result.invocationState).toEqual({ myKey: 'myValue', middlewareTouched: true });
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('toolChoice', () => {
|
|
213
|
+
it('toolChoice is undefined when not explicitly configured', async () => {
|
|
214
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
215
|
+
const agent = new Agent({ model, printer: false });
|
|
216
|
+
let receivedChoice;
|
|
217
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
218
|
+
receivedChoice = context.toolChoice;
|
|
219
|
+
return yield* next(context);
|
|
220
|
+
});
|
|
221
|
+
await agent.invoke('Hello');
|
|
222
|
+
expect(receivedChoice).toBeUndefined();
|
|
223
|
+
});
|
|
224
|
+
it('toolChoice is deep copied when present', async () => {
|
|
225
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'plain response' }).addTurn({
|
|
226
|
+
type: 'toolUseBlock',
|
|
227
|
+
name: 'strands_structured_output',
|
|
228
|
+
toolUseId: 'so-1',
|
|
229
|
+
input: { name: 'Alice' },
|
|
230
|
+
});
|
|
231
|
+
const { z } = await import('zod');
|
|
232
|
+
const agent = new Agent({
|
|
233
|
+
model,
|
|
234
|
+
printer: false,
|
|
235
|
+
structuredOutputSchema: z.object({ name: z.string() }),
|
|
236
|
+
});
|
|
237
|
+
const receivedChoices = [];
|
|
238
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
239
|
+
receivedChoices.push(context.toolChoice);
|
|
240
|
+
return yield* next(context);
|
|
241
|
+
});
|
|
242
|
+
await agent.invoke('Hello');
|
|
243
|
+
// Second call should have toolChoice forced by structured output
|
|
244
|
+
const definedChoice = receivedChoices.find((c) => c !== undefined);
|
|
245
|
+
expect(definedChoice).toEqual({ tool: { name: 'strands_structured_output' } });
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe('functional style — passing modified context to next()', () => {
|
|
249
|
+
it('middleware can pass a new context with modified messages to next()', async () => {
|
|
250
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
251
|
+
const agent = new Agent({ model, printer: false });
|
|
252
|
+
let terminalMessages;
|
|
253
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
254
|
+
const newContext = {
|
|
255
|
+
...context,
|
|
256
|
+
messages: [...context.messages, new Message({ role: 'user', content: [new TextBlock('extra context')] })],
|
|
257
|
+
};
|
|
258
|
+
return yield* next(newContext);
|
|
259
|
+
});
|
|
260
|
+
// Add a second middleware closer to terminal to capture what actually arrives
|
|
261
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
262
|
+
terminalMessages = context.messages;
|
|
263
|
+
return yield* next(context);
|
|
264
|
+
});
|
|
265
|
+
await agent.invoke('Hello');
|
|
266
|
+
expect(terminalMessages).toHaveLength(2);
|
|
267
|
+
expect(terminalMessages[1].content[0].text).toBe('extra context');
|
|
268
|
+
});
|
|
269
|
+
it('middleware can pass a new context with modified toolSpecs to next()', async () => {
|
|
270
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
271
|
+
const tool = createMockTool('myTool', () => new ToolResultBlock({
|
|
272
|
+
toolUseId: 'tool-1',
|
|
273
|
+
status: 'success',
|
|
274
|
+
content: [new TextBlock('ok')],
|
|
275
|
+
}));
|
|
276
|
+
const agent = new Agent({ model, tools: [tool], printer: false });
|
|
277
|
+
let terminalSpecs;
|
|
278
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
279
|
+
// Filter out all tools
|
|
280
|
+
const newContext = {
|
|
281
|
+
...context,
|
|
282
|
+
toolSpecs: [],
|
|
283
|
+
};
|
|
284
|
+
return yield* next(newContext);
|
|
285
|
+
});
|
|
286
|
+
agent.addMiddleware(InvokeModelStage, async function* (context, next) {
|
|
287
|
+
terminalSpecs = context.toolSpecs;
|
|
288
|
+
return yield* next(context);
|
|
289
|
+
});
|
|
290
|
+
await agent.invoke('Hello');
|
|
291
|
+
expect(terminalSpecs).toEqual([]);
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
describe('ExecuteToolStage copy-on-input isolation', () => {
|
|
296
|
+
function createToolCallingModel() {
|
|
297
|
+
return new MockMessageModel()
|
|
298
|
+
.addTurn({
|
|
299
|
+
type: 'toolUseBlock',
|
|
300
|
+
name: 'testTool',
|
|
301
|
+
toolUseId: 'tool-1',
|
|
302
|
+
input: { key: 'value', nested: { arr: [1, 2, 3] } },
|
|
303
|
+
})
|
|
304
|
+
.addTurn({ type: 'textBlock', text: 'Done' });
|
|
305
|
+
}
|
|
306
|
+
describe('toolUse.input', () => {
|
|
307
|
+
it('toolUse.input is a deep copy of the model output', async () => {
|
|
308
|
+
const model = createToolCallingModel();
|
|
309
|
+
const tool = createMockTool('testTool', () => new ToolResultBlock({
|
|
310
|
+
toolUseId: 'tool-1',
|
|
311
|
+
status: 'success',
|
|
312
|
+
content: [new TextBlock('ok')],
|
|
313
|
+
}));
|
|
314
|
+
const agent = new Agent({ model, tools: [tool], printer: false });
|
|
315
|
+
let receivedInput;
|
|
316
|
+
agent.addMiddleware(ExecuteToolStage, async function* (context, next) {
|
|
317
|
+
receivedInput = context.toolUse.input;
|
|
318
|
+
return yield* next(context);
|
|
319
|
+
});
|
|
320
|
+
await agent.invoke('Call the tool');
|
|
321
|
+
expect(receivedInput).toEqual({ key: 'value', nested: { arr: [1, 2, 3] } });
|
|
322
|
+
});
|
|
323
|
+
it('mutating toolUse.input in middleware does not affect the original message', async () => {
|
|
324
|
+
const model = createToolCallingModel();
|
|
325
|
+
const tool = createMockTool('testTool', () => new ToolResultBlock({
|
|
326
|
+
toolUseId: 'tool-1',
|
|
327
|
+
status: 'success',
|
|
328
|
+
content: [new TextBlock('ok')],
|
|
329
|
+
}));
|
|
330
|
+
const agent = new Agent({ model, tools: [tool], printer: false });
|
|
331
|
+
agent.addMiddleware(ExecuteToolStage, async function* (context, next) {
|
|
332
|
+
;
|
|
333
|
+
context.toolUse.input['injected'] = true;
|
|
334
|
+
return yield* next(context);
|
|
335
|
+
});
|
|
336
|
+
await agent.invoke('Call the tool');
|
|
337
|
+
// The original tool use block in the assistant message should be unaffected
|
|
338
|
+
const assistantMsg = agent.messages.find((m) => m.role === 'assistant');
|
|
339
|
+
const toolUseBlock = assistantMsg?.content.find((b) => b.type === 'toolUseBlock');
|
|
340
|
+
expect(toolUseBlock).toBeDefined();
|
|
341
|
+
expect(toolUseBlock.input).not.toHaveProperty('injected');
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
describe('invocationState', () => {
|
|
345
|
+
it('invocationState is shared by reference (intentionally mutable)', async () => {
|
|
346
|
+
const model = createToolCallingModel();
|
|
347
|
+
const tool = createMockTool('testTool', () => new ToolResultBlock({
|
|
348
|
+
toolUseId: 'tool-1',
|
|
349
|
+
status: 'success',
|
|
350
|
+
content: [new TextBlock('ok')],
|
|
351
|
+
}));
|
|
352
|
+
const agent = new Agent({ model, tools: [tool], printer: false });
|
|
353
|
+
agent.addMiddleware(ExecuteToolStage, async function* (context, next) {
|
|
354
|
+
;
|
|
355
|
+
context.invocationState['middlewareTouched'] = true;
|
|
356
|
+
return yield* next(context);
|
|
357
|
+
});
|
|
358
|
+
const result = await agent.invoke('Call the tool', { invocationState: { original: true } });
|
|
359
|
+
expect(result.invocationState).toEqual({ original: true, middlewareTouched: true });
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
describe('AgentStreamStage shared references', () => {
|
|
364
|
+
describe('args', () => {
|
|
365
|
+
it('args is shared by reference with the caller', async () => {
|
|
366
|
+
const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Hi' });
|
|
367
|
+
const agent = new Agent({ model, printer: false });
|
|
368
|
+
const inputMessages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
|
|
369
|
+
let receivedArgs;
|
|
370
|
+
agent.addMiddleware(AgentStreamStage, async function* (context, next) {
|
|
371
|
+
receivedArgs = context.args;
|
|
372
|
+
return yield* next(context);
|
|
373
|
+
});
|
|
374
|
+
await agent.invoke(inputMessages);
|
|
375
|
+
expect(receivedArgs).toBe(inputMessages);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
//# sourceMappingURL=copy-on-input.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-on-input.test.js","sourceRoot":"","sources":["../../../../src/middleware/__tests__/copy-on-input.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@ import type { MiddlewareStage } from './types.js';
|
|
|
2
2
|
import type { LocalAgent, AgentStreamEvent, InvocationState, InvokeArgs, InvokeOptions, AgentResult } from '../types/agent.js';
|
|
3
3
|
import type { Message, SystemPrompt, ToolResultBlock } from '../types/messages.js';
|
|
4
4
|
import type { ToolSpec, ToolChoice } from '../tools/types.js';
|
|
5
|
-
import type { StateStore } from '../state-store.js';
|
|
6
5
|
import type { StreamAggregatedResult } from '../models/model.js';
|
|
7
6
|
import type { ToolUseData } from '../hooks/events.js';
|
|
8
7
|
import type { Tool } from '../tools/tool.js';
|
|
@@ -65,10 +64,10 @@ export interface InvokeModelContext {
|
|
|
65
64
|
readonly toolSpecs: readonly ToolSpec[];
|
|
66
65
|
/** Controls how the model selects tools. */
|
|
67
66
|
readonly toolChoice?: ToolChoice;
|
|
68
|
-
/**
|
|
69
|
-
readonly modelState: StateStore;
|
|
70
|
-
/** Per-invocation state shared across hooks and tools. */
|
|
67
|
+
/** Per-invocation state. Shared by reference — mutations are visible to hooks, tools, and AgentResult. */
|
|
71
68
|
readonly invocationState: InvocationState;
|
|
69
|
+
/** Estimated input token count for this model call, or undefined if estimation failed. */
|
|
70
|
+
readonly projectedInputTokens?: number;
|
|
72
71
|
}
|
|
73
72
|
/**
|
|
74
73
|
* Result from model-stage middleware.
|
|
@@ -89,7 +88,7 @@ export interface ExecuteToolContext extends MiddlewareInterruptible {
|
|
|
89
88
|
readonly tool: Tool | undefined;
|
|
90
89
|
/** The tool use request (name, toolUseId, input). */
|
|
91
90
|
readonly toolUse: ToolUseData;
|
|
92
|
-
/** Per-invocation state
|
|
91
|
+
/** Per-invocation state. Shared by reference — mutations are visible to hooks, tools, and AgentResult. */
|
|
93
92
|
readonly invocationState: InvocationState;
|
|
94
93
|
}
|
|
95
94
|
/**
|
|
@@ -103,18 +102,23 @@ export interface ExecuteToolResult {
|
|
|
103
102
|
/**
|
|
104
103
|
* Context passed to agent-stream-stage middleware.
|
|
105
104
|
* Wraps the entire agent output stream at the outermost interception point.
|
|
105
|
+
*
|
|
106
|
+
* @internal Not part of the public API. The contract for this context (particularly
|
|
107
|
+
* around copy vs. reference semantics for `args` and `options`) is not yet finalized.
|
|
106
108
|
*/
|
|
107
109
|
export interface AgentStreamContext extends MiddlewareInterruptible {
|
|
108
110
|
/** The agent instance (escape hatch for advanced use cases). */
|
|
109
111
|
readonly agent: LocalAgent;
|
|
110
|
-
/** The invocation arguments passed to agent.stream(). */
|
|
112
|
+
/** The invocation arguments passed to agent.stream(). Shared by reference. */
|
|
111
113
|
readonly args: InvokeArgs;
|
|
112
|
-
/** Per-invocation options (cancel signal, structured output, etc.). */
|
|
114
|
+
/** Per-invocation options (cancel signal, structured output, etc.). Shared by reference. */
|
|
113
115
|
readonly options?: InvokeOptions;
|
|
114
116
|
}
|
|
115
117
|
/**
|
|
116
118
|
* Result from agent-stream-stage middleware.
|
|
117
119
|
* The return value of the async generator.
|
|
120
|
+
*
|
|
121
|
+
* @internal Not part of the public API.
|
|
118
122
|
*/
|
|
119
123
|
export interface AgentStreamResult {
|
|
120
124
|
/** The final agent result from the stream. */
|
|
@@ -133,6 +137,9 @@ export declare const ExecuteToolStage: MiddlewareStage<ExecuteToolContext, Execu
|
|
|
133
137
|
/**
|
|
134
138
|
* Built-in stage wrapping the entire agent output stream.
|
|
135
139
|
* Middleware registered for this stage can filter, transform, or inject events.
|
|
140
|
+
*
|
|
141
|
+
* @internal Not part of the public API. The context contract for this stage is not
|
|
142
|
+
* yet finalized — particularly around copy vs. reference semantics for args/options.
|
|
136
143
|
*/
|
|
137
144
|
export declare const AgentStreamStage: MiddlewareStage<AgentStreamContext, AgentStreamResult, AgentStreamEvent>;
|
|
138
145
|
//# sourceMappingURL=stages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stages.d.ts","sourceRoot":"","sources":["../../../src/middleware/stages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,aAAa,EACb,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"stages.d.ts","sourceRoot":"","sources":["../../../src/middleware/stages.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,9 @@ export const ExecuteToolStage = createStage('executeTool');
|
|
|
26
26
|
/**
|
|
27
27
|
* Built-in stage wrapping the entire agent output stream.
|
|
28
28
|
* Middleware registered for this stage can filter, transform, or inject events.
|
|
29
|
+
*
|
|
30
|
+
* @internal Not part of the public API. The context contract for this stage is not
|
|
31
|
+
* yet finalized — particularly around copy vs. reference semantics for args/options.
|
|
29
32
|
*/
|
|
30
33
|
export const AgentStreamStage = createStage('agentStream');
|
|
31
34
|
//# sourceMappingURL=stages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stages.js","sourceRoot":"","sources":["../../../src/middleware/stages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stages.js","sourceRoot":"","sources":["../../../src/middleware/stages.ts"],"names":[],"mappings":"AAoDA;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAA4B,IAAY;IACjE,wGAAwG;IACxG,MAAM,KAAK,GAAG,EAAE,IAAI,EAAgD,CAAA;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAe,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AAC1F,CAAC;AAoFD;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAA0D,aAAa,CAAC,CAAA;AAEnH;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAA0D,aAAa,CAAC,CAAA;AAEnH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAA0D,aAAa,CAAC,CAAA"}
|
|
@@ -779,6 +779,47 @@ describe('GoogleModel', () => {
|
|
|
779
779
|
{ inlineData: { data: 'iVBORw==', mimeType: 'image/png', displayName: 'image.png' } },
|
|
780
780
|
]);
|
|
781
781
|
});
|
|
782
|
+
it('disambiguates displayName for multiple same-format images in one tool result', () => {
|
|
783
|
+
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'two_images', input: {} });
|
|
784
|
+
const toolResultBlock = new ToolResultBlock({
|
|
785
|
+
toolUseId: 'test-id',
|
|
786
|
+
status: 'success',
|
|
787
|
+
content: [
|
|
788
|
+
new ImageBlock({ format: 'png', source: { bytes: new Uint8Array([0x89, 0x50, 0x4e, 0x47]) } }),
|
|
789
|
+
new ImageBlock({ format: 'png', source: { bytes: new Uint8Array([0x89, 0x50, 0x4e, 0x48]) } }),
|
|
790
|
+
],
|
|
791
|
+
});
|
|
792
|
+
const messages = [
|
|
793
|
+
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
794
|
+
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
795
|
+
];
|
|
796
|
+
const contents = formatMessages(messages);
|
|
797
|
+
const resultPart = contents[1].parts[0];
|
|
798
|
+
const displayNames = resultPart.functionResponse.parts.map((p) => p.inlineData.displayName);
|
|
799
|
+
// Gemini rejects duplicate part names within one function_response.parts.
|
|
800
|
+
expect(new Set(displayNames).size).toBe(displayNames.length);
|
|
801
|
+
expect(displayNames).toEqual(['image.png', 'image-1.png']);
|
|
802
|
+
});
|
|
803
|
+
it('disambiguates displayName for documents sharing a name in one tool result', () => {
|
|
804
|
+
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'two_docs', input: {} });
|
|
805
|
+
const toolResultBlock = new ToolResultBlock({
|
|
806
|
+
toolUseId: 'test-id',
|
|
807
|
+
status: 'success',
|
|
808
|
+
content: [
|
|
809
|
+
new DocumentBlock({ name: 'report.pdf', format: 'pdf', source: { bytes: new Uint8Array([0x25, 0x50]) } }),
|
|
810
|
+
new DocumentBlock({ name: 'report.pdf', format: 'pdf', source: { bytes: new Uint8Array([0x25, 0x51]) } }),
|
|
811
|
+
],
|
|
812
|
+
});
|
|
813
|
+
const messages = [
|
|
814
|
+
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
815
|
+
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
816
|
+
];
|
|
817
|
+
const contents = formatMessages(messages);
|
|
818
|
+
const resultPart = contents[1].parts[0];
|
|
819
|
+
const displayNames = resultPart.functionResponse.parts.map((p) => p.inlineData.displayName);
|
|
820
|
+
expect(new Set(displayNames).size).toBe(displayNames.length);
|
|
821
|
+
expect(displayNames).toEqual(['report.pdf', 'report-1.pdf']);
|
|
822
|
+
});
|
|
782
823
|
it('formats document block with bytes source in tool result as inlineData', () => {
|
|
783
824
|
const docBytes = new Uint8Array([0x25, 0x50, 0x44, 0x46]);
|
|
784
825
|
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'read_doc', input: {} });
|