@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,6 +71,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
71
71
  };
72
72
  Object.defineProperty(exports, "__esModule", { value: true });
73
73
  exports.V3 = void 0;
74
+ exports.resolveModelConfiguration = resolveModelConfiguration;
74
75
  const fs_1 = __importDefault(require("fs"));
75
76
  const os_1 = __importDefault(require("os"));
76
77
  const path_1 = __importDefault(require("path"));
@@ -118,13 +119,14 @@ function resolveModelConfiguration(model) {
118
119
  return { modelName: model };
119
120
  }
120
121
  if (model && typeof model === "object") {
121
- const { modelName, ...clientOptions } = model;
122
+ const { modelName, middleware, ...clientOptions } = model;
122
123
  if (!modelName) {
123
124
  throw new index_js_1.StagehandInvalidArgumentError("model.modelName is required when providing client options.");
124
125
  }
125
126
  return {
126
127
  modelName,
127
128
  clientOptions: clientOptions,
129
+ middleware,
128
130
  };
129
131
  }
130
132
  return { modelName: DEFAULT_MODEL_NAME };
@@ -212,11 +214,20 @@ let V3 = (() => {
212
214
  ?.solveCaptchas !== false);
213
215
  }
214
216
  /**
215
- * Returns true if advancedStealth is enabled in Browserbase settings.
217
+ * Returns true if Browserbase Verified mode is enabled in settings.
218
+ * Legacy `advancedStealth` is treated as equivalent for backwards compatibility.
219
+ */
220
+ get isVerified() {
221
+ const browserSettings = this.opts.browserbaseSessionCreateParams?.browserSettings;
222
+ return (browserSettings?.verified === true ||
223
+ browserSettings?.advancedStealth === true);
224
+ }
225
+ /**
226
+ * Backwards-compatible alias for Browserbase managed fingerprinting mode.
227
+ * @deprecated Use `isVerified` instead. This alias will be removed in a future version.
216
228
  */
217
229
  get isAdvancedStealth() {
218
- return (this.opts.browserbaseSessionCreateParams?.browserSettings
219
- ?.advancedStealth === true);
230
+ return this.isVerified;
220
231
  }
