@browserbasehq/orca 3.2.0-preview.4 → 3.2.1-preview.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cjs/lib/inference.d.ts +3 -1
- package/dist/cjs/lib/inference.js +3 -3
- package/dist/cjs/lib/inference.js.map +1 -1
- package/dist/cjs/lib/prompt.d.ts +1 -1
- package/dist/cjs/lib/prompt.js +24 -18
- package/dist/cjs/lib/prompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentClient.d.ts +8 -0
- package/dist/cjs/lib/v3/agent/AgentClient.js +13 -0
- package/dist/cjs/lib/v3/agent/AgentClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +1 -0
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +61 -9
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +1 -0
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +16 -0
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +12 -6
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +164 -49
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +2 -2
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +10 -11
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +0 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.js +7 -10
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.js +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/keys.js +57 -49
- package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
- package/dist/cjs/lib/v3/agent/utils/captchaSolver.js +175 -0
- package/dist/cjs/lib/v3/agent/utils/captchaSolver.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js +3 -5
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/variables.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/utils/variables.js +9 -0
- package/dist/cjs/lib/v3/agent/utils/variables.js.map +1 -1
- package/dist/cjs/lib/v3/api.d.ts +5 -3
- package/dist/cjs/lib/v3/api.js +5 -15
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/cache/AgentCache.js +5 -3
- package/dist/cjs/lib/v3/cache/AgentCache.js.map +1 -1
- package/dist/cjs/lib/v3/flowlogger/EventStore.js +1 -1
- package/dist/cjs/lib/v3/flowlogger/EventStore.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/observeHandler.js +2 -1
- package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +110 -46
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +131 -16
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
- package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -6
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/llm/OpenAIClient.js +1 -0
- package/dist/cjs/lib/v3/llm/OpenAIClient.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +67 -17
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/cache.d.ts +0 -1
- package/dist/cjs/lib/v3/types/private/cache.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/handlers.d.ts +1 -0
- package/dist/cjs/lib/v3/types/private/handlers.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -3
- package/dist/cjs/lib/v3/types/public/agent.js +1 -0
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +54 -7
- package/dist/cjs/lib/v3/types/public/api.js +47 -16
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/methods.d.ts +1 -0
- package/dist/cjs/lib/v3/types/public/methods.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +32 -2
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/variables.d.ts +7 -0
- package/dist/cjs/lib/v3/types/public/variables.js +22 -0
- package/dist/cjs/lib/v3/types/public/variables.js.map +1 -0
- package/dist/cjs/lib/v3/understudy/context.js +11 -3
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.js +1 -1
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +23 -2
- package/dist/cjs/lib/v3/v3.js +111 -13
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/lib/version.d.ts +1 -1
- package/dist/cjs/lib/version.js +1 -1
- package/dist/cjs/lib/version.js.map +1 -1
- package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js +56 -0
- package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
- package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js +6 -6
- package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
- package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/cjs/tests/integration/timeouts.spec.js +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +341 -0
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -0
- package/dist/cjs/tests/unit/agent-execution-model.test.js +25 -3
- package/dist/cjs/tests/unit/agent-execution-model.test.js.map +1 -1
- package/dist/cjs/tests/unit/agent-metrics.test.d.ts +1 -0
- package/dist/cjs/tests/unit/agent-metrics.test.js +112 -0
- package/dist/cjs/tests/unit/agent-metrics.test.js.map +1 -0
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js +23 -0
- package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/aisdk-clients.test.d.ts +1 -0
- package/dist/cjs/tests/unit/aisdk-clients.test.js +90 -0
- package/dist/cjs/tests/unit/aisdk-clients.test.js.map +1 -0
- package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
- package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js +250 -0
- package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.js +86 -0
- package/dist/cjs/tests/unit/api-client-observe-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-optional-model-api-key.test.js +95 -0
- package/dist/cjs/tests/unit/api-optional-model-api-key.test.js.map +1 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.d.ts +1 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.js +37 -0
- package/dist/cjs/tests/unit/api-variables-schema.test.js.map +1 -0
- package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +40 -0
- package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
- package/dist/cjs/tests/unit/captcha-solver.test.d.ts +1 -0
- package/dist/cjs/tests/unit/captcha-solver.test.js +154 -0
- package/dist/cjs/tests/unit/captcha-solver.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js +1 -1
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js.map +1 -1
- package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
- package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
- package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
- package/dist/cjs/tests/unit/microsoft-cua-client.test.d.ts +1 -0
- package/dist/cjs/tests/unit/microsoft-cua-client.test.js +86 -0
- package/dist/cjs/tests/unit/microsoft-cua-client.test.js.map +1 -0
- package/dist/cjs/tests/unit/openai-cua-client.test.d.ts +1 -0
- package/dist/cjs/tests/unit/openai-cua-client.test.js +71 -0
- package/dist/cjs/tests/unit/openai-cua-client.test.js.map +1 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.d.ts +1 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.js +19 -0
- package/dist/cjs/tests/unit/prompt-observe-variables.test.js.map +1 -0
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +1 -0
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/cjs/tests/unit/timeout-handlers.test.js +50 -0
- package/dist/cjs/tests/unit/timeout-handlers.test.js.map +1 -1
- package/dist/esm/lib/inference.d.ts +3 -1
- package/dist/esm/lib/inference.js +3 -3
- package/dist/esm/lib/inference.js.map +1 -1
- package/dist/esm/lib/prompt.d.ts +1 -1
- package/dist/esm/lib/prompt.js +24 -18
- package/dist/esm/lib/prompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentClient.d.ts +8 -0
- package/dist/esm/lib/v3/agent/AgentClient.js +13 -0
- package/dist/esm/lib/v3/agent/AgentClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +1 -0
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +61 -9
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +1 -0
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +16 -0
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +12 -6
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +164 -49
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +2 -2
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +10 -11
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +0 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js +7 -10
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.js +1 -1
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/keys.js +57 -49
- package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
- package/dist/esm/lib/v3/agent/utils/captchaSolver.js +171 -0
- package/dist/esm/lib/v3/agent/utils/captchaSolver.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js +3 -5
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/variables.d.ts +5 -0
- package/dist/esm/lib/v3/agent/utils/variables.js +8 -0
- package/dist/esm/lib/v3/agent/utils/variables.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +5 -3
- package/dist/esm/lib/v3/api.js +5 -15
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/cache/AgentCache.js +5 -3
- package/dist/esm/lib/v3/cache/AgentCache.js.map +1 -1
- package/dist/esm/lib/v3/flowlogger/EventStore.js +1 -1
- package/dist/esm/lib/v3/flowlogger/EventStore.js.map +1 -1
- package/dist/esm/lib/v3/handlers/observeHandler.js +2 -1
- package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +110 -46
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +131 -16
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
- package/dist/esm/lib/v3/llm/LLMProvider.js +15 -7
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/llm/OpenAIClient.js +1 -0
- package/dist/esm/lib/v3/llm/OpenAIClient.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
- package/dist/esm/lib/v3/llm/aisdk.js +67 -17
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/private/cache.d.ts +0 -1
- package/dist/esm/lib/v3/types/private/cache.js.map +1 -1
- package/dist/esm/lib/v3/types/private/handlers.d.ts +1 -0
- package/dist/esm/lib/v3/types/private/handlers.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +8 -3
- package/dist/esm/lib/v3/types/public/agent.js +1 -0
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +54 -7
- package/dist/esm/lib/v3/types/public/api.js +42 -14
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/methods.d.ts +1 -0
- package/dist/esm/lib/v3/types/public/methods.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +32 -2
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/variables.d.ts +7 -0
- package/dist/esm/lib/v3/types/public/variables.js +19 -0
- package/dist/esm/lib/v3/types/public/variables.js.map +1 -0
- package/dist/esm/lib/v3/understudy/context.js +11 -3
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +1 -1
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +23 -2
- package/dist/esm/lib/v3/v3.js +111 -14
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/lib/version.d.ts +1 -1
- package/dist/esm/lib/version.js +1 -1
- package/dist/esm/lib/version.js.map +1 -1
- package/dist/esm/tests/integration/agent-captcha-autosolve.spec.d.ts +1 -0
- package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js +54 -0
- package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
- package/dist/esm/tests/integration/agent-hybrid-mode.spec.js +6 -6
- package/dist/esm/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
- package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
- package/dist/esm/tests/integration/timeouts.spec.js +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
- package/dist/esm/tests/unit/agent-captcha-hooks.test.js +339 -0
- package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -0
- package/dist/esm/tests/unit/agent-execution-model.test.js +25 -3
- package/dist/esm/tests/unit/agent-execution-model.test.js.map +1 -1
- package/dist/esm/tests/unit/agent-metrics.test.d.ts +1 -0
- package/dist/esm/tests/unit/agent-metrics.test.js +110 -0
- package/dist/esm/tests/unit/agent-metrics.test.js.map +1 -0
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.js +21 -0
- package/dist/esm/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/aisdk-clients.test.d.ts +1 -0
- package/dist/esm/tests/unit/aisdk-clients.test.js +88 -0
- package/dist/esm/tests/unit/aisdk-clients.test.js.map +1 -0
- package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
- package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js +245 -0
- package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.js +84 -0
- package/dist/esm/tests/unit/api-client-observe-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-optional-model-api-key.test.js +93 -0
- package/dist/esm/tests/unit/api-optional-model-api-key.test.js.map +1 -0
- package/dist/esm/tests/unit/api-variables-schema.test.d.ts +1 -0
- package/dist/esm/tests/unit/api-variables-schema.test.js +35 -0
- package/dist/esm/tests/unit/api-variables-schema.test.js.map +1 -0
- package/dist/esm/tests/unit/browserbase-session-accessors.test.js +40 -0
- package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
- package/dist/esm/tests/unit/captcha-solver.test.d.ts +1 -0
- package/dist/esm/tests/unit/captcha-solver.test.js +152 -0
- package/dist/esm/tests/unit/captcha-solver.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js +1 -1
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js.map +1 -1
- package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
- package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
- package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
- package/dist/esm/tests/unit/microsoft-cua-client.test.d.ts +1 -0
- package/dist/esm/tests/unit/microsoft-cua-client.test.js +84 -0
- package/dist/esm/tests/unit/microsoft-cua-client.test.js.map +1 -0
- package/dist/esm/tests/unit/openai-cua-client.test.d.ts +1 -0
- package/dist/esm/tests/unit/openai-cua-client.test.js +69 -0
- package/dist/esm/tests/unit/openai-cua-client.test.js.map +1 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.d.ts +1 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.js +17 -0
- package/dist/esm/tests/unit/prompt-observe-variables.test.js.map +1 -0
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +1 -0
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/esm/tests/unit/timeout-handlers.test.js +50 -0
- package/dist/esm/tests/unit/timeout-handlers.test.js.map +1 -1
- package/package.json +5 -9
- package/dist/cjs/lib/v3/dom/build/rerender-index.js +0 -1
- package/dist/cjs/lib/v3/dom/build/v3-index.js +0 -1
- package/dist/esm/lib/v3/dom/build/rerender-index.js +0 -1
- package/dist/esm/lib/v3/dom/build/v3-index.js +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const agentSystemPrompt_js_1 = require("../../lib/v3/agent/prompts/agentSystemPrompt.js");
|
|
5
|
+
(0, vitest_1.describe)("buildAgentSystemPrompt variables", () => {
|
|
6
|
+
(0, vitest_1.it)("includes variable descriptions when present", () => {
|
|
7
|
+
const prompt = (0, agentSystemPrompt_js_1.buildAgentSystemPrompt)({
|
|
8
|
+
url: "https://example.com",
|
|
9
|
+
executionInstruction: "Fill the form",
|
|
10
|
+
mode: "dom",
|
|
11
|
+
variables: {
|
|
12
|
+
username: {
|
|
13
|
+
value: "john@example.com",
|
|
14
|
+
description: "The login email",
|
|
15
|
+
},
|
|
16
|
+
password: "secret123",
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.expect)(prompt).toContain('<variable name="username">The login email</variable>');
|
|
20
|
+
(0, vitest_1.expect)(prompt).toContain('<variable name="password" />');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=agent-system-prompt-variables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-system-prompt-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-system-prompt-variables.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,0FAAyF;AAEzF,IAAA,iBAAQ,EAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAA,6CAAsB,EAAC;YACpC,GAAG,EAAE,qBAAqB;YAC1B,oBAAoB,EAAE,eAAe;YACrC,IAAI,EAAE,KAAK;YACX,SAAS,EAAE;gBACT,QAAQ,EAAE;oBACR,KAAK,EAAE,kBAAkB;oBACzB,WAAW,EAAE,iBAAiB;iBAC/B;gBACD,QAAQ,EAAE,WAAW;aACtB;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CACtB,sDAAsD,CACvD,CAAC;QACF,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { buildAgentSystemPrompt } from \"../../lib/v3/agent/prompts/agentSystemPrompt.js\";\n\ndescribe(\"buildAgentSystemPrompt variables\", () => {\n it(\"includes variable descriptions when present\", () => {\n const prompt = buildAgentSystemPrompt({\n url: \"https://example.com\",\n executionInstruction: \"Fill the form\",\n mode: \"dom\",\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret123\",\n },\n });\n\n expect(prompt).toContain(\n '<variable name=\"username\">The login email</variable>',\n );\n expect(prompt).toContain('<variable name=\"password\" />');\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ai_1 = require("ai");
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const vitest_1 = require("vitest");
|
|
6
|
+
const aisdk_js_1 = require("../../lib/v3/llm/aisdk.js");
|
|
7
|
+
vitest_1.vi.mock("ai", async () => {
|
|
8
|
+
const actual = await vitest_1.vi.importActual("ai");
|
|
9
|
+
return {
|
|
10
|
+
...actual,
|
|
11
|
+
generateObject: vitest_1.vi.fn(),
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
const mockGenerateObject = vitest_1.vi.mocked(ai_1.generateObject);
|
|
15
|
+
function createModel(modelId) {
|
|
16
|
+
return {
|
|
17
|
+
modelId,
|
|
18
|
+
specificationVersion: "v2",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
(0, vitest_1.describe)("AISdkClient structured output provider options", () => {
|
|
22
|
+
(0, vitest_1.beforeEach)(() => {
|
|
23
|
+
mockGenerateObject.mockReset();
|
|
24
|
+
mockGenerateObject.mockResolvedValue({
|
|
25
|
+
object: { ok: true },
|
|
26
|
+
usage: {
|
|
27
|
+
inputTokens: 1,
|
|
28
|
+
outputTokens: 2,
|
|
29
|
+
reasoningTokens: 0,
|
|
30
|
+
cachedInputTokens: 0,
|
|
31
|
+
totalTokens: 3,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
vitest_1.it.each([
|
|
36
|
+
["openai/gpt-4.1", { openai: { strictJsonSchema: true } }],
|
|
37
|
+
["azure/gpt-4.1", { azure: { strictJsonSchema: true } }],
|
|
38
|
+
["google/gemini-2.5-pro", { google: { structuredOutputs: true } }],
|
|
39
|
+
["vertex/gemini-2.5-pro", { vertex: { structuredOutputs: true } }],
|
|
40
|
+
[
|
|
41
|
+
"anthropic/claude-sonnet-4-20250514",
|
|
42
|
+
{ anthropic: { structuredOutputMode: "auto" } },
|
|
43
|
+
],
|
|
44
|
+
["groq/llama-3.3-70b-versatile", { groq: { structuredOutputs: true } }],
|
|
45
|
+
["cerebras/llama-4-scout", { cerebras: { strictJsonSchema: true } }],
|
|
46
|
+
[
|
|
47
|
+
"mistral/mistral-large-latest",
|
|
48
|
+
{ mistral: { structuredOutputs: true, strictJsonSchema: true } },
|
|
49
|
+
],
|
|
50
|
+
])("passes provider structured-output options for %s", async (modelId, providerOptions) => {
|
|
51
|
+
const client = new aisdk_js_1.AISdkClient({
|
|
52
|
+
model: createModel(modelId),
|
|
53
|
+
logger: vitest_1.vi.fn(),
|
|
54
|
+
});
|
|
55
|
+
await client.createChatCompletion({
|
|
56
|
+
options: {
|
|
57
|
+
messages: [{ role: "user", content: "hello" }],
|
|
58
|
+
response_model: {
|
|
59
|
+
name: "test",
|
|
60
|
+
schema: zod_1.z.object({ ok: zod_1.z.boolean() }),
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
logger: vitest_1.vi.fn(),
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.expect)(mockGenerateObject).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
66
|
+
providerOptions,
|
|
67
|
+
}));
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.it)("omits temperature for claude-opus-4-7 structured calls", async () => {
|
|
70
|
+
const client = new aisdk_js_1.AISdkClient({
|
|
71
|
+
model: createModel("anthropic/claude-opus-4-7"),
|
|
72
|
+
logger: vitest_1.vi.fn(),
|
|
73
|
+
});
|
|
74
|
+
await client.createChatCompletion({
|
|
75
|
+
options: {
|
|
76
|
+
messages: [{ role: "user", content: "hello" }],
|
|
77
|
+
response_model: {
|
|
78
|
+
name: "test",
|
|
79
|
+
schema: zod_1.z.object({ ok: zod_1.z.boolean() }),
|
|
80
|
+
},
|
|
81
|
+
temperature: 0.1,
|
|
82
|
+
},
|
|
83
|
+
logger: vitest_1.vi.fn(),
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.expect)(mockGenerateObject).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
86
|
+
temperature: undefined,
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=aisdk-clients.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aisdk-clients.test.js","sourceRoot":"","sources":["../../../../tests/unit/aisdk-clients.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LanguageModelV2 } from \"@ai-sdk/provider\";\nimport { generateObject } from \"ai\";\nimport { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { AISdkClient } from \"../../lib/v3/llm/aisdk.js\";\n\nvi.mock(\"ai\", async () => {\n const actual = await vi.importActual<typeof import(\"ai\")>(\"ai\");\n return {\n ...actual,\n generateObject: vi.fn(),\n };\n});\n\nconst mockGenerateObject = vi.mocked(generateObject);\n\nfunction createModel(modelId: string) {\n return {\n modelId,\n specificationVersion: \"v2\",\n } as unknown as LanguageModelV2;\n}\n\ndescribe(\"AISdkClient structured output provider options\", () => {\n beforeEach(() => {\n mockGenerateObject.mockReset();\n mockGenerateObject.mockResolvedValue({\n object: { ok: true },\n usage: {\n inputTokens: 1,\n outputTokens: 2,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n totalTokens: 3,\n },\n } as never);\n });\n\n it.each([\n [\"openai/gpt-4.1\", { openai: { strictJsonSchema: true } }],\n [\"azure/gpt-4.1\", { azure: { strictJsonSchema: true } }],\n [\"google/gemini-2.5-pro\", { google: { structuredOutputs: true } }],\n [\"vertex/gemini-2.5-pro\", { vertex: { structuredOutputs: true } }],\n [\n \"anthropic/claude-sonnet-4-20250514\",\n { anthropic: { structuredOutputMode: \"auto\" } },\n ],\n [\"groq/llama-3.3-70b-versatile\", { groq: { structuredOutputs: true } }],\n [\"cerebras/llama-4-scout\", { cerebras: { strictJsonSchema: true } }],\n [\n \"mistral/mistral-large-latest\",\n { mistral: { structuredOutputs: true, strictJsonSchema: true } },\n ],\n ])(\n \"passes provider structured-output options for %s\",\n async (modelId, providerOptions) => {\n const client = new AISdkClient({\n model: createModel(modelId),\n logger: vi.fn(),\n });\n\n await client.createChatCompletion({\n options: {\n messages: [{ role: \"user\", content: \"hello\" }],\n response_model: {\n name: \"test\",\n schema: z.object({ ok: z.boolean() }),\n },\n },\n logger: vi.fn(),\n });\n\n expect(mockGenerateObject).toHaveBeenCalledWith(\n expect.objectContaining({\n providerOptions,\n }),\n );\n },\n );\n\n it(\"omits temperature for claude-opus-4-7 structured calls\", async () => {\n const client = new AISdkClient({\n model: createModel(\"anthropic/claude-opus-4-7\"),\n logger: vi.fn(),\n });\n\n await client.createChatCompletion({\n options: {\n messages: [{ role: \"user\", content: \"hello\" }],\n response_model: {\n name: \"test\",\n schema: z.object({ ok: z.boolean() }),\n },\n temperature: 0.1,\n },\n logger: vi.fn(),\n });\n\n expect(mockGenerateObject).toHaveBeenCalledWith(\n expect.objectContaining({\n temperature: undefined,\n }),\n );\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const AnthropicCUAClient_js_1 = require("../../lib/v3/agent/AnthropicCUAClient.js");
|
|
8
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
9
|
+
// Mock the Anthropic SDK's beta.messages.create method
|
|
10
|
+
vitest_1.vi.mock("@anthropic-ai/sdk", () => {
|
|
11
|
+
const mockCreate = vitest_1.vi.fn().mockResolvedValue({
|
|
12
|
+
id: "test-id",
|
|
13
|
+
content: [{ type: "text", text: "test response" }],
|
|
14
|
+
usage: { input_tokens: 10, output_tokens: 20 },
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
default: class MockAnthropic {
|
|
18
|
+
beta = {
|
|
19
|
+
messages: {
|
|
20
|
+
create: mockCreate,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.describe)("AnthropicCUAClient adaptive thinking", () => {
|
|
27
|
+
let mockCreate;
|
|
28
|
+
(0, vitest_1.beforeEach)(() => {
|
|
29
|
+
vitest_1.vi.clearAllMocks();
|
|
30
|
+
// Get the mock create function from a new instance
|
|
31
|
+
const anthropic = new sdk_1.default({ apiKey: "test" });
|
|
32
|
+
mockCreate = anthropic.beta.messages.create;
|
|
33
|
+
mockCreate.mockResolvedValue({
|
|
34
|
+
id: "test-id",
|
|
35
|
+
content: [{ type: "text", text: "test response" }],
|
|
36
|
+
usage: { input_tokens: 10, output_tokens: 20 },
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.describe)("Claude 4.6 models (adaptive thinking)", () => {
|
|
40
|
+
(0, vitest_1.it)("should use thinking.type: 'adaptive' for claude-opus-4-6 when thinkingEffort is set", async () => {
|
|
41
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
42
|
+
apiKey: "test-key",
|
|
43
|
+
thinkingEffort: "high",
|
|
44
|
+
});
|
|
45
|
+
client.setViewport(1280, 720);
|
|
46
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
47
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
48
|
+
thinking: { type: "adaptive" },
|
|
49
|
+
output_config: { effort: "high" },
|
|
50
|
+
temperature: 1,
|
|
51
|
+
}));
|
|
52
|
+
// Should NOT have budget_tokens
|
|
53
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
54
|
+
(0, vitest_1.expect)(callArgs.thinking).not.toHaveProperty("budget_tokens");
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)("should use thinking.type: 'adaptive' for claude-sonnet-4-6 when thinkingEffort is set", async () => {
|
|
57
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-sonnet-4-6", undefined, {
|
|
58
|
+
apiKey: "test-key",
|
|
59
|
+
thinkingEffort: "medium",
|
|
60
|
+
});
|
|
61
|
+
client.setViewport(1280, 720);
|
|
62
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
63
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
64
|
+
thinking: { type: "adaptive" },
|
|
65
|
+
output_config: { effort: "medium" },
|
|
66
|
+
temperature: 1,
|
|
67
|
+
}));
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.it)("should support 'max' effort level for claude-opus-4-6", async () => {
|
|
70
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
71
|
+
apiKey: "test-key",
|
|
72
|
+
thinkingEffort: "max",
|
|
73
|
+
});
|
|
74
|
+
client.setViewport(1280, 720);
|
|
75
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
76
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
77
|
+
thinking: { type: "adaptive" },
|
|
78
|
+
output_config: { effort: "max" },
|
|
79
|
+
temperature: 1,
|
|
80
|
+
}));
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)("should support 'low' effort level", async () => {
|
|
83
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-sonnet-4-6", undefined, {
|
|
84
|
+
apiKey: "test-key",
|
|
85
|
+
thinkingEffort: "low",
|
|
86
|
+
});
|
|
87
|
+
client.setViewport(1280, 720);
|
|
88
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
89
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
90
|
+
thinking: { type: "adaptive" },
|
|
91
|
+
output_config: { effort: "low" },
|
|
92
|
+
temperature: 1,
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
95
|
+
(0, vitest_1.it)("should default to adaptive thinking with 'medium' effort when thinkingEffort is not set for 4.6 models", async () => {
|
|
96
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
97
|
+
apiKey: "test-key",
|
|
98
|
+
});
|
|
99
|
+
client.setViewport(1280, 720);
|
|
100
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
101
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
102
|
+
thinking: { type: "adaptive" },
|
|
103
|
+
output_config: { effort: "medium" },
|
|
104
|
+
temperature: 1,
|
|
105
|
+
}));
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.it)("should set temperature to 1 when adaptive thinking is enabled", async () => {
|
|
108
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
109
|
+
apiKey: "test-key",
|
|
110
|
+
thinkingEffort: "high",
|
|
111
|
+
});
|
|
112
|
+
client.setViewport(1280, 720);
|
|
113
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
114
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
115
|
+
temperature: 1,
|
|
116
|
+
}));
|
|
117
|
+
});
|
|
118
|
+
(0, vitest_1.it)("should set temperature to 1 for claude-sonnet-4-6 with adaptive thinking", async () => {
|
|
119
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-sonnet-4-6", undefined, {
|
|
120
|
+
apiKey: "test-key",
|
|
121
|
+
thinkingEffort: "low",
|
|
122
|
+
});
|
|
123
|
+
client.setViewport(1280, 720);
|
|
124
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
125
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
126
|
+
thinking: { type: "adaptive" },
|
|
127
|
+
output_config: { effort: "low" },
|
|
128
|
+
temperature: 1,
|
|
129
|
+
}));
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.it)("should disable adaptive thinking when thinkingEffort is 'none'", async () => {
|
|
132
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
133
|
+
apiKey: "test-key",
|
|
134
|
+
thinkingEffort: "none",
|
|
135
|
+
});
|
|
136
|
+
client.setViewport(1280, 720);
|
|
137
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
138
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
139
|
+
(0, vitest_1.expect)(callArgs.thinking).toBeUndefined();
|
|
140
|
+
(0, vitest_1.expect)(callArgs.output_config).toBeUndefined();
|
|
141
|
+
(0, vitest_1.expect)(callArgs.temperature).toBeUndefined();
|
|
142
|
+
});
|
|
143
|
+
(0, vitest_1.it)("should log a debug warning when thinkingBudget is set on a 4.6 model", async () => {
|
|
144
|
+
const logger = vitest_1.vi.fn();
|
|
145
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
146
|
+
apiKey: "test-key",
|
|
147
|
+
thinkingBudget: 10000,
|
|
148
|
+
});
|
|
149
|
+
client.setViewport(1280, 720);
|
|
150
|
+
await client.getAction([{ role: "user", content: "test" }], logger);
|
|
151
|
+
(0, vitest_1.expect)(logger).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
152
|
+
category: "agent",
|
|
153
|
+
message: vitest_1.expect.stringContaining("thinkingBudget is ignored"),
|
|
154
|
+
level: 2,
|
|
155
|
+
}));
|
|
156
|
+
// Should still use adaptive thinking, not budget_tokens
|
|
157
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
158
|
+
(0, vitest_1.expect)(callArgs.thinking).toEqual({ type: "adaptive" });
|
|
159
|
+
});
|
|
160
|
+
(0, vitest_1.it)("should log a debug warning when user-specified temperature is overridden", async () => {
|
|
161
|
+
const logger = vitest_1.vi.fn();
|
|
162
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
163
|
+
apiKey: "test-key",
|
|
164
|
+
thinkingEffort: "high",
|
|
165
|
+
temperature: 0.5,
|
|
166
|
+
});
|
|
167
|
+
client.setViewport(1280, 720);
|
|
168
|
+
await client.getAction([{ role: "user", content: "test" }], logger);
|
|
169
|
+
(0, vitest_1.expect)(logger).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
170
|
+
category: "agent",
|
|
171
|
+
message: vitest_1.expect.stringContaining("overriding user-specified temperature=0.5"),
|
|
172
|
+
level: 2,
|
|
173
|
+
}));
|
|
174
|
+
// Temperature should still be forced to 1
|
|
175
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
176
|
+
(0, vitest_1.expect)(callArgs.temperature).toBe(1);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
(0, vitest_1.describe)("older Claude models (budget_tokens - deprecated)", () => {
|
|
180
|
+
(0, vitest_1.it)("should use thinking.type: 'enabled' with budget_tokens for claude-sonnet-4-5 when thinkingBudget is set", async () => {
|
|
181
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-sonnet-4-5-20250929", undefined, {
|
|
182
|
+
apiKey: "test-key",
|
|
183
|
+
thinkingBudget: 8000,
|
|
184
|
+
});
|
|
185
|
+
client.setViewport(1280, 720);
|
|
186
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
187
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
188
|
+
thinking: { type: "enabled", budget_tokens: 8000 },
|
|
189
|
+
}));
|
|
190
|
+
// Should NOT have output_config for older models
|
|
191
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
192
|
+
(0, vitest_1.expect)(callArgs.output_config).toBeUndefined();
|
|
193
|
+
});
|
|
194
|
+
(0, vitest_1.it)("should use thinking.type: 'enabled' with budget_tokens for claude-opus-4-5 when thinkingBudget is set", async () => {
|
|
195
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-5-20251101", undefined, {
|
|
196
|
+
apiKey: "test-key",
|
|
197
|
+
thinkingBudget: 10000,
|
|
198
|
+
});
|
|
199
|
+
client.setViewport(1280, 720);
|
|
200
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
201
|
+
(0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
|
|
202
|
+
thinking: { type: "enabled", budget_tokens: 10000 },
|
|
203
|
+
}));
|
|
204
|
+
});
|
|
205
|
+
(0, vitest_1.it)("should NOT force temperature to 1 for older models with budget_tokens", async () => {
|
|
206
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-sonnet-4-5-20250929", undefined, {
|
|
207
|
+
apiKey: "test-key",
|
|
208
|
+
thinkingBudget: 8000,
|
|
209
|
+
});
|
|
210
|
+
client.setViewport(1280, 720);
|
|
211
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
212
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
213
|
+
// Temperature should not be explicitly set to 1 for older models
|
|
214
|
+
(0, vitest_1.expect)(callArgs.temperature).toBeUndefined();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
(0, vitest_1.describe)("model detection", () => {
|
|
218
|
+
(0, vitest_1.it)("should detect claude-opus-4-6 as a 4.6 model", async () => {
|
|
219
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-opus-4-6", undefined, {
|
|
220
|
+
apiKey: "test-key",
|
|
221
|
+
thinkingEffort: "high",
|
|
222
|
+
});
|
|
223
|
+
client.setViewport(1280, 720);
|
|
224
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
225
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
226
|
+
(0, vitest_1.expect)(callArgs.thinking.type).toBe("adaptive");
|
|
227
|
+
});
|
|
228
|
+
(0, vitest_1.it)("should detect claude-sonnet-4-6 as a 4.6 model", async () => {
|
|
229
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "claude-sonnet-4-6", undefined, {
|
|
230
|
+
apiKey: "test-key",
|
|
231
|
+
thinkingEffort: "high",
|
|
232
|
+
});
|
|
233
|
+
client.setViewport(1280, 720);
|
|
234
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
235
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
236
|
+
(0, vitest_1.expect)(callArgs.thinking.type).toBe("adaptive");
|
|
237
|
+
});
|
|
238
|
+
(0, vitest_1.it)("should handle provider-prefixed model names (anthropic/claude-opus-4-6)", async () => {
|
|
239
|
+
const client = new AnthropicCUAClient_js_1.AnthropicCUAClient("anthropic", "anthropic/claude-opus-4-6", undefined, {
|
|
240
|
+
apiKey: "test-key",
|
|
241
|
+
thinkingEffort: "high",
|
|
242
|
+
});
|
|
243
|
+
client.setViewport(1280, 720);
|
|
244
|
+
await client.getAction([{ role: "user", content: "test" }]);
|
|
245
|
+
const callArgs = mockCreate.mock.calls[0][0];
|
|
246
|
+
(0, vitest_1.expect)(callArgs.thinking.type).toBe("adaptive");
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=anthropic-cua-adaptive-thinking.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-cua-adaptive-thinking.test.js","sourceRoot":"","sources":["../../../../tests/unit/anthropic-cua-adaptive-thinking.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach } from \"vitest\";\nimport { AnthropicCUAClient } from \"../../lib/v3/agent/AnthropicCUAClient.js\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\n// Mock the Anthropic SDK's beta.messages.create method\nvi.mock(\"@anthropic-ai/sdk\", () => {\n const mockCreate = vi.fn().mockResolvedValue({\n id: \"test-id\",\n content: [{ type: \"text\", text: \"test response\" }],\n usage: { input_tokens: 10, output_tokens: 20 },\n });\n\n return {\n default: class MockAnthropic {\n beta = {\n messages: {\n create: mockCreate,\n },\n };\n },\n };\n});\n\ndescribe(\"AnthropicCUAClient adaptive thinking\", () => {\n let mockCreate: ReturnType<typeof vi.fn>;\n\n beforeEach(() => {\n vi.clearAllMocks();\n // Get the mock create function from a new instance\n const anthropic = new Anthropic({ apiKey: \"test\" });\n mockCreate = anthropic.beta.messages.create as ReturnType<typeof vi.fn>;\n mockCreate.mockResolvedValue({\n id: \"test-id\",\n content: [{ type: \"text\", text: \"test response\" }],\n usage: { input_tokens: 10, output_tokens: 20 },\n });\n });\n\n describe(\"Claude 4.6 models (adaptive thinking)\", () => {\n it(\"should use thinking.type: 'adaptive' for claude-opus-4-6 when thinkingEffort is set\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"high\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"adaptive\" },\n output_config: { effort: \"high\" },\n temperature: 1,\n }),\n );\n\n // Should NOT have budget_tokens\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.thinking).not.toHaveProperty(\"budget_tokens\");\n });\n\n it(\"should use thinking.type: 'adaptive' for claude-sonnet-4-6 when thinkingEffort is set\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-sonnet-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"medium\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"adaptive\" },\n output_config: { effort: \"medium\" },\n temperature: 1,\n }),\n );\n });\n\n it(\"should support 'max' effort level for claude-opus-4-6\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"max\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"adaptive\" },\n output_config: { effort: \"max\" },\n temperature: 1,\n }),\n );\n });\n\n it(\"should support 'low' effort level\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-sonnet-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"low\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"adaptive\" },\n output_config: { effort: \"low\" },\n temperature: 1,\n }),\n );\n });\n\n it(\"should default to adaptive thinking with 'medium' effort when thinkingEffort is not set for 4.6 models\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"adaptive\" },\n output_config: { effort: \"medium\" },\n temperature: 1,\n }),\n );\n });\n\n it(\"should set temperature to 1 when adaptive thinking is enabled\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"high\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n temperature: 1,\n }),\n );\n });\n\n it(\"should set temperature to 1 for claude-sonnet-4-6 with adaptive thinking\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-sonnet-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"low\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"adaptive\" },\n output_config: { effort: \"low\" },\n temperature: 1,\n }),\n );\n });\n\n it(\"should disable adaptive thinking when thinkingEffort is 'none'\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"none\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.thinking).toBeUndefined();\n expect(callArgs.output_config).toBeUndefined();\n expect(callArgs.temperature).toBeUndefined();\n });\n\n it(\"should log a debug warning when thinkingBudget is set on a 4.6 model\", async () => {\n const logger = vi.fn();\n\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingBudget: 10000,\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }], logger);\n\n expect(logger).toHaveBeenCalledWith(\n expect.objectContaining({\n category: \"agent\",\n message: expect.stringContaining(\"thinkingBudget is ignored\"),\n level: 2,\n }),\n );\n\n // Should still use adaptive thinking, not budget_tokens\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.thinking).toEqual({ type: \"adaptive\" });\n });\n\n it(\"should log a debug warning when user-specified temperature is overridden\", async () => {\n const logger = vi.fn();\n\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"high\",\n temperature: 0.5,\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }], logger);\n\n expect(logger).toHaveBeenCalledWith(\n expect.objectContaining({\n category: \"agent\",\n message: expect.stringContaining(\n \"overriding user-specified temperature=0.5\",\n ),\n level: 2,\n }),\n );\n\n // Temperature should still be forced to 1\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.temperature).toBe(1);\n });\n });\n\n describe(\"older Claude models (budget_tokens - deprecated)\", () => {\n it(\"should use thinking.type: 'enabled' with budget_tokens for claude-sonnet-4-5 when thinkingBudget is set\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-sonnet-4-5-20250929\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingBudget: 8000,\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"enabled\", budget_tokens: 8000 },\n }),\n );\n\n // Should NOT have output_config for older models\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.output_config).toBeUndefined();\n });\n\n it(\"should use thinking.type: 'enabled' with budget_tokens for claude-opus-4-5 when thinkingBudget is set\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-5-20251101\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingBudget: 10000,\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n expect(mockCreate).toHaveBeenCalledWith(\n expect.objectContaining({\n thinking: { type: \"enabled\", budget_tokens: 10000 },\n }),\n );\n });\n\n it(\"should NOT force temperature to 1 for older models with budget_tokens\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-sonnet-4-5-20250929\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingBudget: 8000,\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n const callArgs = mockCreate.mock.calls[0][0];\n // Temperature should not be explicitly set to 1 for older models\n expect(callArgs.temperature).toBeUndefined();\n });\n });\n\n describe(\"model detection\", () => {\n it(\"should detect claude-opus-4-6 as a 4.6 model\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"high\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.thinking.type).toBe(\"adaptive\");\n });\n\n it(\"should detect claude-sonnet-4-6 as a 4.6 model\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"claude-sonnet-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"high\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.thinking.type).toBe(\"adaptive\");\n });\n\n it(\"should handle provider-prefixed model names (anthropic/claude-opus-4-6)\", async () => {\n const client = new AnthropicCUAClient(\n \"anthropic\",\n \"anthropic/claude-opus-4-6\",\n undefined,\n {\n apiKey: \"test-key\",\n thinkingEffort: \"high\",\n },\n );\n client.setViewport(1280, 720);\n\n await client.getAction([{ role: \"user\", content: \"test\" }]);\n\n const callArgs = mockCreate.mock.calls[0][0];\n expect(callArgs.thinking.type).toBe(\"adaptive\");\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const api_js_1 = require("../../lib/v3/api.js");
|
|
5
|
+
(0, vitest_1.describe)("StagehandAPIClient variable serialization", () => {
|
|
6
|
+
(0, vitest_1.it)("preserves rich variables when sending the act request", async () => {
|
|
7
|
+
const client = new api_js_1.StagehandAPIClient({
|
|
8
|
+
apiKey: "bb-test",
|
|
9
|
+
logger: vitest_1.vi.fn(),
|
|
10
|
+
});
|
|
11
|
+
const executeMock = vitest_1.vi.fn().mockResolvedValue({
|
|
12
|
+
success: true,
|
|
13
|
+
message: "ok",
|
|
14
|
+
actionDescription: "typed",
|
|
15
|
+
actions: [],
|
|
16
|
+
});
|
|
17
|
+
client.execute = executeMock;
|
|
18
|
+
await client.act({
|
|
19
|
+
input: "type %username% into the email field",
|
|
20
|
+
options: {
|
|
21
|
+
variables: {
|
|
22
|
+
username: {
|
|
23
|
+
value: "john@example.com",
|
|
24
|
+
description: "The login email",
|
|
25
|
+
},
|
|
26
|
+
password: "secret",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.expect)(executeMock).toHaveBeenCalledWith({
|
|
31
|
+
method: "act",
|
|
32
|
+
args: {
|
|
33
|
+
input: "type %username% into the email field",
|
|
34
|
+
options: {
|
|
35
|
+
variables: {
|
|
36
|
+
username: {
|
|
37
|
+
value: "john@example.com",
|
|
38
|
+
description: "The login email",
|
|
39
|
+
},
|
|
40
|
+
password: "secret",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
frameId: undefined,
|
|
44
|
+
},
|
|
45
|
+
serverCache: undefined,
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)("preserves rich variables when sending the observe request", async () => {
|
|
49
|
+
const client = new api_js_1.StagehandAPIClient({
|
|
50
|
+
apiKey: "bb-test",
|
|
51
|
+
logger: vitest_1.vi.fn(),
|
|
52
|
+
});
|
|
53
|
+
const executeMock = vitest_1.vi.fn().mockResolvedValue([]);
|
|
54
|
+
client.execute = executeMock;
|
|
55
|
+
await client.observe({
|
|
56
|
+
instruction: "find the field where %username% should be entered",
|
|
57
|
+
options: {
|
|
58
|
+
variables: {
|
|
59
|
+
username: {
|
|
60
|
+
value: "john@example.com",
|
|
61
|
+
description: "The login email",
|
|
62
|
+
},
|
|
63
|
+
password: "secret",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.expect)(executeMock).toHaveBeenCalledWith({
|
|
68
|
+
method: "observe",
|
|
69
|
+
args: {
|
|
70
|
+
instruction: "find the field where %username% should be entered",
|
|
71
|
+
options: {
|
|
72
|
+
variables: {
|
|
73
|
+
username: {
|
|
74
|
+
value: "john@example.com",
|
|
75
|
+
description: "The login email",
|
|
76
|
+
},
|
|
77
|
+
password: "secret",
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
frameId: undefined,
|
|
81
|
+
},
|
|
82
|
+
serverCache: undefined,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=api-client-observe-variables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client-observe-variables.test.js","sourceRoot":"","sources":["../../../../tests/unit/api-client-observe-variables.test.ts"],"names":[],"mappings":";;AAAA,mCAAkD;AAClD,gDAAyD;AAEzD,IAAA,iBAAQ,EAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,IAAA,WAAE,EAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,2BAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC5C,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,OAAO;YAC1B,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QAGD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,GAAG,CAAC;YACf,KAAK,EAAE,sCAAsC;YAC7C,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE;gBACJ,KAAK,EAAE,sCAAsC;gBAC7C,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,IAAI,2BAAkB,CAAC;YACpC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAGhD,MAGD,CAAC,OAAO,GAAG,WAAW,CAAC;QAExB,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,WAAW,EAAE,mDAAmD;YAChE,OAAO,EAAE;gBACP,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,iBAAiB;qBAC/B;oBACD,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE;gBACJ,WAAW,EAAE,mDAAmD;gBAChE,OAAO,EAAE;oBACP,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,KAAK,EAAE,kBAAkB;4BACzB,WAAW,EAAE,iBAAiB;yBAC/B;wBACD,QAAQ,EAAE,QAAQ;qBACnB;iBACF;gBACD,OAAO,EAAE,SAAS;aACnB;YACD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { StagehandAPIClient } from \"../../lib/v3/api.js\";\n\ndescribe(\"StagehandAPIClient variable serialization\", () => {\n it(\"preserves rich variables when sending the act request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue({\n success: true,\n message: \"ok\",\n actionDescription: \"typed\",\n actions: [],\n });\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.act({\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"act\",\n args: {\n input: \"type %username% into the email field\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n\n it(\"preserves rich variables when sending the observe request\", async () => {\n const client = new StagehandAPIClient({\n apiKey: \"bb-test\",\n logger: vi.fn(),\n });\n const executeMock = vi.fn().mockResolvedValue([]);\n\n (\n client as unknown as {\n execute: typeof executeMock;\n }\n ).execute = executeMock;\n\n await client.observe({\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n });\n\n expect(executeMock).toHaveBeenCalledWith({\n method: \"observe\",\n args: {\n instruction: \"find the field where %username% should be entered\",\n options: {\n variables: {\n username: {\n value: \"john@example.com\",\n description: \"The login email\",\n },\n password: \"secret\",\n },\n },\n frameId: undefined,\n },\n serverCache: undefined,\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const api_1 = require("../../lib/v3/api");
|
|
5
|
+
/**
|
|
6
|
+
* Tests that modelApiKey is optional when calling StagehandAPIClient.init().
|
|
7
|
+
*
|
|
8
|
+
* Previously, init() would throw "modelApiKey is required" if the key was not
|
|
9
|
+
* provided. After the fix, sessions can be started without a model API key
|
|
10
|
+
* (the server may provide its own key or the user may not need one).
|
|
11
|
+
* When provided, the key should still be sent via the x-model-api-key header.
|
|
12
|
+
*/
|
|
13
|
+
(0, vitest_1.describe)("StagehandAPIClient - optional modelApiKey", () => {
|
|
14
|
+
const logger = vitest_1.vi.fn();
|
|
15
|
+
// We mock fetch to avoid real network calls; we just need to verify
|
|
16
|
+
// that init() doesn't throw when modelApiKey is omitted and that
|
|
17
|
+
// the header is conditionally included.
|
|
18
|
+
let originalFetch;
|
|
19
|
+
function createSessionStartResponse(sessionId) {
|
|
20
|
+
return new Response(JSON.stringify({
|
|
21
|
+
success: true,
|
|
22
|
+
data: { sessionId, available: true },
|
|
23
|
+
}), {
|
|
24
|
+
status: 200,
|
|
25
|
+
headers: { "Content-Type": "application/json" },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
(0, vitest_1.beforeEach)(() => {
|
|
29
|
+
originalFetch = globalThis.fetch;
|
|
30
|
+
});
|
|
31
|
+
(0, vitest_1.afterEach)(() => {
|
|
32
|
+
globalThis.fetch = originalFetch;
|
|
33
|
+
vitest_1.vi.restoreAllMocks();
|
|
34
|
+
});
|
|
35
|
+
(0, vitest_1.it)("should NOT throw when modelApiKey is omitted", async () => {
|
|
36
|
+
globalThis.fetch = vitest_1.vi
|
|
37
|
+
.fn()
|
|
38
|
+
.mockResolvedValue(createSessionStartResponse("sess-123"));
|
|
39
|
+
const client = new api_1.StagehandAPIClient({
|
|
40
|
+
apiKey: "test-api-key",
|
|
41
|
+
logger,
|
|
42
|
+
});
|
|
43
|
+
// Should not throw "modelApiKey is required"
|
|
44
|
+
await (0, vitest_1.expect)(client.init({
|
|
45
|
+
modelName: "openai/gpt-4.1-mini",
|
|
46
|
+
})).resolves.toBeDefined();
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)("should NOT throw when modelApiKey is undefined", async () => {
|
|
49
|
+
globalThis.fetch = vitest_1.vi
|
|
50
|
+
.fn()
|
|
51
|
+
.mockResolvedValue(createSessionStartResponse("sess-456"));
|
|
52
|
+
const client = new api_1.StagehandAPIClient({
|
|
53
|
+
apiKey: "test-api-key",
|
|
54
|
+
logger,
|
|
55
|
+
});
|
|
56
|
+
await (0, vitest_1.expect)(client.init({
|
|
57
|
+
modelName: "openai/gpt-4.1-mini",
|
|
58
|
+
modelApiKey: undefined,
|
|
59
|
+
})).resolves.toBeDefined();
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)("should send x-model-api-key header when modelApiKey IS provided", async () => {
|
|
62
|
+
const fetchSpy = vitest_1.vi
|
|
63
|
+
.fn()
|
|
64
|
+
.mockResolvedValue(createSessionStartResponse("sess-789"));
|
|
65
|
+
globalThis.fetch = fetchSpy;
|
|
66
|
+
const client = new api_1.StagehandAPIClient({
|
|
67
|
+
apiKey: "test-api-key",
|
|
68
|
+
logger,
|
|
69
|
+
});
|
|
70
|
+
await client.init({
|
|
71
|
+
modelName: "openai/gpt-4.1-mini",
|
|
72
|
+
modelApiKey: "my-model-key",
|
|
73
|
+
});
|
|
74
|
+
// Verify the fetch was called with x-model-api-key header
|
|
75
|
+
const [, requestInit] = fetchSpy.mock.calls[0];
|
|
76
|
+
(0, vitest_1.expect)(requestInit.headers["x-model-api-key"]).toBe("my-model-key");
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.it)("should NOT send x-model-api-key header when modelApiKey is omitted", async () => {
|
|
79
|
+
const fetchSpy = vitest_1.vi
|
|
80
|
+
.fn()
|
|
81
|
+
.mockResolvedValue(createSessionStartResponse("sess-012"));
|
|
82
|
+
globalThis.fetch = fetchSpy;
|
|
83
|
+
const client = new api_1.StagehandAPIClient({
|
|
84
|
+
apiKey: "test-api-key",
|
|
85
|
+
logger,
|
|
86
|
+
});
|
|
87
|
+
await client.init({
|
|
88
|
+
modelName: "openai/gpt-4.1-mini",
|
|
89
|
+
});
|
|
90
|
+
// Verify x-model-api-key header is NOT present
|
|
91
|
+
const [, requestInit] = fetchSpy.mock.calls[0];
|
|
92
|
+
(0, vitest_1.expect)(requestInit.headers["x-model-api-key"]).toBeUndefined();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=api-optional-model-api-key.test.js.map
|