@browserbasehq/orca 3.2.0-preview.5 → 3.2.1-preview.1
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.js +29 -22
- package/dist/cjs/lib/inference.js.map +1 -1
- package/dist/cjs/lib/prompt.js +18 -21
- package/dist/cjs/lib/prompt.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 +60 -9
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +15 -0
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +103 -49
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.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/coordinateNormalization.js +3 -5
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
- package/dist/cjs/lib/v3/api.d.ts +5 -3
- package/dist/cjs/lib/v3/api.js +3 -6
- 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/handlers/v3CuaAgentHandler.js +6 -15
- 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/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 +30 -0
- package/dist/cjs/lib/v3/types/public/api.js +6 -2
- package/dist/cjs/lib/v3/types/public/api.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/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 +18 -2
- package/dist/cjs/lib/v3/v3.js +92 -9
- package/dist/cjs/lib/v3/v3.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/flowLogger.spec.js +12 -8
- package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -1
- package/dist/cjs/tests/integration/testUtils.js +1 -1
- package/dist/cjs/tests/integration/testUtils.js.map +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js +6 -4
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +56 -0
- package/dist/cjs/tests/unit/agent-captcha-hooks.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/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-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/browserbase-session-accessors.test.js +20 -0
- package/dist/cjs/tests/unit/browserbase-session-accessors.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/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/esm/lib/inference.js +29 -22
- package/dist/esm/lib/inference.js.map +1 -1
- package/dist/esm/lib/prompt.js +18 -21
- package/dist/esm/lib/prompt.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 +60 -9
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +15 -0
- package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +103 -49
- package/dist/esm/lib/v3/agent/OpenAICUAClient.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/coordinateNormalization.js +3 -5
- package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +5 -3
- package/dist/esm/lib/v3/api.js +3 -6
- 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/handlers/v3CuaAgentHandler.js +6 -15
- 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/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 +30 -0
- package/dist/esm/lib/v3/types/public/api.js +6 -2
- package/dist/esm/lib/v3/types/public/api.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/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 +18 -2
- package/dist/esm/lib/v3/v3.js +92 -10
- package/dist/esm/lib/v3/v3.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/flowLogger.spec.js +12 -8
- package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -1
- package/dist/esm/tests/integration/testUtils.js +1 -1
- package/dist/esm/tests/integration/testUtils.js.map +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js +6 -4
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/agent-captcha-hooks.test.js +56 -0
- package/dist/esm/tests/unit/agent-captcha-hooks.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/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-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/browserbase-session-accessors.test.js +20 -0
- package/dist/esm/tests/unit/browserbase-session-accessors.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/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/package.json +4 -8
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeouts.spec.js","sourceRoot":"","sources":["../../../../tests/integration/timeouts.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { z } from \"zod\";\nimport { closeV3 } from \"./testUtils.js\";\nimport type { LLMClient } from \"../../lib/v3/llm/LLMClient.js\";\nimport { generateText } from \"ai\";\n\ntype AgentToolNameWithTimeout =\n | \"act\"\n | \"extract\"\n | \"fillForm\"\n | \"ariaTree\"\n | \"click\"\n | \"type\"\n | \"dragAndDrop\"\n | \"clickAndHold\"\n | \"fillFormVision\"\n | \"goto\"\n | \"navback\"\n | \"screenshot\"\n | \"scroll\"\n | \"keys\";\n\ntype ToolTimeoutTestModel = {\n provider: string;\n modelId: string;\n specificationVersion: \"v2\";\n supportedUrls: Record<string, RegExp[]>;\n doGenerate: () => Promise<{\n content: Array<{\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: string;\n }>;\n finishReason: \"tool-calls\";\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n warnings: [];\n }>;\n doStream: (_options: unknown) => Promise<never>;\n};\n\ntype ToolTimeoutTestLLMClient = LLMClient & {\n model: ToolTimeoutTestModel;\n};\n\nfunction createToolTimeoutTestLlmClient(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n): ToolTimeoutTestLLMClient {\n const usage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n total_tokens: 0,\n };\n let generateCallCount = 0;\n\n const model: ToolTimeoutTestModel = {\n provider: \"mock\",\n modelId: \"mock/tool-timeout-test\",\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: async () => {\n generateCallCount += 1;\n if (generateCallCount === 1) {\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"tool-1\",\n toolName,\n input: JSON.stringify(toolInput),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n }\n\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"done-1\",\n toolName: \"done\",\n input: JSON.stringify({ reasoning: \"done\", taskComplete: true }),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n },\n doStream: async () => {\n throw new Error(\"doStream not implemented in timeout test model\");\n },\n };\n\n const llm = {\n type: \"openai\",\n modelName: \"openai/gpt-4.1-mini\",\n hasVision: false,\n clientOptions: {},\n model,\n getLanguageModel: () => model,\n generateText,\n createChatCompletion: async <T = unknown>(options: unknown): Promise<T> => {\n const responseModelName = (\n options as { options?: { response_model?: { name?: string } } }\n )?.options?.response_model?.name;\n\n if (responseModelName === \"act\") {\n return {\n data: {\n elementId: \"1-0\",\n description: \"click body\",\n method: \"click\",\n arguments: [],\n twoStep: false,\n },\n usage,\n } as T;\n }\n if (responseModelName === \"Observation\") {\n return { data: { elements: [] }, usage } as T;\n }\n if (responseModelName === \"Extraction\") {\n return { data: {}, usage } as T;\n }\n if (responseModelName === \"Metadata\") {\n return { data: { completed: true, progress: \"\" }, usage } as T;\n }\n return { data: {}, usage } as T;\n },\n };\n\n return llm as unknown as ToolTimeoutTestLLMClient;\n}\n\nfunction findToolOutput(\n stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }>,\n toolName: string,\n) {\n for (const event of stepEvents) {\n if (!event.toolCalls || !event.toolResults) continue;\n const toolIndex = event.toolCalls.findIndex(\n (tc) => tc.toolName === toolName,\n );\n if (toolIndex !== -1) {\n return event.toolResults[toolIndex]?.output;\n }\n }\n return undefined;\n}\n\nasync function runAgentToolTimeoutScenario(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n options?: { mode?: \"dom\" | \"hybrid\" },\n) {\n const llmClient = createToolTimeoutTestLlmClient(toolName, toolInput);\n const stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }> = [];\n const v3 = new V3({\n ...v3DynamicTestConfig,\n experimental: true,\n llmClient,\n });\n await v3.init();\n try {\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n const agent = v3.agent({\n ...(options?.mode ? { mode: options.mode } : {}),\n });\n await agent.execute({\n instruction: `Use ${toolName} and then finish`,\n maxSteps: 2,\n toolTimeout: 1,\n callbacks: {\n onStepFinish: (event) => {\n stepEvents.push({\n toolCalls: event.toolCalls?.map((tc) => ({\n toolName: tc.toolName,\n })),\n toolResults: event.toolResults?.map((tr) => ({\n output: tr.output,\n })),\n });\n },\n },\n });\n const toolOutput = findToolOutput(stepEvents, toolName);\n if (!toolOutput) {\n throw new Error(`No tool output captured for ${toolName}`);\n }\n return { toolOutput };\n } finally {\n await closeV3(v3);\n }\n}\n\ntest.describe(\"V3 hard timeouts\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"observe() enforces timeoutMs\", async () => {\n // Tiny timeout to force the race to hit the timeout branch\n await expect(v3.observe(\"find something\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"extract() enforces timeoutMs\", async () => {\n const schema = z.object({ title: z.string().optional() });\n await expect(\n v3.extract(\"Extract title\", schema, { timeout: 5 }),\n ).rejects.toThrow(/timed out/i);\n });\n\n test(\"act() enforces timeoutMs\", async () => {\n await expect(v3.act(\"do nothing\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"agent toolTimeout enforces timeout for act tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"act\", {\n action: \"click somewhere\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for extract tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"extract\", {\n instruction: \"extract the page title\",\n schema: { type: \"object\", properties: { title: { type: \"string\" } } },\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillForm tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"fillForm\", {\n fields: [{ action: \"type hello into name\" }],\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for ariaTree\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"ariaTree\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for goto tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"goto\", {\n url: \"https://example.com/slow\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for navback tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"navback\", {\n reasoningText: \"going back\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for screenshot tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"screenshot\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for scroll tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"scroll\", {\n direction: \"down\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for keys tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"keys\", {\n method: \"press\",\n value: \"Enter\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for click tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"click\",\n { describe: \"click element\", coordinates: [100, 100] },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for type tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"type\",\n {\n describe: \"type into field\",\n text: \"hello\",\n coordinates: [100, 100],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for dragAndDrop tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"dragAndDrop\",\n {\n describe: \"drag element\",\n startCoordinates: [100, 100],\n endCoordinates: [200, 200],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for clickAndHold tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"clickAndHold\",\n {\n describe: \"hold element\",\n coordinates: [100, 100],\n duration: 1000,\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillFormVision tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"fillFormVision\",\n {\n fields: [\n {\n action: \"type hello into name\",\n value: \"hello\",\n coordinates: { x: 100, y: 100 },\n },\n {\n action: \"type world into email\",\n value: \"world\",\n coordinates: { x: 100, y: 200 },\n },\n ],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"timeouts.spec.js","sourceRoot":"","sources":["../../../../tests/integration/timeouts.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { z } from \"zod\";\nimport { closeV3 } from \"./testUtils.js\";\nimport type { LLMClient } from \"../../lib/v3/llm/LLMClient.js\";\nimport { generateText } from \"ai\";\n\ntype AgentToolNameWithTimeout =\n | \"act\"\n | \"extract\"\n | \"fillForm\"\n | \"ariaTree\"\n | \"click\"\n | \"type\"\n | \"dragAndDrop\"\n | \"clickAndHold\"\n | \"fillFormVision\"\n | \"goto\"\n | \"navback\"\n | \"screenshot\"\n | \"scroll\"\n | \"keys\";\n\ntype ToolTimeoutTestModel = {\n provider: string;\n modelId: string;\n specificationVersion: \"v2\";\n supportedUrls: Record<string, RegExp[]>;\n doGenerate: () => Promise<{\n content: Array<{\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: string;\n }>;\n finishReason: \"tool-calls\";\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n warnings: [];\n }>;\n doStream: (_options: unknown) => Promise<never>;\n};\n\ntype ToolTimeoutTestLLMClient = LLMClient & {\n model: ToolTimeoutTestModel;\n};\n\nfunction createToolTimeoutTestLlmClient(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n): ToolTimeoutTestLLMClient {\n const usage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n total_tokens: 0,\n };\n let generateCallCount = 0;\n\n const model: ToolTimeoutTestModel = {\n provider: \"mock\",\n modelId: \"mock/tool-timeout-test\",\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: async () => {\n generateCallCount += 1;\n if (generateCallCount === 1) {\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"tool-1\",\n toolName,\n input: JSON.stringify(toolInput),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n }\n\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"done-1\",\n toolName: \"done\",\n input: JSON.stringify({ reasoning: \"done\", taskComplete: true }),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n },\n doStream: async () => {\n throw new Error(\"doStream not implemented in timeout test model\");\n },\n };\n\n const llm = {\n type: \"openai\",\n modelName: \"openai/gpt-4.1-mini\",\n hasVision: false,\n clientOptions: {},\n model,\n getLanguageModel: () => model,\n generateText,\n createChatCompletion: async <T = unknown>(options: unknown): Promise<T> => {\n const responseModelName = (\n options as { options?: { response_model?: { name?: string } } }\n )?.options?.response_model?.name;\n\n if (responseModelName === \"act\") {\n return {\n data: {\n action: {\n elementId: \"1-0\",\n description: \"click body\",\n method: \"click\",\n arguments: [],\n },\n twoStep: false,\n },\n usage,\n } as T;\n }\n if (responseModelName === \"Observation\") {\n return { data: { elements: [] }, usage } as T;\n }\n if (responseModelName === \"Extraction\") {\n return { data: {}, usage } as T;\n }\n if (responseModelName === \"Metadata\") {\n return { data: { completed: true, progress: \"\" }, usage } as T;\n }\n return { data: {}, usage } as T;\n },\n };\n\n return llm as unknown as ToolTimeoutTestLLMClient;\n}\n\nfunction findToolOutput(\n stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }>,\n toolName: string,\n) {\n for (const event of stepEvents) {\n if (!event.toolCalls || !event.toolResults) continue;\n const toolIndex = event.toolCalls.findIndex(\n (tc) => tc.toolName === toolName,\n );\n if (toolIndex !== -1) {\n return event.toolResults[toolIndex]?.output;\n }\n }\n return undefined;\n}\n\nasync function runAgentToolTimeoutScenario(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n options?: { mode?: \"dom\" | \"hybrid\" },\n) {\n const llmClient = createToolTimeoutTestLlmClient(toolName, toolInput);\n const stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }> = [];\n const v3 = new V3({\n ...v3DynamicTestConfig,\n experimental: true,\n llmClient,\n });\n await v3.init();\n try {\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n const agent = v3.agent({\n ...(options?.mode ? { mode: options.mode } : {}),\n });\n await agent.execute({\n instruction: `Use ${toolName} and then finish`,\n maxSteps: 2,\n toolTimeout: 1,\n callbacks: {\n onStepFinish: (event) => {\n stepEvents.push({\n toolCalls: event.toolCalls?.map((tc) => ({\n toolName: tc.toolName,\n })),\n toolResults: event.toolResults?.map((tr) => ({\n output: tr.output,\n })),\n });\n },\n },\n });\n const toolOutput = findToolOutput(stepEvents, toolName);\n if (!toolOutput) {\n throw new Error(`No tool output captured for ${toolName}`);\n }\n return { toolOutput };\n } finally {\n await closeV3(v3);\n }\n}\n\ntest.describe(\"V3 hard timeouts\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"observe() enforces timeoutMs\", async () => {\n // Tiny timeout to force the race to hit the timeout branch\n await expect(v3.observe(\"find something\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"extract() enforces timeoutMs\", async () => {\n const schema = z.object({ title: z.string().optional() });\n await expect(\n v3.extract(\"Extract title\", schema, { timeout: 5 }),\n ).rejects.toThrow(/timed out/i);\n });\n\n test(\"act() enforces timeoutMs\", async () => {\n await expect(v3.act(\"do nothing\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"agent toolTimeout enforces timeout for act tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"act\", {\n action: \"click somewhere\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for extract tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"extract\", {\n instruction: \"extract the page title\",\n schema: { type: \"object\", properties: { title: { type: \"string\" } } },\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillForm tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"fillForm\", {\n fields: [{ action: \"type hello into name\" }],\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for ariaTree\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"ariaTree\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for goto tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"goto\", {\n url: \"https://example.com/slow\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for navback tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"navback\", {\n reasoningText: \"going back\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for screenshot tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"screenshot\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for scroll tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"scroll\", {\n direction: \"down\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for keys tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"keys\", {\n method: \"press\",\n value: \"Enter\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for click tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"click\",\n { describe: \"click element\", coordinates: [100, 100] },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for type tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"type\",\n {\n describe: \"type into field\",\n text: \"hello\",\n coordinates: [100, 100],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for dragAndDrop tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"dragAndDrop\",\n {\n describe: \"drag element\",\n startCoordinates: [100, 100],\n endCoordinates: [200, 200],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for clickAndHold tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"clickAndHold\",\n {\n describe: \"hold element\",\n coordinates: [100, 100],\n duration: 1000,\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillFormVision tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"fillFormVision\",\n {\n fields: [\n {\n action: \"type hello into name\",\n value: \"hello\",\n coordinates: { x: 100, y: 100 },\n },\n {\n action: \"type world into email\",\n value: \"world\",\n coordinates: { x: 100, y: 200 },\n },\n ],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n});\n"]}
|
|
@@ -282,4 +282,60 @@ function collectUserMessages(messages) {
|
|
|
282
282
|
(0, vitest_1.expect)(logs.some((line) => line.message.includes("Skipped click on solved captcha widget"))).toBe(true);
|
|
283
283
|
});
|
|
284
284
|
});
|
|
285
|
+
(0, vitest_1.describe)("v3 cua handler screenshot behavior", () => {
|
|
286
|
+
let page;
|
|
287
|
+
let logs;
|
|
288
|
+
let logger;
|
|
289
|
+
(0, vitest_1.beforeEach)(() => {
|
|
290
|
+
page = new MockPage();
|
|
291
|
+
logs = [];
|
|
292
|
+
logger = (line) => {
|
|
293
|
+
logs.push(line);
|
|
294
|
+
};
|
|
295
|
+
fakeCuaClient = new FakeCuaClient();
|
|
296
|
+
});
|
|
297
|
+
(0, vitest_1.it)("does not take per-action screenshots when a batch of actions runs", async () => {
|
|
298
|
+
const screenshotSpy = vitest_1.vi.spyOn(page, "screenshot");
|
|
299
|
+
const batchSize = 4;
|
|
300
|
+
fakeCuaClient.executeImpl = vitest_1.vi.fn(async () => {
|
|
301
|
+
for (let i = 0; i < batchSize; i += 1) {
|
|
302
|
+
await fakeCuaClient.actionHandler?.({
|
|
303
|
+
type: "scroll",
|
|
304
|
+
x: 0,
|
|
305
|
+
y: 0,
|
|
306
|
+
scroll_x: 0,
|
|
307
|
+
scroll_y: 100,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
success: true,
|
|
312
|
+
message: "ok",
|
|
313
|
+
actions: [],
|
|
314
|
+
completed: true,
|
|
315
|
+
};
|
|
316
|
+
});
|
|
317
|
+
const handler = new v3CuaAgentHandler_js_1.V3CuaAgentHandler({
|
|
318
|
+
context: {
|
|
319
|
+
awaitActivePage: async () => page,
|
|
320
|
+
},
|
|
321
|
+
bus: { emit: vitest_1.vi.fn() },
|
|
322
|
+
isCaptchaAutoSolveEnabled: false,
|
|
323
|
+
isAdvancedStealth: false,
|
|
324
|
+
configuredViewport: { width: 1288, height: 711 },
|
|
325
|
+
isAgentReplayActive: () => false,
|
|
326
|
+
updateMetrics: vitest_1.vi.fn(),
|
|
327
|
+
}, logger, {
|
|
328
|
+
modelName: "openai/gpt-5.4",
|
|
329
|
+
clientOptions: { waitBetweenActions: 1 },
|
|
330
|
+
});
|
|
331
|
+
vitest_1.vi.spyOn(handler, "executeAction").mockResolvedValue({ success: true });
|
|
332
|
+
await handler.execute({
|
|
333
|
+
instruction: "scroll to the bottom",
|
|
334
|
+
highlightCursor: false,
|
|
335
|
+
});
|
|
336
|
+
// The handler must not call page.screenshot for each action in a batch —
|
|
337
|
+
// the CUA client takes a single screenshot after all actions itself.
|
|
338
|
+
(0, vitest_1.expect)(screenshotSpy).not.toHaveBeenCalled();
|
|
339
|
+
});
|
|
340
|
+
});
|
|
285
341
|
//# sourceMappingURL=agent-captcha-hooks.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-captcha-hooks.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-captcha-hooks.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { LogLine } from \"../../lib/v3/types/public/logs.js\";\nimport { CaptchaSolver } from \"../../lib/v3/agent/utils/captchaSolver.js\";\nimport { V3AgentHandler } from \"../../lib/v3/handlers/v3AgentHandler.js\";\n\nconst SOLVING_STARTED = \"browserbase-solving-started\";\nconst SOLVING_FINISHED = \"browserbase-solving-finished\";\nconst SOLVING_ERRORED = \"browserbase-solving-errored\";\n\ntype ConsoleListener = (message: { text: () => string }) => void;\n\nclass MockPage {\n private listeners = new Set<ConsoleListener>();\n public captchaBoxes: Array<{\n left: number;\n top: number;\n right: number;\n bottom: number;\n }> = [];\n\n on(event: string, listener: ConsoleListener): void {\n if (event === \"console\") {\n this.listeners.add(listener);\n }\n }\n\n off(event: string, listener: ConsoleListener): void {\n if (event === \"console\") {\n this.listeners.delete(listener);\n }\n }\n\n emitConsole(text: string): void {\n const message = { text: () => text };\n for (const listener of this.listeners) {\n listener(message);\n }\n }\n\n url(): string {\n return \"https://example.com\";\n }\n\n async screenshot(): Promise<Buffer> {\n return Buffer.from(\"fake-image\");\n }\n\n async evaluate<T>(): Promise<T> {\n return this.captchaBoxes as T;\n }\n\n mainFrame(): { evaluate: () => Promise<{ w: number; h: number }> } {\n return {\n evaluate: async () => ({ w: 1288, h: 711 }),\n };\n }\n}\n\nclass FakeCuaClient {\n public contextNotes: string[] = [];\n public preStepHook?: () => Promise<void>;\n public actionHandler?: (action: Record<string, unknown>) => Promise<void>;\n public executeImpl = vi.fn(async (options: unknown) => {\n void options;\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n public captureScreenshot = vi.fn(async () => null);\n public setViewport = vi.fn();\n public setCurrentUrl = vi.fn();\n public setScreenshotProvider = vi.fn();\n public setSafetyConfirmationHandler = vi.fn();\n\n setActionHandler(\n handler: (action: Record<string, unknown>) => Promise<void>,\n ): void {\n this.actionHandler = handler;\n }\n\n setPreStepHook(handler: () => Promise<void>): void {\n this.preStepHook = handler;\n }\n\n addContextNote(note: string): void {\n this.contextNotes.push(note);\n }\n\n async execute(options: unknown): Promise<{\n success: boolean;\n message: string;\n actions: unknown[];\n completed: boolean;\n }> {\n return this.executeImpl(options);\n }\n}\n\nlet fakeCuaClient: FakeCuaClient;\n\nvi.mock(\"../../lib/v3/agent/AgentProvider\", () => ({\n AgentProvider: class {\n constructor(logger: unknown) {\n void logger;\n }\n\n getClient(): FakeCuaClient {\n return fakeCuaClient;\n }\n },\n}));\n\nimport { V3CuaAgentHandler } from \"../../lib/v3/handlers/v3CuaAgentHandler.js\";\n\nfunction collectUserMessages(\n messages: Array<{ role: string; content: unknown }>,\n): Array<{ role: \"user\"; content: string }> {\n return messages.filter(\n (message): message is { role: \"user\"; content: string } =>\n message.role === \"user\" && typeof message.content === \"string\",\n );\n}\n\ndescribe(\"agent captcha hooks\", () => {\n let page: MockPage;\n let logs: LogLine[];\n let logger: (line: LogLine) => void;\n\n beforeEach(() => {\n page = new MockPage();\n logs = [];\n logger = (line) => {\n logs.push(line);\n };\n fakeCuaClient = new FakeCuaClient();\n });\n\n it(\"blocks regular agent prepareStep until the solver finishes and injects one solved message\", async () => {\n const handler = new V3AgentHandler(\n {\n isCaptchaAutoSolveEnabled: true,\n } as never,\n logger,\n {} as never,\n );\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n const userCallback = vi.fn(async (options) => options);\n const prepareStep = (\n handler as unknown as {\n createPrepareStep: (\n callback?: (options: Record<string, unknown>) => Promise<unknown>,\n captchaSolver?: CaptchaSolver,\n ) => (options: Record<string, unknown>) => Promise<unknown>;\n }\n ).createPrepareStep(userCallback, solver);\n\n const options = {\n messages: [{ role: \"user\", content: \"start\" }],\n };\n\n await prepareStep(options);\n page.emitConsole(SOLVING_STARTED);\n\n const secondCall = prepareStep(options);\n await Promise.resolve();\n expect(userCallback).toHaveBeenCalledTimes(1);\n\n page.emitConsole(SOLVING_FINISHED);\n await secondCall;\n\n expect(userCallback).toHaveBeenCalledTimes(2);\n expect(\n collectUserMessages(\n options.messages as Array<{ role: string; content: unknown }>,\n ).filter((message) =>\n message.content.includes(\"automatically detected and solved\"),\n ),\n ).toHaveLength(1);\n });\n\n it(\"injects one error message when the regular agent solver errors\", async () => {\n const handler = new V3AgentHandler(\n {\n isCaptchaAutoSolveEnabled: true,\n } as never,\n logger,\n {} as never,\n );\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n const prepareStep = (\n handler as unknown as {\n createPrepareStep: (\n callback?: (options: Record<string, unknown>) => Promise<unknown>,\n captchaSolver?: CaptchaSolver,\n ) => (options: Record<string, unknown>) => Promise<unknown>;\n }\n ).createPrepareStep(undefined, solver);\n\n const options = {\n messages: [{ role: \"user\", content: \"start\" }],\n };\n\n await prepareStep(options);\n page.emitConsole(SOLVING_STARTED);\n\n const pending = prepareStep(options);\n page.emitConsole(SOLVING_ERRORED);\n await pending;\n\n expect(\n collectUserMessages(\n options.messages as Array<{ role: string; content: unknown }>,\n ).filter((message) =>\n message.content.includes(\"automatic captcha solver failed\"),\n ),\n ).toHaveLength(1);\n });\n\n it(\"pauses the CUA loop at prepareStep while Browserbase solves a captcha\", async () => {\n let secondPrepareStarted = false;\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();\n secondPrepareStarted = true;\n await blockedPrepare;\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n\n const execution = handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n await vi.waitFor(() => {\n expect(secondPrepareStarted).toBe(true);\n expect(\n logs.some((line) =>\n line.message.includes(\"waiting for Browserbase to solve\"),\n ),\n ).toBe(true);\n });\n\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n false,\n );\n\n page.emitConsole(SOLVING_FINISHED);\n await execution;\n\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n ]);\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n true,\n );\n });\n\n it(\"pauses CUA actions until the captcha solver finishes\", async () => {\n let actionStarted = false;\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const pendingAction =\n fakeCuaClient.actionHandler?.({ type: \"screenshot\" }) ??\n Promise.resolve();\n actionStarted = true;\n await pendingAction;\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n const executeActionSpy = vi\n .spyOn(\n handler as unknown as {\n executeAction: (action: Record<string, unknown>) => Promise<unknown>;\n },\n \"executeAction\",\n )\n .mockResolvedValue({ success: true });\n vi.spyOn(handler, \"captureAndSendScreenshot\").mockResolvedValue(null);\n\n const execution = handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n await vi.waitFor(() => {\n expect(actionStarted).toBe(true);\n });\n\n expect(executeActionSpy).not.toHaveBeenCalled();\n page.emitConsole(SOLVING_FINISHED);\n await execution;\n\n expect(executeActionSpy).toHaveBeenCalledTimes(1);\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n ]);\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n true,\n );\n });\n\n it(\"skips post-solve clicks on the captcha widget and injects another note\", async () => {\n page.captchaBoxes = [{ left: 0, top: 400, right: 140, bottom: 470 }];\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();\n page.emitConsole(SOLVING_FINISHED);\n await blockedPrepare;\n\n await fakeCuaClient.actionHandler?.({\n type: \"click\",\n button: \"left\",\n x: 63,\n y: 436,\n });\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n const executeActionSpy = vi\n .spyOn(\n handler as unknown as {\n executeAction: (action: Record<string, unknown>) => Promise<unknown>;\n },\n \"executeAction\",\n )\n .mockResolvedValue({ success: true });\n vi.spyOn(handler, \"captureAndSendScreenshot\").mockResolvedValue(null);\n\n await handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n expect(executeActionSpy).not.toHaveBeenCalled();\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n expect.stringContaining(\"Original task: Describe the page briefly.\"),\n ]);\n expect(\n logs.some((line) =>\n line.message.includes(\"Skipped click on solved captcha widget\"),\n ),\n ).toBe(true);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"agent-captcha-hooks.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-captcha-hooks.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { LogLine } from \"../../lib/v3/types/public/logs.js\";\nimport { CaptchaSolver } from \"../../lib/v3/agent/utils/captchaSolver.js\";\nimport { V3AgentHandler } from \"../../lib/v3/handlers/v3AgentHandler.js\";\n\nconst SOLVING_STARTED = \"browserbase-solving-started\";\nconst SOLVING_FINISHED = \"browserbase-solving-finished\";\nconst SOLVING_ERRORED = \"browserbase-solving-errored\";\n\ntype ConsoleListener = (message: { text: () => string }) => void;\n\nclass MockPage {\n private listeners = new Set<ConsoleListener>();\n public captchaBoxes: Array<{\n left: number;\n top: number;\n right: number;\n bottom: number;\n }> = [];\n\n on(event: string, listener: ConsoleListener): void {\n if (event === \"console\") {\n this.listeners.add(listener);\n }\n }\n\n off(event: string, listener: ConsoleListener): void {\n if (event === \"console\") {\n this.listeners.delete(listener);\n }\n }\n\n emitConsole(text: string): void {\n const message = { text: () => text };\n for (const listener of this.listeners) {\n listener(message);\n }\n }\n\n url(): string {\n return \"https://example.com\";\n }\n\n async screenshot(): Promise<Buffer> {\n return Buffer.from(\"fake-image\");\n }\n\n async evaluate<T>(): Promise<T> {\n return this.captchaBoxes as T;\n }\n\n mainFrame(): { evaluate: () => Promise<{ w: number; h: number }> } {\n return {\n evaluate: async () => ({ w: 1288, h: 711 }),\n };\n }\n}\n\nclass FakeCuaClient {\n public contextNotes: string[] = [];\n public preStepHook?: () => Promise<void>;\n public actionHandler?: (action: Record<string, unknown>) => Promise<void>;\n public executeImpl = vi.fn(async (options: unknown) => {\n void options;\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n public captureScreenshot = vi.fn(async () => null);\n public setViewport = vi.fn();\n public setCurrentUrl = vi.fn();\n public setScreenshotProvider = vi.fn();\n public setSafetyConfirmationHandler = vi.fn();\n\n setActionHandler(\n handler: (action: Record<string, unknown>) => Promise<void>,\n ): void {\n this.actionHandler = handler;\n }\n\n setPreStepHook(handler: () => Promise<void>): void {\n this.preStepHook = handler;\n }\n\n addContextNote(note: string): void {\n this.contextNotes.push(note);\n }\n\n async execute(options: unknown): Promise<{\n success: boolean;\n message: string;\n actions: unknown[];\n completed: boolean;\n }> {\n return this.executeImpl(options);\n }\n}\n\nlet fakeCuaClient: FakeCuaClient;\n\nvi.mock(\"../../lib/v3/agent/AgentProvider\", () => ({\n AgentProvider: class {\n constructor(logger: unknown) {\n void logger;\n }\n\n getClient(): FakeCuaClient {\n return fakeCuaClient;\n }\n },\n}));\n\nimport { V3CuaAgentHandler } from \"../../lib/v3/handlers/v3CuaAgentHandler.js\";\n\nfunction collectUserMessages(\n messages: Array<{ role: string; content: unknown }>,\n): Array<{ role: \"user\"; content: string }> {\n return messages.filter(\n (message): message is { role: \"user\"; content: string } =>\n message.role === \"user\" && typeof message.content === \"string\",\n );\n}\n\ndescribe(\"agent captcha hooks\", () => {\n let page: MockPage;\n let logs: LogLine[];\n let logger: (line: LogLine) => void;\n\n beforeEach(() => {\n page = new MockPage();\n logs = [];\n logger = (line) => {\n logs.push(line);\n };\n fakeCuaClient = new FakeCuaClient();\n });\n\n it(\"blocks regular agent prepareStep until the solver finishes and injects one solved message\", async () => {\n const handler = new V3AgentHandler(\n {\n isCaptchaAutoSolveEnabled: true,\n } as never,\n logger,\n {} as never,\n );\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n const userCallback = vi.fn(async (options) => options);\n const prepareStep = (\n handler as unknown as {\n createPrepareStep: (\n callback?: (options: Record<string, unknown>) => Promise<unknown>,\n captchaSolver?: CaptchaSolver,\n ) => (options: Record<string, unknown>) => Promise<unknown>;\n }\n ).createPrepareStep(userCallback, solver);\n\n const options = {\n messages: [{ role: \"user\", content: \"start\" }],\n };\n\n await prepareStep(options);\n page.emitConsole(SOLVING_STARTED);\n\n const secondCall = prepareStep(options);\n await Promise.resolve();\n expect(userCallback).toHaveBeenCalledTimes(1);\n\n page.emitConsole(SOLVING_FINISHED);\n await secondCall;\n\n expect(userCallback).toHaveBeenCalledTimes(2);\n expect(\n collectUserMessages(\n options.messages as Array<{ role: string; content: unknown }>,\n ).filter((message) =>\n message.content.includes(\"automatically detected and solved\"),\n ),\n ).toHaveLength(1);\n });\n\n it(\"injects one error message when the regular agent solver errors\", async () => {\n const handler = new V3AgentHandler(\n {\n isCaptchaAutoSolveEnabled: true,\n } as never,\n logger,\n {} as never,\n );\n const solver = new CaptchaSolver();\n solver.init(async () => page as never);\n\n const prepareStep = (\n handler as unknown as {\n createPrepareStep: (\n callback?: (options: Record<string, unknown>) => Promise<unknown>,\n captchaSolver?: CaptchaSolver,\n ) => (options: Record<string, unknown>) => Promise<unknown>;\n }\n ).createPrepareStep(undefined, solver);\n\n const options = {\n messages: [{ role: \"user\", content: \"start\" }],\n };\n\n await prepareStep(options);\n page.emitConsole(SOLVING_STARTED);\n\n const pending = prepareStep(options);\n page.emitConsole(SOLVING_ERRORED);\n await pending;\n\n expect(\n collectUserMessages(\n options.messages as Array<{ role: string; content: unknown }>,\n ).filter((message) =>\n message.content.includes(\"automatic captcha solver failed\"),\n ),\n ).toHaveLength(1);\n });\n\n it(\"pauses the CUA loop at prepareStep while Browserbase solves a captcha\", async () => {\n let secondPrepareStarted = false;\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();\n secondPrepareStarted = true;\n await blockedPrepare;\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n\n const execution = handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n await vi.waitFor(() => {\n expect(secondPrepareStarted).toBe(true);\n expect(\n logs.some((line) =>\n line.message.includes(\"waiting for Browserbase to solve\"),\n ),\n ).toBe(true);\n });\n\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n false,\n );\n\n page.emitConsole(SOLVING_FINISHED);\n await execution;\n\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n ]);\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n true,\n );\n });\n\n it(\"pauses CUA actions until the captcha solver finishes\", async () => {\n let actionStarted = false;\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const pendingAction =\n fakeCuaClient.actionHandler?.({ type: \"screenshot\" }) ??\n Promise.resolve();\n actionStarted = true;\n await pendingAction;\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n const executeActionSpy = vi\n .spyOn(\n handler as unknown as {\n executeAction: (action: Record<string, unknown>) => Promise<unknown>;\n },\n \"executeAction\",\n )\n .mockResolvedValue({ success: true });\n vi.spyOn(handler, \"captureAndSendScreenshot\").mockResolvedValue(null);\n\n const execution = handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n await vi.waitFor(() => {\n expect(actionStarted).toBe(true);\n });\n\n expect(executeActionSpy).not.toHaveBeenCalled();\n page.emitConsole(SOLVING_FINISHED);\n await execution;\n\n expect(executeActionSpy).toHaveBeenCalledTimes(1);\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n ]);\n expect(logs.some((line) => line.message.includes(\"Captcha solved\"))).toBe(\n true,\n );\n });\n\n it(\"skips post-solve clicks on the captcha widget and injects another note\", async () => {\n page.captchaBoxes = [{ left: 0, top: 400, right: 140, bottom: 470 }];\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n await fakeCuaClient.preStepHook?.();\n page.emitConsole(SOLVING_STARTED);\n\n const blockedPrepare = fakeCuaClient.preStepHook?.() ?? Promise.resolve();\n page.emitConsole(SOLVING_FINISHED);\n await blockedPrepare;\n\n await fakeCuaClient.actionHandler?.({\n type: \"click\",\n button: \"left\",\n x: 63,\n y: 436,\n });\n\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: true,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"anthropic/claude-haiku-4-5-20251001\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n const executeActionSpy = vi\n .spyOn(\n handler as unknown as {\n executeAction: (action: Record<string, unknown>) => Promise<unknown>;\n },\n \"executeAction\",\n )\n .mockResolvedValue({ success: true });\n vi.spyOn(handler, \"captureAndSendScreenshot\").mockResolvedValue(null);\n\n await handler.execute({\n instruction: \"Describe the page briefly.\",\n highlightCursor: false,\n });\n\n expect(executeActionSpy).not.toHaveBeenCalled();\n expect(fakeCuaClient.contextNotes).toEqual([\n expect.stringContaining(\"automatically detected and solved\"),\n expect.stringContaining(\"Original task: Describe the page briefly.\"),\n ]);\n expect(\n logs.some((line) =>\n line.message.includes(\"Skipped click on solved captcha widget\"),\n ),\n ).toBe(true);\n });\n});\n\ndescribe(\"v3 cua handler screenshot behavior\", () => {\n let page: MockPage;\n let logs: LogLine[];\n let logger: (line: LogLine) => void;\n\n beforeEach(() => {\n page = new MockPage();\n logs = [];\n logger = (line) => {\n logs.push(line);\n };\n fakeCuaClient = new FakeCuaClient();\n });\n\n it(\"does not take per-action screenshots when a batch of actions runs\", async () => {\n const screenshotSpy = vi.spyOn(page, \"screenshot\");\n const batchSize = 4;\n\n fakeCuaClient.executeImpl = vi.fn(async () => {\n for (let i = 0; i < batchSize; i += 1) {\n await fakeCuaClient.actionHandler?.({\n type: \"scroll\",\n x: 0,\n y: 0,\n scroll_x: 0,\n scroll_y: 100,\n });\n }\n return {\n success: true,\n message: \"ok\",\n actions: [],\n completed: true,\n };\n });\n\n const handler = new V3CuaAgentHandler(\n {\n context: {\n awaitActivePage: async () => page,\n },\n bus: { emit: vi.fn() },\n isCaptchaAutoSolveEnabled: false,\n isAdvancedStealth: false,\n configuredViewport: { width: 1288, height: 711 },\n isAgentReplayActive: () => false,\n updateMetrics: vi.fn(),\n } as never,\n logger,\n {\n modelName: \"openai/gpt-5.4\",\n clientOptions: { waitBetweenActions: 1 },\n } as never,\n );\n\n vi.spyOn(\n handler as unknown as {\n executeAction: (action: Record<string, unknown>) => Promise<unknown>;\n },\n \"executeAction\",\n ).mockResolvedValue({ success: true });\n\n await handler.execute({\n instruction: \"scroll to the bottom\",\n highlightCursor: false,\n });\n\n // The handler must not call page.screenshot for each action in a batch —\n // the CUA client takes a single screenshot after all actions itself.\n expect(screenshotSpy).not.toHaveBeenCalled();\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const v3_1 = require("../../lib/v3/v3");
|
|
5
|
+
const methods_1 = require("../../lib/v3/types/public/methods");
|
|
6
|
+
function createEmptyMetrics() {
|
|
7
|
+
return {
|
|
8
|
+
actPromptTokens: 0,
|
|
9
|
+
actCompletionTokens: 0,
|
|
10
|
+
actReasoningTokens: 0,
|
|
11
|
+
actCachedInputTokens: 0,
|
|
12
|
+
actInferenceTimeMs: 0,
|
|
13
|
+
extractPromptTokens: 0,
|
|
14
|
+
extractCompletionTokens: 0,
|
|
15
|
+
extractReasoningTokens: 0,
|
|
16
|
+
extractCachedInputTokens: 0,
|
|
17
|
+
extractInferenceTimeMs: 0,
|
|
18
|
+
observePromptTokens: 0,
|
|
19
|
+
observeCompletionTokens: 0,
|
|
20
|
+
observeReasoningTokens: 0,
|
|
21
|
+
observeCachedInputTokens: 0,
|
|
22
|
+
observeInferenceTimeMs: 0,
|
|
23
|
+
agentPromptTokens: 0,
|
|
24
|
+
agentCompletionTokens: 0,
|
|
25
|
+
agentReasoningTokens: 0,
|
|
26
|
+
agentCachedInputTokens: 0,
|
|
27
|
+
agentInferenceTimeMs: 0,
|
|
28
|
+
totalPromptTokens: 0,
|
|
29
|
+
totalCompletionTokens: 0,
|
|
30
|
+
totalReasoningTokens: 0,
|
|
31
|
+
totalCachedInputTokens: 0,
|
|
32
|
+
totalInferenceTimeMs: 0,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
(0, vitest_1.describe)("agent metrics accounting", () => {
|
|
36
|
+
(0, vitest_1.it)("merges API replay metrics with a local agent usage fallback only", async () => {
|
|
37
|
+
const remoteMetrics = {
|
|
38
|
+
...createEmptyMetrics(),
|
|
39
|
+
actPromptTokens: 40,
|
|
40
|
+
actCompletionTokens: 6,
|
|
41
|
+
actReasoningTokens: 2,
|
|
42
|
+
actCachedInputTokens: 1,
|
|
43
|
+
actInferenceTimeMs: 300,
|
|
44
|
+
extractPromptTokens: 10,
|
|
45
|
+
extractCompletionTokens: 3,
|
|
46
|
+
extractReasoningTokens: 1,
|
|
47
|
+
extractCachedInputTokens: 2,
|
|
48
|
+
extractInferenceTimeMs: 120,
|
|
49
|
+
observePromptTokens: 8,
|
|
50
|
+
observeCompletionTokens: 2,
|
|
51
|
+
observeReasoningTokens: 1,
|
|
52
|
+
observeCachedInputTokens: 0,
|
|
53
|
+
observeInferenceTimeMs: 90,
|
|
54
|
+
agentPromptTokens: 5,
|
|
55
|
+
agentCompletionTokens: 1,
|
|
56
|
+
agentReasoningTokens: 1,
|
|
57
|
+
agentCachedInputTokens: 0,
|
|
58
|
+
agentInferenceTimeMs: 30,
|
|
59
|
+
totalPromptTokens: 63,
|
|
60
|
+
totalCompletionTokens: 12,
|
|
61
|
+
totalReasoningTokens: 5,
|
|
62
|
+
totalCachedInputTokens: 3,
|
|
63
|
+
totalInferenceTimeMs: 540,
|
|
64
|
+
};
|
|
65
|
+
const stagehand = Object.create(v3_1.V3.prototype);
|
|
66
|
+
const mutableStagehand = stagehand;
|
|
67
|
+
mutableStagehand["apiClient"] = {
|
|
68
|
+
getReplayMetrics: vitest_1.vi.fn().mockResolvedValue(remoteMetrics),
|
|
69
|
+
};
|
|
70
|
+
mutableStagehand["stagehandMetrics"] = createEmptyMetrics();
|
|
71
|
+
stagehand.updateMetrics(methods_1.V3FunctionName.AGENT, 25, 4, 3, 2, 180);
|
|
72
|
+
const metrics = await stagehand.metrics;
|
|
73
|
+
(0, vitest_1.expect)(metrics.actPromptTokens).toBe(40);
|
|
74
|
+
(0, vitest_1.expect)(metrics.extractPromptTokens).toBe(10);
|
|
75
|
+
(0, vitest_1.expect)(metrics.observePromptTokens).toBe(8);
|
|
76
|
+
(0, vitest_1.expect)(metrics.agentPromptTokens).toBe(25);
|
|
77
|
+
(0, vitest_1.expect)(metrics.agentCompletionTokens).toBe(4);
|
|
78
|
+
(0, vitest_1.expect)(metrics.agentReasoningTokens).toBe(3);
|
|
79
|
+
(0, vitest_1.expect)(metrics.agentCachedInputTokens).toBe(2);
|
|
80
|
+
(0, vitest_1.expect)(metrics.agentInferenceTimeMs).toBe(180);
|
|
81
|
+
(0, vitest_1.expect)(metrics.totalPromptTokens).toBe(83);
|
|
82
|
+
(0, vitest_1.expect)(metrics.totalCompletionTokens).toBe(15);
|
|
83
|
+
(0, vitest_1.expect)(metrics.totalReasoningTokens).toBe(7);
|
|
84
|
+
(0, vitest_1.expect)(metrics.totalCachedInputTokens).toBe(5);
|
|
85
|
+
(0, vitest_1.expect)(metrics.totalInferenceTimeMs).toBe(690);
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)("records returned agent usage into local metrics totals", () => {
|
|
88
|
+
const stagehand = Object.create(v3_1.V3.prototype);
|
|
89
|
+
const mutableStagehand = stagehand;
|
|
90
|
+
mutableStagehand["stagehandMetrics"] = createEmptyMetrics();
|
|
91
|
+
const updateAgentMetricsFromUsage = stagehand["updateAgentMetricsFromUsage"];
|
|
92
|
+
updateAgentMetricsFromUsage.call(stagehand, {
|
|
93
|
+
input_tokens: 12,
|
|
94
|
+
output_tokens: 5,
|
|
95
|
+
reasoning_tokens: 7,
|
|
96
|
+
cached_input_tokens: 3,
|
|
97
|
+
inference_time_ms: 220,
|
|
98
|
+
});
|
|
99
|
+
const metrics = stagehand["stagehandMetrics"];
|
|
100
|
+
(0, vitest_1.expect)(metrics.agentPromptTokens).toBe(12);
|
|
101
|
+
(0, vitest_1.expect)(metrics.agentCompletionTokens).toBe(5);
|
|
102
|
+
(0, vitest_1.expect)(metrics.agentReasoningTokens).toBe(7);
|
|
103
|
+
(0, vitest_1.expect)(metrics.agentCachedInputTokens).toBe(3);
|
|
104
|
+
(0, vitest_1.expect)(metrics.agentInferenceTimeMs).toBe(220);
|
|
105
|
+
(0, vitest_1.expect)(metrics.totalPromptTokens).toBe(12);
|
|
106
|
+
(0, vitest_1.expect)(metrics.totalCompletionTokens).toBe(5);
|
|
107
|
+
(0, vitest_1.expect)(metrics.totalReasoningTokens).toBe(7);
|
|
108
|
+
(0, vitest_1.expect)(metrics.totalCachedInputTokens).toBe(3);
|
|
109
|
+
(0, vitest_1.expect)(metrics.totalInferenceTimeMs).toBe(220);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=agent-metrics.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-metrics.test.js","sourceRoot":"","sources":["../../../../tests/unit/agent-metrics.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { V3 } from \"../../lib/v3/v3\";\nimport { V3FunctionName } from \"../../lib/v3/types/public/methods\";\nimport type { StagehandMetrics } from \"../../lib/v3/types/public/metrics\";\n\ntype TestStagehand = V3 & Record<string, unknown>;\n\nfunction createEmptyMetrics(): StagehandMetrics {\n return {\n actPromptTokens: 0,\n actCompletionTokens: 0,\n actReasoningTokens: 0,\n actCachedInputTokens: 0,\n actInferenceTimeMs: 0,\n extractPromptTokens: 0,\n extractCompletionTokens: 0,\n extractReasoningTokens: 0,\n extractCachedInputTokens: 0,\n extractInferenceTimeMs: 0,\n observePromptTokens: 0,\n observeCompletionTokens: 0,\n observeReasoningTokens: 0,\n observeCachedInputTokens: 0,\n observeInferenceTimeMs: 0,\n agentPromptTokens: 0,\n agentCompletionTokens: 0,\n agentReasoningTokens: 0,\n agentCachedInputTokens: 0,\n agentInferenceTimeMs: 0,\n totalPromptTokens: 0,\n totalCompletionTokens: 0,\n totalReasoningTokens: 0,\n totalCachedInputTokens: 0,\n totalInferenceTimeMs: 0,\n };\n}\n\ndescribe(\"agent metrics accounting\", () => {\n it(\"merges API replay metrics with a local agent usage fallback only\", async () => {\n const remoteMetrics: StagehandMetrics = {\n ...createEmptyMetrics(),\n actPromptTokens: 40,\n actCompletionTokens: 6,\n actReasoningTokens: 2,\n actCachedInputTokens: 1,\n actInferenceTimeMs: 300,\n extractPromptTokens: 10,\n extractCompletionTokens: 3,\n extractReasoningTokens: 1,\n extractCachedInputTokens: 2,\n extractInferenceTimeMs: 120,\n observePromptTokens: 8,\n observeCompletionTokens: 2,\n observeReasoningTokens: 1,\n observeCachedInputTokens: 0,\n observeInferenceTimeMs: 90,\n agentPromptTokens: 5,\n agentCompletionTokens: 1,\n agentReasoningTokens: 1,\n agentCachedInputTokens: 0,\n agentInferenceTimeMs: 30,\n totalPromptTokens: 63,\n totalCompletionTokens: 12,\n totalReasoningTokens: 5,\n totalCachedInputTokens: 3,\n totalInferenceTimeMs: 540,\n };\n\n const stagehand = Object.create(V3.prototype) as TestStagehand;\n const mutableStagehand = stagehand as Record<string, unknown>;\n\n mutableStagehand[\"apiClient\"] = {\n getReplayMetrics: vi.fn().mockResolvedValue(remoteMetrics),\n };\n mutableStagehand[\"stagehandMetrics\"] = createEmptyMetrics();\n\n stagehand.updateMetrics(V3FunctionName.AGENT, 25, 4, 3, 2, 180);\n\n const metrics = await stagehand.metrics;\n\n expect(metrics.actPromptTokens).toBe(40);\n expect(metrics.extractPromptTokens).toBe(10);\n expect(metrics.observePromptTokens).toBe(8);\n expect(metrics.agentPromptTokens).toBe(25);\n expect(metrics.agentCompletionTokens).toBe(4);\n expect(metrics.agentReasoningTokens).toBe(3);\n expect(metrics.agentCachedInputTokens).toBe(2);\n expect(metrics.agentInferenceTimeMs).toBe(180);\n expect(metrics.totalPromptTokens).toBe(83);\n expect(metrics.totalCompletionTokens).toBe(15);\n expect(metrics.totalReasoningTokens).toBe(7);\n expect(metrics.totalCachedInputTokens).toBe(5);\n expect(metrics.totalInferenceTimeMs).toBe(690);\n });\n\n it(\"records returned agent usage into local metrics totals\", () => {\n const stagehand = Object.create(V3.prototype) as TestStagehand;\n const mutableStagehand = stagehand as Record<string, unknown>;\n\n mutableStagehand[\"stagehandMetrics\"] = createEmptyMetrics();\n\n const updateAgentMetricsFromUsage = stagehand[\n \"updateAgentMetricsFromUsage\"\n ] as (usage?: {\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n }) => void;\n\n updateAgentMetricsFromUsage.call(stagehand, {\n input_tokens: 12,\n output_tokens: 5,\n reasoning_tokens: 7,\n cached_input_tokens: 3,\n inference_time_ms: 220,\n });\n\n const metrics = stagehand[\"stagehandMetrics\"] as StagehandMetrics;\n\n expect(metrics.agentPromptTokens).toBe(12);\n expect(metrics.agentCompletionTokens).toBe(5);\n expect(metrics.agentReasoningTokens).toBe(7);\n expect(metrics.agentCachedInputTokens).toBe(3);\n expect(metrics.agentInferenceTimeMs).toBe(220);\n expect(metrics.totalPromptTokens).toBe(12);\n expect(metrics.totalCompletionTokens).toBe(5);\n expect(metrics.totalReasoningTokens).toBe(7);\n expect(metrics.totalCachedInputTokens).toBe(3);\n expect(metrics.totalInferenceTimeMs).toBe(220);\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 {};
|