axiom 0.48.1 → 0.49.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/dist/bin.js +5 -5
- package/dist/{chunk-3KVDJV5T.js → chunk-DFHS6W4F.js} +3 -3
- package/dist/{chunk-WOJCPKV5.js → chunk-LD4RCFZU.js} +2 -2
- package/dist/{chunk-WOJCPKV5.js.map → chunk-LD4RCFZU.js.map} +1 -1
- package/dist/{chunk-P4YKSKIZ.js → chunk-NEJD6H7N.js} +89 -42
- package/dist/chunk-NEJD6H7N.js.map +1 -0
- package/dist/{chunk-CG7FZS34.js → chunk-PIRM4IYM.js} +7 -7
- package/dist/{chunk-TMXR3FKM.js → chunk-TFDZLKGT.js} +2 -2
- package/dist/docs/README.md +2 -2
- package/dist/docs/config/README.md +1 -1
- package/dist/docs/config/functions/defineConfig.md +1 -1
- package/dist/docs/config/interfaces/AxiomConfig.md +1 -1
- package/dist/docs/config/type-aliases/AxiomEvalInstrumentationHook.md +1 -1
- package/dist/docs/evals/README.md +1 -1
- package/dist/docs/evals/classes/AxiomReporter.md +1 -1
- package/dist/docs/evals/functions/Eval.md +1 -1
- package/dist/docs/evals/interfaces/EvalBuilder.md +1 -1
- package/dist/docs/evals/interfaces/EvalContextData.md +1 -1
- package/dist/docs/evals/online/README.md +1 -1
- package/dist/docs/evals/online/functions/onlineEval.md +1 -1
- package/dist/docs/evals/online/type-aliases/OnlineEvalParams.md +1 -1
- package/dist/docs/evals/online/type-aliases/OnlineEvalScorerEntry.md +1 -1
- package/dist/docs/evals/online/type-aliases/OnlineEvalScorerInput.md +1 -1
- package/dist/docs/evals/online/type-aliases/SampledOnlineEvalScorer.md +1 -1
- package/dist/docs/evals/online/type-aliases/ScorerSampling.md +1 -1
- package/dist/docs/evals/type-aliases/Case.md +1 -1
- package/dist/docs/evals/type-aliases/Chat.md +1 -1
- package/dist/docs/evals/type-aliases/EvalParams.md +1 -1
- package/dist/docs/evals/type-aliases/EvalTask.md +1 -1
- package/dist/docs/evals/type-aliases/Evaluation.md +1 -1
- package/dist/docs/evals/type-aliases/Task.md +1 -1
- package/dist/docs/feedback/README.md +1 -1
- package/dist/docs/feedback/functions/createFeedbackClient.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackClient.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackConfig.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackErrorContext.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackEvent.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackInput.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackLinks.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackSettings.md +1 -1
- package/dist/docs/feedback/type-aliases/SendFeedbackFn.md +1 -1
- package/dist/docs/feedback/variables/Feedback.md +1 -1
- package/dist/docs/index/README.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddleware.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddlewareV1.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddlewareV2.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddlewareV3.md +1 -1
- package/dist/docs/index/functions/createAppScope.md +1 -1
- package/dist/docs/index/functions/experimental_parse.md +1 -1
- package/dist/docs/index/functions/getGlobalTracer.md +1 -1
- package/dist/docs/index/functions/initAxiomAI.md +1 -1
- package/dist/docs/index/functions/resetAxiomAI.md +1 -1
- package/dist/docs/index/functions/withSpan.md +1 -1
- package/dist/docs/index/functions/wrapAISDKModel.md +1 -1
- package/dist/docs/index/functions/wrapTool.md +1 -1
- package/dist/docs/index/functions/wrapTools.md +1 -1
- package/dist/docs/index/interfaces/AxiomTelemetryConfig.md +1 -1
- package/dist/docs/index/interfaces/experimental_AxiomPromptMetadata.md +1 -1
- package/dist/docs/index/interfaces/experimental_ParsedMessage.md +1 -1
- package/dist/docs/index/type-aliases/AxiomAIRedactionPolicy.md +1 -1
- package/dist/docs/index/type-aliases/WithSpanOptions.md +1 -1
- package/dist/docs/index/type-aliases/experimental_InferContext.md +1 -1
- package/dist/docs/index/type-aliases/experimental_InferSchema.md +1 -1
- package/dist/docs/index/type-aliases/experimental_ParsedMessagesArray.md +1 -1
- package/dist/docs/index/type-aliases/experimental_Prompt.md +1 -1
- package/dist/docs/index/type-aliases/experimental_TSchema.md +1 -1
- package/dist/docs/index/variables/RedactionPolicy.md +1 -1
- package/dist/docs/index/variables/experimental_Type.md +1 -1
- package/dist/docs/index/variables/onlineEval.md +1 -1
- package/dist/docs/scorers/aggregations/README.md +1 -1
- package/dist/docs/scorers/aggregations/functions/Mean.md +1 -1
- package/dist/docs/scorers/aggregations/functions/Median.md +1 -1
- package/dist/docs/scorers/aggregations/functions/PassAtK.md +1 -1
- package/dist/docs/scorers/aggregations/functions/PassHatK.md +1 -1
- package/dist/docs/scorers/aggregations/type-aliases/Aggregation.md +1 -1
- package/dist/docs/scorers/aggregations/variables/AllTrialsPass.md +1 -1
- package/dist/docs/scorers/aggregations/variables/AtLeastOneTrialPasses.md +1 -1
- package/dist/docs/scorers/scorers/README.md +1 -1
- package/dist/docs/scorers/scorers/functions/Scorer.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/Score.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScoreWithName.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScorerLike.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScorerOptions.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScorerType.md +1 -1
- package/dist/evals/online.js +2 -2
- package/dist/evals.js +4 -4
- package/dist/index.js +3 -3
- package/dist/{run-vitest-TESZNJA7.js → run-vitest-C7ATYPR6.js} +5 -5
- package/package.json +1 -1
- package/dist/chunk-P4YKSKIZ.js.map +0 -1
- /package/dist/{chunk-3KVDJV5T.js.map → chunk-DFHS6W4F.js.map} +0 -0
- /package/dist/{chunk-CG7FZS34.js.map → chunk-PIRM4IYM.js.map} +0 -0
- /package/dist/{chunk-TMXR3FKM.js.map → chunk-TFDZLKGT.js.map} +0 -0
- /package/dist/{run-vitest-TESZNJA7.js.map → run-vitest-C7ATYPR6.js.map} +0 -0
package/dist/bin.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
extractOverrides,
|
|
4
4
|
loadEvalCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DFHS6W4F.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-NEJD6H7N.js";
|
|
19
19
|
import {
|
|
20
20
|
AxiomCLIError
|
|
21
21
|
} from "./chunk-ISSDOC43.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-LD4RCFZU.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.49.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.49.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-NEJD6H7N.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-C7ATYPR6.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-DFHS6W4F.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.49.0",
|
|
66
66
|
type: "module",
|
|
67
67
|
author: "Axiom, Inc.",
|
|
68
68
|
contributors: [
|
|
@@ -253,4 +253,4 @@ export {
|
|
|
253
253
|
getGlobalTracer,
|
|
254
254
|
resetAxiomAI
|
|
255
255
|
};
|
|
256
|
-
//# sourceMappingURL=chunk-
|
|
256
|
+
//# sourceMappingURL=chunk-LD4RCFZU.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.48.1\",\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":";AAAA,SAAS,SAAS,mBAA4C;;;ACOvD,IAAM,uBAAuB;AAC7B,IAAM,gCAAgC;;;ADEtC,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,cAAc;AAAA,IACZ,uBAAuB;AAAA,IACvB,6BAA6B;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB;AAAA,IACpB,uBAAuB;AAAA,IACvB,6BAA6B;AAAA,EAC/B;AACF;AAGO,IAAM,yBAAyB,OAAO,IAAI,wBAAwB;AAMzE,SAAS,2BAA+D;AACtE,SAAQ,WAAmB,sBAAsB;AACnD;AAUA,SAAS,4BACP,cACA,aACwB;AAExB,SAAO;AAAA,IACL,uBACE,aAAa,yBACb,cAAc,yBACd,gBAAgB,aAAa;AAAA,IAC/B,6BACE,aAAa,+BACb,cAAc,+BACd,gBAAgB,aAAa;AAAA,EACjC;AACF;AAKO,SAAS,qBAAqB;AACnC,SAAO,4BAA4B,yBAAyB,GAAG,0BAA0B,CAAC;AAC5F;AAWO,SAAS,6BACd,MACA,WACA,OACA,uBACM;AACN,MAAI,0BAA0B,QAAQ;AACpC,SAAK,aAAa,WAAW,KAAK;AAAA,EACpC;AAIF;AAQA,SAAS,4BAAgE;AACvE,QAAM,UAAmB,YAAY,WAAW,QAAQ,OAAO,CAAC,KAAK,YAAY,cAAc;AAC/F,QAAM,mBAAmB,QAAQ,SAAS,6BAA6B,GAAG;AAE1E,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,KAAK,4DAA4D,KAAK;AAC9E,WAAO;AAAA,EACT;AACF;;;AElHA,SAAS,aAAa;;;ACDtB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,cAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,KAAO;AAAA,IACP,OAAS;AAAA,IACT,4BAA4B;AAAA,IAC5B,QAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,cAAc;AAAA,IACd,uBAAuB;AAAA,IACvB,SAAW;AAAA,EACb;AAAA,EACA,OAAS;AAAA,EACT,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,KAAO;AAAA,IACL,OAAS;AAAA,EACX;AAAA,EACA,SAAW;AAAA,IACT,QAAQ;AAAA,MACN,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACZ,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,qBAAqB;AAAA,MACnB,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,MACd,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,6BAA6B;AAAA,MAC3B,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,eAAe;AAAA,MACb,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,iBAAiB;AAAA,MACf,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,EACX,cAAgB;AAAA,IACd,aAAa;AAAA,IACb,6CAA6C;AAAA,IAC7C,sCAAsC;AAAA,IACtC,2CAA2C;AAAA,IAC3C,4BAA4B;AAAA,IAC5B,iCAAiC;AAAA,IACjC,uCAAuC;AAAA,IACvC,qBAAqB;AAAA,IACrB,KAAO;AAAA,IACP,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,uBAAuB;AAAA,IACvB,QAAU;AAAA,EACZ;AAAA,EACA,kBAAoB;AAAA,IAClB,sBAAsB;AAAA,IACtB,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,iCAAiC;AAAA,IACjC,iCAAiC;AAAA,IACjC,uBAAuB;AAAA,IACvB,eAAe;AAAA,IACf,uBAAuB;AAAA,IACvB,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,QAAU;AAAA,IACV,KAAO;AAAA,IACP,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,2BAA2B;AAAA,IAC3B,YAAc;AAAA,IACd,QAAU;AAAA,IACV,KAAO;AAAA,EACT;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,gBAAkB;AACpB;;;AD5HA,IAAM,qBAAqB,OAAO,IAAI,oBAAoB;AAU1D,SAAS,mBAAmB,QAA6B;AACvD,QAAM,YAAY;AAKlB,QAAM,OACJ,UAAU,uBAAuB,QACjC,UAAU,wBAAwB,QAClC,gBAAY;AAEd,QAAM,UACJ,UAAU,uBAAuB,WACjC,UAAU,wBAAwB,WAClC,gBAAY;AAEd,SAAO,EAAE,MAAM,QAAQ;AACzB;AAaO,SAAS,YAAY,QAAsE;AAChG,QAAM,WAAW,mBAAmB,OAAO,MAAM;AACjD,QAAM,gBAAiB,WAAmB,kBAAkB;AAG5D,MACE,iBACA,cAAc,SAAS,SAAS,QAChC,cAAc,YAAY,SAAS,SACnC;AACA;AAAA,EACF;AAGA,MAAI,eAAe;AACjB,YAAQ;AAAA,MACN,kFACe,cAAc,IAAI,IAAI,cAAc,OAAO,UAChD,SAAS,IAAI,IAAI,SAAS,OAAO;AAAA,IAC7C;AAAA,EACF;AAGA,EAAC,WAAmB,kBAAkB,IAAI;AAG1C,MAAI,OAAO,iBAAiB;AAC1B,IAAC,WAAmB,sBAAsB,IAAI,OAAO;AAAA,EACvD;AACF;AAMO,SAAS,kBAA0B;AAExC,QAAM,QAAS,WAAmB,kBAAkB;AAGpD,MAAI,CAAC,OAAO;AACV,UAAM,UAAU,QAAQ,IAAI,gBAAgB;AAC5C,QAAI,CAAC,SAAS;AACZ,cAAQ;AAAA,QACN;AAAA,MAGF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,EAAE,MAAM,QAAQ,IAAI,SAAS,EAAE,MAAM,gBAAY,MAAM,SAAS,gBAAY,QAAQ;AAExF,MAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,WAAO,gBAAY;AACnB,cAAU,gBAAY;AACtB,QAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,aAAO;AACP,gBAAU;AAAA,IACZ;AAAA,EACF;AAGA,SAAO,MAAM,UAAU,MAAM,OAAO;AACtC;AAKO,SAAS,eAAe;AAC7B,EAAC,WAAmB,kBAAkB,IAAI;AAC1C,EAAC,WAAmB,sBAAsB,IAAI;AAChD;","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.49.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":[]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
getRedactionPolicy,
|
|
6
6
|
handleMaybeRedactedAttribute,
|
|
7
7
|
package_default
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-LD4RCFZU.js";
|
|
9
9
|
import {
|
|
10
10
|
isValidName
|
|
11
11
|
} from "./chunk-MM5FFQJT.js";
|
|
@@ -260,10 +260,16 @@ function recordSpanError(span, err) {
|
|
|
260
260
|
span.setAttribute(Attr.HTTP.Response.StatusCode, err.status);
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
|
+
var spanContextStore = /* @__PURE__ */ new WeakMap();
|
|
264
|
+
var spanContextFactories = {
|
|
265
|
+
v1: () => ({ version: "v1", originalPrompt: [], rawCall: void 0 }),
|
|
266
|
+
v2: () => ({ version: "v2", originalPrompt: [], originalV2Prompt: void 0 }),
|
|
267
|
+
v3: () => ({ version: "v3", originalPrompt: [], originalV3Prompt: void 0 })
|
|
268
|
+
};
|
|
263
269
|
async function withSpanHandling(modelId, operation, options) {
|
|
264
270
|
const bag = propagation.getActiveBaggage();
|
|
265
271
|
const isWithinWithSpan = bag?.getEntry(WITHSPAN_BAGGAGE_KEY)?.value === "true";
|
|
266
|
-
const
|
|
272
|
+
const createSpanContext = spanContextFactories[options?.version ?? "v1"];
|
|
267
273
|
const name = createGenAISpanName(Attr.GenAI.Operation.Name_Values.Chat, modelId);
|
|
268
274
|
if (isWithinWithSpan) {
|
|
269
275
|
const activeSpan = trace.getActiveSpan();
|
|
@@ -271,6 +277,11 @@ async function withSpanHandling(modelId, operation, options) {
|
|
|
271
277
|
throw new Error("Expected active span when within withSpan");
|
|
272
278
|
}
|
|
273
279
|
activeSpan.updateName(name);
|
|
280
|
+
let spanContext = spanContextStore.get(activeSpan);
|
|
281
|
+
if (!spanContext) {
|
|
282
|
+
spanContext = createSpanContext();
|
|
283
|
+
spanContextStore.set(activeSpan, spanContext);
|
|
284
|
+
}
|
|
274
285
|
const lease = {
|
|
275
286
|
owned: false,
|
|
276
287
|
end: () => {
|
|
@@ -294,7 +305,7 @@ async function withSpanHandling(modelId, operation, options) {
|
|
|
294
305
|
owned: true,
|
|
295
306
|
end: () => span.end()
|
|
296
307
|
};
|
|
297
|
-
return await operation(span,
|
|
308
|
+
return await operation(span, createSpanContext(), lease);
|
|
298
309
|
},
|
|
299
310
|
{
|
|
300
311
|
manualEnd: options?.streaming ?? false,
|
|
@@ -1307,6 +1318,19 @@ var appendPromptMetadataToSpan = (span, messages) => {
|
|
|
1307
1318
|
if (axiomMeta.version) span.setAttribute(Attr.GenAI.PromptMetadata.Version, axiomMeta.version);
|
|
1308
1319
|
}
|
|
1309
1320
|
};
|
|
1321
|
+
function setStreamStepAttributes(span, values) {
|
|
1322
|
+
const inputTokens = ensureNumber(values.inputTokens);
|
|
1323
|
+
if (inputTokens !== void 0) {
|
|
1324
|
+
span.setAttribute(Attr.GenAI.Usage.InputTokens, inputTokens);
|
|
1325
|
+
}
|
|
1326
|
+
const outputTokens = ensureNumber(values.outputTokens);
|
|
1327
|
+
if (outputTokens !== void 0) {
|
|
1328
|
+
span.setAttribute(Attr.GenAI.Usage.OutputTokens, outputTokens);
|
|
1329
|
+
}
|
|
1330
|
+
if (values.finishReason) {
|
|
1331
|
+
span.setAttribute(Attr.GenAI.Response.FinishReasons, JSON.stringify([values.finishReason]));
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1310
1334
|
function axiomAIMiddlewareV1() {
|
|
1311
1335
|
return {
|
|
1312
1336
|
wrapGenerate: async ({ doGenerate, params, model }) => {
|
|
@@ -1357,17 +1381,23 @@ function axiomAIMiddlewareV1() {
|
|
|
1357
1381
|
},
|
|
1358
1382
|
async flush(controller) {
|
|
1359
1383
|
try {
|
|
1384
|
+
const statsResult = stats.result;
|
|
1360
1385
|
await setPostCallAttributesV1(
|
|
1361
1386
|
span,
|
|
1362
1387
|
{
|
|
1363
1388
|
...head,
|
|
1364
|
-
...
|
|
1389
|
+
...statsResult,
|
|
1365
1390
|
toolCalls: toolAggregator.result.length > 0 ? toolAggregator.result : void 0,
|
|
1366
1391
|
text: textAggregator.text
|
|
1367
1392
|
},
|
|
1368
1393
|
context3,
|
|
1369
1394
|
model
|
|
1370
1395
|
);
|
|
1396
|
+
setStreamStepAttributes(childSpan, {
|
|
1397
|
+
inputTokens: statsResult.usage?.promptTokens,
|
|
1398
|
+
outputTokens: statsResult.usage?.completionTokens,
|
|
1399
|
+
finishReason: statsResult.finishReason
|
|
1400
|
+
});
|
|
1371
1401
|
childSpan.end();
|
|
1372
1402
|
if (lease.owned) lease.end();
|
|
1373
1403
|
controller.terminate();
|
|
@@ -1452,14 +1482,20 @@ function axiomAIMiddlewareV2() {
|
|
|
1452
1482
|
},
|
|
1453
1483
|
async flush(controller) {
|
|
1454
1484
|
try {
|
|
1485
|
+
const statsResult = stats.result;
|
|
1455
1486
|
const streamResult = {
|
|
1456
|
-
...
|
|
1487
|
+
...statsResult,
|
|
1457
1488
|
content: [
|
|
1458
1489
|
...textAggregator.text ? [{ type: "text", text: textAggregator.text }] : [],
|
|
1459
1490
|
...toolAggregator.result
|
|
1460
1491
|
]
|
|
1461
1492
|
};
|
|
1462
1493
|
await setPostCallAttributesV2(span, streamResult, context3, model);
|
|
1494
|
+
setStreamStepAttributes(childSpan, {
|
|
1495
|
+
inputTokens: statsResult.usage?.inputTokens,
|
|
1496
|
+
outputTokens: statsResult.usage?.outputTokens,
|
|
1497
|
+
finishReason: statsResult.finishReason
|
|
1498
|
+
});
|
|
1463
1499
|
childSpan.end();
|
|
1464
1500
|
if (lease.owned) lease.end();
|
|
1465
1501
|
controller.terminate();
|
|
@@ -1557,11 +1593,15 @@ async function setPostCallAttributesV1(span, result, context3, _model) {
|
|
|
1557
1593
|
}
|
|
1558
1594
|
const inputTokens = ensureNumber(result.usage?.promptTokens);
|
|
1559
1595
|
if (inputTokens !== void 0) {
|
|
1560
|
-
|
|
1596
|
+
const curr = context3.accumulatedInputTokens ?? 0;
|
|
1597
|
+
context3.accumulatedInputTokens = curr + inputTokens;
|
|
1598
|
+
span.setAttribute(Attr.GenAI.Usage.InputTokens, context3.accumulatedInputTokens);
|
|
1561
1599
|
}
|
|
1562
1600
|
const outputTokens = ensureNumber(result.usage?.completionTokens);
|
|
1563
1601
|
if (outputTokens !== void 0) {
|
|
1564
|
-
|
|
1602
|
+
const curr = context3.accumulatedOutputTokens ?? 0;
|
|
1603
|
+
context3.accumulatedOutputTokens = curr + outputTokens;
|
|
1604
|
+
span.setAttribute(Attr.GenAI.Usage.OutputTokens, context3.accumulatedOutputTokens);
|
|
1565
1605
|
}
|
|
1566
1606
|
if (result.finishReason) {
|
|
1567
1607
|
span.setAttribute(Attr.GenAI.Response.FinishReasons, JSON.stringify([result.finishReason]));
|
|
@@ -1599,22 +1639,23 @@ async function setPostCallAttributesV2(span, result, context3, _model) {
|
|
|
1599
1639
|
const toolCalls = result.content?.filter(
|
|
1600
1640
|
(c) => c.type === "tool-call"
|
|
1601
1641
|
);
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
const
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1642
|
+
if (result.response?.id) {
|
|
1643
|
+
span.setAttribute(Attr.GenAI.Response.ID, result.response.id);
|
|
1644
|
+
}
|
|
1645
|
+
if (result.response?.modelId) {
|
|
1646
|
+
span.setAttribute(Attr.GenAI.Response.Model, result.response.modelId);
|
|
1647
|
+
}
|
|
1648
|
+
const inputTokens = ensureNumber(result.usage?.inputTokens);
|
|
1649
|
+
if (inputTokens !== void 0) {
|
|
1650
|
+
const curr = context3.accumulatedInputTokens ?? 0;
|
|
1651
|
+
context3.accumulatedInputTokens = curr + inputTokens;
|
|
1652
|
+
span.setAttribute(Attr.GenAI.Usage.InputTokens, context3.accumulatedInputTokens);
|
|
1653
|
+
}
|
|
1654
|
+
const outputTokens = ensureNumber(result.usage?.outputTokens);
|
|
1655
|
+
if (outputTokens !== void 0) {
|
|
1656
|
+
const curr = context3.accumulatedOutputTokens ?? 0;
|
|
1657
|
+
context3.accumulatedOutputTokens = curr + outputTokens;
|
|
1658
|
+
span.setAttribute(Attr.GenAI.Usage.OutputTokens, context3.accumulatedOutputTokens);
|
|
1618
1659
|
}
|
|
1619
1660
|
if (toolCalls && toolCalls.length > 0) {
|
|
1620
1661
|
const originalPrompt = context3.originalPrompt || [];
|
|
@@ -1648,7 +1689,7 @@ async function setPostCallAttributesV2(span, result, context3, _model) {
|
|
|
1648
1689
|
redactionPolicy.captureMessageContent
|
|
1649
1690
|
);
|
|
1650
1691
|
}
|
|
1651
|
-
if (result.finishReason
|
|
1692
|
+
if (result.finishReason) {
|
|
1652
1693
|
span.setAttribute(Attr.GenAI.Response.FinishReasons, JSON.stringify([result.finishReason]));
|
|
1653
1694
|
}
|
|
1654
1695
|
}
|
|
@@ -1737,6 +1778,11 @@ function axiomAIMiddlewareV3() {
|
|
|
1737
1778
|
context3,
|
|
1738
1779
|
model
|
|
1739
1780
|
);
|
|
1781
|
+
setStreamStepAttributes(childSpan, {
|
|
1782
|
+
inputTokens: statsResult.usage?.inputTokens?.total,
|
|
1783
|
+
outputTokens: statsResult.usage?.outputTokens?.total,
|
|
1784
|
+
finishReason: statsResult.finishReason?.unified
|
|
1785
|
+
});
|
|
1740
1786
|
childSpan.end();
|
|
1741
1787
|
if (lease.owned) lease.end();
|
|
1742
1788
|
controller.terminate();
|
|
@@ -1788,22 +1834,23 @@ async function setPostCallAttributesV3(span, result, context3, _model) {
|
|
|
1788
1834
|
const toolCalls = result.content?.filter(
|
|
1789
1835
|
(c) => c.type === "tool-call"
|
|
1790
1836
|
);
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
const
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1837
|
+
if (result.response?.id) {
|
|
1838
|
+
span.setAttribute(Attr.GenAI.Response.ID, result.response.id);
|
|
1839
|
+
}
|
|
1840
|
+
if (result.response?.modelId) {
|
|
1841
|
+
span.setAttribute(Attr.GenAI.Response.Model, result.response.modelId);
|
|
1842
|
+
}
|
|
1843
|
+
const inputTokens = ensureNumber(result.usage?.inputTokens?.total);
|
|
1844
|
+
if (inputTokens !== void 0) {
|
|
1845
|
+
const curr = context3.accumulatedInputTokens ?? 0;
|
|
1846
|
+
context3.accumulatedInputTokens = curr + inputTokens;
|
|
1847
|
+
span.setAttribute(Attr.GenAI.Usage.InputTokens, context3.accumulatedInputTokens);
|
|
1848
|
+
}
|
|
1849
|
+
const outputTokens = ensureNumber(result.usage?.outputTokens?.total);
|
|
1850
|
+
if (outputTokens !== void 0) {
|
|
1851
|
+
const curr = context3.accumulatedOutputTokens ?? 0;
|
|
1852
|
+
context3.accumulatedOutputTokens = curr + outputTokens;
|
|
1853
|
+
span.setAttribute(Attr.GenAI.Usage.OutputTokens, context3.accumulatedOutputTokens);
|
|
1807
1854
|
}
|
|
1808
1855
|
if (toolCalls && toolCalls.length > 0) {
|
|
1809
1856
|
const originalPrompt = context3.originalPrompt || [];
|
|
@@ -1837,7 +1884,7 @@ async function setPostCallAttributesV3(span, result, context3, _model) {
|
|
|
1837
1884
|
redactionPolicy.captureMessageContent
|
|
1838
1885
|
);
|
|
1839
1886
|
}
|
|
1840
|
-
if (result.finishReason
|
|
1887
|
+
if (result.finishReason) {
|
|
1841
1888
|
span.setAttribute(
|
|
1842
1889
|
Attr.GenAI.Response.FinishReasons,
|
|
1843
1890
|
JSON.stringify([result.finishReason.unified])
|
|
@@ -3099,4 +3146,4 @@ export {
|
|
|
3099
3146
|
withEvalContext,
|
|
3100
3147
|
getConfigScope
|
|
3101
3148
|
};
|
|
3102
|
-
//# sourceMappingURL=chunk-
|
|
3149
|
+
//# sourceMappingURL=chunk-NEJD6H7N.js.map
|