@strands-agents/sdk 1.2.0 → 1.4.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 +13 -13
- package/dist/src/__fixtures__/test-sandbox.node.d.ts +15 -0
- package/dist/src/__fixtures__/test-sandbox.node.d.ts.map +1 -0
- package/dist/src/__fixtures__/test-sandbox.node.js +22 -0
- package/dist/src/__fixtures__/test-sandbox.node.js.map +1 -0
- package/dist/src/__tests__/mcp.test.js +14 -14
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.test.js +195 -0
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/printer.test.js +58 -18
- package/dist/src/agent/__tests__/printer.test.js.map +1 -1
- package/dist/src/agent/__tests__/tool-caller.test.d.ts +2 -0
- package/dist/src/agent/__tests__/tool-caller.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/tool-caller.test.js +459 -0
- package/dist/src/agent/__tests__/tool-caller.test.js.map +1 -0
- package/dist/src/agent/agent.d.ts +68 -2
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +125 -66
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/printer.d.ts +14 -1
- package/dist/src/agent/printer.d.ts.map +1 -1
- package/dist/src/agent/printer.js +33 -5
- package/dist/src/agent/printer.js.map +1 -1
- package/dist/src/agent/tool-caller.d.ts +149 -0
- package/dist/src/agent/tool-caller.d.ts.map +1 -0
- package/dist/src/agent/tool-caller.js +198 -0
- package/dist/src/agent/tool-caller.js.map +1 -0
- package/dist/src/errors.d.ts +17 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +21 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/hooks/types.d.ts +2 -0
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/hooks/types.js +2 -0
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/index.d.ts +10 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/interventions/__tests__/handler.test.d.ts +2 -0
- package/dist/src/interventions/__tests__/handler.test.d.ts.map +1 -0
- package/dist/src/interventions/__tests__/handler.test.js +35 -0
- package/dist/src/interventions/__tests__/handler.test.js.map +1 -0
- package/dist/src/interventions/__tests__/registry.test.d.ts +2 -0
- package/dist/src/interventions/__tests__/registry.test.d.ts.map +1 -0
- package/dist/src/interventions/__tests__/registry.test.js +692 -0
- package/dist/src/interventions/__tests__/registry.test.js.map +1 -0
- package/dist/src/interventions/actions.d.ts +186 -0
- package/dist/src/interventions/actions.d.ts.map +1 -0
- package/dist/src/interventions/actions.js +56 -0
- package/dist/src/interventions/actions.js.map +1 -0
- package/dist/src/interventions/handler.d.ts +43 -0
- package/dist/src/interventions/handler.d.ts.map +1 -0
- package/dist/src/interventions/handler.js +41 -0
- package/dist/src/interventions/handler.js.map +1 -0
- package/dist/src/interventions/index.d.ts +12 -0
- package/dist/src/interventions/index.d.ts.map +1 -0
- package/dist/src/interventions/index.js +4 -0
- package/dist/src/interventions/index.js.map +1 -0
- package/dist/src/interventions/registry.d.ts +36 -0
- package/dist/src/interventions/registry.d.ts.map +1 -0
- package/dist/src/interventions/registry.js +252 -0
- package/dist/src/interventions/registry.js.map +1 -0
- package/dist/src/mcp.d.ts +20 -15
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +15 -8
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/models/__tests__/anthropic.test.js +72 -8
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +142 -0
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/anthropic.d.ts +10 -0
- package/dist/src/models/anthropic.d.ts.map +1 -1
- package/dist/src/models/anthropic.js +24 -8
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts +26 -1
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +22 -4
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/openai/__tests__/chat.test.js +2 -10
- package/dist/src/models/openai/__tests__/chat.test.js.map +1 -1
- package/dist/src/models/openai/__tests__/errors.test.d.ts +2 -0
- package/dist/src/models/openai/__tests__/errors.test.d.ts.map +1 -0
- package/dist/src/models/openai/__tests__/errors.test.js +30 -0
- package/dist/src/models/openai/__tests__/errors.test.js.map +1 -0
- package/dist/src/models/openai/__tests__/mantle.test.d.ts +2 -0
- package/dist/src/models/openai/__tests__/mantle.test.d.ts.map +1 -0
- package/dist/src/models/openai/__tests__/mantle.test.js +189 -0
- package/dist/src/models/openai/__tests__/mantle.test.js.map +1 -0
- package/dist/src/models/openai/__tests__/responses.test.js +0 -19
- 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 +5 -3
- package/dist/src/models/openai/errors.js.map +1 -1
- package/dist/src/models/openai/index.d.ts +1 -0
- package/dist/src/models/openai/index.d.ts.map +1 -1
- package/dist/src/models/openai/mantle.d.ts +77 -0
- package/dist/src/models/openai/mantle.d.ts.map +1 -0
- package/dist/src/models/openai/mantle.js +83 -0
- package/dist/src/models/openai/mantle.js.map +1 -0
- package/dist/src/models/openai/model.d.ts.map +1 -1
- package/dist/src/models/openai/model.js +29 -1
- package/dist/src/models/openai/model.js.map +1 -1
- package/dist/src/models/openai/types.d.ts +11 -0
- package/dist/src/models/openai/types.d.ts.map +1 -1
- package/dist/src/multiagent/__tests__/nodes.test.js +50 -0
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +23 -2
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +18 -4
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/registry/__tests__/tool-registry.test.js +50 -1
- package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
- package/dist/src/registry/tool-registry.d.ts +13 -0
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +35 -1
- package/dist/src/registry/tool-registry.js.map +1 -1
- package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts +2 -0
- package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts.map +1 -0
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js +252 -0
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js.map +1 -0
- package/dist/src/sandbox/base.d.ts +138 -0
- package/dist/src/sandbox/base.d.ts.map +1 -0
- package/dist/src/sandbox/base.js +84 -0
- package/dist/src/sandbox/base.js.map +1 -0
- package/dist/src/sandbox/constants.d.ts +7 -0
- package/dist/src/sandbox/constants.d.ts.map +1 -0
- package/dist/src/sandbox/constants.js +7 -0
- package/dist/src/sandbox/constants.js.map +1 -0
- package/dist/src/sandbox/posix-shell.d.ts +32 -0
- package/dist/src/sandbox/posix-shell.d.ts.map +1 -0
- package/dist/src/sandbox/posix-shell.js +78 -0
- package/dist/src/sandbox/posix-shell.js.map +1 -0
- package/dist/src/sandbox/stream-process.d.ts +32 -0
- package/dist/src/sandbox/stream-process.d.ts.map +1 -0
- package/dist/src/sandbox/stream-process.js +160 -0
- package/dist/src/sandbox/stream-process.js.map +1 -0
- package/dist/src/sandbox/types.d.ts +57 -0
- package/dist/src/sandbox/types.d.ts.map +1 -0
- package/dist/src/sandbox/types.js +8 -0
- package/dist/src/sandbox/types.js.map +1 -0
- package/dist/src/telemetry/__tests__/meter.test.js +11 -0
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
- package/dist/src/telemetry/meter.d.ts +10 -6
- package/dist/src/telemetry/meter.d.ts.map +1 -1
- package/dist/src/telemetry/meter.js +16 -3
- package/dist/src/telemetry/meter.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/messages.test.js +28 -0
- package/dist/src/types/__tests__/messages.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +51 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/lifecycle-observer.d.ts +18 -0
- package/dist/src/types/lifecycle-observer.d.ts.map +1 -0
- package/dist/src/types/lifecycle-observer.js +2 -0
- package/dist/src/types/lifecycle-observer.js.map +1 -0
- package/dist/src/types/messages.d.ts +20 -2
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +9 -0
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/utils/shell-quote.d.ts +12 -0
- package/dist/src/utils/shell-quote.d.ts.map +1 -0
- package/dist/src/utils/shell-quote.js +14 -0
- package/dist/src/utils/shell-quote.js.map +1 -0
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts +2 -0
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts.map +1 -0
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js +358 -0
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js.map +1 -0
- package/dist/src/vended-interventions/hitl/hitl.d.ts +115 -0
- package/dist/src/vended-interventions/hitl/hitl.d.ts.map +1 -0
- package/dist/src/vended-interventions/hitl/hitl.js +138 -0
- package/dist/src/vended-interventions/hitl/hitl.js.map +1 -0
- package/dist/src/vended-interventions/hitl/index.d.ts +24 -0
- package/dist/src/vended-interventions/hitl/index.d.ts.map +1 -0
- package/dist/src/vended-interventions/hitl/index.js +23 -0
- package/dist/src/vended-interventions/hitl/index.js.map +1 -0
- package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts +2 -0
- package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/__tests__/handler.test.js +163 -0
- package/dist/src/vended-interventions/steering/__tests__/handler.test.js.map +1 -0
- package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts +2 -0
- package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/__tests__/llm.test.js +60 -0
- package/dist/src/vended-interventions/steering/__tests__/llm.test.js.map +1 -0
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts +2 -0
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js +94 -0
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js.map +1 -0
- package/dist/src/vended-interventions/steering/handlers/handler.d.ts +64 -0
- package/dist/src/vended-interventions/steering/handlers/handler.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/handlers/handler.js +71 -0
- package/dist/src/vended-interventions/steering/handlers/handler.js.map +1 -0
- package/dist/src/vended-interventions/steering/handlers/llm.d.ts +72 -0
- package/dist/src/vended-interventions/steering/handlers/llm.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/handlers/llm.js +177 -0
- package/dist/src/vended-interventions/steering/handlers/llm.js.map +1 -0
- package/dist/src/vended-interventions/steering/index.d.ts +31 -0
- package/dist/src/vended-interventions/steering/index.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/index.js +32 -0
- package/dist/src/vended-interventions/steering/index.js.map +1 -0
- package/dist/src/vended-interventions/steering/providers/context-provider.d.ts +55 -0
- package/dist/src/vended-interventions/steering/providers/context-provider.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/providers/context-provider.js +8 -0
- package/dist/src/vended-interventions/steering/providers/context-provider.js.map +1 -0
- package/dist/src/vended-interventions/steering/providers/tool-ledger.d.ts +49 -0
- package/dist/src/vended-interventions/steering/providers/tool-ledger.d.ts.map +1 -0
- package/dist/src/vended-interventions/steering/providers/tool-ledger.js +75 -0
- package/dist/src/vended-interventions/steering/providers/tool-ledger.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +208 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js +149 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/plugin.js +57 -10
- package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/search.d.ts +25 -0
- package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/search.js +120 -0
- package/dist/src/vended-plugins/context-offloader/search.js.map +1 -0
- package/dist/src/vended-plugins/index.d.ts +11 -0
- package/dist/src/vended-plugins/index.d.ts.map +1 -0
- package/dist/src/vended-plugins/index.js +11 -0
- package/dist/src/vended-plugins/index.js.map +1 -0
- package/dist/src/vended-tools/index.d.ts +17 -0
- package/dist/src/vended-tools/index.d.ts.map +1 -0
- package/dist/src/vended-tools/index.js +17 -0
- package/dist/src/vended-tools/index.js.map +1 -0
- package/package.json +37 -11
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { BeforeInvocationEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, } from '../hooks/events.js';
|
|
2
|
+
import { HookOrder } from '../hooks/types.js';
|
|
3
|
+
import { Message, TextBlock } from '../types/messages.js';
|
|
4
|
+
import { defaultEvaluate } from './actions.js';
|
|
5
|
+
import { InterventionHandler } from './handler.js';
|
|
6
|
+
import { InterruptError } from '../interrupt.js';
|
|
7
|
+
import { logger } from '../logging/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Bridges {@link InterventionHandler} instances and the Strands hook system.
|
|
10
|
+
*
|
|
11
|
+
* Registers one hook callback per lifecycle event type, then dispatches to
|
|
12
|
+
* all handlers that override that method — in registration order, with
|
|
13
|
+
* short-circuiting on Deny (and denied Confirms) and accumulation for Guide.
|
|
14
|
+
*
|
|
15
|
+
* See {@link InterventionAction} for the action-to-event compatibility matrix.
|
|
16
|
+
*/
|
|
17
|
+
export class InterventionRegistry {
|
|
18
|
+
_handlers;
|
|
19
|
+
constructor(handlers, hookRegistry) {
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
for (const h of handlers) {
|
|
22
|
+
if (seen.has(h.name)) {
|
|
23
|
+
throw new Error(`Duplicate intervention handler name: '${h.name}'`);
|
|
24
|
+
}
|
|
25
|
+
seen.add(h.name);
|
|
26
|
+
}
|
|
27
|
+
this._handlers = handlers;
|
|
28
|
+
this._registerHooks(hookRegistry);
|
|
29
|
+
}
|
|
30
|
+
/** Registered handlers in registration order. */
|
|
31
|
+
get handlers() {
|
|
32
|
+
return this._handlers;
|
|
33
|
+
}
|
|
34
|
+
_registerHooks(hookRegistry) {
|
|
35
|
+
if (this._handlers.some((h) => h.beforeInvocation !== InterventionHandler.prototype.beforeInvocation)) {
|
|
36
|
+
hookRegistry.addCallback(BeforeInvocationEvent, (e) => this._onBeforeInvocation(e), {
|
|
37
|
+
order: HookOrder.INTERVENTION_INPUT,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (this._handlers.some((h) => h.beforeToolCall !== InterventionHandler.prototype.beforeToolCall)) {
|
|
41
|
+
hookRegistry.addCallback(BeforeToolCallEvent, (e) => this._onBeforeToolCall(e), {
|
|
42
|
+
order: HookOrder.INTERVENTION_INPUT,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (this._handlers.some((h) => h.afterToolCall !== InterventionHandler.prototype.afterToolCall)) {
|
|
46
|
+
hookRegistry.addCallback(AfterToolCallEvent, (e) => this._onAfterToolCall(e), {
|
|
47
|
+
order: HookOrder.INTERVENTION_OUTPUT,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (this._handlers.some((h) => h.beforeModelCall !== InterventionHandler.prototype.beforeModelCall)) {
|
|
51
|
+
hookRegistry.addCallback(BeforeModelCallEvent, (e) => this._onBeforeModelCall(e), {
|
|
52
|
+
order: HookOrder.INTERVENTION_INPUT,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (this._handlers.some((h) => h.afterModelCall !== InterventionHandler.prototype.afterModelCall)) {
|
|
56
|
+
hookRegistry.addCallback(AfterModelCallEvent, (e) => this._onAfterModelCall(e), {
|
|
57
|
+
order: HookOrder.INTERVENTION_OUTPUT,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async _onBeforeInvocation(event) {
|
|
62
|
+
return this._dispatch(event, 'beforeInvocation', (action, handlerName) => {
|
|
63
|
+
switch (action.type) {
|
|
64
|
+
case 'deny':
|
|
65
|
+
event.cancel = `DENIED: ${action.reason}`;
|
|
66
|
+
return true;
|
|
67
|
+
case 'guide':
|
|
68
|
+
event.cancel = `GUIDANCE: ${action.feedback}`;
|
|
69
|
+
return false;
|
|
70
|
+
case 'transform':
|
|
71
|
+
action.apply(event);
|
|
72
|
+
return false;
|
|
73
|
+
case 'proceed':
|
|
74
|
+
return false;
|
|
75
|
+
default:
|
|
76
|
+
logger.warn(`handler=<${handlerName}>, event=<beforeInvocation> | ${action.type} has no effect`);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async _onBeforeToolCall(event) {
|
|
82
|
+
return this._dispatch(event, 'beforeToolCall', (action, handlerName) => {
|
|
83
|
+
const actionType = action.type;
|
|
84
|
+
switch (actionType) {
|
|
85
|
+
case 'deny':
|
|
86
|
+
event.cancel = `DENIED: ${action.reason}`;
|
|
87
|
+
return true;
|
|
88
|
+
case 'confirm': {
|
|
89
|
+
// If response is provided, it's passed as a preemptive value to
|
|
90
|
+
// event.interrupt() — the interrupt is registered but never pauses.
|
|
91
|
+
// If no response, event.interrupt() throws InterruptError on first
|
|
92
|
+
// call (pausing the agent for external resume).
|
|
93
|
+
const result = event.interrupt({
|
|
94
|
+
name: handlerName,
|
|
95
|
+
reason: action.prompt,
|
|
96
|
+
...(action.response !== undefined && { response: action.response }),
|
|
97
|
+
});
|
|
98
|
+
const check = action.evaluate ?? defaultEvaluate;
|
|
99
|
+
if (!check(result)) {
|
|
100
|
+
event.cancel = `CONFIRMATION_FAILED: ${action.prompt}`;
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
case 'guide':
|
|
106
|
+
event.cancel = `GUIDANCE: ${action.feedback}`;
|
|
107
|
+
return false;
|
|
108
|
+
case 'transform':
|
|
109
|
+
action.apply(event);
|
|
110
|
+
return false;
|
|
111
|
+
case 'proceed':
|
|
112
|
+
return false;
|
|
113
|
+
default:
|
|
114
|
+
logger.warn(`handler=<${handlerName}>, event=<beforeToolCall> | ${actionType} has no effect`);
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async _onAfterToolCall(event) {
|
|
120
|
+
return this._dispatch(event, 'afterToolCall', (action, handlerName) => {
|
|
121
|
+
switch (action.type) {
|
|
122
|
+
case 'transform':
|
|
123
|
+
action.apply(event);
|
|
124
|
+
return false;
|
|
125
|
+
case 'proceed':
|
|
126
|
+
return false;
|
|
127
|
+
default:
|
|
128
|
+
logger.warn(`handler=<${handlerName}>, event=<afterToolCall> | ${action.type} has no effect`);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// Guide on beforeModelCall injects feedback as a user message so the model sees
|
|
134
|
+
// it on this call, rather than cancelling (which would end the invocation).
|
|
135
|
+
async _onBeforeModelCall(event) {
|
|
136
|
+
return this._dispatch(event, 'beforeModelCall', (action, handlerName) => {
|
|
137
|
+
switch (action.type) {
|
|
138
|
+
case 'deny':
|
|
139
|
+
event.cancel = `DENIED: ${action.reason}`;
|
|
140
|
+
return true;
|
|
141
|
+
case 'guide':
|
|
142
|
+
// Direct push bypasses MessageAddedEvent and conversation manager.
|
|
143
|
+
// This matches what plugins can do today via event.agent.messages.
|
|
144
|
+
event.agent.messages.push(new Message({ role: 'user', content: [new TextBlock(action.feedback)] }));
|
|
145
|
+
return false;
|
|
146
|
+
case 'transform':
|
|
147
|
+
action.apply(event);
|
|
148
|
+
return false;
|
|
149
|
+
case 'proceed':
|
|
150
|
+
return false;
|
|
151
|
+
default:
|
|
152
|
+
logger.warn(`handler=<${handlerName}>, event=<beforeModelCall> | ${action.type} has no effect`);
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async _onAfterModelCall(event) {
|
|
158
|
+
return this._dispatch(event, 'afterModelCall', (action, handlerName) => {
|
|
159
|
+
switch (action.type) {
|
|
160
|
+
case 'guide':
|
|
161
|
+
event.retry = true;
|
|
162
|
+
// Direct push bypasses MessageAddedEvent and conversation manager, so this
|
|
163
|
+
// message won't trigger context management and could push the context over
|
|
164
|
+
// the limit. LocalAgent doesn't expose a message-append method that goes
|
|
165
|
+
// through the hook pipeline. This matches what plugins can do today.
|
|
166
|
+
event.agent.messages.push(new Message({ role: 'user', content: [new TextBlock(action.feedback)] }));
|
|
167
|
+
return false;
|
|
168
|
+
case 'transform':
|
|
169
|
+
action.apply(event);
|
|
170
|
+
return false;
|
|
171
|
+
case 'proceed':
|
|
172
|
+
return false;
|
|
173
|
+
default:
|
|
174
|
+
logger.warn(`handler=<${handlerName}>, event=<afterModelCall> | ${action.type} has no effect`);
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Iterate handlers in registration order and resolve the winning action.
|
|
181
|
+
*
|
|
182
|
+
* - Deny short-circuits immediately (remaining handlers are skipped).
|
|
183
|
+
* - Confirm pauses for human input; if denied short-circuits, if approved continues.
|
|
184
|
+
* - Guide feedback strings accumulate across handlers and are applied at the end.
|
|
185
|
+
* - Transform is applied in-place so later handlers see the mutation.
|
|
186
|
+
* - If a handler throws, behavior depends on {@link InterventionHandler.onError}:
|
|
187
|
+
* `'throw'` (default) rethrows, `'deny'` fails closed, `'proceed'` skips.
|
|
188
|
+
*/
|
|
189
|
+
async _dispatch(event, method, apply) {
|
|
190
|
+
logger.debug(`event=<${method}> | dispatching to ${this._handlers.length} handler(s)`);
|
|
191
|
+
const guides = [];
|
|
192
|
+
for (const handler of this._handlers) {
|
|
193
|
+
if (handler[method] === InterventionHandler.prototype[method])
|
|
194
|
+
continue;
|
|
195
|
+
logger.debug(`handler=<${handler.name}>, event=<${method}> | evaluating`);
|
|
196
|
+
let action;
|
|
197
|
+
try {
|
|
198
|
+
action = await handler[method](event);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
action = this._handleError(handler, method, error);
|
|
202
|
+
if (!action)
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
logger.debug(`handler=<${handler.name}>, event=<${method}> | returned ${action.type}`);
|
|
206
|
+
if (action.type === 'guide') {
|
|
207
|
+
guides.push({ handlerName: handler.name, action });
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
try {
|
|
211
|
+
if (apply(action, handler.name)) {
|
|
212
|
+
logger.debug(`handler=<${handler.name}>, event=<${method}> | short-circuited`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
// InterruptError is intentional control flow (pauses the agent),
|
|
218
|
+
// not a handler failure. Always propagate regardless of onError.
|
|
219
|
+
if (error instanceof InterruptError) {
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
const errorAction = this._handleError(handler, method, error);
|
|
223
|
+
if (errorAction) {
|
|
224
|
+
if (apply(errorAction, handler.name)) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Guide feedback accumulates across handlers. Only applied if
|
|
232
|
+
// no earlier handler short-circuited (deny/confirm).
|
|
233
|
+
if (guides.length > 0) {
|
|
234
|
+
logger.debug(`event=<${method}> | applying accumulated guide from ${guides.length} handler(s)`);
|
|
235
|
+
const feedback = guides.map((g) => `[${g.handlerName}] ${g.action.feedback}`).join('\n');
|
|
236
|
+
apply({ type: 'guide', feedback }, '');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
_handleError(handler, method, error) {
|
|
240
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
241
|
+
if (handler.onError === 'throw') {
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
else if (handler.onError === 'deny') {
|
|
245
|
+
return { type: 'deny', reason: `Handler threw: ${errorMsg}` };
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/interventions/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp.d.ts
CHANGED
|
@@ -57,18 +57,8 @@ export interface McpClientCredentials {
|
|
|
57
57
|
/** OAuth scopes to request. Joined with spaces before sending to the token endpoint. */
|
|
58
58
|
scopes?: string[];
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
61
|
-
export
|
|
62
|
-
/** Pre-constructed transport. Mutually exclusive with `url`. */
|
|
63
|
-
transport?: McpTransport;
|
|
64
|
-
/** Server URL. When provided, a StreamableHTTP transport is constructed automatically. */
|
|
65
|
-
url?: string | URL;
|
|
66
|
-
/** Client credentials for OAuth machine-to-machine auth. Requires `url`. */
|
|
67
|
-
auth?: McpClientCredentials;
|
|
68
|
-
/** Custom OAuth provider for advanced auth flows. Requires `url`. Mutually exclusive with `auth`. */
|
|
69
|
-
authProvider?: OAuthClientProvider;
|
|
70
|
-
/** Custom headers to include on every request to the server. Requires `url`. */
|
|
71
|
-
headers?: Record<string, string>;
|
|
60
|
+
/** Behavioral options shared by all MCP client configurations. */
|
|
61
|
+
export interface McpClientOptions extends RuntimeConfig {
|
|
72
62
|
/** Disable OpenTelemetry MCP instrumentation. */
|
|
73
63
|
disableMcpInstrumentation?: boolean;
|
|
74
64
|
/**
|
|
@@ -84,9 +74,22 @@ export type McpClientConfig = RuntimeConfig & {
|
|
|
84
74
|
*/
|
|
85
75
|
elicitationCallback?: ElicitationCallback;
|
|
86
76
|
/** When true, connection failures are logged as warnings instead of throwing. */
|
|
87
|
-
|
|
77
|
+
continueOnError?: boolean;
|
|
88
78
|
/** Called when the server emits a log message. Defaults to routing through the Strands logger. */
|
|
89
79
|
logHandler?: (params: LoggingMessageNotificationParams) => void;
|
|
80
|
+
}
|
|
81
|
+
/** Arguments for configuring an MCP Client. */
|
|
82
|
+
export type McpClientConfig = McpClientOptions & {
|
|
83
|
+
/** Pre-constructed transport. Mutually exclusive with `url`. */
|
|
84
|
+
transport?: McpTransport;
|
|
85
|
+
/** Server URL. When provided, a StreamableHTTP transport is constructed automatically. */
|
|
86
|
+
url?: string | URL;
|
|
87
|
+
/** Client credentials for OAuth machine-to-machine auth. Requires `url`. */
|
|
88
|
+
auth?: McpClientCredentials;
|
|
89
|
+
/** Custom OAuth provider for advanced auth flows. Requires `url`. Mutually exclusive with `auth`. */
|
|
90
|
+
authProvider?: OAuthClientProvider;
|
|
91
|
+
/** Custom headers to include on every request to the server. Requires `url`. */
|
|
92
|
+
headers?: Record<string, string>;
|
|
90
93
|
};
|
|
91
94
|
/** MCP Client for interacting with Model Context Protocol servers. */
|
|
92
95
|
export declare class McpClient {
|
|
@@ -99,7 +102,7 @@ export declare class McpClient {
|
|
|
99
102
|
private _transport;
|
|
100
103
|
private _state;
|
|
101
104
|
private _client;
|
|
102
|
-
private
|
|
105
|
+
private _continueOnError;
|
|
103
106
|
private _logHandler;
|
|
104
107
|
private _disableMcpInstrumentation;
|
|
105
108
|
private _tasksConfig;
|
|
@@ -115,10 +118,12 @@ export declare class McpClient {
|
|
|
115
118
|
get serverVersion(): Implementation | undefined;
|
|
116
119
|
get serverInstructions(): string | undefined;
|
|
117
120
|
get connectionState(): McpConnectionState;
|
|
121
|
+
get clientName(): string;
|
|
122
|
+
get continueOnError(): boolean;
|
|
118
123
|
/**
|
|
119
124
|
* Connects the MCP client to the server.
|
|
120
125
|
*
|
|
121
|
-
* Called lazily before any operation that requires a connection. When `
|
|
126
|
+
* Called lazily before any operation that requires a connection. When `continueOnError` is true,
|
|
122
127
|
* connection failures are swallowed and the client enters a `'failed'` state — subsequent
|
|
123
128
|
* calls are no-ops until `connect(true)` is called explicitly to retry.
|
|
124
129
|
*
|
package/dist/src/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAG9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAEnF,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gCAAgC,EACtC,MAAM,oCAAoC,CAAA;AAE3C,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAE5F,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,yCAAyC;AACzC,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,WAAW,GAAG,QAAQ,CAAA;AAExE,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp.js
CHANGED
|
@@ -17,7 +17,7 @@ export class McpClient {
|
|
|
17
17
|
_transport;
|
|
18
18
|
_state;
|
|
19
19
|
_client;
|
|
20
|
-
|
|
20
|
+
_continueOnError;
|
|
21
21
|
_logHandler;
|
|
22
22
|
_disableMcpInstrumentation;
|
|
23
23
|
_tasksConfig;
|
|
@@ -31,7 +31,7 @@ export class McpClient {
|
|
|
31
31
|
this._clientVersion = args.applicationVersion || '0.0.1';
|
|
32
32
|
this._transport = McpClient._resolveTransport(args);
|
|
33
33
|
this._state = 'disconnected';
|
|
34
|
-
this.
|
|
34
|
+
this._continueOnError = args.continueOnError ?? false;
|
|
35
35
|
this._logHandler = args.logHandler ?? defaultLogHandler;
|
|
36
36
|
this._tasksConfig = args.tasksConfig;
|
|
37
37
|
this._elicitationCallback = args.elicitationCallback;
|
|
@@ -79,9 +79,10 @@ export class McpClient {
|
|
|
79
79
|
})
|
|
80
80
|
: args.authProvider;
|
|
81
81
|
const url = args.url instanceof URL ? args.url : new URL(args.url);
|
|
82
|
-
return new StreamableHTTPClientTransport(url,
|
|
83
|
-
|
|
84
|
-
:
|
|
82
|
+
return new StreamableHTTPClientTransport(url, {
|
|
83
|
+
...(authProvider && { authProvider }),
|
|
84
|
+
...(args.headers && { requestInit: { headers: args.headers } }),
|
|
85
|
+
});
|
|
85
86
|
}
|
|
86
87
|
get client() {
|
|
87
88
|
return this._client;
|
|
@@ -98,10 +99,16 @@ export class McpClient {
|
|
|
98
99
|
get connectionState() {
|
|
99
100
|
return this._state;
|
|
100
101
|
}
|
|
102
|
+
get clientName() {
|
|
103
|
+
return this._clientName;
|
|
104
|
+
}
|
|
105
|
+
get continueOnError() {
|
|
106
|
+
return this._continueOnError;
|
|
107
|
+
}
|
|
101
108
|
/**
|
|
102
109
|
* Connects the MCP client to the server.
|
|
103
110
|
*
|
|
104
|
-
* Called lazily before any operation that requires a connection. When `
|
|
111
|
+
* Called lazily before any operation that requires a connection. When `continueOnError` is true,
|
|
105
112
|
* connection failures are swallowed and the client enters a `'failed'` state — subsequent
|
|
106
113
|
* calls are no-ops until `connect(true)` is called explicitly to retry.
|
|
107
114
|
*
|
|
@@ -126,10 +133,10 @@ export class McpClient {
|
|
|
126
133
|
this._state = 'connected';
|
|
127
134
|
}
|
|
128
135
|
catch (error) {
|
|
129
|
-
if (!this.
|
|
136
|
+
if (!this._continueOnError)
|
|
130
137
|
throw error;
|
|
131
138
|
this._state = 'failed';
|
|
132
|
-
logger.warn(`client=<${this._clientName}>, error=<${error}> | MCP server failed to connect, continuing
|
|
139
|
+
logger.warn(`client=<${this._clientName}>, error=<${error}> | MCP server failed to connect, continuing (continueOnError)`);
|
|
133
140
|
}
|
|
134
141
|
}
|
|
135
142
|
/**
|
package/dist/src/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAA;AAClG,OAAO,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAA;AAE/F,OAAO,EAAE,UAAU,EAAE,MAAM,qDAAqD,CAAA;AAChF,OAAO,EACL,mBAAmB,EACnB,gCAAgC,GAIjC,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGhE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -216,6 +216,20 @@ describe('AnthropicModel', () => {
|
|
|
216
216
|
});
|
|
217
217
|
expect(events).toContainEqual({ type: 'modelMessageStopEvent', stopReason: 'toolUse' });
|
|
218
218
|
});
|
|
219
|
+
it.each([
|
|
220
|
+
['pause_turn', 'pauseTurn'],
|
|
221
|
+
['refusal', 'refusal'],
|
|
222
|
+
])('maps anthropic stop reason "%s" to "%s"', async (anthropicReason, expected) => {
|
|
223
|
+
const mockClient = createMockClient(async function* () {
|
|
224
|
+
yield { type: 'message_start', message: { role: 'assistant', usage: { input_tokens: 1 } } };
|
|
225
|
+
yield { type: 'message_delta', delta: { stop_reason: anthropicReason }, usage: { output_tokens: 1 } };
|
|
226
|
+
yield { type: 'message_stop' };
|
|
227
|
+
});
|
|
228
|
+
const provider = new AnthropicModel({ client: mockClient });
|
|
229
|
+
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
230
|
+
const events = await collectIterator(provider.stream(messages));
|
|
231
|
+
expect(events).toContainEqual({ type: 'modelMessageStopEvent', stopReason: expected });
|
|
232
|
+
});
|
|
219
233
|
it('handles thinking/reasoning events', async () => {
|
|
220
234
|
const mockClient = createMockClient(async function* () {
|
|
221
235
|
yield { type: 'message_start', message: { role: 'assistant', usage: { input_tokens: 10 } } };
|
|
@@ -289,17 +303,32 @@ describe('AnthropicModel', () => {
|
|
|
289
303
|
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
290
304
|
await expect(collectIterator(provider.stream(messages))).rejects.toThrow('API Error');
|
|
291
305
|
});
|
|
306
|
+
it('maps overload error to ContextWindowOverflowError', async () => {
|
|
307
|
+
const mockClient = createMockClient(async function* () {
|
|
308
|
+
yield { type: 'ping' }; // Satisfy linter require-yield
|
|
309
|
+
throw new Error('prompt is too long');
|
|
310
|
+
});
|
|
311
|
+
const provider = new AnthropicModel({ client: mockClient });
|
|
312
|
+
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
313
|
+
await expect(collectIterator(provider.stream(messages))).rejects.toThrow(ContextWindowOverflowError);
|
|
314
|
+
});
|
|
292
315
|
it.each([
|
|
293
|
-
'PROMPT IS TOO LONG: request exceeds context window',
|
|
294
|
-
'max_tokens exceeded',
|
|
295
|
-
'input too long',
|
|
296
316
|
'input is too long',
|
|
297
317
|
'input length exceeds context window',
|
|
298
318
|
'input and output tokens exceed your context limit',
|
|
299
|
-
])('maps
|
|
319
|
+
])('maps overflow phrase %p to ContextWindowOverflowError', async (phrase) => {
|
|
300
320
|
const mockClient = createMockClient(async function* () {
|
|
301
|
-
yield { type: 'ping' };
|
|
302
|
-
throw new Error(
|
|
321
|
+
yield { type: 'ping' };
|
|
322
|
+
throw new Error(phrase);
|
|
323
|
+
});
|
|
324
|
+
const provider = new AnthropicModel({ client: mockClient });
|
|
325
|
+
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
326
|
+
await expect(collectIterator(provider.stream(messages))).rejects.toThrow(ContextWindowOverflowError);
|
|
327
|
+
});
|
|
328
|
+
it('matches overflow phrases case-insensitively', async () => {
|
|
329
|
+
const mockClient = createMockClient(async function* () {
|
|
330
|
+
yield { type: 'ping' };
|
|
331
|
+
throw new Error('PROMPT IS TOO LONG: 200000 tokens');
|
|
303
332
|
});
|
|
304
333
|
const provider = new AnthropicModel({ client: mockClient });
|
|
305
334
|
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
@@ -320,11 +349,12 @@ describe('AnthropicModel', () => {
|
|
|
320
349
|
describe('request formatting', () => {
|
|
321
350
|
// Helper to capture request arguments
|
|
322
351
|
const setupCapture = () => {
|
|
323
|
-
const captured = { request: null };
|
|
352
|
+
const captured = { request: null, options: null };
|
|
324
353
|
const mockClient = {
|
|
325
354
|
messages: {
|
|
326
|
-
stream: vi.fn((req) => {
|
|
355
|
+
stream: vi.fn((req, opts) => {
|
|
327
356
|
captured.request = req;
|
|
357
|
+
captured.options = opts;
|
|
328
358
|
return (async function* () { })();
|
|
329
359
|
}),
|
|
330
360
|
},
|
|
@@ -471,6 +501,7 @@ describe('AnthropicModel', () => {
|
|
|
471
501
|
const content = captured.request.messages[0].content[0];
|
|
472
502
|
expect(content.type).toBe('document');
|
|
473
503
|
expect(content.source.media_type).toBe('application/pdf');
|
|
504
|
+
expect(content.title).toBe('doc.pdf');
|
|
474
505
|
});
|
|
475
506
|
it('logs warning for unsupported GuardContentBlock in user message', async () => {
|
|
476
507
|
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { }); // Spy on console.warn (via logger)
|
|
@@ -617,6 +648,39 @@ describe('AnthropicModel', () => {
|
|
|
617
648
|
warnSpy.mockRestore();
|
|
618
649
|
});
|
|
619
650
|
});
|
|
651
|
+
describe('Beta headers', () => {
|
|
652
|
+
it('does not pass per-request options when betas is unset', async () => {
|
|
653
|
+
const { captured, mockClient } = setupCapture();
|
|
654
|
+
const provider = new AnthropicModel({ client: mockClient });
|
|
655
|
+
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
656
|
+
await collectIterator(provider.stream(messages));
|
|
657
|
+
expect(captured.options).toBeUndefined();
|
|
658
|
+
});
|
|
659
|
+
it('forwards configured betas as a per-request anthropic-beta header', async () => {
|
|
660
|
+
const { captured, mockClient } = setupCapture();
|
|
661
|
+
const provider = new AnthropicModel({
|
|
662
|
+
client: mockClient,
|
|
663
|
+
betas: ['interleaved-thinking-2025-05-14', 'mcp-client-2025-11-20'],
|
|
664
|
+
});
|
|
665
|
+
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
666
|
+
await collectIterator(provider.stream(messages));
|
|
667
|
+
expect(captured.options).toEqual({
|
|
668
|
+
headers: { 'anthropic-beta': 'interleaved-thinking-2025-05-14,mcp-client-2025-11-20' },
|
|
669
|
+
});
|
|
670
|
+
});
|
|
671
|
+
it('reflects updateConfig({ betas }) on the next request', async () => {
|
|
672
|
+
const { captured, mockClient } = setupCapture();
|
|
673
|
+
const provider = new AnthropicModel({ client: mockClient });
|
|
674
|
+
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
675
|
+
await collectIterator(provider.stream(messages));
|
|
676
|
+
expect(captured.options).toBeUndefined();
|
|
677
|
+
provider.updateConfig({ betas: ['interleaved-thinking-2025-05-14'] });
|
|
678
|
+
await collectIterator(provider.stream(messages));
|
|
679
|
+
expect(captured.options).toEqual({
|
|
680
|
+
headers: { 'anthropic-beta': 'interleaved-thinking-2025-05-14' },
|
|
681
|
+
});
|
|
682
|
+
});
|
|
683
|
+
});
|
|
620
684
|
});
|
|
621
685
|
describe('countTokens', () => {
|
|
622
686
|
const messages = [new Message({ role: 'user', content: [new TextBlock('hello')] })];
|