@strands-agents/sdk 1.0.0 → 1.2.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 +6 -0
- package/dist/src/__fixtures__/agent-helpers.d.ts +16 -1
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +42 -0
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts +2 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +20 -3
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/__tests__/interrupt.test.d.ts +2 -0
- package/dist/src/__tests__/interrupt.test.d.ts.map +1 -0
- package/dist/src/__tests__/interrupt.test.js +264 -0
- package/dist/src/__tests__/interrupt.test.js.map +1 -0
- package/dist/src/__tests__/mcp.test.js +447 -7
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.hook.test.js +551 -1
- package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.js +779 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.js +161 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.test.js +174 -0
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/snapshot.test.js +148 -4
- package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
- package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
- package/dist/src/agent/agent-as-tool.js +2 -3
- package/dist/src/agent/agent-as-tool.js.map +1 -1
- package/dist/src/agent/agent.d.ts +94 -4
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +625 -223
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/snapshot.d.ts +11 -19
- package/dist/src/agent/snapshot.d.ts.map +1 -1
- package/dist/src/agent/snapshot.js +23 -19
- package/dist/src/agent/snapshot.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +230 -9
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +19 -6
- 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 +422 -41
- 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 +75 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.d.ts +67 -22
- package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.js +65 -13
- package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/index.d.ts +1 -1
- package/dist/src/conversation-manager/index.d.ts.map +1 -1
- package/dist/src/conversation-manager/index.js +1 -1
- package/dist/src/conversation-manager/index.js.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +43 -10
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +202 -45
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +23 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.js +39 -17
- package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
- package/dist/src/hooks/__tests__/events.test.js +99 -12
- package/dist/src/hooks/__tests__/events.test.js.map +1 -1
- package/dist/src/hooks/__tests__/registry.test.js +166 -2
- package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +125 -32
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js +111 -8
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +4 -3
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +2 -1
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/registry.d.ts +12 -12
- package/dist/src/hooks/registry.d.ts.map +1 -1
- package/dist/src/hooks/registry.js +55 -15
- package/dist/src/hooks/registry.js.map +1 -1
- package/dist/src/hooks/types.d.ts +23 -0
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/hooks/types.js +17 -1
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/index.d.ts +12 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/interrupt.d.ts +247 -0
- package/dist/src/interrupt.d.ts.map +1 -0
- package/dist/src/interrupt.js +316 -0
- package/dist/src/interrupt.js.map +1 -0
- package/dist/src/mcp.d.ts +61 -4
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +161 -25
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/models/__tests__/anthropic.test.js +78 -8
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +156 -18
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/defaults.test.d.ts +2 -0
- package/dist/src/models/__tests__/defaults.test.d.ts.map +1 -0
- package/dist/src/models/__tests__/defaults.test.js +36 -0
- package/dist/src/models/__tests__/defaults.test.js.map +1 -0
- package/dist/src/models/__tests__/google.test.js +72 -6
- package/dist/src/models/__tests__/google.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 +14 -4
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts +17 -3
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +80 -13
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/defaults.d.ts +10 -0
- package/dist/src/models/defaults.d.ts.map +1 -1
- package/dist/src/models/defaults.js +129 -0
- package/dist/src/models/defaults.js.map +1 -1
- package/dist/src/models/google/model.d.ts.map +1 -1
- package/dist/src/models/google/model.js +4 -2
- package/dist/src/models/google/model.js.map +1 -1
- package/dist/src/models/google/types.d.ts +10 -0
- package/dist/src/models/google/types.d.ts.map +1 -1
- package/dist/src/models/model.d.ts +15 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +18 -0
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/openai/__tests__/chat.test.js +55 -2
- package/dist/src/models/openai/__tests__/chat.test.js.map +1 -1
- package/dist/src/models/openai/__tests__/responses.test.js +19 -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 +7 -4
- package/dist/src/models/openai/errors.js.map +1 -1
- package/dist/src/models/openai/model.d.ts.map +1 -1
- package/dist/src/models/openai/model.js +2 -2
- package/dist/src/models/openai/model.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.test.js +69 -0
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.tracer.test.js +14 -0
- package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/interrupts.test.js +390 -0
- package/dist/src/multiagent/__tests__/interrupts.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/nodes.test.js +13 -0
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/state.test.js +139 -1
- package/dist/src/multiagent/__tests__/state.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/swarm.test.js +77 -0
- package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
- package/dist/src/multiagent/events.d.ts +15 -1
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +18 -0
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +59 -3
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +201 -34
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/multiagent/multiagent.d.ts +77 -3
- package/dist/src/multiagent/multiagent.d.ts.map +1 -1
- package/dist/src/multiagent/multiagent.js +115 -1
- package/dist/src/multiagent/multiagent.js.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +18 -0
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +69 -22
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/state.d.ts +39 -3
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js +80 -1
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +30 -1
- package/dist/src/multiagent/swarm.d.ts.map +1 -1
- package/dist/src/multiagent/swarm.js +166 -33
- package/dist/src/multiagent/swarm.js.map +1 -1
- package/dist/src/registry/__tests__/tool-registry.test.js +37 -0
- package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
- package/dist/src/registry/tool-registry.d.ts +13 -7
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +35 -10
- package/dist/src/registry/tool-registry.js.map +1 -1
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +2 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +1 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.js +116 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.js.map +1 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +2 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +1 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +225 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +1 -0
- package/dist/src/retry/backoff-strategy.d.ts +108 -0
- package/dist/src/retry/backoff-strategy.d.ts.map +1 -0
- package/dist/src/retry/backoff-strategy.js +86 -0
- package/dist/src/retry/backoff-strategy.js.map +1 -0
- package/dist/src/retry/default-model-retry-strategy.d.ts +76 -0
- package/dist/src/retry/default-model-retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/default-model-retry-strategy.js +104 -0
- package/dist/src/retry/default-model-retry-strategy.js.map +1 -0
- package/dist/src/retry/index.d.ts +8 -0
- package/dist/src/retry/index.d.ts.map +1 -0
- package/dist/src/retry/index.js +7 -0
- package/dist/src/retry/index.js.map +1 -0
- package/dist/src/retry/model-retry-strategy.d.ts +80 -0
- package/dist/src/retry/model-retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/model-retry-strategy.js +85 -0
- package/dist/src/retry/model-retry-strategy.js.map +1 -0
- package/dist/src/retry/retry-strategy.d.ts +34 -0
- package/dist/src/retry/retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/retry-strategy.js +25 -0
- package/dist/src/retry/retry-strategy.js.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.js +84 -3
- package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +11 -2
- package/dist/src/session/session-manager.d.ts.map +1 -1
- package/dist/src/session/session-manager.js +17 -6
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/telemetry/__tests__/meter.test.js +5 -27
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
- package/dist/src/telemetry/meter.d.ts +12 -4
- package/dist/src/telemetry/meter.d.ts.map +1 -1
- package/dist/src/telemetry/meter.js +13 -8
- package/dist/src/telemetry/meter.js.map +1 -1
- package/dist/src/tools/__tests__/tool.test.js +24 -1
- package/dist/src/tools/__tests__/tool.test.js.map +1 -1
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +6 -1
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts.map +1 -1
- package/dist/src/tools/mcp-tool.js +3 -2
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/tool.d.ts +10 -1
- package/dist/src/tools/tool.d.ts.map +1 -1
- package/dist/src/tools/tool.js +12 -0
- package/dist/src/tools/tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/agent.test.js +97 -0
- package/dist/src/types/__tests__/agent.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +48 -8
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +28 -3
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/interrupt.d.ts +103 -0
- package/dist/src/types/interrupt.d.ts.map +1 -0
- package/dist/src/types/interrupt.js +63 -0
- package/dist/src/types/interrupt.js.map +1 -0
- package/dist/src/types/messages.d.ts +2 -1
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +292 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +148 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +78 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/index.d.ts +23 -0
- package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/index.js +21 -0
- package/dist/src/vended-plugins/context-offloader/index.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts +48 -0
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/plugin.js +244 -0
- package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/storage.d.ts +114 -0
- package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/storage.js +204 -0
- package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -0
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +12 -0
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +3 -0
- 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 +0 -3
- package/dist/src/vended-tools/bash/bash.js.map +1 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +3 -0
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +3 -0
- 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/package.json +9 -5
package/dist/src/mcp.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
2
|
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
4
|
+
import { type ServerCapabilities, type Implementation, type LoggingMessageNotificationParams } from '@modelcontextprotocol/sdk/types.js';
|
|
3
5
|
import type { JSONValue } from './types/json.js';
|
|
4
6
|
import type { ElicitationCallback } from './types/elicitation.js';
|
|
5
7
|
import { McpTool } from './tools/mcp-tool.js';
|
|
@@ -41,9 +43,32 @@ export interface TasksConfig {
|
|
|
41
43
|
*/
|
|
42
44
|
pollTimeout?: number;
|
|
43
45
|
}
|
|
46
|
+
/** Connection state of an MCP client. */
|
|
47
|
+
export type McpConnectionState = 'disconnected' | 'connected' | 'failed';
|
|
48
|
+
/** Options for MCP tool invocation. */
|
|
49
|
+
export interface McpCallToolOptions {
|
|
50
|
+
/** AbortSignal to cancel the in-flight request. */
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
}
|
|
53
|
+
/** OAuth client credentials for machine-to-machine authentication. */
|
|
54
|
+
export interface McpClientCredentials {
|
|
55
|
+
clientId: string;
|
|
56
|
+
clientSecret: string;
|
|
57
|
+
/** OAuth scopes to request. Joined with spaces before sending to the token endpoint. */
|
|
58
|
+
scopes?: string[];
|
|
59
|
+
}
|
|
44
60
|
/** Arguments for configuring an MCP Client. */
|
|
45
61
|
export type McpClientConfig = RuntimeConfig & {
|
|
46
|
-
transport
|
|
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>;
|
|
47
72
|
/** Disable OpenTelemetry MCP instrumentation. */
|
|
48
73
|
disableMcpInstrumentation?: boolean;
|
|
49
74
|
/**
|
|
@@ -58,6 +83,10 @@ export type McpClientConfig = RuntimeConfig & {
|
|
|
58
83
|
* and routes incoming elicitation requests to this callback.
|
|
59
84
|
*/
|
|
60
85
|
elicitationCallback?: ElicitationCallback;
|
|
86
|
+
/** When true, connection failures are logged as warnings instead of throwing. */
|
|
87
|
+
failOpen?: boolean;
|
|
88
|
+
/** Called when the server emits a log message. Defaults to routing through the Strands logger. */
|
|
89
|
+
logHandler?: (params: LoggingMessageNotificationParams) => void;
|
|
61
90
|
};
|
|
62
91
|
/** MCP Client for interacting with Model Context Protocol servers. */
|
|
63
92
|
export declare class McpClient {
|
|
@@ -68,18 +97,32 @@ export declare class McpClient {
|
|
|
68
97
|
private _clientName;
|
|
69
98
|
private _clientVersion;
|
|
70
99
|
private _transport;
|
|
71
|
-
private
|
|
100
|
+
private _state;
|
|
72
101
|
private _client;
|
|
102
|
+
private _failOpen;
|
|
103
|
+
private _logHandler;
|
|
73
104
|
private _disableMcpInstrumentation;
|
|
74
105
|
private _tasksConfig;
|
|
75
106
|
private _elicitationCallback;
|
|
107
|
+
private _registeredToolNames;
|
|
108
|
+
private _onToolsChanged;
|
|
109
|
+
private _refreshingTools;
|
|
110
|
+
private _pendingRefresh;
|
|
76
111
|
constructor(args: McpClientConfig);
|
|
112
|
+
private static _resolveTransport;
|
|
77
113
|
get client(): Client;
|
|
114
|
+
get serverCapabilities(): ServerCapabilities | undefined;
|
|
115
|
+
get serverVersion(): Implementation | undefined;
|
|
116
|
+
get serverInstructions(): string | undefined;
|
|
117
|
+
get connectionState(): McpConnectionState;
|
|
78
118
|
/**
|
|
79
119
|
* Connects the MCP client to the server.
|
|
80
120
|
*
|
|
81
|
-
*
|
|
121
|
+
* Called lazily before any operation that requires a connection. When `failOpen` is true,
|
|
122
|
+
* connection failures are swallowed and the client enters a `'failed'` state — subsequent
|
|
123
|
+
* calls are no-ops until `connect(true)` is called explicitly to retry.
|
|
82
124
|
*
|
|
125
|
+
* @param reconnect - When true, forces a reconnect even if already connected or failed.
|
|
83
126
|
* @returns A promise that resolves when the connection is established.
|
|
84
127
|
*/
|
|
85
128
|
connect(reconnect?: boolean): Promise<void>;
|
|
@@ -89,12 +132,25 @@ export declare class McpClient {
|
|
|
89
132
|
* @returns A promise that resolves when the disconnection is complete.
|
|
90
133
|
*/
|
|
91
134
|
disconnect(): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Enables the `await using` pattern for automatic resource cleanup.
|
|
137
|
+
* Delegates to {@link McpClient.disconnect}.
|
|
138
|
+
*/
|
|
139
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
92
140
|
/**
|
|
93
141
|
* Lists the tools available on the server and returns them as executable McpTool instances.
|
|
94
142
|
*
|
|
95
143
|
* @returns A promise that resolves with an array of McpTool instances.
|
|
96
144
|
*/
|
|
97
145
|
listTools(): Promise<McpTool[]>;
|
|
146
|
+
/**
|
|
147
|
+
* Sets a callback invoked when the MCP server's tool list changes at runtime.
|
|
148
|
+
*
|
|
149
|
+
* @param callback - Handler receiving the previous tool names and the refreshed tool instances,
|
|
150
|
+
* or undefined to remove the callback.
|
|
151
|
+
*/
|
|
152
|
+
set onToolsChanged(callback: ((oldTools: string[], newTools: McpTool[]) => void) | undefined);
|
|
153
|
+
private _handleToolsChanged;
|
|
98
154
|
/**
|
|
99
155
|
* Invoke a tool on the connected MCP server using an McpTool instance.
|
|
100
156
|
*
|
|
@@ -104,8 +160,9 @@ export declare class McpClient {
|
|
|
104
160
|
*
|
|
105
161
|
* @param tool - The McpTool instance to invoke.
|
|
106
162
|
* @param args - The arguments to pass to the tool.
|
|
163
|
+
* @param options - Optional settings for the request.
|
|
107
164
|
* @returns A promise that resolves with the result of the tool invocation.
|
|
108
165
|
*/
|
|
109
|
-
callTool(tool: McpTool, args: JSONValue): Promise<JSONValue>;
|
|
166
|
+
callTool(tool: McpTool, args: JSONValue, options?: McpCallToolOptions): Promise<JSONValue>;
|
|
110
167
|
}
|
|
111
168
|
//# sourceMappingURL=mcp.d.ts.map
|
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;
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
import { ClientCredentialsProvider } from '@modelcontextprotocol/sdk/client/auth-extensions.js';
|
|
2
4
|
import { takeResult } from '@modelcontextprotocol/sdk/shared/responseMessage.js';
|
|
3
|
-
import { ElicitRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { ElicitRequestSchema, LoggingMessageNotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
6
|
import { context, propagation, trace } from '@opentelemetry/api';
|
|
5
7
|
import { McpTool } from './tools/mcp-tool.js';
|
|
6
8
|
import { logger } from './logging/index.js';
|
|
@@ -13,41 +15,105 @@ export class McpClient {
|
|
|
13
15
|
_clientName;
|
|
14
16
|
_clientVersion;
|
|
15
17
|
_transport;
|
|
16
|
-
|
|
18
|
+
_state;
|
|
17
19
|
_client;
|
|
20
|
+
_failOpen;
|
|
21
|
+
_logHandler;
|
|
18
22
|
_disableMcpInstrumentation;
|
|
19
23
|
_tasksConfig;
|
|
20
24
|
_elicitationCallback;
|
|
25
|
+
_registeredToolNames = new Set();
|
|
26
|
+
_onToolsChanged;
|
|
27
|
+
_refreshingTools = false;
|
|
28
|
+
_pendingRefresh = false;
|
|
21
29
|
constructor(args) {
|
|
22
30
|
this._clientName = args.applicationName || 'strands-agents-ts-sdk';
|
|
23
31
|
this._clientVersion = args.applicationVersion || '0.0.1';
|
|
24
|
-
this._transport = args
|
|
25
|
-
this.
|
|
32
|
+
this._transport = McpClient._resolveTransport(args);
|
|
33
|
+
this._state = 'disconnected';
|
|
34
|
+
this._failOpen = args.failOpen ?? false;
|
|
35
|
+
this._logHandler = args.logHandler ?? defaultLogHandler;
|
|
26
36
|
this._tasksConfig = args.tasksConfig;
|
|
27
37
|
this._elicitationCallback = args.elicitationCallback;
|
|
28
38
|
this._client = new Client({
|
|
29
39
|
name: this._clientName,
|
|
30
40
|
version: this._clientVersion,
|
|
31
|
-
},
|
|
41
|
+
}, {
|
|
42
|
+
...(this._elicitationCallback ? { capabilities: { elicitation: { form: {}, url: {} } } } : undefined),
|
|
43
|
+
listChanged: {
|
|
44
|
+
tools: {
|
|
45
|
+
autoRefresh: false,
|
|
46
|
+
debounceMs: 300,
|
|
47
|
+
onChanged: () => {
|
|
48
|
+
this._handleToolsChanged();
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
this._client.setNotificationHandler(LoggingMessageNotificationSchema, (notification) => {
|
|
54
|
+
this._logHandler(notification.params);
|
|
55
|
+
});
|
|
32
56
|
this._disableMcpInstrumentation = args.disableMcpInstrumentation ?? false;
|
|
33
57
|
}
|
|
58
|
+
static _resolveTransport(args) {
|
|
59
|
+
if (args.transport && args.url) {
|
|
60
|
+
throw new Error('McpClientConfig: provide either "transport" or "url", not both');
|
|
61
|
+
}
|
|
62
|
+
if (!args.transport && !args.url) {
|
|
63
|
+
throw new Error('McpClientConfig: either "transport" or "url" must be provided');
|
|
64
|
+
}
|
|
65
|
+
if (args.transport) {
|
|
66
|
+
if (args.auth || args.authProvider || args.headers) {
|
|
67
|
+
throw new Error('McpClientConfig: "auth", "authProvider", and "headers" require "url" (not compatible with "transport")');
|
|
68
|
+
}
|
|
69
|
+
return args.transport;
|
|
70
|
+
}
|
|
71
|
+
if (args.auth && args.authProvider) {
|
|
72
|
+
throw new Error('McpClientConfig: provide either "auth" or "authProvider", not both');
|
|
73
|
+
}
|
|
74
|
+
const authProvider = args.auth
|
|
75
|
+
? new ClientCredentialsProvider({
|
|
76
|
+
clientId: args.auth.clientId,
|
|
77
|
+
clientSecret: args.auth.clientSecret,
|
|
78
|
+
...(args.auth.scopes && { scope: args.auth.scopes.join(' ') }),
|
|
79
|
+
})
|
|
80
|
+
: args.authProvider;
|
|
81
|
+
const url = args.url instanceof URL ? args.url : new URL(args.url);
|
|
82
|
+
return new StreamableHTTPClientTransport(url, authProvider || args.headers
|
|
83
|
+
? { ...(authProvider && { authProvider }), ...(args.headers && { requestInit: { headers: args.headers } }) }
|
|
84
|
+
: undefined);
|
|
85
|
+
}
|
|
34
86
|
get client() {
|
|
35
87
|
return this._client;
|
|
36
88
|
}
|
|
89
|
+
get serverCapabilities() {
|
|
90
|
+
return this._client.getServerCapabilities();
|
|
91
|
+
}
|
|
92
|
+
get serverVersion() {
|
|
93
|
+
return this._client.getServerVersion();
|
|
94
|
+
}
|
|
95
|
+
get serverInstructions() {
|
|
96
|
+
return this._client.getInstructions();
|
|
97
|
+
}
|
|
98
|
+
get connectionState() {
|
|
99
|
+
return this._state;
|
|
100
|
+
}
|
|
37
101
|
/**
|
|
38
102
|
* Connects the MCP client to the server.
|
|
39
103
|
*
|
|
40
|
-
*
|
|
104
|
+
* Called lazily before any operation that requires a connection. When `failOpen` is true,
|
|
105
|
+
* connection failures are swallowed and the client enters a `'failed'` state — subsequent
|
|
106
|
+
* calls are no-ops until `connect(true)` is called explicitly to retry.
|
|
41
107
|
*
|
|
108
|
+
* @param reconnect - When true, forces a reconnect even if already connected or failed.
|
|
42
109
|
* @returns A promise that resolves when the connection is established.
|
|
43
110
|
*/
|
|
44
111
|
async connect(reconnect = false) {
|
|
45
|
-
if (this.
|
|
112
|
+
if (this._state !== 'disconnected' && !reconnect)
|
|
46
113
|
return;
|
|
47
|
-
|
|
48
|
-
if (this._connected && reconnect) {
|
|
114
|
+
if (this._state === 'connected' && reconnect) {
|
|
49
115
|
await this._client.close();
|
|
50
|
-
this.
|
|
116
|
+
this._state = 'disconnected';
|
|
51
117
|
}
|
|
52
118
|
if (this._elicitationCallback) {
|
|
53
119
|
const callback = this._elicitationCallback;
|
|
@@ -55,8 +121,16 @@ export class McpClient {
|
|
|
55
121
|
return await callback(extra, request.params);
|
|
56
122
|
});
|
|
57
123
|
}
|
|
58
|
-
|
|
59
|
-
|
|
124
|
+
try {
|
|
125
|
+
await this._client.connect(this._transport);
|
|
126
|
+
this._state = 'connected';
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (!this._failOpen)
|
|
130
|
+
throw error;
|
|
131
|
+
this._state = 'failed';
|
|
132
|
+
logger.warn(`client=<${this._clientName}>, error=<${error}> | MCP server failed to connect, continuing with failOpen`);
|
|
133
|
+
}
|
|
60
134
|
}
|
|
61
135
|
/**
|
|
62
136
|
* Disconnects the MCP client from the server and cleans up resources.
|
|
@@ -67,7 +141,14 @@ export class McpClient {
|
|
|
67
141
|
// Must be done sequentially
|
|
68
142
|
await this._client.close();
|
|
69
143
|
await this._transport.close();
|
|
70
|
-
this.
|
|
144
|
+
this._state = 'disconnected';
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Enables the `await using` pattern for automatic resource cleanup.
|
|
148
|
+
* Delegates to {@link McpClient.disconnect}.
|
|
149
|
+
*/
|
|
150
|
+
async [Symbol.asyncDispose]() {
|
|
151
|
+
await this.disconnect();
|
|
71
152
|
}
|
|
72
153
|
/**
|
|
73
154
|
* Lists the tools available on the server and returns them as executable McpTool instances.
|
|
@@ -76,16 +157,52 @@ export class McpClient {
|
|
|
76
157
|
*/
|
|
77
158
|
async listTools() {
|
|
78
159
|
await this.connect();
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
160
|
+
if (this._state === 'failed')
|
|
161
|
+
return [];
|
|
162
|
+
const tools = [];
|
|
163
|
+
let cursor;
|
|
164
|
+
do {
|
|
165
|
+
const result = await this._client.listTools(cursor ? { cursor } : undefined);
|
|
166
|
+
tools.push(...result.tools.map((toolSpec) => new McpTool({
|
|
83
167
|
name: toolSpec.name,
|
|
84
|
-
description: toolSpec.description
|
|
168
|
+
description: toolSpec.description || `Tool which performs ${toolSpec.name}`,
|
|
85
169
|
inputSchema: toolSpec.inputSchema,
|
|
86
170
|
client: this,
|
|
87
|
-
});
|
|
88
|
-
|
|
171
|
+
})));
|
|
172
|
+
cursor = result.nextCursor;
|
|
173
|
+
} while (cursor);
|
|
174
|
+
this._registeredToolNames = new Set(tools.map((t) => t.name));
|
|
175
|
+
return tools;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Sets a callback invoked when the MCP server's tool list changes at runtime.
|
|
179
|
+
*
|
|
180
|
+
* @param callback - Handler receiving the previous tool names and the refreshed tool instances,
|
|
181
|
+
* or undefined to remove the callback.
|
|
182
|
+
*/
|
|
183
|
+
set onToolsChanged(callback) {
|
|
184
|
+
this._onToolsChanged = callback;
|
|
185
|
+
}
|
|
186
|
+
async _handleToolsChanged() {
|
|
187
|
+
if (this._refreshingTools) {
|
|
188
|
+
this._pendingRefresh = true;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
this._refreshingTools = true;
|
|
192
|
+
try {
|
|
193
|
+
do {
|
|
194
|
+
this._pendingRefresh = false;
|
|
195
|
+
const oldTools = [...this._registeredToolNames];
|
|
196
|
+
const newTools = await this.listTools();
|
|
197
|
+
this._onToolsChanged?.(oldTools, newTools);
|
|
198
|
+
} while (this._pendingRefresh);
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
logger.warn(`client=<${this._clientName}>, error=<${err}> | failed to refresh tools after toolsChanged notification`);
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
this._refreshingTools = false;
|
|
205
|
+
}
|
|
89
206
|
}
|
|
90
207
|
/**
|
|
91
208
|
* Invoke a tool on the connected MCP server using an McpTool instance.
|
|
@@ -96,12 +213,15 @@ export class McpClient {
|
|
|
96
213
|
*
|
|
97
214
|
* @param tool - The McpTool instance to invoke.
|
|
98
215
|
* @param args - The arguments to pass to the tool.
|
|
216
|
+
* @param options - Optional settings for the request.
|
|
99
217
|
* @returns A promise that resolves with the result of the tool invocation.
|
|
100
218
|
*/
|
|
101
|
-
async callTool(tool, args) {
|
|
219
|
+
async callTool(tool, args, options) {
|
|
102
220
|
await this.connect();
|
|
221
|
+
if (this._state === 'failed')
|
|
222
|
+
throw new Error('MCP server failed to connect. Call connect(true) to retry.');
|
|
103
223
|
if (args === null || args === undefined) {
|
|
104
|
-
return await this.callTool(tool, {});
|
|
224
|
+
return await this.callTool(tool, {}, options);
|
|
105
225
|
}
|
|
106
226
|
if (typeof args !== 'object' || Array.isArray(args)) {
|
|
107
227
|
throw new Error(`MCP Protocol Error: Tool arguments must be a JSON Object (named parameters). Received: ${Array.isArray(args) ? 'Array' : typeof args}`);
|
|
@@ -111,20 +231,36 @@ export class McpClient {
|
|
|
111
231
|
const toolArgs = enhancedArgs;
|
|
112
232
|
// When tasksConfig is undefined, call tools directly without task management
|
|
113
233
|
if (this._tasksConfig === undefined) {
|
|
114
|
-
return (await this._client.callTool({ name: tool.name, arguments: toolArgs }));
|
|
234
|
+
return (await this._client.callTool({ name: tool.name, arguments: toolArgs }, undefined, options));
|
|
115
235
|
}
|
|
116
236
|
// When tasksConfig is defined (even as empty object), use task-based invocation
|
|
117
237
|
// which supports long-running tools with progress tracking
|
|
118
|
-
const stream = this._client.experimental.tasks.callToolStream({ name: tool.name, arguments: toolArgs }, undefined,
|
|
119
|
-
{
|
|
238
|
+
const stream = this._client.experimental.tasks.callToolStream({ name: tool.name, arguments: toolArgs }, undefined, {
|
|
120
239
|
timeout: this._tasksConfig.ttl ?? McpClient.DEFAULT_TTL,
|
|
121
240
|
maxTotalTimeout: this._tasksConfig.pollTimeout ?? McpClient.DEFAULT_POLL_TIMEOUT,
|
|
122
241
|
resetTimeoutOnProgress: true,
|
|
242
|
+
...options,
|
|
123
243
|
});
|
|
124
244
|
const result = await takeResult(stream);
|
|
125
245
|
return result;
|
|
126
246
|
}
|
|
127
247
|
}
|
|
248
|
+
function defaultLogHandler(params) {
|
|
249
|
+
const { level, logger: serverLogger, data } = params;
|
|
250
|
+
const message = `logger=<${serverLogger ?? 'mcp'}>, data=<${JSON.stringify(data)}> | MCP server log`;
|
|
251
|
+
if (level === 'debug') {
|
|
252
|
+
logger.debug(message);
|
|
253
|
+
}
|
|
254
|
+
else if (level === 'info' || level === 'notice') {
|
|
255
|
+
logger.info(message);
|
|
256
|
+
}
|
|
257
|
+
else if (level === 'warning') {
|
|
258
|
+
logger.warn(message);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
logger.error(message);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
128
264
|
/**
|
|
129
265
|
* Injects OpenTelemetry trace context into MCP tool call arguments.
|
|
130
266
|
* Returns the args with a `_meta` field containing W3C traceparent headers.
|
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,UAAU,EAAE,MAAM,qDAAqD,CAAA;AAChF,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,6 +100,41 @@ describe('AnthropicModel', () => {
|
|
|
100
100
|
new AnthropicModel({ apiKey: 'sk-ant-test', modelId: 'claude-3-opus-20240229' });
|
|
101
101
|
expect(warnOnce).not.toHaveBeenCalledWith(expect.objectContaining({ warn: expect.any(Function) }), expect.stringContaining('using default modelId'));
|
|
102
102
|
});
|
|
103
|
+
it('auto-populates contextWindowLimit from model ID lookup', () => {
|
|
104
|
+
const provider = new AnthropicModel({ apiKey: 'sk-test', modelId: 'claude-sonnet-4-20250514' });
|
|
105
|
+
expect(provider.getConfig()).toStrictEqual({
|
|
106
|
+
modelId: 'claude-sonnet-4-20250514',
|
|
107
|
+
maxTokens: 64_000,
|
|
108
|
+
contextWindowLimit: 1_000_000,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
it('auto-populates contextWindowLimit for default model ID', () => {
|
|
112
|
+
const provider = new AnthropicModel({ apiKey: 'sk-test' });
|
|
113
|
+
expect(provider.getConfig()).toStrictEqual({
|
|
114
|
+
modelId: 'claude-sonnet-4-6',
|
|
115
|
+
maxTokens: 64_000,
|
|
116
|
+
contextWindowLimit: 1_000_000,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
it('does not override explicit contextWindowLimit', () => {
|
|
120
|
+
const provider = new AnthropicModel({
|
|
121
|
+
apiKey: 'sk-test',
|
|
122
|
+
modelId: 'claude-sonnet-4-20250514',
|
|
123
|
+
contextWindowLimit: 100_000,
|
|
124
|
+
});
|
|
125
|
+
expect(provider.getConfig()).toStrictEqual({
|
|
126
|
+
modelId: 'claude-sonnet-4-20250514',
|
|
127
|
+
maxTokens: 64_000,
|
|
128
|
+
contextWindowLimit: 100_000,
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
it('leaves contextWindowLimit undefined for unknown model IDs', () => {
|
|
132
|
+
const provider = new AnthropicModel({ apiKey: 'sk-test', modelId: 'unknown-model' });
|
|
133
|
+
expect(provider.getConfig()).toStrictEqual({
|
|
134
|
+
modelId: 'unknown-model',
|
|
135
|
+
maxTokens: 64_000,
|
|
136
|
+
});
|
|
137
|
+
});
|
|
103
138
|
});
|
|
104
139
|
describe('updateConfig', () => {
|
|
105
140
|
it('merges new config with existing config', () => {
|
|
@@ -110,6 +145,18 @@ describe('AnthropicModel', () => {
|
|
|
110
145
|
maxTokens: 8192,
|
|
111
146
|
});
|
|
112
147
|
});
|
|
148
|
+
it('re-resolves contextWindowLimit when modelId changes and it was auto-resolved', () => {
|
|
149
|
+
const provider = new AnthropicModel({ apiKey: 'sk-test' });
|
|
150
|
+
expect(provider.getConfig().contextWindowLimit).toBe(1_000_000); // claude-sonnet-4-6 default
|
|
151
|
+
provider.updateConfig({ modelId: 'claude-sonnet-4-20250514' });
|
|
152
|
+
expect(provider.getConfig().contextWindowLimit).toBe(1_000_000); // claude-sonnet-4-20250514 value
|
|
153
|
+
});
|
|
154
|
+
it('preserves explicit contextWindowLimit when modelId changes', () => {
|
|
155
|
+
const provider = new AnthropicModel({ apiKey: 'sk-test', contextWindowLimit: 50_000 });
|
|
156
|
+
expect(provider.getConfig().contextWindowLimit).toBe(50_000);
|
|
157
|
+
provider.updateConfig({ modelId: 'claude-sonnet-4-20250514' });
|
|
158
|
+
expect(provider.getConfig().contextWindowLimit).toBe(50_000); // preserved
|
|
159
|
+
});
|
|
113
160
|
});
|
|
114
161
|
describe('stream event handling', () => {
|
|
115
162
|
it('yields correct event sequence for simple text response', async () => {
|
|
@@ -242,10 +289,17 @@ describe('AnthropicModel', () => {
|
|
|
242
289
|
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
243
290
|
await expect(collectIterator(provider.stream(messages))).rejects.toThrow('API Error');
|
|
244
291
|
});
|
|
245
|
-
it(
|
|
292
|
+
it.each([
|
|
293
|
+
'PROMPT IS TOO LONG: request exceeds context window',
|
|
294
|
+
'max_tokens exceeded',
|
|
295
|
+
'input too long',
|
|
296
|
+
'input is too long',
|
|
297
|
+
'input length exceeds context window',
|
|
298
|
+
'input and output tokens exceed your context limit',
|
|
299
|
+
])('maps context overflow error "%s" to ContextWindowOverflowError', async (message) => {
|
|
246
300
|
const mockClient = createMockClient(async function* () {
|
|
247
301
|
yield { type: 'ping' }; // Satisfy linter require-yield
|
|
248
|
-
throw new Error(
|
|
302
|
+
throw new Error(message);
|
|
249
303
|
});
|
|
250
304
|
const provider = new AnthropicModel({ client: mockClient });
|
|
251
305
|
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
@@ -577,10 +631,18 @@ describe('AnthropicModel', () => {
|
|
|
577
631
|
},
|
|
578
632
|
};
|
|
579
633
|
}
|
|
634
|
+
it('should use heuristic by default when useNativeTokenCount is not set', async () => {
|
|
635
|
+
const mockCountTokens = vi.fn();
|
|
636
|
+
const client = createCountTokensClient(mockCountTokens);
|
|
637
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6' });
|
|
638
|
+
const result = await model.countTokens(messages);
|
|
639
|
+
expect(mockCountTokens).not.toHaveBeenCalled();
|
|
640
|
+
expect(result).toBe(2); // heuristic: Math.ceil('hello'.length / 4)
|
|
641
|
+
});
|
|
580
642
|
it('should return native token count on success', async () => {
|
|
581
643
|
const mockCountTokens = vi.fn(async () => ({ input_tokens: 42 }));
|
|
582
644
|
const client = createCountTokensClient(mockCountTokens);
|
|
583
|
-
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6' });
|
|
645
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6', useNativeTokenCount: true });
|
|
584
646
|
const result = await model.countTokens(messages);
|
|
585
647
|
expect(result).toBe(42);
|
|
586
648
|
expect(mockCountTokens).toHaveBeenCalledOnce();
|
|
@@ -588,7 +650,7 @@ describe('AnthropicModel', () => {
|
|
|
588
650
|
it('should include system prompt in request', async () => {
|
|
589
651
|
const mockCountTokens = vi.fn(async () => ({ input_tokens: 55 }));
|
|
590
652
|
const client = createCountTokensClient(mockCountTokens);
|
|
591
|
-
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6' });
|
|
653
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6', useNativeTokenCount: true });
|
|
592
654
|
const result = await model.countTokens(messages, { systemPrompt: 'Be helpful.' });
|
|
593
655
|
expect(result).toBe(55);
|
|
594
656
|
expect(mockCountTokens).toHaveBeenCalledWith({
|
|
@@ -600,7 +662,7 @@ describe('AnthropicModel', () => {
|
|
|
600
662
|
it('should include tool specs in request', async () => {
|
|
601
663
|
const mockCountTokens = vi.fn(async () => ({ input_tokens: 100 }));
|
|
602
664
|
const client = createCountTokensClient(mockCountTokens);
|
|
603
|
-
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6' });
|
|
665
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6', useNativeTokenCount: true });
|
|
604
666
|
const result = await model.countTokens(messages, { toolSpecs });
|
|
605
667
|
expect(result).toBe(100);
|
|
606
668
|
expect(mockCountTokens).toHaveBeenCalledWith({
|
|
@@ -612,7 +674,7 @@ describe('AnthropicModel', () => {
|
|
|
612
674
|
it('should strip max_tokens from request', async () => {
|
|
613
675
|
const mockCountTokens = vi.fn(async () => ({ input_tokens: 10 }));
|
|
614
676
|
const client = createCountTokensClient(mockCountTokens);
|
|
615
|
-
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6' });
|
|
677
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6', useNativeTokenCount: true });
|
|
616
678
|
await model.countTokens(messages);
|
|
617
679
|
expect(mockCountTokens).toHaveBeenCalledWith({
|
|
618
680
|
model: 'claude-sonnet-4-6',
|
|
@@ -624,7 +686,7 @@ describe('AnthropicModel', () => {
|
|
|
624
686
|
throw new Error('Unsupported');
|
|
625
687
|
});
|
|
626
688
|
const client = createCountTokensClient(mockCountTokens);
|
|
627
|
-
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6' });
|
|
689
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6', useNativeTokenCount: true });
|
|
628
690
|
const result = await model.countTokens(messages);
|
|
629
691
|
expect(typeof result).toBe('number');
|
|
630
692
|
expect(result).toBeGreaterThanOrEqual(0);
|
|
@@ -634,11 +696,19 @@ describe('AnthropicModel', () => {
|
|
|
634
696
|
throw new Error('Connection failed');
|
|
635
697
|
});
|
|
636
698
|
const client = createCountTokensClient(mockCountTokens);
|
|
637
|
-
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6' });
|
|
699
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6', useNativeTokenCount: true });
|
|
638
700
|
const result = await model.countTokens(messages);
|
|
639
701
|
expect(typeof result).toBe('number');
|
|
640
702
|
expect(result).toBeGreaterThanOrEqual(0);
|
|
641
703
|
});
|
|
704
|
+
it('should skip native API and use heuristic when useNativeTokenCount is false', async () => {
|
|
705
|
+
const mockCountTokens = vi.fn();
|
|
706
|
+
const client = createCountTokensClient(mockCountTokens);
|
|
707
|
+
const model = new AnthropicModel({ client, modelId: 'claude-sonnet-4-6', useNativeTokenCount: false });
|
|
708
|
+
const result = await model.countTokens(messages);
|
|
709
|
+
expect(mockCountTokens).not.toHaveBeenCalled();
|
|
710
|
+
expect(result).toBe(2); // heuristic: Math.ceil('hello'.length / 4)
|
|
711
|
+
});
|
|
642
712
|
});
|
|
643
713
|
});
|
|
644
714
|
//# sourceMappingURL=anthropic.test.js.map
|