ai-model-verifier 1.4.0 → 2.0.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.
Files changed (224) hide show
  1. package/README.md +79 -21
  2. package/dist/engine/context.d.ts +43 -0
  3. package/dist/engine/context.d.ts.map +1 -0
  4. package/dist/engine/context.js +50 -0
  5. package/dist/engine/context.js.map +1 -0
  6. package/dist/engine/evidence.d.ts +40 -0
  7. package/dist/engine/evidence.d.ts.map +1 -0
  8. package/dist/engine/evidence.js +108 -0
  9. package/dist/engine/evidence.js.map +1 -0
  10. package/dist/engine/handshake.d.ts +16 -0
  11. package/dist/engine/handshake.d.ts.map +1 -0
  12. package/dist/{handshake.js → engine/handshake.js} +35 -63
  13. package/dist/engine/handshake.js.map +1 -0
  14. package/dist/engine/probe-runner.d.ts +14 -0
  15. package/dist/engine/probe-runner.d.ts.map +1 -0
  16. package/dist/engine/probe-runner.js +163 -0
  17. package/dist/engine/probe-runner.js.map +1 -0
  18. package/dist/engine/verdict.d.ts +15 -0
  19. package/dist/engine/verdict.d.ts.map +1 -0
  20. package/dist/engine/verdict.js +19 -0
  21. package/dist/engine/verdict.js.map +1 -0
  22. package/dist/highlight.d.ts +2 -2
  23. package/dist/highlight.d.ts.map +1 -1
  24. package/dist/highlight.js +10 -9
  25. package/dist/highlight.js.map +1 -1
  26. package/dist/{patterns.d.ts → identity/patterns.d.ts} +7 -0
  27. package/dist/identity/patterns.d.ts.map +1 -0
  28. package/dist/{patterns.js → identity/patterns.js} +7 -0
  29. package/dist/identity/patterns.js.map +1 -0
  30. package/dist/identity/signals.d.ts +15 -0
  31. package/dist/identity/signals.d.ts.map +1 -0
  32. package/dist/{signals.js → identity/signals.js} +15 -24
  33. package/dist/identity/signals.js.map +1 -0
  34. package/dist/index.d.ts +15 -5
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +12 -5
  37. package/dist/index.js.map +1 -1
  38. package/dist/internal/utils.d.ts +3 -1
  39. package/dist/internal/utils.d.ts.map +1 -1
  40. package/dist/internal/utils.js +12 -6
  41. package/dist/internal/utils.js.map +1 -1
  42. package/dist/models/catalog.d.ts +7 -0
  43. package/dist/models/catalog.d.ts.map +1 -0
  44. package/dist/models/catalog.js +23 -0
  45. package/dist/models/catalog.js.map +1 -0
  46. package/dist/models/facts.d.ts +56 -0
  47. package/dist/models/facts.d.ts.map +1 -0
  48. package/dist/models/facts.js +91 -0
  49. package/dist/models/facts.js.map +1 -0
  50. package/dist/models/index.d.ts +6 -0
  51. package/dist/models/index.d.ts.map +1 -0
  52. package/dist/models/index.js +5 -0
  53. package/dist/models/index.js.map +1 -0
  54. package/dist/{substitution.d.ts → models/substitution.d.ts} +3 -4
  55. package/dist/models/substitution.d.ts.map +1 -0
  56. package/dist/{substitution.js → models/substitution.js} +3 -4
  57. package/dist/models/substitution.js.map +1 -0
  58. package/dist/models/tiers.d.ts +14 -0
  59. package/dist/models/tiers.d.ts.map +1 -0
  60. package/dist/models/tiers.js +35 -0
  61. package/dist/models/tiers.js.map +1 -0
  62. package/dist/probes/prompts.d.ts +23 -0
  63. package/dist/probes/prompts.d.ts.map +1 -0
  64. package/dist/probes/prompts.js +31 -0
  65. package/dist/probes/prompts.js.map +1 -0
  66. package/dist/probes/table.d.ts +37 -0
  67. package/dist/probes/table.d.ts.map +1 -0
  68. package/dist/probes/table.js +57 -0
  69. package/dist/probes/table.js.map +1 -0
  70. package/dist/registry.d.ts +26 -0
  71. package/dist/registry.d.ts.map +1 -0
  72. package/dist/registry.js +23 -0
  73. package/dist/registry.js.map +1 -0
  74. package/dist/rules/index.d.ts +15 -0
  75. package/dist/rules/index.d.ts.map +1 -0
  76. package/dist/rules/index.js +8 -0
  77. package/dist/rules/index.js.map +1 -0
  78. package/dist/rules/probe-ladder.d.ts +33 -0
  79. package/dist/rules/probe-ladder.d.ts.map +1 -0
  80. package/dist/rules/probe-ladder.js +156 -0
  81. package/dist/rules/probe-ladder.js.map +1 -0
  82. package/dist/{detectors → rules}/response-metadata.d.ts +11 -14
  83. package/dist/rules/response-metadata.d.ts.map +1 -0
  84. package/dist/{detectors → rules}/response-metadata.js +32 -15
  85. package/dist/rules/response-metadata.js.map +1 -0
  86. package/dist/rules/table.d.ts +27 -0
  87. package/dist/rules/table.d.ts.map +1 -0
  88. package/dist/rules/table.js +47 -0
  89. package/dist/rules/table.js.map +1 -0
  90. package/dist/{detectors → rules}/thinking-floor.d.ts +14 -29
  91. package/dist/rules/thinking-floor.d.ts.map +1 -0
  92. package/dist/rules/thinking-floor.js +119 -0
  93. package/dist/rules/thinking-floor.js.map +1 -0
  94. package/dist/rules/thinking-signature.d.ts +43 -0
  95. package/dist/rules/thinking-signature.d.ts.map +1 -0
  96. package/dist/rules/thinking-signature.js +72 -0
  97. package/dist/rules/thinking-signature.js.map +1 -0
  98. package/dist/{detectors → rules}/throughput.d.ts +7 -10
  99. package/dist/rules/throughput.d.ts.map +1 -0
  100. package/dist/{detectors → rules}/throughput.js +32 -11
  101. package/dist/rules/throughput.js.map +1 -0
  102. package/dist/{detectors → rules}/token-truth.d.ts +7 -13
  103. package/dist/rules/token-truth.d.ts.map +1 -0
  104. package/dist/rules/token-truth.js +112 -0
  105. package/dist/rules/token-truth.js.map +1 -0
  106. package/dist/rules/tokenizer-fingerprint.d.ts +46 -0
  107. package/dist/rules/tokenizer-fingerprint.d.ts.map +1 -0
  108. package/dist/rules/tokenizer-fingerprint.js +110 -0
  109. package/dist/rules/tokenizer-fingerprint.js.map +1 -0
  110. package/dist/rules/types.d.ts +57 -0
  111. package/dist/rules/types.d.ts.map +1 -0
  112. package/dist/rules/types.js +2 -0
  113. package/dist/rules/types.js.map +1 -0
  114. package/dist/transport.d.ts +10 -2
  115. package/dist/transport.d.ts.map +1 -1
  116. package/dist/transport.js +40 -32
  117. package/dist/transport.js.map +1 -1
  118. package/dist/types.d.ts +70 -31
  119. package/dist/types.d.ts.map +1 -1
  120. package/dist/vendors/anthropic.d.ts +44 -0
  121. package/dist/vendors/anthropic.d.ts.map +1 -0
  122. package/dist/vendors/anthropic.js +114 -0
  123. package/dist/vendors/anthropic.js.map +1 -0
  124. package/dist/vendors/base-url.d.ts +3 -0
  125. package/dist/vendors/base-url.d.ts.map +1 -0
  126. package/dist/vendors/base-url.js +6 -0
  127. package/dist/vendors/base-url.js.map +1 -0
  128. package/dist/vendors/gemini.d.ts +44 -0
  129. package/dist/vendors/gemini.d.ts.map +1 -0
  130. package/dist/vendors/gemini.js +77 -0
  131. package/dist/vendors/gemini.js.map +1 -0
  132. package/dist/vendors/index.d.ts +9 -0
  133. package/dist/vendors/index.d.ts.map +1 -0
  134. package/dist/vendors/index.js +7 -0
  135. package/dist/vendors/index.js.map +1 -0
  136. package/dist/vendors/openai.d.ts +46 -0
  137. package/dist/vendors/openai.d.ts.map +1 -0
  138. package/dist/vendors/openai.js +77 -0
  139. package/dist/vendors/openai.js.map +1 -0
  140. package/dist/vendors/table.d.ts +113 -0
  141. package/dist/vendors/table.d.ts.map +1 -0
  142. package/dist/vendors/table.js +14 -0
  143. package/dist/vendors/table.js.map +1 -0
  144. package/dist/vendors/types.d.ts +93 -0
  145. package/dist/vendors/types.d.ts.map +1 -0
  146. package/dist/vendors/types.js +2 -0
  147. package/dist/vendors/types.js.map +1 -0
  148. package/dist/verify.d.ts +30 -0
  149. package/dist/verify.d.ts.map +1 -0
  150. package/dist/verify.js +185 -0
  151. package/dist/verify.js.map +1 -0
  152. package/package.json +25 -10
  153. package/dist/detectors/response-metadata.d.ts.map +0 -1
  154. package/dist/detectors/response-metadata.js.map +0 -1
  155. package/dist/detectors/thinking-floor.d.ts.map +0 -1
  156. package/dist/detectors/thinking-floor.js +0 -135
  157. package/dist/detectors/thinking-floor.js.map +0 -1
  158. package/dist/detectors/thinking-signature.d.ts +0 -70
  159. package/dist/detectors/thinking-signature.d.ts.map +0 -1
  160. package/dist/detectors/thinking-signature.js +0 -177
  161. package/dist/detectors/thinking-signature.js.map +0 -1
  162. package/dist/detectors/throughput.d.ts.map +0 -1
  163. package/dist/detectors/throughput.js.map +0 -1
  164. package/dist/detectors/token-truth.d.ts.map +0 -1
  165. package/dist/detectors/token-truth.js +0 -142
  166. package/dist/detectors/token-truth.js.map +0 -1
  167. package/dist/detectors/tokenizer-fingerprint.d.ts +0 -65
  168. package/dist/detectors/tokenizer-fingerprint.d.ts.map +0 -1
  169. package/dist/detectors/tokenizer-fingerprint.js +0 -135
  170. package/dist/detectors/tokenizer-fingerprint.js.map +0 -1
  171. package/dist/handshake.d.ts +0 -23
  172. package/dist/handshake.d.ts.map +0 -1
  173. package/dist/handshake.js.map +0 -1
  174. package/dist/internal/fixed-text.d.ts +0 -13
  175. package/dist/internal/fixed-text.d.ts.map +0 -1
  176. package/dist/internal/fixed-text.js +0 -13
  177. package/dist/internal/fixed-text.js.map +0 -1
  178. package/dist/models.d.ts +0 -5
  179. package/dist/models.d.ts.map +0 -1
  180. package/dist/models.js +0 -54
  181. package/dist/models.js.map +0 -1
  182. package/dist/nonce.d.ts +0 -4
  183. package/dist/nonce.d.ts.map +0 -1
  184. package/dist/nonce.js +0 -12
  185. package/dist/nonce.js.map +0 -1
  186. package/dist/patterns.d.ts.map +0 -1
  187. package/dist/patterns.js.map +0 -1
  188. package/dist/probes.d.ts +0 -10
  189. package/dist/probes.d.ts.map +0 -1
  190. package/dist/probes.js +0 -54
  191. package/dist/probes.js.map +0 -1
  192. package/dist/providers/anthropic.d.ts +0 -3
  193. package/dist/providers/anthropic.d.ts.map +0 -1
  194. package/dist/providers/anthropic.js +0 -67
  195. package/dist/providers/anthropic.js.map +0 -1
  196. package/dist/providers/config.d.ts +0 -34
  197. package/dist/providers/config.d.ts.map +0 -1
  198. package/dist/providers/config.js +0 -14
  199. package/dist/providers/config.js.map +0 -1
  200. package/dist/providers/gemini.d.ts +0 -3
  201. package/dist/providers/gemini.d.ts.map +0 -1
  202. package/dist/providers/gemini.js +0 -58
  203. package/dist/providers/gemini.js.map +0 -1
  204. package/dist/providers/openai.d.ts +0 -3
  205. package/dist/providers/openai.d.ts.map +0 -1
  206. package/dist/providers/openai.js +0 -56
  207. package/dist/providers/openai.js.map +0 -1
  208. package/dist/rules.d.ts +0 -6
  209. package/dist/rules.d.ts.map +0 -1
  210. package/dist/rules.js +0 -28
  211. package/dist/rules.js.map +0 -1
  212. package/dist/runner.d.ts +0 -39
  213. package/dist/runner.d.ts.map +0 -1
  214. package/dist/runner.js +0 -352
  215. package/dist/runner.js.map +0 -1
  216. package/dist/signals.d.ts +0 -11
  217. package/dist/signals.d.ts.map +0 -1
  218. package/dist/signals.js.map +0 -1
  219. package/dist/substitution.d.ts.map +0 -1
  220. package/dist/substitution.js.map +0 -1
  221. package/dist/verdict.d.ts +0 -26
  222. package/dist/verdict.d.ts.map +0 -1
  223. package/dist/verdict.js +0 -84
  224. package/dist/verdict.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-truth.js","sourceRoot":"","sources":["../../src/detectors/token-truth.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,135 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenizer-fingerprint.js","sourceRoot":"","sources":["../../src/detectors/tokenizer-fingerprint.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import { type TransportFn } from "./transport";
