veryfront 0.1.955 → 0.1.957

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 (53) hide show
  1. package/esm/cli/commands/eval/command-help.d.ts.map +1 -1
  2. package/esm/cli/commands/eval/command-help.js +5 -0
  3. package/esm/cli/commands/eval/command.d.ts +15 -2
  4. package/esm/cli/commands/eval/command.d.ts.map +1 -1
  5. package/esm/cli/commands/eval/command.js +158 -14
  6. package/esm/cli/commands/eval/handler.d.ts +2 -0
  7. package/esm/cli/commands/eval/handler.d.ts.map +1 -1
  8. package/esm/cli/commands/eval/handler.js +2 -0
  9. package/esm/deno.js +1 -1
  10. package/esm/extensions/ext-llm-openai/src/openai-chat-stream.d.ts.map +1 -1
  11. package/esm/extensions/ext-llm-openai/src/openai-chat-stream.js +25 -0
  12. package/esm/extensions/ext-llm-openai/src/openai-provider.d.ts.map +1 -1
  13. package/esm/extensions/ext-llm-openai/src/openai-provider.js +25 -0
  14. package/esm/src/agent/ag-ui/browser-chunk-encoder.d.ts.map +1 -1
  15. package/esm/src/agent/ag-ui/browser-chunk-encoder.js +32 -0
  16. package/esm/src/agent/ag-ui/browser-encoder.d.ts +6 -0
  17. package/esm/src/agent/ag-ui/browser-encoder.d.ts.map +1 -1
  18. package/esm/src/agent/ag-ui/browser-encoder.js +70 -0
  19. package/esm/src/agent/ag-ui/browser-finalize-tracker.d.ts.map +1 -1
  20. package/esm/src/agent/ag-ui/browser-finalize-tracker.js +18 -0
  21. package/esm/src/agent/runtime/chat-stream-handler.d.ts +16 -0
  22. package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
  23. package/esm/src/agent/runtime/chat-stream-handler.js +24 -0
  24. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  25. package/esm/src/agent/runtime/index.js +8 -0
  26. package/esm/src/agent/runtime/input-utils.d.ts +16 -0
  27. package/esm/src/agent/runtime/input-utils.d.ts.map +1 -1
  28. package/esm/src/agent/runtime/input-utils.js +29 -0
  29. package/esm/src/agent/runtime/runtime-tool-types.d.ts +16 -0
  30. package/esm/src/agent/runtime/runtime-tool-types.d.ts.map +1 -1
  31. package/esm/src/agent/schemas/agent.schema.d.ts +8 -0
  32. package/esm/src/agent/schemas/agent.schema.d.ts.map +1 -1
  33. package/esm/src/agent/schemas/agent.schema.js +8 -0
  34. package/esm/src/eval/agent-service.d.ts.map +1 -1
  35. package/esm/src/eval/agent-service.js +39 -1
  36. package/esm/src/eval/index.d.ts +1 -1
  37. package/esm/src/eval/index.d.ts.map +1 -1
  38. package/esm/src/eval/metrics.d.ts.map +1 -1
  39. package/esm/src/eval/metrics.js +7 -2
  40. package/esm/src/eval/model-comparison.d.ts.map +1 -1
  41. package/esm/src/eval/model-comparison.js +229 -7
  42. package/esm/src/eval/report.d.ts.map +1 -1
  43. package/esm/src/eval/report.js +42 -4
  44. package/esm/src/eval/studio.d.ts +22 -0
  45. package/esm/src/eval/studio.d.ts.map +1 -1
  46. package/esm/src/eval/studio.js +11 -0
  47. package/esm/src/eval/types.d.ts +52 -0
  48. package/esm/src/eval/types.d.ts.map +1 -1
  49. package/esm/src/runtime/runtime-bridge.d.ts.map +1 -1
  50. package/esm/src/runtime/runtime-bridge.js +60 -0
  51. package/esm/src/utils/version-constant.d.ts +1 -1
  52. package/esm/src/utils/version-constant.js +1 -1
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"command-help.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/eval/command-help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,QAAQ,EAAE,WAsEtB,CAAC"}
1
+ {"version":3,"file":"command-help.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/eval/command-help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,QAAQ,EAAE,WA2EtB,CAAC"}
@@ -48,6 +48,10 @@ export const evalHelp = {
48
48
  flag: "--candidate-model <provider/model>",
49
49
  description: "Candidate model to compare against --baseline-model; repeat for multiple candidates",
50
50
  },