221
232
  /**
222
233
  * Returns the configured viewport dimensions from launch options.
@@ -328,11 +339,11 @@ let V3 = (() => {
328
339
  catch {
329
340
  // ignore
330
341
  }
331
- const { modelName, clientOptions } = resolveModelConfiguration(opts.model);
342
+ const { modelName, clientOptions, middleware } = resolveModelConfiguration(opts.model);
332
343
  this.modelName = modelName;
333
344
  this.experimental = opts.experimental ?? false;
334
345
  this.logInferenceToFile = opts.logInferenceToFile ?? false;
335
- this.llmProvider = new LLMProvider_js_1.LLMProvider(this.logger);
346
+ this.llmProvider = new LLMProvider_js_1.LLMProvider(this.logger, middleware);
336
347
  this.domSettleTimeoutMs = opts.domSettleTimeout;
337
348
  this.disableAPI = opts.disableAPI ?? false;
338
349
  const baseClientOptions = clientOptions
@@ -414,7 +425,10 @@ let V3 = (() => {
414
425
  get metrics() {
415
426
  if (this.apiClient) {
416
427
  // Fetch metrics from the API
417
- return this.apiClient.getReplayMetrics().catch((error) => {
428
+ return this.apiClient
429
+ .getReplayMetrics()
430
+ .then((metrics) => this.mergeAgentMetricsWithLocalFallback(metrics))
431
+ .catch((error) => {
418
432
  this.logger({
419
433
  category: "metrics",
420
434
  message: `Failed to fetch metrics from API: ${error}`,
@@ -427,21 +441,78 @@ let V3 = (() => {
427
441
  // Return local metrics wrapped in a Promise for consistency
428
442
  return Promise.resolve(this.stagehandMetrics);
429
443
  }
444
+ mergeAgentMetricsWithLocalFallback(remoteMetrics) {
445
+ // In API mode, agent.execute() is the only path that returns trusted inline
446
+ // usage today, so only repair the agent bucket from local state.
447
+ const agentPromptTokens = Math.max(remoteMetrics.agentPromptTokens, this.stagehandMetrics.agentPromptTokens);
448
+ const agentCompletionTokens = Math.max(remoteMetrics.agentCompletionTokens, this.stagehandMetrics.agentCompletionTokens);
449
+ const agentReasoningTokens = Math.max(remoteMetrics.agentReasoningTokens, this.stagehandMetrics.agentReasoningTokens);
450
+ const agentCachedInputTokens = Math.max(remoteMetrics.agentCachedInputTokens, this.stagehandMetrics.agentCachedInputTokens);
451
+ const agentInferenceTimeMs = Math.max(remoteMetrics.agentInferenceTimeMs, this.stagehandMetrics.agentInferenceTimeMs);
452
+ const metrics = {
453
+ ...remoteMetrics,
454
+ agentPromptTokens,
455
+ agentCompletionTokens,
456
+ agentReasoningTokens,
457
+ agentCachedInputTokens,
458
+ agentInferenceTimeMs,
459
+ totalPromptTokens: 0,
460
+ totalCompletionTokens: 0,
461
+ totalReasoningTokens: 0,
462
+ totalCachedInputTokens: 0,
463
+ totalInferenceTimeMs: 0,
464
+ };
465
+ metrics.totalPromptTokens =
466
+ metrics.actPromptTokens +
467
+ metrics.extractPromptTokens +
468
+ metrics.observePromptTokens +
469
+ metrics.agentPromptTokens;
470
+ metrics.totalCompletionTokens =
471
+ metrics.actCompletionTokens +
472
+ metrics.extractCompletionTokens +
473
+ metrics.observeCompletionTokens +
474
+ metrics.agentCompletionTokens;
475
+ metrics.totalReasoningTokens =
476
+ metrics.actReasoningTokens +
477
+ metrics.extractReasoningTokens +
478
+ metrics.observeReasoningTokens +
479
+ metrics.agentReasoningTokens;
480
+ metrics.totalCachedInputTokens =
481
+ metrics.actCachedInputTokens +
482
+ metrics.extractCachedInputTokens +
483
+ metrics.observeCachedInputTokens +
484
+ metrics.agentCachedInputTokens;
485
+ metrics.totalInferenceTimeMs =
486
+ metrics.actInferenceTimeMs +
487
+ metrics.extractInferenceTimeMs +
488
+ metrics.observeInferenceTimeMs +
489
+ metrics.agentInferenceTimeMs;
490
+ return metrics;
491
+ }
492
+ updateAgentMetricsFromUsage(usage) {
493
+ if (!usage) {
494
+ return;
495
+ }
496
+ this.updateMetrics(index_js_1.V3FunctionName.AGENT, usage.input_tokens, usage.output_tokens, usage.reasoning_tokens ?? 0, usage.cached_input_tokens ?? 0, usage.inference_time_ms);
497
+ }
430
498
  resolveLlmClient(model) {
431
499
  if (!model) {
432
500
  return this.llmClient;
433
501
  }
434
502
  let modelName;
435
503
  let clientOptions;
504
+ let perCallMiddleware;
436
505
  if (typeof model === "string") {
437
506
  modelName = model;
438
507
  }
439
508
  else {
440
- const { modelName: overrideModelName, ...rest } = model;
509
+ const { modelName: overrideModelName, middleware, ...rest } = model;
441
510
  modelName = overrideModelName;
442
511
  clientOptions = rest;
512
+ perCallMiddleware = middleware;
443
513
  }
444
514
  if (modelName === this.modelName &&
515
+ !perCallMiddleware &&
445
516
  (!clientOptions || Object.keys(clientOptions).length === 0)) {
446
517
  return this.llmClient;
447
518
  }
@@ -458,6 +529,13 @@ let V3 = (() => {
458
529
  mergedOptions.apiKey = apiKey;
459
530
  }
460
531
  }
532
+ if (perCallMiddleware) {
533
+ return this.llmProvider.getClient(modelName, mergedOptions, {
534
+ experimental: this.experimental,
535
+ disableAPI: this.disableAPI,
536
+ middleware: perCallMiddleware,
537
+ });
538
+ }
461
539
  const cacheKey = JSON.stringify({
462
540
  modelName,
463
541
  clientOptions: mergedOptions,
@@ -466,7 +544,10 @@ let V3 = (() => {
466
544
  if (cached) {
467
545
  return cached;
468
546
  }
469
- const client = this.llmProvider.getClient(modelName, mergedOptions, { experimental: this.experimental, disableAPI: this.disableAPI });
547
+ const client = this.llmProvider.getClient(modelName, mergedOptions, {
548
+ experimental: this.experimental,
549
+ disableAPI: this.disableAPI,
550
+ });
470
551
  this.overrideLlmClients.set(cacheKey, client);
471
552
  return client;
472
553
  }
@@ -1543,6 +1624,7 @@ let V3 = (() => {
1543
1624
  if (this.apiClient && !this.experimental) {
1544
1625
  const page = await this.ctx.awaitActivePage();
1545
1626
  result = await this.apiClient.agentExecute(options, resolvedOptions, page.mainFrameId(), !!cacheContext);
1627
+ this.updateAgentMetricsFromUsage(result.usage);
1546
1628
  if (cacheContext) {
1547
1629
  const transferredEntry = this.apiClient.consumeLatestAgentCacheEntry();
1548
1630
  await this.agentCache.storeTransferredEntry(transferredEntry);
@@ -1626,6 +1708,7 @@ let V3 = (() => {
1626
1708
  if (this.apiClient && !this.experimental) {
1627
1709
  const page = await this.ctx.awaitActivePage();
1628
1710
  result = await this.apiClient.agentExecute(options ?? {}, resolvedOptions, page.mainFrameId(), !!cacheContext);
1711
+ this.updateAgentMetricsFromUsage(result.usage);
1629
1712
  if (cacheContext) {
1630
1713
  const transferredEntry = this.apiClient.consumeLatestAgentCacheEntry();
1631
1714
  await this.agentCache.storeTransferredEntry(transferredEntry);