@strands-agents/sdk 0.2.1 → 0.3.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 (87) hide show
  1. package/dist/src/__fixtures__/mock-hook-provider.d.ts.map +1 -1
  2. package/dist/src/__fixtures__/mock-hook-provider.js +2 -1
  3. package/dist/src/__fixtures__/mock-hook-provider.js.map +1 -1
  4. package/dist/src/__tests__/errors.test.js +33 -1
  5. package/dist/src/__tests__/errors.test.js.map +1 -1
  6. package/dist/src/agent/__tests__/agent.hook.test.js +25 -23
  7. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  8. package/dist/src/agent/agent.d.ts.map +1 -1
  9. package/dist/src/agent/agent.js +2 -1
  10. package/dist/src/agent/agent.js.map +1 -1
  11. package/dist/src/errors.d.ts +16 -0
  12. package/dist/src/errors.d.ts.map +1 -1
  13. package/dist/src/errors.js +19 -0
  14. package/dist/src/errors.js.map +1 -1
  15. package/dist/src/hooks/__tests__/events.test.js +18 -1
  16. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  17. package/dist/src/hooks/events.d.ts +11 -0
  18. package/dist/src/hooks/events.d.ts.map +1 -1
  19. package/dist/src/hooks/events.js +12 -0
  20. package/dist/src/hooks/events.js.map +1 -1
  21. package/dist/src/hooks/index.d.ts +1 -1
  22. package/dist/src/hooks/index.d.ts.map +1 -1
  23. package/dist/src/hooks/index.js +1 -1
  24. package/dist/src/hooks/index.js.map +1 -1
  25. package/dist/src/index.d.ts +2 -2
  26. package/dist/src/index.d.ts.map +1 -1
  27. package/dist/src/index.js +2 -2
  28. package/dist/src/index.js.map +1 -1
  29. package/dist/src/models/__tests__/anthropic.test.d.ts +2 -0
  30. package/dist/src/models/__tests__/anthropic.test.d.ts.map +1 -0
  31. package/dist/src/models/__tests__/anthropic.test.js +481 -0
  32. package/dist/src/models/__tests__/anthropic.test.js.map +1 -0
  33. package/dist/src/models/__tests__/bedrock.test.js +86 -1
  34. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  35. package/dist/src/models/__tests__/gemini.test.js +599 -62
  36. package/dist/src/models/__tests__/gemini.test.js.map +1 -1
  37. package/dist/src/models/__tests__/openai.test.js +104 -1
  38. package/dist/src/models/__tests__/openai.test.js.map +1 -1
  39. package/dist/src/models/anthropic.d.ts +28 -0
  40. package/dist/src/models/anthropic.d.ts.map +1 -0
  41. package/dist/src/models/anthropic.js +419 -0
  42. package/dist/src/models/anthropic.js.map +1 -0
  43. package/dist/src/models/bedrock.d.ts +6 -0
  44. package/dist/src/models/bedrock.d.ts.map +1 -1
  45. package/dist/src/models/bedrock.js +31 -4
  46. package/dist/src/models/bedrock.js.map +1 -1
  47. package/dist/src/models/gemini/adapters.d.ts +2 -1
  48. package/dist/src/models/gemini/adapters.d.ts.map +1 -1
  49. package/dist/src/models/gemini/adapters.js +259 -14
  50. package/dist/src/models/gemini/adapters.js.map +1 -1
  51. package/dist/src/models/gemini/model.d.ts.map +1 -1
  52. package/dist/src/models/gemini/model.js +38 -1
  53. package/dist/src/models/gemini/model.js.map +1 -1
  54. package/dist/src/models/gemini/types.d.ts +10 -1
  55. package/dist/src/models/gemini/types.d.ts.map +1 -1
  56. package/dist/src/models/model.d.ts.map +1 -1
  57. package/dist/src/models/model.js +4 -0
  58. package/dist/src/models/model.js.map +1 -1
  59. package/dist/src/models/openai.d.ts.map +1 -1
  60. package/dist/src/models/openai.js +20 -3
  61. package/dist/src/models/openai.js.map +1 -1
  62. package/dist/src/models/streaming.d.ts +5 -0
  63. package/dist/src/models/streaming.d.ts.map +1 -1
  64. package/dist/src/tsconfig.tsbuildinfo +1 -1
  65. package/dist/src/types/media.d.ts +1 -1
  66. package/dist/src/types/media.d.ts.map +1 -1
  67. package/dist/src/types/media.js +18 -4
  68. package/dist/src/types/media.js.map +1 -1
  69. package/dist/src/types/messages.d.ts +10 -0
  70. package/dist/src/types/messages.d.ts.map +1 -1
  71. package/dist/src/types/messages.js +8 -0
  72. package/dist/src/types/messages.js.map +1 -1
  73. package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts +2 -0
  74. package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts.map +1 -0
  75. package/dist/src/vended-tools/bash/__tests__/{bash.test.js → bash.test.node.js} +3 -4
  76. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -0
  77. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts +2 -0
  78. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts.map +1 -0
  79. package/dist/src/vended-tools/file_editor/__tests__/{file-editor.test.js → file-editor.test.node.js} +1 -1
  80. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +1 -0
  81. package/package.json +11 -2
  82. package/dist/src/vended-tools/bash/__tests__/bash.test.d.ts +0 -2
  83. package/dist/src/vended-tools/bash/__tests__/bash.test.d.ts.map +0 -1
  84. package/dist/src/vended-tools/bash/__tests__/bash.test.js.map +0 -1
  85. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.d.ts +0 -2
  86. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.d.ts.map +0 -1
  87. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/hooks/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/hooks/events.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * Hooks provide a composable mechanism for extending agent functionality