51
+ {
52
+ flag: "--comparison-policy <path>",
53
+ description: "Read model comparison constraints and weighted objectives from JSON",
54
+ },
51
55
  {
52
56
  flag: "--max-output-tokens <count>",
53
57
  description: "Limit target agent output tokens",
@@ -64,6 +68,7 @@ export const evalHelp = {
64
68
  "veryfront eval eval:deep-research --report .veryfront/evals/deep-research/report.json --junit .veryfront/evals/deep-research/junit.xml",
65
69
  "veryfront eval deep-research --baseline .veryfront/evals/baseline.json --json",
66
70
  "veryfront eval deep-research --baseline-model anthropic/claude-sonnet-4-6 --candidate-model moonshotai/kimi-k2.6",
71
+ "veryfront eval deep-research --baseline-model anthropic/claude-sonnet-4-6 --candidate-model moonshotai/kimi-k2.6 --comparison-policy evals/model-comparison.policy.json",
67
72
  "veryfront eval deep-research --export braintrust,langfuse --json",
68
73
  "veryfront eval deep-research --json",
69
74
  ],
@@ -1,6 +1,6 @@
1
1
  import type { AgentResponse } from "../../../src/agent/index.js";
2
2
  import type { VeryfrontConfig } from "../../../src/config/index.js";
3
- import type { DiscoveredEval, EvalModelComparison, EvalReport, EvalReportComparison, EvalToolCall } from "../../../src/eval/index.js";
3
+ import type { DiscoveredEval, EvalModelComparison, EvalModelComparisonOptions, EvalReport, EvalReportComparison, EvalToolCall } from "../../../src/eval/index.js";
4
4
  import type { EvalArgs } from "./handler.js";
5
5
  export interface EvalOptions extends EvalArgs {
6
6
  }
@@ -35,6 +35,7 @@ type EvalSummaryArtifact = {
35
35
  exports?: EvalReport["exports"];
36
36
  baseline?: EvalReportComparison;
37
37
  };
38
+ type EvalModelComparisonPolicy = Omit<EvalModelComparisonOptions, "baselineModel">;
38
39
  export declare function createDefaultEvalReportDir(runId: string): string;
39
40
  export declare function createEvalArtifactPaths(reportDir: string): EvalArtifactPaths;
40
41
  export declare function createEvalModelArtifactPaths(reportDir: string, model: string): EvalModelArtifactPaths;
@@ -43,7 +44,9 @@ export declare function findEvalForCliId(evals: DiscoveredEval[], id: string): D
43
44
  export declare function normalizeEvalInputForAgent(input: unknown): string;
44
45
  export declare function summarizeReportForCli(report: EvalReport): CliEvalSummary;
45
46
  export declare function createSummaryArtifact(report: EvalReport, baseline?: EvalReportComparison): EvalSummaryArtifact;
46
- export declare function createEvalModelComparisonArtifact(reports: EvalReport[], baselineModel: string): EvalModelComparison;
47
+ export declare function loadEvalModelComparisonPolicy(projectDir: string, policyPath?: string): Promise<EvalModelComparisonPolicy>;
48
+ export declare function createResolvedEvalModelComparisonConfig(projectDir: string, options: EvalOptions): Promise<ResolvedEvalModelComparisonConfig | undefined>;
49
+ export declare function createEvalModelComparisonArtifact(reports: EvalReport[], baselineModel: string, policy?: EvalModelComparisonPolicy): EvalModelComparison;
47
50
  export declare function createEvalModelComparisonExitCode(reports: EvalReport[]): 0 | 1;
48
51
  export declare function createResultsJsonl(report: EvalReport): string;
49
52
  export declare function createJunitXml(report: EvalReport): string;
@@ -54,6 +57,16 @@ type EvalRuntimeAuthConfig = Pick<VeryfrontConfig, "projectSlug" | "fs"> & {
54
57
  };
55
58
  export declare function hydrateEvalRuntimeAuth(projectDir: string, config: EvalRuntimeAuthConfig | null | undefined): Promise<import("../../shared/runtime-auth.js").RuntimeAuthContext>;
56
59
  export declare function normalizeToolCalls(response: AgentResponse): EvalToolCall[];
60
+ type EvalModelComparisonConfig = {
61
+ baselineModel: string;
62
+ candidateModels: string[];
63
+ comparisonPolicy?: string;
64
+ models: string[];
65
+ };
66
+ type ResolvedEvalModelComparisonConfig = {
67
+ config: EvalModelComparisonConfig;
68
+ policy: EvalModelComparisonPolicy;
69
+ };
57
70
  export declare function evalCommand(options: EvalOptions): Promise<void>;
58
71
  export {};
59
72
  //# sourceMappingURL=command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/eval/command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/eval/command.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,24 @@
2
2
  * Eval command - Discover and run eval definitions from the evals/ directory.
3
3
  */
4
4
  import * as dntShim from "../../../_dnt.shims.js";
5
- import { dirname, join, relative } from "../../../deps/jsr.io/@std/path/1.1.4/mod.js";
5
+ import { dirname, isAbsolute, join, relative, resolve } from "../../../deps/jsr.io/@std/path/1.1.4/mod.js";
6
6
  import { createProjectDiscoveryConfig, discoverAll } from "../../../src/discovery/index.js";
7
7
  import { compareEvalModelReports, compareEvalReports, createEvalModelComparisonMarkdown, discoverEvals, resolveEvalRunProvenance, runEval, } from "../../../src/eval/index.js";
8
8
  import { applyRuntimeAuthContext } from "../../shared/runtime-auth.js";
9
9
  import { cliLogger, exitProcess, VERSION } from "../../utils/index.js";
10
10
  import { createErrorEnvelope, createSuccessEnvelope, isJsonMode, outputJson, } from "../../shared/json-output.js";
11
11
  import { withProjectSourceContext } from "../../shared/project-source-context.js";
12
+ const MODEL_COMPARISON_METRICS = [
13
+ "passRate",
14
+ "failed",
15
+ "gateFailures",
16
+ "groundednessScore",
17
+ "totalTokens",
18
+ "costUsd",
19
+ "p95Ms",
20
+ ];
21
+ const MODEL_COMPARISON_METRIC_SET = new Set(MODEL_COMPARISON_METRICS);
22
+ const MODEL_COMPARISON_OBJECTIVE_DIRECTIONS = new Set(["minimize", "maximize"]);
12
23
  function xmlEscape(value) {
13
24
  return value
14
25
  .replaceAll("&", "&amp;")
@@ -135,8 +146,135 @@ export function createSummaryArtifact(report, baseline) {
135
146
  ...(baseline ? { baseline } : {}),
136
147
  };
137
148
  }
138
- export function createEvalModelComparisonArtifact(reports, baselineModel) {
139
- return compareEvalModelReports(reports, { baselineModel });
149
+ function isRecord(value) {
150
+ return value !== null && typeof value === "object" && !Array.isArray(value);
151
+ }
152
+ function readNumberField(record, field, path) {
153
+ const value = record[field];
154
+ if (value === undefined)
155
+ return undefined;
156
+ if (typeof value !== "number" || !Number.isFinite(value)) {
157
+ throw new Error(`Invalid --comparison-policy: ${path}.${field} must be a finite number.`);
158
+ }
159
+ return value;
160
+ }
161
+ function assertKnownComparisonMetric(metric, path) {
162
+ if (MODEL_COMPARISON_METRIC_SET.has(metric))
163
+ return metric;
164
+ throw new Error(`Invalid --comparison-policy: ${path} uses unknown metric "${metric}".`);
165
+ }
166
+ function parseComparisonConstraints(value) {
167
+ if (value === undefined)
168
+ return undefined;
169
+ if (!isRecord(value)) {
170
+ throw new Error("Invalid --comparison-policy: constraints must be an object.");
171
+ }
172
+ const constraints = {};
173
+ for (const [metricName, rawConstraint] of Object.entries(value)) {
174
+ const metric = assertKnownComparisonMetric(metricName, `constraints.${metricName}`);
175
+ if (!isRecord(rawConstraint)) {
176
+ throw new Error(`Invalid --comparison-policy: constraints.${metricName} must be an object.`);
177
+ }
178
+ const maxRegressionPct = readNumberField(rawConstraint, "maxRegressionPct", `constraints.${metricName}`);
179
+ if (maxRegressionPct !== undefined && maxRegressionPct < 0) {
180
+ throw new Error(`Invalid --comparison-policy: constraints.${metricName}.maxRegressionPct must be at least 0.`);
181
+ }
182
+ constraints[metric] = {
183
+ ...(rawConstraint.min !== undefined
184
+ ? { min: readNumberField(rawConstraint, "min", `constraints.${metricName}`) }
185
+ : {}),
186
+ ...(rawConstraint.max !== undefined
187
+ ? { max: readNumberField(rawConstraint, "max", `constraints.${metricName}`) }
188
+ : {}),
189
+ ...(maxRegressionPct !== undefined ? { maxRegressionPct } : {}),
190
+ };
191
+ }
192
+ return constraints;
193
+ }
194
+ function parseComparisonObjectives(value) {
195
+ if (value === undefined)
196
+ return undefined;
197
+ if (!isRecord(value)) {
198
+ throw new Error("Invalid --comparison-policy: objectives must be an object.");
199
+ }
200
+ const objectives = {};
201
+ for (const [metricName, rawObjective] of Object.entries(value)) {
202
+ const metric = assertKnownComparisonMetric(metricName, `objectives.${metricName}`);
203
+ if (!isRecord(rawObjective)) {
204
+ throw new Error(`Invalid --comparison-policy: objectives.${metricName} must be an object.`);
205
+ }
206
+ const weight = readNumberField(rawObjective, "weight", `objectives.${metricName}`);
207
+ if (weight === undefined) {
208
+ throw new Error(`Invalid --comparison-policy: objectives.${metricName}.weight is required.`);
209
+ }
210
+ if (weight <= 0) {
211
+ throw new Error(`Invalid --comparison-policy: objectives.${metricName}.weight must be greater than 0.`);
212
+ }
213
+ const direction = rawObjective.direction;
214
+ if (typeof direction !== "string" || !MODEL_COMPARISON_OBJECTIVE_DIRECTIONS.has(direction)) {
215
+ throw new Error(`Invalid --comparison-policy: objectives.${metricName}.direction must be "minimize" or "maximize".`);
216
+ }
217
+ objectives[metric] = {
218
+ weight,
219
+ direction: direction,
220
+ };
221
+ }
222
+ return objectives;
223
+ }
224
+ export async function loadEvalModelComparisonPolicy(projectDir, policyPath) {
225
+ if (!policyPath)
226
+ return {};
227
+ const resolvedPath = isAbsolute(policyPath) ? policyPath : resolve(projectDir, policyPath);
228
+ let rawPolicy;
229
+ try {
230
+ rawPolicy = await dntShim.Deno.readTextFile(resolvedPath);
231
+ }
232
+ catch (error) {
233
+ if (error instanceof dntShim.Deno.errors.NotFound) {
234
+ throw new Error("Invalid --comparison-policy: file not found.");
235
+ }
236
+ throw error;
237
+ }
238
+ let policy;
239
+ try {
240
+ policy = JSON.parse(rawPolicy);
241
+ }
242
+ catch {
243
+ throw new Error("Invalid --comparison-policy: file must contain valid JSON.");
244
+ }
245
+ if (!isRecord(policy)) {
246
+ throw new Error("Invalid --comparison-policy: root value must be an object.");
247
+ }
248
+ return {
249
+ ...("minGroundedness" in policy
250
+ ? { minGroundedness: readNumberField(policy, "minGroundedness", "root") }
251
+ : {}),
252
+ ...("minCostImprovementPct" in policy
253
+ ? { minCostImprovementPct: readNumberField(policy, "minCostImprovementPct", "root") }
254
+ : {}),
255
+ ...("minTokenImprovementPct" in policy
256
+ ? { minTokenImprovementPct: readNumberField(policy, "minTokenImprovementPct", "root") }
257
+ : {}),
258
+ ...("minLatencyImprovementPct" in policy
259
+ ? { minLatencyImprovementPct: readNumberField(policy, "minLatencyImprovementPct", "root") }
260
+ : {}),
261
+ ...(policy.constraints !== undefined
262
+ ? { constraints: parseComparisonConstraints(policy.constraints) }
263
+ : {}),
264
+ ...(policy.objectives !== undefined
265
+ ? { objectives: parseComparisonObjectives(policy.objectives) }
266
+ : {}),
267
+ };
268
+ }
269
+ export async function createResolvedEvalModelComparisonConfig(projectDir, options) {
270
+ const config = resolveEvalModelComparisonConfig(options);
271
+ if (!config)
272
+ return undefined;
273
+ const policy = await loadEvalModelComparisonPolicy(projectDir, config.comparisonPolicy);
274
+ return { config, policy };
275
+ }
276
+ export function createEvalModelComparisonArtifact(reports, baselineModel, policy = {}) {
277
+ return compareEvalModelReports(reports, { ...policy, baselineModel });
140
278
  }
141
279
  export function createEvalModelComparisonExitCode(reports) {
142
280
  return reports.some((report) => report.summary.failed > 0) ? 1 : 0;
@@ -299,8 +437,12 @@ function uniqueValues(values) {
299
437
  function resolveEvalModelComparisonConfig(options) {
300
438
  const candidateModels = uniqueValues(options.candidateModels);
301
439
  const baselineModel = options.baselineModel?.trim();
302
- if (!baselineModel && candidateModels.length === 0)
440
+ if (!baselineModel && candidateModels.length === 0) {
441
+ if (options.comparisonPolicy) {
442
+ throw new Error("--comparison-policy requires --baseline-model and --candidate-model.");
443
+ }
303
444
  return undefined;
445
+ }
304
446
  if (!baselineModel) {
305
447
  throw new Error("--baseline-model is required when using --candidate-model.");
306
448
  }
@@ -316,6 +458,7 @@ function resolveEvalModelComparisonConfig(options) {
316
458
  return {
317
459
  baselineModel,
318
460
  candidateModels: candidateModels.filter((model) => model !== baselineModel),
461
+ ...(options.comparisonPolicy ? { comparisonPolicy: options.comparisonPolicy } : {}),
319
462
  models: uniqueValues([baselineModel, ...candidateModels]),
320
463
  };
321
464
  }
@@ -355,7 +498,7 @@ async function runEvalModelComparison(input) {
355
498
  await writeEvalArtifacts(report, modelPaths);
356
499
  await writeTextFileEnsuringDir(modelPaths.junit, createJunitXml(report));
357
500
  }
358
- const comparison = createEvalModelComparisonArtifact(reports, input.config.baselineModel);
501
+ const comparison = createEvalModelComparisonArtifact(reports, input.config.baselineModel, input.policy);
359
502
  await writeEvalModelComparisonArtifacts(comparison, paths);
360
503
  if (input.options.report) {
361
504
  await writeTextFileEnsuringDir(input.options.report, JSON.stringify(comparison, null, 2));
@@ -479,6 +622,14 @@ export async function evalCommand(options) {
479
622
  await outputEvalNotFound(evalId, evalDiscovery.evals);
480
623
  return;
481
624
  }
625
+ let modelComparisonConfig;
626
+ try {
627
+ modelComparisonConfig = await createResolvedEvalModelComparisonConfig(projectDir, options);
628
+ }
629
+ catch (error) {
630
+ await outputEvalUsageError(error instanceof Error ? error.message : String(error));
631
+ return;
632
+ }
482
633
  const discoveryConfig = createProjectDiscoveryConfig({
483
634
  projectDir,
484
635
  config,
@@ -492,21 +643,14 @@ export async function evalCommand(options) {
492
643
  await outputAgentNotFound(agentId);
493
644
  return;
494
645
  }
495
- let modelComparisonConfig;
496
- try {
497
- modelComparisonConfig = resolveEvalModelComparisonConfig(options);
498
- }
499
- catch (error) {
500
- await outputEvalUsageError(error instanceof Error ? error.message : String(error));
501
- return;
502
- }
503
646
  if (modelComparisonConfig) {
504
647
  await runEvalModelComparison({
505
648
  evalItem,
506
649
  agent,
507
650
  options,
508
651
  projectDir,
509
- config: modelComparisonConfig,
652
+ config: modelComparisonConfig.config,
653
+ policy: modelComparisonConfig.policy,
510
654
  });
511
655
  return;
512
656
  }
@@ -14,6 +14,7 @@ declare const getEvalArgsSchema: () => import("../../../src/internal-agents/sche
14
14
  model: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
15
15
  baselineModel: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
16
16
  candidateModels: import("../../../src/internal-agents/schema.js").Schema<string[]>;
17
+ comparisonPolicy: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
17
18
  maxOutputTokens: import("../../../src/internal-agents/schema.js").Schema<number | undefined>;
18
19
  }>>;
19
20
  export type EvalArgs = InferSchema<ReturnType<typeof getEvalArgsSchema>>;
@@ -31,6 +32,7 @@ export declare const parseEvalArgs: (args: ParsedArgs) => import("../../shared/a
31
32
  model: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
32
33
  baselineModel: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
33
34
  candidateModels: import("../../../src/internal-agents/schema.js").Schema<string[]>;
35
+ comparisonPolicy: import("../../../src/internal-agents/schema.js").Schema<string | undefined>;
34
36
  maxOutputTokens: import("../../../src/internal-agents/schema.js").Schema<number | undefined>;
35
37
  }>>;
36
38
  export declare function handleEvalCommand(args: ParsedArgs): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/eval/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAE3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;GAiBtB,CAAC;AAIF,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC;AAEzE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;GAexB,CAAC;AAEH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvE"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/eval/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAE3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;GAkBtB,CAAC;AAIF,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC;AAEzE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;GAgBxB,CAAC;AAEH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvE"}
@@ -14,6 +14,7 @@ const getEvalArgsSchema = defineSchema((v) => v.object({
14
14
  model: v.string().optional(),
15
15
  baselineModel: v.string().optional(),
16
16
  candidateModels: v.array(v.string()).default([]),
17
+ comparisonPolicy: v.string().optional(),
17
18
  maxOutputTokens: v.number().int().positive().optional(),
18
19
  }));
19
20
  const EvalArgsSchema = lazySchema(getEvalArgsSchema);
@@ -31,6 +32,7 @@ export const parseEvalArgs = createArgParser(EvalArgsSchema, {
31
32
  model: { keys: ["model"], type: "string" },
32
33
  baselineModel: { keys: ["baseline-model"], type: "string" },
33
34
  candidateModels: { keys: ["candidate-model", "candidate-models"], type: "array" },
35
+ comparisonPolicy: { keys: ["comparison-policy"], type: "string" },
34
36
  maxOutputTokens: { keys: ["max-output-tokens"], type: "number" },
35
37
  });
36
38
  export async function handleEvalCommand(args) {
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.955",
3
+ "version": "0.1.957",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -1 +1 @@
1
- {"version":3,"file":"openai-chat-stream.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-chat-stream.ts"],"names":[],"mappings":"AAsGA,wBAAuB,2BAA2B,CAChD,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,aAAa,CAAC,OAAO,CAAC,CAsJxB"}
1
+ {"version":3,"file":"openai-chat-stream.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-chat-stream.ts"],"names":[],"mappings":"AAuIA,wBAAuB,2BAA2B,CAChD,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,aAAa,CAAC,OAAO,CAAC,CAsJxB"}
@@ -24,12 +24,37 @@ function extractOpenAIUsage(payload) {
24
24
  const cachedTokens = promptTokensDetails?.cached_tokens;
25
25
  const completionTokensDetails = readRecord(usage.completion_tokens_details);
26
26
  const reasoningTokens = completionTokensDetails?.reasoning_tokens;
27
+ const veryfront = readRecord(usage.veryfront);
28
+ const costSource = veryfront?.cost_source;
29
+ const usageCaptureStatus = veryfront?.usage_capture_status;
27
30
  return {
28
31
  inputTokens: typeof inputTokens === "number" ? inputTokens : undefined,
29
32
  outputTokens: typeof outputTokens === "number" ? outputTokens : undefined,
30
33
  totalTokens: typeof totalTokens === "number" ? totalTokens : undefined,
31
34
  ...(typeof cachedTokens === "number" ? { cacheReadInputTokens: cachedTokens } : {}),
32
35
  ...(typeof reasoningTokens === "number" ? { reasoningTokens } : {}),
36
+ ...(typeof veryfront?.billable_input_tokens === "number"
37
+ ? { billableInputTokens: veryfront.billable_input_tokens }
38
+ : {}),
39
+ ...(typeof veryfront?.billable_output_tokens === "number"
40
+ ? { billableOutputTokens: veryfront.billable_output_tokens }
41
+ : {}),
42
+ ...(typeof veryfront?.cost_usd === "number" ? { costUsd: veryfront.cost_usd } : {}),
43
+ ...(typeof veryfront?.provider_cost_usd === "number"
44
+ ? { providerCostUsd: veryfront.provider_cost_usd }
45
+ : {}),
46
+ ...(typeof veryfront?.veryfront_charge_usd === "number"
47
+ ? { veryfrontChargeUsd: veryfront.veryfront_charge_usd }
48
+ : {}),
49
+ ...(typeof veryfront?.cost_credits === "number" ? { costCredits: veryfront.cost_credits } : {}),
50
+ ...(costSource === "gateway" || costSource === "missing" || costSource === "partial"
51
+ ? { costSource }
52
+ : {}),
53
+ ...(usageCaptureStatus === "complete" ||
54
+ usageCaptureStatus === "missing" ||
55
+ usageCaptureStatus === "partial"
56
+ ? { usageCaptureStatus }
57
+ : {}),
33
58
  };
34
59
  }
35
60
  function extractOpenAIContentText(content) {
@@ -1 +1 @@
1
- {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EACL,kBAAkB,EAMlB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EAKpB,+BAA+B,EAC/B,8BAA8B,EAC/B,MAAM,uCAAuC,CAAC;AAc/C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,+BAA+B,EAC/B,8BAA8B,GAC/B,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AA0RD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CAuClB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,EAAE,YAAY;IAEvB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,YAAY;IAYrE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,gBAAgB;IAY7E,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,YAAY;CAW1E"}
1
+ {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EACL,kBAAkB,EAMlB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EAKpB,+BAA+B,EAC/B,8BAA8B,EAC/B,MAAM,uCAAuC,CAAC;AAc/C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,+BAA+B,EAC/B,8BAA8B,GAC/B,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AA2TD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAsEd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CAuClB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,EAAE,YAAY;IAEvB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,YAAY;IAYrE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,gBAAgB;IAY7E,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,YAAY;CAW1E"}
@@ -68,12 +68,37 @@ function extractOpenAIUsage(payload) {
68
68
  const cachedTokens = promptTokensDetails?.cached_tokens;
69
69
  const completionTokensDetails = readRecord(usage.completion_tokens_details);
70
70
  const reasoningTokens = completionTokensDetails?.reasoning_tokens;
71
+ const veryfront = readRecord(usage.veryfront);
72
+ const costSource = veryfront?.cost_source;
73
+ const usageCaptureStatus = veryfront?.usage_capture_status;
71
74
  return {
72
75
  inputTokens: typeof inputTokens === "number" ? inputTokens : undefined,
73
76
  outputTokens: typeof outputTokens === "number" ? outputTokens : undefined,
74
77
  totalTokens: typeof totalTokens === "number" ? totalTokens : undefined,
75
78
  ...(typeof cachedTokens === "number" ? { cacheReadInputTokens: cachedTokens } : {}),
76
79
  ...(typeof reasoningTokens === "number" ? { reasoningTokens } : {}),
80
+ ...(typeof veryfront?.billable_input_tokens === "number"
81
+ ? { billableInputTokens: veryfront.billable_input_tokens }
82
+ : {}),
83
+ ...(typeof veryfront?.billable_output_tokens === "number"
84
+ ? { billableOutputTokens: veryfront.billable_output_tokens }
85
+ : {}),
86
+ ...(typeof veryfront?.cost_usd === "number" ? { costUsd: veryfront.cost_usd } : {}),
87
+ ...(typeof veryfront?.provider_cost_usd === "number"
88
+ ? { providerCostUsd: veryfront.provider_cost_usd }
89
+ : {}),
90
+ ...(typeof veryfront?.veryfront_charge_usd === "number"
91
+ ? { veryfrontChargeUsd: veryfront.veryfront_charge_usd }
92
+ : {}),
93
+ ...(typeof veryfront?.cost_credits === "number" ? { costCredits: veryfront.cost_credits } : {}),
94
+ ...(costSource === "gateway" || costSource === "missing" || costSource === "partial"
95
+ ? { costSource }
96
+ : {}),
97
+ ...(usageCaptureStatus === "complete" ||
98
+ usageCaptureStatus === "missing" ||
99
+ usageCaptureStatus === "partial"
100
+ ? { usageCaptureStatus }
101
+ : {}),
77
102
  };
78
103
  }
79
104
  function extractOpenAIContentText(content) {
@@ -1 +1 @@
1
- {"version":3,"file":"browser-chunk-encoder.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/ag-ui/browser-chunk-encoder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,2DAA2D;AAC3D,MAAM,WAAW,uBAAuB,CAAC,MAAM;IAC7C,KAAK,EAAE,uBAAuB,CAAC;IAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,uBAAuB,EAAE,CAAC;IACrD,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,KAAK,uBAAuB,EAAE,CAAC;CACzE;AAED,8DAA8D;AAC9D,MAAM,WAAW,oCAAoC,CAAC,MAAM;IAC1D,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,sBAAsB,EAAE,CAAC;IACvE,oBAAoB,CAAC,EAAE,CACrB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,8BAA8B,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC3D;AAkBD,0CAA0C;AAC1C,wBAAgB,6BAA6B,CAAC,MAAM,EAClD,OAAO,EAAE,oCAAoC,CAAC,MAAM,CAAC,GACpD,uBAAuB,CAAC,MAAM,CAAC,CAajC"}
1
+ {"version":3,"file":"browser-chunk-encoder.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/ag-ui/browser-chunk-encoder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,2DAA2D;AAC3D,MAAM,WAAW,uBAAuB,CAAC,MAAM;IAC7C,KAAK,EAAE,uBAAuB,CAAC;IAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,uBAAuB,EAAE,CAAC;IACrD,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,KAAK,uBAAuB,EAAE,CAAC;CACzE;AAED,8DAA8D;AAC9D,MAAM,WAAW,oCAAoC,CAAC,MAAM;IAC1D,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,sBAAsB,EAAE,CAAC;IACvE,oBAAoB,CAAC,EAAE,CACrB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,8BAA8B,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC3D;AA8CD,0CAA0C;AAC1C,wBAAgB,6BAA6B,CAAC,MAAM,EAClD,OAAO,EAAE,oCAAoC,CAAC,MAAM,CAAC,GACpD,uBAAuB,CAAC,MAAM,CAAC,CAajC"}
@@ -13,6 +13,38 @@ function mergeMetadata(target, metadata) {
13
13
  target.outputTokens = metadata.outputTokens;
14
14
  if (typeof metadata.totalTokens === "number")
15
15
  target.totalTokens = metadata.totalTokens;
16
+ if (typeof metadata.cachedInputTokens === "number") {
17
+ target.cachedInputTokens = metadata.cachedInputTokens;
18
+ }
19
+ if (typeof metadata.cacheCreationInputTokens === "number") {
20
+ target.cacheCreationInputTokens = metadata.cacheCreationInputTokens;
21
+ }
22
+ if (typeof metadata.cacheReadInputTokens === "number") {
23
+ target.cacheReadInputTokens = metadata.cacheReadInputTokens;
24
+ }
25
+ if (typeof metadata.reasoningTokens === "number") {
26
+ target.reasoningTokens = metadata.reasoningTokens;
27
+ }
28
+ if (typeof metadata.billableInputTokens === "number") {
29
+ target.billableInputTokens = metadata.billableInputTokens;
30
+ }
31
+ if (typeof metadata.billableOutputTokens === "number") {
32
+ target.billableOutputTokens = metadata.billableOutputTokens;
33
+ }
34
+ if (typeof metadata.costUsd === "number")
35
+ target.costUsd = metadata.costUsd;
36
+ if (typeof metadata.providerCostUsd === "number") {
37
+ target.providerCostUsd = metadata.providerCostUsd;
38
+ }
39
+ if (typeof metadata.veryfrontChargeUsd === "number") {
40
+ target.veryfrontChargeUsd = metadata.veryfrontChargeUsd;
41
+ }
42
+ if (typeof metadata.costCredits === "number")
43
+ target.costCredits = metadata.costCredits;
44
+ if (metadata.costSource)
45
+ target.costSource = metadata.costSource;
46
+ if (metadata.usageCaptureStatus)
47
+ target.usageCaptureStatus = metadata.usageCaptureStatus;
16
48
  if (typeof metadata.finishReason === "string")
17
49
  target.finishReason = metadata.finishReason;
18
50
  }
@@ -14,7 +14,13 @@ export interface AgUiBrowserRunFinishedMetadata {
14
14
  cacheCreationInputTokens?: number;
15
15
  cacheReadInputTokens?: number;
16
16
  reasoningTokens?: number;
17
+ billableInputTokens?: number;
18
+ billableOutputTokens?: number;
17
19
  costUsd?: number;
20
+ providerCostUsd?: number;
21
+ veryfrontChargeUsd?: number;
22
+ costCredits?: number;
23
+ costSource?: "gateway" | "missing" | "partial";
18
24
  finishReason?: string;
19
25
  usageCaptureStatus?: "complete" | "partial" | "missing";
20
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"browser-encoder.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/ag-ui/browser-encoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,8CAA8C;AAC9C,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,mEAAmE;AACnE,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CACzD;AAED,uCAAuC;AACvC,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,8BAA8B,CAAC;CAC1C;AAED,+CAA+C;AAC/C,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,8CAA8C;AAC9C,wBAAgB,6BAA6B,IAAI,uBAAuB,CAcvE;AAgLD,yDAAyD;AACzD,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,8BAA8B,GACvC,aAAa,GAAG,IAAI,CA2DtB;AAoID,wDAAwD;AACxD,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,uBAAuB,EAC9B,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,EAAE,CA+N3B;AAED,4CAA4C;AAC5C,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,uBAAuB,EAAE,CA8B3B"}
1
+ {"version":3,"file":"browser-encoder.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/ag-ui/browser-encoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,8CAA8C;AAC9C,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,mEAAmE;AACnE,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CACzD;AAED,uCAAuC;AACvC,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,8BAA8B,CAAC;CAC1C;AAED,+CAA+C;AAC/C,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,8CAA8C;AAC9C,wBAAgB,6BAA6B,IAAI,uBAAuB,CAcvE;AA4OD,yDAAyD;AACzD,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,8BAA8B,GACvC,aAAa,GAAG,IAAI,CA6EtB;AAoID,wDAAwD;AACxD,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,uBAAuB,EAC9B,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,EAAE,CA+N3B;AAED,4CAA4C;AAC5C,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,uBAAuB,EAAE,CA8B3B"}
@@ -121,6 +121,7 @@ function applyResponseMetadata(state, response) {
121
121
  state.metadata.inputTokens = response.usage.promptTokens;
122
122
  state.metadata.outputTokens = response.usage.completionTokens;
123
123
  state.metadata.totalTokens = response.usage.totalTokens;
124
+ const usage = response.usage;
124
125
  if (typeof response.usage.cachedInputTokens === "number") {
125
126
  state.metadata.cachedInputTokens = response.usage.cachedInputTokens;
126
127
  }
@@ -136,6 +137,30 @@ function applyResponseMetadata(state, response) {
136
137
  if (typeof response.usage.reasoningTokens === "number") {
137
138
  state.metadata.reasoningTokens = response.usage.reasoningTokens;
138
139
  }
140
+ if (typeof usage.billableInputTokens === "number") {
141
+ state.metadata.billableInputTokens = usage.billableInputTokens;
142
+ }
143
+ if (typeof usage.billableOutputTokens === "number") {
144
+ state.metadata.billableOutputTokens = usage.billableOutputTokens;
145
+ }
146
+ if (typeof usage.costUsd === "number") {
147
+ state.metadata.costUsd = usage.costUsd;
148
+ }
149
+ if (typeof usage.providerCostUsd === "number") {
150
+ state.metadata.providerCostUsd = usage.providerCostUsd;
151
+ }
152
+ if (typeof usage.veryfrontChargeUsd === "number") {
153
+ state.metadata.veryfrontChargeUsd = usage.veryfrontChargeUsd;
154
+ }
155
+ if (typeof usage.costCredits === "number") {
156
+ state.metadata.costCredits = usage.costCredits;
157
+ }
158
+ if (usage.costSource) {
159
+ state.metadata.costSource = usage.costSource;
160
+ }
161
+ if (usage.usageCaptureStatus) {
162
+ state.metadata.usageCaptureStatus = usage.usageCaptureStatus;
163
+ }
139
164
  }
140
165
  const metadata = response.metadata && typeof response.metadata === "object"
141
166
  ? response.metadata
@@ -148,6 +173,33 @@ function applyResponseMetadata(state, response) {
148
173
  if (typeof costUsd === "number" && Number.isFinite(costUsd) && costUsd >= 0) {
149
174
  state.metadata.costUsd = costUsd;
150
175
  }
176
+ const providerCostUsd = metadata?.providerCostUsd;
177
+ if (typeof providerCostUsd === "number" && Number.isFinite(providerCostUsd) && providerCostUsd >= 0) {
178
+ state.metadata.providerCostUsd = providerCostUsd;
179
+ }
180
+ const veryfrontChargeUsd = metadata?.veryfrontChargeUsd;
181
+ if (typeof veryfrontChargeUsd === "number" && Number.isFinite(veryfrontChargeUsd) &&
182
+ veryfrontChargeUsd >= 0) {
183
+ state.metadata.veryfrontChargeUsd = veryfrontChargeUsd;
184
+ }
185
+ const costCredits = metadata?.costCredits;
186
+ if (typeof costCredits === "number" && Number.isFinite(costCredits) && costCredits >= 0) {
187
+ state.metadata.costCredits = costCredits;
188
+ }
189
+ const billableInputTokens = metadata?.billableInputTokens;
190
+ if (typeof billableInputTokens === "number" && Number.isFinite(billableInputTokens) &&
191
+ billableInputTokens >= 0) {
192
+ state.metadata.billableInputTokens = billableInputTokens;
193
+ }
194
+ const billableOutputTokens = metadata?.billableOutputTokens;
195
+ if (typeof billableOutputTokens === "number" && Number.isFinite(billableOutputTokens) &&
196
+ billableOutputTokens >= 0) {
197
+ state.metadata.billableOutputTokens = billableOutputTokens;
198
+ }
199
+ const costSource = metadata?.costSource;
200
+ if (costSource === "gateway" || costSource === "missing" || costSource === "partial") {
201
+ state.metadata.costSource = costSource;
202
+ }
151
203
  const usageCaptureStatus = metadata?.usageCaptureStatus;
152
204
  if (usageCaptureStatus === "complete" ||
153
205
  usageCaptureStatus === "partial" ||
@@ -173,9 +225,27 @@ export function buildAgUiBrowserFinalizeResponse(metadata) {
173
225
  if (typeof metadata.reasoningTokens === "number") {
174
226
  responseMetadata.reasoningTokens = metadata.reasoningTokens;
175
227
  }
228
+ if (typeof metadata.billableInputTokens === "number") {
229
+ responseMetadata.billableInputTokens = metadata.billableInputTokens;
230
+ }
231
+ if (typeof metadata.billableOutputTokens === "number") {
232
+ responseMetadata.billableOutputTokens = metadata.billableOutputTokens;
233
+ }
176
234
  if (typeof metadata.costUsd === "number") {
177
235
  responseMetadata.costUsd = metadata.costUsd;
178
236
  }
237
+ if (typeof metadata.providerCostUsd === "number") {
238
+ responseMetadata.providerCostUsd = metadata.providerCostUsd;
239
+ }
240
+ if (typeof metadata.veryfrontChargeUsd === "number") {
241
+ responseMetadata.veryfrontChargeUsd = metadata.veryfrontChargeUsd;
242
+ }
243
+ if (typeof metadata.costCredits === "number") {
244
+ responseMetadata.costCredits = metadata.costCredits;
245
+ }
246
+ if (metadata.costSource) {
247
+ responseMetadata.costSource = metadata.costSource;
248
+ }
179
249
  if (metadata.usageCaptureStatus) {
180
250
  responseMetadata.usageCaptureStatus = metadata.usageCaptureStatus;
181
251
  }
@@ -1 +1 @@
1
- {"version":3,"file":"browser-finalize-tracker.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/ag-ui/browser-finalize-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EAEpC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,8DAA8D;AAC9D,MAAM,WAAW,0BAA0B,CAAC,MAAM;IAChD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,oBAAoB,EAAE,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,KAAK,IAAI,CAAC;IAC3E,gBAAgB,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;CAC9C;AAED,iEAAiE;AACjE,MAAM,WAAW,uCAAuC,CAAC,MAAM;IAC7D,oBAAoB,EAAE,CACpB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,8BAA8B,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CACjE;AAED,6CAA6C;AAC7C,wBAAgB,gCAAgC,CAAC,MAAM,EACrD,OAAO,EAAE,uCAAuC,CAAC,MAAM,CAAC,GACvD,0BAA0B,CAAC,MAAM,CAAC,CA6DpC"}
1
+ {"version":3,"file":"browser-finalize-tracker.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/ag-ui/browser-finalize-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EAEpC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,8DAA8D;AAC9D,MAAM,WAAW,0BAA0B,CAAC,MAAM;IAChD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,oBAAoB,EAAE,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,KAAK,IAAI,CAAC;IAC3E,gBAAgB,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;CAC9C;AAED,iEAAiE;AACjE,MAAM,WAAW,uCAAuC,CAAC,MAAM;IAC7D,oBAAoB,EAAE,CACpB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,8BAA8B,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CACjE;AAED,6CAA6C;AAC7C,wBAAgB,gCAAgC,CAAC,MAAM,EACrD,OAAO,EAAE,uCAAuC,CAAC,MAAM,CAAC,GACvD,0BAA0B,CAAC,MAAM,CAAC,CA+EpC"}