@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.
Files changed (176) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/lib/inference.js +29 -22
  3. package/dist/cjs/lib/inference.js.map +1 -1
  4. package/dist/cjs/lib/prompt.js +18 -21
  5. package/dist/cjs/lib/prompt.js.map +1 -1
  6. package/dist/cjs/lib/v3/agent/AgentProvider.js +1 -0
  7. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  8. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
  9. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +60 -9
  10. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  11. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +15 -0
  12. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  13. package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
  14. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +103 -49
  15. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  16. package/dist/cjs/lib/v3/agent/tools/index.js +1 -1
  17. package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
  18. package/dist/cjs/lib/v3/agent/tools/keys.d.ts +2 -1
  19. package/dist/cjs/lib/v3/agent/tools/keys.js +57 -49
  20. package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
  21. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js +3 -5
  22. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  23. package/dist/cjs/lib/v3/api.d.ts +5 -3
  24. package/dist/cjs/lib/v3/api.js +3 -6
  25. package/dist/cjs/lib/v3/api.js.map +1 -1
  26. package/dist/cjs/lib/v3/cache/AgentCache.js +5 -3
  27. package/dist/cjs/lib/v3/cache/AgentCache.js.map +1 -1
  28. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
  29. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  30. package/dist/cjs/lib/v3/index.d.ts +1 -1
  31. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
  32. package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -6
  33. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  34. package/dist/cjs/lib/v3/llm/OpenAIClient.js +1 -0
  35. package/dist/cjs/lib/v3/llm/OpenAIClient.js.map +1 -1
  36. package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
  37. package/dist/cjs/lib/v3/llm/aisdk.js +67 -17
  38. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  39. package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -3
  40. package/dist/cjs/lib/v3/types/public/agent.js +1 -0
  41. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  42. package/dist/cjs/lib/v3/types/public/api.d.ts +30 -0
  43. package/dist/cjs/lib/v3/types/public/api.js +6 -2
  44. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  45. package/dist/cjs/lib/v3/types/public/model.d.ts +32 -2
  46. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  47. package/dist/cjs/lib/v3/understudy/context.js +11 -3
  48. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  49. package/dist/cjs/lib/v3/understudy/page.js +1 -1
  50. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  51. package/dist/cjs/lib/v3/v3.d.ts +18 -2
  52. package/dist/cjs/lib/v3/v3.js +92 -9
  53. package/dist/cjs/lib/v3/v3.js.map +1 -1
  54. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  55. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
  56. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  57. package/dist/cjs/tests/integration/flowLogger.spec.js +12 -8
  58. package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -1
  59. package/dist/cjs/tests/integration/testUtils.js +1 -1
  60. package/dist/cjs/tests/integration/testUtils.js.map +1 -1
  61. package/dist/cjs/tests/integration/timeouts.spec.js +6 -4
  62. package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
  63. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +56 -0
  64. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -1
  65. package/dist/cjs/tests/unit/agent-metrics.test.d.ts +1 -0
  66. package/dist/cjs/tests/unit/agent-metrics.test.js +112 -0
  67. package/dist/cjs/tests/unit/agent-metrics.test.js.map +1 -0
  68. package/dist/cjs/tests/unit/aisdk-clients.test.d.ts +1 -0
  69. package/dist/cjs/tests/unit/aisdk-clients.test.js +90 -0
  70. package/dist/cjs/tests/unit/aisdk-clients.test.js.map +1 -0
  71. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
  72. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js +250 -0
  73. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
  74. package/dist/cjs/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
  75. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js +95 -0
  76. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js.map +1 -0
  77. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +20 -0
  78. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  79. package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
  80. package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
  81. package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
  82. package/dist/cjs/tests/unit/microsoft-cua-client.test.d.ts +1 -0
  83. package/dist/cjs/tests/unit/microsoft-cua-client.test.js +86 -0
  84. package/dist/cjs/tests/unit/microsoft-cua-client.test.js.map +1 -0
  85. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +1 -0
  86. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  87. package/dist/esm/lib/inference.js +29 -22
  88. package/dist/esm/lib/inference.js.map +1 -1
  89. package/dist/esm/lib/prompt.js +18 -21
  90. package/dist/esm/lib/prompt.js.map +1 -1
  91. package/dist/esm/lib/v3/agent/AgentProvider.js +1 -0
  92. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  93. package/dist/esm/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
  94. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +60 -9
  95. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  96. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +15 -0
  97. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  98. package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
  99. package/dist/esm/lib/v3/agent/OpenAICUAClient.js +103 -49
  100. package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  101. package/dist/esm/lib/v3/agent/tools/index.js +1 -1
  102. package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
  103. package/dist/esm/lib/v3/agent/tools/keys.d.ts +2 -1
  104. package/dist/esm/lib/v3/agent/tools/keys.js +57 -49
  105. package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
  106. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js +3 -5
  107. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  108. package/dist/esm/lib/v3/api.d.ts +5 -3
  109. package/dist/esm/lib/v3/api.js +3 -6
  110. package/dist/esm/lib/v3/api.js.map +1 -1
  111. package/dist/esm/lib/v3/cache/AgentCache.js +5 -3
  112. package/dist/esm/lib/v3/cache/AgentCache.js.map +1 -1
  113. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
  114. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  115. package/dist/esm/lib/v3/index.d.ts +1 -1
  116. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
  117. package/dist/esm/lib/v3/llm/LLMProvider.js +15 -7
  118. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  119. package/dist/esm/lib/v3/llm/OpenAIClient.js +1 -0
  120. package/dist/esm/lib/v3/llm/OpenAIClient.js.map +1 -1
  121. package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
  122. package/dist/esm/lib/v3/llm/aisdk.js +67 -17
  123. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  124. package/dist/esm/lib/v3/types/public/agent.d.ts +8 -3
  125. package/dist/esm/lib/v3/types/public/agent.js +1 -0
  126. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  127. package/dist/esm/lib/v3/types/public/api.d.ts +30 -0
  128. package/dist/esm/lib/v3/types/public/api.js +6 -2
  129. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  130. package/dist/esm/lib/v3/types/public/model.d.ts +32 -2
  131. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  132. package/dist/esm/lib/v3/understudy/context.js +11 -3
  133. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  134. package/dist/esm/lib/v3/understudy/page.js +1 -1
  135. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  136. package/dist/esm/lib/v3/v3.d.ts +18 -2
  137. package/dist/esm/lib/v3/v3.js +92 -10
  138. package/dist/esm/lib/v3/v3.js.map +1 -1
  139. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  140. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
  141. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  142. package/dist/esm/tests/integration/flowLogger.spec.js +12 -8
  143. package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -1
  144. package/dist/esm/tests/integration/testUtils.js +1 -1
  145. package/dist/esm/tests/integration/testUtils.js.map +1 -1
  146. package/dist/esm/tests/integration/timeouts.spec.js +6 -4
  147. package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
  148. package/dist/esm/tests/unit/agent-captcha-hooks.test.js +56 -0
  149. package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -1
  150. package/dist/esm/tests/unit/agent-metrics.test.d.ts +1 -0
  151. package/dist/esm/tests/unit/agent-metrics.test.js +110 -0
  152. package/dist/esm/tests/unit/agent-metrics.test.js.map +1 -0
  153. package/dist/esm/tests/unit/aisdk-clients.test.d.ts +1 -0
  154. package/dist/esm/tests/unit/aisdk-clients.test.js +88 -0
  155. package/dist/esm/tests/unit/aisdk-clients.test.js.map +1 -0
  156. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
  157. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js +245 -0
  158. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
  159. package/dist/esm/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
  160. package/dist/esm/tests/unit/api-optional-model-api-key.test.js +93 -0
  161. package/dist/esm/tests/unit/api-optional-model-api-key.test.js.map +1 -0
  162. package/dist/esm/tests/unit/browserbase-session-accessors.test.js +20 -0
  163. package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  164. package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
  165. package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
  166. package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
  167. package/dist/esm/tests/unit/microsoft-cua-client.test.d.ts +1 -0
  168. package/dist/esm/tests/unit/microsoft-cua-client.test.js +84 -0
  169. package/dist/esm/tests/unit/microsoft-cua-client.test.js.map +1 -0
  170. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +1 -0
  171. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  172. package/package.json +4 -8
  173. package/dist/cjs/lib/v3/dom/build/rerender-index.js +0 -1
  174. package/dist/cjs/lib/v3/dom/build/v3-index.js +0 -1
  175. package/dist/esm/lib/v3/dom/build/rerender-index.js +0 -1
  176. package/dist/esm/lib/v3/dom/build/v3-index.js +0 -1