5
5
  * by subscribing to events throughout the agent lifecycle.
6
6
  */
7
- export { HookEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, ModelStreamEventHook, BeforeToolsEvent, AfterToolsEvent, } from './events.js';
7
+ export { HookEvent, InitializedEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, ModelStreamEventHook, BeforeToolsEvent, AfterToolsEvent, } from './events.js';
8
8
  export type { ModelStopData as ModelStopResponse } from './events.js';
9
9
  export { HookRegistryImplementation as HookRegistry } from './registry.js';
10
10
  export type { HookCallback, HookProvider, HookEventConstructor, HookCleanup } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAA;AAGpB,YAAY,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGrE,OAAO,EAAE,0BAA0B,IAAI,YAAY,EAAE,MAAM,eAAe,CAAA;AAG1E,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAA;AAGpB,YAAY,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGrE,OAAO,EAAE,0BAA0B,IAAI,YAAY,EAAE,MAAM,eAAe,CAAA;AAG1E,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
@@ -5,7 +5,7 @@
5
5
  * by subscribing to events throughout the agent lifecycle.
6
6
  */
7
7
  // Event classes
8
- export { HookEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, ModelStreamEventHook, BeforeToolsEvent, AfterToolsEvent, } from './events.js';
8
+ export { HookEvent, InitializedEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, ModelStreamEventHook, BeforeToolsEvent, AfterToolsEvent, } from './events.js';
9
9
  // Registry
10
10
  export { HookRegistryImplementation as HookRegistry } from './registry.js';
11
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gBAAgB;AAChB,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAA;AAKpB,WAAW;AACX,OAAO,EAAE,0BAA0B,IAAI,YAAY,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gBAAgB;AAChB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAA;AAKpB,WAAW;AACX,OAAO,EAAE,0BAA0B,IAAI,YAAY,EAAE,MAAM,eAAe,CAAA"}
@@ -9,7 +9,7 @@ export type { AgentState } from './agent/state.js';
9
9
  export type { AgentData } from './types/agent.js';
10
10
  export { AgentResult } from './types/agent.js';
11
11
  export type { AgentConfig, ToolList } from './agent/agent.js';
12
- export { ModelError, ContextWindowOverflowError, MaxTokensError, JsonValidationError, ConcurrentInvocationError, } from './errors.js';
12
+ export { ModelError, ContextWindowOverflowError, MaxTokensError, JsonValidationError, ConcurrentInvocationError, ModelThrottledError, } from './errors.js';
13
13
  export type { JSONSchema, JSONValue } from './types/json.js';
14
14
  export type { Role, StopReason, TextBlockData, ToolUseBlockData, ToolResultBlockData, ReasoningBlockData, CachePointBlockData, GuardContentBlockData, GuardContentText, GuardContentImage, GuardQualifier, GuardImageFormat, GuardImageSource, ContentBlock, ContentBlockData, MessageData, SystemPrompt, SystemPromptData, SystemContentBlock, ToolResultContent, } from './types/messages.js';
