@strands-agents/sdk 1.0.0-rc.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +175 -0
- package/README.md +340 -0
- package/dist/src/__fixtures__/agent-helpers.d.ts +22 -1
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +45 -1
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -1
- package/dist/src/__fixtures__/mock-plugin.js +3 -1
- package/dist/src/__fixtures__/mock-plugin.js.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts +5 -2
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +23 -4
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/__tests__/interrupt.test.d.ts +2 -0
- package/dist/src/__tests__/interrupt.test.d.ts.map +1 -0
- package/dist/src/__tests__/interrupt.test.js +259 -0
- package/dist/src/__tests__/interrupt.test.js.map +1 -0
- package/dist/src/__tests__/mcp.test.js +448 -2
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/a2a/__tests__/events.test.js +2 -0
- package/dist/src/a2a/__tests__/events.test.js.map +1 -1
- package/dist/src/a2a/__tests__/executor.test.js +16 -5
- package/dist/src/a2a/__tests__/executor.test.js.map +1 -1
- package/dist/src/a2a/a2a-agent.d.ts +8 -3
- package/dist/src/a2a/a2a-agent.d.ts.map +1 -1
- package/dist/src/a2a/a2a-agent.js +12 -6
- package/dist/src/a2a/a2a-agent.js.map +1 -1
- package/dist/src/a2a/executor.d.ts +13 -0
- package/dist/src/a2a/executor.d.ts.map +1 -1
- package/dist/src/a2a/executor.js +19 -1
- package/dist/src/a2a/executor.js.map +1 -1
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +23 -0
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.cancel.test.js +1 -1
- package/dist/src/agent/__tests__/agent.cancel.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.concurrent.test.js +488 -0
- package/dist/src/agent/__tests__/agent.concurrent.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.hook.test.js +724 -12
- package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.js +730 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.invocation-state.test.js +219 -0
- package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.js +161 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.stateful-model.test.js +169 -0
- package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.test.js +217 -2
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.tracer.test.node.js +39 -0
- package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +1 -1
- package/dist/src/agent/__tests__/snapshot.test.js +51 -4
- package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
- package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
- package/dist/src/agent/agent-as-tool.js +4 -2
- package/dist/src/agent/agent-as-tool.js.map +1 -1
- package/dist/src/agent/agent.d.ts +109 -4
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +790 -224
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/snapshot.d.ts +2 -2
- package/dist/src/agent/snapshot.d.ts.map +1 -1
- package/dist/src/agent/snapshot.js +20 -2
- package/dist/src/agent/snapshot.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +230 -9
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +19 -6
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +58 -4
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +76 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.d.ts +67 -22
- package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.js +65 -13
- package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/index.d.ts +1 -1
- package/dist/src/conversation-manager/index.d.ts.map +1 -1
- package/dist/src/conversation-manager/index.js +1 -1
- package/dist/src/conversation-manager/index.js.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +17 -3
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +10 -4
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +23 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.js +39 -17
- package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
- package/dist/src/errors.d.ts +11 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +12 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/hooks/__tests__/events.test.js +267 -73
- package/dist/src/hooks/__tests__/events.test.js.map +1 -1
- package/dist/src/hooks/__tests__/registry.test.js +182 -18
- package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +193 -51
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js +182 -26
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +3 -2
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +1 -0
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/registry.d.ts +12 -12
- package/dist/src/hooks/registry.d.ts.map +1 -1
- package/dist/src/hooks/registry.js +55 -15
- package/dist/src/hooks/registry.js.map +1 -1
- package/dist/src/hooks/types.d.ts +23 -0
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/hooks/types.js +17 -1
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/index.d.ts +12 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/interrupt.d.ts +220 -0
- package/dist/src/interrupt.d.ts.map +1 -0
- package/dist/src/interrupt.js +274 -0
- package/dist/src/interrupt.js.map +1 -0
- package/dist/src/logging/__tests__/warn-once.test.d.ts +2 -0
- package/dist/src/logging/__tests__/warn-once.test.d.ts.map +1 -0
- package/dist/src/logging/__tests__/warn-once.test.js +30 -0
- package/dist/src/logging/__tests__/warn-once.test.js.map +1 -0
- package/dist/src/logging/warn-once.d.ts +13 -0
- package/dist/src/logging/warn-once.d.ts.map +1 -0
- package/dist/src/logging/warn-once.js +18 -0
- package/dist/src/logging/warn-once.js.map +1 -0
- package/dist/src/mcp.d.ts +43 -3
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +85 -17
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/mime.d.ts +2 -1
- package/dist/src/mime.d.ts.map +1 -1
- package/dist/src/mime.js +1 -0
- package/dist/src/mime.js.map +1 -1
- package/dist/src/models/__tests__/anthropic.test.js +147 -3
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +228 -2
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/defaults.test.d.ts +2 -0
- package/dist/src/models/__tests__/defaults.test.d.ts.map +1 -0
- package/dist/src/models/__tests__/defaults.test.js +36 -0
- package/dist/src/models/__tests__/defaults.test.js.map +1 -0
- package/dist/src/models/__tests__/google.test.js +135 -0
- package/dist/src/models/__tests__/google.test.js.map +1 -1
- package/dist/src/models/__tests__/model.test.js +149 -1
- package/dist/src/models/__tests__/model.test.js.map +1 -1
- package/dist/src/models/anthropic.d.ts +20 -1
- package/dist/src/models/anthropic.d.ts.map +1 -1
- package/dist/src/models/anthropic.js +42 -8
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts +27 -1
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +100 -12
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/defaults.d.ts +47 -0
- package/dist/src/models/defaults.d.ts.map +1 -0
- package/dist/src/models/defaults.js +170 -0
- package/dist/src/models/defaults.js.map +1 -0
- package/dist/src/models/google/model.d.ts +14 -1
- package/dist/src/models/google/model.d.ts.map +1 -1
- package/dist/src/models/google/model.js +54 -8
- package/dist/src/models/google/model.js.map +1 -1
- package/dist/src/models/google/types.d.ts +8 -0
- package/dist/src/models/google/types.d.ts.map +1 -1
- package/dist/src/models/model.d.ts +65 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +138 -0
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/openai/__tests__/chat.test.d.ts +2 -0
- package/dist/src/models/openai/__tests__/chat.test.d.ts.map +1 -0
- package/dist/src/models/{__tests__/openai.test.js → openai/__tests__/chat.test.js} +117 -7
- package/dist/src/models/openai/__tests__/chat.test.js.map +1 -0
- package/dist/src/models/openai/__tests__/responses.test.d.ts +2 -0
- package/dist/src/models/openai/__tests__/responses.test.d.ts.map +1 -0
- package/dist/src/models/openai/__tests__/responses.test.js +668 -0
- package/dist/src/models/openai/__tests__/responses.test.js.map +1 -0
- package/dist/src/models/openai/chat-adapter.d.ts +33 -0
- package/dist/src/models/openai/chat-adapter.d.ts.map +1 -0
- package/dist/src/models/openai/chat-adapter.js +383 -0
- package/dist/src/models/openai/chat-adapter.js.map +1 -0
- package/dist/src/models/openai/errors.d.ts +16 -0
- package/dist/src/models/openai/errors.d.ts.map +1 -0
- package/dist/src/models/openai/errors.js +40 -0
- package/dist/src/models/openai/errors.js.map +1 -0
- package/dist/src/models/openai/formatting.d.ts +18 -0
- package/dist/src/models/openai/formatting.d.ts.map +1 -0
- package/dist/src/models/openai/formatting.js +38 -0
- package/dist/src/models/openai/formatting.js.map +1 -0
- package/dist/src/models/openai/index.d.ts +19 -0
- package/dist/src/models/openai/index.d.ts.map +1 -0
- package/dist/src/models/openai/index.js +18 -0
- package/dist/src/models/openai/index.js.map +1 -0
- package/dist/src/models/openai/model.d.ts +77 -0
- package/dist/src/models/openai/model.d.ts.map +1 -0
- package/dist/src/models/openai/model.js +211 -0
- package/dist/src/models/openai/model.js.map +1 -0
- package/dist/src/models/openai/responses-adapter.d.ts +78 -0
- package/dist/src/models/openai/responses-adapter.d.ts.map +1 -0
- package/dist/src/models/openai/responses-adapter.js +467 -0
- package/dist/src/models/openai/responses-adapter.js.map +1 -0
- package/dist/src/models/openai/types.d.ts +131 -0
- package/dist/src/models/openai/types.d.ts.map +1 -0
- package/dist/src/models/openai/types.js +5 -0
- package/dist/src/models/openai/types.js.map +1 -0
- package/dist/src/multiagent/__tests__/events.test.js +122 -28
- package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +95 -0
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/graph.test.js +69 -0
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/nodes.test.js +18 -2
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +56 -0
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/swarm.test.js +77 -0
- package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
- package/dist/src/multiagent/events.d.ts +19 -1
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +18 -0
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +27 -5
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +61 -15
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/multiagent/index.d.ts +1 -1
- package/dist/src/multiagent/index.d.ts.map +1 -1
- package/dist/src/multiagent/multiagent.d.ts +21 -6
- package/dist/src/multiagent/multiagent.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +28 -3
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +42 -7
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +20 -4
- package/dist/src/multiagent/swarm.d.ts.map +1 -1
- package/dist/src/multiagent/swarm.js +65 -16
- package/dist/src/multiagent/swarm.js.map +1 -1
- package/dist/src/plugins/__tests__/registry.test.js +1 -1
- package/dist/src/plugins/__tests__/registry.test.js.map +1 -1
- package/dist/src/plugins/model-plugin.d.ts +20 -0
- package/dist/src/plugins/model-plugin.d.ts.map +1 -0
- package/dist/src/plugins/model-plugin.js +29 -0
- package/dist/src/plugins/model-plugin.js.map +1 -0
- package/dist/src/registry/__tests__/tool-registry.test.js +11 -0
- package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
- package/dist/src/registry/tool-registry.d.ts +4 -0
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +6 -0
- package/dist/src/registry/tool-registry.js.map +1 -1
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +2 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +1 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.js +116 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.js.map +1 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +2 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +1 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +225 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +1 -0
- package/dist/src/retry/backoff-strategy.d.ts +108 -0
- package/dist/src/retry/backoff-strategy.d.ts.map +1 -0
- package/dist/src/retry/backoff-strategy.js +86 -0
- package/dist/src/retry/backoff-strategy.js.map +1 -0
- package/dist/src/retry/default-model-retry-strategy.d.ts +76 -0
- package/dist/src/retry/default-model-retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/default-model-retry-strategy.js +104 -0
- package/dist/src/retry/default-model-retry-strategy.js.map +1 -0
- package/dist/src/retry/index.d.ts +8 -0
- package/dist/src/retry/index.d.ts.map +1 -0
- package/dist/src/retry/index.js +7 -0
- package/dist/src/retry/index.js.map +1 -0
- package/dist/src/retry/model-retry-strategy.d.ts +80 -0
- package/dist/src/retry/model-retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/model-retry-strategy.js +85 -0
- package/dist/src/retry/model-retry-strategy.js.map +1 -0
- package/dist/src/retry/retry-strategy.d.ts +34 -0
- package/dist/src/retry/retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/retry-strategy.js +25 -0
- package/dist/src/retry/retry-strategy.js.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.js +52 -11
- package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +6 -0
- package/dist/src/session/session-manager.d.ts.map +1 -1
- package/dist/src/session/session-manager.js +17 -0
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/telemetry/__tests__/meter.test.js +23 -0
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
- package/dist/src/telemetry/meter.d.ts +15 -0
- package/dist/src/telemetry/meter.d.ts.map +1 -1
- package/dist/src/telemetry/meter.js +14 -0
- package/dist/src/telemetry/meter.js.map +1 -1
- package/dist/src/tools/__tests__/tool.test.js +24 -1
- package/dist/src/tools/__tests__/tool.test.js.map +1 -1
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +6 -1
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +24 -3
- package/dist/src/tools/mcp-tool.d.ts.map +1 -1
- package/dist/src/tools/mcp-tool.js +103 -31
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/tool.d.ts +21 -2
- package/dist/src/tools/tool.d.ts.map +1 -1
- package/dist/src/tools/tool.js +12 -0
- package/dist/src/tools/tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/agent.test.js +48 -0
- package/dist/src/types/__tests__/agent.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +77 -9
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +30 -6
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/elicitation.d.ts +15 -0
- package/dist/src/types/elicitation.d.ts.map +1 -0
- package/dist/src/types/elicitation.js +2 -0
- package/dist/src/types/elicitation.js.map +1 -0
- package/dist/src/types/interrupt.d.ts +103 -0
- package/dist/src/types/interrupt.d.ts.map +1 -0
- package/dist/src/types/interrupt.js +63 -0
- package/dist/src/types/interrupt.js.map +1 -0
- package/dist/src/types/messages.d.ts +2 -1
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +292 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +148 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +78 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/index.d.ts +23 -0
- package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/index.js +21 -0
- package/dist/src/vended-plugins/context-offloader/index.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts +48 -0
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/plugin.js +244 -0
- package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/storage.d.ts +114 -0
- package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/storage.js +204 -0
- package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -0
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +21 -5
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +4 -0
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
- package/dist/src/vended-tools/bash/bash.js +0 -3
- package/dist/src/vended-tools/bash/bash.js.map +1 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +4 -0
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +4 -0
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
- package/package.json +17 -9
- package/dist/src/models/__tests__/openai.test.d.ts +0 -2
- package/dist/src/models/__tests__/openai.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/openai.test.js.map +0 -1
- package/dist/src/models/openai.d.ts +0 -312
- package/dist/src/models/openai.d.ts.map +0 -1
- package/dist/src/models/openai.js +0 -789
- package/dist/src/models/openai.js.map +0 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// Tests use vi.useFakeTimers() so the internal `await sleep(...)` never waits
|
|
2
|
+
// real wall time — timers are advanced manually with vi.advanceTimersByTimeAsync.
|
|
3
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
4
|
+
import { DefaultModelRetryStrategy } from '../default-model-retry-strategy.js';
|
|
5
|
+
import { ModelRetryStrategy } from '../model-retry-strategy.js';
|
|
6
|
+
import { ConstantBackoff } from '../backoff-strategy.js';
|
|
7
|
+
import { AfterModelCallEvent } from '../../hooks/events.js';
|
|
8
|
+
import { ModelThrottledError } from '../../errors.js';
|
|
9
|
+
import { createMockAgent, invokeTrackedHook } from '../../__fixtures__/agent-helpers.js';
|
|
10
|
+
function makeErrorEvent(agent, error, attemptCount) {
|
|
11
|
+
return new AfterModelCallEvent({ agent, model: {}, attemptCount, error, invocationState: {} });
|
|
12
|
+
}
|
|
13
|
+
describe('DefaultModelRetryStrategy', () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.useFakeTimers();
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.useRealTimers();
|
|
19
|
+
});
|
|
20
|
+
it('registers an AfterModelCallEvent hook', () => {
|
|
21
|
+
const strategy = new DefaultModelRetryStrategy();
|
|
22
|
+
const agent = createMockAgent();
|
|
23
|
+
strategy.initAgent(agent);
|
|
24
|
+
const types = agent.trackedHooks.map((h) => h.eventType);
|
|
25
|
+
expect(types).toContain(AfterModelCallEvent);
|
|
26
|
+
});
|
|
27
|
+
it('exposes the plugin name', () => {
|
|
28
|
+
expect(new DefaultModelRetryStrategy().name).toBe('strands:default-model-retry-strategy');
|
|
29
|
+
});
|
|
30
|
+
it('is a ModelRetryStrategy', () => {
|
|
31
|
+
expect(new DefaultModelRetryStrategy()).toBeInstanceOf(ModelRetryStrategy);
|
|
32
|
+
});
|
|
33
|
+
it('rejects maxAttempts below 1', () => {
|
|
34
|
+
expect(() => new DefaultModelRetryStrategy({ maxAttempts: 0 })).toThrow(/maxAttempts/);
|
|
35
|
+
});
|
|
36
|
+
it('sets retry=true on ModelThrottledError and sleeps for the configured delay', async () => {
|
|
37
|
+
const strategy = new DefaultModelRetryStrategy({
|
|
38
|
+
maxAttempts: 3,
|
|
39
|
+
backoff: new ConstantBackoff({ delayMs: 500 }),
|
|
40
|
+
});
|
|
41
|
+
const agent = createMockAgent();
|
|
42
|
+
strategy.initAgent(agent);
|
|
43
|
+
const event = makeErrorEvent(agent, new ModelThrottledError('rate limited'), 1);
|
|
44
|
+
const pending = invokeTrackedHook(agent, event);
|
|
45
|
+
// Before the timer advances, the hook is still awaiting sleep — retry not yet set.
|
|
46
|
+
await vi.advanceTimersByTimeAsync(499);
|
|
47
|
+
expect(event.retry).toBeUndefined();
|
|
48
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
49
|
+
await pending;
|
|
50
|
+
expect(event.retry).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it('does not retry non-retryable errors', async () => {
|
|
53
|
+
const strategy = new DefaultModelRetryStrategy({
|
|
54
|
+
backoff: new ConstantBackoff({ delayMs: 10 }),
|
|
55
|
+
});
|
|
56
|
+
const agent = createMockAgent();
|
|
57
|
+
strategy.initAgent(agent);
|
|
58
|
+
const event = makeErrorEvent(agent, new Error('boom'), 1);
|
|
59
|
+
await invokeTrackedHook(agent, event);
|
|
60
|
+
expect(event.retry).toBeUndefined();
|
|
61
|
+
});
|
|
62
|
+
it('stops retrying once maxAttempts is reached', async () => {
|
|
63
|
+
const strategy = new DefaultModelRetryStrategy({
|
|
64
|
+
maxAttempts: 3,
|
|
65
|
+
backoff: new ConstantBackoff({ delayMs: 1 }),
|
|
66
|
+
});
|
|
67
|
+
const agent = createMockAgent();
|
|
68
|
+
strategy.initAgent(agent);
|
|
69
|
+
// Attempt 1 → retry
|
|
70
|
+
const e1 = makeErrorEvent(agent, new ModelThrottledError('x'), 1);
|
|
71
|
+
const p1 = invokeTrackedHook(agent, e1);
|
|
72
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
73
|
+
await p1;
|
|
74
|
+
expect(e1.retry).toBe(true);
|
|
75
|
+
// Attempt 2 → retry
|
|
76
|
+
const e2 = makeErrorEvent(agent, new ModelThrottledError('x'), 2);
|
|
77
|
+
const p2 = invokeTrackedHook(agent, e2);
|
|
78
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
79
|
+
await p2;
|
|
80
|
+
expect(e2.retry).toBe(true);
|
|
81
|
+
// Attempt 3 → at max, should not retry
|
|
82
|
+
const e3 = makeErrorEvent(agent, new ModelThrottledError('x'), 3);
|
|
83
|
+
await invokeTrackedHook(agent, e3);
|
|
84
|
+
expect(e3.retry).toBeUndefined();
|
|
85
|
+
});
|
|
86
|
+
it('skips work if another hook already requested retry', async () => {
|
|
87
|
+
const strategy = new DefaultModelRetryStrategy({
|
|
88
|
+
maxAttempts: 5,
|
|
89
|
+
backoff: new ConstantBackoff({ delayMs: 1000 }),
|
|
90
|
+
});
|
|
91
|
+
const agent = createMockAgent();
|
|
92
|
+
strategy.initAgent(agent);
|
|
93
|
+
const event = makeErrorEvent(agent, new ModelThrottledError('x'), 1);
|
|
94
|
+
event.retry = true;
|
|
95
|
+
// Should return immediately with no sleep — if it tried to sleep we'd see
|
|
96
|
+
// hung test state; resolving without advancing timers proves the skip.
|
|
97
|
+
await invokeTrackedHook(agent, event);
|
|
98
|
+
expect(event.retry).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
it('clears backoff state at the start of each new turn', async () => {
|
|
101
|
+
// The strategy resets state on `attemptCount === 1` regardless of how
|
|
102
|
+
// the prior turn ended. This exercises that: a turn racks up a retry
|
|
103
|
+
// (lastDelayMs = 5), then the next turn's first attempt must see a
|
|
104
|
+
// fresh BackoffContext (no lastDelayMs).
|
|
105
|
+
const nextDelay = vi.fn().mockReturnValue(5);
|
|
106
|
+
const backoff = { nextDelay };
|
|
107
|
+
const strategy = new DefaultModelRetryStrategy({ maxAttempts: 5, backoff });
|
|
108
|
+
const agent = createMockAgent();
|
|
109
|
+
strategy.initAgent(agent);
|
|
110
|
+
// Turn 1 → fail → lastDelayMs gets set to 5.
|
|
111
|
+
const e1 = makeErrorEvent(agent, new ModelThrottledError('x'), 1);
|
|
112
|
+
const p1 = invokeTrackedHook(agent, e1);
|
|
113
|
+
await vi.advanceTimersByTimeAsync(5);
|
|
114
|
+
await p1;
|
|
115
|
+
// Turn 2 → fail on first attempt → should see no lastDelayMs.
|
|
116
|
+
const e2 = makeErrorEvent(agent, new ModelThrottledError('x'), 1);
|
|
117
|
+
const p2 = invokeTrackedHook(agent, e2);
|
|
118
|
+
await vi.advanceTimersByTimeAsync(5);
|
|
119
|
+
await p2;
|
|
120
|
+
expect(nextDelay.mock.calls[1][0]).toEqual({
|
|
121
|
+
attempt: 1,
|
|
122
|
+
elapsedMs: expect.any(Number),
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
it('passes BackoffContext with attempt and lastDelayMs to the backoff strategy', async () => {
|
|
126
|
+
const nextDelay = vi.fn().mockReturnValue(5);
|
|
127
|
+
const backoff = { nextDelay };
|
|
128
|
+
const strategy = new DefaultModelRetryStrategy({ maxAttempts: 5, backoff });
|
|
129
|
+
const agent = createMockAgent();
|
|
130
|
+
strategy.initAgent(agent);
|
|
131
|
+
const e1 = makeErrorEvent(agent, new ModelThrottledError('x'), 1);
|
|
132
|
+
const p1 = invokeTrackedHook(agent, e1);
|
|
133
|
+
await vi.advanceTimersByTimeAsync(5);
|
|
134
|
+
await p1;
|
|
135
|
+
expect(nextDelay).toHaveBeenCalledTimes(1);
|
|
136
|
+
expect(nextDelay.mock.calls[0][0]).toEqual({
|
|
137
|
+
attempt: 1,
|
|
138
|
+
elapsedMs: expect.any(Number),
|
|
139
|
+
});
|
|
140
|
+
const e2 = makeErrorEvent(agent, new ModelThrottledError('x'), 2);
|
|
141
|
+
const p2 = invokeTrackedHook(agent, e2);
|
|
142
|
+
await vi.advanceTimersByTimeAsync(5);
|
|
143
|
+
await p2;
|
|
144
|
+
expect(nextDelay).toHaveBeenCalledTimes(2);
|
|
145
|
+
expect(nextDelay.mock.calls[1][0]).toEqual({
|
|
146
|
+
attempt: 2,
|
|
147
|
+
elapsedMs: expect.any(Number),
|
|
148
|
+
lastDelayMs: 5,
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
it('clears per-turn state on attempt 1 even when a prior hook already set event.retry', async () => {
|
|
152
|
+
// Regression: onFirstModelAttempt must fire before the event.retry short-circuit.
|
|
153
|
+
// Otherwise state from a prior turn leaks into the new turn's BackoffContext.
|
|
154
|
+
const nextDelay = vi.fn().mockReturnValue(5);
|
|
155
|
+
const backoff = { nextDelay };
|
|
156
|
+
const strategy = new DefaultModelRetryStrategy({ maxAttempts: 5, backoff });
|
|
157
|
+
const agent = createMockAgent();
|
|
158
|
+
strategy.initAgent(agent);
|
|
159
|
+
// Turn 1 → fail → lastDelayMs gets set to 5.
|
|
160
|
+
const e1 = makeErrorEvent(agent, new ModelThrottledError('x'), 1);
|
|
161
|
+
const p1 = invokeTrackedHook(agent, e1);
|
|
162
|
+
await vi.advanceTimersByTimeAsync(5);
|
|
163
|
+
await p1;
|
|
164
|
+
// Turn 2 → attempt 1 → another hook already set retry=true before us.
|
|
165
|
+
// We should still clear state (onFirstModelAttempt runs first), even though
|
|
166
|
+
// we short-circuit and don't call computeRetryDecision.
|
|
167
|
+
const e2 = makeErrorEvent(agent, new ModelThrottledError('x'), 1);
|
|
168
|
+
e2.retry = true;
|
|
169
|
+
await invokeTrackedHook(agent, e2);
|
|
170
|
+
// Turn 2 → attempt 2 → backoff should see no lastDelayMs from turn 1.
|
|
171
|
+
const e3 = makeErrorEvent(agent, new ModelThrottledError('x'), 2);
|
|
172
|
+
const p3 = invokeTrackedHook(agent, e3);
|
|
173
|
+
await vi.advanceTimersByTimeAsync(5);
|
|
174
|
+
await p3;
|
|
175
|
+
// Second call is turn 2 attempt 2; must not carry turn 1's lastDelayMs.
|
|
176
|
+
expect(nextDelay.mock.calls[1][0]).toEqual({
|
|
177
|
+
attempt: 2,
|
|
178
|
+
elapsedMs: expect.any(Number),
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
it('lets subclasses expand the retryable set by overriding isRetryable', async () => {
|
|
182
|
+
class CustomError extends Error {
|
|
183
|
+
}
|
|
184
|
+
class PermissiveStrategy extends DefaultModelRetryStrategy {
|
|
185
|
+
name = 'test:permissive';
|
|
186
|
+
isRetryable(error) {
|
|
187
|
+
return super.isRetryable(error) || error instanceof CustomError;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const strategy = new PermissiveStrategy({
|
|
191
|
+
maxAttempts: 3,
|
|
192
|
+
backoff: new ConstantBackoff({ delayMs: 10 }),
|
|
193
|
+
});
|
|
194
|
+
const agent = createMockAgent();
|
|
195
|
+
strategy.initAgent(agent);
|
|
196
|
+
const event = makeErrorEvent(agent, new CustomError('custom'), 1);
|
|
197
|
+
const pending = invokeTrackedHook(agent, event);
|
|
198
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
199
|
+
await pending;
|
|
200
|
+
expect(event.retry).toBe(true);
|
|
201
|
+
});
|
|
202
|
+
it('short-circuits without retry when computeRetryDecision returns retry:false for a non-max reason', async () => {
|
|
203
|
+
// Exercises the computeRetryDecision "return { retry: false }" branch that
|
|
204
|
+
// isn't about maxAttempts. A subclass declines to retry a specific error
|
|
205
|
+
// instance even though the classifier said it was retryable in principle.
|
|
206
|
+
class PickyStrategy extends DefaultModelRetryStrategy {
|
|
207
|
+
name = 'test:picky';
|
|
208
|
+
computeRetryDecision(event) {
|
|
209
|
+
if (event.error.message === 'skip')
|
|
210
|
+
return { retry: false };
|
|
211
|
+
return super.computeRetryDecision(event);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const strategy = new PickyStrategy({
|
|
215
|
+
maxAttempts: 5,
|
|
216
|
+
backoff: new ConstantBackoff({ delayMs: 10 }),
|
|
217
|
+
});
|
|
218
|
+
const agent = createMockAgent();
|
|
219
|
+
strategy.initAgent(agent);
|
|
220
|
+
const event = makeErrorEvent(agent, new ModelThrottledError('skip'), 1);
|
|
221
|
+
await invokeTrackedHook(agent, event);
|
|
222
|
+
expect(event.retry).toBeUndefined();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=default-model-retry-strategy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-model-retry-strategy.test.js","sourceRoot":"","sources":["../../../../src/retry/__tests__/default-model-retry-strategy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backoff strategies for computing delay between retry attempts.
|
|
3
|
+
*
|
|
4
|
+
* A `BackoffStrategy` is pure delay math: given a `BackoffContext`, it returns
|
|
5
|
+
* how long to wait before the next attempt. Policy concerns — whether to retry,
|
|
6
|
+
* whether to honor a server-provided `Retry-After` hint, max attempts, total
|
|
7
|
+
* time budgets — live in the retry orchestration layer, not here.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Context passed to a {@link BackoffStrategy} for each retry decision.
|
|
11
|
+
*
|
|
12
|
+
* Treated as an open, additive-only contract: new optional fields may be added
|
|
13
|
+
* over time, but existing fields will not be removed or repurposed.
|
|
14
|
+
*/
|
|
15
|
+
export interface BackoffContext {
|
|
16
|
+
/** 1-based index of the attempt that just failed. Must be \>= 1. */
|
|
17
|
+
attempt: number;
|
|
18
|
+
/** Total milliseconds elapsed since the first attempt started. */
|
|
19
|
+
elapsedMs: number;
|
|
20
|
+
/** Previously computed delay, if any. Absent before the first retry. */
|
|
21
|
+
lastDelayMs?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Computes the delay before the next retry attempt.
|
|
25
|
+
*/
|
|
26
|
+
export interface BackoffStrategy {
|
|
27
|
+
/**
|
|
28
|
+
* Returns the delay in milliseconds before the next attempt.
|
|
29
|
+
*
|
|
30
|
+
* Must be a non-negative finite number. Implementations should treat
|
|
31
|
+
* `ctx.attempt < 1` as a programmer error.
|
|
32
|
+
*/
|
|
33
|
+
nextDelay(ctx: BackoffContext): number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Supported jitter modes.
|
|
37
|
+
*
|
|
38
|
+
* - `none`: return the raw delay unchanged
|
|
39
|
+
* - `full`: uniform random in `[0, raw]`
|
|
40
|
+
* - `equal`: `raw/2 + uniform(0, raw/2)` (half fixed, half random)
|
|
41
|
+
* - `decorrelated`: `uniform(baseMs, lastDelayMs * 3)`, capped at `maxMs`;
|
|
42
|
+
* falls back to `full` on the first retry when `lastDelayMs` is unavailable
|
|
43
|
+
*
|
|
44
|
+
* For jitter outside these modes, implement {@link BackoffStrategy} directly.
|
|
45
|
+
*/
|
|
46
|
+
export type JitterKind = 'none' | 'full' | 'equal' | 'decorrelated';
|
|
47
|
+
/**
|
|
48
|
+
* Options for {@link ConstantBackoff}.
|
|
49
|
+
*/
|
|
50
|
+
export interface ConstantBackoffOptions {
|
|
51
|
+
/** Delay in ms returned for every retry. Default 1000. */
|
|
52
|
+
delayMs?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Constant backoff: returns the same delay for every retry.
|
|
56
|
+
*/
|
|
57
|
+
export declare class ConstantBackoff implements BackoffStrategy {
|
|
58
|
+
private readonly _delayMs;
|
|
59
|
+
constructor(opts?: ConstantBackoffOptions);
|
|
60
|
+
nextDelay(ctx: BackoffContext): number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Options for {@link LinearBackoff}.
|
|
64
|
+
*/
|
|
65
|
+
export interface LinearBackoffOptions {
|
|
66
|
+
/** Base delay in ms. Delay grows as `baseMs * attempt`. Default 1000. */
|
|
67
|
+
baseMs?: number;
|
|
68
|
+
/** Upper bound applied before jitter. Default 30_000. */
|
|
69
|
+
maxMs?: number;
|
|
70
|
+
/** Jitter mode. Default 'full'. */
|
|
71
|
+
jitter?: JitterKind;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Linear backoff: delay grows as `baseMs * attempt`, capped at `maxMs`, then jittered.
|
|
75
|
+
*/
|
|
76
|
+
export declare class LinearBackoff implements BackoffStrategy {
|
|
77
|
+
private readonly _baseMs;
|
|
78
|
+
private readonly _maxMs;
|
|
79
|
+
private readonly _jitter;
|
|
80
|
+
constructor(opts?: LinearBackoffOptions);
|
|
81
|
+
nextDelay(ctx: BackoffContext): number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Options for {@link ExponentialBackoff}.
|
|
85
|
+
*/
|
|
86
|
+
export interface ExponentialBackoffOptions {
|
|
87
|
+
/** Base delay in ms. Delay grows as `baseMs * multiplier^(attempt-1)`. Default 1000. */
|
|
88
|
+
baseMs?: number;
|
|
89
|
+
/** Upper bound applied before jitter. Default 30_000. */
|
|
90
|
+
maxMs?: number;
|
|
91
|
+
/** Growth factor per attempt. Default 2. */
|
|
92
|
+
multiplier?: number;
|
|
93
|
+
/** Jitter mode. Default 'full'. */
|
|
94
|
+
jitter?: JitterKind;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Exponential backoff: delay grows as `baseMs * multiplier^(attempt-1)`,
|
|
98
|
+
* capped at `maxMs`, then jittered.
|
|
99
|
+
*/
|
|
100
|
+
export declare class ExponentialBackoff implements BackoffStrategy {
|
|
101
|
+
private readonly _baseMs;
|
|
102
|
+
private readonly _maxMs;
|
|
103
|
+
private readonly _multiplier;
|
|
104
|
+
private readonly _jitter;
|
|
105
|
+
constructor(opts?: ExponentialBackoffOptions);
|
|
106
|
+
nextDelay(ctx: BackoffContext): number;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=backoff-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff-strategy.d.ts","sourceRoot":"","sources":["../../../src/retry/backoff-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAAA;CACvC;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,CAAA;AAQnE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;gBAErB,IAAI,GAAE,sBAA2B;IAI7C,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAIvC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;gBAExB,IAAI,GAAE,oBAAyB;IAM3C,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAKvC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;gBAExB,IAAI,GAAE,yBAA8B;IAOhD,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAKvC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backoff strategies for computing delay between retry attempts.
|
|
3
|
+
*
|
|
4
|
+
* A `BackoffStrategy` is pure delay math: given a `BackoffContext`, it returns
|
|
5
|
+
* how long to wait before the next attempt. Policy concerns — whether to retry,
|
|
6
|
+
* whether to honor a server-provided `Retry-After` hint, max attempts, total
|
|
7
|
+
* time budgets — live in the retry orchestration layer, not here.
|
|
8
|
+
*/
|
|
9
|
+
function validateAttempt(attempt, className) {
|
|
10
|
+
if (!Number.isInteger(attempt) || attempt < 1) {
|
|
11
|
+
throw new Error(`${className}: attempt must be an integer >= 1 (got ${attempt})`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Constant backoff: returns the same delay for every retry.
|
|
16
|
+
*/
|
|
17
|
+
export class ConstantBackoff {
|
|
18
|
+
_delayMs;
|
|
19
|
+
constructor(opts = {}) {
|
|
20
|
+
this._delayMs = opts.delayMs ?? 1000;
|
|
21
|
+
}
|
|
22
|
+
nextDelay(ctx) {
|
|
23
|
+
validateAttempt(ctx.attempt, 'ConstantBackoff');
|
|
24
|
+
return this._delayMs;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Linear backoff: delay grows as `baseMs * attempt`, capped at `maxMs`, then jittered.
|
|
29
|
+
*/
|
|
30
|
+
export class LinearBackoff {
|
|
31
|
+
_baseMs;
|
|
32
|
+
_maxMs;
|
|
33
|
+
_jitter;
|
|
34
|
+
constructor(opts = {}) {
|
|
35
|
+
this._baseMs = opts.baseMs ?? 1000;
|
|
36
|
+
this._maxMs = opts.maxMs ?? 30_000;
|
|
37
|
+
this._jitter = opts.jitter ?? 'full';
|
|
38
|
+
}
|
|
39
|
+
nextDelay(ctx) {
|
|
40
|
+
validateAttempt(ctx.attempt, 'LinearBackoff');
|
|
41
|
+
const raw = Math.min(this._maxMs, this._baseMs * ctx.attempt);
|
|
42
|
+
return jitter(raw, this._jitter, this._baseMs, this._maxMs, ctx.lastDelayMs);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Exponential backoff: delay grows as `baseMs * multiplier^(attempt-1)`,
|
|
47
|
+
* capped at `maxMs`, then jittered.
|
|
48
|
+
*/
|
|
49
|
+
export class ExponentialBackoff {
|
|
50
|
+
_baseMs;
|
|
51
|
+
_maxMs;
|
|
52
|
+
_multiplier;
|
|
53
|
+
_jitter;
|
|
54
|
+
constructor(opts = {}) {
|
|
55
|
+
this._baseMs = opts.baseMs ?? 1000;
|
|
56
|
+
this._maxMs = opts.maxMs ?? 30_000;
|
|
57
|
+
this._multiplier = opts.multiplier ?? 2;
|
|
58
|
+
this._jitter = opts.jitter ?? 'full';
|
|
59
|
+
}
|
|
60
|
+
nextDelay(ctx) {
|
|
61
|
+
validateAttempt(ctx.attempt, 'ExponentialBackoff');
|
|
62
|
+
const raw = Math.min(this._maxMs, this._baseMs * this._multiplier ** (ctx.attempt - 1));
|
|
63
|
+
return jitter(raw, this._jitter, this._baseMs, this._maxMs, ctx.lastDelayMs);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function jitter(raw, kind, baseMs, maxMs, lastDelayMs) {
|
|
67
|
+
switch (kind) {
|
|
68
|
+
case 'none':
|
|
69
|
+
return raw;
|
|
70
|
+
case 'full':
|
|
71
|
+
return Math.random() * raw;
|
|
72
|
+
case 'equal':
|
|
73
|
+
return raw / 2 + Math.random() * (raw / 2);
|
|
74
|
+
case 'decorrelated': {
|
|
75
|
+
if (lastDelayMs === undefined) {
|
|
76
|
+
return Math.random() * raw;
|
|
77
|
+
}
|
|
78
|
+
// Standard decorrelated jitter: uniform(baseMs, min(maxMs, lastDelay * 3)).
|
|
79
|
+
// The max() guards against the degenerate case where maxMs < baseMs,
|
|
80
|
+
// which would otherwise produce an inverted range.
|
|
81
|
+
const upper = Math.max(baseMs, Math.min(maxMs, lastDelayMs * 3));
|
|
82
|
+
return baseMs + Math.random() * (upper - baseMs);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=backoff-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff-strategy.js","sourceRoot":"","sources":["../../../src/retry/backoff-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default concrete retry strategy for model invocations.
|
|
3
|
+
*
|
|
4
|
+
* Implements {@link ModelRetryStrategy.computeRetryDecision} to retry failed model
|
|
5
|
+
* calls classified by {@link isRetryable}, bounded by `maxAttempts`, with
|
|
6
|
+
* delays computed by the configured {@link BackoffStrategy}.
|
|
7
|
+
*
|
|
8
|
+
* The attempt counter lives on {@link AfterModelCallEvent.attemptCount},
|
|
9
|
+
* maintained by the agent loop. This strategy only keeps per-turn backoff
|
|
10
|
+
* state (first-failure timestamp, last delay), which is cleared in
|
|
11
|
+
* {@link onFirstModelAttempt}.
|
|
12
|
+
*/
|
|
13
|
+
import type { AfterModelCallEvent } from '../hooks/events.js';
|
|
14
|
+
import type { BackoffStrategy } from './backoff-strategy.js';
|
|
15
|
+
import { ModelRetryStrategy } from './model-retry-strategy.js';
|
|
16
|
+
import type { RetryDecision } from './retry-strategy.js';
|
|
17
|
+
/**
|
|
18
|
+
* Options for {@link DefaultModelRetryStrategy}.
|
|
19
|
+
*/
|
|
20
|
+
export interface DefaultModelRetryStrategyOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Total model attempts before giving up and re-raising the error.
|
|
23
|
+
* Must be \>= 1. Default {@link DEFAULT_MAX_ATTEMPTS}.
|
|
24
|
+
*/
|
|
25
|
+
maxAttempts?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Backoff used to compute the delay between retries.
|
|
28
|
+
* Default: `new ExponentialBackoff({ baseMs: DEFAULT_BACKOFF_BASE_MS, maxMs: DEFAULT_BACKOFF_MAX_MS })`.
|
|
29
|
+
*/
|
|
30
|
+
backoff?: BackoffStrategy;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Retries failed model calls classified by the SDK as retryable.
|
|
34
|
+
*
|
|
35
|
+
* Today, only {@link ModelThrottledError} is treated as retryable — subclass
|
|
36
|
+
* and override {@link isRetryable} to expand or narrow that set without
|
|
37
|
+
* reimplementing the rest of the retry policy.
|
|
38
|
+
*
|
|
39
|
+
* State is per-turn: backoff timing state resets in {@link onFirstModelAttempt},
|
|
40
|
+
* which the base class calls when `event.attemptCount === 1`. The attempt
|
|
41
|
+
* counter itself is owned by the agent loop and read off
|
|
42
|
+
* {@link AfterModelCallEvent.attemptCount}.
|
|
43
|
+
*
|
|
44
|
+
* Hook precedence: {@link AfterModelCallEvent} fires hooks in reverse registration
|
|
45
|
+
* order, so user-registered hooks run before this strategy. If a user hook sets
|
|
46
|
+
* `event.retry = true` first, the base class returns early and does not stack
|
|
47
|
+
* additional backoff on top.
|
|
48
|
+
*
|
|
49
|
+
* Sharing: a given instance tracks its own backoff state and must not be shared
|
|
50
|
+
* across multiple agents. Create a separate instance per agent.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* const agent = new Agent({
|
|
55
|
+
* model,
|
|
56
|
+
* retryStrategy: new DefaultModelRetryStrategy({ maxAttempts: 4 }),
|
|
57
|
+
* })
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare class DefaultModelRetryStrategy extends ModelRetryStrategy {
|
|
61
|
+
readonly name: string;
|
|
62
|
+
private readonly _maxAttempts;
|
|
63
|
+
private readonly _backoff;
|
|
64
|
+
private _lastDelayMs;
|
|
65
|
+
private _firstFailureAt;
|
|
66
|
+
constructor(opts?: DefaultModelRetryStrategyOptions);
|
|
67
|
+
/**
|
|
68
|
+
* Whether `error` should be retried. Override to extend or narrow the
|
|
69
|
+
* retryable set (e.g. to also retry transient 5xx errors).
|
|
70
|
+
*/
|
|
71
|
+
protected isRetryable(error: Error): boolean;
|
|
72
|
+
protected computeRetryDecision(event: AfterModelCallEvent): RetryDecision;
|
|
73
|
+
protected onFirstModelAttempt(): void;
|
|
74
|
+
private _buildContext;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=default-model-retry-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-model-retry-strategy.d.ts","sourceRoot":"","sources":["../../../src/retry/default-model-retry-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7D,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAMxD;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,yBAA0B,SAAQ,kBAAkB;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAyC;IAE9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,eAAe,CAAoB;gBAE/B,IAAI,GAAE,gCAAqC;IAWvD;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;cAIzB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,aAAa;cA4B/D,mBAAmB,IAAI,IAAI;IAK9C,OAAO,CAAC,aAAa;CAUtB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default concrete retry strategy for model invocations.
|
|
3
|
+
*
|
|
4
|
+
* Implements {@link ModelRetryStrategy.computeRetryDecision} to retry failed model
|
|
5
|
+
* calls classified by {@link isRetryable}, bounded by `maxAttempts`, with
|
|
6
|
+
* delays computed by the configured {@link BackoffStrategy}.
|
|
7
|
+
*
|
|
8
|
+
* The attempt counter lives on {@link AfterModelCallEvent.attemptCount},
|
|
9
|
+
* maintained by the agent loop. This strategy only keeps per-turn backoff
|
|
10
|
+
* state (first-failure timestamp, last delay), which is cleared in
|
|
11
|
+
* {@link onFirstModelAttempt}.
|
|
12
|
+
*/
|
|
13
|
+
import { ModelThrottledError } from '../errors.js';
|
|
14
|
+
import { logger } from '../logging/logger.js';
|
|
15
|
+
import { ExponentialBackoff } from './backoff-strategy.js';
|
|
16
|
+
import { ModelRetryStrategy } from './model-retry-strategy.js';
|
|
17
|
+
const DEFAULT_MAX_ATTEMPTS = 6;
|
|
18
|
+
const DEFAULT_BACKOFF_BASE_MS = 4_000;
|
|
19
|
+
const DEFAULT_BACKOFF_MAX_MS = 240_000;
|
|
20
|
+
/**
|
|
21
|
+
* Retries failed model calls classified by the SDK as retryable.
|
|
22
|
+
*
|
|
23
|
+
* Today, only {@link ModelThrottledError} is treated as retryable — subclass
|
|
24
|
+
* and override {@link isRetryable} to expand or narrow that set without
|
|
25
|
+
* reimplementing the rest of the retry policy.
|
|
26
|
+
*
|
|
27
|
+
* State is per-turn: backoff timing state resets in {@link onFirstModelAttempt},
|
|
28
|
+
* which the base class calls when `event.attemptCount === 1`. The attempt
|
|
29
|
+
* counter itself is owned by the agent loop and read off
|
|
30
|
+
* {@link AfterModelCallEvent.attemptCount}.
|
|
31
|
+
*
|
|
32
|
+
* Hook precedence: {@link AfterModelCallEvent} fires hooks in reverse registration
|
|
33
|
+
* order, so user-registered hooks run before this strategy. If a user hook sets
|
|
34
|
+
* `event.retry = true` first, the base class returns early and does not stack
|
|
35
|
+
* additional backoff on top.
|
|
36
|
+
*
|
|
37
|
+
* Sharing: a given instance tracks its own backoff state and must not be shared
|
|
38
|
+
* across multiple agents. Create a separate instance per agent.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const agent = new Agent({
|
|
43
|
+
* model,
|
|
44
|
+
* retryStrategy: new DefaultModelRetryStrategy({ maxAttempts: 4 }),
|
|
45
|
+
* })
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export class DefaultModelRetryStrategy extends ModelRetryStrategy {
|
|
49
|
+
name = 'strands:default-model-retry-strategy';
|
|
50
|
+
_maxAttempts;
|
|
51
|
+
_backoff;
|
|
52
|
+
_lastDelayMs;
|
|
53
|
+
_firstFailureAt;
|
|
54
|
+
constructor(opts = {}) {
|
|
55
|
+
super();
|
|
56
|
+
const maxAttempts = opts.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
57
|
+
if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {
|
|
58
|
+
throw new Error(`DefaultModelRetryStrategy: maxAttempts must be an integer >= 1 (got ${maxAttempts})`);
|
|
59
|
+
}
|
|
60
|
+
this._maxAttempts = maxAttempts;
|
|
61
|
+
this._backoff =
|
|
62
|
+
opts.backoff ?? new ExponentialBackoff({ baseMs: DEFAULT_BACKOFF_BASE_MS, maxMs: DEFAULT_BACKOFF_MAX_MS });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Whether `error` should be retried. Override to extend or narrow the
|
|
66
|
+
* retryable set (e.g. to also retry transient 5xx errors).
|
|
67
|
+
*/
|
|
68
|
+
isRetryable(error) {
|
|
69
|
+
return error instanceof ModelThrottledError;
|
|
70
|
+
}
|
|
71
|
+
computeRetryDecision(event) {
|
|
72
|
+
const error = event.error;
|
|
73
|
+
if (error === undefined || !this.isRetryable(error)) {
|
|
74
|
+
return { retry: false };
|
|
75
|
+
}
|
|
76
|
+
if (event.attemptCount >= this._maxAttempts) {
|
|
77
|
+
logger.debug(`attempt_count=<${event.attemptCount}> max_attempts=<${this._maxAttempts}> | max retry attempts reached`);
|
|
78
|
+
return { retry: false };
|
|
79
|
+
}
|
|
80
|
+
if (this._firstFailureAt === undefined) {
|
|
81
|
+
this._firstFailureAt = Date.now();
|
|
82
|
+
}
|
|
83
|
+
const waitMs = this._backoff.nextDelay(this._buildContext(event.attemptCount));
|
|
84
|
+
logger.debug(`retry_delay_ms=<${waitMs}> attempt_count=<${event.attemptCount}> max_attempts=<${this._maxAttempts}> ` +
|
|
85
|
+
`| retryable model error, delaying before retry`);
|
|
86
|
+
this._lastDelayMs = waitMs;
|
|
87
|
+
return { retry: true, waitMs };
|
|
88
|
+
}
|
|
89
|
+
onFirstModelAttempt() {
|
|
90
|
+
this._lastDelayMs = undefined;
|
|
91
|
+
this._firstFailureAt = undefined;
|
|
92
|
+
}
|
|
93
|
+
_buildContext(attemptCount) {
|
|
94
|
+
const ctx = {
|
|
95
|
+
attempt: attemptCount,
|
|
96
|
+
elapsedMs: this._firstFailureAt === undefined ? 0 : Date.now() - this._firstFailureAt,
|
|
97
|
+
};
|
|
98
|
+
if (this._lastDelayMs !== undefined) {
|
|
99
|
+
ctx.lastDelayMs = this._lastDelayMs;
|
|
100
|
+
}
|
|
101
|
+
return ctx;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=default-model-retry-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-model-retry-strategy.js","sourceRoot":"","sources":["../../../src/retry/default-model-retry-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry utilities.
|
|
3
|
+
*/
|
|
4
|
+
export { type BackoffContext, type BackoffStrategy, type JitterKind, type ConstantBackoffOptions, type LinearBackoffOptions, type ExponentialBackoffOptions, ConstantBackoff, LinearBackoff, ExponentialBackoff, } from './backoff-strategy.js';
|
|
5
|
+
export { ModelRetryStrategy } from './model-retry-strategy.js';
|
|
6
|
+
export { DefaultModelRetryStrategy, type DefaultModelRetryStrategyOptions } from './default-model-retry-strategy.js';
|
|
7
|
+
export type { RetryStrategy, RetryDecision } from './retry-strategy.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/retry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,eAAe,EACf,aAAa,EACb,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,yBAAyB,EAAE,KAAK,gCAAgC,EAAE,MAAM,mCAAmC,CAAA;AAEpH,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|