@@ -1,12 +1,19 @@
1
+ import type { LanguageModelV2Middleware } from "@ai-sdk/provider";
1
2
  import { z } from "zod";
2
3
  import { InferStagehandSchema, StagehandZodSchema } from "./zodCompat.js";
3
4
  import { LLMClient } from "./llm/LLMClient.js";
4
5
  import { AgentReplayStep } from "./types/private/index.js";
5
- import { AgentConfig, AgentExecuteOptions, AgentStreamExecuteOptions, AgentResult, LogLine, StagehandMetrics, Action, ActOptions, ActResult, defaultExtractSchema, ExtractOptions, HistoryEntry, ObserveOptions, pageTextSchema, V3FunctionName, V3Options, AgentStreamResult } from "./types/public/index.js";
6
+ import { AgentConfig, AgentExecuteOptions, AgentStreamExecuteOptions, AgentResult, LogLine, StagehandMetrics, Action, ActOptions, ActResult, defaultExtractSchema, ExtractOptions, HistoryEntry, ObserveOptions, pageTextSchema, V3FunctionName, AvailableModel, ClientOptions, V3Options, AgentStreamResult } from "./types/public/index.js";
6
7
  import { V3Context } from "./understudy/context.js";
7
8
  import { type FlowLoggerContext } from "./flowlogger/FlowLogger.js";