15
15
  export { TextBlock, ToolUseBlock, ToolResultBlock, ReasoningBlock, CachePointBlock, GuardContentBlock, Message, JsonBlock, contentBlockFromData, } from './types/messages.js';
@@ -26,7 +26,7 @@ export { Model } from './models/model.js';
26
26
  export { BedrockModel as BedrockModel } from './models/bedrock.js';
27
27
  export type { BedrockModelConfig, BedrockModelOptions } from './models/bedrock.js';
28
28
  export type { AgentStreamEvent } from './types/agent.js';
29
- export { HookRegistry, HookEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, BeforeToolsEvent, AfterToolsEvent, } from './hooks/index.js';
29
+ export { HookRegistry, HookEvent, InitializedEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, BeforeToolsEvent, AfterToolsEvent, } from './hooks/index.js';
30
30
  export type { HookCallback, HookProvider, HookEventConstructor, ModelStopResponse } from './hooks/index.js';
31
31
  export { NullConversationManager } from './conversation-manager/null-conversation-manager.js';
32
32
  export { SlidingWindowConversationManager, type SlidingWindowConversationManagerConfig, } from './conversation-manager/sliding-window-conversation-manager.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -8,7 +8,7 @@
8
8
  export { Agent } from './agent/agent.js';
9
9
  export { AgentResult } from './types/agent.js';
10
10
  // Error types
11
- export { ModelError, ContextWindowOverflowError, MaxTokensError, JsonValidationError, ConcurrentInvocationError, } from './errors.js';
11
+ export { ModelError, ContextWindowOverflowError, MaxTokensError, JsonValidationError, ConcurrentInvocationError, ModelThrottledError, } from './errors.js';
12
12
  // Message classes
13
13
  export { TextBlock, ToolUseBlock, ToolResultBlock, ReasoningBlock, CachePointBlock, GuardContentBlock, Message, JsonBlock, contentBlockFromData, } from './types/messages.js';
14
14
  // Media classes
@@ -23,7 +23,7 @@ export { Model } from './models/model.js';
23
23
  // Bedrock model provider
24
24
  export { BedrockModel as BedrockModel } from './models/bedrock.js';
25
25
  // Hooks system
