@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.
Files changed (284) hide show
  1. package/README.md +6 -0
  2. package/dist/src/__fixtures__/agent-helpers.d.ts +16 -1
  3. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  4. package/dist/src/__fixtures__/agent-helpers.js +42 -0
  5. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  6. package/dist/src/__fixtures__/tool-helpers.d.ts +2 -1
  7. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  8. package/dist/src/__fixtures__/tool-helpers.js +20 -3
  9. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  10. package/dist/src/__tests__/interrupt.test.d.ts +2 -0
  11. package/dist/src/__tests__/interrupt.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/interrupt.test.js +264 -0
  13. package/dist/src/__tests__/interrupt.test.js.map +1 -0
  14. package/dist/src/__tests__/mcp.test.js +447 -7
  15. package/dist/src/__tests__/mcp.test.js.map +1 -1
  16. package/dist/src/agent/__tests__/agent.hook.test.js +551 -1
  17. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  18. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +2 -0
  19. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +1 -0
  20. package/dist/src/agent/__tests__/agent.interrupt.test.js +779 -0
  21. package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -0
  22. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +2 -0
  23. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +1 -0
  24. package/dist/src/agent/__tests__/agent.model-retry.test.js +161 -0
  25. package/dist/src/agent/__tests__/agent.model-retry.test.js.map +1 -0
  26. package/dist/src/agent/__tests__/agent.test.js +174 -0
  27. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  28. package/dist/src/agent/__tests__/snapshot.test.js +148 -4
  29. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  30. package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
  31. package/dist/src/agent/agent-as-tool.js +2 -3
  32. package/dist/src/agent/agent-as-tool.js.map +1 -1
  33. package/dist/src/agent/agent.d.ts +94 -4
  34. package/dist/src/agent/agent.d.ts.map +1 -1
  35. package/dist/src/agent/agent.js +625 -223
  36. package/dist/src/agent/agent.js.map +1 -1
  37. package/dist/src/agent/snapshot.d.ts +11 -19
  38. package/dist/src/agent/snapshot.d.ts.map +1 -1
  39. package/dist/src/agent/snapshot.js +23 -19
  40. package/dist/src/agent/snapshot.js.map +1 -1
  41. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +230 -9
  42. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
  43. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +19 -6
  44. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
  45. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +422 -41
  46. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  47. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +75 -1
  48. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
  49. package/dist/src/conversation-manager/conversation-manager.d.ts +67 -22
  50. package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
  51. package/dist/src/conversation-manager/conversation-manager.js +65 -13
  52. package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
  53. package/dist/src/conversation-manager/index.d.ts +1 -1
  54. package/dist/src/conversation-manager/index.d.ts.map +1 -1
  55. package/dist/src/conversation-manager/index.js +1 -1
  56. package/dist/src/conversation-manager/index.js.map +1 -1
  57. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +43 -10
  58. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  59. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +202 -45
  60. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  61. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +23 -1
  62. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
  63. package/dist/src/conversation-manager/summarizing-conversation-manager.js +39 -17
  64. package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
  65. package/dist/src/hooks/__tests__/events.test.js +99 -12
  66. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  67. package/dist/src/hooks/__tests__/registry.test.js +166 -2
  68. package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
  69. package/dist/src/hooks/events.d.ts +125 -32
  70. package/dist/src/hooks/events.d.ts.map +1 -1
  71. package/dist/src/hooks/events.js +111 -8
  72. package/dist/src/hooks/events.js.map +1 -1
  73. package/dist/src/hooks/index.d.ts +4 -3
  74. package/dist/src/hooks/index.d.ts.map +1 -1
  75. package/dist/src/hooks/index.js +2 -1
  76. package/dist/src/hooks/index.js.map +1 -1
  77. package/dist/src/hooks/registry.d.ts +12 -12
  78. package/dist/src/hooks/registry.d.ts.map +1 -1
  79. package/dist/src/hooks/registry.js +55 -15
  80. package/dist/src/hooks/registry.js.map +1 -1
  81. package/dist/src/hooks/types.d.ts +23 -0
  82. package/dist/src/hooks/types.d.ts.map +1 -1
  83. package/dist/src/hooks/types.js +17 -1
  84. package/dist/src/hooks/types.js.map +1 -1
  85. package/dist/src/index.d.ts +12 -6
  86. package/dist/src/index.d.ts.map +1 -1
  87. package/dist/src/index.js +7 -2
  88. package/dist/src/index.js.map +1 -1
  89. package/dist/src/interrupt.d.ts +247 -0
  90. package/dist/src/interrupt.d.ts.map +1 -0
  91. package/dist/src/interrupt.js +316 -0
  92. package/dist/src/interrupt.js.map +1 -0
  93. package/dist/src/mcp.d.ts +61 -4
  94. package/dist/src/mcp.d.ts.map +1 -1
  95. package/dist/src/mcp.js +161 -25
  96. package/dist/src/mcp.js.map +1 -1
  97. package/dist/src/models/__tests__/anthropic.test.js +78 -8
  98. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  99. package/dist/src/models/__tests__/bedrock.test.js +156 -18
  100. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  101. package/dist/src/models/__tests__/defaults.test.d.ts +2 -0
  102. package/dist/src/models/__tests__/defaults.test.d.ts.map +1 -0
  103. package/dist/src/models/__tests__/defaults.test.js +36 -0
  104. package/dist/src/models/__tests__/defaults.test.js.map +1 -0
  105. package/dist/src/models/__tests__/google.test.js +72 -6
  106. package/dist/src/models/__tests__/google.test.js.map +1 -1
  107. package/dist/src/models/anthropic.d.ts +10 -0
  108. package/dist/src/models/anthropic.d.ts.map +1 -1
  109. package/dist/src/models/anthropic.js +14 -4
  110. package/dist/src/models/anthropic.js.map +1 -1
  111. package/dist/src/models/bedrock.d.ts +17 -3
  112. package/dist/src/models/bedrock.d.ts.map +1 -1
  113. package/dist/src/models/bedrock.js +80 -13
  114. package/dist/src/models/bedrock.js.map +1 -1
  115. package/dist/src/models/defaults.d.ts +10 -0
  116. package/dist/src/models/defaults.d.ts.map +1 -1
  117. package/dist/src/models/defaults.js +129 -0
  118. package/dist/src/models/defaults.js.map +1 -1
  119. package/dist/src/models/google/model.d.ts.map +1 -1
  120. package/dist/src/models/google/model.js +4 -2
  121. package/dist/src/models/google/model.js.map +1 -1
  122. package/dist/src/models/google/types.d.ts +10 -0
  123. package/dist/src/models/google/types.d.ts.map +1 -1
  124. package/dist/src/models/model.d.ts +15 -0
  125. package/dist/src/models/model.d.ts.map +1 -1
  126. package/dist/src/models/model.js +18 -0
  127. package/dist/src/models/model.js.map +1 -1
  128. package/dist/src/models/openai/__tests__/chat.test.js +55 -2
  129. package/dist/src/models/openai/__tests__/chat.test.js.map +1 -1
  130. package/dist/src/models/openai/__tests__/responses.test.js +19 -0
  131. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
  132. package/dist/src/models/openai/errors.d.ts.map +1 -1
  133. package/dist/src/models/openai/errors.js +7 -4
  134. package/dist/src/models/openai/errors.js.map +1 -1
  135. package/dist/src/models/openai/model.d.ts.map +1 -1
  136. package/dist/src/models/openai/model.js +2 -2
  137. package/dist/src/models/openai/model.js.map +1 -1
  138. package/dist/src/multiagent/__tests__/graph.test.js +69 -0
  139. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
  140. package/dist/src/multiagent/__tests__/graph.tracer.test.js +14 -0
  141. package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +1 -1
  142. package/dist/src/multiagent/__tests__/interrupts.test.d.ts +2 -0
  143. package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +1 -0
  144. package/dist/src/multiagent/__tests__/interrupts.test.js +390 -0
  145. package/dist/src/multiagent/__tests__/interrupts.test.js.map +1 -0
  146. package/dist/src/multiagent/__tests__/nodes.test.js +13 -0
  147. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  148. package/dist/src/multiagent/__tests__/state.test.js +139 -1
  149. package/dist/src/multiagent/__tests__/state.test.js.map +1 -1
  150. package/dist/src/multiagent/__tests__/swarm.test.js +77 -0
  151. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
  152. package/dist/src/multiagent/events.d.ts +15 -1
  153. package/dist/src/multiagent/events.d.ts.map +1 -1
  154. package/dist/src/multiagent/events.js +18 -0
  155. package/dist/src/multiagent/events.js.map +1 -1
  156. package/dist/src/multiagent/graph.d.ts +59 -3
  157. package/dist/src/multiagent/graph.d.ts.map +1 -1
  158. package/dist/src/multiagent/graph.js +201 -34
  159. package/dist/src/multiagent/graph.js.map +1 -1
  160. package/dist/src/multiagent/multiagent.d.ts +77 -3
  161. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  162. package/dist/src/multiagent/multiagent.js +115 -1
  163. package/dist/src/multiagent/multiagent.js.map +1 -1
  164. package/dist/src/multiagent/nodes.d.ts +18 -0
  165. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  166. package/dist/src/multiagent/nodes.js +69 -22
  167. package/dist/src/multiagent/nodes.js.map +1 -1
  168. package/dist/src/multiagent/state.d.ts +39 -3
  169. package/dist/src/multiagent/state.d.ts.map +1 -1
  170. package/dist/src/multiagent/state.js +80 -1
  171. package/dist/src/multiagent/state.js.map +1 -1
  172. package/dist/src/multiagent/swarm.d.ts +30 -1
  173. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  174. package/dist/src/multiagent/swarm.js +166 -33
  175. package/dist/src/multiagent/swarm.js.map +1 -1
  176. package/dist/src/registry/__tests__/tool-registry.test.js +37 -0
  177. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
  178. package/dist/src/registry/tool-registry.d.ts +13 -7
  179. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  180. package/dist/src/registry/tool-registry.js +35 -10
  181. package/dist/src/registry/tool-registry.js.map +1 -1
  182. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +2 -0
  183. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +1 -0
  184. package/dist/src/retry/__tests__/backoff-strategy.test.js +116 -0
  185. package/dist/src/retry/__tests__/backoff-strategy.test.js.map +1 -0
  186. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +2 -0
  187. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +1 -0
  188. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +225 -0
  189. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +1 -0
  190. package/dist/src/retry/backoff-strategy.d.ts +108 -0
  191. package/dist/src/retry/backoff-strategy.d.ts.map +1 -0
  192. package/dist/src/retry/backoff-strategy.js +86 -0
  193. package/dist/src/retry/backoff-strategy.js.map +1 -0
  194. package/dist/src/retry/default-model-retry-strategy.d.ts +76 -0
  195. package/dist/src/retry/default-model-retry-strategy.d.ts.map +1 -0
  196. package/dist/src/retry/default-model-retry-strategy.js +104 -0
  197. package/dist/src/retry/default-model-retry-strategy.js.map +1 -0
  198. package/dist/src/retry/index.d.ts +8 -0
  199. package/dist/src/retry/index.d.ts.map +1 -0
  200. package/dist/src/retry/index.js +7 -0
  201. package/dist/src/retry/index.js.map +1 -0
  202. package/dist/src/retry/model-retry-strategy.d.ts +80 -0
  203. package/dist/src/retry/model-retry-strategy.d.ts.map +1 -0
  204. package/dist/src/retry/model-retry-strategy.js +85 -0
  205. package/dist/src/retry/model-retry-strategy.js.map +1 -0
  206. package/dist/src/retry/retry-strategy.d.ts +34 -0
  207. package/dist/src/retry/retry-strategy.d.ts.map +1 -0
  208. package/dist/src/retry/retry-strategy.js +25 -0
  209. package/dist/src/retry/retry-strategy.js.map +1 -0
  210. package/dist/src/session/__tests__/session-manager.test.js +84 -3
  211. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  212. package/dist/src/session/session-manager.d.ts +11 -2
  213. package/dist/src/session/session-manager.d.ts.map +1 -1
  214. package/dist/src/session/session-manager.js +17 -6
  215. package/dist/src/session/session-manager.js.map +1 -1
  216. package/dist/src/telemetry/__tests__/meter.test.js +5 -27
  217. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
  218. package/dist/src/telemetry/meter.d.ts +12 -4
  219. package/dist/src/telemetry/meter.d.ts.map +1 -1
  220. package/dist/src/telemetry/meter.js +13 -8
  221. package/dist/src/telemetry/meter.js.map +1 -1
  222. package/dist/src/tools/__tests__/tool.test.js +24 -1
  223. package/dist/src/tools/__tests__/tool.test.js.map +1 -1
  224. package/dist/src/tools/function-tool.d.ts.map +1 -1
  225. package/dist/src/tools/function-tool.js +6 -1
  226. package/dist/src/tools/function-tool.js.map +1 -1
  227. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  228. package/dist/src/tools/mcp-tool.js +3 -2
  229. package/dist/src/tools/mcp-tool.js.map +1 -1
  230. package/dist/src/tools/tool.d.ts +10 -1
  231. package/dist/src/tools/tool.d.ts.map +1 -1
  232. package/dist/src/tools/tool.js +12 -0
  233. package/dist/src/tools/tool.js.map +1 -1
  234. package/dist/src/tsconfig.tsbuildinfo +1 -1
  235. package/dist/src/types/__tests__/agent.test.js +97 -0
  236. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  237. package/dist/src/types/agent.d.ts +48 -8
  238. package/dist/src/types/agent.d.ts.map +1 -1
  239. package/dist/src/types/agent.js +28 -3
  240. package/dist/src/types/agent.js.map +1 -1
  241. package/dist/src/types/interrupt.d.ts +103 -0
  242. package/dist/src/types/interrupt.d.ts.map +1 -0
  243. package/dist/src/types/interrupt.js +63 -0
  244. package/dist/src/types/interrupt.js.map +1 -0
  245. package/dist/src/types/messages.d.ts +2 -1
  246. package/dist/src/types/messages.d.ts.map +1 -1
  247. package/dist/src/types/messages.js.map +1 -1
  248. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +2 -0
  249. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +1 -0
  250. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +292 -0
  251. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -0
  252. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +2 -0
  253. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +1 -0
  254. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +148 -0
  255. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -0
  256. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +2 -0
  257. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +1 -0
  258. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +78 -0
  259. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +1 -0
  260. package/dist/src/vended-plugins/context-offloader/index.d.ts +23 -0
  261. package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -0
  262. package/dist/src/vended-plugins/context-offloader/index.js +21 -0
  263. package/dist/src/vended-plugins/context-offloader/index.js.map +1 -0
  264. package/dist/src/vended-plugins/context-offloader/plugin.d.ts +48 -0
  265. package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -0
  266. package/dist/src/vended-plugins/context-offloader/plugin.js +244 -0
  267. package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -0
  268. package/dist/src/vended-plugins/context-offloader/storage.d.ts +114 -0
  269. package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -0
  270. package/dist/src/vended-plugins/context-offloader/storage.js +204 -0
  271. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -0
  272. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +12 -0
  273. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
  274. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +3 -0
  275. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  276. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  277. package/dist/src/vended-tools/bash/bash.js +0 -3
  278. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  279. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +3 -0
  280. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
  281. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +3 -0
  282. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  283. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  284. 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: McpTransport;
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 _connected;
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
- * This function is exposed to allow consumers to connect manually, but will be called lazily before any operations that require a connection.
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
@@ -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;AAI9E,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,+CAA+C;AAC/C,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,SAAS,EAAE,YAAY,CAAA;IAEvB,iDAAiD;IACjD,yBAAyB,CAAC,EAAE,OAAO,CAAA;IAEnC;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;IAEzB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;CAC1C,CAAA;AAED,sEAAsE;AACtE,qBAAa,SAAS;IACpB,iEAAiE;IACjE,gBAAuB,WAAW,SAAQ;IAE1C,4EAA4E;IAC5E,gBAAuB,oBAAoB,UAAS;IAEpD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,UAAU,CAAW;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,0BAA0B,CAAS;IAC3C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,oBAAoB,CAAiC;gBAEjD,IAAI,EAAE,eAAe;IAkBjC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;;;;OAMG;IACU,OAAO,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/D;;;;OAIG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxC;;;;OAIG;IACU,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAgB5C;;;;;;;;;;OAUG;IACU,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;CAqC1E"}
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
- _connected;
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.transport;
25
- this._connected = false;
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
- }, this._elicitationCallback ? { capabilities: { elicitation: { form: {}, url: {} } } } : undefined);
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
- * This function is exposed to allow consumers to connect manually, but will be called lazily before any operations that require a connection.
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._connected && !reconnect) {
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._connected = false;
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
- await this._client.connect(this._transport);
59
- this._connected = true;
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._connected = false;
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
- const result = await this._client.listTools();
80
- // Map the tool specifications to fully functional McpTool instances
81
- return result.tools.map((toolSpec) => {
82
- return new McpTool({
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, // resultSchema - use default CallToolResultSchema
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.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
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;AAoG3C,sEAAsE;AACtE,MAAM,OAAO,SAAS;IACpB,iEAAiE;IAC1D,MAAM,CAAU,WAAW,GAAG,KAAK,CAAA;IAE1C,4EAA4E;IACrE,MAAM,CAAU,oBAAoB,GAAG,MAAM,CAAA;IAE5C,WAAW,CAAQ;IACnB,cAAc,CAAQ;IACtB,UAAU,CAAW;IACrB,MAAM,CAAoB;IAC1B,OAAO,CAAQ;IACf,SAAS,CAAS;IAClB,WAAW,CAAoD;IAC/D,0BAA0B,CAAS;IACnC,YAAY,CAAyB;IACrC,oBAAoB,CAAiC;IACrD,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;IACxC,eAAe,CAAiE;IAChF,gBAAgB,GAAG,KAAK,CAAA;IACxB,eAAe,GAAG,KAAK,CAAA;IAE/B,YAAY,IAAqB;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,IAAI,uBAAuB,CAAA;QAClE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,IAAI,OAAO,CAAA;QACxD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,GAAG,cAAc,CAAA;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAA;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAA;QACvD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,CAAA;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CACvB;YACE,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,OAAO,EAAE,IAAI,CAAC,cAAc;SAC7B,EACD;YACE,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACrG,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL,WAAW,EAAE,KAAK;oBAClB,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,GAAS,EAAE;wBACpB,IAAI,CAAC,mBAAmB,EAAE,CAAA;oBAC5B,CAAC;iBACF;aACF;SACF,CACF,CAAA;QAED,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,gCAAgC,EAAE,CAAC,YAAY,EAAE,EAAE;YACrF,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,yBAAyB,IAAI,KAAK,CAAA;IAC3E,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,IAAqB;QACpD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;QACnF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAClF,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAA;YACH,CAAC;YACD,OAAO,IAAI,CAAC,SAAsB,CAAA;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;QACvF,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI;YAC5B,CAAC,CAAC,IAAI,yBAAyB,CAAC;gBAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAC5B,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;gBACpC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;aAC/D,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAA;QAErB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAI,CAAC,CAAA;QACnE,OAAO,IAAI,6BAA6B,CACtC,GAAG,EACH,YAAY,IAAI,IAAI,CAAC,OAAO;YAC1B,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;YAC5G,CAAC,CAAC,SAAS,CACD,CAAA;IAChB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAA;IAC7C,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAA;IACxC,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;IACvC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,OAAO,CAAC,YAAqB,KAAK;QAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,SAAS;YAAE,OAAM;QAExD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;YAC1B,IAAI,CAAC,MAAM,GAAG,cAAc,CAAA;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAA;YAC1C,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;gBAC3E,OAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;YAC9C,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC3C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAA;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,MAAM,KAAK,CAAA;YAChC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAA;YACtB,MAAM,CAAC,IAAI,CACT,WAAW,IAAI,CAAC,WAAW,aAAa,KAAK,4DAA4D,CAC1G,CAAA;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,UAAU;QACrB,4BAA4B;QAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAC1B,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QAC7B,IAAI,CAAC,MAAM,GAAG,cAAc,CAAA;IAC9B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,SAAS;QACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAA;QAEvC,MAAM,KAAK,GAAc,EAAE,CAAA;QAC3B,IAAI,MAA0B,CAAA;QAE9B,GAAG,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAE5E,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CACjB,CAAC,QAAQ,EAAE,EAAE,CACX,IAAI,OAAO,CAAC;gBACV,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,uBAAuB,QAAQ,CAAC,IAAI,EAAE;gBAC3E,WAAW,EAAE,QAAQ,CAAC,WAAyB;gBAC/C,MAAM,EAAE,IAAI;aACb,CAAC,CACL,CACF,CAAA;YAED,MAAM,GAAG,MAAM,CAAC,UAAU,CAAA;QAC5B,CAAC,QAAQ,MAAM,EAAC;QAEhB,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAE7D,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;;OAKG;IACH,IAAI,cAAc,CAAC,QAAyE;QAC1F,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAA;IACjC,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;YAC3B,OAAM;QACR,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC5B,IAAI,CAAC;YACH,GAAG,CAAC;gBACF,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;gBAC5B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAA;gBAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAA;gBACvC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAC5C,CAAC,QAAQ,IAAI,CAAC,eAAe,EAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,WAAW,IAAI,CAAC,WAAW,aAAa,GAAG,6DAA6D,CACzG,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAA;QAC/B,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,QAAQ,CAAC,IAAa,EAAE,IAAe,EAAE,OAA4B;QAChF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;QAE3G,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,0FAA0F,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CACxI,CAAA;QACH,CAAC;QAED,iFAAiF;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACtF,MAAM,QAAQ,GAAG,YAAuC,CAAA;QAExD,6EAA6E;QAC7E,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAc,CAAA;QACjH,CAAC;QAED,gFAAgF;QAChF,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE;YACjH,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,SAAS,CAAC,WAAW;YACvD,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,IAAI,SAAS,CAAC,oBAAoB;YAChF,sBAAsB,EAAE,IAAI;YAC5B,GAAG,OAAO;SACX,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;QACvC,OAAO,MAAmB,CAAA;IAC5B,CAAC;;AAGH,SAAS,iBAAiB,CAAC,MAAwC;IACjE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IACpD,MAAM,OAAO,GAAG,WAAW,YAAY,IAAI,KAAK,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAA;IACpG,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;SAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC;SAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AASD;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,IAAe;IACzC,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QAEjD,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;YACvD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAmB,EAAE,CAAA;QAClC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QAE3C,MAAM,YAAY,GAAI,IAAgC,CAAC,KAAK,CAAA;QAC5D,MAAM,UAAU,GACd,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC9E,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,EAAE;YACjC,CAAC,CAAC,OAAO,CAAA;QAEb,OAAO;YACL,GAAI,IAAgC;YACpC,KAAK,EAAE,UAAkC;SAC1C,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,4DAA4D,CAAC,CAAA;QACxF,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -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('maps overload error to ContextWindowOverflowError', async () => {
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('prompt is too long');
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