axiom 0.47.0 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/bin.js +5 -5
- package/dist/{chunk-6ZENNC22.js → chunk-2XPPXCZ6.js} +3 -3
- package/dist/{chunk-UC6L4N6L.js → chunk-73F2PMAH.js} +2 -2
- package/dist/chunk-73F2PMAH.js.map +1 -0
- package/dist/{chunk-YI2FANTF.js → chunk-FGLJO4BD.js} +2 -2
- package/dist/chunk-FGLJO4BD.js.map +1 -0
- package/dist/{chunk-QRQVSBSO.js → chunk-GLBE32GY.js} +2 -2
- package/dist/{chunk-YDN5Y5PQ.js → chunk-K3QLV6H6.js} +13 -11
- package/dist/{chunk-YDN5Y5PQ.js.map → chunk-K3QLV6H6.js.map} +1 -1
- package/dist/{chunk-ZVK56UI7.js → chunk-OFLP2IHA.js} +3 -3
- package/dist/chunk-OFLP2IHA.js.map +1 -0
- package/dist/{chunk-D6ALFB7B.js → chunk-XVXJZJJN.js} +7 -7
- package/dist/chunk-XVXJZJJN.js.map +1 -0
- package/dist/docs/README.md +13 -0
- package/dist/docs/config/README.md +19 -0
- package/dist/docs/config/functions/defineConfig.md +41 -0
- package/dist/docs/config/interfaces/AxiomConfig.md +139 -0
- package/dist/docs/config/type-aliases/AxiomEvalInstrumentationHook.md +34 -0
- package/dist/docs/evals/README.md +29 -0
- package/dist/docs/evals/classes/AxiomReporter.md +153 -0
- package/dist/docs/evals/functions/Eval.md +80 -0
- package/dist/docs/evals/interfaces/EvalBuilder.md +114 -0
- package/dist/docs/evals/interfaces/EvalContextData.md +65 -0
- package/dist/docs/evals/online/README.md +19 -0
- package/dist/docs/evals/online/functions/onlineEval.md +95 -0
- package/dist/docs/evals/online/type-aliases/OnlineEvalParams.md +77 -0
- package/dist/docs/evals/online/type-aliases/OnlineEvalScorerEntry.md +23 -0
- package/dist/docs/evals/online/type-aliases/OnlineEvalScorerInput.md +23 -0
- package/dist/docs/evals/online/type-aliases/SampledOnlineEvalScorer.md +35 -0
- package/dist/docs/evals/online/type-aliases/ScorerSampling.md +21 -0
- package/dist/docs/evals/type-aliases/Case.md +89 -0
- package/dist/docs/evals/type-aliases/Chat.md +69 -0
- package/dist/docs/evals/type-aliases/EvalParams.md +97 -0
- package/dist/docs/evals/type-aliases/EvalTask.md +58 -0
- package/dist/docs/evals/type-aliases/Evaluation.md +131 -0
- package/dist/docs/evals/type-aliases/Task.md +45 -0
- package/dist/docs/feedback/README.md +26 -0
- package/dist/docs/feedback/functions/createFeedbackClient.md +35 -0
- package/dist/docs/feedback/type-aliases/FeedbackClient.md +19 -0
- package/dist/docs/feedback/type-aliases/FeedbackConfig.md +45 -0
- package/dist/docs/feedback/type-aliases/FeedbackErrorContext.md +21 -0
- package/dist/docs/feedback/type-aliases/FeedbackEvent.md +11 -0
- package/dist/docs/feedback/type-aliases/FeedbackInput.md +11 -0
- package/dist/docs/feedback/type-aliases/FeedbackLinks.md +59 -0
- package/dist/docs/feedback/type-aliases/FeedbackSettings.md +29 -0
- package/dist/docs/feedback/type-aliases/SendFeedbackFn.md +25 -0
- package/dist/docs/feedback/variables/Feedback.md +155 -0
- package/dist/docs/index/README.md +51 -0
- package/dist/docs/index/functions/axiomAIMiddleware.md +61 -0
- package/dist/docs/index/functions/axiomAIMiddlewareV1.md +15 -0
- package/dist/docs/index/functions/axiomAIMiddlewareV2.md +15 -0
- package/dist/docs/index/functions/axiomAIMiddlewareV3.md +15 -0
- package/dist/docs/index/functions/createAppScope.md +73 -0
- package/dist/docs/index/functions/experimental_parse.md +37 -0
- package/dist/docs/index/functions/getGlobalTracer.md +16 -0
- package/dist/docs/index/functions/initAxiomAI.md +35 -0
- package/dist/docs/index/functions/resetAxiomAI.md +15 -0
- package/dist/docs/index/functions/withSpan.md +41 -0
- package/dist/docs/index/functions/wrapAISDKModel.md +33 -0
- package/dist/docs/index/functions/wrapTool.md +37 -0
- package/dist/docs/index/functions/wrapTools.md +31 -0
- package/dist/docs/index/interfaces/AxiomTelemetryConfig.md +7 -0
- package/dist/docs/index/interfaces/experimental_AxiomPromptMetadata.md +53 -0
- package/dist/docs/index/interfaces/experimental_ParsedMessage.md +83 -0
- package/dist/docs/index/type-aliases/AxiomAIRedactionPolicy.md +21 -0
- package/dist/docs/index/type-aliases/WithSpanOptions.md +35 -0
- package/dist/docs/index/type-aliases/experimental_InferContext.md +19 -0
- package/dist/docs/index/type-aliases/experimental_InferSchema.md +17 -0
- package/dist/docs/index/type-aliases/experimental_ParsedMessagesArray.md +32 -0
- package/dist/docs/index/type-aliases/experimental_Prompt.md +90 -0
- package/dist/docs/index/type-aliases/experimental_TSchema.md +21 -0
- package/dist/docs/index/variables/RedactionPolicy.md +41 -0
- package/dist/docs/index/variables/experimental_Type.md +263 -0
- package/dist/docs/index/variables/onlineEval.md +13 -0
- package/dist/evals/online.d.ts +2 -2
- package/dist/evals/online.js +3 -3
- package/dist/evals.d.ts +3 -8
- package/dist/evals.js +7 -21
- package/dist/evals.js.map +1 -1
- package/dist/index.d.ts +3 -8
- package/dist/index.js +14 -16
- package/dist/index.js.map +1 -1
- package/dist/{name-validation.d-DzPxDeTs.d.ts → name-validation.d-BKPGh6r3.d.ts} +2 -2
- package/dist/{run-vitest-H3HHFEZD.js → run-vitest-SXLVVZVU.js} +5 -5
- package/dist/{evals → scorers}/aggregations.js +1 -1
- package/dist/{evals → scorers}/scorers.d.ts +3 -3
- package/dist/{chunk-RJUMGCBS.js → scorers/scorers.js} +6 -5
- package/dist/scorers/scorers.js.map +1 -0
- package/package.json +12 -10
- package/dist/chunk-D6ALFB7B.js.map +0 -1
- package/dist/chunk-QZSERPBT.js +0 -23
- package/dist/chunk-QZSERPBT.js.map +0 -1
- package/dist/chunk-RJUMGCBS.js.map +0 -1
- package/dist/chunk-UC6L4N6L.js.map +0 -1
- package/dist/chunk-YI2FANTF.js.map +0 -1
- package/dist/chunk-ZVK56UI7.js.map +0 -1
- package/dist/evals/scorers.js +0 -10
- package/dist/evals/scorers.js.map +0 -1
- /package/dist/{chunk-6ZENNC22.js.map → chunk-2XPPXCZ6.js.map} +0 -0
- /package/dist/{chunk-QRQVSBSO.js.map → chunk-GLBE32GY.js.map} +0 -0
- /package/dist/{run-vitest-H3HHFEZD.js.map → run-vitest-SXLVVZVU.js.map} +0 -0
- /package/dist/{evals → scorers}/aggregations.d.ts +0 -0
- /package/dist/{evals → scorers}/aggregations.js.map +0 -0
package/README.md
CHANGED
|
@@ -83,7 +83,7 @@ For running scorers in production (without vitest dependency):
|
|
|
83
83
|
|
|
84
84
|
```ts
|
|
85
85
|
import { withSpan } from 'axiom/ai';
|
|
86
|
-
import { Scorer } from 'axiom/ai/
|
|
86
|
+
import { Scorer } from 'axiom/ai/scorers';
|
|
87
87
|
import { onlineEval } from 'axiom/ai/evals/online';
|
|
88
88
|
|
|
89
89
|
const formatScorer = Scorer('format-check', ({ output }: { output: string }) => {
|
package/dist/bin.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
extractOverrides,
|
|
4
4
|
loadEvalCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2XPPXCZ6.js";
|
|
6
6
|
import {
|
|
7
7
|
OAuth,
|
|
8
8
|
fetchOrganizations,
|
|
@@ -15,11 +15,11 @@ import {
|
|
|
15
15
|
verifyToken,
|
|
16
16
|
waitForCallback
|
|
17
17
|
} from "./chunk-3VKWOZAQ.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-GLBE32GY.js";
|
|
19
19
|
import {
|
|
20
20
|
AxiomCLIError
|
|
21
21
|
} from "./chunk-ISSDOC43.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-K3QLV6H6.js";
|
|
23
23
|
import "./chunk-MM5FFQJT.js";
|
|
24
24
|
import "./chunk-4TKUTT24.js";
|
|
25
25
|
import "./chunk-KEXKKQVW.js";
|
|
@@ -389,7 +389,7 @@ import { Command } from "commander";
|
|
|
389
389
|
var loadVersionCommand = (program2) => {
|
|
390
390
|
return program2.addCommand(
|
|
391
391
|
new Command("version").description("cli version").action(() => {
|
|
392
|
-
console.log("0.
|
|
392
|
+
console.log("0.48.0");
|
|
393
393
|
})
|
|
394
394
|
);
|
|
395
395
|
};
|
|
@@ -399,7 +399,7 @@ var { loadEnvConfig } = pkg;
|
|
|
399
399
|
loadEnvConfig(process.cwd());
|
|
400
400
|
var { cleanedArgv, overrides } = extractOverrides(process.argv.slice(2));
|
|
401
401
|
var program = new Command2();
|
|
402
|
-
program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.
|
|
402
|
+
program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.48.0");
|
|
403
403
|
program.hook("preAction", async (_, actionCommand) => {
|
|
404
404
|
const commandName = actionCommand.name();
|
|
405
405
|
const parentCommand = actionCommand.parent;
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
putOnSpan,
|
|
17
17
|
setGlobalFlagOverrides,
|
|
18
18
|
withEvalContext
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-GLBE32GY.js";
|
|
20
20
|
import {
|
|
21
21
|
AxiomCLIError,
|
|
22
22
|
errorToString
|
|
@@ -422,7 +422,7 @@ var loadEvalCommand = (program, flagOverrides = {}) => {
|
|
|
422
422
|
consoleUrl = options.consoleUrl;
|
|
423
423
|
let runVitestModule;
|
|
424
424
|
try {
|
|
425
|
-
runVitestModule = await import("./run-vitest-
|
|
425
|
+
runVitestModule = await import("./run-vitest-SXLVVZVU.js");
|
|
426
426
|
} catch (err) {
|
|
427
427
|
if (err && typeof err === "object" && "code" in err && (err.code === "ERR_MODULE_NOT_FOUND" || err.code === "MODULE_NOT_FOUND")) {
|
|
428
428
|
throw new AxiomCLIError("Failed to load vitest.");
|
|
@@ -465,4 +465,4 @@ export {
|
|
|
465
465
|
getConsoleUrl,
|
|
466
466
|
loadEvalCommand
|
|
467
467
|
};
|
|
468
|
-
//# sourceMappingURL=chunk-
|
|
468
|
+
//# sourceMappingURL=chunk-2XPPXCZ6.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/
|
|
1
|
+
// src/scorers/aggregations.ts
|
|
2
2
|
var Mean = () => ({
|
|
3
3
|
type: "mean",
|
|
4
4
|
aggregate: (scores) => scores.length === 0 ? 0 : scores.reduce((a, b) => a + b, 0) / scores.length
|
|
@@ -39,4 +39,4 @@ export {
|
|
|
39
39
|
AtLeastOneTrialPasses,
|
|
40
40
|
AllTrialsPass
|
|
41
41
|
};
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
42
|
+
//# sourceMappingURL=chunk-73F2PMAH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scorers/aggregations.ts"],"sourcesContent":["/**\n * Aggregation functions for combining scores across multiple trials.\n *\n * Aggregators are functions that return a serializable config plus an `aggregate` function.\n * The config is stored on spans for UI display, while the function performs the actual computation.\n */\n\n/**\n * Base type for aggregation configuration.\n * Contains a `type` identifier and an `aggregate` function for computing the final score.\n */\nexport type Aggregation<T extends string = string> = {\n type: T;\n threshold?: number;\n aggregate: (scores: number[]) => number;\n};\n\n/**\n * Computes the arithmetic mean of all trial scores.\n *\n * @example\n * ```typescript\n * Scorer('accuracy', fn, { aggregation: Mean() })\n * // scores [0.8, 0.6, 0.7] => 0.7\n * ```\n */\nexport const Mean = (): Aggregation<'mean'> => ({\n type: 'mean' as const,\n aggregate: (scores: number[]) =>\n scores.length === 0 ? 0 : scores.reduce((a, b) => a + b, 0) / scores.length,\n});\n\n/**\n * Computes the median of all trial scores.\n *\n * @example\n * ```typescript\n * Scorer('latency', fn, { aggregation: Median() })\n * // scores [0.3, 0.9, 0.5] => 0.5\n * ```\n */\nexport const Median = (): Aggregation<'median'> => ({\n type: 'median' as const,\n aggregate: (scores: number[]) => {\n if (scores.length === 0) return 0;\n const sorted = [...scores].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n },\n});\n\n/**\n * Returns 1 if at least one trial score meets or exceeds the threshold, 0 otherwise.\n * Also known as \"pass@k\" in evaluation literature.\n *\n * @param opts.threshold - The minimum score required for a trial to pass\n *\n * @example\n * ```typescript\n * Scorer('tool-called', fn, { aggregation: PassAtK({ threshold: 0.8 }) })\n * // scores [0.5, 0.9, 0.6] => 1 (0.9 >= 0.8)\n * // scores [0.5, 0.6, 0.7] => 0 (none >= 0.8)\n * ```\n */\nexport const PassAtK = (opts: { threshold?: number } = {}): Aggregation<'pass@k'> => {\n const threshold = opts.threshold ?? 1;\n return {\n type: 'pass@k' as const,\n threshold,\n aggregate: (scores: number[]) => (scores.some((s) => s >= threshold) ? 1 : 0),\n };\n};\n\n/**\n * Returns 1 if all trial scores meet or exceed the threshold, 0 otherwise.\n * Also known as \"pass^k\" in evaluation literature.\n *\n * @param opts.threshold - The minimum score required for all trials to pass\n *\n * @example\n * ```typescript\n * Scorer('consistency', fn, { aggregation: PassHatK({ threshold: 0.9 }) })\n * // scores [0.95, 0.92, 0.91] => 1 (all >= 0.9)\n * // scores [0.95, 0.85, 0.91] => 0 (0.85 < 0.9)\n * ```\n */\nexport const PassHatK = (opts: { threshold?: number } = {}): Aggregation<'pass^k'> => {\n const threshold = opts.threshold ?? 1;\n return {\n type: 'pass^k' as const,\n threshold,\n aggregate: (scores: number[]) =>\n scores.length === 0 ? 0 : scores.every((s) => s >= threshold) ? 1 : 0,\n };\n};\n\n/**\n * User-friendly alias for PassAtK.\n * Returns 1 if at least one trial passes, 0 otherwise.\n *\n * @example\n * ```typescript\n * Scorer('tool-called', fn, { aggregation: AtLeastOneTrialPasses({ threshold: 0.8 }) })\n * ```\n */\nexport const AtLeastOneTrialPasses = PassAtK;\n\n/**\n * User-friendly alias for PassHatK.\n * Returns 1 if all trials pass, 0 otherwise.\n *\n * @example\n * ```typescript\n * Scorer('consistency', fn, { aggregation: AllTrialsPass({ threshold: 0.9 }) })\n * ```\n */\nexport const AllTrialsPass = PassHatK;\n"],"mappings":";AA0BO,IAAM,OAAO,OAA4B;AAAA,EAC9C,MAAM;AAAA,EACN,WAAW,CAAC,WACV,OAAO,WAAW,IAAI,IAAI,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO;AACzE;AAWO,IAAM,SAAS,OAA8B;AAAA,EAClD,MAAM;AAAA,EACN,WAAW,CAAC,WAAqB;AAC/B,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,UAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC/C,UAAM,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC;AACxC,WAAO,OAAO,SAAS,IAAI,OAAO,GAAG,KAAK,OAAO,MAAM,CAAC,IAAI,OAAO,GAAG,KAAK;AAAA,EAC7E;AACF;AAeO,IAAM,UAAU,CAAC,OAA+B,CAAC,MAA6B;AACnF,QAAM,YAAY,KAAK,aAAa;AACpC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,WAAW,CAAC,WAAsB,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI;AAAA,EAC7E;AACF;AAeO,IAAM,WAAW,CAAC,OAA+B,CAAC,MAA6B;AACpF,QAAM,YAAY,KAAK,aAAa;AACpC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,WAAW,CAAC,WACV,OAAO,WAAW,IAAI,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI;AAAA,EACxE;AACF;AAWO,IAAM,wBAAwB;AAW9B,IAAM,gBAAgB;","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
Attr
|
|
3
3
|
} from "./chunk-4TKUTT24.js";
|
|
4
4
|
|
|
5
|
-
// src/
|
|
5
|
+
// src/scorers/normalize-score.ts
|
|
6
6
|
function normalizeBooleanScore(score, metadata) {
|
|
7
7
|
if (typeof score !== "boolean") {
|
|
8
8
|
return { score, metadata };
|
|
@@ -16,4 +16,4 @@ function normalizeBooleanScore(score, metadata) {
|
|
|
16
16
|
export {
|
|
17
17
|
normalizeBooleanScore
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=chunk-
|
|
19
|
+
//# sourceMappingURL=chunk-FGLJO4BD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scorers/normalize-score.ts"],"sourcesContent":["import { Attr } from '../otel/semconv/attributes';\nimport type { Score } from './scorer.types';\n\n/**\n * Normalizes a boolean score to numeric (1/0) and adds eval.score.is_boolean\n * to metadata. Numbers and null pass through unchanged.\n */\nexport function normalizeBooleanScore(\n score: Score['score'],\n metadata?: Record<string, unknown>,\n): { score: number | null; metadata?: Record<string, unknown> } {\n if (typeof score !== 'boolean') {\n return { score, metadata };\n }\n return {\n score: score ? 1 : 0,\n metadata: { ...metadata, [Attr.Eval.Score.IsBoolean]: true },\n };\n}\n"],"mappings":";;;;;AAOO,SAAS,sBACd,OACA,UAC8D;AAC9D,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,EAAE,OAAO,SAAS;AAAA,EAC3B;AACA,SAAO;AAAA,IACL,OAAO,QAAQ,IAAI;AAAA,IACnB,UAAU,EAAE,GAAG,UAAU,CAAC,KAAK,KAAK,MAAM,SAAS,GAAG,KAAK;AAAA,EAC7D;AACF;","names":[]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
getRedactionPolicy,
|
|
6
6
|
handleMaybeRedactedAttribute,
|
|
7
7
|
package_default
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-K3QLV6H6.js";
|
|
9
9
|
import {
|
|
10
10
|
isValidName
|
|
11
11
|
} from "./chunk-MM5FFQJT.js";
|
|
@@ -3099,4 +3099,4 @@ export {
|
|
|
3099
3099
|
withEvalContext,
|
|
3100
3100
|
getConfigScope
|
|
3101
3101
|
};
|
|
3102
|
-
//# sourceMappingURL=chunk-
|
|
3102
|
+
//# sourceMappingURL=chunk-GLBE32GY.js.map
|
|
@@ -62,7 +62,7 @@ import { trace } from "@opentelemetry/api";
|
|
|
62
62
|
// package.json
|
|
63
63
|
var package_default = {
|
|
64
64
|
name: "axiom",
|
|
65
|
-
version: "0.
|
|
65
|
+
version: "0.48.0",
|
|
66
66
|
type: "module",
|
|
67
67
|
author: "Axiom, Inc.",
|
|
68
68
|
contributors: [
|
|
@@ -72,7 +72,7 @@ var package_default = {
|
|
|
72
72
|
],
|
|
73
73
|
scripts: {
|
|
74
74
|
dev: "tsup --watch",
|
|
75
|
-
build: "tsup && chmod +x dist/bin.js && pnpm check:vitest-entrypoints",
|
|
75
|
+
build: "tsup && chmod +x dist/bin.js && typedoc && pnpm check:vitest-entrypoints",
|
|
76
76
|
"check:vitest-entrypoints": "node ./scripts/check-vitest-entrypoints.mjs",
|
|
77
77
|
format: "prettier --write .",
|
|
78
78
|
"format:check": "prettier --check .",
|
|
@@ -98,18 +98,18 @@ var package_default = {
|
|
|
98
98
|
types: "./dist/evals.d.ts",
|
|
99
99
|
default: "./dist/evals.js"
|
|
100
100
|
},
|
|
101
|
-
"./ai/evals/aggregations": {
|
|
102
|
-
types: "./dist/evals/aggregations.d.ts",
|
|
103
|
-
default: "./dist/evals/aggregations.js"
|
|
104
|
-
},
|
|
105
|
-
"./ai/evals/scorers": {
|
|
106
|
-
types: "./dist/evals/scorers.d.ts",
|
|
107
|
-
default: "./dist/evals/scorers.js"
|
|
108
|
-
},
|
|
109
101
|
"./ai/evals/online": {
|
|
110
102
|
types: "./dist/evals/online.d.ts",
|
|
111
103
|
default: "./dist/evals/online.js"
|
|
112
104
|
},
|
|
105
|
+
"./ai/scorers": {
|
|
106
|
+
types: "./dist/scorers/scorers.d.ts",
|
|
107
|
+
default: "./dist/scorers/scorers.js"
|
|
108
|
+
},
|
|
109
|
+
"./ai/scorers/aggregations": {
|
|
110
|
+
types: "./dist/scorers/aggregations.d.ts",
|
|
111
|
+
default: "./dist/scorers/aggregations.js"
|
|
112
|
+
},
|
|
113
113
|
"./ai/config": {
|
|
114
114
|
types: "./dist/config.d.ts",
|
|
115
115
|
default: "./dist/config.js"
|
|
@@ -180,6 +180,8 @@ var package_default = {
|
|
|
180
180
|
prettier: "catalog:",
|
|
181
181
|
tinyrainbow: "^2.0.0",
|
|
182
182
|
tsup: "catalog:",
|
|
183
|
+
typedoc: "^0.28.17",
|
|
184
|
+
"typedoc-plugin-markdown": "^4.10.0",
|
|
183
185
|
typescript: "catalog:",
|
|
184
186
|
vitest: "catalog:",
|
|
185
187
|
zod: "catalog:"
|
|
@@ -251,4 +253,4 @@ export {
|
|
|
251
253
|
getGlobalTracer,
|
|
252
254
|
resetAxiomAI
|
|
253
255
|
};
|
|
254
|
-
//# sourceMappingURL=chunk-
|
|
256
|
+
//# sourceMappingURL=chunk-K3QLV6H6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/otel/utils/redaction.ts","../src/otel/withSpanBaggageKey.ts","../src/otel/initAxiomAI.ts","../package.json"],"sourcesContent":["import { context, propagation, type Baggage, type Span } from '@opentelemetry/api';\nimport { WITHSPAN_REDACTION_POLICY_KEY } from '../withSpanBaggageKey';\n\ntype CaptureMessageContent = 'full' | 'off';\n\nexport type AxiomAIRedactionPolicy = {\n captureMessageContent?: CaptureMessageContent;\n mirrorToolPayloadOnToolSpan?: boolean;\n};\n\nexport const RedactionPolicy = {\n /**\n * Includes message content on chat spans, and mirrors tool\n * payload on tool spans for more convenient querying.\n */\n AxiomDefault: {\n captureMessageContent: 'full',\n mirrorToolPayloadOnToolSpan: true,\n },\n /**\n * Redacts message content on chat spans, and does not put\n * tool payload on tool spans.\n */\n OpenTelemetryDefault: {\n captureMessageContent: 'off',\n mirrorToolPayloadOnToolSpan: false,\n },\n} as const satisfies Record<string, AxiomAIRedactionPolicy>;\n\n// Global key to store redaction policy across all execution contexts\nexport const AXIOM_AI_REDACTION_KEY = Symbol.for('__axiom_ai_redaction__');\n\n/**\n * Get the globally stored redaction policy\n * @returns The global redaction policy or undefined if not set\n */\nfunction getGlobalRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n return (globalThis as any)[AXIOM_AI_REDACTION_KEY];\n}\n\n/**\n * Resolves the effective redaction policy by merging global and per-call policies.\n * Per-call policies take precedence over global policies.\n *\n * @param globalPolicy - The global redaction policy from initAxiomAI\n * @param localPolicy - The per-call redaction policy from withSpan or middleware\n * @returns The effective redaction policy with all fields resolved\n */\nfunction getEffectiveRedactionPolicy(\n globalPolicy?: AxiomAIRedactionPolicy,\n localPolicy?: AxiomAIRedactionPolicy,\n): AxiomAIRedactionPolicy {\n // Per-call policy overrides global policy, with defaults\n return {\n captureMessageContent:\n localPolicy?.captureMessageContent ??\n globalPolicy?.captureMessageContent ??\n RedactionPolicy.AxiomDefault.captureMessageContent,\n mirrorToolPayloadOnToolSpan:\n localPolicy?.mirrorToolPayloadOnToolSpan ??\n globalPolicy?.mirrorToolPayloadOnToolSpan ??\n RedactionPolicy.AxiomDefault.mirrorToolPayloadOnToolSpan,\n };\n}\n\n/**\n * Get the active redaction policy\n */\nexport function getRedactionPolicy() {\n return getEffectiveRedactionPolicy(getGlobalRedactionPolicy(), getPerCallRedactionPolicy());\n}\n\n/**\n * Conditionally sets a span attribute based on the capture message content policy.\n * When policy is 'off', the attribute is not set at all.\n *\n * @param span - The OpenTelemetry span to set the attribute on\n * @param attribute - The attribute name/key\n * @param value - The attribute value\n * @param captureMessageContent - The capture policy ('full' sets attribute, 'off' skips it)\n */\nexport function handleMaybeRedactedAttribute(\n span: Span,\n attribute: string,\n value: any,\n captureMessageContent?: CaptureMessageContent,\n): void {\n if (captureMessageContent === 'full') {\n span.setAttribute(attribute, value);\n }\n\n // For 'off', don't set the attribute at all\n // Future: Could add callback-based redaction here\n}\n\n/**\n * Extracts the per-call redaction policy from OpenTelemetry baggage context.\n * This allows middleware and tools to access redaction policies passed via withSpan.\n *\n * @returns The per-call redaction policy or undefined if not set\n */\nfunction getPerCallRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n const baggage: Baggage = propagation.getBaggage(context.active()) || propagation.createBaggage();\n const serializedPolicy = baggage.getEntry(WITHSPAN_REDACTION_POLICY_KEY)?.value;\n\n if (!serializedPolicy) {\n return undefined;\n }\n\n try {\n return JSON.parse(serializedPolicy) as AxiomAIRedactionPolicy;\n } catch (error) {\n console.warn('[AxiomAI] Failed to parse redaction policy from baggage:', error);\n return undefined;\n }\n}\n","/**\n * We need a way to know that we're inside `withSpan`\n * Because we don't own `generateText` and similar functions,\n * we use OTel Baggage to propagate this information. Another\n * consideration might be to use AsyncLocalStorage in Node and\n * some kind of KV in workerd.\n */\nexport const WITHSPAN_BAGGAGE_KEY = '__withspan_gen_ai_call';\nexport const WITHSPAN_REDACTION_POLICY_KEY = '__withspan_redaction_policy';\n","import type { Tracer } from '@opentelemetry/api';\nimport { trace } from '@opentelemetry/api';\nimport packageJson from '../../package.json';\nimport { AXIOM_AI_REDACTION_KEY, type AxiomAIRedactionPolicy } from './utils/redaction';\n\n// Global key to store tracer scope information across all execution contexts\nconst AXIOM_AI_SCOPE_KEY = Symbol.for('__axiom_ai_scope__');\n\ninterface TracerScope {\n name: string;\n version?: string;\n}\n\n/**\n * Extract scope information from a tracer, with fallback to package.json\n */\nfunction extractTracerScope(tracer: Tracer): TracerScope {\n const tracerAny = tracer as any;\n\n // Guard access to private fields with optional chaining\n // Note: These are internal OTEL fields that may change in future versions\n // _instrumentationScope is modern, instrumentationLibrary is legacy (<1.16)\n const name =\n tracerAny._instrumentationScope?.name ||\n tracerAny.instrumentationLibrary?.name ||\n packageJson.name;\n\n const version =\n tracerAny._instrumentationScope?.version ||\n tracerAny.instrumentationLibrary?.version ||\n packageJson.version;\n\n return { name, version };\n}\n\n/**\n * Register this in your `instrumentation.ts` to set up axiom.\n * This function stores the tracer's scope information globally to enable Context Propagation\n * and Instrumentation Scope. The tracer will be available across all execution contexts including Next.js.\n *\n * This function is idempotent - calling it multiple times with the same scope has no additional cost.\n *\n * @param config\n * @param config.tracer - The tracer that you are using in your application.\n * @param config.redactionPolicy - Optional redaction policy to control what data is captured in spans.\n */\nexport function initAxiomAI(config: { tracer: Tracer; redactionPolicy?: AxiomAIRedactionPolicy }) {\n const newScope = extractTracerScope(config.tracer);\n const existingScope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Check if already initialized with same scope (idempotent behavior)\n if (\n existingScope &&\n existingScope.name === newScope.name &&\n existingScope.version === newScope.version\n ) {\n return;\n }\n\n // Warn about double initialization with different scopes\n if (existingScope) {\n console.warn(\n '[AxiomAI] initAxiomAI() called multiple times with different scopes. ' +\n `Previous: ${existingScope.name}@${existingScope.version}, ` +\n `New: ${newScope.name}@${newScope.version}`,\n );\n }\n\n // Store scope information globally (works across Next.js contexts)\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = newScope;\n\n // Store redaction policy globally if provided\n if (config.redactionPolicy) {\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = config.redactionPolicy;\n }\n}\n\n/**\n * Get a tracer using the globally stored scope information\n * Fall back to package.json defaults if not set\n */\nexport function getGlobalTracer(): Tracer {\n // Get stored scope information or fall back to package defaults\n const scope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Warn if initAxiomAI was never called\n if (!scope) {\n const isDebug = process.env.AXIOM_DEBUG === 'true';\n if (!isDebug) {\n console.warn(\n '[AxiomAI] AXIOM_AI_SCOPE_KEY is undefined. This probably means that ' +\n 'initAxiomAI() was never called. ' +\n 'Make sure to call initAxiomAI({ tracer }) in your instrumentation setup.',\n );\n }\n }\n\n let { name, version } = scope || { name: packageJson.name, version: packageJson.version };\n\n if (!name || !version) {\n name = packageJson.name;\n version = packageJson.version;\n if (!name || !version) {\n name = 'axiom';\n version = 'unknown';\n }\n }\n\n // Use OpenTelemetry's standard global provider mechanism\n return trace.getTracer(name, version);\n}\n\n/**\n * Reset AxiomAI configuration (useful for testing)\n */\nexport function resetAxiomAI() {\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = undefined;\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = undefined;\n}\n","{\n \"name\": \"axiom\",\n \"version\": \"0.47.0\",\n \"type\": \"module\",\n \"author\": \"Axiom, Inc.\",\n \"contributors\": [\n \"Islam Shehata <islam@axiom.co>\",\n \"Chris Ehrlich <chris@axiom.co>\",\n \"Gabriel de Andrade <gabriel@axiom.co>\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup && chmod +x dist/bin.js && pnpm check:vitest-entrypoints\",\n \"check:vitest-entrypoints\": \"node ./scripts/check-vitest-entrypoints.mjs\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint './**/*.{js,ts}'\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest --watch\",\n \"test:wrangler-smoke\": \"pnpm build && vitest run --config vitest.smoke.config.ts\",\n \"publint\": \"npx publint\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"bin\": {\n \"axiom\": \"./dist/bin.js\"\n },\n \"exports\": {\n \"./ai\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./ai/evals\": {\n \"types\": \"./dist/evals.d.ts\",\n \"default\": \"./dist/evals.js\"\n },\n \"./ai/evals/aggregations\": {\n \"types\": \"./dist/evals/aggregations.d.ts\",\n \"default\": \"./dist/evals/aggregations.js\"\n },\n \"./ai/evals/scorers\": {\n \"types\": \"./dist/evals/scorers.d.ts\",\n \"default\": \"./dist/evals/scorers.js\"\n },\n \"./ai/evals/online\": {\n \"types\": \"./dist/evals/online.d.ts\",\n \"default\": \"./dist/evals/online.js\"\n },\n \"./ai/config\": {\n \"types\": \"./dist/config.d.ts\",\n \"default\": \"./dist/config.js\"\n },\n \"./ai/feedback\": {\n \"types\": \"./dist/feedback.d.ts\",\n \"default\": \"./dist/feedback.js\"\n }\n },\n \"keywords\": [\n \"axiom\",\n \"logging\",\n \"ai\",\n \"otel\",\n \"opentelemetry\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/axiomhq/ai.git\",\n \"directory\": \"packages/ai\"\n },\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@next/env\": \"^15.4.2\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.60.1\",\n \"@opentelemetry/context-async-hooks\": \"^2.0.1\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.202.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.38.0\",\n \"@sinclair/typebox\": \"^0.34.37\",\n \"c12\": \"^3.3.3\",\n \"commander\": \"^14.0.0\",\n \"defu\": \"^6.1.4\",\n \"handlebars\": \"^4.7.8\",\n \"nanoid\": \"^5.1.5\",\n \"open\": \"^10.1.0\",\n \"vite-tsconfig-paths\": \"^5.1.4\",\n \"vitest\": \"^4.0.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"zod\": \"^3.25.0 || ^4.0.0\"\n },\n \"devDependencies\": {\n \"@ai-sdk/anthropicv1\": \"npm:@ai-sdk/anthropic@^1.2.12\",\n \"@ai-sdk/anthropicv2\": \"npm:@ai-sdk/anthropic@^2.0.57\",\n \"@ai-sdk/anthropicv3\": \"npm:@ai-sdk/anthropic@^3.0.9\",\n \"@ai-sdk/openaiv1\": \"npm:@ai-sdk/openai@^1.3.24\",\n \"@ai-sdk/openaiv2\": \"npm:@ai-sdk/openai@^2.0.88\",\n \"@ai-sdk/openaiv3\": \"npm:@ai-sdk/openai@^3.0.7\",\n \"@ai-sdk/providerv1\": \"npm:@ai-sdk/provider@^1.1.3\",\n \"@ai-sdk/providerv2\": \"npm:@ai-sdk/provider@^2.0.1\",\n \"@ai-sdk/providerv3\": \"npm:@ai-sdk/provider@^3.0.2\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@repo/eslint-config\": \"workspace:*\",\n \"@types/node\": \"^22.15.29\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"aiv4\": \"npm:ai@^4.3.19\",\n \"aiv5\": \"npm:ai@^5.0.118\",\n \"aiv6\": \"npm:ai@^6.0.6\",\n \"esbuild\": \"^0.25.8\",\n \"eslint\": \"catalog:\",\n \"msw\": \"^2.12.2\",\n \"prettier\": \"catalog:\",\n \"tinyrainbow\": \"^2.0.0\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"zod\": \"catalog:\"\n },\n \"files\": [\n \"dist\"\n ],\n \"packageManager\": \"pnpm@10.16.1\"\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/otel/utils/redaction.ts","../src/otel/withSpanBaggageKey.ts","../src/otel/initAxiomAI.ts","../package.json"],"sourcesContent":["import { context, propagation, type Baggage, type Span } from '@opentelemetry/api';\nimport { WITHSPAN_REDACTION_POLICY_KEY } from '../withSpanBaggageKey';\n\ntype CaptureMessageContent = 'full' | 'off';\n\nexport type AxiomAIRedactionPolicy = {\n captureMessageContent?: CaptureMessageContent;\n mirrorToolPayloadOnToolSpan?: boolean;\n};\n\nexport const RedactionPolicy = {\n /**\n * Includes message content on chat spans, and mirrors tool\n * payload on tool spans for more convenient querying.\n */\n AxiomDefault: {\n captureMessageContent: 'full',\n mirrorToolPayloadOnToolSpan: true,\n },\n /**\n * Redacts message content on chat spans, and does not put\n * tool payload on tool spans.\n */\n OpenTelemetryDefault: {\n captureMessageContent: 'off',\n mirrorToolPayloadOnToolSpan: false,\n },\n} as const satisfies Record<string, AxiomAIRedactionPolicy>;\n\n// Global key to store redaction policy across all execution contexts\nexport const AXIOM_AI_REDACTION_KEY = Symbol.for('__axiom_ai_redaction__');\n\n/**\n * Get the globally stored redaction policy\n * @returns The global redaction policy or undefined if not set\n */\nfunction getGlobalRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n return (globalThis as any)[AXIOM_AI_REDACTION_KEY];\n}\n\n/**\n * Resolves the effective redaction policy by merging global and per-call policies.\n * Per-call policies take precedence over global policies.\n *\n * @param globalPolicy - The global redaction policy from initAxiomAI\n * @param localPolicy - The per-call redaction policy from withSpan or middleware\n * @returns The effective redaction policy with all fields resolved\n */\nfunction getEffectiveRedactionPolicy(\n globalPolicy?: AxiomAIRedactionPolicy,\n localPolicy?: AxiomAIRedactionPolicy,\n): AxiomAIRedactionPolicy {\n // Per-call policy overrides global policy, with defaults\n return {\n captureMessageContent:\n localPolicy?.captureMessageContent ??\n globalPolicy?.captureMessageContent ??\n RedactionPolicy.AxiomDefault.captureMessageContent,\n mirrorToolPayloadOnToolSpan:\n localPolicy?.mirrorToolPayloadOnToolSpan ??\n globalPolicy?.mirrorToolPayloadOnToolSpan ??\n RedactionPolicy.AxiomDefault.mirrorToolPayloadOnToolSpan,\n };\n}\n\n/**\n * Get the active redaction policy\n */\nexport function getRedactionPolicy() {\n return getEffectiveRedactionPolicy(getGlobalRedactionPolicy(), getPerCallRedactionPolicy());\n}\n\n/**\n * Conditionally sets a span attribute based on the capture message content policy.\n * When policy is 'off', the attribute is not set at all.\n *\n * @param span - The OpenTelemetry span to set the attribute on\n * @param attribute - The attribute name/key\n * @param value - The attribute value\n * @param captureMessageContent - The capture policy ('full' sets attribute, 'off' skips it)\n */\nexport function handleMaybeRedactedAttribute(\n span: Span,\n attribute: string,\n value: any,\n captureMessageContent?: CaptureMessageContent,\n): void {\n if (captureMessageContent === 'full') {\n span.setAttribute(attribute, value);\n }\n\n // For 'off', don't set the attribute at all\n // Future: Could add callback-based redaction here\n}\n\n/**\n * Extracts the per-call redaction policy from OpenTelemetry baggage context.\n * This allows middleware and tools to access redaction policies passed via withSpan.\n *\n * @returns The per-call redaction policy or undefined if not set\n */\nfunction getPerCallRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n const baggage: Baggage = propagation.getBaggage(context.active()) || propagation.createBaggage();\n const serializedPolicy = baggage.getEntry(WITHSPAN_REDACTION_POLICY_KEY)?.value;\n\n if (!serializedPolicy) {\n return undefined;\n }\n\n try {\n return JSON.parse(serializedPolicy) as AxiomAIRedactionPolicy;\n } catch (error) {\n console.warn('[AxiomAI] Failed to parse redaction policy from baggage:', error);\n return undefined;\n }\n}\n","/**\n * We need a way to know that we're inside `withSpan`\n * Because we don't own `generateText` and similar functions,\n * we use OTel Baggage to propagate this information. Another\n * consideration might be to use AsyncLocalStorage in Node and\n * some kind of KV in workerd.\n */\nexport const WITHSPAN_BAGGAGE_KEY = '__withspan_gen_ai_call';\nexport const WITHSPAN_REDACTION_POLICY_KEY = '__withspan_redaction_policy';\n","import type { Tracer } from '@opentelemetry/api';\nimport { trace } from '@opentelemetry/api';\nimport packageJson from '../../package.json';\nimport { AXIOM_AI_REDACTION_KEY, type AxiomAIRedactionPolicy } from './utils/redaction';\n\n// Global key to store tracer scope information across all execution contexts\nconst AXIOM_AI_SCOPE_KEY = Symbol.for('__axiom_ai_scope__');\n\ninterface TracerScope {\n name: string;\n version?: string;\n}\n\n/**\n * Extract scope information from a tracer, with fallback to package.json\n */\nfunction extractTracerScope(tracer: Tracer): TracerScope {\n const tracerAny = tracer as any;\n\n // Guard access to private fields with optional chaining\n // Note: These are internal OTEL fields that may change in future versions\n // _instrumentationScope is modern, instrumentationLibrary is legacy (<1.16)\n const name =\n tracerAny._instrumentationScope?.name ||\n tracerAny.instrumentationLibrary?.name ||\n packageJson.name;\n\n const version =\n tracerAny._instrumentationScope?.version ||\n tracerAny.instrumentationLibrary?.version ||\n packageJson.version;\n\n return { name, version };\n}\n\n/**\n * Register this in your `instrumentation.ts` to set up axiom.\n * This function stores the tracer's scope information globally to enable Context Propagation\n * and Instrumentation Scope. The tracer will be available across all execution contexts including Next.js.\n *\n * This function is idempotent - calling it multiple times with the same scope has no additional cost.\n *\n * @param config\n * @param config.tracer - The tracer that you are using in your application.\n * @param config.redactionPolicy - Optional redaction policy to control what data is captured in spans.\n */\nexport function initAxiomAI(config: { tracer: Tracer; redactionPolicy?: AxiomAIRedactionPolicy }) {\n const newScope = extractTracerScope(config.tracer);\n const existingScope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Check if already initialized with same scope (idempotent behavior)\n if (\n existingScope &&\n existingScope.name === newScope.name &&\n existingScope.version === newScope.version\n ) {\n return;\n }\n\n // Warn about double initialization with different scopes\n if (existingScope) {\n console.warn(\n '[AxiomAI] initAxiomAI() called multiple times with different scopes. ' +\n `Previous: ${existingScope.name}@${existingScope.version}, ` +\n `New: ${newScope.name}@${newScope.version}`,\n );\n }\n\n // Store scope information globally (works across Next.js contexts)\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = newScope;\n\n // Store redaction policy globally if provided\n if (config.redactionPolicy) {\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = config.redactionPolicy;\n }\n}\n\n/**\n * Get a tracer using the globally stored scope information\n * Fall back to package.json defaults if not set\n */\nexport function getGlobalTracer(): Tracer {\n // Get stored scope information or fall back to package defaults\n const scope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Warn if initAxiomAI was never called\n if (!scope) {\n const isDebug = process.env.AXIOM_DEBUG === 'true';\n if (!isDebug) {\n console.warn(\n '[AxiomAI] AXIOM_AI_SCOPE_KEY is undefined. This probably means that ' +\n 'initAxiomAI() was never called. ' +\n 'Make sure to call initAxiomAI({ tracer }) in your instrumentation setup.',\n );\n }\n }\n\n let { name, version } = scope || { name: packageJson.name, version: packageJson.version };\n\n if (!name || !version) {\n name = packageJson.name;\n version = packageJson.version;\n if (!name || !version) {\n name = 'axiom';\n version = 'unknown';\n }\n }\n\n // Use OpenTelemetry's standard global provider mechanism\n return trace.getTracer(name, version);\n}\n\n/**\n * Reset AxiomAI configuration (useful for testing)\n */\nexport function resetAxiomAI() {\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = undefined;\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = undefined;\n}\n","{\n \"name\": \"axiom\",\n \"version\": \"0.48.0\",\n \"type\": \"module\",\n \"author\": \"Axiom, Inc.\",\n \"contributors\": [\n \"Islam Shehata <islam@axiom.co>\",\n \"Chris Ehrlich <chris@axiom.co>\",\n \"Gabriel de Andrade <gabriel@axiom.co>\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup && chmod +x dist/bin.js && typedoc && pnpm check:vitest-entrypoints\",\n \"check:vitest-entrypoints\": \"node ./scripts/check-vitest-entrypoints.mjs\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint './**/*.{js,ts}'\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest --watch\",\n \"test:wrangler-smoke\": \"pnpm build && vitest run --config vitest.smoke.config.ts\",\n \"publint\": \"npx publint\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"bin\": {\n \"axiom\": \"./dist/bin.js\"\n },\n \"exports\": {\n \"./ai\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./ai/evals\": {\n \"types\": \"./dist/evals.d.ts\",\n \"default\": \"./dist/evals.js\"\n },\n \"./ai/evals/online\": {\n \"types\": \"./dist/evals/online.d.ts\",\n \"default\": \"./dist/evals/online.js\"\n },\n \"./ai/scorers\": {\n \"types\": \"./dist/scorers/scorers.d.ts\",\n \"default\": \"./dist/scorers/scorers.js\"\n },\n \"./ai/scorers/aggregations\": {\n \"types\": \"./dist/scorers/aggregations.d.ts\",\n \"default\": \"./dist/scorers/aggregations.js\"\n },\n \"./ai/config\": {\n \"types\": \"./dist/config.d.ts\",\n \"default\": \"./dist/config.js\"\n },\n \"./ai/feedback\": {\n \"types\": \"./dist/feedback.d.ts\",\n \"default\": \"./dist/feedback.js\"\n }\n },\n \"keywords\": [\n \"axiom\",\n \"logging\",\n \"ai\",\n \"otel\",\n \"opentelemetry\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/axiomhq/ai.git\",\n \"directory\": \"packages/ai\"\n },\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@next/env\": \"^15.4.2\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.60.1\",\n \"@opentelemetry/context-async-hooks\": \"^2.0.1\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.202.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.38.0\",\n \"@sinclair/typebox\": \"^0.34.37\",\n \"c12\": \"^3.3.3\",\n \"commander\": \"^14.0.0\",\n \"defu\": \"^6.1.4\",\n \"handlebars\": \"^4.7.8\",\n \"nanoid\": \"^5.1.5\",\n \"open\": \"^10.1.0\",\n \"vite-tsconfig-paths\": \"^5.1.4\",\n \"vitest\": \"^4.0.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"zod\": \"^3.25.0 || ^4.0.0\"\n },\n \"devDependencies\": {\n \"@ai-sdk/anthropicv1\": \"npm:@ai-sdk/anthropic@^1.2.12\",\n \"@ai-sdk/anthropicv2\": \"npm:@ai-sdk/anthropic@^2.0.57\",\n \"@ai-sdk/anthropicv3\": \"npm:@ai-sdk/anthropic@^3.0.9\",\n \"@ai-sdk/openaiv1\": \"npm:@ai-sdk/openai@^1.3.24\",\n \"@ai-sdk/openaiv2\": \"npm:@ai-sdk/openai@^2.0.88\",\n \"@ai-sdk/openaiv3\": \"npm:@ai-sdk/openai@^3.0.7\",\n \"@ai-sdk/providerv1\": \"npm:@ai-sdk/provider@^1.1.3\",\n \"@ai-sdk/providerv2\": \"npm:@ai-sdk/provider@^2.0.1\",\n \"@ai-sdk/providerv3\": \"npm:@ai-sdk/provider@^3.0.2\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@repo/eslint-config\": \"workspace:*\",\n \"@types/node\": \"^22.15.29\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"aiv4\": \"npm:ai@^4.3.19\",\n \"aiv5\": \"npm:ai@^5.0.118\",\n \"aiv6\": \"npm:ai@^6.0.6\",\n \"esbuild\": \"^0.25.8\",\n \"eslint\": \"catalog:\",\n \"msw\": \"^2.12.2\",\n \"prettier\": \"catalog:\",\n \"tinyrainbow\": \"^2.0.0\",\n \"tsup\": \"catalog:\",\n \"typedoc\": \"^0.28.17\",\n \"typedoc-plugin-markdown\": \"^4.10.0\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"zod\": \"catalog:\"\n },\n \"files\": [\n \"dist\"\n ],\n \"packageManager\": \"pnpm@10.16.1\"\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getGlobalTracer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-K3QLV6H6.js";
|
|
4
4
|
import {
|
|
5
5
|
isValidName
|
|
6
6
|
} from "./chunk-MM5FFQJT.js";
|
|
7
7
|
import {
|
|
8
8
|
normalizeBooleanScore
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-FGLJO4BD.js";
|
|
10
10
|
import {
|
|
11
11
|
Attr
|
|
12
12
|
} from "./chunk-4TKUTT24.js";
|
|
@@ -280,4 +280,4 @@ async function executeOnlineEvalInternal(name, params, linkContexts) {
|
|
|
280
280
|
export {
|
|
281
281
|
onlineEval
|
|
282
282
|
};
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
283
|
+
//# sourceMappingURL=chunk-OFLP2IHA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/online-evals/onlineEval.ts","../src/online-evals/executor.ts"],"sourcesContent":["import { context, trace, SpanStatusCode, type SpanContext } from '@opentelemetry/api';\nimport { getGlobalTracer } from '../otel/initAxiomAI';\nimport type {\n OnlineEvalScorerEntry,\n OnlineEvalScorerInput,\n SampledOnlineEvalScorer,\n Scorer,\n ScorerResult,\n ScorerSampling,\n} from './types';\nimport { executeScorer } from './executor';\nimport { normalizeBooleanScore } from '../scorers/normalize-score';\nimport { Attr } from '../otel/semconv/attributes';\nimport type { ValidateName } from '../util/name-validation';\nimport { isValidName } from '../util/name-validation-runtime';\n\ntype ScorerEntry<TInput, TOutput> = OnlineEvalScorerEntry<TInput, TOutput, any>;\ntype ScorerInput<TInput, TOutput> = OnlineEvalScorerInput<TInput, TOutput, any>;\n\ntype InferScorerMetadata<TScorerEntry> =\n TScorerEntry extends SampledOnlineEvalScorer<any, any, any>\n ? InferScorerMetadata<TScorerEntry['scorer']>\n : TScorerEntry extends Scorer<any, any, infer TMetadata>\n ? TMetadata\n : TScorerEntry extends ScorerResult<infer TMetadata>\n ? TMetadata\n : never;\n\ntype InferScorerName<TScorerEntry> =\n TScorerEntry extends SampledOnlineEvalScorer<any, any, any>\n ? InferScorerName<TScorerEntry['scorer']>\n : TScorerEntry extends ScorerResult<any>\n ? TScorerEntry['name']\n : TScorerEntry extends Scorer<any, any, any>\n ? string\n : never;\n\ntype IsBroadString<T extends string> = string extends T ? true : false;\n\ntype DuplicateScorerNames<\n TEntries extends readonly unknown[],\n Seen extends string = never,\n Duplicates extends string = never,\n> = TEntries extends readonly [infer Head, ...infer Tail]\n ? InferScorerName<Head> extends infer ScorerName\n ? ScorerName extends string\n ? IsBroadString<ScorerName> extends true\n ? DuplicateScorerNames<Tail extends readonly unknown[] ? Tail : never, Seen, Duplicates>\n : ScorerName extends Seen\n ? DuplicateScorerNames<\n Tail extends readonly unknown[] ? Tail : never,\n Seen,\n Duplicates | ScorerName\n >\n : DuplicateScorerNames<\n Tail extends readonly unknown[] ? Tail : never,\n Seen | ScorerName,\n Duplicates\n >\n : DuplicateScorerNames<Tail extends readonly unknown[] ? Tail : never, Seen, Duplicates>\n : never\n : Duplicates;\n\ntype EnsureUniqueScorerNames<TEntries extends readonly unknown[]> = [\n DuplicateScorerNames<TEntries>,\n] extends [never]\n ? TEntries\n : never & {\n __axiomDuplicateScorerNames__: DuplicateScorerNames<TEntries>;\n };\n\ntype InferOnlineEvalResult<TScorers extends readonly unknown[]> = ScorerResult<\n InferScorerMetadata<TScorers[number]>\n>;\n\ntype InferOnlineEvalResultRecord<TScorers extends readonly unknown[]> = Partial<\n Record<Extract<InferScorerName<TScorers[number]>, string>, InferOnlineEvalResult<TScorers>>\n>;\n\ntype NormalizedScorerEntry<TInput, TOutput> = {\n name: string;\n scorer: ScorerInput<TInput, TOutput>;\n sampling?: ScorerSampling<TInput, TOutput>;\n};\n\n/**\n * Options for online evaluation.\n */\nexport type OnlineEvalParams<\n TInput,\n TOutput,\n TScorers extends readonly ScorerEntry<TInput, TOutput>[] = readonly ScorerEntry<\n TInput,\n TOutput\n >[],\n> = {\n /** High-level capability being evaluated (e.g., 'qa', 'summarization') */\n capability: string;\n /** Specific step within the capability (e.g., 'answer', 'extract') */\n step?: string;\n /**\n * Explicit SpanContext(s) to link the eval span to originating generation span(s).\n * When omitted, the active span's context is used automatically.\n * Use this for deferred evaluation when onlineEval is called after the\n * originating span has completed.\n * Supports both single context and multiple contexts for multi-span linking.\n */\n links?: SpanContext | SpanContext[];\n /** Input to pass to scorers (optional - only needed for input+output scorers) */\n input?: TInput;\n /** Output to evaluate */\n output: TOutput;\n /** Scorers or precomputed scores. Supports optional per-scorer sampling. */\n scorers: EnsureUniqueScorerNames<TScorers>;\n};\n\n/**\n * Determines if an individual scorer should run based on sampling configuration.\n */\nasync function shouldSample<TInput, TOutput>(\n sampling: ScorerSampling<TInput, TOutput> | undefined,\n args: { input?: TInput; output: TOutput },\n): Promise<boolean> {\n if (sampling === undefined) return true;\n if (typeof sampling === 'number') {\n if (sampling >= 1) return true;\n if (sampling <= 0) return false;\n return Math.random() < sampling;\n }\n return Boolean(await sampling(args));\n}\n\nfunction isSampledScorerEntry<TInput, TOutput>(\n entry: ScorerEntry<TInput, TOutput>,\n): entry is SampledOnlineEvalScorer<TInput, TOutput, any> {\n return typeof entry === 'object' && entry !== null && 'scorer' in entry;\n}\n\nfunction resolveScorerName<TInput, TOutput>(scorer: ScorerInput<TInput, TOutput>): string {\n if (typeof scorer === 'function') {\n return scorer.name || 'unknown';\n }\n return scorer.name;\n}\n\nfunction normalizeScorerEntry<TInput, TOutput>(\n entry: ScorerEntry<TInput, TOutput>,\n): NormalizedScorerEntry<TInput, TOutput> {\n if (isSampledScorerEntry(entry)) {\n return {\n name: resolveScorerName(entry.scorer),\n scorer: entry.scorer,\n sampling: entry.sampling,\n };\n }\n\n return {\n name: resolveScorerName(entry),\n scorer: entry,\n };\n}\n\nfunction getDuplicateScorerNames<TInput, TOutput>(\n entries: readonly NormalizedScorerEntry<TInput, TOutput>[],\n): string[] {\n const nameCounts = new Map<string, number>();\n\n for (const entry of entries) {\n nameCounts.set(entry.name, (nameCounts.get(entry.name) ?? 0) + 1);\n }\n\n return [...nameCounts.entries()]\n .filter(([, count]) => count > 1)\n .map(([name]) => name)\n .sort();\n}\n\n/**\n * Run online evaluation scorers against production outputs.\n *\n * Returns a promise that resolves to scorer results. Use `void onlineEval(...)`\n * for fire-and-forget, or `await onlineEval(...)` when you need to wait for\n * completion (e.g., before flushing telemetry in short-lived processes).\n *\n * Each eval span links back to the originating generation span via an\n * OpenTelemetry span link. Parent/child hierarchy follows natural context\n * propagation — inside `withSpan` the eval is a child, outside it depends\n * on the active context.\n *\n * ## Usage Patterns\n *\n * **Inside withSpan (recommended):**\n * Active span is automatically detected and linked.\n * ```ts\n * await withSpan({ capability: 'qa', step: 'answer' }, async () => {\n * const response = await generateText({ ... });\n * void onlineEval(\n * 'my-eval',\n * { capability: 'qa', step: 'answer' },\n * { output: response.text, scorers: [formatScorer] }\n * );\n * return response.text;\n * });\n * ```\n *\n * **Deferred evaluation with explicit link:**\n * Pass the originating span's context for linking when evaluating later.\n * Supports single or multiple span contexts.\n * ```ts\n * let spanCtx: SpanContext;\n * const result = await withSpan({ ... }, async (span) => {\n * spanCtx = span.spanContext();\n * return await generateText({ ... });\n * });\n * void onlineEval('my-eval', { ..., links: spanCtx }, { output: result, scorers });\n *\n * // Or link to multiple spans:\n * void onlineEval('my-eval', { ..., links: [spanCtx1, spanCtx2] }, { output, scorers });\n * ```\n *\n * **Awaiting for flush (short-lived processes):**\n * ```ts\n * await onlineEval('my-eval', { ... }, { output, scorers });\n * await flushTelemetry();\n * ```\n *\n * @param name - Eval name (A-Z, a-z, 0-9, -, _ only). Used as the span name and `eval.name` attribute.\n * @param meta - Evaluation metadata for categorization\n * @param meta.capability - High-level capability being evaluated\n * @param meta.step - Optional step within the capability\n * @param meta.links - Optional SpanContext(s) to link to (auto-detected if omitted)\n * @param params - Evaluation configuration\n * @param options.input - Input to pass to scorers\n * @param options.output - Output to evaluate\n * @param options.scorers - Scorer entries with optional per-scorer sampling\n * @returns Promise resolving to scorer results keyed by scorer name\n */\nexport function onlineEval<\n TInput,\n TOutput,\n Name extends string,\n const TScorers extends readonly ScorerEntry<TInput, TOutput>[],\n>(\n name: ValidateName<Name>,\n params: OnlineEvalParams<TInput, TOutput, TScorers>,\n): Promise<InferOnlineEvalResultRecord<TScorers>> {\n const nameValidation = isValidName(name as string);\n if (!nameValidation.valid) {\n throw new Error(`[AxiomAI] Invalid eval name: ${nameValidation.error}`);\n }\n\n if (params.scorers.length === 0) {\n return Promise.resolve({});\n }\n\n const rawLinks = params.links ?? trace.getSpan(context.active())?.spanContext();\n const linkContexts = rawLinks ? (Array.isArray(rawLinks) ? rawLinks : [rawLinks]) : [];\n\n return executeOnlineEvalInternal(name as string, params, linkContexts);\n}\n\nasync function executeOnlineEvalInternal<\n TInput,\n TOutput,\n const TScorers extends readonly ScorerEntry<TInput, TOutput>[],\n>(\n name: string,\n params: OnlineEvalParams<TInput, TOutput, TScorers>,\n linkContexts: SpanContext[],\n): Promise<InferOnlineEvalResultRecord<TScorers>> {\n const tracer = getGlobalTracer();\n\n const evalSpan = tracer.startSpan(\n `eval ${name}`,\n linkContexts.length > 0 ? { links: linkContexts.map((ctx) => ({ context: ctx })) } : {},\n );\n\n const evalAttrs: Record<string, string> = {\n [Attr.GenAI.Operation.Name]: 'eval',\n [Attr.Eval.Name]: name,\n [Attr.Eval.Capability.Name]: params.capability,\n [Attr.Eval.Tags]: JSON.stringify(['online']),\n };\n if (params.step) {\n evalAttrs[Attr.Eval.Step.Name] = params.step;\n }\n evalSpan.setAttributes(evalAttrs);\n\n try {\n const normalizedScorers = params.scorers.map((entry) => normalizeScorerEntry(entry));\n const duplicateScorerNames = getDuplicateScorerNames(normalizedScorers);\n if (duplicateScorerNames.length > 0) {\n throw new Error(\n `Duplicate scorer names are not allowed: ${duplicateScorerNames\n .map((name) => `\"${name}\"`)\n .join(', ')}`,\n );\n }\n\n const outcomes = await Promise.all(\n normalizedScorers.map(async (entry) => {\n try {\n const sampledIn = await shouldSample(entry.sampling, {\n input: params.input,\n output: params.output,\n });\n\n if (!sampledIn) {\n return { sampledOut: true as const };\n }\n\n return {\n sampledOut: false as const,\n result: await executeScorer({\n scorer: entry.scorer,\n input: params.input,\n output: params.output,\n parentSpan: evalSpan,\n capability: params.capability,\n step: params.step,\n evalName: name,\n }),\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n return {\n sampledOut: false as const,\n result: await executeScorer({\n scorer: {\n name: entry.name,\n score: null,\n error: error.message,\n },\n input: params.input,\n output: params.output,\n parentSpan: evalSpan,\n capability: params.capability,\n step: params.step,\n evalName: name,\n }),\n };\n }\n }),\n );\n\n const results: Record<string, InferOnlineEvalResult<TScorers>> = {};\n let sampledOutCount = 0;\n\n for (const outcome of outcomes) {\n if (outcome.sampledOut) {\n sampledOutCount += 1;\n continue;\n }\n\n results[outcome.result.name] = outcome.result as InferOnlineEvalResult<TScorers>;\n }\n\n const failedCount = Object.values(results).filter((result) => result.error).length;\n const ranCount = Object.keys(results).length;\n\n const scoresSummary: Record<string, ScorerResult> = {};\n for (const [name, result] of Object.entries(results)) {\n const { score: normalizedScore, metadata: normalizedMetadata } = normalizeBooleanScore(\n result.score,\n result.metadata,\n );\n\n scoresSummary[name] = {\n name: result.name,\n score: normalizedScore,\n ...(normalizedMetadata &&\n Object.keys(normalizedMetadata).length > 0 && { metadata: normalizedMetadata }),\n ...(result.error && { error: result.error }),\n };\n }\n\n evalSpan.setAttributes({\n [Attr.Eval.Case.Scores]: JSON.stringify(scoresSummary),\n [Attr.Eval.Online.Scorers.Total]: normalizedScorers.length,\n [Attr.Eval.Online.Scorers.Ran]: ranCount,\n [Attr.Eval.Online.Scorers.SampledOut]: sampledOutCount,\n [Attr.Eval.Online.Scorers.Failed]: failedCount,\n });\n\n if (failedCount > 0) {\n evalSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'One or more scorers failed',\n });\n } else {\n evalSpan.setStatus({ code: SpanStatusCode.OK });\n }\n\n return results as InferOnlineEvalResultRecord<TScorers>;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n evalSpan.recordException(error);\n evalSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n return {};\n } finally {\n evalSpan.end();\n }\n}\n","import { context, trace, SpanStatusCode, type Span } from '@opentelemetry/api';\nimport { normalizeBooleanScore } from '../scorers/normalize-score';\nimport { getGlobalTracer } from '../otel/initAxiomAI';\nimport type { Scorer, ScorerResult } from './types';\nimport { Attr } from '../otel/semconv/attributes';\n\ntype OnlineEvalScorerInput<TInput, TOutput> = Scorer<TInput, TOutput, any> | ScorerResult<any>;\ntype ScorerSpanAttrs = {\n capability: string;\n step?: string;\n evalName?: string;\n name: string;\n span: Span;\n result: Pick<ScorerResult<any>, 'score' | 'metadata'>;\n};\n\nfunction setScorerSpanAttrs(args: ScorerSpanAttrs): void {\n const { score: scoreValue, metadata } = normalizeBooleanScore(\n args.result.score,\n args.result.metadata,\n );\n\n const attrs: Record<string, string | number | boolean | undefined> = {\n [Attr.GenAI.Operation.Name]: 'eval.score',\n [Attr.Eval.Score.Name]: args.name,\n [Attr.Eval.Tags]: JSON.stringify(['online']),\n [Attr.Eval.Score.Value]: scoreValue ?? undefined,\n [Attr.Eval.Name]: args.evalName,\n [Attr.Eval.Capability.Name]: args.capability,\n [Attr.Eval.Step.Name]: args.step,\n };\n\n if (metadata && Object.keys(metadata).length > 0) {\n attrs[Attr.Eval.Score.Metadata] = JSON.stringify(metadata);\n }\n\n args.span.setAttributes(attrs);\n}\n\n/**\n * Executes a single scorer or emits a precomputed scorer result.\n */\nexport async function executeScorer<TInput, TOutput>(params: {\n scorer: OnlineEvalScorerInput<TInput, TOutput>;\n input: TInput | undefined;\n output: TOutput;\n parentSpan: Span;\n capability: string;\n step?: string;\n evalName?: string;\n}): Promise<ScorerResult<any>> {\n const tracer = getGlobalTracer();\n const parentContext = trace.setSpan(context.active(), params.parentSpan);\n\n return context.with(parentContext, async () => {\n const scorerName =\n typeof params.scorer === 'function'\n ? // undefined/unknown case shouldn't happen, but better safe than sorry\n params.scorer.name || 'unknown'\n : params.scorer.name;\n const scorerSpan = tracer.startSpan(`score ${scorerName}`);\n\n try {\n const result =\n typeof params.scorer === 'function'\n ? ({\n ...(await params.scorer({\n input: params.input,\n output: params.output,\n })),\n name: scorerName,\n } satisfies ScorerResult)\n : params.scorer;\n\n setScorerSpanAttrs({\n span: scorerSpan,\n name: scorerName,\n result,\n capability: params.capability,\n step: params.step,\n evalName: params.evalName,\n });\n if (result.error) {\n const error = new Error(result.error);\n scorerSpan.recordException(error);\n scorerSpan.setAttributes({\n [Attr.Error.Message]: error.message,\n [Attr.Error.Type]: error.name,\n });\n scorerSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n scorerSpan.setStatus({ code: SpanStatusCode.OK });\n }\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const failedResult: ScorerResult = {\n name: scorerName,\n score: null,\n error: error.message,\n };\n\n setScorerSpanAttrs({\n span: scorerSpan,\n name: scorerName,\n result: failedResult,\n capability: params.capability,\n step: params.step,\n evalName: params.evalName,\n });\n\n scorerSpan.recordException(error);\n scorerSpan.setAttributes({\n [Attr.Error.Message]: error.message,\n [Attr.Error.Type]: error.name,\n });\n scorerSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n\n return failedResult;\n } finally {\n scorerSpan.end();\n }\n });\n}\n"],"mappings":"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","names":["context","trace","SpanStatusCode","trace","context","name","SpanStatusCode"]}
|
|
@@ -2,19 +2,19 @@ import {
|
|
|
2
2
|
getConsoleUrl,
|
|
3
3
|
loadConfig,
|
|
4
4
|
u
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2XPPXCZ6.js";
|
|
6
6
|
import {
|
|
7
7
|
dotNotationToNested,
|
|
8
8
|
flattenObject,
|
|
9
9
|
getAxiomConfig
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GLBE32GY.js";
|
|
11
11
|
import {
|
|
12
12
|
AxiomCLIError,
|
|
13
13
|
errorToString
|
|
14
14
|
} from "./chunk-ISSDOC43.js";
|
|
15
15
|
import {
|
|
16
16
|
initAxiomAI
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-K3QLV6H6.js";
|
|
18
18
|
import {
|
|
19
19
|
__publicField
|
|
20
20
|
} from "./chunk-KEXKKQVW.js";
|
|
@@ -649,11 +649,11 @@ function setupEvalProvider(connection) {
|
|
|
649
649
|
axiomProvider = new NodeTracerProvider({
|
|
650
650
|
resource: resourceFromAttributes({
|
|
651
651
|
["service.name"]: "axiom",
|
|
652
|
-
["service.version"]: "0.
|
|
652
|
+
["service.version"]: "0.48.0"
|
|
653
653
|
}),
|
|
654
654
|
spanProcessors: [processor]
|
|
655
655
|
});
|
|
656
|
-
axiomTracer = axiomProvider.getTracer("axiom", "0.
|
|
656
|
+
axiomTracer = axiomProvider.getTracer("axiom", "0.48.0");
|
|
657
657
|
}
|
|
658
658
|
async function initInstrumentation(config) {
|
|
659
659
|
if (initialized) {
|
|
@@ -665,7 +665,7 @@ async function initInstrumentation(config) {
|
|
|
665
665
|
}
|
|
666
666
|
initializationPromise = (async () => {
|
|
667
667
|
if (!config.enabled) {
|
|
668
|
-
axiomTracer = trace.getTracer("axiom", "0.
|
|
668
|
+
axiomTracer = trace.getTracer("axiom", "0.48.0");
|
|
669
669
|
initialized = true;
|
|
670
670
|
return;
|
|
671
671
|
}
|
|
@@ -780,4 +780,4 @@ export {
|
|
|
780
780
|
startSpan,
|
|
781
781
|
startActiveSpan
|
|
782
782
|
};
|
|
783
|
-
//# sourceMappingURL=chunk-
|
|
783
|
+
//# sourceMappingURL=chunk-XVXJZJJN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/evals/reporter.console-utils.ts","../src/config/resolver.ts","../src/evals/reporter.ts","../src/evals/instrument.ts"],"sourcesContent":["import c from 'tinyrainbow';\n\nimport type {\n Case,\n Evaluation,\n FlagDiff,\n MetaWithCase,\n MetaWithEval,\n OutOfScopeFlag,\n RegistrationStatus,\n OutOfScopeFlagAccess,\n} from './eval.types';\nimport type { TestSuite, TestCase } from 'vitest/node';\nimport type { Score } from '../scorers/scorer.types';\nimport { flattenObject } from '../util/dot-path';\nimport type { AxiomConnectionResolvedConfig } from '../config/resolver';\n\n/** Convert score value to number (handles boolean scores from normalizeScore) */\nfunction scoreToNumber(score: Score['score']): number {\n if (typeof score === 'boolean') return score ? 1 : 0;\n return score ?? 0;\n}\n\nexport type SuiteData = {\n version: string;\n name: string;\n file: string;\n duration: string;\n baseline: Evaluation | undefined | null;\n configFlags?: string[];\n flagConfig?: Record<string, any>;\n defaultFlagConfig?: Record<string, any>;\n runId: string;\n orgId?: string;\n cases: Array<{\n index: number;\n scores: Record<string, Score>;\n outOfScopeFlags?: OutOfScopeFlagAccess[];\n errors?: Error[] | null;\n runtimeFlags?: any;\n }>;\n outOfScopeFlags?: OutOfScopeFlag[];\n registrationStatus?: RegistrationStatus;\n};\n\nexport type Logger = (message?: string, ...optionalParams: any[]) => void;\n\nexport function formatPercentage(value: number): string {\n if (!Number.isFinite(value)) {\n return 'N/A';\n }\n return Number(value * 100).toFixed(2) + '%';\n}\n\nexport function formatDiff(current: number, baseline: number) {\n if (!Number.isFinite(current) || !Number.isFinite(baseline)) {\n return { text: 'N/A', color: c.dim };\n }\n const diff = current - baseline;\n const diffText = (diff >= 0 ? '+' : '') + formatPercentage(diff);\n const color = diff > 0 ? c.green : diff < 0 ? c.red : c.dim;\n return { text: diffText, color };\n}\n\nexport function truncate(str: string, max: number): string {\n return str.length > max ? str.slice(0, max) + '…' : str;\n}\n\nexport function stringify(value: any): string {\n try {\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function getCaseFingerprint(\n input: string | Record<string, any>,\n expected: string | Record<string, any>,\n): string {\n const inputStr = typeof input === 'string' ? input : JSON.stringify(input);\n const expectedStr = typeof expected === 'string' ? expected : JSON.stringify(expected);\n return JSON.stringify({ input: inputStr, expected: expectedStr });\n}\n\nexport function printEvalNameAndFileName(\n testSuite: TestSuite,\n meta: MetaWithEval,\n logger: Logger = console.log,\n) {\n const cwd = process.cwd();\n\n logger(\n ' ',\n c.bgCyan(c.black(` ${testSuite.project.name} `)),\n c.bgBlue(c.black(` ${meta.evaluation.name}-${meta.evaluation.version} `)),\n c.dim(`(${testSuite.children.size} cases)`),\n );\n\n logger(' ', c.dim(testSuite.module.moduleId.replace(cwd, '')));\n}\n\nexport function printBaselineNameAndVersion(testMeta: MetaWithEval, logger: Logger = console.log) {\n if (testMeta.evaluation.baseline) {\n logger(\n ' ',\n ' baseline ',\n c.bgMagenta(\n c.black(` ${testMeta.evaluation.baseline.name}-${testMeta.evaluation.baseline.version} `),\n ),\n );\n } else {\n logger(' ', c.bgWhite(c.blackBright(' baseline: ')), 'none');\n }\n\n logger('');\n}\n\nexport function printRuntimeFlags(testMeta: MetaWithCase, logger: Logger = console.log) {\n if (testMeta.case.runtimeFlags && Object.keys(testMeta.case.runtimeFlags).length > 0) {\n const entries = Object.entries(testMeta.case.runtimeFlags);\n logger(' ', c.dim('runtime flags'));\n for (const [k, v] of entries) {\n switch (v.kind) {\n case 'replaced': {\n const valText = truncate(stringify(v.value), 80);\n const defText = truncate(stringify(v.default), 80);\n logger(' ', `${k}: ${valText} (default: ${defText})`);\n break;\n }\n case 'introduced': {\n const valText = truncate(stringify(v.value), 80);\n logger(' ', `${k}: ${valText} (no default)`);\n break;\n }\n }\n }\n }\n}\n\nexport function printTestCaseCountStartDuration(\n testSuite: TestSuite,\n startTime: number,\n duration: string,\n trials?: number,\n logger: Logger = console.log,\n) {\n logger(' ');\n const trialsLabel = trials && trials > 1 ? ` (${trials} trials each)` : '';\n logger(' ', c.dim('Cases'), `${testSuite.children.size}${trialsLabel}`);\n logger(' ', c.dim('Start at'), new Date(startTime).toTimeString());\n logger(' ', c.dim('Duration'), `${duration}s`);\n}\n\nexport function printTestCaseSuccessOrFailed(\n testMeta: MetaWithCase,\n ok: boolean,\n logger: Logger = console.log,\n) {\n const index = testMeta.case.index;\n\n if (ok) {\n logger(' ', c.yellow(` \\u2714 case ${index}:`));\n } else {\n logger(' ', c.red(` \\u2716 case ${index}: failed`));\n for (const e of testMeta.case.errors ?? []) {\n logger('', e.message);\n }\n }\n}\n\nexport function printTestCaseScores(\n testMeta: MetaWithCase,\n baselineCase: Case | null | undefined,\n logger: Logger = console.log,\n) {\n const scores = testMeta.case.scores;\n const keys = Object.keys(scores);\n\n if (keys.length === 0) {\n return;\n }\n\n const maxNameLength = Math.max(...keys.map((k) => k.length));\n\n keys.forEach((k) => {\n const scoreData = scores[k];\n const hasError = scoreData.metadata?.error;\n const v = scoreToNumber(scoreData.score);\n\n const rawCurrent = hasError ? 'N/A' : formatPercentage(v);\n const paddedCurrent = rawCurrent.padStart(7);\n const coloredCurrent = hasError ? c.dim(paddedCurrent) : c.magentaBright(paddedCurrent);\n\n const paddedName = k.padEnd(maxNameLength);\n\n if (baselineCase?.scores[k]) {\n const baselineScoreValue = baselineCase.scores[k].value;\n const rawBaseline = formatPercentage(baselineScoreValue);\n const paddedBaseline = rawBaseline === 'N/A' ? rawBaseline : rawBaseline.padStart(7);\n const coloredBaseline =\n rawBaseline === 'N/A' ? c.dim(paddedBaseline) : c.blueBright(paddedBaseline);\n\n const { text: diffText, color: diffColor } = formatDiff(v, baselineScoreValue);\n const paddedDiff = diffText.padStart(8);\n\n logger(\n ` ${paddedName} ${coloredBaseline} → ${coloredCurrent} ${\n hasError ? c.dim('(scorer not run)') : c.dim('(') + diffColor(paddedDiff) + c.dim(')')\n }`,\n );\n } else {\n logger(` ${paddedName} ${coloredCurrent} ${hasError ? c.dim('(scorer not run)') : ''}`);\n }\n });\n}\n\nexport function printOutOfScopeFlags(testMeta: MetaWithCase, logger: Logger = console.log) {\n if (testMeta.case.outOfScopeFlags && testMeta.case.outOfScopeFlags.length > 0) {\n const pickedFlagsText = testMeta.case.pickedFlags\n ? `(picked: ${testMeta.case.pickedFlags.map((f) => `'${f}'`).join(', ')})`\n : '(none)';\n logger(' ', c.yellow(`⚠ Out-of-scope flags: ${pickedFlagsText}`));\n testMeta.case.outOfScopeFlags.forEach((flag) => {\n const timeStr = new Date(flag.accessedAt).toLocaleTimeString();\n logger(' ', `${flag.flagPath} (at ${timeStr})`);\n\n // Show top stack trace frames\n if (flag.stackTrace && flag.stackTrace.length > 0) {\n flag.stackTrace.forEach((frame, i) => {\n const prefix = i === flag.stackTrace.length - 1 ? ' └─' : ' ├─';\n logger(' ', c.dim(`${prefix} ${frame}`));\n });\n }\n });\n }\n}\n\nexport function printCaseResult(\n test: TestCase,\n baselineCasesByFingerprint: Map<string, Case[]>,\n matchedIndices: Set<number>,\n logger: Logger = console.log,\n) {\n const ok = test.ok();\n const testMeta = test.meta() as MetaWithCase;\n\n if (!testMeta?.case) {\n return;\n }\n\n printTestCaseSuccessOrFailed(testMeta, ok, logger);\n\n const fingerprint = getCaseFingerprint(testMeta.case.input, testMeta.case.expected);\n const baselineCases = baselineCasesByFingerprint.get(fingerprint);\n const baselineCase = baselineCases?.shift();\n\n if (baselineCase) {\n matchedIndices.add(baselineCase.index);\n }\n\n printTestCaseScores(testMeta, baselineCase, logger);\n\n printRuntimeFlags(testMeta, logger);\n\n printOutOfScopeFlags(testMeta, logger);\n}\n\nexport function printOrphanedBaselineCases(\n baseline: Evaluation,\n matchedIndices: Set<number>,\n logger: Logger = console.log,\n) {\n const orphanedCases = baseline.cases.filter((c) => !matchedIndices.has(c.index));\n\n if (orphanedCases.length === 0) {\n return;\n }\n\n logger('');\n logger(' ', c.yellow('Orphaned baseline cases:'));\n\n for (const orphanedCase of orphanedCases) {\n logger(\n ' ',\n c.dim(\n `case ${orphanedCase.index}: ${truncate(orphanedCase.input, 50)} (score: ${truncate(\n JSON.stringify(orphanedCase.scores),\n 50,\n )})`,\n ),\n );\n // We could print detailed scores here if we want, similar to printTestCaseScores\n // But just listing them is probably enough for now, or using a simplified format\n const keys = Object.keys(orphanedCase.scores);\n if (keys.length > 0) {\n const maxNameLength = Math.max(...keys.map((k) => k.length));\n\n keys.forEach((k) => {\n const scoreData = orphanedCase.scores[k];\n const rawScore = formatPercentage(scoreData.value);\n const paddedName = k.padEnd(maxNameLength);\n const paddedScore = rawScore.padStart(7);\n\n logger(` ${paddedName} ${c.blueBright(paddedScore)}`);\n });\n }\n }\n}\n\nexport function printConfigHeader(logger: Logger = console.log) {\n logger('');\n logger(' ', c.bgWhite(c.blackBright(' Config ')));\n}\n\nexport function printResultLink(\n testMeta: MetaWithCase,\n axiomUrl: string,\n logger: Logger = console.log,\n) {\n const url = `${axiomUrl}/evaluations/${testMeta.evaluation.name}/${testMeta.evaluation.id}`;\n logger(\n ' ',\n `see results for ${testMeta.evaluation.name}-${testMeta.evaluation.version} at ${url}`,\n );\n}\n\nexport const reporterDate = (d: Date) => {\n const date = d.toISOString().slice(0, 10); // \"2025-10-03\"\n const hours = d.getUTCHours().toString().padStart(2, '0');\n const minutes = d.getUTCMinutes().toString().padStart(2, '0');\n return `${date}, ${hours}:${minutes} UTC`;\n};\n\nexport function printGlobalFlagOverrides(\n overrides: Record<string, any>,\n defaults: Record<string, any>,\n logger: Logger = console.log,\n) {\n if (Object.keys(overrides).length === 0) {\n logger('');\n logger(c.dim('Flag overrides: (none)'));\n logger('');\n return;\n }\n\n logger('');\n logger('Flag overrides:');\n for (const [key, value] of Object.entries(overrides)) {\n const defaultValue = defaults[key];\n const valueStr = JSON.stringify(value);\n const defaultStr = defaultValue !== undefined ? JSON.stringify(defaultValue) : 'none';\n logger(` • ${key}: ${valueStr} ${c.dim(`(default: ${defaultStr})`)}`);\n }\n logger('');\n}\n\nexport function printSuiteBox({\n suite,\n scorerAverages,\n calculateBaselineScorerAverage,\n flagDiff,\n logger = console.log,\n}: {\n suite: SuiteData;\n scorerAverages: Record<string, number>;\n calculateBaselineScorerAverage: (baseline: Evaluation, scorerName: string) => number | null;\n flagDiff: Array<FlagDiff>;\n logger?: Logger;\n}) {\n const filename = suite.file.split('/').pop();\n\n logger('┌─');\n logger(`│ ${c.blue(suite.name)} ${c.gray(`(${filename})`)}`);\n logger('├─');\n\n const scorerNames = Object.keys(scorerAverages);\n const maxNameLength = Math.max(...scorerNames.map((name) => name.length));\n\n const allCasesErrored = (scorerName: string) => {\n return suite.cases.every((caseData) => caseData.scores[scorerName]?.metadata?.error);\n };\n\n for (const scorerName of scorerNames) {\n const avg = scorerAverages[scorerName];\n const paddedName = scorerName.padEnd(maxNameLength);\n const hasAllErrors = allCasesErrored(scorerName);\n\n const baselineAvg = suite.baseline\n ? calculateBaselineScorerAverage(suite.baseline, scorerName)\n : null;\n\n if (baselineAvg !== null) {\n const currentPercent = hasAllErrors ? c.dim('N/A') : formatPercentage(avg);\n const baselinePercent = formatPercentage(baselineAvg);\n const { text: diffText, color: diffColor } = formatDiff(avg, baselineAvg);\n\n const paddedBaseline = baselinePercent.padStart(7);\n const paddedCurrent = hasAllErrors ? currentPercent : currentPercent.padStart(7);\n const diffDisplay = hasAllErrors\n ? c.dim('all cases failed')\n : diffColor(diffText.padStart(8));\n\n logger(\n `│ ${paddedName} ${c.blueBright(paddedBaseline)} → ${hasAllErrors ? paddedCurrent : c.magentaBright(paddedCurrent)} (${diffDisplay})`,\n );\n } else {\n const currentPercent = hasAllErrors ? c.red('N/A (all cases failed)') : formatPercentage(avg);\n logger(`│ • ${paddedName} ${currentPercent}`);\n }\n }\n\n logger('├─');\n\n if (suite.baseline) {\n const baselineTimestamp = suite.baseline.runAt\n ? reporterDate(new Date(suite.baseline.runAt))\n : 'unknown time';\n logger(\n `│ Baseline: ${suite.baseline.name}-${suite.baseline.version} ${c.gray(`(${baselineTimestamp})`)}`,\n );\n } else {\n logger(`│ Baseline: ${c.gray('(none)')}`);\n }\n\n const hasConfigChanges = flagDiff.length > 0;\n\n logger('│ Config changes:', hasConfigChanges ? '' : c.gray('(none)'));\n if (hasConfigChanges) {\n for (const { flag, current, baseline, default: defaultVal } of flagDiff) {\n logger(`│ • ${flag}: ${current ?? '<not set>'}`);\n if (defaultVal !== undefined) {\n logger(`│ ${c.gray(`default: ${defaultVal}`)}`);\n }\n if (suite.baseline) {\n logger(`│ ${c.gray(`baseline: ${baseline ?? '<not set>'}`)}`);\n }\n }\n }\n\n if (suite.outOfScopeFlags && suite.outOfScopeFlags.length > 0) {\n const pickedFlagsText =\n suite.configFlags && suite.configFlags.length > 0\n ? suite.configFlags.map((f) => `'${f}'`).join(', ')\n : 'none';\n logger('│');\n logger(`│ ${c.yellow('⚠ Out-of-scope flags')} ${c.gray(`(picked: ${pickedFlagsText})`)}:`);\n for (const flag of suite.outOfScopeFlags) {\n const lastStackTraceFrame = flag.stackTrace[0];\n const lastStackTraceFnName = lastStackTraceFrame.split(' ').shift();\n const lastStackTraceFile = lastStackTraceFrame.split('/').pop()?.slice(0, -1);\n logger(\n `│ • ${flag.flagPath} ${c.gray(`at ${lastStackTraceFnName} (${lastStackTraceFile})`)}`,\n );\n }\n }\n\n logger('└─');\n}\n\n/**\n * Calculate average scores per scorer for a suite\n */\nexport function calculateScorerAverages(suite: SuiteData): Record<string, number> {\n const scorerTotals: Record<string, { sum: number; count: number }> = {};\n\n for (const caseData of suite.cases) {\n for (const [scorerName, score] of Object.entries(caseData.scores)) {\n if (!scorerTotals[scorerName]) {\n scorerTotals[scorerName] = { sum: 0, count: 0 };\n }\n if (!score.metadata?.error) {\n scorerTotals[scorerName].sum += scoreToNumber(score.score);\n scorerTotals[scorerName].count += 1;\n }\n }\n }\n\n const averages: Record<string, number> = {};\n for (const [scorerName, totals] of Object.entries(scorerTotals)) {\n averages[scorerName] = totals.count > 0 ? totals.sum / totals.count : 0;\n }\n\n return averages;\n}\n\n/**\n * Calculate average score for a specific scorer from baseline data\n */\nexport function calculateBaselineScorerAverage(\n baseline: Evaluation,\n scorerName: string,\n): number | null {\n const scores: number[] = [];\n\n for (const caseData of baseline.cases) {\n if (caseData.scores[scorerName]) {\n scores.push(caseData.scores[scorerName].value);\n }\n }\n\n if (scores.length === 0) return null;\n\n const sum = scores.reduce((acc, val) => acc + val, 0);\n return sum / scores.length;\n}\n\n/**\n * Calculate flag diff between current run vs baseline and defaults (filtered by configFlags).\n * Shows a diff if current differs from at least one of baseline or default.\n */\nexport function calculateFlagDiff(suite: SuiteData): Array<FlagDiff> {\n if (!suite.configFlags || suite.configFlags.length === 0) {\n return [];\n }\n\n const diffs: Array<FlagDiff> = [];\n\n const currentConfig = suite.flagConfig || {};\n const baselineConfig = suite.baseline?.flagConfig || {};\n const defaultConfig = suite.defaultFlagConfig || {};\n\n const currentFlat = flattenObject(currentConfig);\n const baselineFlat = flattenObject(baselineConfig);\n const defaultFlat = flattenObject(defaultConfig);\n\n const allKeys = new Set([\n ...Object.keys(currentFlat),\n ...Object.keys(baselineFlat),\n ...Object.keys(defaultFlat),\n ]);\n\n for (const key of allKeys) {\n const isInScope = suite.configFlags.some((pattern) => key.startsWith(pattern));\n if (!isInScope) continue;\n\n const currentValue = currentFlat[key];\n const baselineValue = baselineFlat[key];\n const defaultValue = defaultFlat[key];\n\n const currentStr = currentValue !== undefined ? JSON.stringify(currentValue) : undefined;\n const baselineStr = baselineValue !== undefined ? JSON.stringify(baselineValue) : undefined;\n const defaultStr = defaultValue !== undefined ? JSON.stringify(defaultValue) : undefined;\n\n const diffFromBaseline = suite.baseline && currentStr !== baselineStr;\n const diffFromDefault = currentStr !== defaultStr;\n\n if (diffFromBaseline || diffFromDefault) {\n diffs.push({\n flag: key,\n current: currentStr,\n baseline: suite.baseline ? baselineStr : undefined,\n default: defaultStr,\n });\n }\n }\n\n return diffs;\n}\n\nexport function printFinalReport({\n suiteData,\n config,\n registrationStatus,\n isDebug,\n logger = console.log,\n}: {\n suiteData: SuiteData[];\n config?: AxiomConnectionResolvedConfig;\n registrationStatus: Array<{ name: string; registered: boolean; error?: string }>;\n isDebug?: boolean;\n logger?: Logger;\n}) {\n logger('');\n logger(c.bgBlue(c.white(' FINAL EVALUATION REPORT ')));\n logger('');\n\n const runId = suiteData[0]?.runId;\n const orgId = suiteData[0]?.orgId;\n\n const anyRegistered = registrationStatus.some((s) => s.registered);\n const anyFailed = registrationStatus.some((s) => !s.registered);\n const allFailed = registrationStatus.length > 0 && registrationStatus.every((s) => !s.registered);\n const hasAnyScores = suiteData.some((suite) =>\n suite.cases.some((caseData) => Object.keys(caseData.scores ?? {}).length > 0),\n );\n const shouldPrintSuiteBoxes = isDebug || !allFailed || hasAnyScores;\n\n if (shouldPrintSuiteBoxes) {\n for (const suite of suiteData) {\n const scorerAverages = calculateScorerAverages(suite);\n const flagDiff = calculateFlagDiff(suite);\n printSuiteBox({\n suite,\n scorerAverages,\n calculateBaselineScorerAverage,\n flagDiff,\n logger,\n });\n logger('');\n }\n }\n\n if (anyRegistered && orgId && config?.consoleEndpointUrl) {\n if (suiteData.length === 1) {\n const suite = suiteData[0];\n const baselineParam = suite.baseline?.traceId ? `?baselineId=${suite.baseline.traceId}` : '';\n logger('View eval result:');\n logger(\n `${config.consoleEndpointUrl}/${orgId}/ai/evaluations/${suite.name}/${suite.version}${baselineParam}`,\n );\n } else {\n logger('View full report:');\n logger(`${config.consoleEndpointUrl}/${orgId}/ai/evaluations?runId=${runId}`);\n }\n } else if (isDebug) {\n logger(c.dim('Results not uploaded to Axiom (debug mode)'));\n } else {\n logger('Results not available in Axiom UI (registration failed)');\n }\n\n if (anyFailed) {\n logger('');\n for (const status of registrationStatus) {\n if (!status.registered) {\n logger(c.yellow(`⚠️ Warning: Failed to register \"${status.name}\" with Axiom`));\n if (status.error) {\n logger(c.dim(` Error: ${status.error}`));\n }\n logger(c.dim(` Results for this evaluation will not be available in the Axiom UI.`));\n }\n }\n }\n}\n","import type { AxiomEvalInstrumentationOptions, ResolvedAxiomConfig } from './index';\n\n/**\n * Builds a resources URL under the assumption that the API URL is in the format of https://api.axiom.co by replacing the subdomain with app.\n * @param urlString - The API URL\n * @returns The resources URL\n */\nconst buildConsoleUrl = (urlString: string) => {\n const url = new URL(urlString);\n\n return `${url.protocol}//app.${url.host.split('api.').at(-1)}`;\n};\n\n/**\n * Resolve Axiom connection settings from resolved config.\n *\n * Since the config is already resolved with defaults merged, we can directly\n * access the properties without fallback chains.\n *\n * @param config - The resolved configuration\n * @returns Resolved connection settings\n */\nexport function resolveAxiomConnection(\n config: ResolvedAxiomConfig,\n consoleUrlOverride?: string,\n): AxiomEvalInstrumentationOptions & { consoleEndpointUrl: string } {\n const consoleEndpointUrl = consoleUrlOverride ?? buildConsoleUrl(config.eval.url);\n // Use edgeUrl for ingest/query operations, falling back to url if not specified\n const edgeUrl = config.eval.edgeUrl || config.eval.url;\n\n return {\n url: config.eval.url,\n edgeUrl,\n consoleEndpointUrl: consoleEndpointUrl,\n token: config.eval.token,\n dataset: config.eval.dataset,\n orgId: config.eval.orgId,\n };\n}\n\nexport type AxiomConnectionResolvedConfig = ReturnType<typeof resolveAxiomConnection>;\n","import type { SerializedError } from 'vitest';\nimport type { Reporter, TestCase, TestModule, TestRunEndReason, TestSuite } from 'vitest/node';\n\nimport { getAxiomConfig } from './context/storage';\nimport type { EvaluationReport, MetaWithCase, MetaWithEval, Case } from './eval.types';\nimport {\n printBaselineNameAndVersion,\n printEvalNameAndFileName,\n printFinalReport,\n printGlobalFlagOverrides,\n printTestCaseCountStartDuration,\n type SuiteData,\n printOrphanedBaselineCases,\n getCaseFingerprint,\n printCaseResult,\n} from './reporter.console-utils';\nimport { resolveAxiomConnection, type AxiomConnectionResolvedConfig } from '../config/resolver';\nimport { getConsoleUrl } from '../cli/commands/eval.command';\nimport { dotNotationToNested, flattenObject } from '../util/dot-path';\n\n/**\n * Custom Vitest reporter for Axiom AI evaluations.\n *\n * This reporter collects evaluation results and scores from tests\n * and processes them for further analysis and reporting.\n *\n */\nexport class AxiomReporter implements Reporter {\n startTime: number = 0;\n start: number = 0;\n private _endOfRunConfigEnd: EvaluationReport['configEnd'] | undefined;\n private _suiteData: SuiteData[] = [];\n private _printedFlagOverrides = false;\n private _config: AxiomConnectionResolvedConfig | undefined;\n\n onTestRunStart() {\n this.start = performance.now();\n this.startTime = new Date().getTime();\n\n // Store resourcesUrl from config\n const config = getAxiomConfig();\n if (config) {\n this._config = resolveAxiomConnection(config, getConsoleUrl());\n }\n }\n\n async onTestSuiteReady(_testSuite: TestSuite) {\n const meta = _testSuite.meta() as MetaWithEval;\n if (_testSuite.state() === 'skipped' || !meta?.evaluation) {\n return;\n }\n\n // Print flag overrides once when defaults become available\n // (we don't have them in `onTestRunStart`)\n if (!this._printedFlagOverrides) {\n const defaultsFromConfigEnd = meta.evaluation.configEnd?.flags ?? {};\n const overridesFromConfigEnd = meta.evaluation.configEnd?.overrides ?? {};\n\n if (Object.keys(overridesFromConfigEnd).length > 0) {\n printGlobalFlagOverrides(overridesFromConfigEnd, defaultsFromConfigEnd);\n }\n this._printedFlagOverrides = true;\n }\n\n // capture end-of-run config snapshot (first non-empty wins)\n if (meta.evaluation.configEnd && !this._endOfRunConfigEnd) {\n this._endOfRunConfigEnd = meta.evaluation.configEnd;\n }\n }\n\n onTestCaseReady(test: TestCase) {\n const meta = test.meta() as MetaWithCase;\n\n // TODO: there seem to be some cases where `meta` is undefined\n // maybe we get here to early?\n if (!meta.case) return;\n }\n\n async onTestSuiteResult(testSuite: TestSuite) {\n const meta = testSuite.meta() as MetaWithEval;\n // test suite won't have any meta because its skipped or failed before setup\n if (testSuite.state() === 'skipped' || !meta?.evaluation) {\n return;\n }\n\n // capture end-of-run config snapshot (first non-empty wins)\n if (meta.evaluation.configEnd && !this._endOfRunConfigEnd) {\n this._endOfRunConfigEnd = meta.evaluation.configEnd;\n }\n\n const durationSeconds = Number((performance.now() - this.start) / 1000).toFixed(2);\n\n const cases: SuiteData['cases'] = [];\n for (const test of testSuite.children) {\n if (test.type !== 'test') continue;\n\n const testMeta = test.meta() as MetaWithCase;\n if (!testMeta?.case) continue;\n\n cases.push({\n index: testMeta.case.index,\n scores: testMeta.case.scores,\n outOfScopeFlags: testMeta.case.outOfScopeFlags,\n errors: testMeta.case.errors,\n runtimeFlags: testMeta.case.runtimeFlags,\n });\n }\n\n const cwd = process.cwd();\n const relativePath = testSuite.module.moduleId.replace(cwd, '').replace(/^\\//, '');\n\n // Collect suite data for final report\n let suiteBaseline = meta.evaluation.baseline;\n\n let flagConfig = meta.evaluation.flagConfig;\n if (meta.evaluation.configEnd) {\n const defaults = meta.evaluation.configEnd.flags ?? {};\n const overrides = meta.evaluation.configEnd.overrides ?? {};\n const defaultsFlat = flattenObject(defaults);\n const overridesFlat = flattenObject(overrides);\n flagConfig = dotNotationToNested({ ...defaultsFlat, ...overridesFlat });\n }\n\n const defaultFlagConfig = meta.evaluation.configEnd?.flags;\n\n this._suiteData.push({\n version: meta.evaluation.version,\n name: meta.evaluation.name,\n file: relativePath,\n duration: durationSeconds + 's',\n baseline: suiteBaseline || null,\n configFlags: meta.evaluation.configFlags,\n flagConfig,\n defaultFlagConfig,\n runId: meta.evaluation.runId,\n orgId: meta.evaluation.orgId,\n cases,\n outOfScopeFlags: meta.evaluation.outOfScopeFlags,\n registrationStatus: meta.evaluation.registrationStatus,\n });\n\n printEvalNameAndFileName(testSuite, meta);\n printBaselineNameAndVersion(meta);\n\n printTestCaseCountStartDuration(\n testSuite,\n this.startTime,\n durationSeconds,\n meta.evaluation.trials,\n );\n\n const matchedBaselineIndices = new Set<number>();\n const baselineCasesByFingerprint = new Map<string, Case[]>();\n\n if (suiteBaseline) {\n for (const c of suiteBaseline.cases) {\n const fp = getCaseFingerprint(c.input, c.expected);\n const cases = baselineCasesByFingerprint.get(fp) || [];\n cases.push(c);\n baselineCasesByFingerprint.set(fp, cases);\n }\n }\n\n for (const test of testSuite.children) {\n if (test.type !== 'test') continue;\n printCaseResult(test, baselineCasesByFingerprint, matchedBaselineIndices);\n }\n\n if (suiteBaseline) {\n printOrphanedBaselineCases(suiteBaseline, matchedBaselineIndices);\n }\n\n console.log('');\n }\n\n async onTestRunEnd(\n _testModules: ReadonlyArray<TestModule>,\n _errors: ReadonlyArray<SerializedError>,\n _reason: TestRunEndReason,\n ) {\n const shouldClear = !process.env.CI && process.stdout.isTTY !== false;\n\n if (shouldClear) {\n process.stdout.write('\\x1b[2J\\x1b[0f'); // Clear screen and move cursor to top\n }\n\n const registrationStatus = this._suiteData.map((suite) => ({\n name: suite.name,\n registered: suite.registrationStatus?.status === 'success',\n error:\n suite.registrationStatus?.status === 'failed' ? suite.registrationStatus.error : undefined,\n }));\n\n const isDebug = process.env.AXIOM_DEBUG === 'true';\n\n printFinalReport({\n suiteData: this._suiteData,\n config: this._config,\n registrationStatus,\n isDebug,\n });\n }\n}\n","import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport {\n context,\n trace,\n type Context,\n type Span,\n type SpanOptions,\n SpanStatusCode,\n type Tracer,\n type TracerProvider,\n} from '@opentelemetry/api';\nimport { initAxiomAI } from '../../src/otel/initAxiomAI';\nimport type {\n AxiomEvalInstrumentationHook,\n AxiomEvalInstrumentationOptions,\n AxiomEvalInstrumentationResult,\n ResolvedAxiomConfig,\n} from '../config/index';\nimport { resolveAxiomConnection } from '../config/resolver';\nimport { AxiomCLIError, errorToString } from '../util/errors';\nimport { loadConfig } from '../config/loader';\n\n// Lazily initialized tracer provider and exporter\nlet axiomProvider: NodeTracerProvider | undefined;\nlet axiomTracer: Tracer | undefined;\nlet userProvider: TracerProvider | undefined;\n\nlet initializationPromise: Promise<void> | null = null;\nlet initialized = false;\n\nasync function resolveInstrumentationHook(\n config: ResolvedAxiomConfig,\n): Promise<AxiomEvalInstrumentationHook | null> {\n if (config.eval.instrumentation) {\n return config.eval.instrumentation;\n }\n\n try {\n const { config: loadedConfig } = await loadConfig(process.cwd());\n return (loadedConfig.eval.instrumentation ?? null) as AxiomEvalInstrumentationHook | null;\n } catch (error) {\n throw new AxiomCLIError(\n `Failed to reload instrumentation from config: ${errorToString(error)}`,\n );\n }\n}\n\nasync function runInstrumentationHook(\n hook: AxiomEvalInstrumentationHook,\n options: AxiomEvalInstrumentationOptions,\n): Promise<AxiomEvalInstrumentationResult | void> {\n try {\n return await hook(options);\n } catch (error) {\n throw new AxiomCLIError(`Failed to execute instrumentation hook: ${errorToString(error)}`);\n }\n}\n\nfunction setupEvalProvider(connection: ReturnType<typeof resolveAxiomConnection>) {\n const headers: Record<string, string> = {\n 'X-Axiom-Dataset': connection.dataset,\n ...(connection.orgId ? { 'X-AXIOM-ORG-ID': connection.orgId } : {}),\n };\n\n if (connection.token) {\n headers.Authorization = `Bearer ${connection.token}`;\n }\n\n // Use edgeUrl for trace ingestion\n const collectorOptions = {\n url: `${connection.edgeUrl}/v1/traces`,\n headers,\n concurrencyLimit: 10,\n };\n\n const exporter = new OTLPTraceExporter(collectorOptions);\n\n const processor = new BatchSpanProcessor(exporter, {\n maxQueueSize: 2048,\n maxExportBatchSize: 512,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: 30000,\n });\n\n axiomProvider = new NodeTracerProvider({\n resource: resourceFromAttributes({\n ['service.name']: 'axiom',\n ['service.version']: __SDK_VERSION__,\n }),\n spanProcessors: [processor],\n });\n\n axiomTracer = axiomProvider.getTracer('axiom', __SDK_VERSION__);\n}\n\nexport async function initInstrumentation(config: {\n enabled: boolean;\n config: ResolvedAxiomConfig;\n}): Promise<void> {\n if (initialized) {\n return;\n }\n\n if (initializationPromise) {\n await initializationPromise;\n return;\n }\n\n initializationPromise = (async () => {\n if (!config.enabled) {\n axiomTracer = trace.getTracer('axiom', __SDK_VERSION__);\n initialized = true;\n return;\n }\n\n const connection = resolveAxiomConnection(config.config);\n const hook = await resolveInstrumentationHook(config.config);\n let hookResult: AxiomEvalInstrumentationResult | void = undefined;\n\n if (hook) {\n config.config.eval.instrumentation = hook;\n hookResult = await runInstrumentationHook(hook, {\n dataset: connection.dataset,\n token: connection.token,\n url: connection.url,\n edgeUrl: connection.edgeUrl,\n orgId: connection.orgId,\n });\n\n userProvider = hookResult?.provider ?? userProvider;\n }\n\n setupEvalProvider(connection);\n\n if (!hook) {\n // Fall back to default behaviour by registering our provider globally\n axiomProvider?.register();\n if (axiomTracer) {\n initAxiomAI({ tracer: axiomTracer });\n }\n }\n\n initialized = true;\n })();\n\n try {\n await initializationPromise;\n } finally {\n initializationPromise = null;\n }\n}\n\nexport const flush = async () => {\n if (initializationPromise) {\n await initializationPromise;\n }\n\n const tasks: Array<Promise<unknown>> = [];\n\n if (axiomProvider) {\n tasks.push(axiomProvider.forceFlush());\n }\n\n const candidateProviders = new Set<TracerProvider>();\n if (userProvider) {\n candidateProviders.add(userProvider);\n }\n\n const globalProvider = trace.getTracerProvider();\n if (globalProvider) {\n candidateProviders.add(globalProvider);\n }\n\n for (const provider of candidateProviders) {\n const flushFn = (provider as any).forceFlush;\n if (typeof flushFn === 'function') {\n tasks.push(\n flushFn.call(provider).catch((error: unknown) => {\n console.warn('[AxiomAI] Failed to flush tracer provider:', errorToString(error));\n }),\n );\n }\n }\n\n if (tasks.length > 0) {\n await Promise.all(tasks);\n }\n};\n\n/**\n * Ensure instrumentation is initialized with the given config.\n * Call this from within test context before using startSpan.\n */\nexport async function ensureInstrumentationInitialized(\n config: ResolvedAxiomConfig,\n options: { enabled?: boolean } = {},\n): Promise<void> {\n if (initialized) {\n return;\n }\n\n const enabled = options.enabled ?? true;\n await initInstrumentation({ enabled, config });\n}\n\nconst getEvalTracer = (): Tracer => {\n if (!axiomTracer) {\n throw new Error(\n 'Eval tracer not initialized. Ensure ensureInstrumentationInitialized() was awaited before starting spans.',\n );\n }\n\n return axiomTracer;\n};\n\nexport const startSpan = (name: string, opts: SpanOptions, context?: Context) => {\n if (!initialized || !axiomTracer) {\n throw new Error(\n 'Instrumentation not initialized. This is likely a bug - instrumentation should be initialized before startSpan is called.',\n );\n }\n return getEvalTracer().startSpan(name, opts, context);\n};\n\nexport const startActiveSpan = async <T>(\n name: string,\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n parentContext?: Context,\n): Promise<T> => {\n const span = startSpan(name, options, parentContext);\n\n return context.with(trace.setSpan(context.active(), span), async () => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n });\n};\n"],"mappings":"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","names":["calculateBaselineScorerAverage","cases","context"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[**axiom v0.48.0**](../README.md)
|
|
2
|
+
|
|
3
|
+
***
|
|
4
|
+
|
|
5
|
+
[axiom](../README.md) / config
|
|
6
|
+
|
|
7
|
+
# config
|
|
8
|
+
|
|
9
|
+
## Interfaces
|
|
10
|
+
|
|
11
|
+
- [AxiomConfig](interfaces/AxiomConfig.md)
|
|
12
|
+
|
|
13
|
+
## Type Aliases
|
|
14
|
+
|
|
15
|
+
- [AxiomEvalInstrumentationHook](type-aliases/AxiomEvalInstrumentationHook.md)
|
|
16
|
+
|
|
17
|
+
## Functions
|
|
18
|
+
|
|
19
|
+
- [defineConfig](functions/defineConfig.md)
|