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.
- package/esm/cli/commands/eval/command-help.d.ts.map +1 -1
- package/esm/cli/commands/eval/command-help.js +5 -0
- package/esm/cli/commands/eval/command.d.ts +15 -2
- package/esm/cli/commands/eval/command.d.ts.map +1 -1
- package/esm/cli/commands/eval/command.js +158 -14
- package/esm/cli/commands/eval/handler.d.ts +2 -0
- package/esm/cli/commands/eval/handler.d.ts.map +1 -1
- package/esm/cli/commands/eval/handler.js +2 -0
- package/esm/deno.js +1 -1
- package/esm/extensions/ext-llm-openai/src/openai-chat-stream.d.ts.map +1 -1
- package/esm/extensions/ext-llm-openai/src/openai-chat-stream.js +25 -0
- package/esm/extensions/ext-llm-openai/src/openai-provider.d.ts.map +1 -1
- package/esm/extensions/ext-llm-openai/src/openai-provider.js +25 -0
- package/esm/src/agent/ag-ui/browser-chunk-encoder.d.ts.map +1 -1
- package/esm/src/agent/ag-ui/browser-chunk-encoder.js +32 -0
- package/esm/src/agent/ag-ui/browser-encoder.d.ts +6 -0
- package/esm/src/agent/ag-ui/browser-encoder.d.ts.map +1 -1
- package/esm/src/agent/ag-ui/browser-encoder.js +70 -0
- package/esm/src/agent/ag-ui/browser-finalize-tracker.d.ts.map +1 -1
- package/esm/src/agent/ag-ui/browser-finalize-tracker.js +18 -0
- package/esm/src/agent/runtime/chat-stream-handler.d.ts +16 -0
- package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
- package/esm/src/agent/runtime/chat-stream-handler.js +24 -0
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +8 -0
- package/esm/src/agent/runtime/input-utils.d.ts +16 -0
- package/esm/src/agent/runtime/input-utils.d.ts.map +1 -1
- package/esm/src/agent/runtime/input-utils.js +29 -0
- package/esm/src/agent/runtime/runtime-tool-types.d.ts +16 -0
- package/esm/src/agent/runtime/runtime-tool-types.d.ts.map +1 -1
- package/esm/src/agent/schemas/agent.schema.d.ts +8 -0
- package/esm/src/agent/schemas/agent.schema.d.ts.map +1 -1
- package/esm/src/agent/schemas/agent.schema.js +8 -0
- package/esm/src/eval/agent-service.d.ts.map +1 -1
- package/esm/src/eval/agent-service.js +39 -1
- package/esm/src/eval/index.d.ts +1 -1
- package/esm/src/eval/index.d.ts.map +1 -1
- package/esm/src/eval/metrics.d.ts.map +1 -1
- package/esm/src/eval/metrics.js +7 -2
- package/esm/src/eval/model-comparison.d.ts.map +1 -1
- package/esm/src/eval/model-comparison.js +229 -7
- package/esm/src/eval/report.d.ts.map +1 -1
- package/esm/src/eval/report.js +42 -4
- package/esm/src/eval/studio.d.ts +22 -0
- package/esm/src/eval/studio.d.ts.map +1 -1
- package/esm/src/eval/studio.js +11 -0
- package/esm/src/eval/types.d.ts +52 -0
- package/esm/src/eval/types.d.ts.map +1 -1
- package/esm/src/runtime/runtime-bridge.d.ts.map +1 -1
- package/esm/src/runtime/runtime-bridge.js +60 -0
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- 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,
|
|
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
|
|
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":"AAOA,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EACV,cAAc,EAGd,mBAAmB,EAEnB,UAAU,EACV,oBAAoB,EAEpB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAmBpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,WAAY,SAAQ,QAAQ;CAAG;AAEhD,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;CAC3C,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,sBAAsB,GAAG,iBAAiB,GAAG;IAChD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AASF,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CACjC,CAAC;
|
|
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("&", "&")
|
|
@@ -135,8 +146,135 @@ export function createSummaryArtifact(report, baseline) {
|
|
|
135
146
|
...(baseline ? { baseline } : {}),
|
|
136
147
|
};
|
|
137
148
|
}
|
|
138
|
-
|
|
139
|
-
return
|
|
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
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-chat-stream.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-llm-openai/src/openai-chat-stream.ts"],"names":[],"mappings":"
|
|
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;
|
|
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;
|
|
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;
|
|
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,
|
|
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"}
|