modelrig 0.4.0 → 0.6.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/CHANGELOG.md +238 -0
- package/README.md +65 -3
- package/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +36 -7
- package/dist/adapters/attempt-meta-map.d.ts +63 -0
- package/dist/adapters/attempt-meta-map.d.ts.map +1 -0
- package/dist/adapters/attempt-meta-map.js +154 -0
- package/dist/adapters/deepseek.d.ts.map +1 -1
- package/dist/adapters/deepseek.js +25 -2
- package/dist/adapters/gemini.d.ts +39 -0
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +82 -4
- package/dist/adapters/grok.d.ts.map +1 -1
- package/dist/adapters/grok.js +25 -2
- package/dist/adapters/openai-compat.d.ts.map +1 -1
- package/dist/adapters/openai-compat.js +25 -2
- package/dist/adapters/openai-stream.d.ts +2 -0
- package/dist/adapters/openai-stream.d.ts.map +1 -1
- package/dist/adapters/openai-stream.js +23 -3
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +36 -6
- package/dist/artifacts/artifact.d.ts +3 -2
- package/dist/artifacts/artifact.d.ts.map +1 -1
- package/dist/artifacts/artifact.js +35 -9
- package/dist/artifacts/classification.d.ts +27 -0
- package/dist/artifacts/classification.d.ts.map +1 -0
- package/dist/artifacts/classification.js +38 -0
- package/dist/artifacts/index.d.ts +3 -1
- package/dist/artifacts/index.d.ts.map +1 -1
- package/dist/artifacts/index.js +10 -1
- package/dist/artifacts/run-context.d.ts +33 -2
- package/dist/artifacts/run-context.d.ts.map +1 -1
- package/dist/artifacts/run-context.js +95 -1
- package/dist/artifacts/scrub.d.ts +26 -0
- package/dist/artifacts/scrub.d.ts.map +1 -1
- package/dist/artifacts/scrub.js +53 -0
- package/dist/artifacts/step.d.ts +9 -0
- package/dist/artifacts/step.d.ts.map +1 -1
- package/dist/artifacts/step.js +9 -0
- package/dist/bakeoff/engine.d.ts +46 -4
- package/dist/bakeoff/engine.d.ts.map +1 -1
- package/dist/bakeoff/engine.js +269 -19
- package/dist/bakeoff/eval-cases.d.ts +5 -0
- package/dist/bakeoff/eval-cases.d.ts.map +1 -1
- package/dist/bakeoff/eval-cases.js +3 -0
- package/dist/bakeoff/judge.d.ts +39 -0
- package/dist/bakeoff/judge.d.ts.map +1 -0
- package/dist/bakeoff/judge.js +102 -0
- package/dist/bakeoff/quality.d.ts +44 -0
- package/dist/bakeoff/quality.d.ts.map +1 -0
- package/dist/bakeoff/quality.js +126 -0
- package/dist/bakeoff/reference.d.ts +34 -0
- package/dist/bakeoff/reference.d.ts.map +1 -0
- package/dist/bakeoff/reference.js +68 -0
- package/dist/bakeoff/replay.d.ts +25 -0
- package/dist/bakeoff/replay.d.ts.map +1 -1
- package/dist/bakeoff/replay.js +65 -2
- package/dist/bakeoff/report.d.ts +8 -1
- package/dist/bakeoff/report.d.ts.map +1 -1
- package/dist/bakeoff/report.js +83 -12
- package/dist/bakeoff/samples.d.ts +35 -2
- package/dist/bakeoff/samples.d.ts.map +1 -1
- package/dist/bakeoff/samples.js +67 -6
- package/dist/bakeoff/stats.d.ts +17 -1
- package/dist/bakeoff/stats.d.ts.map +1 -1
- package/dist/bakeoff/stats.js +67 -0
- package/dist/bakeoff/types.d.ts +76 -5
- package/dist/bakeoff/types.d.ts.map +1 -1
- package/dist/bakeoff/types.js +4 -3
- package/dist/cli-query.d.ts +14 -0
- package/dist/cli-query.d.ts.map +1 -0
- package/dist/cli-query.js +59 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +47 -24
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -0
- package/dist/detect/detector.d.ts +82 -0
- package/dist/detect/detector.d.ts.map +1 -0
- package/dist/detect/detector.js +23 -0
- package/dist/index.d.ts +34 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -12
- package/dist/query/analytics.d.ts +84 -0
- package/dist/query/analytics.d.ts.map +1 -0
- package/dist/query/analytics.js +280 -0
- package/dist/query/columns.d.ts +59 -0
- package/dist/query/columns.d.ts.map +1 -0
- package/dist/query/columns.js +89 -0
- package/dist/query/grammar.d.ts +74 -7
- package/dist/query/grammar.d.ts.map +1 -1
- package/dist/query/grammar.js +179 -71
- package/dist/query/saved.d.ts +26 -0
- package/dist/query/saved.d.ts.map +1 -0
- package/dist/query/saved.js +51 -0
- package/dist/registry/select.d.ts +59 -0
- package/dist/registry/select.d.ts.map +1 -1
- package/dist/registry/select.js +66 -0
- package/dist/routes/loader-warnings.d.ts +28 -0
- package/dist/routes/loader-warnings.d.ts.map +1 -0
- package/dist/routes/loader-warnings.js +56 -0
- package/dist/routes/loader.d.ts +1 -11
- package/dist/routes/loader.d.ts.map +1 -1
- package/dist/routes/loader.js +54 -31
- package/dist/routes/objective-loader.d.ts +35 -0
- package/dist/routes/objective-loader.d.ts.map +1 -0
- package/dist/routes/objective-loader.js +286 -0
- package/dist/run/accept.d.ts +43 -0
- package/dist/run/accept.d.ts.map +1 -0
- package/dist/run/accept.js +65 -0
- package/dist/run/cost.d.ts +13 -0
- package/dist/run/cost.d.ts.map +1 -1
- package/dist/run/cost.js +27 -0
- package/dist/run/dispatch.d.ts +24 -1
- package/dist/run/dispatch.d.ts.map +1 -1
- package/dist/run/dispatch.js +19 -0
- package/dist/run/ladder-key.d.ts +4 -0
- package/dist/run/ladder-key.d.ts.map +1 -1
- package/dist/run/ladder-key.js +3 -0
- package/dist/run/quality-gate.d.ts +39 -0
- package/dist/run/quality-gate.d.ts.map +1 -0
- package/dist/run/quality-gate.js +70 -0
- package/dist/run/raw-defaults.d.ts +52 -0
- package/dist/run/raw-defaults.d.ts.map +1 -0
- package/dist/run/raw-defaults.js +123 -0
- package/dist/run/raw.d.ts +12 -0
- package/dist/run/raw.d.ts.map +1 -1
- package/dist/run/raw.js +107 -8
- package/dist/run/record-attempt.d.ts.map +1 -1
- package/dist/run/record-attempt.js +22 -1
- package/dist/run/resolve.d.ts +17 -1
- package/dist/run/resolve.d.ts.map +1 -1
- package/dist/run/resolve.js +20 -4
- package/dist/run/routing-docs.d.ts.map +1 -1
- package/dist/run/routing-docs.js +12 -5
- package/dist/run/run.d.ts +7 -1
- package/dist/run/run.d.ts.map +1 -1
- package/dist/run/run.js +54 -69
- package/dist/run/variant.d.ts +43 -0
- package/dist/run/variant.d.ts.map +1 -0
- package/dist/run/variant.js +86 -0
- package/dist/savings/emit.d.ts +33 -0
- package/dist/savings/emit.d.ts.map +1 -1
- package/dist/savings/emit.js +75 -3
- package/dist/settings/index.d.ts +1 -1
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +2 -1
- package/dist/settings/task-settings.d.ts +10 -0
- package/dist/settings/task-settings.d.ts.map +1 -1
- package/dist/settings/task-settings.js +17 -0
- package/dist/telemetry/attempt-meta.d.ts +178 -0
- package/dist/telemetry/attempt-meta.d.ts.map +1 -0
- package/dist/telemetry/attempt-meta.js +319 -0
- package/dist/telemetry/exporter.d.ts.map +1 -1
- package/dist/telemetry/exporter.js +6 -0
- package/dist/telemetry/ingest-protocol.d.ts +11 -0
- package/dist/telemetry/ingest-protocol.d.ts.map +1 -1
- package/dist/telemetry/ingest-protocol.js +3 -0
- package/dist/telemetry/otel-map.d.ts +10 -0
- package/dist/telemetry/otel-map.d.ts.map +1 -1
- package/dist/telemetry/otel-map.js +64 -0
- package/dist/telemetry/store-migrations.d.ts.map +1 -1
- package/dist/telemetry/store-migrations.js +15 -0
- package/dist/telemetry/store.d.ts.map +1 -1
- package/dist/telemetry/store.js +25 -7
- package/dist/types/failures-teaching.d.ts.map +1 -1
- package/dist/types/failures-teaching.js +20 -0
- package/dist/types/failures.d.ts +1 -1
- package/dist/types/failures.d.ts.map +1 -1
- package/dist/types/failures.js +1 -0
- package/dist/types/provider.d.ts +9 -0
- package/dist/types/provider.d.ts.map +1 -1
- package/dist/types/quality.d.ts +41 -0
- package/dist/types/quality.d.ts.map +1 -0
- package/dist/types/quality.js +12 -0
- package/dist/types/route.d.ts +120 -0
- package/dist/types/route.d.ts.map +1 -1
- package/dist/types/telemetry.d.ts +13 -0
- package/dist/types/telemetry.d.ts.map +1 -1
- package/dist/validate-cli.d.ts.map +1 -1
- package/dist/validate-cli.js +10 -0
- package/dist/watch/evaluate.d.ts +27 -1
- package/dist/watch/evaluate.d.ts.map +1 -1
- package/dist/watch/evaluate.js +13 -0
- package/dist/watch/proposals.d.ts +28 -0
- package/dist/watch/proposals.d.ts.map +1 -1
- package/dist/watch/proposals.js +51 -0
- package/package.json +1 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WI-1 Metadata Capture — the attempt envelope (spec §2–§3, wired 2026-08-22).
|
|
3
|
+
*
|
|
4
|
+
* Classification rule (the load-bearing invariant): every field is an enum, a
|
|
5
|
+
* number, a boolean, a hash, or an identifier — NEVER free text, never
|
|
6
|
+
* content. `summarizeAttemptMeta` is the ONLY producer (same discipline as
|
|
7
|
+
* `summarizeScrub` / `summarizeMask`); it must never throw into the run loop
|
|
8
|
+
* (absent envelope = unknown, byte-identical run result). Adapters expose only
|
|
9
|
+
* NATIVE fields as `AdapterResult.meta` (adapters/attempt-meta-map.ts); this
|
|
10
|
+
* producer adds the hashes, byte/char sizes, context bucket, and cost
|
|
11
|
+
* components, hashes undeclared tool names, and drops any string that is not an
|
|
12
|
+
* enum/identifier/hash (length > 128 or containing whitespace).
|
|
13
|
+
*/
|
|
14
|
+
import type { AdapterUsage, ProviderId } from "../types/provider";
|
|
15
|
+
export type FinishReason = "stop" | "length" | "tool_calls" | "content_filter" | "refusal" | "error" | "other";
|
|
16
|
+
export type ContextBucket = "≤4k" | "≤16k" | "≤64k" | "≤200k" | ">200k";
|
|
17
|
+
/** D1 egress receipt — shape RESERVED here; populated by the D1 mission. */
|
|
18
|
+
export interface EgressReceiptV1 {
|
|
19
|
+
readonly endpoint?: string;
|
|
20
|
+
readonly zdr?: {
|
|
21
|
+
readonly designated: boolean;
|
|
22
|
+
readonly source?: string;
|
|
23
|
+
readonly as_of?: string;
|
|
24
|
+
};
|
|
25
|
+
readonly cache_retention_s?: number;
|
|
26
|
+
readonly search_provider?: string;
|
|
27
|
+
readonly tool_calls?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface AttemptMetaV1 {
|
|
30
|
+
readonly v: 1;
|
|
31
|
+
readonly finish_reason?: FinishReason;
|
|
32
|
+
readonly refusal?: boolean;
|
|
33
|
+
readonly response_chars?: number;
|
|
34
|
+
readonly request_bytes?: number;
|
|
35
|
+
readonly response_bytes?: number;
|
|
36
|
+
readonly streaming?: boolean;
|
|
37
|
+
readonly sampling?: {
|
|
38
|
+
readonly temperature?: number;
|
|
39
|
+
readonly top_p?: number;
|
|
40
|
+
readonly max_output_tokens?: number;
|
|
41
|
+
};
|
|
42
|
+
readonly reasoning_tokens?: number;
|
|
43
|
+
/** `name` = declared tool id; undeclared names are hashed by the producer. */
|
|
44
|
+
readonly tool_calls?: readonly {
|
|
45
|
+
readonly name: string;
|
|
46
|
+
readonly count: number;
|
|
47
|
+
}[];
|
|
48
|
+
readonly grounding?: {
|
|
49
|
+
readonly citations?: number;
|
|
50
|
+
readonly search_provider?: string;
|
|
51
|
+
};
|
|
52
|
+
readonly model_snapshot?: string;
|
|
53
|
+
readonly provider_request_id?: string;
|
|
54
|
+
readonly http_status?: number;
|
|
55
|
+
readonly error_code?: string;
|
|
56
|
+
readonly region?: string;
|
|
57
|
+
readonly cost?: {
|
|
58
|
+
readonly in?: number;
|
|
59
|
+
readonly out?: number;
|
|
60
|
+
readonly cache_read?: number;
|
|
61
|
+
readonly cache_write?: number;
|
|
62
|
+
readonly other?: number;
|
|
63
|
+
};
|
|
64
|
+
readonly repair_count?: number;
|
|
65
|
+
/** sha256 of the RENDERED request — a hash, never content. */
|
|
66
|
+
readonly input_hash?: string;
|
|
67
|
+
readonly output_hash?: string;
|
|
68
|
+
readonly context_bucket?: ContextBucket;
|
|
69
|
+
readonly egress?: EgressReceiptV1;
|
|
70
|
+
}
|
|
71
|
+
export interface RunMetaV1 {
|
|
72
|
+
readonly v: 1;
|
|
73
|
+
readonly pipeline_sha?: string;
|
|
74
|
+
readonly config_hash?: string;
|
|
75
|
+
readonly trigger?: "cron" | "api" | "manual" | "replay" | "other";
|
|
76
|
+
readonly actor?: string;
|
|
77
|
+
readonly input_hash?: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The per-attempt content the RECORDER carries from the run/raw loop to the
|
|
81
|
+
* producer: the adapter's native meta plus the rendered request / output text /
|
|
82
|
+
* declared tool names. Threaded on `AttemptTelemetry.metaInputs` (routed lane)
|
|
83
|
+
* or assembled inline (raw lane). Content is used ONLY to compute hashes/sizes —
|
|
84
|
+
* it is never stored. Both lanes build `renderedRequest` via
|
|
85
|
+
* {@link renderRequestForHash} so the input_hash is lane-identical (spec §6.3).
|
|
86
|
+
*/
|
|
87
|
+
export interface AttemptMetaSource {
|
|
88
|
+
readonly adapterMeta?: Partial<AttemptMetaV1>;
|
|
89
|
+
readonly renderedRequest?: string;
|
|
90
|
+
readonly outputText?: string | null;
|
|
91
|
+
readonly declaredToolNames?: readonly string[];
|
|
92
|
+
}
|
|
93
|
+
/** Canonicalize the RENDERED request for `input_hash` (spec §2) — system + user
|
|
94
|
+
* + schema, joined the SAME way in both lanes so a routed and a raw call with
|
|
95
|
+
* the identical prompt+schema hash identically (lane parity, spec §6.3). The
|
|
96
|
+
* schema is JSON-stringified with sorted keys is NOT required (v1): the loader
|
|
97
|
+
* emits a stable object and JSON.stringify is deterministic for it. */
|
|
98
|
+
export declare function renderRequestForHash(parts: {
|
|
99
|
+
readonly system?: string;
|
|
100
|
+
readonly user?: string;
|
|
101
|
+
readonly schema?: object | null;
|
|
102
|
+
}): string;
|
|
103
|
+
/** Inputs the producer may see. Adapters expose `Partial<AttemptMetaV1>` as
|
|
104
|
+
* `AdapterResult.meta` (native fields only); the producer adds hashes, byte
|
|
105
|
+
* sizes, context bucket, cost, and applies the classification rule. */
|
|
106
|
+
export interface AttemptMetaInputs {
|
|
107
|
+
readonly adapterMeta?: Partial<AttemptMetaV1>;
|
|
108
|
+
/** The RENDERED request (system + user + schema) — hashed, never stored. */
|
|
109
|
+
readonly renderedRequest?: string;
|
|
110
|
+
/** The raw model output — hashed + measured, never stored. */
|
|
111
|
+
readonly outputText?: string | null;
|
|
112
|
+
/** Declared tool ids; any tool_call name NOT in this set is hashed. */
|
|
113
|
+
readonly declaredToolNames?: readonly string[];
|
|
114
|
+
/** For the cost components (via src/run/cost.ts). */
|
|
115
|
+
readonly provider?: ProviderId;
|
|
116
|
+
readonly model?: string;
|
|
117
|
+
readonly usage?: Pick<AdapterUsage, "tokensIn" | "tokensOut" | "tokensCached" | "tokensCacheWrite" | "tokensCacheWrite1h">;
|
|
118
|
+
/** Whether the caller streamed deltas (run loop stream() path). */
|
|
119
|
+
readonly streaming?: boolean;
|
|
120
|
+
/** Repair-rung count carried by the run loop, if any. */
|
|
121
|
+
readonly repairCount?: number;
|
|
122
|
+
}
|
|
123
|
+
/** The classification-rule string test (spec §2, §5 wire backstop): a value is
|
|
124
|
+
* an ENUM / IDENTIFIER / HASH only if it is at most 128 chars AND contains no
|
|
125
|
+
* whitespace. Anything else is free text and is dropped. Shared by the producer
|
|
126
|
+
* (SDK) and the server ingest backstop (`sanitizeMetaForWire`), so both planes
|
|
127
|
+
* apply the identical rule. */
|
|
128
|
+
export declare function isMetaSafeString(v: unknown): v is string;
|
|
129
|
+
/**
|
|
130
|
+
* Deep-clean an inbound `meta` envelope at the ingest boundary (spec §5): walk
|
|
131
|
+
* the object and DROP every string leaf that fails {@link isMetaSafeString}
|
|
132
|
+
* (too long or containing whitespace), counting each drop. Numbers, booleans,
|
|
133
|
+
* nulls, and safe strings pass through; nested objects/arrays recurse. The
|
|
134
|
+
* server-side belt for the SDK's classification rule — a client that bypasses
|
|
135
|
+
* the SDK producer still cannot smuggle free text into `inferences.meta`.
|
|
136
|
+
* Returns the cleaned value (undefined when not an object) and the drop count.
|
|
137
|
+
*/
|
|
138
|
+
export declare function sanitizeMetaForWire(raw: unknown): {
|
|
139
|
+
meta?: Record<string, unknown>;
|
|
140
|
+
dropped: number;
|
|
141
|
+
};
|
|
142
|
+
/** Well-known tag keys that become first-class group-bys (spec §4). Documented
|
|
143
|
+
* in the SDK docs; `modelrig validate` warns on near-misses. */
|
|
144
|
+
export declare const RESERVED_TAG_KEYS: readonly ["subject", "feature", "user", "session", "cost_center"];
|
|
145
|
+
export type ReservedTagKey = (typeof RESERVED_TAG_KEYS)[number];
|
|
146
|
+
/**
|
|
147
|
+
* Reserved-dimension near-misses among declared dimension/tag keys (spec §4).
|
|
148
|
+
* Returns `{ key, suggestion }` for every key that is a known synonym of a
|
|
149
|
+
* reserved key but is not itself reserved — so `modelrig validate` can nudge
|
|
150
|
+
* `customer` ⇒ `subject`. Pure; unit-tested directly.
|
|
151
|
+
*/
|
|
152
|
+
export declare function reservedTagNearMisses(keys: readonly string[]): {
|
|
153
|
+
key: string;
|
|
154
|
+
suggestion: ReservedTagKey;
|
|
155
|
+
}[];
|
|
156
|
+
/**
|
|
157
|
+
* Best-effort pipeline git sha for `RunMeta.pipeline_sha` (spec §3) — NEVER
|
|
158
|
+
* throws (instrumentation must not fail a run). Reads, in order: an explicit
|
|
159
|
+
* deployment env var (via {@link pipelineShaFromEnv} — env reads live in
|
|
160
|
+
* config.ts, the process.env invariant), then the working tree's `.git/HEAD`
|
|
161
|
+
* (following a ref). Returns undefined when nothing resolves. No child process,
|
|
162
|
+
* no new dependency. `cwd` defaults to the process working directory.
|
|
163
|
+
*/
|
|
164
|
+
export declare function resolvePipelineSha(cwd?: string): string | undefined;
|
|
165
|
+
/** Read the commit sha from a working tree's `.git/HEAD` (following a ref) —
|
|
166
|
+
* the fs half of {@link resolvePipelineSha}, exported so it is unit-testable
|
|
167
|
+
* without touching process.env. Never throws; returns undefined when no `.git`
|
|
168
|
+
* is present or the head is unreadable. */
|
|
169
|
+
export declare function pipelineShaFromGitDir(cwd: string): string | undefined;
|
|
170
|
+
/**
|
|
171
|
+
* Build the attempt envelope (spec §2). Single producer. Wraps everything in a
|
|
172
|
+
* try/catch — ANY failure returns null (a counted warning is the caller's; the
|
|
173
|
+
* run result is byte-identical). Applies the classification rule to every
|
|
174
|
+
* externally-sourced string; a value that is not enum/identifier/hash is dropped
|
|
175
|
+
* (absent = unknown, never inferred).
|
|
176
|
+
*/
|
|
177
|
+
export declare function summarizeAttemptMeta(inputs: AttemptMetaInputs): AttemptMetaV1 | null;
|
|
178
|
+
//# sourceMappingURL=attempt-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-meta.d.ts","sourceRoot":"","sources":["../../src/telemetry/attempt-meta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WI-1 Metadata Capture — the attempt envelope (spec §2–§3, wired 2026-08-22).
|
|
4
|
+
*
|
|
5
|
+
* Classification rule (the load-bearing invariant): every field is an enum, a
|
|
6
|
+
* number, a boolean, a hash, or an identifier — NEVER free text, never
|
|
7
|
+
* content. `summarizeAttemptMeta` is the ONLY producer (same discipline as
|
|
8
|
+
* `summarizeScrub` / `summarizeMask`); it must never throw into the run loop
|
|
9
|
+
* (absent envelope = unknown, byte-identical run result). Adapters expose only
|
|
10
|
+
* NATIVE fields as `AdapterResult.meta` (adapters/attempt-meta-map.ts); this
|
|
11
|
+
* producer adds the hashes, byte/char sizes, context bucket, and cost
|
|
12
|
+
* components, hashes undeclared tool names, and drops any string that is not an
|
|
13
|
+
* enum/identifier/hash (length > 128 or containing whitespace).
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.RESERVED_TAG_KEYS = void 0;
|
|
17
|
+
exports.renderRequestForHash = renderRequestForHash;
|
|
18
|
+
exports.isMetaSafeString = isMetaSafeString;
|
|
19
|
+
exports.sanitizeMetaForWire = sanitizeMetaForWire;
|
|
20
|
+
exports.reservedTagNearMisses = reservedTagNearMisses;
|
|
21
|
+
exports.resolvePipelineSha = resolvePipelineSha;
|
|
22
|
+
exports.pipelineShaFromGitDir = pipelineShaFromGitDir;
|
|
23
|
+
exports.summarizeAttemptMeta = summarizeAttemptMeta;
|
|
24
|
+
const node_crypto_1 = require("node:crypto");
|
|
25
|
+
const node_fs_1 = require("node:fs");
|
|
26
|
+
const node_path_1 = require("node:path");
|
|
27
|
+
const cost_1 = require("../run/cost");
|
|
28
|
+
const config_1 = require("../config");
|
|
29
|
+
/** Canonicalize the RENDERED request for `input_hash` (spec §2) — system + user
|
|
30
|
+
* + schema, joined the SAME way in both lanes so a routed and a raw call with
|
|
31
|
+
* the identical prompt+schema hash identically (lane parity, spec §6.3). The
|
|
32
|
+
* schema is JSON-stringified with sorted keys is NOT required (v1): the loader
|
|
33
|
+
* emits a stable object and JSON.stringify is deterministic for it. */
|
|
34
|
+
function renderRequestForHash(parts) {
|
|
35
|
+
return [
|
|
36
|
+
parts.system ?? "",
|
|
37
|
+
parts.user ?? "",
|
|
38
|
+
parts.schema != null ? JSON.stringify(parts.schema) : "",
|
|
39
|
+
].join("\n");
|
|
40
|
+
}
|
|
41
|
+
// ── The metadata-safe rule — one predicate, both planes ──────────────────────
|
|
42
|
+
/** The classification-rule string test (spec §2, §5 wire backstop): a value is
|
|
43
|
+
* an ENUM / IDENTIFIER / HASH only if it is at most 128 chars AND contains no
|
|
44
|
+
* whitespace. Anything else is free text and is dropped. Shared by the producer
|
|
45
|
+
* (SDK) and the server ingest backstop (`sanitizeMetaForWire`), so both planes
|
|
46
|
+
* apply the identical rule. */
|
|
47
|
+
function isMetaSafeString(v) {
|
|
48
|
+
return typeof v === "string" && v.length > 0 && v.length <= 128 && !/\s/.test(v);
|
|
49
|
+
}
|
|
50
|
+
/** sha256 hex of a string (a hash — 64 chars, ≤128, no whitespace: always safe). */
|
|
51
|
+
function sha256Hex(s) {
|
|
52
|
+
return (0, node_crypto_1.createHash)("sha256").update(s, "utf8").digest("hex");
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Deep-clean an inbound `meta` envelope at the ingest boundary (spec §5): walk
|
|
56
|
+
* the object and DROP every string leaf that fails {@link isMetaSafeString}
|
|
57
|
+
* (too long or containing whitespace), counting each drop. Numbers, booleans,
|
|
58
|
+
* nulls, and safe strings pass through; nested objects/arrays recurse. The
|
|
59
|
+
* server-side belt for the SDK's classification rule — a client that bypasses
|
|
60
|
+
* the SDK producer still cannot smuggle free text into `inferences.meta`.
|
|
61
|
+
* Returns the cleaned value (undefined when not an object) and the drop count.
|
|
62
|
+
*/
|
|
63
|
+
function sanitizeMetaForWire(raw) {
|
|
64
|
+
let dropped = 0;
|
|
65
|
+
function walk(value) {
|
|
66
|
+
if (typeof value === "string") {
|
|
67
|
+
if (isMetaSafeString(value))
|
|
68
|
+
return { keep: true, value };
|
|
69
|
+
dropped += 1;
|
|
70
|
+
return { keep: false };
|
|
71
|
+
}
|
|
72
|
+
if (typeof value === "number")
|
|
73
|
+
return { keep: Number.isFinite(value), value };
|
|
74
|
+
if (typeof value === "boolean" || value === null)
|
|
75
|
+
return { keep: true, value };
|
|
76
|
+
if (Array.isArray(value)) {
|
|
77
|
+
const out = [];
|
|
78
|
+
for (const el of value) {
|
|
79
|
+
const r = walk(el);
|
|
80
|
+
if (r.keep)
|
|
81
|
+
out.push(r.value);
|
|
82
|
+
}
|
|
83
|
+
return { keep: true, value: out };
|
|
84
|
+
}
|
|
85
|
+
if (typeof value === "object") {
|
|
86
|
+
const out = {};
|
|
87
|
+
for (const [k, v] of Object.entries(value)) {
|
|
88
|
+
const r = walk(v);
|
|
89
|
+
if (r.keep)
|
|
90
|
+
out[k] = r.value;
|
|
91
|
+
}
|
|
92
|
+
return { keep: true, value: out };
|
|
93
|
+
}
|
|
94
|
+
// functions/symbols/undefined — never valid jsonb; drop silently (not text).
|
|
95
|
+
return { keep: false };
|
|
96
|
+
}
|
|
97
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw))
|
|
98
|
+
return { dropped };
|
|
99
|
+
const cleaned = walk(raw).value;
|
|
100
|
+
return { meta: cleaned, dropped };
|
|
101
|
+
}
|
|
102
|
+
// ── Reserved dimensions (spec §4) ────────────────────────────────────────────
|
|
103
|
+
/** Well-known tag keys that become first-class group-bys (spec §4). Documented
|
|
104
|
+
* in the SDK docs; `modelrig validate` warns on near-misses. */
|
|
105
|
+
exports.RESERVED_TAG_KEYS = ["subject", "feature", "user", "session", "cost_center"];
|
|
106
|
+
/** Common misspellings/synonyms → the reserved key they should be (spec §4). */
|
|
107
|
+
const RESERVED_NEAR_MISS = {
|
|
108
|
+
customer: "subject",
|
|
109
|
+
customer_id: "subject",
|
|
110
|
+
tenant: "subject",
|
|
111
|
+
tenant_id: "subject",
|
|
112
|
+
org: "subject",
|
|
113
|
+
org_id: "subject",
|
|
114
|
+
account: "subject",
|
|
115
|
+
client: "subject",
|
|
116
|
+
feature_flag: "feature",
|
|
117
|
+
features: "feature",
|
|
118
|
+
user_id: "user",
|
|
119
|
+
userid: "user",
|
|
120
|
+
uid: "user",
|
|
121
|
+
session_id: "session",
|
|
122
|
+
sessionid: "session",
|
|
123
|
+
conversation: "session",
|
|
124
|
+
thread: "session",
|
|
125
|
+
costcenter: "cost_center",
|
|
126
|
+
"cost-center": "cost_center",
|
|
127
|
+
team: "cost_center",
|
|
128
|
+
department: "cost_center",
|
|
129
|
+
dept: "cost_center",
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Reserved-dimension near-misses among declared dimension/tag keys (spec §4).
|
|
133
|
+
* Returns `{ key, suggestion }` for every key that is a known synonym of a
|
|
134
|
+
* reserved key but is not itself reserved — so `modelrig validate` can nudge
|
|
135
|
+
* `customer` ⇒ `subject`. Pure; unit-tested directly.
|
|
136
|
+
*/
|
|
137
|
+
function reservedTagNearMisses(keys) {
|
|
138
|
+
const reserved = new Set(exports.RESERVED_TAG_KEYS);
|
|
139
|
+
const out = [];
|
|
140
|
+
for (const key of keys) {
|
|
141
|
+
if (reserved.has(key))
|
|
142
|
+
continue;
|
|
143
|
+
const suggestion = RESERVED_NEAR_MISS[key.toLowerCase()];
|
|
144
|
+
if (suggestion !== undefined)
|
|
145
|
+
out.push({ key, suggestion });
|
|
146
|
+
}
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
// ── RunMeta git-sha auto-fill (spec §3) ──────────────────────────────────────
|
|
150
|
+
/**
|
|
151
|
+
* Best-effort pipeline git sha for `RunMeta.pipeline_sha` (spec §3) — NEVER
|
|
152
|
+
* throws (instrumentation must not fail a run). Reads, in order: an explicit
|
|
153
|
+
* deployment env var (via {@link pipelineShaFromEnv} — env reads live in
|
|
154
|
+
* config.ts, the process.env invariant), then the working tree's `.git/HEAD`
|
|
155
|
+
* (following a ref). Returns undefined when nothing resolves. No child process,
|
|
156
|
+
* no new dependency. `cwd` defaults to the process working directory.
|
|
157
|
+
*/
|
|
158
|
+
function resolvePipelineSha(cwd) {
|
|
159
|
+
const fromEnv = (0, config_1.pipelineShaFromEnv)();
|
|
160
|
+
if (isMetaSafeString(fromEnv))
|
|
161
|
+
return fromEnv;
|
|
162
|
+
return pipelineShaFromGitDir(cwd ?? ".");
|
|
163
|
+
}
|
|
164
|
+
/** Read the commit sha from a working tree's `.git/HEAD` (following a ref) —
|
|
165
|
+
* the fs half of {@link resolvePipelineSha}, exported so it is unit-testable
|
|
166
|
+
* without touching process.env. Never throws; returns undefined when no `.git`
|
|
167
|
+
* is present or the head is unreadable. */
|
|
168
|
+
function pipelineShaFromGitDir(cwd) {
|
|
169
|
+
try {
|
|
170
|
+
const headPath = (0, node_path_1.join)(cwd, ".git", "HEAD");
|
|
171
|
+
if (!(0, node_fs_1.existsSync)(headPath))
|
|
172
|
+
return undefined;
|
|
173
|
+
const head = (0, node_fs_1.readFileSync)(headPath, "utf8").trim();
|
|
174
|
+
if (head.startsWith("ref:")) {
|
|
175
|
+
const ref = head.slice(4).trim();
|
|
176
|
+
const refPath = (0, node_path_1.join)(cwd, ".git", ref);
|
|
177
|
+
if ((0, node_fs_1.existsSync)(refPath)) {
|
|
178
|
+
const sha = (0, node_fs_1.readFileSync)(refPath, "utf8").trim();
|
|
179
|
+
return isMetaSafeString(sha) ? sha : undefined;
|
|
180
|
+
}
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
return isMetaSafeString(head) ? head : undefined;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ── The producer ─────────────────────────────────────────────────────────────
|
|
190
|
+
const CONTEXT_BUCKETS = [
|
|
191
|
+
[4000, "≤4k"],
|
|
192
|
+
[16000, "≤16k"],
|
|
193
|
+
[64000, "≤64k"],
|
|
194
|
+
[200000, "≤200k"],
|
|
195
|
+
];
|
|
196
|
+
/** Bucket the input-token count into the coarse context band (spec §2). */
|
|
197
|
+
function contextBucket(tokensIn) {
|
|
198
|
+
for (const [ceil, label] of CONTEXT_BUCKETS) {
|
|
199
|
+
if (tokensIn <= ceil)
|
|
200
|
+
return label;
|
|
201
|
+
}
|
|
202
|
+
return ">200k";
|
|
203
|
+
}
|
|
204
|
+
/** Approximate token count from raw chars when the provider reported none. */
|
|
205
|
+
const ESTIMATE_CHARS_PER_TOKEN = 4;
|
|
206
|
+
/** Aggregate + classify tool calls: keep a declared, safe name verbatim; hash
|
|
207
|
+
* every undeclared or unsafe name (spec §2 — undeclared names are hashed). */
|
|
208
|
+
function classifyToolCalls(raw, declared) {
|
|
209
|
+
if (raw === undefined || raw.length === 0)
|
|
210
|
+
return undefined;
|
|
211
|
+
return raw.map((tc) => ({
|
|
212
|
+
name: declared.has(tc.name) && isMetaSafeString(tc.name) ? tc.name : `sha256:${sha256Hex(tc.name)}`,
|
|
213
|
+
count: tc.count,
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
/** A finite number, else undefined (drops NaN/Infinity/non-numbers). */
|
|
217
|
+
function num(v) {
|
|
218
|
+
return typeof v === "number" && Number.isFinite(v) ? v : undefined;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Build the attempt envelope (spec §2). Single producer. Wraps everything in a
|
|
222
|
+
* try/catch — ANY failure returns null (a counted warning is the caller's; the
|
|
223
|
+
* run result is byte-identical). Applies the classification rule to every
|
|
224
|
+
* externally-sourced string; a value that is not enum/identifier/hash is dropped
|
|
225
|
+
* (absent = unknown, never inferred).
|
|
226
|
+
*/
|
|
227
|
+
function summarizeAttemptMeta(inputs) {
|
|
228
|
+
try {
|
|
229
|
+
const a = inputs.adapterMeta ?? {};
|
|
230
|
+
const declared = new Set(inputs.declaredToolNames ?? []);
|
|
231
|
+
const meta = { v: 1 };
|
|
232
|
+
// Enum fields (produced by our mappers — safe by construction).
|
|
233
|
+
if (a.finish_reason !== undefined)
|
|
234
|
+
meta.finish_reason = a.finish_reason;
|
|
235
|
+
if (typeof a.refusal === "boolean")
|
|
236
|
+
meta.refusal = a.refusal;
|
|
237
|
+
if (typeof a.streaming === "boolean")
|
|
238
|
+
meta.streaming = a.streaming;
|
|
239
|
+
else if (typeof inputs.streaming === "boolean")
|
|
240
|
+
meta.streaming = inputs.streaming;
|
|
241
|
+
// Externally-sourced identifiers — gated by the classification rule.
|
|
242
|
+
if (isMetaSafeString(a.model_snapshot))
|
|
243
|
+
meta.model_snapshot = a.model_snapshot;
|
|
244
|
+
if (isMetaSafeString(a.provider_request_id))
|
|
245
|
+
meta.provider_request_id = a.provider_request_id;
|
|
246
|
+
if (isMetaSafeString(a.error_code))
|
|
247
|
+
meta.error_code = a.error_code;
|
|
248
|
+
if (isMetaSafeString(a.region))
|
|
249
|
+
meta.region = a.region;
|
|
250
|
+
// Numbers.
|
|
251
|
+
const httpStatus = num(a.http_status);
|
|
252
|
+
if (httpStatus !== undefined)
|
|
253
|
+
meta.http_status = httpStatus;
|
|
254
|
+
const reasoning = num(a.reasoning_tokens);
|
|
255
|
+
if (reasoning !== undefined)
|
|
256
|
+
meta.reasoning_tokens = reasoning;
|
|
257
|
+
const repairCount = num(inputs.repairCount ?? a.repair_count);
|
|
258
|
+
if (repairCount !== undefined && repairCount > 0)
|
|
259
|
+
meta.repair_count = repairCount;
|
|
260
|
+
// Sampling echo (numbers only).
|
|
261
|
+
if (a.sampling !== undefined) {
|
|
262
|
+
const s = {};
|
|
263
|
+
const t = num(a.sampling.temperature);
|
|
264
|
+
const p = num(a.sampling.top_p);
|
|
265
|
+
const m = num(a.sampling.max_output_tokens);
|
|
266
|
+
if (t !== undefined)
|
|
267
|
+
s.temperature = t;
|
|
268
|
+
if (p !== undefined)
|
|
269
|
+
s.top_p = p;
|
|
270
|
+
if (m !== undefined)
|
|
271
|
+
s.max_output_tokens = m;
|
|
272
|
+
if (Object.keys(s).length > 0)
|
|
273
|
+
meta.sampling = s;
|
|
274
|
+
}
|
|
275
|
+
// Tool calls — declared names kept, undeclared hashed.
|
|
276
|
+
const tools = classifyToolCalls(a.tool_calls, declared);
|
|
277
|
+
if (tools !== undefined)
|
|
278
|
+
meta.tool_calls = tools;
|
|
279
|
+
// Grounding — citations count + a safe search-provider identifier.
|
|
280
|
+
if (a.grounding !== undefined) {
|
|
281
|
+
const g = {};
|
|
282
|
+
const c = num(a.grounding.citations);
|
|
283
|
+
if (c !== undefined)
|
|
284
|
+
g.citations = c;
|
|
285
|
+
if (isMetaSafeString(a.grounding.search_provider))
|
|
286
|
+
g.search_provider = a.grounding.search_provider;
|
|
287
|
+
if (Object.keys(g).length > 0)
|
|
288
|
+
meta.grounding = g;
|
|
289
|
+
}
|
|
290
|
+
// Hashes + sizes derived from content (NEVER the content itself).
|
|
291
|
+
if (inputs.renderedRequest !== undefined) {
|
|
292
|
+
meta.input_hash = `sha256:${sha256Hex(inputs.renderedRequest)}`;
|
|
293
|
+
meta.request_bytes = Buffer.byteLength(inputs.renderedRequest, "utf8");
|
|
294
|
+
}
|
|
295
|
+
if (inputs.outputText !== undefined && inputs.outputText !== null) {
|
|
296
|
+
meta.output_hash = `sha256:${sha256Hex(inputs.outputText)}`;
|
|
297
|
+
meta.response_bytes = Buffer.byteLength(inputs.outputText, "utf8");
|
|
298
|
+
meta.response_chars = inputs.outputText.length;
|
|
299
|
+
}
|
|
300
|
+
// Context bucket — from reported input tokens, else a char estimate.
|
|
301
|
+
const tokensIn = inputs.usage?.tokensIn;
|
|
302
|
+
if (typeof tokensIn === "number" && Number.isFinite(tokensIn)) {
|
|
303
|
+
meta.context_bucket = contextBucket(tokensIn);
|
|
304
|
+
}
|
|
305
|
+
else if (inputs.renderedRequest !== undefined) {
|
|
306
|
+
meta.context_bucket = contextBucket(Math.ceil(inputs.renderedRequest.length / ESTIMATE_CHARS_PER_TOKEN));
|
|
307
|
+
}
|
|
308
|
+
// Cost components (via src/run/cost.ts) — omitted when pricing is unknown.
|
|
309
|
+
if (inputs.provider !== undefined && inputs.model !== undefined && inputs.usage !== undefined) {
|
|
310
|
+
const cost = (0, cost_1.costComponents)(inputs.provider, inputs.model, inputs.usage);
|
|
311
|
+
if (cost !== null)
|
|
312
|
+
meta.cost = cost;
|
|
313
|
+
}
|
|
314
|
+
return meta;
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../src/telemetry/exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAYlE,OAAO,KAAK,EACV,WAAW,EASZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1F;8BAC0B;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;6EAEyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,mBAAmB,EAAE,CAYvB;AAED,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD;6EACyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC;;;0CAGsC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvD;;;;6CAIyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACnD;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;;;8DAG0D;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED;;;sEAGsE;AACtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,QAAQ;IACvB;;oCAEgC;IAChC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC;IAChC,KAAK,IAAI,IAAI,CAAC;IACd,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB;;iEAE6D;IAC7D,KAAK,IAAI,aAAa,CAAC;CACxB;AAGD;iFACiF;AACjF,eAAO,MAAM,mBAAmB,QAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../src/telemetry/exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,6 +100,10 @@ function toWireInference(row) {
|
|
|
100
100
|
...(row.callId != null ? { call_id: row.callId } : {}),
|
|
101
101
|
...(row.attemptSeq != null ? { attempt_seq: row.attemptSeq } : {}),
|
|
102
102
|
...(row.candidateIndex != null ? { candidate_index: row.candidateIndex } : {}),
|
|
103
|
+
// WI-1 (spec §2): the attempt envelope. spread-iff-present — a row without it
|
|
104
|
+
// (pre-WI-1a, or a null envelope) emits nothing, so the payload is
|
|
105
|
+
// byte-identical to before and the server leaves inferences.meta null.
|
|
106
|
+
...(row.meta != null ? { meta: row.meta } : {}),
|
|
103
107
|
};
|
|
104
108
|
}
|
|
105
109
|
function toWireRun(row) {
|
|
@@ -112,6 +116,8 @@ function toWireRun(row) {
|
|
|
112
116
|
started_at: row.startedAt,
|
|
113
117
|
ended_at: row.endedAt,
|
|
114
118
|
status: row.status,
|
|
119
|
+
// WI-1 (spec §3): the run envelope. spread-iff-present (byte-identical when null).
|
|
120
|
+
...(row.meta != null ? { meta: row.meta } : {}),
|
|
115
121
|
};
|
|
116
122
|
}
|
|
117
123
|
function toWireStep(row) {
|
|
@@ -90,6 +90,13 @@ export interface WireInference {
|
|
|
90
90
|
readonly call_id?: string;
|
|
91
91
|
readonly attempt_seq?: number;
|
|
92
92
|
readonly candidate_index?: number;
|
|
93
|
+
/** The attempt metadata envelope (WI-1, `AttemptMeta@v1`). OPTIONAL and
|
|
94
|
+
* OMITTED when unset (spread-iff-present in the exporter), so an older SDK's
|
|
95
|
+
* payload is byte-identical and the server leaves `inferences.meta` null.
|
|
96
|
+
* Opaque here (T7 — jsonb is not proof of shape); the strongly-typed producer
|
|
97
|
+
* is `telemetry/attempt-meta.ts`, and the server re-applies the metadata-safe
|
|
98
|
+
* string backstop (`sanitizeMetaForWire`) before the write. */
|
|
99
|
+
readonly meta?: unknown;
|
|
93
100
|
}
|
|
94
101
|
export interface WireFeedback {
|
|
95
102
|
readonly id: string;
|
|
@@ -143,6 +150,10 @@ export interface WireRun {
|
|
|
143
150
|
readonly started_at: string;
|
|
144
151
|
readonly ended_at: string | null;
|
|
145
152
|
readonly status: "running" | "succeeded" | "failed" | "abandoned";
|
|
153
|
+
/** The run metadata envelope (WI-1, `RunMeta@v1`). OPTIONAL, spread-iff-present
|
|
154
|
+
* in the exporter; the server leaves `runs.meta` null on absence. Opaque here
|
|
155
|
+
* (T7); the server re-applies the metadata-safe backstop before the write. */
|
|
156
|
+
readonly meta?: unknown;
|
|
146
157
|
}
|
|
147
158
|
/** A step — one ATTEMPT of one operation within a run (protocol v2, spec §1.1).
|
|
148
159
|
* A fact (merge=false). Provenance is ground-truth (an `inferences` reference)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-protocol.d.ts","sourceRoot":"","sources":["../../src/telemetry/ingest-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,oDAAoD;AACpD,eAAO,MAAM,WAAW,eAAe,CAAC;AAExC;;;;6DAI6D;AAC7D,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;+EAE+E;AAC/E,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAE5D;kBACkB;AAClB,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;;;+EAG2E;IAC3E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C;;;2EAGuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ingest-protocol.d.ts","sourceRoot":"","sources":["../../src/telemetry/ingest-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -145,6 +145,9 @@ function stampBatch(batch, tenancy) {
|
|
|
145
145
|
ended_at: r.ended_at,
|
|
146
146
|
status: r.status,
|
|
147
147
|
updated_at: now,
|
|
148
|
+
// WI-1 (spec §3): the run metadata envelope. spread-iff-present (the
|
|
149
|
+
// 00027 pattern) — a run without `meta` leaves runs.meta untouched.
|
|
150
|
+
...(r.meta !== undefined && r.meta !== null ? { meta: r.meta } : {}),
|
|
148
151
|
})),
|
|
149
152
|
});
|
|
150
153
|
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
* numbers. `intValue`/`startTimeUnixNano` are strings on the wire.
|
|
21
21
|
*/
|
|
22
22
|
import type { TelemetryRow } from "../types/telemetry";
|
|
23
|
+
import type { AttemptMetaV1 } from "./attempt-meta";
|
|
23
24
|
import type { CacheContext } from "../watch/evaluate";
|
|
24
25
|
/** Semantic-conventions pin (architect ruling §2(f)). The scope version on the
|
|
25
26
|
* wire and the single source of truth for which gen_ai vintage we speak. */
|
|
@@ -93,6 +94,15 @@ export interface Traceparent {
|
|
|
93
94
|
* rejected per the W3C spec (they mean "no parent").
|
|
94
95
|
*/
|
|
95
96
|
export declare function parseTraceparent(value: string | undefined | null): Traceparent | null;
|
|
97
|
+
/**
|
|
98
|
+
* The attempt-envelope span attributes (WI-1b spec §5) — `modelrig.meta.*`,
|
|
99
|
+
* enums/numbers/booleans/hashes/identifiers ONLY. Mirrors the query grammar's
|
|
100
|
+
* metadata-safe columns; a value that is not an enum/identifier/hash is dropped
|
|
101
|
+
* by {@link isMetaSafeStr}, so the metadata-safe property test extends cleanly to
|
|
102
|
+
* the emitted span. Absent fields emit no attribute (byte-identical to a pre-WI-1
|
|
103
|
+
* row's span).
|
|
104
|
+
*/
|
|
105
|
+
export declare function metaSpanAttributes(meta: AttemptMetaV1 | null | undefined): OtlpAttribute[];
|
|
96
106
|
/**
|
|
97
107
|
* Map one telemetry row to one OTLP span (spec §3, normative). Pure and total:
|
|
98
108
|
* every field comes from the row; nulls are omitted (never emitted as empty).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel-map.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;4EAC4E;AAC5E,eAAO,MAAM,eAAe,WAAW,CAAC;AAMxC;sCACsC;AACtC,QAAA,MAAM,YAAY,IAAI,CAAC;AACvB,QAAA,MAAM,YAAY,IAAI,CAAC;AAGvB,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,YAAY,GAAG,OAAO,YAAY,CAAC;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;QACpC,QAAQ,CAAC,QAAQ,EAAE;YAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAA;SAAE,CAAC;QACrE,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;YACjC,QAAQ,CAAC,KAAK,EAAE;gBAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC;YACpE,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;SACzC,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAYD,gFAAgF;AAChF,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAKlD,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAQrF;
|
|
1
|
+
{"version":3,"file":"otel-map.d.ts","sourceRoot":"","sources":["../../src/telemetry/otel-map.ts"],"names":[],"mappings":"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"}
|