@strands-agents/sdk 1.7.0 → 1.9.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/dist/src/agent/agent.d.ts +32 -2
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +92 -4
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts +3 -3
- package/dist/src/context-manager/modes/agentic/agentic-context.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +2 -0
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/errors.d.ts +7 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +10 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/experimental/checkpoint.d.ts +118 -0
- package/dist/src/experimental/checkpoint.d.ts.map +1 -0
- package/dist/src/experimental/checkpoint.js +108 -0
- package/dist/src/experimental/checkpoint.js.map +1 -0
- package/dist/src/experimental/index.d.ts +10 -0
- package/dist/src/experimental/index.d.ts.map +1 -0
- package/dist/src/experimental/index.js +9 -0
- package/dist/src/experimental/index.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.node.d.ts.map +1 -1
- package/dist/src/index.node.js +3 -0
- package/dist/src/index.node.js.map +1 -1
- package/dist/src/injection/message-injection.d.ts.map +1 -1
- package/dist/src/injection/message-injection.js +2 -0
- package/dist/src/injection/message-injection.js.map +1 -1
- package/dist/src/interventions/actions.d.ts.map +1 -1
- package/dist/src/interventions/actions.js.map +1 -1
- package/dist/src/{mcp.d.ts → mcp/client.d.ts} +13 -4
- package/dist/src/mcp/client.d.ts.map +1 -0
- package/dist/src/{mcp.js → mcp/client.js} +15 -3
- package/dist/src/mcp/client.js.map +1 -0
- package/dist/src/mcp/config.d.ts +52 -0
- package/dist/src/mcp/config.d.ts.map +1 -0
- package/dist/src/mcp/config.js +12 -0
- package/dist/src/mcp/config.js.map +1 -0
- package/dist/src/mcp/config.node.d.ts +16 -0
- package/dist/src/mcp/config.node.d.ts.map +1 -0
- package/dist/src/mcp/config.node.js +145 -0
- package/dist/src/mcp/config.node.js.map +1 -0
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +2 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +2 -1
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +7 -0
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +22 -1
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/multiagent/multiagent.d.ts +2 -1
- package/dist/src/multiagent/multiagent.d.ts.map +1 -1
- package/dist/src/multiagent/multiagent.js.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +5 -0
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +15 -0
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/tools/function-tool.d.ts +1 -1
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +4 -12
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +2 -1
- package/dist/src/tools/mcp-tool.d.ts.map +1 -1
- package/dist/src/tools/mcp-tool.js +1 -0
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/tool-factory.d.ts +1 -1
- package/dist/src/tools/tool-factory.d.ts.map +1 -1
- package/dist/src/tools/types.d.ts +4 -0
- package/dist/src/tools/types.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.d.ts +4 -2
- package/dist/src/tools/zod-tool.d.ts.map +1 -1
- package/dist/src/tools/zod-tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/agent.d.ts +18 -1
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +12 -0
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/media.d.ts.map +1 -1
- package/dist/src/types/media.js.map +1 -1
- package/dist/src/types/messages.d.ts +22 -1
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js +22 -0
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-memory-stores/test-memory-store/index.d.ts +2 -0
- package/dist/src/vended-memory-stores/test-memory-store/index.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/test-memory-store/index.js +2 -0
- package/dist/src/vended-memory-stores/test-memory-store/index.js.map +1 -0
- package/dist/src/vended-memory-stores/test-memory-store/store.d.ts +122 -0
- package/dist/src/vended-memory-stores/test-memory-store/store.d.ts.map +1 -0
- package/dist/src/vended-memory-stores/test-memory-store/store.js +281 -0
- package/dist/src/vended-memory-stores/test-memory-store/store.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -1
- package/dist/src/vended-plugins/context-offloader/search.js +4 -2
- package/dist/src/vended-plugins/context-offloader/search.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.js +1 -1
- package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
- package/dist/src/vended-plugins/skills/skill.d.ts.map +1 -1
- package/dist/src/vended-plugins/skills/skill.js.map +1 -1
- package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
- package/package.json +41 -30
- package/dist/src/__fixtures__/agent-helpers.d.ts +0 -136
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/agent-helpers.js +0 -156
- package/dist/src/__fixtures__/agent-helpers.js.map +0 -1
- package/dist/src/__fixtures__/environment.d.ts +0 -12
- package/dist/src/__fixtures__/environment.d.ts.map +0 -1
- package/dist/src/__fixtures__/environment.js +0 -12
- package/dist/src/__fixtures__/environment.js.map +0 -1
- package/dist/src/__fixtures__/metrics-helpers.d.ts +0 -55
- package/dist/src/__fixtures__/metrics-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/metrics-helpers.js +0 -57
- package/dist/src/__fixtures__/metrics-helpers.js.map +0 -1
- package/dist/src/__fixtures__/mock-message-model.d.ts +0 -103
- package/dist/src/__fixtures__/mock-message-model.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-message-model.js +0 -245
- package/dist/src/__fixtures__/mock-message-model.js.map +0 -1
- package/dist/src/__fixtures__/mock-meter.d.ts +0 -32
- package/dist/src/__fixtures__/mock-meter.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-meter.js +0 -47
- package/dist/src/__fixtures__/mock-meter.js.map +0 -1
- package/dist/src/__fixtures__/mock-plugin.d.ts +0 -13
- package/dist/src/__fixtures__/mock-plugin.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-plugin.js +0 -35
- package/dist/src/__fixtures__/mock-plugin.js.map +0 -1
- package/dist/src/__fixtures__/mock-span.d.ts +0 -78
- package/dist/src/__fixtures__/mock-span.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-span.js +0 -93
- package/dist/src/__fixtures__/mock-span.js.map +0 -1
- package/dist/src/__fixtures__/mock-storage-provider.d.ts +0 -42
- package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +0 -1
- package/dist/src/__fixtures__/mock-storage-provider.js +0 -122
- package/dist/src/__fixtures__/mock-storage-provider.js.map +0 -1
- package/dist/src/__fixtures__/model-test-helpers.d.ts +0 -56
- package/dist/src/__fixtures__/model-test-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/model-test-helpers.js +0 -85
- package/dist/src/__fixtures__/model-test-helpers.js.map +0 -1
- package/dist/src/__fixtures__/register-node-defaults.d.ts +0 -2
- package/dist/src/__fixtures__/register-node-defaults.d.ts.map +0 -1
- package/dist/src/__fixtures__/register-node-defaults.js +0 -6
- package/dist/src/__fixtures__/register-node-defaults.js.map +0 -1
- package/dist/src/__fixtures__/slim-types.d.ts +0 -51
- package/dist/src/__fixtures__/slim-types.d.ts.map +0 -1
- package/dist/src/__fixtures__/slim-types.js +0 -6
- package/dist/src/__fixtures__/slim-types.js.map +0 -1
- package/dist/src/__fixtures__/test-sandbox.node.d.ts +0 -15
- package/dist/src/__fixtures__/test-sandbox.node.d.ts.map +0 -1
- package/dist/src/__fixtures__/test-sandbox.node.js +0 -23
- package/dist/src/__fixtures__/test-sandbox.node.js.map +0 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts +0 -45
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +0 -1
- package/dist/src/__fixtures__/tool-helpers.js +0 -101
- package/dist/src/__fixtures__/tool-helpers.js.map +0 -1
- package/dist/src/__tests__/default-slot.test.d.ts +0 -2
- package/dist/src/__tests__/default-slot.test.d.ts.map +0 -1
- package/dist/src/__tests__/default-slot.test.js +0 -33
- package/dist/src/__tests__/default-slot.test.js.map +0 -1
- package/dist/src/__tests__/errors.test.d.ts +0 -2
- package/dist/src/__tests__/errors.test.d.ts.map +0 -1
- package/dist/src/__tests__/errors.test.js +0 -170
- package/dist/src/__tests__/errors.test.js.map +0 -1
- package/dist/src/__tests__/index.test.d.ts +0 -2
- package/dist/src/__tests__/index.test.d.ts.map +0 -1
- package/dist/src/__tests__/index.test.js +0 -48
- package/dist/src/__tests__/index.test.js.map +0 -1
- package/dist/src/__tests__/interrupt.test.d.ts +0 -2
- package/dist/src/__tests__/interrupt.test.d.ts.map +0 -1
- package/dist/src/__tests__/interrupt.test.js +0 -264
- package/dist/src/__tests__/interrupt.test.js.map +0 -1
- package/dist/src/__tests__/mcp.test.d.ts +0 -2
- package/dist/src/__tests__/mcp.test.d.ts.map +0 -1
- package/dist/src/__tests__/mcp.test.js +0 -1003
- package/dist/src/__tests__/mcp.test.js.map +0 -1
- package/dist/src/__tests__/mime.test.d.ts +0 -2
- package/dist/src/__tests__/mime.test.d.ts.map +0 -1
- package/dist/src/__tests__/mime.test.js +0 -83
- package/dist/src/__tests__/mime.test.js.map +0 -1
- package/dist/src/__tests__/state-store.test.d.ts +0 -2
- package/dist/src/__tests__/state-store.test.d.ts.map +0 -1
- package/dist/src/__tests__/state-store.test.js +0 -285
- package/dist/src/__tests__/state-store.test.js.map +0 -1
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/a2a-agent.test.js +0 -383
- package/dist/src/a2a/__tests__/a2a-agent.test.js.map +0 -1
- package/dist/src/a2a/__tests__/adapters.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/adapters.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/adapters.test.js +0 -151
- package/dist/src/a2a/__tests__/adapters.test.js.map +0 -1
- package/dist/src/a2a/__tests__/async-lock.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/async-lock.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/async-lock.test.js +0 -137
- package/dist/src/a2a/__tests__/async-lock.test.js.map +0 -1
- package/dist/src/a2a/__tests__/events.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/events.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/events.test.js +0 -68
- package/dist/src/a2a/__tests__/events.test.js.map +0 -1
- package/dist/src/a2a/__tests__/executor.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/executor.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/executor.test.js +0 -345
- package/dist/src/a2a/__tests__/executor.test.js.map +0 -1
- package/dist/src/a2a/__tests__/server.test.d.ts +0 -2
- package/dist/src/a2a/__tests__/server.test.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/server.test.js +0 -71
- package/dist/src/a2a/__tests__/server.test.js.map +0 -1
- package/dist/src/a2a/__tests__/server.test.node.d.ts +0 -2
- package/dist/src/a2a/__tests__/server.test.node.d.ts.map +0 -1
- package/dist/src/a2a/__tests__/server.test.node.js +0 -110
- package/dist/src/a2a/__tests__/server.test.node.js.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +0 -23
- package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent-as-tool.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent-as-tool.test.js +0 -347
- package/dist/src/agent/__tests__/agent-as-tool.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.cancel.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.cancel.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.cancel.test.js +0 -337
- package/dist/src/agent/__tests__/agent.cancel.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.concurrent.test.js +0 -488
- package/dist/src/agent/__tests__/agent.concurrent.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.context-manager.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.context-manager.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.context-manager.test.js +0 -106
- package/dist/src/agent/__tests__/agent.context-manager.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.hook.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.hook.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.hook.test.js +0 -1332
- package/dist/src/agent/__tests__/agent.hook.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.interrupt.test.js +0 -779
- package/dist/src/agent/__tests__/agent.interrupt.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.invocation-state.test.js +0 -219
- package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.model-retry.test.js +0 -161
- package/dist/src/agent/__tests__/agent.model-retry.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.stateful-model.test.js +0 -169
- package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.test.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.test.js +0 -1624
- package/dist/src/agent/__tests__/agent.test.js.map +0 -1
- package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts +0 -2
- package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts.map +0 -1
- package/dist/src/agent/__tests__/agent.tracer.test.node.js +0 -535
- package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +0 -1
- package/dist/src/agent/__tests__/printer.test.d.ts +0 -2
- package/dist/src/agent/__tests__/printer.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/printer.test.js +0 -188
- package/dist/src/agent/__tests__/printer.test.js.map +0 -1
- package/dist/src/agent/__tests__/snapshot.test.d.ts +0 -2
- package/dist/src/agent/__tests__/snapshot.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/snapshot.test.js +0 -442
- package/dist/src/agent/__tests__/snapshot.test.js.map +0 -1
- package/dist/src/agent/__tests__/tool-caller.test.d.ts +0 -2
- package/dist/src/agent/__tests__/tool-caller.test.d.ts.map +0 -1
- package/dist/src/agent/__tests__/tool-caller.test.js +0 -459
- package/dist/src/agent/__tests__/tool-caller.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js +0 -332
- package/dist/src/conversation-manager/__tests__/agentic-context.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/context-compression.test.js +0 -176
- package/dist/src/conversation-manager/__tests__/context-compression.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +0 -321
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +0 -64
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/pin.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/pin.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/pin.test.js +0 -119
- package/dist/src/conversation-manager/__tests__/pin.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +0 -1080
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +0 -400
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +0 -1
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts +0 -2
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts.map +0 -1
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js +0 -138
- package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js.map +0 -1
- package/dist/src/hooks/__tests__/events.test.d.ts +0 -2
- package/dist/src/hooks/__tests__/events.test.d.ts.map +0 -1
- package/dist/src/hooks/__tests__/events.test.js +0 -1060
- package/dist/src/hooks/__tests__/events.test.js.map +0 -1
- package/dist/src/hooks/__tests__/registry.test.d.ts +0 -2
- package/dist/src/hooks/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/hooks/__tests__/registry.test.js +0 -325
- package/dist/src/hooks/__tests__/registry.test.js.map +0 -1
- package/dist/src/injection/__tests__/message-injection.test.d.ts +0 -2
- package/dist/src/injection/__tests__/message-injection.test.d.ts.map +0 -1
- package/dist/src/injection/__tests__/message-injection.test.js +0 -200
- package/dist/src/injection/__tests__/message-injection.test.js.map +0 -1
- package/dist/src/interventions/__tests__/handler.test.d.ts +0 -2
- package/dist/src/interventions/__tests__/handler.test.d.ts.map +0 -1
- package/dist/src/interventions/__tests__/handler.test.js +0 -35
- package/dist/src/interventions/__tests__/handler.test.js.map +0 -1
- package/dist/src/interventions/__tests__/registry.test.d.ts +0 -2
- package/dist/src/interventions/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/interventions/__tests__/registry.test.js +0 -692
- package/dist/src/interventions/__tests__/registry.test.js.map +0 -1
- package/dist/src/logging/__tests__/logger.test.d.ts +0 -2
- package/dist/src/logging/__tests__/logger.test.d.ts.map +0 -1
- package/dist/src/logging/__tests__/logger.test.js +0 -70
- package/dist/src/logging/__tests__/logger.test.js.map +0 -1
- package/dist/src/logging/__tests__/warn-once.test.d.ts +0 -2
- package/dist/src/logging/__tests__/warn-once.test.d.ts.map +0 -1
- package/dist/src/logging/__tests__/warn-once.test.js +0 -30
- package/dist/src/logging/__tests__/warn-once.test.js.map +0 -1
- package/dist/src/mcp.d.ts.map +0 -1
- package/dist/src/mcp.js.map +0 -1
- package/dist/src/memory/__tests__/memory-manager.test.d.ts +0 -2
- package/dist/src/memory/__tests__/memory-manager.test.d.ts.map +0 -1
- package/dist/src/memory/__tests__/memory-manager.test.js +0 -679
- package/dist/src/memory/__tests__/memory-manager.test.js.map +0 -1
- package/dist/src/memory/__tests__/memory-tracing.test.d.ts +0 -2
- package/dist/src/memory/__tests__/memory-tracing.test.d.ts.map +0 -1
- package/dist/src/memory/__tests__/memory-tracing.test.js +0 -250
- package/dist/src/memory/__tests__/memory-tracing.test.js.map +0 -1
- package/dist/src/memory/extraction/__tests__/extraction.test.d.ts +0 -2
- package/dist/src/memory/extraction/__tests__/extraction.test.d.ts.map +0 -1
- package/dist/src/memory/extraction/__tests__/extraction.test.js +0 -639
- package/dist/src/memory/extraction/__tests__/extraction.test.js.map +0 -1
- package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts +0 -2
- package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts.map +0 -1
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js +0 -104
- package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +0 -1
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts +0 -2
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts.map +0 -1
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js +0 -81
- package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js.map +0 -1
- package/dist/src/middleware/__tests__/agent-middleware.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/agent-middleware.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/agent-middleware.test.js +0 -1206
- package/dist/src/middleware/__tests__/agent-middleware.test.js.map +0 -1
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/copy-on-input.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/copy-on-input.test.js +0 -379
- package/dist/src/middleware/__tests__/copy-on-input.test.js.map +0 -1
- package/dist/src/middleware/__tests__/custom-stages.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/custom-stages.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/custom-stages.test.js +0 -97
- package/dist/src/middleware/__tests__/custom-stages.test.js.map +0 -1
- package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/middleware-interrupts.test.js +0 -267
- package/dist/src/middleware/__tests__/middleware-interrupts.test.js.map +0 -1
- package/dist/src/middleware/__tests__/registry.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/registry.test.js +0 -525
- package/dist/src/middleware/__tests__/registry.test.js.map +0 -1
- package/dist/src/models/__tests__/anthropic.test.d.ts +0 -2
- package/dist/src/models/__tests__/anthropic.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/anthropic.test.js +0 -793
- package/dist/src/models/__tests__/anthropic.test.js.map +0 -1
- package/dist/src/models/__tests__/bedrock.test.d.ts +0 -2
- package/dist/src/models/__tests__/bedrock.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/bedrock.test.js +0 -3964
- package/dist/src/models/__tests__/bedrock.test.js.map +0 -1
- package/dist/src/models/__tests__/defaults.test.d.ts +0 -2
- package/dist/src/models/__tests__/defaults.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/defaults.test.js +0 -36
- package/dist/src/models/__tests__/defaults.test.js.map +0 -1
- package/dist/src/models/__tests__/google.test.d.ts +0 -2
- package/dist/src/models/__tests__/google.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/google.test.js +0 -1145
- package/dist/src/models/__tests__/google.test.js.map +0 -1
- package/dist/src/models/__tests__/model.test.d.ts +0 -2
- package/dist/src/models/__tests__/model.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/model.test.js +0 -921
- package/dist/src/models/__tests__/model.test.js.map +0 -1
- package/dist/src/models/__tests__/streaming.test.d.ts +0 -2
- package/dist/src/models/__tests__/streaming.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/streaming.test.js +0 -50
- package/dist/src/models/__tests__/streaming.test.js.map +0 -1
- package/dist/src/models/__tests__/test-utils.d.ts +0 -10
- package/dist/src/models/__tests__/test-utils.d.ts.map +0 -1
- package/dist/src/models/__tests__/test-utils.js +0 -17
- package/dist/src/models/__tests__/test-utils.js.map +0 -1
- package/dist/src/models/__tests__/vercel.test.d.ts +0 -2
- package/dist/src/models/__tests__/vercel.test.d.ts.map +0 -1
- package/dist/src/models/__tests__/vercel.test.js +0 -740
- package/dist/src/models/__tests__/vercel.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/chat.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/chat.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/chat.test.js +0 -1586
- package/dist/src/models/openai/__tests__/chat.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/errors.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/errors.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/errors.test.js +0 -39
- package/dist/src/models/openai/__tests__/errors.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/mantle.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/mantle.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/mantle.test.js +0 -189
- package/dist/src/models/openai/__tests__/mantle.test.js.map +0 -1
- package/dist/src/models/openai/__tests__/responses.test.d.ts +0 -2
- package/dist/src/models/openai/__tests__/responses.test.d.ts.map +0 -1
- package/dist/src/models/openai/__tests__/responses.test.js +0 -709
- package/dist/src/models/openai/__tests__/responses.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/events.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/events.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/events.test.js +0 -493
- package/dist/src/multiagent/__tests__/events.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +0 -95
- package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/graph.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/graph.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/graph.test.js +0 -698
- package/dist/src/multiagent/__tests__/graph.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/graph.tracer.test.js +0 -218
- package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/interrupts.test.js +0 -390
- package/dist/src/multiagent/__tests__/interrupts.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/nodes.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/nodes.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/nodes.test.js +0 -321
- package/dist/src/multiagent/__tests__/nodes.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/queue.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/queue.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/queue.test.js +0 -118
- package/dist/src/multiagent/__tests__/queue.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/snapshot.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/snapshot.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/snapshot.test.js +0 -161
- package/dist/src/multiagent/__tests__/snapshot.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/state.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/state.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/state.test.js +0 -526
- package/dist/src/multiagent/__tests__/state.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +0 -56
- package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.test.js +0 -477
- package/dist/src/multiagent/__tests__/swarm.test.js.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts +0 -2
- package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts.map +0 -1
- package/dist/src/multiagent/__tests__/swarm.tracer.test.js +0 -235
- package/dist/src/multiagent/__tests__/swarm.tracer.test.js.map +0 -1
- package/dist/src/plugins/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/plugins/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/plugins/__tests__/plugin.test.js +0 -114
- package/dist/src/plugins/__tests__/plugin.test.js.map +0 -1
- package/dist/src/plugins/__tests__/registry.test.d.ts +0 -2
- package/dist/src/plugins/__tests__/registry.test.d.ts.map +0 -1
- package/dist/src/plugins/__tests__/registry.test.js +0 -147
- package/dist/src/plugins/__tests__/registry.test.js.map +0 -1
- package/dist/src/registry/__tests__/tool-registry.test.d.ts +0 -2
- package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +0 -1
- package/dist/src/registry/__tests__/tool-registry.test.js +0 -210
- package/dist/src/registry/__tests__/tool-registry.test.js.map +0 -1
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +0 -2
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +0 -1
- package/dist/src/retry/__tests__/backoff-strategy.test.js +0 -116
- package/dist/src/retry/__tests__/backoff-strategy.test.js.map +0 -1
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +0 -2
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +0 -1
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +0 -225
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.browser.d.ts +0 -2
- package/dist/src/sandbox/__tests__/default.test.browser.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.browser.js +0 -11
- package/dist/src/sandbox/__tests__/default.test.browser.js.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/default.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/default.test.node.js +0 -23
- package/dist/src/sandbox/__tests__/default.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/docker.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/docker.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/docker.test.node.js +0 -89
- package/dist/src/sandbox/__tests__/docker.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/errors.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/errors.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/errors.test.node.js +0 -33
- package/dist/src/sandbox/__tests__/errors.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js +0 -124
- package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js +0 -298
- package/dist/src/sandbox/__tests__/posix-shell.test.node.js.map +0 -1
- package/dist/src/sandbox/__tests__/ssh.test.node.d.ts +0 -2
- package/dist/src/sandbox/__tests__/ssh.test.node.d.ts.map +0 -1
- package/dist/src/sandbox/__tests__/ssh.test.node.js +0 -262
- package/dist/src/sandbox/__tests__/ssh.test.node.js.map +0 -1
- package/dist/src/session/__tests__/file-storage.test.node.d.ts +0 -2
- package/dist/src/session/__tests__/file-storage.test.node.d.ts.map +0 -1
- package/dist/src/session/__tests__/file-storage.test.node.js +0 -278
- package/dist/src/session/__tests__/file-storage.test.node.js.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.d.ts +0 -2
- package/dist/src/session/__tests__/s3-storage.test.d.ts.map +0 -1
- package/dist/src/session/__tests__/s3-storage.test.js +0 -461
- package/dist/src/session/__tests__/s3-storage.test.js.map +0 -1
- package/dist/src/session/__tests__/session-manager.test.d.ts +0 -2
- package/dist/src/session/__tests__/session-manager.test.d.ts.map +0 -1
- package/dist/src/session/__tests__/session-manager.test.js +0 -832
- package/dist/src/session/__tests__/session-manager.test.js.map +0 -1
- package/dist/src/session/__tests__/validation.test.d.ts +0 -2
- package/dist/src/session/__tests__/validation.test.d.ts.map +0 -1
- package/dist/src/session/__tests__/validation.test.js +0 -47
- package/dist/src/session/__tests__/validation.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/config.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.js +0 -64
- package/dist/src/telemetry/__tests__/config.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.node.d.ts +0 -2
- package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/config.test.node.js +0 -164
- package/dist/src/telemetry/__tests__/config.test.node.js.map +0 -1
- package/dist/src/telemetry/__tests__/json.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/json.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/json.test.js +0 -89
- package/dist/src/telemetry/__tests__/json.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/local-trace.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/local-trace.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/local-trace.test.js +0 -158
- package/dist/src/telemetry/__tests__/local-trace.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/meter.test.d.ts +0 -2
- package/dist/src/telemetry/__tests__/meter.test.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/meter.test.js +0 -695
- package/dist/src/telemetry/__tests__/meter.test.js.map +0 -1
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +0 -2
- package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +0 -1
- package/dist/src/telemetry/__tests__/tracer.test.node.js +0 -958
- package/dist/src/telemetry/__tests__/tracer.test.node.js.map +0 -1
- package/dist/src/tools/__tests__/structured-output-tool.test.d.ts +0 -2
- package/dist/src/tools/__tests__/structured-output-tool.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/structured-output-tool.test.js +0 -84
- package/dist/src/tools/__tests__/structured-output-tool.test.js.map +0 -1
- package/dist/src/tools/__tests__/tool-factory.test.d.ts +0 -2
- package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/tool-factory.test.js +0 -98
- package/dist/src/tools/__tests__/tool-factory.test.js.map +0 -1
- package/dist/src/tools/__tests__/tool.test.d.ts +0 -2
- package/dist/src/tools/__tests__/tool.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/tool.test.js +0 -1043
- package/dist/src/tools/__tests__/tool.test.js.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test-d.d.ts +0 -2
- package/dist/src/tools/__tests__/zod-tool.test-d.d.ts.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test-d.js +0 -227
- package/dist/src/tools/__tests__/zod-tool.test-d.js.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test.d.ts +0 -2
- package/dist/src/tools/__tests__/zod-tool.test.d.ts.map +0 -1
- package/dist/src/tools/__tests__/zod-tool.test.js +0 -563
- package/dist/src/tools/__tests__/zod-tool.test.js.map +0 -1
- package/dist/src/types/__tests__/agent.test.d.ts +0 -2
- package/dist/src/types/__tests__/agent.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/agent.test.js +0 -476
- package/dist/src/types/__tests__/agent.test.js.map +0 -1
- package/dist/src/types/__tests__/citations.test.d.ts +0 -2
- package/dist/src/types/__tests__/citations.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/citations.test.js +0 -104
- package/dist/src/types/__tests__/citations.test.js.map +0 -1
- package/dist/src/types/__tests__/json.test.d.ts +0 -2
- package/dist/src/types/__tests__/json.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/json.test.js +0 -298
- package/dist/src/types/__tests__/json.test.js.map +0 -1
- package/dist/src/types/__tests__/media.test.d.ts +0 -2
- package/dist/src/types/__tests__/media.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/media.test.js +0 -478
- package/dist/src/types/__tests__/media.test.js.map +0 -1
- package/dist/src/types/__tests__/messages.test.d.ts +0 -2
- package/dist/src/types/__tests__/messages.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/messages.test.js +0 -681
- package/dist/src/types/__tests__/messages.test.js.map +0 -1
- package/dist/src/types/__tests__/validation.test.d.ts +0 -2
- package/dist/src/types/__tests__/validation.test.d.ts.map +0 -1
- package/dist/src/types/__tests__/validation.test.js +0 -30
- package/dist/src/types/__tests__/validation.test.js.map +0 -1
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts +0 -2
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts.map +0 -1
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js +0 -756
- package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js.map +0 -1
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts +0 -2
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js +0 -358
- package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts +0 -2
- package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/handler.test.js +0 -163
- package/dist/src/vended-interventions/steering/__tests__/handler.test.js.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts +0 -2
- package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/llm.test.js +0 -60
- package/dist/src/vended-interventions/steering/__tests__/llm.test.js.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts +0 -2
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts.map +0 -1
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js +0 -94
- package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js.map +0 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts +0 -2
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts.map +0 -1
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js +0 -758
- package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js.map +0 -1
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js +0 -96
- package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js +0 -68
- package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +0 -539
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +0 -97
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js +0 -149
- package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +0 -216
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +0 -78
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +0 -1
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts +0 -2
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.js +0 -736
- package/dist/src/vended-plugins/goal/__tests__/plugin.test.js.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +0 -482
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts +0 -2
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts.map +0 -1
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js +0 -476
- package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js.map +0 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts +0 -2
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts.map +0 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +0 -390
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +0 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts +0 -2
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +0 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +0 -452
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +0 -1
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts +0 -2
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +0 -1
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.js +0 -189
- package/dist/src/vended-tools/http-request/__tests__/http-request.test.js.map +0 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts +0 -2
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts.map +0 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +0 -388
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +0 -1
|
@@ -1,1145 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { GoogleGenAI, FunctionCallingConfigMode } from '@google/genai';
|
|
3
|
-
import { collectIterator } from '../../__fixtures__/model-test-helpers.js';
|
|
4
|
-
import { GoogleModel } from '../google/model.js';
|
|
5
|
-
import { ContextWindowOverflowError, ModelThrottledError } from '../../errors.js';
|
|
6
|
-
import { Message, CachePointBlock, GuardContentBlock, ReasoningBlock, TextBlock, ToolResultBlock, ToolUseBlock, } from '../../types/messages.js';
|
|
7
|
-
import { formatMessages, mapChunkToEvents } from '../google/adapters.js';
|
|
8
|
-
import { ImageBlock, DocumentBlock, VideoBlock } from '../../types/media.js';
|
|
9
|
-
import { warnOnce } from '../../logging/warn-once.js';
|
|
10
|
-
vi.mock('../../logging/warn-once.js', () => ({
|
|
11
|
-
warnOnce: vi.fn(),
|
|
12
|
-
}));
|
|
13
|
-
/**
|
|
14
|
-
* Helper to create a mock Gemini client with streaming support
|
|
15
|
-
*/
|
|
16
|
-
function createMockClient(streamGenerator) {
|
|
17
|
-
return {
|
|
18
|
-
models: {
|
|
19
|
-
generateContentStream: vi.fn(async () => streamGenerator()),
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Helper to create a mock Gemini client that captures the request parameters.
|
|
25
|
-
* Returns the client and a captured object with `config` and `contents` fields
|
|
26
|
-
* populated after a stream call.
|
|
27
|
-
*/
|
|
28
|
-
function createMockClientWithCapture() {
|
|
29
|
-
const captured = {};
|
|
30
|
-
const client = {
|
|
31
|
-
models: {
|
|
32
|
-
generateContentStream: vi.fn(async (params) => {
|
|
33
|
-
Object.assign(captured, params);
|
|
34
|
-
return (async function* () {
|
|
35
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
36
|
-
})();
|
|
37
|
-
}),
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
return { client, captured };
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Helper to set up a capture-based test with provider, captured params, and a default user message.
|
|
44
|
-
*/
|
|
45
|
-
function setupCaptureTest() {
|
|
46
|
-
const { client, captured } = createMockClientWithCapture();
|
|
47
|
-
const provider = new GoogleModel({ client });
|
|
48
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
49
|
-
return { provider, captured, messages };
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Helper to set up a stream-based test with a mock client, provider, and default user message.
|
|
53
|
-
*/
|
|
54
|
-
function setupStreamTest(streamGenerator) {
|
|
55
|
-
const client = createMockClient(streamGenerator);
|
|
56
|
-
const provider = new GoogleModel({ client });
|
|
57
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
58
|
-
return { provider, messages };
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Helper to format a single content block via formatMessages.
|
|
62
|
-
*/
|
|
63
|
-
function formatBlock(block, role = 'user') {
|
|
64
|
-
return formatMessages([new Message({ role, content: [block] })]);
|
|
65
|
-
}
|
|
66
|
-
describe('GoogleModel', () => {
|
|
67
|
-
beforeEach(() => {
|
|
68
|
-
vi.clearAllMocks();
|
|
69
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
70
|
-
});
|
|
71
|
-
describe('constructor', () => {
|
|
72
|
-
it('creates instance with API key', () => {
|
|
73
|
-
const provider = new GoogleModel({ apiKey: 'test-key', modelId: 'gemini-2.0-flash' });
|
|
74
|
-
expect(provider.getConfig().modelId).toBe('gemini-2.0-flash');
|
|
75
|
-
});
|
|
76
|
-
it('throws error when no API key provided and no env variable', () => {
|
|
77
|
-
vi.stubEnv('GEMINI_API_KEY', '');
|
|
78
|
-
expect(() => new GoogleModel()).toThrow('Gemini API key is required');
|
|
79
|
-
});
|
|
80
|
-
it('does not require API key when client is provided', () => {
|
|
81
|
-
vi.stubEnv('GEMINI_API_KEY', '');
|
|
82
|
-
const mockClient = createMockClient(async function* () {
|
|
83
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
84
|
-
});
|
|
85
|
-
expect(() => new GoogleModel({ client: mockClient })).not.toThrow();
|
|
86
|
-
});
|
|
87
|
-
it('warns when modelId is not explicitly set', () => {
|
|
88
|
-
new GoogleModel({ apiKey: 'test-key' });
|
|
89
|
-
expect(warnOnce).toHaveBeenCalledWith(expect.objectContaining({ warn: expect.any(Function) }), expect.stringContaining('using default modelId'));
|
|
90
|
-
});
|
|
91
|
-
it('does not warn when modelId is explicitly set', () => {
|
|
92
|
-
new GoogleModel({ apiKey: 'test-key', modelId: 'gemini-2.5-flash' });
|
|
93
|
-
expect(warnOnce).not.toHaveBeenCalledWith(expect.objectContaining({ warn: expect.any(Function) }), expect.stringContaining('using default modelId'));
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
describe('updateConfig', () => {
|
|
97
|
-
it('merges new config with existing config', () => {
|
|
98
|
-
const provider = new GoogleModel({ apiKey: 'test-key', modelId: 'gemini-2.5-flash' });
|
|
99
|
-
provider.updateConfig({ params: { temperature: 0.5 } });
|
|
100
|
-
expect(provider.getConfig()).toStrictEqual({
|
|
101
|
-
modelId: 'gemini-2.5-flash',
|
|
102
|
-
params: { temperature: 0.5 },
|
|
103
|
-
contextWindowLimit: 1_048_576,
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
it('re-resolves contextWindowLimit when modelId changes and it was auto-resolved', () => {
|
|
107
|
-
const provider = new GoogleModel({ apiKey: 'test-key' });
|
|
108
|
-
expect(provider.getConfig().contextWindowLimit).toBe(1_048_576);
|
|
109
|
-
provider.updateConfig({ modelId: 'gemini-2.0-flash' });
|
|
110
|
-
expect(provider.getConfig().contextWindowLimit).toBe(1_048_576);
|
|
111
|
-
});
|
|
112
|
-
it('clears contextWindowLimit when modelId changes to unknown model', () => {
|
|
113
|
-
const provider = new GoogleModel({ apiKey: 'test-key' });
|
|
114
|
-
expect(provider.getConfig().contextWindowLimit).toBe(1_048_576);
|
|
115
|
-
provider.updateConfig({ modelId: 'my-custom-finetuned-model' });
|
|
116
|
-
expect(provider.getConfig().contextWindowLimit).toBeUndefined();
|
|
117
|
-
});
|
|
118
|
-
it('preserves explicit contextWindowLimit when modelId changes', () => {
|
|
119
|
-
const provider = new GoogleModel({ apiKey: 'test-key', contextWindowLimit: 50_000 });
|
|
120
|
-
expect(provider.getConfig().contextWindowLimit).toBe(50_000);
|
|
121
|
-
provider.updateConfig({ modelId: 'gemini-2.0-flash' });
|
|
122
|
-
expect(provider.getConfig().contextWindowLimit).toBe(50_000);
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
describe('getConfig', () => {
|
|
126
|
-
it('returns the current configuration', () => {
|
|
127
|
-
const provider = new GoogleModel({
|
|
128
|
-
apiKey: 'test-key',
|
|
129
|
-
modelId: 'gemini-2.5-flash',
|
|
130
|
-
params: { maxOutputTokens: 1024, temperature: 0.7 },
|
|
131
|
-
});
|
|
132
|
-
expect(provider.getConfig()).toStrictEqual({
|
|
133
|
-
modelId: 'gemini-2.5-flash',
|
|
134
|
-
params: { maxOutputTokens: 1024, temperature: 0.7 },
|
|
135
|
-
contextWindowLimit: 1_048_576,
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
it('includes contextWindowLimit in config when provided', () => {
|
|
139
|
-
const provider = new GoogleModel({
|
|
140
|
-
apiKey: 'test-key',
|
|
141
|
-
modelId: 'gemini-2.5-flash',
|
|
142
|
-
contextWindowLimit: 1_048_576,
|
|
143
|
-
});
|
|
144
|
-
expect(provider.getConfig()).toStrictEqual({
|
|
145
|
-
modelId: 'gemini-2.5-flash',
|
|
146
|
-
contextWindowLimit: 1_048_576,
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
it('auto-populates contextWindowLimit from model ID lookup', () => {
|
|
150
|
-
const provider = new GoogleModel({ apiKey: 'test-key', modelId: 'gemini-2.5-pro' });
|
|
151
|
-
expect(provider.getConfig()).toStrictEqual({
|
|
152
|
-
modelId: 'gemini-2.5-pro',
|
|
153
|
-
contextWindowLimit: 1_048_576,
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
it('auto-populates contextWindowLimit for default model ID', () => {
|
|
157
|
-
const provider = new GoogleModel({ apiKey: 'test-key' });
|
|
158
|
-
expect(provider.getConfig()).toStrictEqual({
|
|
159
|
-
contextWindowLimit: 1_048_576,
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
it('does not override explicit contextWindowLimit', () => {
|
|
163
|
-
const provider = new GoogleModel({
|
|
164
|
-
apiKey: 'test-key',
|
|
165
|
-
modelId: 'gemini-2.5-flash',
|
|
166
|
-
contextWindowLimit: 500_000,
|
|
167
|
-
});
|
|
168
|
-
expect(provider.getConfig()).toStrictEqual({
|
|
169
|
-
modelId: 'gemini-2.5-flash',
|
|
170
|
-
contextWindowLimit: 500_000,
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
it('leaves contextWindowLimit undefined for unknown model IDs', () => {
|
|
174
|
-
const provider = new GoogleModel({ apiKey: 'test-key', modelId: 'unknown-model' });
|
|
175
|
-
expect(provider.getConfig()).toStrictEqual({
|
|
176
|
-
modelId: 'unknown-model',
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
describe('stream', () => {
|
|
181
|
-
it('throws error when messages array is empty', async () => {
|
|
182
|
-
const provider = new GoogleModel({ apiKey: 'test-key' });
|
|
183
|
-
await expect(collectIterator(provider.stream([]))).rejects.toThrow('At least one message is required');
|
|
184
|
-
});
|
|
185
|
-
it('emits message start and stop events', async () => {
|
|
186
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
187
|
-
yield {
|
|
188
|
-
candidates: [
|
|
189
|
-
{
|
|
190
|
-
content: { parts: [{ text: 'Hello' }] },
|
|
191
|
-
},
|
|
192
|
-
],
|
|
193
|
-
};
|
|
194
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
195
|
-
});
|
|
196
|
-
const events = await collectIterator(provider.stream(messages));
|
|
197
|
-
expect(events[0]).toEqual({ type: 'modelMessageStartEvent', role: 'assistant' });
|
|
198
|
-
expect(events[events.length - 1]).toEqual({ type: 'modelMessageStopEvent', stopReason: 'endTurn' });
|
|
199
|
-
});
|
|
200
|
-
it('emits text content block events', async () => {
|
|
201
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
202
|
-
yield {
|
|
203
|
-
candidates: [
|
|
204
|
-
{
|
|
205
|
-
content: { parts: [{ text: 'Hello' }] },
|
|
206
|
-
},
|
|
207
|
-
],
|
|
208
|
-
};
|
|
209
|
-
yield {
|
|
210
|
-
candidates: [
|
|
211
|
-
{
|
|
212
|
-
content: { parts: [{ text: ' world' }] },
|
|
213
|
-
},
|
|
214
|
-
],
|
|
215
|
-
};
|
|
216
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
217
|
-
});
|
|
218
|
-
const events = await collectIterator(provider.stream(messages));
|
|
219
|
-
expect(events).toHaveLength(6);
|
|
220
|
-
expect(events[0]).toEqual({ type: 'modelMessageStartEvent', role: 'assistant' });
|
|
221
|
-
expect(events[1]).toEqual({ type: 'modelContentBlockStartEvent' });
|
|
222
|
-
expect(events[2]).toEqual({
|
|
223
|
-
type: 'modelContentBlockDeltaEvent',
|
|
224
|
-
delta: { type: 'textDelta', text: 'Hello' },
|
|
225
|
-
});
|
|
226
|
-
expect(events[3]).toEqual({
|
|
227
|
-
type: 'modelContentBlockDeltaEvent',
|
|
228
|
-
delta: { type: 'textDelta', text: ' world' },
|
|
229
|
-
});
|
|
230
|
-
expect(events[4]).toEqual({ type: 'modelContentBlockStopEvent' });
|
|
231
|
-
expect(events[5]).toEqual({ type: 'modelMessageStopEvent', stopReason: 'endTurn' });
|
|
232
|
-
});
|
|
233
|
-
it('emits usage metadata when available', async () => {
|
|
234
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
235
|
-
yield {
|
|
236
|
-
candidates: [
|
|
237
|
-
{
|
|
238
|
-
content: { parts: [{ text: 'Hi' }] },
|
|
239
|
-
},
|
|
240
|
-
],
|
|
241
|
-
usageMetadata: {
|
|
242
|
-
promptTokenCount: 10,
|
|
243
|
-
totalTokenCount: 15,
|
|
244
|
-
},
|
|
245
|
-
};
|
|
246
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
247
|
-
});
|
|
248
|
-
const events = await collectIterator(provider.stream(messages));
|
|
249
|
-
const metadataEvent = events.find((e) => e.type === 'modelMetadataEvent');
|
|
250
|
-
expect(metadataEvent).toEqual({
|
|
251
|
-
type: 'modelMetadataEvent',
|
|
252
|
-
usage: {
|
|
253
|
-
inputTokens: 10,
|
|
254
|
-
outputTokens: 5,
|
|
255
|
-
totalTokens: 15,
|
|
256
|
-
},
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
it('handles MAX_TOKENS finish reason', async () => {
|
|
260
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
261
|
-
yield {
|
|
262
|
-
candidates: [
|
|
263
|
-
{
|
|
264
|
-
content: { parts: [{ text: 'Truncated' }] },
|
|
265
|
-
},
|
|
266
|
-
],
|
|
267
|
-
};
|
|
268
|
-
yield { candidates: [{ finishReason: 'MAX_TOKENS' }] };
|
|
269
|
-
});
|
|
270
|
-
const events = await collectIterator(provider.stream(messages));
|
|
271
|
-
const stopEvent = events.find((e) => e.type === 'modelMessageStopEvent');
|
|
272
|
-
expect(stopEvent).toBeDefined();
|
|
273
|
-
expect(stopEvent.stopReason).toBe('maxTokens');
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
describe('error handling', () => {
|
|
277
|
-
it('throws ContextWindowOverflowError for context overflow errors', async () => {
|
|
278
|
-
const mockClient = {
|
|
279
|
-
models: {
|
|
280
|
-
generateContentStream: vi.fn(async () => {
|
|
281
|
-
throw new Error(JSON.stringify({
|
|
282
|
-
error: {
|
|
283
|
-
status: 'INVALID_ARGUMENT',
|
|
284
|
-
message: 'Request exceeds the maximum number of tokens allowed',
|
|
285
|
-
},
|
|
286
|
-
}));
|
|
287
|
-
}),
|
|
288
|
-
},
|
|
289
|
-
};
|
|
290
|
-
const provider = new GoogleModel({ client: mockClient });
|
|
291
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
292
|
-
await expect(collectIterator(provider.stream(messages))).rejects.toThrow(ContextWindowOverflowError);
|
|
293
|
-
});
|
|
294
|
-
it('throws ModelThrottledError for RESOURCE_EXHAUSTED status', async () => {
|
|
295
|
-
const mockClient = {
|
|
296
|
-
models: {
|
|
297
|
-
generateContentStream: vi.fn(async () => {
|
|
298
|
-
throw new Error(JSON.stringify({
|
|
299
|
-
error: {
|
|
300
|
-
status: 'RESOURCE_EXHAUSTED',
|
|
301
|
-
message: 'Quota exceeded for the model',
|
|
302
|
-
},
|
|
303
|
-
}));
|
|
304
|
-
}),
|
|
305
|
-
},
|
|
306
|
-
};
|
|
307
|
-
const provider = new GoogleModel({ client: mockClient });
|
|
308
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
309
|
-
await expect(collectIterator(provider.stream(messages))).rejects.toThrow(ModelThrottledError);
|
|
310
|
-
});
|
|
311
|
-
it('throws ModelThrottledError for UNAVAILABLE status', async () => {
|
|
312
|
-
const mockClient = {
|
|
313
|
-
models: {
|
|
314
|
-
generateContentStream: vi.fn(async () => {
|
|
315
|
-
throw new Error(JSON.stringify({
|
|
316
|
-
error: {
|
|
317
|
-
status: 'UNAVAILABLE',
|
|
318
|
-
message: 'Service temporarily unavailable',
|
|
319
|
-
},
|
|
320
|
-
}));
|
|
321
|
-
}),
|
|
322
|
-
},
|
|
323
|
-
};
|
|
324
|
-
const provider = new GoogleModel({ client: mockClient });
|
|
325
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
326
|
-
await expect(collectIterator(provider.stream(messages))).rejects.toThrow(ModelThrottledError);
|
|
327
|
-
});
|
|
328
|
-
it('rethrows unrecognized errors', async () => {
|
|
329
|
-
const mockClient = {
|
|
330
|
-
models: {
|
|
331
|
-
generateContentStream: vi.fn(async () => {
|
|
332
|
-
throw new Error('Network error');
|
|
333
|
-
}),
|
|
334
|
-
},
|
|
335
|
-
};
|
|
336
|
-
const provider = new GoogleModel({ client: mockClient });
|
|
337
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
338
|
-
await expect(collectIterator(provider.stream(messages))).rejects.toThrow('Network error');
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
describe('system prompt', () => {
|
|
342
|
-
it('passes string system prompt to config', async () => {
|
|
343
|
-
const { provider, captured, messages } = setupCaptureTest();
|
|
344
|
-
await collectIterator(provider.stream(messages, { systemPrompt: 'You are a helpful assistant' }));
|
|
345
|
-
const config = captured.config;
|
|
346
|
-
expect(config.systemInstruction).toBe('You are a helpful assistant');
|
|
347
|
-
});
|
|
348
|
-
it('ignores empty string system prompt', async () => {
|
|
349
|
-
const { provider, captured, messages } = setupCaptureTest();
|
|
350
|
-
await collectIterator(provider.stream(messages, { systemPrompt: ' ' }));
|
|
351
|
-
const config = captured.config;
|
|
352
|
-
expect(config.systemInstruction).toBeUndefined();
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
describe('message formatting', () => {
|
|
356
|
-
it('formats user messages correctly', async () => {
|
|
357
|
-
const { provider, captured } = setupCaptureTest();
|
|
358
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
|
|
359
|
-
await collectIterator(provider.stream(messages));
|
|
360
|
-
const contents = captured.contents;
|
|
361
|
-
expect(contents).toHaveLength(1);
|
|
362
|
-
expect(contents[0]?.role).toBe('user');
|
|
363
|
-
expect(contents[0]?.parts[0]?.text).toBe('Hello');
|
|
364
|
-
});
|
|
365
|
-
it('formats assistant messages correctly', async () => {
|
|
366
|
-
const { provider, captured } = setupCaptureTest();
|
|
367
|
-
const messages = [
|
|
368
|
-
new Message({ role: 'user', content: [new TextBlock('Hi')] }),
|
|
369
|
-
new Message({ role: 'assistant', content: [new TextBlock('Hello!')] }),
|
|
370
|
-
new Message({ role: 'user', content: [new TextBlock('How are you?')] }),
|
|
371
|
-
];
|
|
372
|
-
await collectIterator(provider.stream(messages));
|
|
373
|
-
const contents = captured.contents;
|
|
374
|
-
expect(contents).toHaveLength(3);
|
|
375
|
-
expect(contents[0]?.role).toBe('user');
|
|
376
|
-
expect(contents[1]?.role).toBe('model');
|
|
377
|
-
expect(contents[2]?.role).toBe('user');
|
|
378
|
-
});
|
|
379
|
-
});
|
|
380
|
-
describe('content type formatting', () => {
|
|
381
|
-
describe('image content', () => {
|
|
382
|
-
it('formats image with bytes source as inlineData', () => {
|
|
383
|
-
const imageBlock = new ImageBlock({
|
|
384
|
-
format: 'png',
|
|
385
|
-
source: { bytes: new Uint8Array([0x89, 0x50, 0x4e, 0x47]) },
|
|
386
|
-
});
|
|
387
|
-
const contents = formatBlock(imageBlock);
|
|
388
|
-
expect(contents).toHaveLength(1);
|
|
389
|
-
expect(contents[0].parts).toEqual([{ inlineData: { data: 'iVBORw==', mimeType: 'image/png' } }]);
|
|
390
|
-
});
|
|
391
|
-
it('formats image with URL source as fileData', () => {
|
|
392
|
-
const imageBlock = new ImageBlock({
|
|
393
|
-
format: 'jpeg',
|
|
394
|
-
source: { url: 'https://example.com/image.jpg' },
|
|
395
|
-
});
|
|
396
|
-
const contents = formatBlock(imageBlock);
|
|
397
|
-
expect(contents).toHaveLength(1);
|
|
398
|
-
expect(contents[0].parts).toEqual([
|
|
399
|
-
{ fileData: { fileUri: 'https://example.com/image.jpg', mimeType: 'image/jpeg' } },
|
|
400
|
-
]);
|
|
401
|
-
});
|
|
402
|
-
it('skips image with S3 source and logs warning', () => {
|
|
403
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
404
|
-
const imageBlock = new ImageBlock({
|
|
405
|
-
format: 'png',
|
|
406
|
-
source: { location: { type: 's3', uri: 's3://test/image.png' } },
|
|
407
|
-
});
|
|
408
|
-
const contents = formatBlock(imageBlock);
|
|
409
|
-
// Message with no valid parts is not included
|
|
410
|
-
expect(contents).toHaveLength(0);
|
|
411
|
-
expect(warnSpy).toHaveBeenCalled();
|
|
412
|
-
warnSpy.mockRestore();
|
|
413
|
-
});
|
|
414
|
-
});
|
|
415
|
-
describe('document content', () => {
|
|
416
|
-
it('formats document with bytes source as inlineData', () => {
|
|
417
|
-
const docBlock = new DocumentBlock({
|
|
418
|
-
name: 'test.pdf',
|
|
419
|
-
format: 'pdf',
|
|
420
|
-
source: { bytes: new Uint8Array([0x25, 0x50, 0x44, 0x46]) },
|
|
421
|
-
});
|
|
422
|
-
const contents = formatBlock(docBlock);
|
|
423
|
-
expect(contents).toHaveLength(1);
|
|
424
|
-
expect(contents[0].parts).toEqual([{ inlineData: { data: 'JVBERg==', mimeType: 'application/pdf' } }]);
|
|
425
|
-
});
|
|
426
|
-
it('formats document with text source as inlineData bytes', () => {
|
|
427
|
-
const docBlock = new DocumentBlock({
|
|
428
|
-
name: 'test.txt',
|
|
429
|
-
format: 'txt',
|
|
430
|
-
source: { text: 'Document content here' },
|
|
431
|
-
});
|
|
432
|
-
const contents = formatBlock(docBlock);
|
|
433
|
-
expect(contents).toHaveLength(1);
|
|
434
|
-
expect(contents[0].parts).toEqual([
|
|
435
|
-
{ inlineData: { data: 'RG9jdW1lbnQgY29udGVudCBoZXJl', mimeType: 'text/plain' } },
|
|
436
|
-
]);
|
|
437
|
-
});
|
|
438
|
-
it('formats document with content block source as separate text parts', () => {
|
|
439
|
-
const docBlock = new DocumentBlock({
|
|
440
|
-
name: 'test.txt',
|
|
441
|
-
format: 'txt',
|
|
442
|
-
source: { content: [{ text: 'Line 1' }, { text: 'Line 2' }] },
|
|
443
|
-
});
|
|
444
|
-
const contents = formatBlock(docBlock);
|
|
445
|
-
expect(contents).toHaveLength(1);
|
|
446
|
-
expect(contents[0].parts).toEqual([{ text: 'Line 1' }, { text: 'Line 2' }]);
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
describe('video content', () => {
|
|
450
|
-
it('formats video with bytes source as inlineData', () => {
|
|
451
|
-
const videoBlock = new VideoBlock({
|
|
452
|
-
format: 'mp4',
|
|
453
|
-
source: { bytes: new Uint8Array([0x00, 0x00, 0x00, 0x1c]) },
|
|
454
|
-
});
|
|
455
|
-
const contents = formatBlock(videoBlock);
|
|
456
|
-
expect(contents).toHaveLength(1);
|
|
457
|
-
expect(contents[0].parts).toEqual([{ inlineData: { data: 'AAAAHA==', mimeType: 'video/mp4' } }]);
|
|
458
|
-
});
|
|
459
|
-
});
|
|
460
|
-
describe('reasoning content', () => {
|
|
461
|
-
it('formats reasoning block with thought flag', () => {
|
|
462
|
-
const reasoningBlock = new ReasoningBlock({ text: 'Let me think about this...' });
|
|
463
|
-
const contents = formatBlock(reasoningBlock, 'assistant');
|
|
464
|
-
expect(contents).toHaveLength(1);
|
|
465
|
-
expect(contents[0].parts).toEqual([{ text: 'Let me think about this...', thought: true }]);
|
|
466
|
-
});
|
|
467
|
-
it('includes thought signature when present', () => {
|
|
468
|
-
const reasoningBlock = new ReasoningBlock({ text: 'Thinking...', signature: 'sig123' });
|
|
469
|
-
const contents = formatBlock(reasoningBlock, 'assistant');
|
|
470
|
-
expect(contents).toHaveLength(1);
|
|
471
|
-
expect(contents[0].parts).toEqual([{ text: 'Thinking...', thought: true, thoughtSignature: 'sig123' }]);
|
|
472
|
-
});
|
|
473
|
-
it('skips reasoning block with empty text', () => {
|
|
474
|
-
const reasoningBlock = new ReasoningBlock({ text: '' });
|
|
475
|
-
const contents = formatBlock(reasoningBlock, 'assistant');
|
|
476
|
-
expect(contents).toHaveLength(0);
|
|
477
|
-
});
|
|
478
|
-
});
|
|
479
|
-
describe('unsupported content types', () => {
|
|
480
|
-
it.each([
|
|
481
|
-
{ name: 'cache point', block: new CachePointBlock({ cacheType: 'default' }) },
|
|
482
|
-
{
|
|
483
|
-
name: 'guard content',
|
|
484
|
-
block: new GuardContentBlock({ text: { qualifiers: ['guard_content'], text: 'test' } }),
|
|
485
|
-
},
|
|
486
|
-
])('skips $name blocks with warning', ({ block }) => {
|
|
487
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
488
|
-
const contents = formatBlock(block);
|
|
489
|
-
expect(contents).toHaveLength(0);
|
|
490
|
-
warnSpy.mockRestore();
|
|
491
|
-
});
|
|
492
|
-
it('formats tool use blocks as function calls', () => {
|
|
493
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'testTool', input: { key: 'value' } });
|
|
494
|
-
const contents = formatBlock(toolUseBlock, 'assistant');
|
|
495
|
-
expect(contents).toHaveLength(1);
|
|
496
|
-
expect(contents[0].parts).toEqual([
|
|
497
|
-
{ functionCall: { id: 'test-id', name: 'testTool', args: { key: 'value' } } },
|
|
498
|
-
]);
|
|
499
|
-
});
|
|
500
|
-
});
|
|
501
|
-
});
|
|
502
|
-
describe('reasoning content streaming', () => {
|
|
503
|
-
it('emits reasoning content delta events for thought parts', async () => {
|
|
504
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
505
|
-
yield {
|
|
506
|
-
candidates: [
|
|
507
|
-
{
|
|
508
|
-
content: { parts: [{ text: 'Thinking...', thought: true }] },
|
|
509
|
-
},
|
|
510
|
-
],
|
|
511
|
-
};
|
|
512
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
513
|
-
});
|
|
514
|
-
const events = await collectIterator(provider.stream(messages));
|
|
515
|
-
expect(events).toHaveLength(5);
|
|
516
|
-
expect(events[0]).toEqual({ type: 'modelMessageStartEvent', role: 'assistant' });
|
|
517
|
-
expect(events[1]).toEqual({ type: 'modelContentBlockStartEvent' });
|
|
518
|
-
expect(events[2]).toEqual({
|
|
519
|
-
type: 'modelContentBlockDeltaEvent',
|
|
520
|
-
delta: { type: 'reasoningContentDelta', text: 'Thinking...' },
|
|
521
|
-
});
|
|
522
|
-
expect(events[3]).toEqual({ type: 'modelContentBlockStopEvent' });
|
|
523
|
-
expect(events[4]).toEqual({ type: 'modelMessageStopEvent', stopReason: 'endTurn' });
|
|
524
|
-
});
|
|
525
|
-
it('handles transition from reasoning to text content', async () => {
|
|
526
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
527
|
-
yield {
|
|
528
|
-
candidates: [
|
|
529
|
-
{
|
|
530
|
-
content: { parts: [{ text: 'Let me think...', thought: true }] },
|
|
531
|
-
},
|
|
532
|
-
],
|
|
533
|
-
};
|
|
534
|
-
yield {
|
|
535
|
-
candidates: [
|
|
536
|
-
{
|
|
537
|
-
content: { parts: [{ text: 'Here is my answer' }] },
|
|
538
|
-
},
|
|
539
|
-
],
|
|
540
|
-
};
|
|
541
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
542
|
-
});
|
|
543
|
-
const events = await collectIterator(provider.stream(messages));
|
|
544
|
-
// Should have: messageStart, blockStart (reasoning), delta (reasoning), blockStop,
|
|
545
|
-
// blockStart (text), delta (text), blockStop, messageStop
|
|
546
|
-
expect(events).toHaveLength(8);
|
|
547
|
-
// Reasoning block
|
|
548
|
-
expect(events[1]).toEqual({ type: 'modelContentBlockStartEvent' });
|
|
549
|
-
expect(events[2]).toEqual({
|
|
550
|
-
type: 'modelContentBlockDeltaEvent',
|
|
551
|
-
delta: { type: 'reasoningContentDelta', text: 'Let me think...' },
|
|
552
|
-
});
|
|
553
|
-
expect(events[3]).toEqual({ type: 'modelContentBlockStopEvent' });
|
|
554
|
-
// Text block
|
|
555
|
-
expect(events[4]).toEqual({ type: 'modelContentBlockStartEvent' });
|
|
556
|
-
expect(events[5]).toEqual({
|
|
557
|
-
type: 'modelContentBlockDeltaEvent',
|
|
558
|
-
delta: { type: 'textDelta', text: 'Here is my answer' },
|
|
559
|
-
});
|
|
560
|
-
expect(events[6]).toEqual({ type: 'modelContentBlockStopEvent' });
|
|
561
|
-
expect(events[7]).toEqual({ type: 'modelMessageStopEvent', stopReason: 'endTurn' });
|
|
562
|
-
});
|
|
563
|
-
it('includes signature in reasoning delta when present', async () => {
|
|
564
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
565
|
-
yield {
|
|
566
|
-
candidates: [
|
|
567
|
-
{
|
|
568
|
-
content: {
|
|
569
|
-
parts: [
|
|
570
|
-
{
|
|
571
|
-
text: 'Thinking...',
|
|
572
|
-
thought: true,
|
|
573
|
-
thoughtSignature: 'sig456',
|
|
574
|
-
},
|
|
575
|
-
],
|
|
576
|
-
},
|
|
577
|
-
},
|
|
578
|
-
],
|
|
579
|
-
};
|
|
580
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
581
|
-
});
|
|
582
|
-
const events = await collectIterator(provider.stream(messages));
|
|
583
|
-
const deltaEvent = events.find((e) => e.type === 'modelContentBlockDeltaEvent' && e.delta.type === 'reasoningContentDelta');
|
|
584
|
-
expect(deltaEvent).toEqual({
|
|
585
|
-
type: 'modelContentBlockDeltaEvent',
|
|
586
|
-
delta: { type: 'reasoningContentDelta', text: 'Thinking...', signature: 'sig456' },
|
|
587
|
-
});
|
|
588
|
-
});
|
|
589
|
-
});
|
|
590
|
-
describe('tool configuration', () => {
|
|
591
|
-
it('passes tool specs as functionDeclarations', async () => {
|
|
592
|
-
const { provider, captured, messages } = setupCaptureTest();
|
|
593
|
-
await collectIterator(provider.stream(messages, {
|
|
594
|
-
toolSpecs: [
|
|
595
|
-
{
|
|
596
|
-
name: 'get_weather',
|
|
597
|
-
description: 'Get the weather',
|
|
598
|
-
inputSchema: { type: 'object', properties: { city: { type: 'string' } } },
|
|
599
|
-
},
|
|
600
|
-
],
|
|
601
|
-
}));
|
|
602
|
-
const config = captured.config;
|
|
603
|
-
expect(config.tools).toEqual([
|
|
604
|
-
{
|
|
605
|
-
functionDeclarations: [
|
|
606
|
-
{
|
|
607
|
-
name: 'get_weather',
|
|
608
|
-
description: 'Get the weather',
|
|
609
|
-
parametersJsonSchema: { type: 'object', properties: { city: { type: 'string' } } },
|
|
610
|
-
},
|
|
611
|
-
],
|
|
612
|
-
},
|
|
613
|
-
]);
|
|
614
|
-
});
|
|
615
|
-
it.each([
|
|
616
|
-
{
|
|
617
|
-
name: 'auto to AUTO',
|
|
618
|
-
toolChoice: { auto: {} },
|
|
619
|
-
expectedMode: FunctionCallingConfigMode.AUTO,
|
|
620
|
-
},
|
|
621
|
-
{
|
|
622
|
-
name: 'any to ANY',
|
|
623
|
-
toolChoice: { any: {} },
|
|
624
|
-
expectedMode: FunctionCallingConfigMode.ANY,
|
|
625
|
-
},
|
|
626
|
-
{
|
|
627
|
-
name: 'tool to ANY with allowedFunctionNames',
|
|
628
|
-
toolChoice: { tool: { name: 'get_weather' } },
|
|
629
|
-
expectedMode: FunctionCallingConfigMode.ANY,
|
|
630
|
-
expectedAllowedFunctionNames: ['get_weather'],
|
|
631
|
-
},
|
|
632
|
-
])('maps toolChoice $name', async ({ toolChoice, expectedMode, expectedAllowedFunctionNames }) => {
|
|
633
|
-
const { provider, captured, messages } = setupCaptureTest();
|
|
634
|
-
await collectIterator(provider.stream(messages, {
|
|
635
|
-
toolSpecs: [{ name: 'get_weather', description: 'test' }],
|
|
636
|
-
toolChoice,
|
|
637
|
-
}));
|
|
638
|
-
const config = captured.config;
|
|
639
|
-
expect(config.toolConfig?.functionCallingConfig?.mode).toBe(expectedMode);
|
|
640
|
-
if (expectedAllowedFunctionNames) {
|
|
641
|
-
expect(config.toolConfig?.functionCallingConfig?.allowedFunctionNames).toEqual(expectedAllowedFunctionNames);
|
|
642
|
-
}
|
|
643
|
-
});
|
|
644
|
-
it('does not add tools config when no toolSpecs provided', async () => {
|
|
645
|
-
const { provider, captured, messages } = setupCaptureTest();
|
|
646
|
-
await collectIterator(provider.stream(messages));
|
|
647
|
-
const config = captured.config;
|
|
648
|
-
expect(config.tools).toBeUndefined();
|
|
649
|
-
});
|
|
650
|
-
});
|
|
651
|
-
describe('built-in tools', () => {
|
|
652
|
-
it('appends builtInTools to config.tools alongside functionDeclarations', async () => {
|
|
653
|
-
const { client, captured } = createMockClientWithCapture();
|
|
654
|
-
const provider = new GoogleModel({ client, builtInTools: [{ googleSearch: {} }] });
|
|
655
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
656
|
-
await collectIterator(provider.stream(messages, {
|
|
657
|
-
toolSpecs: [
|
|
658
|
-
{
|
|
659
|
-
name: 'get_weather',
|
|
660
|
-
description: 'Get the weather',
|
|
661
|
-
inputSchema: { type: 'object', properties: { city: { type: 'string' } } },
|
|
662
|
-
},
|
|
663
|
-
],
|
|
664
|
-
}));
|
|
665
|
-
const config = captured.config;
|
|
666
|
-
expect(config.tools).toHaveLength(2);
|
|
667
|
-
expect(config.tools[0]).toEqual({
|
|
668
|
-
functionDeclarations: [
|
|
669
|
-
{
|
|
670
|
-
name: 'get_weather',
|
|
671
|
-
description: 'Get the weather',
|
|
672
|
-
parametersJsonSchema: { type: 'object', properties: { city: { type: 'string' } } },
|
|
673
|
-
},
|
|
674
|
-
],
|
|
675
|
-
});
|
|
676
|
-
expect(config.tools[1]).toEqual({ googleSearch: {} });
|
|
677
|
-
});
|
|
678
|
-
it('passes builtInTools when no toolSpecs provided', async () => {
|
|
679
|
-
const { client, captured } = createMockClientWithCapture();
|
|
680
|
-
const provider = new GoogleModel({ client, builtInTools: [{ codeExecution: {} }] });
|
|
681
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
682
|
-
await collectIterator(provider.stream(messages));
|
|
683
|
-
const config = captured.config;
|
|
684
|
-
expect(config.tools).toHaveLength(1);
|
|
685
|
-
expect(config.tools[0]).toEqual({ codeExecution: {} });
|
|
686
|
-
});
|
|
687
|
-
it('does not add tools when neither builtInTools nor toolSpecs provided', async () => {
|
|
688
|
-
const { client, captured } = createMockClientWithCapture();
|
|
689
|
-
const provider = new GoogleModel({ client });
|
|
690
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
|
|
691
|
-
await collectIterator(provider.stream(messages));
|
|
692
|
-
const config = captured.config;
|
|
693
|
-
expect(config.tools).toBeUndefined();
|
|
694
|
-
});
|
|
695
|
-
});
|
|
696
|
-
describe('tool use formatting', () => {
|
|
697
|
-
it('formats toolUseBlock with reasoningSignature as thoughtSignature', () => {
|
|
698
|
-
const toolUseBlock = new ToolUseBlock({
|
|
699
|
-
toolUseId: 'test-id',
|
|
700
|
-
name: 'testTool',
|
|
701
|
-
input: { key: 'value' },
|
|
702
|
-
reasoningSignature: 'sig789',
|
|
703
|
-
});
|
|
704
|
-
const contents = formatBlock(toolUseBlock, 'assistant');
|
|
705
|
-
expect(contents).toHaveLength(1);
|
|
706
|
-
expect(contents[0].parts).toEqual([
|
|
707
|
-
{
|
|
708
|
-
functionCall: { id: 'test-id', name: 'testTool', args: { key: 'value' } },
|
|
709
|
-
thoughtSignature: 'sig789',
|
|
710
|
-
},
|
|
711
|
-
]);
|
|
712
|
-
});
|
|
713
|
-
it('formats toolResultBlock as functionResponse', () => {
|
|
714
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'testTool', input: {} });
|
|
715
|
-
const toolResultBlock = new ToolResultBlock({
|
|
716
|
-
toolUseId: 'test-id',
|
|
717
|
-
status: 'success',
|
|
718
|
-
content: [new TextBlock('result text')],
|
|
719
|
-
});
|
|
720
|
-
const messages = [
|
|
721
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
722
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
723
|
-
];
|
|
724
|
-
const contents = formatMessages(messages);
|
|
725
|
-
expect(contents).toHaveLength(2);
|
|
726
|
-
expect(contents[1].parts[0]).toEqual({
|
|
727
|
-
functionResponse: {
|
|
728
|
-
id: 'test-id',
|
|
729
|
-
name: 'testTool',
|
|
730
|
-
response: { output: [{ text: 'result text' }] },
|
|
731
|
-
},
|
|
732
|
-
});
|
|
733
|
-
});
|
|
734
|
-
it('resolves tool name from toolUseId in toolResultBlock', () => {
|
|
735
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'abc-123', name: 'my_tool', input: {} });
|
|
736
|
-
const toolResultBlock = new ToolResultBlock({
|
|
737
|
-
toolUseId: 'abc-123',
|
|
738
|
-
status: 'success',
|
|
739
|
-
content: [new TextBlock('ok')],
|
|
740
|
-
});
|
|
741
|
-
const messages = [
|
|
742
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
743
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
744
|
-
];
|
|
745
|
-
const contents = formatMessages(messages);
|
|
746
|
-
const resultPart = contents[1].parts[0];
|
|
747
|
-
const fr = resultPart.functionResponse;
|
|
748
|
-
expect(fr.name).toBe('my_tool');
|
|
749
|
-
});
|
|
750
|
-
it('falls back to toolUseId when tool name mapping is not found', () => {
|
|
751
|
-
const toolResultBlock = new ToolResultBlock({
|
|
752
|
-
toolUseId: 'unknown-id',
|
|
753
|
-
status: 'success',
|
|
754
|
-
content: [new TextBlock('ok')],
|
|
755
|
-
});
|
|
756
|
-
const messages = [new Message({ role: 'user', content: [toolResultBlock] })];
|
|
757
|
-
const contents = formatMessages(messages);
|
|
758
|
-
const resultPart = contents[0].parts[0];
|
|
759
|
-
const fr = resultPart.functionResponse;
|
|
760
|
-
expect(fr.name).toBe('unknown-id');
|
|
761
|
-
});
|
|
762
|
-
it('formats image block in tool result as inlineData', () => {
|
|
763
|
-
const imageBytes = new Uint8Array([0x89, 0x50, 0x4e, 0x47]);
|
|
764
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'screenshot', input: {} });
|
|
765
|
-
const toolResultBlock = new ToolResultBlock({
|
|
766
|
-
toolUseId: 'test-id',
|
|
767
|
-
status: 'success',
|
|
768
|
-
content: [new ImageBlock({ format: 'png', source: { bytes: imageBytes } })],
|
|
769
|
-
});
|
|
770
|
-
const messages = [
|
|
771
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
772
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
773
|
-
];
|
|
774
|
-
const contents = formatMessages(messages);
|
|
775
|
-
const resultPart = contents[1].parts[0];
|
|
776
|
-
// Image goes to separate parts, not into response.output
|
|
777
|
-
expect(resultPart.functionResponse.response).toEqual({ output: [] });
|
|
778
|
-
expect(resultPart.functionResponse.parts).toEqual([
|
|
779
|
-
{ inlineData: { data: 'iVBORw==', mimeType: 'image/png', displayName: 'image.png' } },
|
|
780
|
-
]);
|
|
781
|
-
});
|
|
782
|
-
it('disambiguates displayName for multiple same-format images in one tool result', () => {
|
|
783
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'two_images', input: {} });
|
|
784
|
-
const toolResultBlock = new ToolResultBlock({
|
|
785
|
-
toolUseId: 'test-id',
|
|
786
|
-
status: 'success',
|
|
787
|
-
content: [
|
|
788
|
-
new ImageBlock({ format: 'png', source: { bytes: new Uint8Array([0x89, 0x50, 0x4e, 0x47]) } }),
|
|
789
|
-
new ImageBlock({ format: 'png', source: { bytes: new Uint8Array([0x89, 0x50, 0x4e, 0x48]) } }),
|
|
790
|
-
],
|
|
791
|
-
});
|
|
792
|
-
const messages = [
|
|
793
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
794
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
795
|
-
];
|
|
796
|
-
const contents = formatMessages(messages);
|
|
797
|
-
const resultPart = contents[1].parts[0];
|
|
798
|
-
const displayNames = resultPart.functionResponse.parts.map((p) => p.inlineData.displayName);
|
|
799
|
-
// Gemini rejects duplicate part names within one function_response.parts.
|
|
800
|
-
expect(new Set(displayNames).size).toBe(displayNames.length);
|
|
801
|
-
expect(displayNames).toEqual(['image.png', 'image-1.png']);
|
|
802
|
-
});
|
|
803
|
-
it('disambiguates displayName for documents sharing a name in one tool result', () => {
|
|
804
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'two_docs', input: {} });
|
|
805
|
-
const toolResultBlock = new ToolResultBlock({
|
|
806
|
-
toolUseId: 'test-id',
|
|
807
|
-
status: 'success',
|
|
808
|
-
content: [
|
|
809
|
-
new DocumentBlock({ name: 'report.pdf', format: 'pdf', source: { bytes: new Uint8Array([0x25, 0x50]) } }),
|
|
810
|
-
new DocumentBlock({ name: 'report.pdf', format: 'pdf', source: { bytes: new Uint8Array([0x25, 0x51]) } }),
|
|
811
|
-
],
|
|
812
|
-
});
|
|
813
|
-
const messages = [
|
|
814
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
815
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
816
|
-
];
|
|
817
|
-
const contents = formatMessages(messages);
|
|
818
|
-
const resultPart = contents[1].parts[0];
|
|
819
|
-
const displayNames = resultPart.functionResponse.parts.map((p) => p.inlineData.displayName);
|
|
820
|
-
expect(new Set(displayNames).size).toBe(displayNames.length);
|
|
821
|
-
expect(displayNames).toEqual(['report.pdf', 'report-1.pdf']);
|
|
822
|
-
});
|
|
823
|
-
it('formats document block with bytes source in tool result as inlineData', () => {
|
|
824
|
-
const docBytes = new Uint8Array([0x25, 0x50, 0x44, 0x46]);
|
|
825
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'read_doc', input: {} });
|
|
826
|
-
const toolResultBlock = new ToolResultBlock({
|
|
827
|
-
toolUseId: 'test-id',
|
|
828
|
-
status: 'success',
|
|
829
|
-
content: [new DocumentBlock({ name: 'report.pdf', format: 'pdf', source: { bytes: docBytes } })],
|
|
830
|
-
});
|
|
831
|
-
const messages = [
|
|
832
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
833
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
834
|
-
];
|
|
835
|
-
const contents = formatMessages(messages);
|
|
836
|
-
const resultPart = contents[1].parts[0];
|
|
837
|
-
expect(resultPart.functionResponse.response).toEqual({ output: [] });
|
|
838
|
-
expect(resultPart.functionResponse.parts).toEqual([
|
|
839
|
-
{ inlineData: { data: 'JVBERg==', mimeType: 'application/pdf', displayName: 'report.pdf' } },
|
|
840
|
-
]);
|
|
841
|
-
});
|
|
842
|
-
it('formats document block with text source in tool result as inlineData', () => {
|
|
843
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'read_doc', input: {} });
|
|
844
|
-
const toolResultBlock = new ToolResultBlock({
|
|
845
|
-
toolUseId: 'test-id',
|
|
846
|
-
status: 'success',
|
|
847
|
-
content: [new DocumentBlock({ name: 'notes.txt', format: 'txt', source: { text: 'Hello' } })],
|
|
848
|
-
});
|
|
849
|
-
const messages = [
|
|
850
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
851
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
852
|
-
];
|
|
853
|
-
const contents = formatMessages(messages);
|
|
854
|
-
const resultPart = contents[1].parts[0];
|
|
855
|
-
expect(resultPart.functionResponse.response).toEqual({ output: [] });
|
|
856
|
-
expect(resultPart.functionResponse.parts).toEqual([
|
|
857
|
-
{ inlineData: { data: 'SGVsbG8=', mimeType: 'text/plain', displayName: 'notes.txt' } },
|
|
858
|
-
]);
|
|
859
|
-
});
|
|
860
|
-
it('skips video block in tool result with warning', () => {
|
|
861
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
862
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'capture', input: {} });
|
|
863
|
-
const toolResultBlock = new ToolResultBlock({
|
|
864
|
-
toolUseId: 'test-id',
|
|
865
|
-
status: 'success',
|
|
866
|
-
content: [new TextBlock('captured'), new VideoBlock({ format: 'mp4', source: { bytes: new Uint8Array([1]) } })],
|
|
867
|
-
});
|
|
868
|
-
const messages = [
|
|
869
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
870
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
871
|
-
];
|
|
872
|
-
const contents = formatMessages(messages);
|
|
873
|
-
const resultPart = contents[1].parts[0];
|
|
874
|
-
expect(resultPart.functionResponse.response).toEqual({ output: [{ text: 'captured' }] });
|
|
875
|
-
// No parts for video - it's skipped
|
|
876
|
-
expect(resultPart.functionResponse.parts).toBeUndefined();
|
|
877
|
-
expect(warnSpy).toHaveBeenCalled();
|
|
878
|
-
warnSpy.mockRestore();
|
|
879
|
-
});
|
|
880
|
-
it('formats mixed text and image content in tool result', () => {
|
|
881
|
-
const imageBytes = new Uint8Array([1, 2]);
|
|
882
|
-
const toolUseBlock = new ToolUseBlock({ toolUseId: 'test-id', name: 'analyze', input: {} });
|
|
883
|
-
const toolResultBlock = new ToolResultBlock({
|
|
884
|
-
toolUseId: 'test-id',
|
|
885
|
-
status: 'success',
|
|
886
|
-
content: [
|
|
887
|
-
new TextBlock('Analysis complete'),
|
|
888
|
-
new ImageBlock({ format: 'jpeg', source: { bytes: imageBytes } }),
|
|
889
|
-
],
|
|
890
|
-
});
|
|
891
|
-
const messages = [
|
|
892
|
-
new Message({ role: 'assistant', content: [toolUseBlock] }),
|
|
893
|
-
new Message({ role: 'user', content: [toolResultBlock] }),
|
|
894
|
-
];
|
|
895
|
-
const contents = formatMessages(messages);
|
|
896
|
-
const resultPart = contents[1].parts[0];
|
|
897
|
-
expect(resultPart.functionResponse.response).toEqual({ output: [{ text: 'Analysis complete' }] });
|
|
898
|
-
expect(resultPart.functionResponse.parts).toEqual([
|
|
899
|
-
{ inlineData: { data: 'AQI=', mimeType: 'image/jpeg', displayName: 'image.jpeg' } },
|
|
900
|
-
]);
|
|
901
|
-
});
|
|
902
|
-
});
|
|
903
|
-
describe('tool use streaming', () => {
|
|
904
|
-
function createStreamState() {
|
|
905
|
-
return {
|
|
906
|
-
messageStarted: true,
|
|
907
|
-
textContentBlockStarted: false,
|
|
908
|
-
reasoningContentBlockStarted: false,
|
|
909
|
-
hasToolCalls: false,
|
|
910
|
-
inputTokens: 0,
|
|
911
|
-
outputTokens: 0,
|
|
912
|
-
};
|
|
913
|
-
}
|
|
914
|
-
it('emits tool use events for function call in response', () => {
|
|
915
|
-
const streamState = createStreamState();
|
|
916
|
-
const chunk = {
|
|
917
|
-
candidates: [
|
|
918
|
-
{
|
|
919
|
-
content: {
|
|
920
|
-
parts: [{ functionCall: { id: 'tool-1', name: 'get_weather', args: { city: 'NYC' } } }],
|
|
921
|
-
},
|
|
922
|
-
},
|
|
923
|
-
],
|
|
924
|
-
};
|
|
925
|
-
const events = mapChunkToEvents(chunk, streamState);
|
|
926
|
-
expect(events).toEqual([
|
|
927
|
-
{
|
|
928
|
-
type: 'modelContentBlockStartEvent',
|
|
929
|
-
start: { type: 'toolUseStart', name: 'get_weather', toolUseId: 'tool-1' },
|
|
930
|
-
},
|
|
931
|
-
{
|
|
932
|
-
type: 'modelContentBlockDeltaEvent',
|
|
933
|
-
delta: { type: 'toolUseInputDelta', input: '{"city":"NYC"}' },
|
|
934
|
-
},
|
|
935
|
-
{ type: 'modelContentBlockStopEvent' },
|
|
936
|
-
]);
|
|
937
|
-
expect(streamState.hasToolCalls).toBe(true);
|
|
938
|
-
});
|
|
939
|
-
it('generates tool use ID when Gemini does not provide one', () => {
|
|
940
|
-
const streamState = createStreamState();
|
|
941
|
-
const chunk = {
|
|
942
|
-
candidates: [
|
|
943
|
-
{
|
|
944
|
-
content: {
|
|
945
|
-
parts: [{ functionCall: { name: 'testTool', args: {} } }],
|
|
946
|
-
},
|
|
947
|
-
},
|
|
948
|
-
],
|
|
949
|
-
};
|
|
950
|
-
const events = mapChunkToEvents(chunk, streamState);
|
|
951
|
-
const startEvent = events[0];
|
|
952
|
-
expect(startEvent.type).toBe('modelContentBlockStartEvent');
|
|
953
|
-
const start = startEvent.start;
|
|
954
|
-
expect(start.toolUseId).toMatch(/^tooluse_/);
|
|
955
|
-
});
|
|
956
|
-
it('includes reasoningSignature from thoughtSignature on function call', () => {
|
|
957
|
-
const streamState = createStreamState();
|
|
958
|
-
const chunk = {
|
|
959
|
-
candidates: [
|
|
960
|
-
{
|
|
961
|
-
content: {
|
|
962
|
-
parts: [
|
|
963
|
-
{
|
|
964
|
-
functionCall: { id: 'tool-1', name: 'testTool', args: {} },
|
|
965
|
-
thoughtSignature: 'sig-abc',
|
|
966
|
-
},
|
|
967
|
-
],
|
|
968
|
-
},
|
|
969
|
-
},
|
|
970
|
-
],
|
|
971
|
-
};
|
|
972
|
-
const events = mapChunkToEvents(chunk, streamState);
|
|
973
|
-
const startEvent = events[0];
|
|
974
|
-
const start = startEvent.start;
|
|
975
|
-
expect(start.reasoningSignature).toBe('sig-abc');
|
|
976
|
-
});
|
|
977
|
-
it('sets stop reason to toolUse when function calls are present', () => {
|
|
978
|
-
const streamState = createStreamState();
|
|
979
|
-
streamState.hasToolCalls = true;
|
|
980
|
-
const chunk = {
|
|
981
|
-
candidates: [{ finishReason: 'STOP' }],
|
|
982
|
-
};
|
|
983
|
-
const events = mapChunkToEvents(chunk, streamState);
|
|
984
|
-
expect(events).toEqual([{ type: 'modelMessageStopEvent', stopReason: 'toolUse' }]);
|
|
985
|
-
});
|
|
986
|
-
it.each([
|
|
987
|
-
{ blockType: 'reasoning', stateField: 'reasoningContentBlockStarted' },
|
|
988
|
-
{ blockType: 'text', stateField: 'textContentBlockStarted' },
|
|
989
|
-
])('closes $blockType block before tool use block', ({ stateField }) => {
|
|
990
|
-
const streamState = createStreamState();
|
|
991
|
-
streamState[stateField] = true;
|
|
992
|
-
const chunk = {
|
|
993
|
-
candidates: [
|
|
994
|
-
{
|
|
995
|
-
content: {
|
|
996
|
-
parts: [{ functionCall: { id: 'tool-1', name: 'testTool', args: {} } }],
|
|
997
|
-
},
|
|
998
|
-
},
|
|
999
|
-
],
|
|
1000
|
-
};
|
|
1001
|
-
const events = mapChunkToEvents(chunk, streamState);
|
|
1002
|
-
expect(events[0]).toEqual({ type: 'modelContentBlockStopEvent' });
|
|
1003
|
-
expect(events[1]).toEqual({
|
|
1004
|
-
type: 'modelContentBlockStartEvent',
|
|
1005
|
-
start: { type: 'toolUseStart', name: 'testTool', toolUseId: 'tool-1' },
|
|
1006
|
-
});
|
|
1007
|
-
expect(streamState[stateField]).toBe(false);
|
|
1008
|
-
});
|
|
1009
|
-
it('handles multiple function calls in a single response', () => {
|
|
1010
|
-
const streamState = createStreamState();
|
|
1011
|
-
const chunk = {
|
|
1012
|
-
candidates: [
|
|
1013
|
-
{
|
|
1014
|
-
content: {
|
|
1015
|
-
parts: [
|
|
1016
|
-
{ functionCall: { id: 'tool-1', name: 'get_weather', args: { city: 'NYC' } } },
|
|
1017
|
-
{ functionCall: { id: 'tool-2', name: 'get_time', args: { tz: 'EST' } } },
|
|
1018
|
-
],
|
|
1019
|
-
},
|
|
1020
|
-
},
|
|
1021
|
-
],
|
|
1022
|
-
};
|
|
1023
|
-
const events = mapChunkToEvents(chunk, streamState);
|
|
1024
|
-
// Each function call: start + delta + stop = 3 events, x2 = 6
|
|
1025
|
-
expect(events).toHaveLength(6);
|
|
1026
|
-
expect(events[0]).toEqual({
|
|
1027
|
-
type: 'modelContentBlockStartEvent',
|
|
1028
|
-
start: { type: 'toolUseStart', name: 'get_weather', toolUseId: 'tool-1' },
|
|
1029
|
-
});
|
|
1030
|
-
expect(events[3]).toEqual({
|
|
1031
|
-
type: 'modelContentBlockStartEvent',
|
|
1032
|
-
start: { type: 'toolUseStart', name: 'get_time', toolUseId: 'tool-2' },
|
|
1033
|
-
});
|
|
1034
|
-
});
|
|
1035
|
-
it('handles full tool use flow via stream method', async () => {
|
|
1036
|
-
const { provider, messages } = setupStreamTest(async function* () {
|
|
1037
|
-
yield {
|
|
1038
|
-
candidates: [
|
|
1039
|
-
{
|
|
1040
|
-
content: {
|
|
1041
|
-
parts: [{ functionCall: { id: 'call-1', name: 'get_weather', args: { city: 'NYC' } } }],
|
|
1042
|
-
},
|
|
1043
|
-
},
|
|
1044
|
-
],
|
|
1045
|
-
};
|
|
1046
|
-
yield { candidates: [{ finishReason: 'STOP' }] };
|
|
1047
|
-
});
|
|
1048
|
-
const events = await collectIterator(provider.stream(messages));
|
|
1049
|
-
// messageStart, blockStart (toolUse), delta (toolUseInput), blockStop, messageStop
|
|
1050
|
-
expect(events).toHaveLength(5);
|
|
1051
|
-
expect(events[0]).toEqual({ type: 'modelMessageStartEvent', role: 'assistant' });
|
|
1052
|
-
expect(events[1]).toEqual({
|
|
1053
|
-
type: 'modelContentBlockStartEvent',
|
|
1054
|
-
start: { type: 'toolUseStart', name: 'get_weather', toolUseId: 'call-1' },
|
|
1055
|
-
});
|
|
1056
|
-
expect(events[2]).toEqual({
|
|
1057
|
-
type: 'modelContentBlockDeltaEvent',
|
|
1058
|
-
delta: { type: 'toolUseInputDelta', input: '{"city":"NYC"}' },
|
|
1059
|
-
});
|
|
1060
|
-
expect(events[3]).toEqual({ type: 'modelContentBlockStopEvent' });
|
|
1061
|
-
expect(events[4]).toEqual({ type: 'modelMessageStopEvent', stopReason: 'toolUse' });
|
|
1062
|
-
});
|
|
1063
|
-
});
|
|
1064
|
-
describe('countTokens', () => {
|
|
1065
|
-
const messages = [new Message({ role: 'user', content: [new TextBlock('hello')] })];
|
|
1066
|
-
const toolSpecs = [
|
|
1067
|
-
{ name: 'test_tool', description: 'A test tool', inputSchema: { type: 'object', properties: {} } },
|
|
1068
|
-
];
|
|
1069
|
-
function createCountTokensClient(mockCountTokens) {
|
|
1070
|
-
return {
|
|
1071
|
-
models: {
|
|
1072
|
-
generateContentStream: vi.fn(),
|
|
1073
|
-
countTokens: mockCountTokens,
|
|
1074
|
-
},
|
|
1075
|
-
};
|
|
1076
|
-
}
|
|
1077
|
-
it('should use heuristic by default when useNativeTokenCount is not set', async () => {
|
|
1078
|
-
const mockCountTokens = vi.fn();
|
|
1079
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1080
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash' });
|
|
1081
|
-
const result = await model.countTokens(messages);
|
|
1082
|
-
expect(mockCountTokens).not.toHaveBeenCalled();
|
|
1083
|
-
expect(result).toBe(2); // heuristic: Math.ceil('hello'.length / 4)
|
|
1084
|
-
});
|
|
1085
|
-
it('should return native token count on success', async () => {
|
|
1086
|
-
const mockCountTokens = vi.fn(async () => ({ totalTokens: 42 }));
|
|
1087
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1088
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash', useNativeTokenCount: true });
|
|
1089
|
-
const result = await model.countTokens(messages);
|
|
1090
|
-
expect(result).toBe(42);
|
|
1091
|
-
expect(mockCountTokens).toHaveBeenCalledOnce();
|
|
1092
|
-
});
|
|
1093
|
-
it('should add heuristic estimate for system prompt', async () => {
|
|
1094
|
-
const mockCountTokens = vi.fn(async () => ({ totalTokens: 55 }));
|
|
1095
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1096
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash', useNativeTokenCount: true });
|
|
1097
|
-
const result = await model.countTokens(messages, { systemPrompt: 'Be helpful.' });
|
|
1098
|
-
expect(result).toBeGreaterThan(55); // native (55) + heuristic for system prompt
|
|
1099
|
-
});
|
|
1100
|
-
it('should add heuristic estimate for tool specs', async () => {
|
|
1101
|
-
const mockCountTokens = vi.fn(async () => ({ totalTokens: 100 }));
|
|
1102
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1103
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash', useNativeTokenCount: true });
|
|
1104
|
-
const result = await model.countTokens(messages, { toolSpecs });
|
|
1105
|
-
expect(result).toBeGreaterThan(100); // native (100) + heuristic for tools
|
|
1106
|
-
});
|
|
1107
|
-
it('should fall back on null totalTokens', async () => {
|
|
1108
|
-
const mockCountTokens = vi.fn(async () => ({ totalTokens: null }));
|
|
1109
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1110
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash', useNativeTokenCount: true });
|
|
1111
|
-
const result = await model.countTokens(messages);
|
|
1112
|
-
expect(typeof result).toBe('number');
|
|
1113
|
-
expect(result).toBeGreaterThanOrEqual(0);
|
|
1114
|
-
});
|
|
1115
|
-
it('should fall back to estimation on API error', async () => {
|
|
1116
|
-
const mockCountTokens = vi.fn(async () => {
|
|
1117
|
-
throw new Error('Unsupported');
|
|
1118
|
-
});
|
|
1119
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1120
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash', useNativeTokenCount: true });
|
|
1121
|
-
const result = await model.countTokens(messages);
|
|
1122
|
-
expect(typeof result).toBe('number');
|
|
1123
|
-
expect(result).toBeGreaterThanOrEqual(0);
|
|
1124
|
-
});
|
|
1125
|
-
it('should fall back to estimation on generic exception', async () => {
|
|
1126
|
-
const mockCountTokens = vi.fn(async () => {
|
|
1127
|
-
throw new Error('Connection failed');
|
|
1128
|
-
});
|
|
1129
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1130
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash', useNativeTokenCount: true });
|
|
1131
|
-
const result = await model.countTokens(messages);
|
|
1132
|
-
expect(typeof result).toBe('number');
|
|
1133
|
-
expect(result).toBeGreaterThanOrEqual(0);
|
|
1134
|
-
});
|
|
1135
|
-
it('should skip native API and use heuristic when useNativeTokenCount is false', async () => {
|
|
1136
|
-
const mockCountTokens = vi.fn();
|
|
1137
|
-
const client = createCountTokensClient(mockCountTokens);
|
|
1138
|
-
const model = new GoogleModel({ client, modelId: 'gemini-2.5-flash', useNativeTokenCount: false });
|
|
1139
|
-
const result = await model.countTokens(messages);
|
|
1140
|
-
expect(mockCountTokens).not.toHaveBeenCalled();
|
|
1141
|
-
expect(result).toBe(2); // heuristic: Math.ceil('hello'.length / 4)
|
|
1142
|
-
});
|
|
1143
|
-
});
|
|
1144
|
-
});
|
|
1145
|
-
//# sourceMappingURL=google.test.js.map
|