8
9
  import { EventEmitterWithWildcardSupport } from "./flowlogger/EventEmitter.js";
9
10
  import { EventStore } from "./flowlogger/EventStore.js";
11
+ type ResolvedModelConfiguration = {
12
+ modelName: AvailableModel;
13
+ clientOptions?: ClientOptions;
14
+ middleware?: LanguageModelV2Middleware;
15
+ };
16
+ export declare function resolveModelConfiguration(model?: V3Options["model"]): ResolvedModelConfiguration;
10
17
  /**
11
18
  * V3
12
19
  *
@@ -57,7 +64,13 @@ export declare class V3 {
57
64
  */
58
65
  get isCaptchaAutoSolveEnabled(): boolean;
59
66
  /**
60
- * Returns true if advancedStealth is enabled in Browserbase settings.
67
+ * Returns true if Browserbase Verified mode is enabled in settings.
68
+ * Legacy `advancedStealth` is treated as equivalent for backwards compatibility.
69
+ */
70
+ get isVerified(): boolean;
71
+ /**
72
+ * Backwards-compatible alias for Browserbase managed fingerprinting mode.
73
+ * @deprecated Use `isVerified` instead. This alias will be removed in a future version.
61
74
  */
62
75
  get isAdvancedStealth(): boolean;
63
76
  /**
@@ -95,6 +108,8 @@ export declare class V3 {
95
108
  * When using API mode, fetches metrics from the API. Otherwise returns local metrics.
96
109
  */
97
110
  get metrics(): Promise<StagehandMetrics>;
111
+ private mergeAgentMetricsWithLocalFallback;
112
+ private updateAgentMetricsFromUsage;
98
113
  private resolveLlmClient;
99
114
  private beginAgentReplayRecording;
100
115
  private endAgentReplayRecording;
@@ -204,3 +219,4 @@ export declare class V3 {
204
219
  execute: (instructionOrOptions: string | AgentExecuteOptions) => Promise<AgentResult>;
205
220
  };
206
221
  }
222
+ export {};
@@ -71,7 +71,7 @@ import { ActTimeoutError } from "./types/public/sdkErrors.js";
71
71
  const DEFAULT_MODEL_NAME = "openai/gpt-4.1-mini";
72
72
  const DEFAULT_VIEWPORT = { width: 1288, height: 711 };
73
73
  const DEFAULT_AGENT_TOOL_TIMEOUT_MS = 45000;
