ai-model-verifier 1.2.0 → 1.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.
- package/README.md +9 -1
- package/dist/detectors/thinking-floor.d.ts +65 -0
- package/dist/detectors/thinking-floor.d.ts.map +1 -0
- package/dist/detectors/thinking-floor.js +135 -0
- package/dist/detectors/thinking-floor.js.map +1 -0
- package/dist/detectors/token-truth.d.ts.map +1 -1
- package/dist/detectors/token-truth.js +1 -4
- package/dist/detectors/token-truth.js.map +1 -1
- package/dist/detectors/tokenizer-fingerprint.d.ts +65 -0
- package/dist/detectors/tokenizer-fingerprint.d.ts.map +1 -0
- package/dist/detectors/tokenizer-fingerprint.js +135 -0
- package/dist/detectors/tokenizer-fingerprint.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/internal/fixed-text.d.ts +13 -0
- package/dist/internal/fixed-text.d.ts.map +1 -0
- package/dist/internal/fixed-text.js +13 -0
- package/dist/internal/fixed-text.js.map +1 -0
- package/dist/runner.d.ts +17 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +55 -1
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -33,7 +33,15 @@ import { anthropicConfig } from "ai-model-verifier/providers/anthropic";
|
|
|
33
33
|
`coding-tool` refusals (Kiro/Amazon Q wearing a Claude badge), scam pages,
|
|
34
34
|
CJK language leaks from a substituted Chinese model, response-mixing proxies,
|
|
35
35
|
foreign vendor identity, Claude tier substitution (opus billed, sonnet served),
|
|
36
|
-
|
|
36
|
+
envelope-level model substitution, and (opt-in, `checkThinkingFloor`) a
|
|
37
|
+
model that cannot switch thinking off answering with no reasoning tokens, the
|
|
38
|
+
signature of a flash tier sold as Gemini 2.5 Pro, and (opt-in,
|
|
39
|
+
`checkTokenizerFingerprint`) the input-token count for a fixed text, which no
|
|
40
|
+
system prompt can coach: on the lanes it was calibrated against, every Claude
|
|
41
|
+
Haiku backend billed the same delta to the token while Opus and Fable did not,
|
|
42
|
+
so an "Opus" lane carrying the Haiku count is exposed even when it echoes the
|
|
43
|
+
right model name. The same measurement, kept per lane, reveals a backend swap
|
|
44
|
+
the moment the count changes.
|
|
37
45
|
|
|
38
46
|
## License
|
|
39
47
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thinking-floor check for models that cannot switch reasoning off.
|
|
3
|
+
*
|
|
4
|
+
* Gemini 2.5 Pro has a thinking budget floor (128 tokens): even "Reply with
|
|
5
|
+
* only the word ok." produces hidden thought tokens, reported as
|
|
6
|
+
* `completion_tokens_details.reasoning_tokens` on an OpenAI-shaped hop, folded
|
|
7
|
+
* into `completion_tokens` when the relay strips the breakdown, or as
|
|
8
|
+
* `usageMetadata.thoughtsTokenCount` on the native endpoint. Measured across 66
|
|
9
|
+
* historical probes of genuine 2.5 Pro: the lowest completion count for that
|
|
10
|
+
* prompt was 12, the native thoughts count 99 to 158.
|
|
11
|
+
*
|
|
12
|
+
* A flash-class backend sold under the pro name answers the same prompt with
|
|
13
|
+
* `completion_tokens: 1` (a6 merchant 3623, 2026-09-09), and it still echoes
|
|
14
|
+
* `model: gemini-2.5-pro`, so the envelope substitution check never fires.
|
|
15
|
+
* The token count is the only free evidence left.
|
|
16
|
+
*
|
|
17
|
+
* Not applied to flash tiers: those may legitimately run with thinking off.
|
|
18
|
+
*/
|
|
19
|
+
import type { TransportFn } from "../transport";
|
|
20
|
+
export type ThinkingFloorOptions = {
|
|
21
|
+
/**
|
|
22
|
+
* Model id prefixes that must always think. Compared after lowercasing and
|
|
23
|
+
* mapping `.`/`_` to `-`, provider prefix stripped.
|
|
24
|
+
*/
|
|
25
|
+
models?: readonly string[];
|
|
26
|
+
/** Below this many completion tokens with no reasoning count, the reply did not think. */
|
|
27
|
+
minCompletionTokens?: number;
|
|
28
|
+
};
|
|
29
|
+
export declare const DEFAULT_ALWAYS_THINKS: readonly string[];
|
|
30
|
+
export declare const DEFAULT_MIN_COMPLETION_TOKENS = 10;
|
|
31
|
+
export type ThinkingFloorState =
|
|
32
|
+
/** Reasoning tokens reported, or the completion count is above the floor. */
|
|
33
|
+
"thought"
|
|
34
|
+
/** A model that cannot skip thinking answered with no reasoning at all. */
|
|
35
|
+
| "no-thinking"
|
|
36
|
+
/** No usage in the reply: nothing to judge. */
|
|
37
|
+
| "unmeasured"
|
|
38
|
+
/** Model is not one that must always think. */
|
|
39
|
+
| "skipped";
|
|
40
|
+
export type ThinkingFloorResult = {
|
|
41
|
+
state: ThinkingFloorState;
|
|
42
|
+
completionTokens: number | null;
|
|
43
|
+
reasoningTokens: number | null;
|
|
44
|
+
reason?: string;
|
|
45
|
+
};
|
|
46
|
+
export declare function mustAlwaysThink(model: string, options?: ThinkingFloorOptions): boolean;
|
|
47
|
+
/** Completion and reasoning counts from an OpenAI `usage` or a Gemini `usageMetadata`. */
|
|
48
|
+
export declare function readThinkingUsage(data: unknown): {
|
|
49
|
+
completion: number | null;
|
|
50
|
+
reasoning: number | null;
|
|
51
|
+
} | null;
|
|
52
|
+
/** Judge one reply to the short probe. Pure: pass any response body already collected. */
|
|
53
|
+
export declare function checkThinkingFloor(model: string, data: unknown, options?: ThinkingFloorOptions): ThinkingFloorResult;
|
|
54
|
+
/** One extra generation: the short prompt through the endpoint, then `checkThinkingFloor`. */
|
|
55
|
+
export declare function probeThinkingFloor(opts: {
|
|
56
|
+
transport: TransportFn;
|
|
57
|
+
baseUrl: string;
|
|
58
|
+
apiKey: string;
|
|
59
|
+
model: string;
|
|
60
|
+
/** Wire shape of the endpoint. */
|
|
61
|
+
provider: "openai" | "gemini";
|
|
62
|
+
timeoutMs: number;
|
|
63
|
+
options?: ThinkingFloorOptions;
|
|
64
|
+
}): Promise<ThinkingFloorResult>;
|
|
65
|
+
//# sourceMappingURL=thinking-floor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-floor.d.ts","sourceRoot":"","sources":["../../src/detectors/thinking-floor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,0FAA0F;IAC1F,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAAuB,CAAC;AAC3E,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAMhD,MAAM,MAAM,kBAAkB;AAC5B,6EAA6E;AAC3E,SAAS;AACX,2EAA2E;GACzE,aAAa;AACf,+CAA+C;GAC7C,YAAY;AACd,+CAA+C;GAC7C,SAAS,CAAC;AAEd,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAKF,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAKT;AAYD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,GACZ;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAWhE;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,oBAAoB,GAC7B,mBAAmB,CA8CrB;AAED,8FAA8F;AAC9F,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA0C/B"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thinking-floor check for models that cannot switch reasoning off.
|
|
3
|
+
*
|
|
4
|
+
* Gemini 2.5 Pro has a thinking budget floor (128 tokens): even "Reply with
|
|
5
|
+
* only the word ok." produces hidden thought tokens, reported as
|
|
6
|
+
* `completion_tokens_details.reasoning_tokens` on an OpenAI-shaped hop, folded
|
|
7
|
+
* into `completion_tokens` when the relay strips the breakdown, or as
|
|
8
|
+
* `usageMetadata.thoughtsTokenCount` on the native endpoint. Measured across 66
|
|
9
|
+
* historical probes of genuine 2.5 Pro: the lowest completion count for that
|
|
10
|
+
* prompt was 12, the native thoughts count 99 to 158.
|
|
11
|
+
*
|
|
12
|
+
* A flash-class backend sold under the pro name answers the same prompt with
|
|
13
|
+
* `completion_tokens: 1` (a6 merchant 3623, 2026-09-09), and it still echoes
|
|
14
|
+
* `model: gemini-2.5-pro`, so the envelope substitution check never fires.
|
|
15
|
+
* The token count is the only free evidence left.
|
|
16
|
+
*
|
|
17
|
+
* Not applied to flash tiers: those may legitimately run with thinking off.
|
|
18
|
+
*/
|
|
19
|
+
export const DEFAULT_ALWAYS_THINKS = ["gemini-2-5-pro"];
|
|
20
|
+
export const DEFAULT_MIN_COMPLETION_TOKENS = 10;
|
|
21
|
+
const PROBE_PROMPT = "Reply with only the word ok.";
|
|
22
|
+
/** Room for the thoughts plus the word; too small truncates thinking and reads as a fake. */
|
|
23
|
+
const MAX_TOKENS = 2048;
|
|
24
|
+
const normalize = (model) => model.toLowerCase().replace(/[._]/g, "-").split("/").pop() ?? "";
|
|
25
|
+
export function mustAlwaysThink(model, options) {
|
|
26
|
+
const m = normalize(model);
|
|
27
|
+
return (options?.models ?? DEFAULT_ALWAYS_THINKS).some((p) => m.startsWith(normalize(p)));
|
|
28
|
+
}
|
|
29
|
+
const num = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
30
|
+
/** Completion and reasoning counts from an OpenAI `usage` or a Gemini `usageMetadata`. */
|
|
31
|
+
export function readThinkingUsage(data) {
|
|
32
|
+
if (!data || typeof data !== "object")
|
|
33
|
+
return null;
|
|
34
|
+
const d = data;
|
|
35
|
+
const u = (d.usage ?? d.usageMetadata);
|
|
36
|
+
if (!u || typeof u !== "object")
|
|
37
|
+
return null;
|
|
38
|
+
const details = u.completion_tokens_details;
|
|
39
|
+
const reasoning = num(details && typeof details === "object" ? details.reasoning_tokens : null) ??
|
|
40
|
+
num(u.thoughtsTokenCount);
|
|
41
|
+
const completion = num(u.completion_tokens) ?? num(u.candidatesTokenCount);
|
|
42
|
+
return { completion, reasoning };
|
|
43
|
+
}
|
|
44
|
+
/** Judge one reply to the short probe. Pure: pass any response body already collected. */
|
|
45
|
+
export function checkThinkingFloor(model, data, options) {
|
|
46
|
+
if (!mustAlwaysThink(model, options))
|
|
47
|
+
return { state: "skipped", completionTokens: null, reasoningTokens: null };
|
|
48
|
+
const usage = readThinkingUsage(data);
|
|
49
|
+
if (!usage)
|
|
50
|
+
return {
|
|
51
|
+
state: "unmeasured",
|
|
52
|
+
completionTokens: null,
|
|
53
|
+
reasoningTokens: null,
|
|
54
|
+
reason: "no usage in reply",
|
|
55
|
+
};
|
|
56
|
+
const floor = options?.minCompletionTokens ?? DEFAULT_MIN_COMPLETION_TOKENS;
|
|
57
|
+
if (usage.reasoning !== null && usage.reasoning > 0)
|
|
58
|
+
return {
|
|
59
|
+
state: "thought",
|
|
60
|
+
completionTokens: usage.completion,
|
|
61
|
+
reasoningTokens: usage.reasoning,
|
|
62
|
+
};
|
|
63
|
+
if (usage.completion === null)
|
|
64
|
+
return {
|
|
65
|
+
state: "unmeasured",
|
|
66
|
+
completionTokens: null,
|
|
67
|
+
reasoningTokens: usage.reasoning,
|
|
68
|
+
reason: "no completion count in usage",
|
|
69
|
+
};
|
|
70
|
+
// An empty reply carries no evidence: nothing was generated, so nothing was
|
|
71
|
+
// skipped. Truncation and refusals land here, not in "no-thinking".
|
|
72
|
+
if (usage.completion === 0)
|
|
73
|
+
return {
|
|
74
|
+
state: "unmeasured",
|
|
75
|
+
completionTokens: 0,
|
|
76
|
+
reasoningTokens: usage.reasoning,
|
|
77
|
+
reason: "empty reply",
|
|
78
|
+
};
|
|
79
|
+
if (usage.completion < floor)
|
|
80
|
+
return {
|
|
81
|
+
state: "no-thinking",
|
|
82
|
+
completionTokens: usage.completion,
|
|
83
|
+
reasoningTokens: usage.reasoning,
|
|
84
|
+
reason: `completion_tokens ${usage.completion} below floor ${floor} with no reasoning tokens`,
|
|
85
|
+
};
|
|
86
|
+
return {
|
|
87
|
+
state: "thought",
|
|
88
|
+
completionTokens: usage.completion,
|
|
89
|
+
reasoningTokens: usage.reasoning,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** One extra generation: the short prompt through the endpoint, then `checkThinkingFloor`. */
|
|
93
|
+
export async function probeThinkingFloor(opts) {
|
|
94
|
+
if (!mustAlwaysThink(opts.model, opts.options))
|
|
95
|
+
return { state: "skipped", completionTokens: null, reasoningTokens: null };
|
|
96
|
+
const base = opts.baseUrl.replace(/\/+$/, "");
|
|
97
|
+
const req = opts.provider === "gemini"
|
|
98
|
+
? {
|
|
99
|
+
url: `${base}/v1beta/models/${opts.model}:generateContent`,
|
|
100
|
+
headers: {
|
|
101
|
+
"content-type": "application/json",
|
|
102
|
+
"x-goog-api-key": opts.apiKey,
|
|
103
|
+
},
|
|
104
|
+
reqBody: {
|
|
105
|
+
contents: [{ role: "user", parts: [{ text: PROBE_PROMPT }] }],
|
|
106
|
+
generationConfig: { maxOutputTokens: MAX_TOKENS },
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
: {
|
|
110
|
+
url: `${base}/v1/chat/completions`,
|
|
111
|
+
headers: {
|
|
112
|
+
"content-type": "application/json",
|
|
113
|
+
authorization: `Bearer ${opts.apiKey}`,
|
|
114
|
+
},
|
|
115
|
+
reqBody: {
|
|
116
|
+
model: opts.model,
|
|
117
|
+
max_tokens: MAX_TOKENS,
|
|
118
|
+
messages: [{ role: "user", content: PROBE_PROMPT }],
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
const res = await opts.transport({
|
|
122
|
+
mode: "direct",
|
|
123
|
+
...req,
|
|
124
|
+
timeoutMs: opts.timeoutMs,
|
|
125
|
+
});
|
|
126
|
+
if (res.status !== 200 || !res.data)
|
|
127
|
+
return {
|
|
128
|
+
state: "unmeasured",
|
|
129
|
+
completionTokens: null,
|
|
130
|
+
reasoningTokens: null,
|
|
131
|
+
reason: res.error ?? `http ${res.status ?? "none"}`,
|
|
132
|
+
};
|
|
133
|
+
return checkThinkingFloor(opts.model, res.data, opts.options);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=thinking-floor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-floor.js","sourceRoot":"","sources":["../../src/detectors/thinking-floor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AAuBhD,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"}
|
|
@@ -11,10 +11,7 @@
|
|
|
11
11
|
* without re-measuring: the loose-looking bounds exist because real Anthropic
|
|
12
12
|
* responses sat near them.
|
|
13
13
|
*/
|
|
14
|
-
|
|
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;
|
|
14
|
+
import { COUNT_PROBE_MAX_TOKENS as MAX_TOKENS, LONG_PROMPT, SHORT_PROMPT, } from "../internal/fixed-text";
|
|
18
15
|
/**
|
|
19
16
|
* Expected `input_tokens` growth between the short and long prompt.
|
|
20
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-truth.js","sourceRoot":"","sources":["../../src/detectors/token-truth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,
|
|
1
|
+
{"version":3,"file":"token-truth.js","sourceRoot":"","sources":["../../src/detectors/token-truth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EACL,sBAAsB,IAAI,UAAU,EACpC,WAAW,EACX,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokenizer fingerprint: how many input tokens the endpoint bills for a fixed
|
|
3
|
+
* run of text.
|
|
4
|
+
*
|
|
5
|
+
* Every other tier signal can be coached: a system prompt teaches the model to
|
|
6
|
+
* say "Opus", a relay rewrites the `model` field. The token count for a fixed
|
|
7
|
+
* text cannot be coached, because the model never sees the question. It is
|
|
8
|
+
* decided by the tokenizer behind the endpoint, and Claude generations do not
|
|
9
|
+
* share one: on 2026-09-12, across 68 marketplace lanes measured twice each,
|
|
10
|
+
* every lane whose reply named claude-haiku-4-5 billed a delta of exactly 90
|
|
11
|
+
* (18 of 18), while lanes serving opus-4-6 and fable clustered at 84 on the
|
|
12
|
+
* same relay path. Two of the lanes at 90 echoed an opus name in the `model`
|
|
13
|
+
* field and were haiku by every other measure.
|
|
14
|
+
*
|
|
15
|
+
* Two uses, in order of confidence:
|
|
16
|
+
*
|
|
17
|
+
* 1. Drift. The delta is deterministic per lane (identical on repeat), so a
|
|
18
|
+
* change between two measurements of the same lane means the backend
|
|
19
|
+
* changed, whatever the reply now calls itself. The caller keeps the prior.
|
|
20
|
+
* 2. Signature. A delta known to belong to a cheaper tier than the one
|
|
21
|
+
* requested. The table is calibration, not law: relays that count tokens
|
|
22
|
+
* themselves produce their own values (211, 609 were both seen), so an
|
|
23
|
+
* unknown delta proves nothing and only a listed one is judged.
|
|
24
|
+
*/
|
|
25
|
+
import type { TransportFn } from "../transport";
|
|
26
|
+
/** Wire format the endpoint speaks; Claude is sold over both. */
|
|
27
|
+
export type CountWire = "anthropic" | "openai";
|
|
28
|
+
export type TierSignatures = Readonly<Record<string, readonly number[]>>;
|
|
29
|
+
/**
|
|
30
|
+
* Deltas measured on lanes whose reply named the tier, 2026-09-12. Only haiku
|
|
31
|
+
* is listed: its 18 samples agreed to the token, while opus and fable spread
|
|
32
|
+
* across relay counting paths and would condemn honest lanes.
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEFAULT_TIER_SIGNATURES: TierSignatures;
|
|
35
|
+
export type TokenizerFingerprintState = "measured" | "unmeasured";
|
|
36
|
+
export type TokenizerFingerprintResult = {
|
|
37
|
+
state: TokenizerFingerprintState;
|
|
38
|
+
/** long minus short input tokens; the fingerprint itself. */
|
|
39
|
+
delta: number | null;
|
|
40
|
+
shortInputTokens: number | null;
|
|
41
|
+
longInputTokens: number | null;
|
|
42
|
+
/** `model` echoed on the short reply, when the endpoint reported one. */
|
|
43
|
+
servedModel: string | null;
|
|
44
|
+
/** Tier whose signature the delta matched, when any did. */
|
|
45
|
+
matchedTier: string | null;
|
|
46
|
+
reason?: string;
|
|
47
|
+
};
|
|
48
|
+
export declare function tierForDelta(delta: number, signatures?: TierSignatures): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* The served tier when the fingerprint names one cheaper than requested, or
|
|
51
|
+
* null. `tiers` is the provider's tier vocabulary (opus, sonnet, haiku, fable).
|
|
52
|
+
*/
|
|
53
|
+
export declare function judgeTokenizerFingerprint(requestedModel: string, result: TokenizerFingerprintResult, tiers: readonly string[]): string | null;
|
|
54
|
+
/** True when two measurements of the same lane disagree: the backend changed. */
|
|
55
|
+
export declare function fingerprintDrifted(prior: number | null | undefined, current: TokenizerFingerprintResult): boolean;
|
|
56
|
+
export declare function measureTokenizerFingerprint(opts: {
|
|
57
|
+
transport: TransportFn;
|
|
58
|
+
baseUrl: string;
|
|
59
|
+
apiKey: string;
|
|
60
|
+
model: string;
|
|
61
|
+
wire: CountWire;
|
|
62
|
+
timeoutMs: number;
|
|
63
|
+
signatures?: TierSignatures;
|
|
64
|
+
}): Promise<TokenizerFingerprintResult>;
|
|
65
|
+
//# sourceMappingURL=tokenizer-fingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer-fingerprint.d.ts","sourceRoot":"","sources":["../../src/detectors/tokenizer-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAOhD,iEAAiE;AACjE,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE/C,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAEzE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAgC,CAAC;AAEvE,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,YAAY,CAAC;AAElE,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,yBAAyB,CAAC;IACjC,6DAA6D;IAC7D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,yEAAyE;IACzE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAkBF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,cAAwC,GACnD,MAAM,GAAG,IAAI,CAIf;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,0BAA0B,EAClC,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,MAAM,GAAG,IAAI,CAMf;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAOT;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAoEtC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokenizer fingerprint: how many input tokens the endpoint bills for a fixed
|
|
3
|
+
* run of text.
|
|
4
|
+
*
|
|
5
|
+
* Every other tier signal can be coached: a system prompt teaches the model to
|
|
6
|
+
* say "Opus", a relay rewrites the `model` field. The token count for a fixed
|
|
7
|
+
* text cannot be coached, because the model never sees the question. It is
|
|
8
|
+
* decided by the tokenizer behind the endpoint, and Claude generations do not
|
|
9
|
+
* share one: on 2026-09-12, across 68 marketplace lanes measured twice each,
|
|
10
|
+
* every lane whose reply named claude-haiku-4-5 billed a delta of exactly 90
|
|
11
|
+
* (18 of 18), while lanes serving opus-4-6 and fable clustered at 84 on the
|
|
12
|
+
* same relay path. Two of the lanes at 90 echoed an opus name in the `model`
|
|
13
|
+
* field and were haiku by every other measure.
|
|
14
|
+
*
|
|
15
|
+
* Two uses, in order of confidence:
|
|
16
|
+
*
|
|
17
|
+
* 1. Drift. The delta is deterministic per lane (identical on repeat), so a
|
|
18
|
+
* change between two measurements of the same lane means the backend
|
|
19
|
+
* changed, whatever the reply now calls itself. The caller keeps the prior.
|
|
20
|
+
* 2. Signature. A delta known to belong to a cheaper tier than the one
|
|
21
|
+
* requested. The table is calibration, not law: relays that count tokens
|
|
22
|
+
* themselves produce their own values (211, 609 were both seen), so an
|
|
23
|
+
* unknown delta proves nothing and only a listed one is judged.
|
|
24
|
+
*/
|
|
25
|
+
import { COUNT_PROBE_MAX_TOKENS, LONG_PROMPT, SHORT_PROMPT, } from "../internal/fixed-text";
|
|
26
|
+
/**
|
|
27
|
+
* Deltas measured on lanes whose reply named the tier, 2026-09-12. Only haiku
|
|
28
|
+
* is listed: its 18 samples agreed to the token, while opus and fable spread
|
|
29
|
+
* across relay counting paths and would condemn honest lanes.
|
|
30
|
+
*/
|
|
31
|
+
export const DEFAULT_TIER_SIGNATURES = { haiku: [90] };
|
|
32
|
+
const intOf = (v) => typeof v === "number" && Number.isInteger(v) && v >= 0 ? v : null;
|
|
33
|
+
function readInputTokens(data, wire) {
|
|
34
|
+
const u = data?.usage;
|
|
35
|
+
if (!u || typeof u !== "object")
|
|
36
|
+
return null;
|
|
37
|
+
return wire === "anthropic"
|
|
38
|
+
? intOf(u["input_tokens"])
|
|
39
|
+
: intOf(u["prompt_tokens"]);
|
|
40
|
+
}
|
|
41
|
+
function readServedModel(data) {
|
|
42
|
+
const m = data?.model;
|
|
43
|
+
return typeof m === "string" && m.length > 0 ? m : null;
|
|
44
|
+
}
|
|
45
|
+
export function tierForDelta(delta, signatures = DEFAULT_TIER_SIGNATURES) {
|
|
46
|
+
for (const [tier, values] of Object.entries(signatures))
|
|
47
|
+
if (values.includes(delta))
|
|
48
|
+
return tier;
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The served tier when the fingerprint names one cheaper than requested, or
|
|
53
|
+
* null. `tiers` is the provider's tier vocabulary (opus, sonnet, haiku, fable).
|
|
54
|
+
*/
|
|
55
|
+
export function judgeTokenizerFingerprint(requestedModel, result, tiers) {
|
|
56
|
+
if (result.state !== "measured" || result.matchedTier === null)
|
|
57
|
+
return null;
|
|
58
|
+
const req = requestedModel.toLowerCase();
|
|
59
|
+
const reqTier = tiers.filter((t) => req.includes(t));
|
|
60
|
+
if (reqTier.length !== 1)
|
|
61
|
+
return null;
|
|
62
|
+
return reqTier[0] === result.matchedTier ? null : result.matchedTier;
|
|
63
|
+
}
|
|
64
|
+
/** True when two measurements of the same lane disagree: the backend changed. */
|
|
65
|
+
export function fingerprintDrifted(prior, current) {
|
|
66
|
+
return (typeof prior === "number" &&
|
|
67
|
+
current.state === "measured" &&
|
|
68
|
+
current.delta !== null &&
|
|
69
|
+
current.delta !== prior);
|
|
70
|
+
}
|
|
71
|
+
export async function measureTokenizerFingerprint(opts) {
|
|
72
|
+
const base = opts.baseUrl.replace(/\/+$/, "");
|
|
73
|
+
const url = opts.wire === "anthropic"
|
|
74
|
+
? `${base}/v1/messages`
|
|
75
|
+
: `${base}/v1/chat/completions`;
|
|
76
|
+
const headers = opts.wire === "anthropic"
|
|
77
|
+
? {
|
|
78
|
+
"Content-Type": "application/json",
|
|
79
|
+
"x-api-key": opts.apiKey,
|
|
80
|
+
"anthropic-version": "2023-06-01",
|
|
81
|
+
}
|
|
82
|
+
: {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
Authorization: `Bearer ${opts.apiKey}`,
|
|
85
|
+
};
|
|
86
|
+
const ask = (prompt) => opts.transport({
|
|
87
|
+
mode: "direct",
|
|
88
|
+
url,
|
|
89
|
+
headers,
|
|
90
|
+
reqBody: {
|
|
91
|
+
model: opts.model,
|
|
92
|
+
max_tokens: COUNT_PROBE_MAX_TOKENS,
|
|
93
|
+
messages: [{ role: "user", content: prompt }],
|
|
94
|
+
},
|
|
95
|
+
timeoutMs: opts.timeoutMs,
|
|
96
|
+
});
|
|
97
|
+
const [shortRes, longRes] = await Promise.all([
|
|
98
|
+
ask(SHORT_PROMPT),
|
|
99
|
+
ask(LONG_PROMPT),
|
|
100
|
+
]);
|
|
101
|
+
const empty = {
|
|
102
|
+
delta: null,
|
|
103
|
+
shortInputTokens: null,
|
|
104
|
+
longInputTokens: null,
|
|
105
|
+
servedModel: null,
|
|
106
|
+
matchedTier: null,
|
|
107
|
+
};
|
|
108
|
+
for (const r of [shortRes, longRes])
|
|
109
|
+
if (r.status === null || r.status >= 400)
|
|
110
|
+
return {
|
|
111
|
+
state: "unmeasured",
|
|
112
|
+
...empty,
|
|
113
|
+
reason: `probe-failed:${r.status ?? "network"}`,
|
|
114
|
+
};
|
|
115
|
+
const short = readInputTokens(shortRes.data, opts.wire);
|
|
116
|
+
const long = readInputTokens(longRes.data, opts.wire);
|
|
117
|
+
const servedModel = readServedModel(shortRes.data);
|
|
118
|
+
if (short === null || long === null)
|
|
119
|
+
return {
|
|
120
|
+
state: "unmeasured",
|
|
121
|
+
...empty,
|
|
122
|
+
servedModel,
|
|
123
|
+
reason: "no-usage-reported",
|
|
124
|
+
};
|
|
125
|
+
const delta = long - short;
|
|
126
|
+
return {
|
|
127
|
+
state: "measured",
|
|
128
|
+
delta,
|
|
129
|
+
shortInputTokens: short,
|
|
130
|
+
longInputTokens: long,
|
|
131
|
+
servedModel,
|
|
132
|
+
matchedTier: tierForDelta(delta, opts.signatures),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=tokenizer-fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer-fingerprint.js","sourceRoot":"","sources":["../../src/detectors/tokenizer-fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export { runVerification } from "./runner";
|
|
|
4
4
|
export { normalizeProbeBaseUrl } from "./providers/config";
|
|
5
5
|
export type { ProviderConfig, ProbeRequestArgs, BuiltRequest, ProbeMeta, } from "./providers/config";
|
|
6
6
|
export type { TransportFn, TransportArgs, TransportResult } from "./transport";
|
|
7
|
+
export type { TokenizerFingerprintResult, TierSignatures, } from "./detectors/tokenizer-fingerprint";
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/E,YAAY,EACV,0BAA0B,EAC1B,cAAc,GACf,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fixed prompt pair every token-count detector measures against. The short
|
|
3
|
+
* prompt anchors the count; the long one appends a known run of text, so the
|
|
4
|
+
* difference is the endpoint's tokenizer at work on that run alone. Anything a
|
|
5
|
+
* relay injects (a system prompt, a wrapper) is present in both and cancels.
|
|
6
|
+
*
|
|
7
|
+
* Do not change the text: every recorded delta was measured on exactly this
|
|
8
|
+
* pair, and a different run of text yields a different table of signatures.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SHORT_PROMPT = "Reply with exactly: ok";
|
|
11
|
+
export declare const LONG_PROMPT: string;
|
|
12
|
+
export declare const COUNT_PROBE_MAX_TOKENS = 16;
|
|
13
|
+
//# sourceMappingURL=fixed-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-text.d.ts","sourceRoot":"","sources":["../../src/internal/fixed-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,2BAA2B,CAAC;AACrD,eAAO,MAAM,WAAW,QAA6D,CAAC;AACtF,eAAO,MAAM,sBAAsB,KAAK,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fixed prompt pair every token-count detector measures against. The short
|
|
3
|
+
* prompt anchors the count; the long one appends a known run of text, so the
|
|
4
|
+
* difference is the endpoint's tokenizer at work on that run alone. Anything a
|
|
5
|
+
* relay injects (a system prompt, a wrapper) is present in both and cancels.
|
|
6
|
+
*
|
|
7
|
+
* Do not change the text: every recorded delta was measured on exactly this
|
|
8
|
+
* pair, and a different run of text yields a different table of signatures.
|
|
9
|
+
*/
|
|
10
|
+
export const SHORT_PROMPT = "Reply with exactly: ok";
|
|
11
|
+
export const LONG_PROMPT = `${SHORT_PROMPT}\n\nReference text:${" apple".repeat(80)}`;
|
|
12
|
+
export const COUNT_PROBE_MAX_TOKENS = 16;
|
|
13
|
+
//# sourceMappingURL=fixed-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-text.js","sourceRoot":"","sources":["../../src/internal/fixed-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,wBAAwB,CAAC;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,YAAY,sBAAsB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type ThinkingFloorOptions } from "./detectors/thinking-floor";
|
|
2
|
+
import { type TierSignatures } from "./detectors/tokenizer-fingerprint";
|
|
1
3
|
import { type TransportFn } from "./transport";
|
|
2
4
|
import type { TransportMode, VerifyProvider, VerifyResult } from "./types";
|
|
3
5
|
export declare function runVerification(opts: {
|
|
@@ -18,5 +20,20 @@ export declare function runVerification(opts: {
|
|
|
18
20
|
* tokenizer band that doubles as a tier check). Opt-in: three extra requests.
|
|
19
21
|
*/
|
|
20
22
|
checkTokenTruth?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* For models that cannot switch thinking off (Gemini 2.5 Pro by default),
|
|
25
|
+
* reject a reply with no reasoning tokens: a cheaper tier under the pro
|
|
26
|
+
* name. Opt-in: one extra short generation. Pass options to change the
|
|
27
|
+
* model list or the floor.
|
|
28
|
+
*/
|
|
29
|
+
checkThinkingFloor?: boolean | ThinkingFloorOptions;
|
|
30
|
+
/**
|
|
31
|
+
* Measure the input-token delta for a fixed text and compare it with the
|
|
32
|
+
* tier signatures (haiku by default). Claude only, over either wire. Opt-in:
|
|
33
|
+
* two short requests. Pass `{ signatures }` to supply your own calibration.
|
|
34
|
+
*/
|
|
35
|
+
checkTokenizerFingerprint?: boolean | {
|
|
36
|
+
signatures?: TierSignatures;
|
|
37
|
+
};
|
|
21
38
|
}): Promise<VerifyResult>;
|
|
22
39
|
//# sourceMappingURL=runner.d.ts.map
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,mCAAmC,CAAC;AAY3C,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;IAC1B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,GAAG,oBAAoB,CAAC;IACpD;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,GAAG;QAAE,UAAU,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;CACvE,GAAG,OAAO,CAAC,YAAY,CAAC,CAmLxB"}
|
package/dist/runner.js
CHANGED
|
@@ -2,6 +2,9 @@ import { checkThinkingSignature } from "./detectors/thinking-signature";
|
|
|
2
2
|
import { checkTokenTruth } from "./detectors/token-truth";
|
|
3
3
|
import { readResponseMetadata } from "./detectors/response-metadata";
|
|
4
4
|
import { sampleThroughput } from "./detectors/throughput";
|
|
5
|
+
import { probeThinkingFloor, } from "./detectors/thinking-floor";
|
|
6
|
+
import { judgeTokenizerFingerprint, measureTokenizerFingerprint, } from "./detectors/tokenizer-fingerprint";
|
|
7
|
+
import { providerForModel } from "./models";
|
|
5
8
|
import { sleep } from "./internal/utils";
|
|
6
9
|
import { echoesNonce, makeNonce } from "./nonce";
|
|
7
10
|
import { runHandshake } from "./handshake";
|
|
@@ -240,6 +243,35 @@ export async function runVerification(opts) {
|
|
|
240
243
|
timeoutMs,
|
|
241
244
|
})
|
|
242
245
|
: undefined;
|
|
246
|
+
const thinkingFloor = opts.checkThinkingFloor &&
|
|
247
|
+
(resolvedProvider === "openai" || resolvedProvider === "gemini")
|
|
248
|
+
? await probeThinkingFloor({
|
|
249
|
+
transport,
|
|
250
|
+
baseUrl: normalizeProbeBaseUrl(opts.baseUrl),
|
|
251
|
+
apiKey: opts.apiKey,
|
|
252
|
+
model: opts.model,
|
|
253
|
+
provider: resolvedProvider,
|
|
254
|
+
timeoutMs,
|
|
255
|
+
options: typeof opts.checkThinkingFloor === "object"
|
|
256
|
+
? opts.checkThinkingFloor
|
|
257
|
+
: undefined,
|
|
258
|
+
})
|
|
259
|
+
: undefined;
|
|
260
|
+
const tokenizerFingerprint = opts.checkTokenizerFingerprint &&
|
|
261
|
+
providerForModel(opts.model) === "anthropic" &&
|
|
262
|
+
resolvedProvider !== "gemini"
|
|
263
|
+
? await measureTokenizerFingerprint({
|
|
264
|
+
transport,
|
|
265
|
+
baseUrl: normalizeProbeBaseUrl(opts.baseUrl),
|
|
266
|
+
apiKey: opts.apiKey,
|
|
267
|
+
model: opts.model,
|
|
268
|
+
wire: resolvedProvider === "anthropic" ? "anthropic" : "openai",
|
|
269
|
+
timeoutMs,
|
|
270
|
+
signatures: typeof opts.checkTokenizerFingerprint === "object"
|
|
271
|
+
? opts.checkTokenizerFingerprint.signatures
|
|
272
|
+
: undefined,
|
|
273
|
+
})
|
|
274
|
+
: undefined;
|
|
243
275
|
// Free metadata: derived from probe responses we already paid for.
|
|
244
276
|
const richest = results.reduce((best, r) => (r.usage?.completion ?? 0) > (best?.usage?.completion ?? 0) ? r : best, null);
|
|
245
277
|
const responseMetadata = richest?.envelope;
|
|
@@ -252,12 +284,32 @@ export async function runVerification(opts) {
|
|
|
252
284
|
})
|
|
253
285
|
: null;
|
|
254
286
|
const detectedModel = results.find((r) => r.detectedModel)?.detectedModel ?? null;
|
|
255
|
-
const
|
|
287
|
+
const aggregated = aggregateVerdict({
|
|
256
288
|
model: opts.model,
|
|
257
289
|
cfg,
|
|
258
290
|
results,
|
|
259
291
|
detectedModel,
|
|
260
292
|
});
|
|
293
|
+
// The floor is hard evidence the probes cannot see: the reply echoed the
|
|
294
|
+
// right name and read fine, it just never thought.
|
|
295
|
+
const fingerprintTier = tokenizerFingerprint && cfg.tiers
|
|
296
|
+
? judgeTokenizerFingerprint(opts.model, tokenizerFingerprint, cfg.tiers)
|
|
297
|
+
: null;
|
|
298
|
+
const verdict = thinkingFloor?.state === "no-thinking"
|
|
299
|
+
? {
|
|
300
|
+
...aggregated,
|
|
301
|
+
verdict: "suspicious",
|
|
302
|
+
reasons: [`no-thinking: ${thinkingFloor.reason}`],
|
|
303
|
+
}
|
|
304
|
+
: fingerprintTier
|
|
305
|
+
? {
|
|
306
|
+
...aggregated,
|
|
307
|
+
verdict: "suspicious",
|
|
308
|
+
reasons: [
|
|
309
|
+
`tokenizer-fingerprint: delta ${tokenizerFingerprint.delta} is the ${fingerprintTier} signature, requested ${opts.model}`,
|
|
310
|
+
],
|
|
311
|
+
}
|
|
312
|
+
: aggregated;
|
|
261
313
|
const corsBlocked = hs.mode === "direct" && results.some((r) => r.corsBlocked);
|
|
262
314
|
return {
|
|
263
315
|
provider: opts.provider,
|
|
@@ -290,6 +342,8 @@ export async function runVerification(opts) {
|
|
|
290
342
|
resolvedProvider,
|
|
291
343
|
...(signature ? { signature } : {}),
|
|
292
344
|
...(tokenTruth ? { tokenTruth } : {}),
|
|
345
|
+
...(thinkingFloor ? { thinkingFloor } : {}),
|
|
346
|
+
...(tokenizerFingerprint ? { tokenizerFingerprint } : {}),
|
|
293
347
|
...(responseMetadata ? { responseMetadata } : {}),
|
|
294
348
|
...(throughput ? { throughput } : {}),
|
|
295
349
|
connectivityError: null,
|
package/dist/runner.js.map
CHANGED
|
@@ -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,5 +1,7 @@
|
|
|
1
1
|
import type { SignatureResult } from "./detectors/thinking-signature";
|
|
2
2
|
import type { TokenTruthResult } from "./detectors/token-truth";
|
|
3
|
+
import type { ThinkingFloorResult } from "./detectors/thinking-floor";
|
|
4
|
+
import type { TokenizerFingerprintResult } from "./detectors/tokenizer-fingerprint";
|
|
3
5
|
import type { ResponseMetadata } from "./detectors/response-metadata";
|
|
4
6
|
import type { ThroughputSample } from "./detectors/throughput";
|
|
5
7
|
export type VerifyProvider = "anthropic" | "openai" | "gemini";
|
|
@@ -46,6 +48,10 @@ export type VerifyResult = {
|
|
|
46
48
|
signature?: SignatureResult;
|
|
47
49
|
/** Present only when the token-accounting check was requested. */
|
|
48
50
|
tokenTruth?: TokenTruthResult;
|
|
51
|
+
/** Present only when the thinking-floor check was requested. */
|
|
52
|
+
thinkingFloor?: ThinkingFloorResult;
|
|
53
|
+
/** Present only when the tokenizer fingerprint was requested (Claude only). */
|
|
54
|
+
tokenizerFingerprint?: TokenizerFingerprintResult;
|
|
49
55
|
/** Envelope observations, free: read from responses already collected. */
|
|
50
56
|
responseMetadata?: ResponseMetadata;
|
|
51
57
|
/** Output rate, when a probe generated enough tokens to measure one. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;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,EACb,oBAAoB,GACpB,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,WAAW,GACX,IAAI,CAAC;CACV,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,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AACpF,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,gEAAgE;IAChE,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,+EAA+E;IAC/E,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAClD,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,wEAAwE;IACxE,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,iBAAiB,EACb,oBAAoB,GACpB,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,WAAW,GACX,IAAI,CAAC;CACV,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-model-verifier",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Verify an AI API endpoint really serves the model it claims: model substitution, Claude thinking signatures, token-billing accuracy, response-envelope and throughput evidence.",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"type": "module",
|