26
- export { HookRegistry, HookEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, BeforeToolsEvent, AfterToolsEvent,
26
+ export { HookRegistry, HookEvent, InitializedEvent, BeforeInvocationEvent, AfterInvocationEvent, MessageAddedEvent, BeforeToolCallEvent, AfterToolCallEvent, BeforeModelCallEvent, AfterModelCallEvent, BeforeToolsEvent, AfterToolsEvent,
27
27
  // ModelStreamEventHook # Disabled for now https://github.com/strands-agents/sdk-typescript/issues/288
28
28
  } from './hooks/index.js';
29
29
  // Conversation Manager
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAOxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,cAAc;AACd,OAAO,EACL,UAAU,EACV,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,aAAa,CAAA;AA6BpB,kBAAkB;AAClB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAE5B,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAiCpF,kBAAkB;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,8BAA8B;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,wBAAwB;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AA6B1C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,yBAAyB;AACzB,OAAO,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAMlE,eAAe;AACf,OAAO,EACL,YAAY,EACZ,SAAS,EACT,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe;AACf,sGAAsG;EACvG,MAAM,kBAAkB,CAAA;AAGzB,uBAAuB;AACvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAA;AAC7F,OAAO,EACL,gCAAgC,GAEjC,MAAM,+DAA+D,CAAA;AAEtE,UAAU;AACV,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGtD,uCAAuC;AACvC,OAAO,EAAwB,SAAS,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAOxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,cAAc;AACd,OAAO,EACL,UAAU,EACV,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAA;AA6BpB,kBAAkB;AAClB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAE5B,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAiCpF,kBAAkB;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,8BAA8B;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,wBAAwB;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AA6B1C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,yBAAyB;AACzB,OAAO,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAMlE,eAAe;AACf,OAAO,EACL,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe;AACf,sGAAsG;EACvG,MAAM,kBAAkB,CAAA;AAGzB,uBAAuB;AACvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAA;AAC7F,OAAO,EACL,gCAAgC,GAEjC,MAAM,+DAA+D,CAAA;AAEtE,UAAU;AACV,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGtD,uCAAuC;AACvC,OAAO,EAAwB,SAAS,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=anthropic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.test.d.ts","sourceRoot":"","sources":["../../../../src/models/__tests__/anthropic.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,481 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ import { isNode } from '../../__fixtures__/environment.js';
4
+ import { AnthropicModel } from '../anthropic.js';
5
+ import { ContextWindowOverflowError, ModelThrottledError } from '../../errors.js';
6
+ import { collectIterator } from '../../__fixtures__/model-test-helpers.js';
7
+ import { TextBlock, CachePointBlock, GuardContentBlock } from '../../types/messages.js';
8
+ import { ImageBlock, DocumentBlock } from '../../types/media.js';
9
+ /**
10
+ * Helper to create a mock Anthropic client with streaming support
11
+ */
12
+ function createMockClient(streamGenerator) {
13
+ return {
14
+ messages: {
15
+ stream: vi.fn(() => streamGenerator()),
16
+ },
17
+ };
18
+ }
19
+ // Mock the Anthropic SDK
20
+ vi.mock('@anthropic-ai/sdk', () => {
21
+ const mockConstructor = vi.fn(function () {
22
+ return {
23
+ messages: {
24
+ stream: vi.fn(),
25
+ },
26
+ };
27
+ });
28
+ return {
29
+ default: mockConstructor,
30
+ };
31
+ });
32
+ describe('AnthropicModel', () => {
33
+ beforeEach(() => {
34
+ vi.clearAllMocks();
35
+ vi.restoreAllMocks();
36
+ if (isNode) {
37
+ vi.stubEnv('ANTHROPIC_API_KEY', 'sk-ant-test-env');
38
+ }
39
+ });
40
+ afterEach(() => {
41
+ vi.clearAllMocks();
42
+ if (isNode) {
43
+ vi.unstubAllEnvs();
44
+ }
45
+ });
46
+ describe('constructor', () => {
47
+ it('creates an instance with default configuration', () => {
48
+ const provider = new AnthropicModel({ apiKey: 'sk-ant-test' });
49
+ const config = provider.getConfig();
50
+ expect(config.modelId).toBe('claude-sonnet-4-5-20250929');
51
+ expect(config.maxTokens).toBe(4096);
52
+ });
53
+ it('uses provided model ID', () => {
54
+ const customModelId = 'claude-3-opus-20240229';
55
+ const provider = new AnthropicModel({ modelId: customModelId, apiKey: 'sk-ant-test' });
56
+ expect(provider.getConfig().modelId).toBe(customModelId);
57
+ });
58
+ it('uses API key from constructor parameter', () => {
59
+ const apiKey = 'sk-explicit';
60
+ new AnthropicModel({ apiKey });
61
+ expect(Anthropic).toHaveBeenCalledWith(expect.objectContaining({
62
+ apiKey,
63
+ }));
64
+ });
65
+ if (isNode) {
66
+ it('uses API key from environment variable', () => {
67
+ vi.stubEnv('ANTHROPIC_API_KEY', 'sk-from-env');
68
+ new AnthropicModel();
69
+ expect(Anthropic).toHaveBeenCalled();
70
+ });
71
+ it('throws error when no API key is available', () => {
72
+ vi.stubEnv('ANTHROPIC_API_KEY', '');
73
+ expect(() => new AnthropicModel()).toThrow('Anthropic API key is required');
74
+ });
75
+ }
76
+ it('uses provided client instance', () => {
77
+ const mockClient = {};
78
+ const provider = new AnthropicModel({ client: mockClient });
79
+ expect(Anthropic).not.toHaveBeenCalled();
80
+ expect(provider).toBeDefined();
81
+ });
82
+ });
83
+ describe('updateConfig', () => {
84
+ it('merges new config with existing config', () => {
85
+ const provider = new AnthropicModel({ apiKey: 'sk-test', temperature: 0.5 });
86
+ provider.updateConfig({ temperature: 0.8, maxTokens: 8192 });
87
+ expect(provider.getConfig()).toMatchObject({
88
+ temperature: 0.8,
89
+ maxTokens: 8192,
90
+ });
91
+ });
92
+ });
93
+ describe('stream event handling', () => {
94
+ it('yields correct event sequence for simple text response', async () => {
95
+ const mockClient = createMockClient(async function* () {
96
+ yield { type: 'message_start', message: { role: 'assistant', usage: { input_tokens: 10 } } };
97
+ yield { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } };
98
+ yield { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text: 'Hello' } };
99
+ yield { type: 'content_block_stop', index: 0 };
100
+ yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 5 } };
101
+ yield { type: 'message_stop' };
102
+ });
103
+ const provider = new AnthropicModel({ client: mockClient });
104
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
105
+ const events = await collectIterator(provider.stream(messages));
106
+ expect(events).toHaveLength(6);
107
+ expect(events[0]).toEqual({ type: 'modelMessageStartEvent', role: 'assistant' });
108
+ expect(events[1]).toEqual({ type: 'modelContentBlockStartEvent' });
109
+ expect(events[2]).toEqual({
110
+ type: 'modelContentBlockDeltaEvent',
111
+ delta: { type: 'textDelta', text: 'Hello' },
112
+ });
113
+ expect(events[3]).toEqual({ type: 'modelContentBlockStopEvent' });
114
+ expect(events[4]).toEqual({
115
+ type: 'modelMetadataEvent',
116
+ usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 },
117
+ });
118
+ expect(events[5]).toEqual({ type: 'modelMessageStopEvent', stopReason: 'endTurn' });
119
+ });
120
+ it('handles tool use events', async () => {
121
+ const mockClient = createMockClient(async function* () {
122
+ yield { type: 'message_start', message: { role: 'assistant', usage: { input_tokens: 10 } } };
123
+ yield {
124
+ type: 'content_block_start',
125
+ index: 0,
126
+ content_block: { type: 'tool_use', id: 'tool_1', name: 'calc' },
127
+ };
128
+ yield { type: 'content_block_delta', index: 0, delta: { type: 'input_json_delta', partial_json: '{"a"' } };
129
+ yield { type: 'content_block_delta', index: 0, delta: { type: 'input_json_delta', partial_json: ':1}' } };
130
+ yield { type: 'content_block_stop', index: 0 };
131
+ yield { type: 'message_delta', delta: { stop_reason: 'tool_use' }, usage: { output_tokens: 10 } };
132
+ yield { type: 'message_stop' };
133
+ });
134
+ const provider = new AnthropicModel({ client: mockClient });
135
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
136
+ const events = await collectIterator(provider.stream(messages));
137
+ expect(events).toContainEqual({
138
+ type: 'modelContentBlockStartEvent',
139
+ start: { type: 'toolUseStart', name: 'calc', toolUseId: 'tool_1' },
140
+ });
141
+ expect(events).toContainEqual({
142
+ type: 'modelContentBlockDeltaEvent',
143
+ delta: { type: 'toolUseInputDelta', input: '{"a"' },
144
+ });
145
+ expect(events).toContainEqual({
146
+ type: 'modelContentBlockDeltaEvent',
147
+ delta: { type: 'toolUseInputDelta', input: ':1}' },
148
+ });
149
+ expect(events).toContainEqual({ type: 'modelMessageStopEvent', stopReason: 'toolUse' });
150
+ });
151
+ it('handles thinking/reasoning events', async () => {
152
+ const mockClient = createMockClient(async function* () {
153
+ yield { type: 'message_start', message: { role: 'assistant', usage: { input_tokens: 10 } } };
154
+ // Thinking block
155
+ yield { type: 'content_block_start', index: 0, content_block: { type: 'thinking', thinking: '' } };
156
+ yield { type: 'content_block_delta', index: 0, delta: { type: 'thinking_delta', thinking: 'Hmm...' } };
157
+ yield { type: 'content_block_delta', index: 0, delta: { type: 'signature_delta', signature: 'sig_123' } };
158
+ yield { type: 'content_block_stop', index: 0 };
159
+ // Text block
160
+ yield { type: 'content_block_start', index: 1, content_block: { type: 'text', text: '' } };
161
+ yield { type: 'content_block_delta', index: 1, delta: { type: 'text_delta', text: 'Answer' } };
162
+ yield { type: 'content_block_stop', index: 1 };
163
+ yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 20 } };
164
+ yield { type: 'message_stop' };
165
+ });
166
+ const provider = new AnthropicModel({ client: mockClient });
167
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
168
+ const events = await collectIterator(provider.stream(messages));
169
+ // Check for thinking deltas
170
+ expect(events).toContainEqual({
171
+ type: 'modelContentBlockDeltaEvent',
172
+ delta: { type: 'reasoningContentDelta', text: 'Hmm...' },
173
+ });
174
+ expect(events).toContainEqual({
175
+ type: 'modelContentBlockDeltaEvent',
176
+ delta: { type: 'reasoningContentDelta', signature: 'sig_123' },
177
+ });
178
+ });
179
+ it('handles redacted thinking events', async () => {
180
+ const mockClient = createMockClient(async function* () {
181
+ yield { type: 'message_start', message: { role: 'assistant', usage: { input_tokens: 10 } } };
182
+ yield {
183
+ type: 'content_block_start',
184
+ index: 0,
185
+ content_block: { type: 'redacted_thinking', data: 'data' },
186
+ };
187
+ yield { type: 'content_block_stop', index: 0 };
188
+ yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 5 } };
189
+ yield { type: 'message_stop' };
190
+ });
191
+ const provider = new AnthropicModel({ client: mockClient });
192
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
193
+ const events = await collectIterator(provider.stream(messages));
194
+ expect(events).toContainEqual({
195
+ type: 'modelContentBlockDeltaEvent',
196
+ delta: { type: 'reasoningContentDelta', redactedContent: 'data' },
197
+ });
198
+ });
199
+ it('handles text payload directly in content_block_start (optimization)', async () => {
200
+ const mockClient = createMockClient(async function* () {
201
+ yield { type: 'message_start', message: { role: 'assistant', usage: { input_tokens: 10 } } };
202
+ yield { type: 'content_block_start', index: 0, content_block: { type: 'text', text: 'Full text' } };
203
+ yield { type: 'content_block_stop', index: 0 };
204
+ yield { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 5 } };
205
+ yield { type: 'message_stop' };
206
+ });
207
+ const provider = new AnthropicModel({ client: mockClient });
208
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
209
+ const events = await collectIterator(provider.stream(messages));
210
+ expect(events).toContainEqual({
211
+ type: 'modelContentBlockDeltaEvent',
212
+ delta: { type: 'textDelta', text: 'Full text' },
213
+ });
214
+ });
215
+ it('handles error during stream', async () => {
216
+ const mockClient = createMockClient(async function* () {
217
+ yield { type: 'ping' }; // Satisfy linter require-yield
218
+ throw new Error('API Error');
219
+ });
220
+ const provider = new AnthropicModel({ client: mockClient });
221
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
222
+ await expect(collectIterator(provider.stream(messages))).rejects.toThrow('API Error');
223
+ });
224
+ it('maps overload error to ContextWindowOverflowError', async () => {
225
+ const mockClient = createMockClient(async function* () {
226
+ yield { type: 'ping' }; // Satisfy linter require-yield
227
+ throw new Error('prompt is too long');
228
+ });
229
+ const provider = new AnthropicModel({ client: mockClient });
230
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
231
+ await expect(collectIterator(provider.stream(messages))).rejects.toThrow(ContextWindowOverflowError);
232
+ });
233
+ it('maps HTTP 429 error to ModelThrottledError', async () => {
234
+ const rateLimitError = Object.assign(new Error('Rate limit exceeded'), { status: 429 });
235
+ // eslint-disable-next-line require-yield
236
+ const mockClient = createMockClient(async function* () {
237
+ throw rateLimitError;
238
+ });
239
+ const provider = new AnthropicModel({ client: mockClient });
240
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
241
+ await expect(collectIterator(provider.stream(messages))).rejects.toThrow(ModelThrottledError);
242
+ await expect(collectIterator(provider.stream(messages))).rejects.toThrow('Rate limit exceeded');
243
+ });
244
+ });
245
+ describe('request formatting', () => {
246
+ // Helper to capture request arguments
247
+ const setupCapture = () => {
248
+ const captured = { request: null };
249
+ const mockClient = {
250
+ messages: {
251
+ stream: vi.fn((req) => {
252
+ captured.request = req;
253
+ return (async function* () { })();
254
+ }),
255
+ },
256
+ };
257
+ return { captured, mockClient };
258
+ };
259
+ it('formats basic request correctly', async () => {
260
+ const { captured, mockClient } = setupCapture();
261
+ const provider = new AnthropicModel({
262
+ modelId: 'claude-3-opus',
263
+ maxTokens: 1000,
264
+ temperature: 0.7,
265
+ client: mockClient,
266
+ });
267
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hello' }] }];
268
+ await collectIterator(provider.stream(messages));
269
+ expect(captured.request).toEqual({
270
+ model: 'claude-3-opus',
271
+ max_tokens: 1000,
272
+ temperature: 0.7,
273
+ messages: [{ role: 'user', content: [{ type: 'text', text: 'Hello' }] }],
274
+ stream: true,
275
+ });
276
+ });
277
+ it('formats tools correctly', async () => {
278
+ const { captured, mockClient } = setupCapture();
279
+ const provider = new AnthropicModel({ client: mockClient });
280
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
281
+ const toolSpecs = [
282
+ {
283
+ name: 'calc',
284
+ description: 'calculate',
285
+ inputSchema: { type: 'object', properties: {} },
286
+ },
287
+ ];
288
+ await collectIterator(provider.stream(messages, { toolSpecs, toolChoice: { auto: {} } }));
289
+ expect(captured.request.tools).toHaveLength(1);
290
+ expect(captured.request.tools[0]).toEqual({
291
+ name: 'calc',
292
+ description: 'calculate',
293
+ input_schema: { type: 'object', properties: {} },
294
+ });
295
+ expect(captured.request.tool_choice).toEqual({ type: 'auto' });
296
+ });
297
+ describe('Prompt Caching (Lookahead logic)', () => {
298
+ it('attaches cache control to message content block followed by cache point', async () => {
299
+ const { captured, mockClient } = setupCapture();
300
+ const provider = new AnthropicModel({ client: mockClient });
301
+ const messages = [
302
+ {
303
+ type: 'message',
304
+ role: 'user',
305
+ content: [
306
+ new TextBlock('Cached content'),
307
+ // Use 'default' here; provider converts it to 'ephemeral' for Anthropic
308
+ new CachePointBlock({ cacheType: 'default' }),
309
+ new TextBlock('Non-cached content'),
310
+ ],
311
+ },
312
+ ];
313
+ await collectIterator(provider.stream(messages));
314
+ const content = captured.request.messages[0].content;
315
+ expect(content).toHaveLength(2); // 3 blocks reduced to 2 (cache point merged)
316
+ expect(content[0]).toEqual({
317
+ type: 'text',
318
+ text: 'Cached content',
319
+ cache_control: { type: 'ephemeral' },
320
+ });
321
+ expect(content[1]).toEqual({
322
+ type: 'text',
323
+ text: 'Non-cached content',
324
+ });
325
+ });
326
+ it('formats system prompt string without cache', async () => {
327
+ const { captured, mockClient } = setupCapture();
328
+ const provider = new AnthropicModel({ client: mockClient });
329
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
330
+ await collectIterator(provider.stream(messages, { systemPrompt: 'System instruction' }));
331
+ expect(captured.request.system).toBe('System instruction');
332
+ });
333
+ it('formats system prompt array with cache points', async () => {
334
+ const { captured, mockClient } = setupCapture();
335
+ const provider = new AnthropicModel({ client: mockClient });
336
+ const messages = [{ type: 'message', role: 'user', content: [{ type: 'textBlock', text: 'Hi' }] }];
337
+ const systemPrompt = [
338
+ new TextBlock('Heavy context'),
339
+ new CachePointBlock({ cacheType: 'default' }),
340
+ new TextBlock('Light context'),
341
+ ];
342
+ await collectIterator(provider.stream(messages, { systemPrompt }));
343
+ expect(Array.isArray(captured.request.system)).toBe(true);
344
+ const system = captured.request.system;
345
+ expect(system).toHaveLength(2);
346
+ expect(system[0]).toEqual({
347
+ type: 'text',
348
+ text: 'Heavy context',
349
+ cache_control: { type: 'ephemeral' },
350
+ });
351
+ expect(system[1]).toEqual({
352
+ type: 'text',
353
+ text: 'Light context',
354
+ });
355
+ });
356
+ });
357
+ describe('Media blocks', () => {
358
+ it('formats images correctly', async () => {
359
+ const { captured, mockClient } = setupCapture();
360
+ const provider = new AnthropicModel({ client: mockClient });
361
+ const imageBytes = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
362
+ const messages = [
363
+ {
364
+ type: 'message',
365
+ role: 'user',
366
+ content: [
367
+ new ImageBlock({
368
+ format: 'png',
369
+ source: { bytes: imageBytes },
370
+ }),
371
+ ],
372
+ },
373
+ ];
374
+ await collectIterator(provider.stream(messages));
375
+ const content = captured.request.messages[0].content[0];
376
+ expect(content.type).toBe('image');
377
+ expect(content.source.media_type).toBe('image/png');
378
+ // Base64 of "Hello" is "SGVsbG8="
379
+ expect(content.source.data).toBe('SGVsbG8=');
380
+ });
381
+ it('formats PDFs correctly', async () => {
382
+ const { captured, mockClient } = setupCapture();
383
+ const provider = new AnthropicModel({ client: mockClient });
384
+ const pdfBytes = new Uint8Array([1, 2, 3]);
385
+ const messages = [
386
+ {
387
+ type: 'message',
388
+ role: 'user',
389
+ content: [
390
+ new DocumentBlock({
391
+ name: 'doc.pdf',
392
+ format: 'pdf',
393
+ source: { bytes: pdfBytes },
394
+ }),
395
+ ],
396
+ },
397
+ ];
398
+ await collectIterator(provider.stream(messages));
399
+ const content = captured.request.messages[0].content[0];
400
+ expect(content.type).toBe('document');
401
+ expect(content.source.media_type).toBe('application/pdf');
402
+ });
403
+ it('logs warning for unsupported GuardContentBlock in user message', async () => {
404
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { }); // Spy on console.warn (via logger)
405
+ const { captured, mockClient } = setupCapture();
406
+ const provider = new AnthropicModel({ client: mockClient });
407
+ const messages = [
408
+ {
409
+ type: 'message',
410
+ role: 'user',
411
+ content: [
412
+ new GuardContentBlock({
413
+ text: { text: 'guard', qualifiers: ['query'] },
414
+ }),
415
+ ],
416
+ },
417
+ ];
418
+ await collectIterator(provider.stream(messages));
419
+ // Should result in empty content if blocked
420
+ expect(captured.request.messages[0].content).toHaveLength(0);
421
+ warnSpy.mockRestore();
422
+ });
423
+ });
424
+ describe('Tool Results', () => {
425
+ it('formats simple text tool result', async () => {
426
+ const { captured, mockClient } = setupCapture();
427
+ const provider = new AnthropicModel({ client: mockClient });
428
+ const messages = [
429
+ {
430
+ type: 'message',
431
+ role: 'user',
432
+ content: [
433
+ {
434
+ type: 'toolResultBlock',
435
+ toolUseId: 't1',
436
+ status: 'success',
437
+ content: [{ type: 'textBlock', text: '42' }],
438
+ },
439
+ ],
440
+ },
441
+ ];
442
+ await collectIterator(provider.stream(messages));
443
+ const content = captured.request.messages[0].content[0];
444
+ expect(content.type).toBe('tool_result');
445
+ expect(content.tool_use_id).toBe('t1');
446
+ expect(content.content).toBe('42'); // Simplified to string
447
+ expect(content.is_error).toBe(false);
448
+ });
449
+ it('formats mixed tool result (json/image)', async () => {
450
+ const { captured, mockClient } = setupCapture();
451
+ const provider = new AnthropicModel({ client: mockClient });
452
+ const messages = [
453
+ {
454
+ type: 'message',
455
+ role: 'user',
456
+ content: [
457
+ {
458
+ type: 'toolResultBlock',
459
+ toolUseId: 't1',
460
+ status: 'error',
461
+ content: [
462
+ { type: 'jsonBlock', json: { error: 'failed' } },
463
+ { type: 'textBlock', text: 'Details here' },
464
+ ],
465
+ },
466
+ ],
467
+ },
468
+ ];
469
+ await collectIterator(provider.stream(messages));
470
+ const content = captured.request.messages[0].content[0];
471
+ expect(content.type).toBe('tool_result');
472
+ expect(content.is_error).toBe(true);
473
+ expect(Array.isArray(content.content)).toBe(true);
474
+ // JSON is stringified in Anthropic tool result content
475
+ expect(content.content[0]).toEqual({ type: 'text', text: '{"error":"failed"}' });
476
+ expect(content.content[1]).toEqual({ type: 'text', text: 'Details here' });
477
+ });
478
+ });
479
+ });
480
+ });
481
+ //# sourceMappingURL=anthropic.test.js.map