74
- function resolveModelConfiguration(model) {
74
+ export function resolveModelConfiguration(model) {
75
75
  if (!model) {
76
76
  return { modelName: DEFAULT_MODEL_NAME };
77
77
  }
@@ -79,13 +79,14 @@ function resolveModelConfiguration(model) {
79
79
  return { modelName: model };
80
80
  }
81
81
  if (model && typeof model === "object") {
82
- const { modelName, ...clientOptions } = model;
82
+ const { modelName, middleware, ...clientOptions } = model;
83
83
  if (!modelName) {
84
84
  throw new StagehandInvalidArgumentError("model.modelName is required when providing client options.");
85
85
  }
86
86
  return {
87
87
  modelName,
88
88
  clientOptions: clientOptions,
89
+ middleware,
89
90
  };
90
91
  }
91
92
  return { modelName: DEFAULT_MODEL_NAME };
@@ -173,11 +174,20 @@ let V3 = (() => {
173
174
  ?.solveCaptchas !== false);
174
175
  }
175
176
  /**
176
- * Returns true if advancedStealth is enabled in Browserbase settings.
177
+ * Returns true if Browserbase Verified mode is enabled in settings.
178
+ * Legacy `advancedStealth` is treated as equivalent for backwards compatibility.
179
+ */
180
+ get isVerified() {
181
+ const browserSettings = this.opts.browserbaseSessionCreateParams?.browserSettings;
182
+ return (browserSettings?.verified === true ||
183
+ browserSettings?.advancedStealth === true);
184
+ }
185
+ /**
186
+ * Backwards-compatible alias for Browserbase managed fingerprinting mode.
187
+ * @deprecated Use `isVerified` instead. This alias will be removed in a future version.
177
188
  */
178
189
  get isAdvancedStealth() {
179
- return (this.opts.browserbaseSessionCreateParams?.browserSettings
180
- ?.advancedStealth === true);
190
+ return this.isVerified;
181
191
  }
182
192
  /**
183
193
  * Returns the configured viewport dimensions from launch options.
@@ -289,11 +299,11 @@ let V3 = (() => {
289
299
  catch {
290
300
  // ignore
291
301
  }
292
- const { modelName, clientOptions } = resolveModelConfiguration(opts.model);
302
+ const { modelName, clientOptions, middleware } = resolveModelConfiguration(opts.model);
293
303
  this.modelName = modelName;
294
304
  this.experimental = opts.experimental ?? false;
295
305
  this.logInferenceToFile = opts.logInferenceToFile ?? false;
296
- this.llmProvider = new LLMProvider(this.logger);
306
+ this.llmProvider = new LLMProvider(this.logger, middleware);
297
307
  this.domSettleTimeoutMs = opts.domSettleTimeout;
298
308
  this.disableAPI = opts.disableAPI ?? false;
299
309
  const baseClientOptions = clientOptions
@@ -375,7 +385,10 @@ let V3 = (() => {
375
385
  get metrics() {
376
386
  if (this.apiClient) {
377
387
  // Fetch metrics from the API
378
- return this.apiClient.getReplayMetrics().catch((error) => {
388
+ return this.apiClient
389
+ .getReplayMetrics()
390
+ .then((metrics) => this.mergeAgentMetricsWithLocalFallback(metrics))
391
+ .catch((error) => {
379
392
  this.logger({
380
393
  category: "metrics",
381
394
  message: `Failed to fetch metrics from API: ${error}`,
@@ -388,21 +401,78 @@ let V3 = (() => {
388
401
  // Return local metrics wrapped in a Promise for consistency
389
402
  return Promise.resolve(this.stagehandMetrics);
390
403
  }
404
+ mergeAgentMetricsWithLocalFallback(remoteMetrics) {
405
+ // In API mode, agent.execute() is the only path that returns trusted inline
406
+ // usage today, so only repair the agent bucket from local state.
407
+ const agentPromptTokens = Math.max(remoteMetrics.agentPromptTokens, this.stagehandMetrics.agentPromptTokens);
408
+ const agentCompletionTokens = Math.max(remoteMetrics.agentCompletionTokens, this.stagehandMetrics.agentCompletionTokens);
409
+ const agentReasoningTokens = Math.max(remoteMetrics.agentReasoningTokens, this.stagehandMetrics.agentReasoningTokens);
410
+ const agentCachedInputTokens = Math.max(remoteMetrics.agentCachedInputTokens, this.stagehandMetrics.agentCachedInputTokens);
411
+ const agentInferenceTimeMs = Math.max(remoteMetrics.agentInferenceTimeMs, this.stagehandMetrics.agentInferenceTimeMs);
412
+ const metrics = {
413
+ ...remoteMetrics,
414
+ agentPromptTokens,
415
+ agentCompletionTokens,
416
+ agentReasoningTokens,
417
+ agentCachedInputTokens,
418
+ agentInferenceTimeMs,
419
+ totalPromptTokens: 0,
420
+ totalCompletionTokens: 0,
421
+ totalReasoningTokens: 0,
422
+ totalCachedInputTokens: 0,
423
+ totalInferenceTimeMs: 0,
424
+ };
425
+ metrics.totalPromptTokens =
426
+ metrics.actPromptTokens +
427
+ metrics.extractPromptTokens +
428
+ metrics.observePromptTokens +
429
+ metrics.agentPromptTokens;
430
+ metrics.totalCompletionTokens =
431
+ metrics.actCompletionTokens +
432
+ metrics.extractCompletionTokens +
433
+ metrics.observeCompletionTokens +
434
+ metrics.agentCompletionTokens;
435
+ metrics.totalReasoningTokens =
436
+ metrics.actReasoningTokens +
437
+ metrics.extractReasoningTokens +
438
+ metrics.observeReasoningTokens +
439
+ metrics.agentReasoningTokens;
440
+ metrics.totalCachedInputTokens =
441
+ metrics.actCachedInputTokens +
442
+ metrics.extractCachedInputTokens +
443
+ metrics.observeCachedInputTokens +
444
+ metrics.agentCachedInputTokens;
445
+ metrics.totalInferenceTimeMs =
446
+ metrics.actInferenceTimeMs +
447
+ metrics.extractInferenceTimeMs +
448
+ metrics.observeInferenceTimeMs +
449
+ metrics.agentInferenceTimeMs;
450
+ return metrics;
451
+ }
452
+ updateAgentMetricsFromUsage(usage) {
453
+ if (!usage) {
454
+ return;
455
+ }
456
+ this.updateMetrics(V3FunctionName.AGENT, usage.input_tokens, usage.output_tokens, usage.reasoning_tokens ?? 0, usage.cached_input_tokens ?? 0, usage.inference_time_ms);
457
+ }
391
458
  resolveLlmClient(model) {
392
459
  if (!model) {
393
460
  return this.llmClient;
394
461
  }
395
462
  let modelName;
396
463
  let clientOptions;
464
+ let perCallMiddleware;
397
465
  if (typeof model === "string") {
398
466
  modelName = model;
399
467
  }
400
468
  else {
401
- const { modelName: overrideModelName, ...rest } = model;
469
+ const { modelName: overrideModelName, middleware, ...rest } = model;
402
470
  modelName = overrideModelName;
403
471
  clientOptions = rest;
472
+ perCallMiddleware = middleware;
404
473
  }
405
474
  if (modelName === this.modelName &&
475
+ !perCallMiddleware &&
406
476
  (!clientOptions || Object.keys(clientOptions).length === 0)) {
407
477
  return this.llmClient;
408
478
  }
@@ -419,6 +489,13 @@ let V3 = (() => {
419
489
  mergedOptions.apiKey = apiKey;
420
490
  }
421
491
  }
492
+ if (perCallMiddleware) {
493
+ return this.llmProvider.getClient(modelName, mergedOptions, {
494
+ experimental: this.experimental,
495
+ disableAPI: this.disableAPI,
496
+ middleware: perCallMiddleware,
497
+ });
498
+ }
422
499
  const cacheKey = JSON.stringify({
423
500
  modelName,
424
501
  clientOptions: mergedOptions,
@@ -427,7 +504,10 @@ let V3 = (() => {
427
504
  if (cached) {
428
505
  return cached;
429
506
  }
430
- const client = this.llmProvider.getClient(modelName, mergedOptions, { experimental: this.experimental, disableAPI: this.disableAPI });
507
+ const client = this.llmProvider.getClient(modelName, mergedOptions, {
508
+ experimental: this.experimental,
509
+ disableAPI: this.disableAPI,
510
+ });
431
511
  this.overrideLlmClients.set(cacheKey, client);
432
512
  return client;
433
513
  }
@@ -1504,6 +1584,7 @@ let V3 = (() => {
1504
1584
  if (this.apiClient && !this.experimental) {
1505
1585
  const page = await this.ctx.awaitActivePage();
1506
1586
  result = await this.apiClient.agentExecute(options, resolvedOptions, page.mainFrameId(), !!cacheContext);
1587
+ this.updateAgentMetricsFromUsage(result.usage);
1507
1588
  if (cacheContext) {
1508
1589
  const transferredEntry = this.apiClient.consumeLatestAgentCacheEntry();
1509
1590
  await this.agentCache.storeTransferredEntry(transferredEntry);
@@ -1587,6 +1668,7 @@ let V3 = (() => {
1587
1668
  if (this.apiClient && !this.experimental) {
1588
1669
  const page = await this.ctx.awaitActivePage();
1589
1670
  result = await this.apiClient.agentExecute(options ?? {}, resolvedOptions, page.mainFrameId(), !!cacheContext);
1671
+ this.updateAgentMetricsFromUsage(result.usage);
1590
1672
  if (cacheContext) {
1591
1673
  const transferredEntry = this.apiClient.consumeLatestAgentCacheEntry();
1592
1674
  await this.agentCache.storeTransferredEntry(transferredEntry);