@unorouter/verify-core 0.2.0 → 0.4.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.
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Passive response metadata: what the envelope reveals about who really
3
+ * answered, read from responses the run already made.
4
+ *
5
+ * Costs nothing (no extra requests) and asserts nothing. Everything here is
6
+ * reported as observation, because each signal has an honest explanation as
7
+ * well as a dishonest one:
8
+ *
9
+ * - a `chatcmpl-` id inside an Anthropic-shaped reply means a translation
10
+ * layer, which is what our own gateway is;
11
+ * - OpenAI-style `usage` keys in a Messages reply mean the same;
12
+ * - a missing id means a sloppy relay, not a fake model.
13
+ *
14
+ * The value is in the aggregate: over many lanes, "which of my Claude lanes
15
+ * answer with a chatcmpl id" is a question worth being able to ask.
16
+ */
17
+ /** Vendor whose response shape the envelope actually looks like. */
18
+ export type EnvelopeShape = "anthropic" | "openai" | "gemini" | "unknown";
19
+ export type ResponseMetadata = {
20
+ /** Shape the payload matches, regardless of which API was called. */
21
+ shape: EnvelopeShape;
22
+ /** Shape the endpoint was asked to speak. */
23
+ expected: EnvelopeShape;
24
+ /** True when a translating hop sits between us and the model. */
25
+ translated: boolean;
26
+ /** e.g. "msg_", "chatcmpl-", "resp_"; null when the id is absent or odd. */
27
+ idPrefix: string | null;
28
+ /** Usage field names present, sorted. A cross-vendor mix is the tell. */
29
+ usageKeys: string[];
30
+ /** Foreign-vendor residue in the usage object, e.g. claude_* under OpenAI. */
31
+ foreignUsageKeys: string[];
32
+ /** Facts worth surfacing, in plain words. No verdict attached. */
33
+ notes: string[];
34
+ };
35
+ export declare function readResponseMetadata(data: unknown, expected: EnvelopeShape): ResponseMetadata;
36
+ //# sourceMappingURL=response-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-metadata.d.ts","sourceRoot":"","sources":["../../src/detectors/response-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,oEAAoE;AACpE,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,qEAAqE;IACrE,KAAK,EAAE,aAAa,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,EAAE,aAAa,CAAC;IACxB,iEAAiE;IACjE,UAAU,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yEAAyE;IACzE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kEAAkE;IAClE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAuCF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,aAAa,GACtB,gBAAgB,CAyClB"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Passive response metadata: what the envelope reveals about who really
3
+ * answered, read from responses the run already made.
4
+ *
5
+ * Costs nothing (no extra requests) and asserts nothing. Everything here is
6
+ * reported as observation, because each signal has an honest explanation as
7
+ * well as a dishonest one:
8
+ *
9
+ * - a `chatcmpl-` id inside an Anthropic-shaped reply means a translation
10
+ * layer, which is what our own gateway is;
11
+ * - OpenAI-style `usage` keys in a Messages reply mean the same;
12
+ * - a missing id means a sloppy relay, not a fake model.
13
+ *
14
+ * The value is in the aggregate: over many lanes, "which of my Claude lanes
15
+ * answer with a chatcmpl id" is a question worth being able to ask.
16
+ */
17
+ const ANTHROPIC_USAGE = new Set([
18
+ "input_tokens",
19
+ "output_tokens",
20
+ "cache_read_input_tokens",
21
+ "cache_creation_input_tokens",
22
+ ]);
23
+ const OPENAI_USAGE = new Set([
24
+ "prompt_tokens",
25
+ "completion_tokens",
26
+ "total_tokens",
27
+ ]);
28
+ const GEMINI_USAGE = new Set([
29
+ "promptTokenCount",
30
+ "candidatesTokenCount",
31
+ "totalTokenCount",
32
+ "thoughtsTokenCount",
33
+ ]);
34
+ function idPrefixOf(id) {
35
+ if (typeof id !== "string" || id.length === 0)
36
+ return null;
37
+ for (const p of ["msg_", "chatcmpl-", "resp_", "call_", "toolu_"])
38
+ if (id.startsWith(p))
39
+ return p;
40
+ // An unrecognised shape (a bare UUID, say) is itself worth reporting.
41
+ const cut = id.search(/[-_]/);
42
+ return cut > 0 ? id.slice(0, cut + 1) : "(none)";
43
+ }
44
+ function shapeOf(data, usageKeys) {
45
+ if (data["candidates"] !== undefined || usageKeys.some((k) => GEMINI_USAGE.has(k)))
46
+ return "gemini";
47
+ if (data["choices"] !== undefined || usageKeys.some((k) => OPENAI_USAGE.has(k)))
48
+ return "openai";
49
+ if (data["content"] !== undefined || usageKeys.some((k) => ANTHROPIC_USAGE.has(k)))
50
+ return "anthropic";
51
+ return "unknown";
52
+ }
53
+ export function readResponseMetadata(data, expected) {
54
+ const obj = (data ?? {});
55
+ const usage = (obj["usage"] ?? {});
56
+ const usageKeys = Object.keys(usage).sort();
57
+ const shape = shapeOf(obj, usageKeys);
58
+ const idPrefix = idPrefixOf(obj["id"]);
59
+ const notes = [];
60
+ // Usage keys belonging to a vendor other than the shape we are reading.
61
+ const foreignUsageKeys = usageKeys.filter((k) => {
62
+ if (k.startsWith("claude_"))
63
+ return shape !== "anthropic";
64
+ if (k.startsWith("gemini_"))
65
+ return shape !== "gemini";
66
+ if (ANTHROPIC_USAGE.has(k))
67
+ return shape !== "anthropic";
68
+ if (OPENAI_USAGE.has(k))
69
+ return shape !== "openai";
70
+ if (GEMINI_USAGE.has(k))
71
+ return shape !== "gemini";
72
+ return false;
73
+ });
74
+ const translated = shape !== "unknown" && shape !== expected;
75
+ if (translated)
76
+ notes.push(`answered in ${shape} shape though ${expected} was requested: a translating hop sits in front`);
77
+ if (expected === "anthropic" && idPrefix && idPrefix !== "msg_")
78
+ notes.push(`id starts "${idPrefix}" where Anthropic uses "msg_": the id was minted by something else`);
79
+ if (foreignUsageKeys.length > 0)
80
+ notes.push(`usage carries ${foreignUsageKeys.join(", ")}, which belong to another vendor's API`);
81
+ return {
82
+ shape,
83
+ expected,
84
+ translated,
85
+ idPrefix,
86
+ usageKeys,
87
+ foreignUsageKeys,
88
+ notes,
89
+ };
90
+ }
91
+ //# sourceMappingURL=response-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-metadata.js","sourceRoot":"","sources":["../../src/detectors/response-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Throughput metadata: tokens per second, derived from data the run already
3
+ * collected.
4
+ *
5
+ * Motivation: bigger models are slower per token, so a lane billed as Opus but
6
+ * served by Sonnet tends to run fast. That makes throughput the one tier signal
7
+ * that survives a relay refusing to name its model.
8
+ *
9
+ * It is metadata, not a verdict, and deliberately has no thresholds. Rate
10
+ * varies with load, batching, quantisation and time of day, so a single
11
+ * measurement cannot separate "cheaper model" from "quiet hour". The useful
12
+ * comparison is across lanes serving the SAME model, which only the caller can
13
+ * assemble: `compareThroughput` does that part and still only describes what it
14
+ * sees.
15
+ */
16
+ export type ThroughputSample = {
17
+ /** Identifies the lane in the caller's own terms. */
18
+ lane: string;
19
+ model: string;
20
+ outputTokens: number;
21
+ elapsedMs: number;
22
+ tokensPerSecond: number;
23
+ };
24
+ export declare function sampleThroughput(args: {
25
+ lane: string;
26
+ model: string;
27
+ outputTokens: number | null | undefined;
28
+ elapsedMs: number;
29
+ }): ThroughputSample | null;
30
+ export type ThroughputComparison = {
31
+ model: string;
32
+ sampleCount: number;
33
+ medianTps: number;
34
+ /** Lanes running far from the median for this model, fastest first. */
35
+ outliers: {
36
+ lane: string;
37
+ tokensPerSecond: number;
38
+ ratioToMedian: number;
39
+ direction: "faster" | "slower";
40
+ }[];
41
+ note: string;
42
+ };
43
+ /**
44
+ * Describe how lanes serving one model compare. `outlierRatio` is how far from
45
+ * the median a lane must sit to be worth mentioning; the default of 2 is a
46
+ * starting point for eyeballing, not a calibrated threshold.
47
+ */
48
+ export declare function compareThroughput(samples: ThroughputSample[], opts?: {
49
+ outlierRatio?: number;
50
+ }): ThroughputComparison[];
51
+ //# sourceMappingURL=throughput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throughput.d.ts","sourceRoot":"","sources":["../../src/detectors/throughput.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,gBAAgB,GAAG,IAAI,CAa1B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAChC,EAAE,CAAC;IACJ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAQF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,oBAAoB,EAAE,CA8CxB"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Throughput metadata: tokens per second, derived from data the run already
3
+ * collected.
4
+ *
5
+ * Motivation: bigger models are slower per token, so a lane billed as Opus but
6
+ * served by Sonnet tends to run fast. That makes throughput the one tier signal
7
+ * that survives a relay refusing to name its model.
8
+ *
9
+ * It is metadata, not a verdict, and deliberately has no thresholds. Rate
10
+ * varies with load, batching, quantisation and time of day, so a single
11
+ * measurement cannot separate "cheaper model" from "quiet hour". The useful
12
+ * comparison is across lanes serving the SAME model, which only the caller can
13
+ * assemble: `compareThroughput` does that part and still only describes what it
14
+ * sees.
15
+ */
16
+ export function sampleThroughput(args) {
17
+ const tokens = args.outputTokens;
18
+ // A handful of tokens over a noisy connection says nothing; the rate is
19
+ // dominated by connection setup rather than generation.
20
+ if (typeof tokens !== "number" || tokens < 20)
21
+ return null;
22
+ if (!Number.isFinite(args.elapsedMs) || args.elapsedMs <= 0)
23
+ return null;
24
+ return {
25
+ lane: args.lane,
26
+ model: args.model,
27
+ outputTokens: tokens,
28
+ elapsedMs: args.elapsedMs,
29
+ tokensPerSecond: +(tokens / (args.elapsedMs / 1000)).toFixed(1),
30
+ };
31
+ }
32
+ const median = (xs) => {
33
+ const s = [...xs].sort((a, b) => a - b);
34
+ const mid = Math.floor(s.length / 2);
35
+ return s.length % 2 ? s[mid] : (s[mid - 1] + s[mid]) / 2;
36
+ };
37
+ /**
38
+ * Describe how lanes serving one model compare. `outlierRatio` is how far from
39
+ * the median a lane must sit to be worth mentioning; the default of 2 is a
40
+ * starting point for eyeballing, not a calibrated threshold.
41
+ */
42
+ export function compareThroughput(samples, opts) {
43
+ const ratio = opts?.outlierRatio ?? 2;
44
+ const byModel = new Map();
45
+ for (const s of samples) {
46
+ const list = byModel.get(s.model);
47
+ if (list)
48
+ list.push(s);
49
+ else
50
+ byModel.set(s.model, [s]);
51
+ }
52
+ const out = [];
53
+ for (const [model, group] of byModel) {
54
+ // Below three lanes there is no distribution to speak of, so report the
55
+ // median and no outliers rather than inventing a comparison.
56
+ const med = median(group.map((s) => s.tokensPerSecond));
57
+ const outliers = group.length >= 3
58
+ ? group
59
+ .filter((s) => s.tokensPerSecond >= med * ratio ||
60
+ s.tokensPerSecond <= med / ratio)
61
+ .map((s) => ({
62
+ lane: s.lane,
63
+ tokensPerSecond: s.tokensPerSecond,
64
+ ratioToMedian: +(s.tokensPerSecond / med).toFixed(2),
65
+ direction: s.tokensPerSecond > med ? "faster" : "slower",
66
+ }))
67
+ .sort((a, b) => b.tokensPerSecond - a.tokensPerSecond)
68
+ : [];
69
+ out.push({
70
+ model,
71
+ sampleCount: group.length,
72
+ medianTps: +med.toFixed(1),
73
+ outliers,
74
+ note: group.length < 3
75
+ ? "too few lanes to compare"
76
+ : outliers.length === 0
77
+ ? "all lanes within range of each other"
78
+ : `${outliers.length} lane(s) far from the median; a much faster lane can mean a smaller model, but load and quantisation move this too`,
79
+ });
80
+ }
81
+ return out;
82
+ }
83
+ //# sourceMappingURL=throughput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throughput.js","sourceRoot":"","sources":["../../src/detectors/throughput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Token-accounting checks for Anthropic endpoints.
3
+ *
4
+ * The signature check answers "is this really Claude". These answer a different
5
+ * question the signature cannot: "are the numbers you are billing me true".
6
+ * A relay can forward genuine Claude and still inflate `input_tokens` on every
7
+ * call, and nothing in an identity probe would notice.
8
+ *
9
+ * Ported from veridrop (AGPL-3.0) `token_usage.py` / `integrity.py`, whose
10
+ * tolerances were calibrated against the official API. Do not tighten them
11
+ * without re-measuring: the loose-looking bounds exist because real Anthropic
12
+ * responses sat near them.
13
+ */
14
+ import type { TransportFn } from "../transport";
15
+ export type TokenTruthCheck = {
16
+ id: "usage-present" | "input-delta" | "output-bounded" | "count-tokens";
17
+ pass: boolean;
18
+ detail: string;
19
+ };
20
+ export type TokenTruthResult = {
21
+ /** null when nothing could be measured (endpoint refused every probe). */
22
+ ok: boolean | null;
23
+ checks: TokenTruthCheck[];
24
+ shortInputTokens: number | null;
25
+ longInputTokens: number | null;
26
+ countTokens: number | null;
27
+ reason?: string;
28
+ };
29
+ export declare function expectedInputDelta(model: string): {
30
+ min: number;
31
+ max: number;
32
+ };
33
+ export declare function checkTokenTruth(opts: {
34
+ transport: TransportFn;
35
+ baseUrl: string;
36
+ apiKey: string;
37
+ model: string;
38
+ timeoutMs: number;
39
+ }): Promise<TokenTruthResult>;
40
+ //# sourceMappingURL=token-truth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-truth.d.ts","sourceRoot":"","sources":["../../src/detectors/token-truth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsBhD,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,eAAe,GAAG,aAAa,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACxE,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,0EAA0E;IAC1E,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAKF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAK9E;AAcD,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2G5B"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Token-accounting checks for Anthropic endpoints.
3
+ *
4
+ * The signature check answers "is this really Claude". These answer a different
5
+ * question the signature cannot: "are the numbers you are billing me true".
6
+ * A relay can forward genuine Claude and still inflate `input_tokens` on every
7
+ * call, and nothing in an identity probe would notice.
8
+ *
9
+ * Ported from veridrop (AGPL-3.0) `token_usage.py` / `integrity.py`, whose
10
+ * tolerances were calibrated against the official API. Do not tighten them
11
+ * without re-measuring: the loose-looking bounds exist because real Anthropic
12
+ * responses sat near them.
13
+ */
14
+ const SHORT_PROMPT = "Reply with exactly: ok";
15
+ /** The long variant adds a fixed run of tokens; the delta is what we check. */
16
+ const LONG_PROMPT = `${SHORT_PROMPT}\n\nReference text:${" apple".repeat(80)}`;
17
+ const MAX_TOKENS = 16;
18
+ /**
19
+ * Expected `input_tokens` growth between the short and long prompt.
20
+ *
21
+ * Two bands because Anthropic changed tokenizer: opus-4-7/4-8 encode that same
22
+ * text into materially more tokens. A relay claiming a new-tokenizer model
23
+ * while serving an older one lands in the wrong band, which makes this a tier
24
+ * check as well as a billing check.
25
+ */
26
+ const DELTA_OLD = { min: 45, max: 140 };
27
+ const DELTA_NEW = { min: 90, max: 230 };
28
+ const NEW_TOKENIZER_MODELS = ["claude-opus-4-7", "claude-opus-4-8"];
29
+ /** `count_tokens` should agree with the billed `input_tokens` this closely. */
30
+ const countTolerance = (n) => Math.max(4, Math.round(n * 0.2));
31
+ const normalize = (model) => model.toLowerCase().replace(/[._]/g, "-").split("/").pop() ?? "";
32
+ export function expectedInputDelta(model) {
33
+ const m = normalize(model);
34
+ return NEW_TOKENIZER_MODELS.some((p) => m.startsWith(p))
35
+ ? DELTA_NEW
36
+ : DELTA_OLD;
37
+ }
38
+ /** Rejects booleans, which are `typeof "number"`-adjacent traps in JS. */
39
+ function intOf(v) {
40
+ return typeof v === "number" && Number.isInteger(v) && v >= 0 ? v : null;
41
+ }
42
+ function usageOf(data) {
43
+ const u = data?.usage;
44
+ return { input: intOf(u?.input_tokens), output: intOf(u?.output_tokens) };
45
+ }
46
+ export async function checkTokenTruth(opts) {
47
+ const base = opts.baseUrl.replace(/\/+$/, "");
48
+ const headers = {
49
+ "Content-Type": "application/json",
50
+ "x-api-key": opts.apiKey,
51
+ "anthropic-version": "2023-06-01",
52
+ };
53
+ const ask = (prompt) => opts.transport({
54
+ mode: "direct",
55
+ url: `${base}/v1/messages`,
56
+ headers,
57
+ reqBody: {
58
+ model: opts.model,
59
+ max_tokens: MAX_TOKENS,
60
+ messages: [{ role: "user", content: prompt }],
61
+ },
62
+ timeoutMs: opts.timeoutMs,
63
+ });
64
+ const [shortRes, longRes] = await Promise.all([
65
+ ask(SHORT_PROMPT),
66
+ ask(LONG_PROMPT),
67
+ ]);
68
+ const noCounts = {
69
+ shortInputTokens: null,
70
+ longInputTokens: null,
71
+ countTokens: null,
72
+ };
73
+ if (shortRes.status === null || shortRes.status >= 400)
74
+ return {
75
+ ok: null,
76
+ checks: [],
77
+ ...noCounts,
78
+ reason: `probe-failed:${shortRes.status ?? "network"}`,
79
+ };
80
+ const s = usageOf(shortRes.data);
81
+ const l = usageOf(longRes.data);
82
+ const checks = [];
83
+ const usagePresent = s.input !== null && l.input !== null;
84
+ checks.push({
85
+ id: "usage-present",
86
+ pass: usagePresent,
87
+ detail: usagePresent
88
+ ? `short=${s.input}, long=${l.input}`
89
+ : "endpoint reported no usage counts",
90
+ });
91
+ // Without usage there is nothing to verify; a missing field is not fraud.
92
+ if (!usagePresent)
93
+ return { ok: null, checks, ...noCounts, reason: "no-usage-reported" };
94
+ const band = expectedInputDelta(opts.model);
95
+ const delta = l.input - s.input;
96
+ const deltaOk = delta >= band.min && delta <= band.max;
97
+ checks.push({
98
+ id: "input-delta",
99
+ pass: deltaOk,
100
+ detail: `delta=${delta}, expected ${band.min}-${band.max}`,
101
+ });
102
+ // Output above the cap we set means the count is invented, not merely padded.
103
+ const outputs = [s.output, l.output].filter((v) => v !== null);
104
+ const outputOk = outputs.every((v) => v > 0 && v <= MAX_TOKENS + 4);
105
+ checks.push({
106
+ id: "output-bounded",
107
+ pass: outputOk,
108
+ detail: `outputs=${outputs.join(",") || "none"} (cap ${MAX_TOKENS})`,
109
+ });
110
+ // The same upstream pricing the same request without generating: the
111
+ // strongest anti-inflation signal available, when the endpoint exposes it.
112
+ let counted = null;
113
+ const countRes = await opts.transport({
114
+ mode: "direct",
115
+ url: `${base}/v1/messages/count_tokens`,
116
+ headers,
117
+ reqBody: {
118
+ model: opts.model,
119
+ messages: [{ role: "user", content: SHORT_PROMPT }],
120
+ },
121
+ timeoutMs: opts.timeoutMs,
122
+ });
123
+ if (countRes.status !== null && countRes.status < 400) {
124
+ counted = intOf(countRes.data?.input_tokens);
125
+ if (counted !== null) {
126
+ const drift = Math.abs(counted - s.input);
127
+ const tol = countTolerance(s.input);
128
+ checks.push({
129
+ id: "count-tokens",
130
+ pass: drift <= tol,
131
+ detail: `count=${counted} vs billed=${s.input}, drift=${drift} (tolerance ${tol})`,
132
+ });
133
+ }
134
+ }
135
+ // A missing count_tokens endpoint is common on relays and proves nothing, so
136
+ // it is simply absent from the checks rather than counted as a failure.
137
+ return {
138
+ ok: checks.every((c) => c.pass),
139
+ checks,
140
+ shortInputTokens: s.input,
141
+ longInputTokens: l.input,
142
+ countTokens: counted,
143
+ };
144
+ }
145
+ //# sourceMappingURL=token-truth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-truth.js","sourceRoot":"","sources":["../../src/detectors/token-truth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAC9C,+EAA+E;AAC/E,MAAM,WAAW,GAAG,GAAG,YAAY,sBAAsB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/E,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB;;;;;;;GAOG;AACH,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxC,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxC,MAAM,oBAAoB,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;AAEpE,+EAA+E;AAC/E,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAkBvE,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAClC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;AAEnE,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAID,0EAA0E;AAC1E,SAAS,KAAK,CAAC,CAAU;IACvB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC;AAED,SAAS,OAAO,CAAC,IAAa;IAC5B,MAAM,CAAC,GAAI,IAA0B,EAAE,KAAK,CAAC;IAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAMrC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,mBAAmB,EAAE,YAAY;KAClC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,MAAc,EAAE,EAAE,CAC7B,IAAI,CAAC,SAAS,CAAC;QACb,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,GAAG,IAAI,cAAc;QAC1B,OAAO;QACP,OAAO,EAAE;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC9C;QACD,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEL,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,GAAG,CAAC,YAAY,CAAC;QACjB,GAAG,CAAC,WAAW,CAAC;KACjB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG;QACf,gBAAgB,EAAE,IAAI;QACtB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KAClB,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;QACpD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,EAAE;YACV,GAAG,QAAQ;YACX,MAAM,EAAE,gBAAgB,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE;SACvD,CAAC;IAEJ,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,YAAY;YAClB,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,KAAK,EAAE;YACrC,CAAC,CAAC,mCAAmC;KACxC,CAAC,CAAC;IACH,0EAA0E;IAC1E,IAAI,CAAC,YAAY;QACf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAExE,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAM,GAAG,CAAC,CAAC,KAAM,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,SAAS,KAAK,cAAc,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;KAC3D,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,WAAW,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,SAAS,UAAU,GAAG;KACrE,CAAC,CAAC;IAEH,qEAAqE;IACrE,2EAA2E;IAC3E,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;QACpC,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,GAAG,IAAI,2BAA2B;QACvC,OAAO;QACP,OAAO,EAAE;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;SACpD;QACD,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACtD,OAAO,GAAG,KAAK,CAAE,QAAQ,CAAC,IAAmC,EAAE,YAAY,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,KAAM,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,cAAc;gBAClB,IAAI,EAAE,KAAK,IAAI,GAAG;gBAClB,MAAM,EAAE,SAAS,OAAO,cAAc,CAAC,CAAC,KAAK,WAAW,KAAK,eAAe,GAAG,GAAG;aACnF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,6EAA6E;IAC7E,wEAAwE;IAExE,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/B,MAAM;QACN,gBAAgB,EAAE,CAAC,CAAC,KAAK;QACzB,eAAe,EAAE,CAAC,CAAC,KAAK;QACxB,WAAW,EAAE,OAAO;KACrB,CAAC;AACJ,CAAC"}
package/dist/runner.d.ts CHANGED
@@ -13,5 +13,10 @@ export declare function runVerification(opts: {
13
13
  * generation and only applies to Claude models that support thinking.
14
14
  */
15
15
  checkSignature?: boolean;
16
+ /**
17
+ * Verify the endpoint's token accounting (billing inflation, and the
18
+ * tokenizer band that doubles as a tier check). Opt-in: three extra requests.
19
+ */
20
+ checkTokenTruth?: boolean;
16
21
  }): Promise<VerifyResult>;