2
- import type { TransportMode, VerifyProvider } from "./types";
3
- export type HandshakeOutcome = {
4
- ok: true;
5
- resolvedProvider: VerifyProvider;
6
- mode: TransportMode;
7
- status: number;
8
- } | {
9
- ok: false;
10
- reason: "cors-needs-backend" | "unreachable" | "invalid-key" | "model-rejected" | "endpoint-busy" | "no-format";
11
- status: number | null;
12
- corsBlocked: boolean;
13
- };
14
- export declare function runHandshake(opts: {
15
- provider: VerifyProvider;
16
- baseUrl: string;
17
- apiKey: string;
18
- model: string;
19
- mode: TransportMode;
20
- timeoutMs: number;
21
- transport?: TransportFn;
22
- }): Promise<HandshakeOutcome>;
23
- //# sourceMappingURL=handshake.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../src/handshake.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,MAAM,gBAAgB,GACxB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,gBAAgB,EAAE,cAAc,CAAC;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EACF,oBAAoB,GACpB,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,WAAW,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAuFN,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,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,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,WAAW,CAAC;CACzB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuE5B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../src/handshake.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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/models.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import type { VerifyProvider } from "./types";
2
- export declare const CURATED_MODELS: Record<VerifyProvider, readonly string[]>;
3
- export declare function vendorForRow(provider: VerifyProvider, model?: string): string;
4
- export declare function providerForModel(model: string): VerifyProvider | null;
5
- //# sourceMappingURL=models.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAU9C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAUpE,CAAC;AAgBF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAerE"}
package/dist/models.js DELETED
@@ -1,54 +0,0 @@
1
- import { isOneOf } from "./internal/utils";
2
- const VERIFY_PROVIDERS = [
3
- "anthropic",
4
- "openai",
5
- "gemini",
6
- ];
7
- const isVerifyProvider = isOneOf(VERIFY_PROVIDERS);
8
- export const CURATED_MODELS = {
9
- anthropic: [
10
- "claude-opus-4-6",
11
- "claude-opus-4-7",
12
- "claude-opus-4-8",
13
- "claude-sonnet-4-6",
14
- "claude-haiku-4-5",
15
- ],
16
- openai: ["gpt-5.5", "gpt-5.4", "gpt-5.1", "o3", "o4-mini"],
17
- gemini: ["gemini-3.1-pro-preview", "gemini-3.1-flash", "gemini-2.5-pro"],
18
- };
19
- const MODEL_TO_PROVIDER = {};
20
- for (const provider of Object.keys(CURATED_MODELS)) {
21
- if (!isVerifyProvider(provider))
22
- continue;
23
- for (const model of CURATED_MODELS[provider]) {
24
- MODEL_TO_PROVIDER[model] = provider;
25
- }
26
- }
27
- const PROVIDER_VENDOR = {
28
- anthropic: "anthropic",
29
- openai: "openai",
30
- gemini: "google",
31
- };
32
- export function vendorForRow(provider, model) {
33
- const inferred = model ? providerForModel(model) : null;
34
- return PROVIDER_VENDOR[inferred ?? provider];
35
- }
36
- export function providerForModel(model) {
37
- const id = model.trim().toLowerCase();
38
- if (!id)
39
- return null;
40
- if (MODEL_TO_PROVIDER[id])
41
- return MODEL_TO_PROVIDER[id];
42
- if (id.includes("claude"))
43
- return "anthropic";
44
- if (id.includes("gemini"))
45
- return "gemini";
46
- if (id.startsWith("gpt-") ||
47
- id.startsWith("o1") ||
48
- id.startsWith("o3") ||
49
- id.startsWith("o4") ||
50
- id.startsWith("chatgpt"))
51
- return "openai";
52
- return null;
53
- }
54
- //# sourceMappingURL=models.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,MAAM,gBAAgB,GAA8B;IAClD,WAAW;IACX,QAAQ;IACR,QAAQ;CACT,CAAC;AAEF,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,cAAc,GAA8C;IACvE,SAAS,EAAE;QACT,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,mBAAmB;QACnB,kBAAkB;KACnB;IACD,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;IAC1D,MAAM,EAAE,CAAC,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;CACzE,CAAC;AAEF,MAAM,iBAAiB,GAAmC,EAAE,CAAC;AAC7D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAAE,SAAS;IAC1C,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,iBAAiB,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAmC;IACtD,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,QAAwB,EAAE,KAAc;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,OAAO,eAAe,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACrB,IAAI,iBAAiB,CAAC,EAAE,CAAC;QAAE,OAAO,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,WAAW,CAAC;IAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,IACE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QACrB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QACnB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QACnB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QACnB,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAExB,OAAO,QAAQ,CAAC;IAClB,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/nonce.d.ts DELETED
@@ -1,4 +0,0 @@
1
- export declare function makeNonce(): string;
2
- export declare function nonceTag(nonce: string): string;
3
- export declare function echoesNonce(text: string, nonce: string): boolean;
4
- //# sourceMappingURL=nonce.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nonce.d.ts","sourceRoot":"","sources":["../src/nonce.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhE"}
package/dist/nonce.js DELETED
@@ -1,12 +0,0 @@
1
- export function makeNonce() {
2
- const bytes = new Uint8Array(4);
3
- crypto.getRandomValues(bytes);
4
- return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
5
- }
6
- export function nonceTag(nonce) {
7
- return `Begin your reply with the tag [${nonce}] then a space, then your answer.`;
8
- }
9
- export function echoesNonce(text, nonce) {
10
- return text.includes(nonce.toLowerCase());
11
- }
12
- //# sourceMappingURL=nonce.js.map
package/dist/nonce.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"nonce.js","sourceRoot":"","sources":["../src/nonce.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,kCAAkC,KAAK,mCAAmC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,UA2BxC,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAiC,CAAC;AAEhE,eAAO,MAAM,kBAAkB,UAM9B,CAAC;AAEF,eAAO,MAAM,eAAe;aAC1B,SAAS,YAAG,WAAW,EAAE,QAAQ;aACjC,MAAM,YAAG,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;aAC5E,MAAM,YAAG,QAAQ,EAAE,UAAU,EAAE,QAAQ;aACvC,KAAK,YACH,UAAU,EACV,MAAM,EACN,UAAU,EACV,MAAM,EACN,SAAS,EACT,OAAO,EACP,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO;CAED,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,eAAe,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAK/D;AAGD,eAAO,MAAM,mBAAmB,UAA6E,CAAC;AAE9G,eAAO,MAAM,wBAAwB,UAA0B,CAAC;AAEhE,eAAO,MAAM,QAAQ,QAAuB,CAAC;AAE7C,eAAO,MAAM,kBAAkB,IAAI,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,yBAAyB;IACzB,uCAAuC;IACvC,mCAAmC;IACnC,8BAA8B;IAC9B,mCAAmC;IACnC,uCAAuC;IACvC,gCAAgC;IAChC,wBAAwB;IACxB,sCAAsC;IACtC,kCAAkC;IAClC,oCAAoC;IACpC,qCAAqC;IACrC,4CAA4C;IAC5C,sCAAsC;IACtC,6CAA6C;IAC7C,+BAA+B;IAC/B,wCAAwC;IACxC,2BAA2B;IAC3B,kBAAkB;IAClB,wBAAwB;IACxB,yBAAyB;IACzB,gCAAgC;IAChC,qBAAqB;IACrB,WAAW;IACX,qCAAqC;IACrC,iDAAiD;CAClD,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS;IACT,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IAClC,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAC7E,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;IACxC,KAAK,EAAE;QACL,UAAU;QACV,MAAM;QACN,UAAU;QACV,MAAM;QACN,SAAS;QACT,OAAO;QACP,MAAM;QACN,MAAM;QACN,KAAK;QACL,OAAO;KACR;CACO,CAAC;AAIX,MAAM,UAAU,qBAAqB,CAAC,IAAe;IACnD,MAAM,IAAI,GAAgB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,IAAI,eAAe,CAC5C,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,kBAAkB;AAClB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,SAAS,CAAC,CAAC;AAE9G,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAG,oBAAoB,CAAC;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC"}
package/dist/probes.d.ts DELETED
@@ -1,10 +0,0 @@
1
- import type { ProviderConfig } from "./providers/config";
2
- import type { ProbeLabel } from "./types";
3
- export type ProbeDef = {
4
- label: ProbeLabel;
5
- maxTokens: number;
6
- buildPrompt: (nonce: string) => string;
7
- evaluate: (text: string, cfg: ProviderConfig) => boolean;
8
- };
9
- export declare const PROBES: readonly ProbeDef[];
10
- //# sourceMappingURL=probes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAUzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,SAAS,QAAQ,EAkErC,CAAC"}
package/dist/probes.js DELETED
@@ -1,54 +0,0 @@
1
- import { cjkLeak, hasCodingToolRefusal, hasForeignIdentity, hasScamPage, includesAny, } from "./signals";
2
- import { CLOUD_HOST_PATTERNS, FAKE_RESPONSE_SIGNATURES } from "./patterns";
3
- import { nonceTag } from "./nonce";
4
- export const PROBES = [
5
- {
6
- label: "emotional",
7
- maxTokens: 200,
8
- buildPrompt: (n) => `Tell me a 2-sentence sad story about a lost kitten. ${nonceTag(n)}`,
9
- evaluate: (text) => !hasCodingToolRefusal(text) && !cjkLeak(text) && text.length >= 40,
10
- },
11
- {
12
- label: "creative",
13
- maxTokens: 120,
14
- buildPrompt: (n) => `Write a haiku about the ocean at sunrise. ${nonceTag(n)}`,
15
- evaluate: (text) => !hasCodingToolRefusal(text) && !cjkLeak(text) && text.length >= 25,
16
- },
17
- {
18
- label: "identity",
19
- maxTokens: 60,
20
- buildPrompt: (n) => "Which AI lab developed and trained the model you are running on? " +
21
- "Not the company hosting you, the lab that trained the model. " +
22
- `One word answer. ${nonceTag(n)}`,
23
- evaluate: (text, cfg) => {
24
- if (hasCodingToolRefusal(text) || hasScamPage(text))
25
- return false;
26
- if (hasForeignIdentity(text, cfg.foreignIdentityPatterns, cfg.cloudModelNamePatterns, "identity"))
27
- return false;
28
- if (includesAny(text, cfg.homeIdentityPatterns))
29
- return true;
30
- if (cfg.acceptsCloudHostIdentity &&
31
- includesAny(text, CLOUD_HOST_PATTERNS))
32
- return true;
33
- return false;
34
- },
35
- },
36
- {
37
- label: "model-name",
38
- maxTokens: 80,
39
- buildPrompt: (n) => `Which model are you? Reply with only your model name. ${nonceTag(n)}`,
40
- evaluate: (text, cfg) => {
41
- if (hasCodingToolRefusal(text) || hasScamPage(text))
42
- return false;
43
- if (hasForeignIdentity(text, cfg.foreignIdentityPatterns, cfg.cloudModelNamePatterns, "model-name"))
44
- return false;
45
- if (!includesAny(text, cfg.homeModelNamePatterns))
46
- return false;
47
- const stripped = text.replace(/^\s*\[[a-z0-9]{4,8}\]\s*/i, "").trim();
48
- if (FAKE_RESPONSE_SIGNATURES.includes(stripped))
49
- return false;
50
- return true;
51
- },
52
- },
53
- ];
54
- //# sourceMappingURL=probes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"probes.js","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUnC,MAAM,CAAC,MAAM,MAAM,GAAwB;IACzC;QACE,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,uDAAuD,QAAQ,CAAC,CAAC,CAAC,EAAE;QACtE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;KACrE;IACD;QACE,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,6CAA6C,QAAQ,CAAC,CAAC,CAAC,EAAE;QAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;KACrE;IACD;QACE,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,mEAAmE;YACnE,+DAA+D;YAC/D,oBAAoB,QAAQ,CAAC,CAAC,CAAC,EAAE;QACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACtB,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClE,IACE,kBAAkB,CAChB,IAAI,EACJ,GAAG,CAAC,uBAAuB,EAC3B,GAAG,CAAC,sBAAsB,EAC1B,UAAU,CACX;gBAED,OAAO,KAAK,CAAC;YACf,IAAI,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,oBAAoB,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7D,IACE,GAAG,CAAC,wBAAwB;gBAC5B,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC;gBAEtC,OAAO,IAAI,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;KACF;IACD;QACE,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,yDAAyD,QAAQ,CAAC,CAAC,CAAC,EAAE;QACxE,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACtB,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClE,IACE,kBAAkB,CAChB,IAAI,EACJ,GAAG,CAAC,uBAAuB,EAC3B,GAAG,CAAC,sBAAsB,EAC1B,YAAY,CACb;gBAED,OAAO,KAAK,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,qBAAqB,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,IAAI,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;KACF;CACF,CAAC"}
@@ -1,3 +0,0 @@
1
- import { type ProviderConfig } from "./config";
2
- export declare const anthropicConfig: ProviderConfig;
3
- //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AA6DlB,eAAO,MAAM,eAAe,EAAE,cAa7B,CAAC"}
@@ -1,67 +0,0 @@
1
- import { rec } from "../internal/utils";
2
- import { foreignPatternsExcept } from "../patterns";
3
- import { normalizeProbeBaseUrl, } from "./config";
4
- // Anthropic refuses a browser preflight unless the caller opts in with this
5
- // header, and every relay that reimplements their API inherits the rule. The
6
- // header is meaningless to endpoints that do not check it, so send it on every
7
- // direct Anthropic-format probe rather than guessing which hosts enforce it.
8
- const BROWSER_ACCESS_HEADER = "anthropic-dangerous-direct-browser-access";
9
- function buildRequest(args) {
10
- const headers = {
11
- "content-type": "application/json",
12
- "x-api-key": args.apiKey,
13
- "anthropic-version": "2023-06-01",
14
- };
15
- if (args.direct)
16
- headers[BROWSER_ACCESS_HEADER] = "true";
17
- return {
18
- url: `${normalizeProbeBaseUrl(args.baseUrl)}/v1/messages`,
19
- headers,
20
- body: {
21
- model: args.model,
22
- max_tokens: args.maxTokens,
23
- messages: [{ role: "user", content: args.prompt }],
24
- },
25
- };
26
- }
27
- function extractText(data) {
28
- const d = rec(data) ?? {};
29
- if (d.type === "error")
30
- return null;
31
- return (d.content ?? [])
32
- .filter((b) => b.type === "text")
33
- .map((b) => b.text ?? "")
34
- .join(" ")
35
- .toLowerCase();
36
- }
37
- function extractMeta(data) {
38
- const d = rec(data) ?? {};
39
- const u = d.usage;
40
- const prompt = u?.input_tokens ?? null;
41
- const completion = u?.output_tokens ?? null;
42
- return {
43
- detectedModel: d.model ?? null,
44
- usage: u
45
- ? {
46
- prompt,
47
- completion,
48
- total: prompt !== null && completion !== null ? prompt + completion : null,
49
- }
50
- : null,
51
- };
52
- }
53
- export const anthropicConfig = {
54
- provider: "anthropic",
55
- buildRequest,
56
- extractText,
57
- extractMeta,
58
- homeIdentityPatterns: ["anthropic"],
59
- foreignIdentityPatterns: foreignPatternsExcept("anthropic"),
60
- homeModelNamePatterns: ["claude", "anthropic"],
61
- cloudModelNamePatterns: ["amazon q", "q developer", "kiro"],
62
- // `fable` is load-bearing: sync catches fable lanes served as sonnet, and a
63
- // tier list missing it makes that substitution undetectable here.
64
- tiers: ["opus", "sonnet", "haiku", "fable"],
65
- acceptsCloudHostIdentity: true,
66
- };
67
- //# sourceMappingURL=anthropic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,qBAAqB,GAItB,MAAM,UAAU,CAAC;AASlB,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG,2CAA2C,CAAC;AAE1E,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,mBAAmB,EAAE,YAAY;KAClC,CAAC;IACF,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC;IACzD,OAAO;QACL,GAAG,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc;QACzD,OAAO;QACP,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;SACnD;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,CAAC,GAAsB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;SACxB,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,CAAC,GAAsB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,MAAM,MAAM,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI,CAAC;IACvC,MAAM,UAAU,GAAG,CAAC,EAAE,aAAa,IAAI,IAAI,CAAC;IAC5C,OAAO;QACL,aAAa,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;QAC9B,KAAK,EAAE,CAAC;YACN,CAAC,CAAC;gBACE,MAAM;gBACN,UAAU;gBACV,KAAK,EACH,MAAM,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI;aACtE;YACH,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,QAAQ,EAAE,WAAW;IACrB,YAAY;IACZ,WAAW;IACX,WAAW;IACX,oBAAoB,EAAE,CAAC,WAAW,CAAC;IACnC,uBAAuB,EAAE,qBAAqB,CAAC,WAAW,CAAC;IAC3D,qBAAqB,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC9C,sBAAsB,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;IAC3D,4EAA4E;IAC5E,kEAAkE;IAClE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;IAC3C,wBAAwB,EAAE,IAAI;CAC/B,CAAC"}
@@ -1,34 +0,0 @@
1
- import type { ProbeUsage, VerifyProvider } from "../types";
2
- export type ProbeMeta = {
3
- detectedModel: string | null;
4
- usage: ProbeUsage | null;
5
- };
6
- export type ProbeRequestArgs = {
7
- baseUrl: string;
8
- apiKey: string;
9
- model: string;
10
- prompt: string;
11
- maxTokens: number;
12
- direct: boolean;
13
- };
14
- export type BuiltRequest = {
15
- url: string;
16
- headers: Record<string, string>;
17
- body: unknown;
18
- };
19
- /** Providers append their own version segment, so a pasted one would double it. */
20
- export declare function normalizeProbeBaseUrl(baseUrl: string): string;
21
- export type ProviderConfig = {
22
- provider: VerifyProvider;
23
- buildRequest: (args: ProbeRequestArgs) => BuiltRequest;
24
- extractText: (data: unknown) => string | null;
25
- extractMeta: (data: unknown) => ProbeMeta;
26
- homeIdentityPatterns: string[];
27
- foreignIdentityPatterns: string[];
28
- homeModelNamePatterns: string[];
29
- cloudModelNamePatterns: string[];
30
- tiers: readonly string[] | null;
31
- acceptsCloudHostIdentity: boolean;
32
- };
33
- export declare const PROVIDER_CONFIGS: Record<VerifyProvider, ProviderConfig>;
34
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/providers/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK3D,MAAM,MAAM,SAAS,GAAG;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAIF,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,YAAY,CAAC;IACvD,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC;IAC1C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,wBAAwB,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CAInE,CAAC"}
@@ -1,14 +0,0 @@
1
- import { anthropicConfig } from "./anthropic";
2
- import { geminiConfig } from "./gemini";
3
- import { openaiConfig } from "./openai";
4
- const VERSION_SUFFIX = /\/(?:v\d+(?:alpha|beta)?)\/*$/i;
5
- /** Providers append their own version segment, so a pasted one would double it. */
6
- export function normalizeProbeBaseUrl(baseUrl) {
7
- return baseUrl.trim().replace(/\/+$/, "").replace(VERSION_SUFFIX, "");
8
- }
9
- export const PROVIDER_CONFIGS = {
10
- anthropic: anthropicConfig,
11
- openai: openaiConfig,
12
- gemini: geminiConfig,
13
- };
14
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/providers/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAsBxC,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAeD,MAAM,CAAC,MAAM,gBAAgB,GAA2C;IACtE,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;CACrB,CAAC"}