17
22
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAWA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAqOjB,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,YAAY,CAAC,CA0FxB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAwOjB,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,YAAY,CAAC,CAwHxB"}
package/dist/runner.js CHANGED
@@ -1,4 +1,7 @@
1
1
  import { checkThinkingSignature } from "./detectors/thinking-signature";
2
+ import { checkTokenTruth } from "./detectors/token-truth";
3
+ import { readResponseMetadata } from "./detectors/response-metadata";
4
+ import { sampleThroughput } from "./detectors/throughput";
2
5
  import { sleep } from "./internal/utils";
3
6
  import { echoesNonce, makeNonce } from "./nonce";
4
7
  import { runHandshake } from "./handshake";
@@ -86,6 +89,9 @@ async function runProbe(args) {
86
89
  const meta = args.cfg.extractMeta(res.data);
87
90
  const pass = probe.evaluate(text, args.cfg);
88
91
  return {
92
+ // Derived here because this is the only scope holding the raw payload;
93
+ // the envelope facts are small, the payload itself is not carried.
94
+ envelope: readResponseMetadata(res.data, args.cfg.provider),
89
95
  label: probe.label,
90
96
  pass,
91
97
  signal,
@@ -225,6 +231,26 @@ export async function runVerification(opts) {
225
231
  timeoutMs,
226
232
  })
227
233
  : undefined;
234
+ const tokenTruth = opts.checkTokenTruth && resolvedProvider === "anthropic"
235
+ ? await checkTokenTruth({
236
+ transport,
237
+ baseUrl: normalizeProbeBaseUrl(opts.baseUrl),
238
+ apiKey: opts.apiKey,
239
+ model: opts.model,
240
+ timeoutMs,
241
+ })
242
+ : undefined;
243
+ // Free metadata: derived from probe responses we already paid for.
244
+ const richest = results.reduce((best, r) => (r.usage?.completion ?? 0) > (best?.usage?.completion ?? 0) ? r : best, null);
245
+ const responseMetadata = richest?.envelope;
246
+ const throughput = richest
247
+ ? sampleThroughput({
248
+ lane: hostOf(opts.baseUrl),
249
+ model: opts.model,
250
+ outputTokens: richest.usage?.completion ?? null,
251
+ elapsedMs: richest.latencyMs,
252
+ })
253
+ : null;
228
254
  const detectedModel = results.find((r) => r.detectedModel)?.detectedModel ?? null;
229
255
  const verdict = aggregateVerdict({
230
256
  model: opts.model,
@@ -263,6 +289,9 @@ export async function runVerification(opts) {
263
289
  totalUsage: sumUsage(results.map((r) => r.usage)),
264
290
  resolvedProvider,
265
291
  ...(signature ? { signature } : {}),
292
+ ...(tokenTruth ? { tokenTruth } : {}),
293
+ ...(responseMetadata ? { responseMetadata } : {}),
294
+ ...(throughput ? { throughput } : {}),
266
295
  connectivityError: null,
267
296
  };
268
297
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  import type { SignatureResult } from "./detectors/thinking-signature";
2
+ import type { TokenTruthResult } from "./detectors/token-truth";
3
+ import type { ResponseMetadata } from "./detectors/response-metadata";
4
+ import type { ThroughputSample } from "./detectors/throughput";
2
5
  export type VerifyProvider = "anthropic" | "openai" | "gemini";
3
6
  export type VerifyVerdict = "genuine" | "suspicious" | "unverified";
4
7
  export type ProbeLabel = "emotional" | "creative" | "identity" | "model-name";
@@ -41,6 +44,12 @@ export type VerifyResult = {
41
44
  resolvedProvider: VerifyProvider;
42
45
  /** Present only when the signature check was requested and could run. */
43
46
  signature?: SignatureResult;
47
+ /** Present only when the token-accounting check was requested. */
48
+ tokenTruth?: TokenTruthResult;
49
+ /** Envelope observations, free: read from responses already collected. */
50
+ responseMetadata?: ResponseMetadata;
51
+ /** Output rate, when a probe generated enough tokens to measure one. */
52
+ throughput?: ThroughputSample | null;
44
53
  connectivityError: "cors-needs-backend" | "unreachable" | "invalid-key" | "no-format" | null;
45
54
  };
46
55
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAE9E,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,MAAM,GACN,SAAS,GACT,YAAY,GACZ,UAAU,GACV,OAAO,GACP,IAAI,CAAC;AAET,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,cAAc,CAAC;IACjC,yEAAyE;IACzE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,iBAAiB,EACf,oBAAoB,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,IAAI,CAAC;CAC7E,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAE9E,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,MAAM,GACN,SAAS,GACT,YAAY,GACZ,UAAU,GACV,OAAO,GACP,IAAI,CAAC;AAET,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,cAAc,CAAC;IACjC,yEAAyE;IACzE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,kEAAkE;IAClE,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,wEAAwE;IACxE,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,iBAAiB,EACf,oBAAoB,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,IAAI,CAAC;CAC7E,CAAC"}
package/dist/verdict.d.ts CHANGED
@@ -1,7 +1,14 @@
1
+ import type { ResponseMetadata } from "./detectors/response-metadata";
1
2
  import type { ProviderConfig } from "./providers/config";
2
3
  import type { ProbeOutcome, ProbeSignal, VerifyVerdict } from "./types";
4
+ /**
5
+ * A probe's outcome plus the working values the runner needs but never stores:
6
+ * the reply text, and the envelope facts read while the raw payload was still
7
+ * in scope.
8
+ */
3
9
  export type ProbeEval = ProbeOutcome & {
4
10
  text: string | undefined;
11
+ envelope?: ResponseMetadata;
5
12
  };
6
13
  export type VerdictResult = {
7
14
  verdict: VerifyVerdict;
@@ -1 +1 @@
1
- {"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAEV,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAWF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GAAG,aAAa,CAwEhB;AAUD,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,GACjB,MAAM,CAUR"}
1
+ {"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAEV,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG;IACrC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAWF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GAAG,aAAa,CAwEhB;AAUD,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,GACjB,MAAM,CAUR"}
@@ -1 +1 @@
1
- {"version":3,"file":"verdict.js","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verdict.js","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unorouter/verify-core",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Authenticity and capability checks for AI API relays: is this endpoint really the Claude / GPT / Gemini model it claims?",
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",