ai-model-verifier 1.4.1 → 2.0.1

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 (222) hide show
  1. package/README.md +79 -22
  2. package/dist/engine/context.d.ts +50 -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/{detectors → rules}/tokenizer-fingerprint.d.ts +7 -19
  107. package/dist/rules/tokenizer-fingerprint.d.ts.map +1 -0
  108. package/dist/{detectors → rules}/tokenizer-fingerprint.js +40 -58
  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 +196 -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.map +0 -1
  168. package/dist/detectors/tokenizer-fingerprint.js.map +0 -1
  169. package/dist/handshake.d.ts +0 -23
  170. package/dist/handshake.d.ts.map +0 -1
  171. package/dist/handshake.js.map +0 -1
  172. package/dist/internal/fixed-text.d.ts +0 -13
  173. package/dist/internal/fixed-text.d.ts.map +0 -1
  174. package/dist/internal/fixed-text.js +0 -13
  175. package/dist/internal/fixed-text.js.map +0 -1
  176. package/dist/models.d.ts +0 -5
  177. package/dist/models.d.ts.map +0 -1
  178. package/dist/models.js +0 -54
  179. package/dist/models.js.map +0 -1
  180. package/dist/nonce.d.ts +0 -4
  181. package/dist/nonce.d.ts.map +0 -1
  182. package/dist/nonce.js +0 -12
  183. package/dist/nonce.js.map +0 -1
  184. package/dist/patterns.d.ts.map +0 -1
  185. package/dist/patterns.js.map +0 -1
  186. package/dist/probes.d.ts +0 -10
  187. package/dist/probes.d.ts.map +0 -1
  188. package/dist/probes.js +0 -54
  189. package/dist/probes.js.map +0 -1
  190. package/dist/providers/anthropic.d.ts +0 -3
  191. package/dist/providers/anthropic.d.ts.map +0 -1
  192. package/dist/providers/anthropic.js +0 -67
  193. package/dist/providers/anthropic.js.map +0 -1
  194. package/dist/providers/config.d.ts +0 -34
  195. package/dist/providers/config.d.ts.map +0 -1
  196. package/dist/providers/config.js +0 -14
  197. package/dist/providers/config.js.map +0 -1
  198. package/dist/providers/gemini.d.ts +0 -3
  199. package/dist/providers/gemini.d.ts.map +0 -1
  200. package/dist/providers/gemini.js +0 -58
  201. package/dist/providers/gemini.js.map +0 -1
  202. package/dist/providers/openai.d.ts +0 -3
  203. package/dist/providers/openai.d.ts.map +0 -1
  204. package/dist/providers/openai.js +0 -56
  205. package/dist/providers/openai.js.map +0 -1
  206. package/dist/rules.d.ts +0 -6
  207. package/dist/rules.d.ts.map +0 -1
  208. package/dist/rules.js +0 -28
  209. package/dist/rules.js.map +0 -1
  210. package/dist/runner.d.ts +0 -39
  211. package/dist/runner.d.ts.map +0 -1
  212. package/dist/runner.js +0 -352
  213. package/dist/runner.js.map +0 -1
  214. package/dist/signals.d.ts +0 -11
  215. package/dist/signals.d.ts.map +0 -1
  216. package/dist/signals.js.map +0 -1
  217. package/dist/substitution.d.ts.map +0 -1
  218. package/dist/substitution.js.map +0 -1
  219. package/dist/verdict.d.ts +0 -26
  220. package/dist/verdict.d.ts.map +0 -1
  221. package/dist/verdict.js +0 -84
  222. package/dist/verdict.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import type { TransportMode } from "./types";
1
+ export type TransportMode = "direct" | "server";
2
2
  export type TransportResult = {
3
3
  status: number | null;
4
4
  data: unknown;
@@ -13,5 +13,13 @@ export type TransportArgs = {
13
13
  timeoutMs: number;
14
14
  };
15
15
  export type TransportFn = (args: TransportArgs) => Promise<TransportResult>;
16
- export declare function probeTransport(args: TransportArgs): Promise<TransportResult>;
16
+ /** Plain fetch from wherever the code runs. */
17
+ export declare const directTransport: TransportFn;
18
+ /**
19
+ * From a browser through the caller's own backend, which forwards
20
+ * `{ url, headers, reqBody }` and answers `{ data: { status, data } }`.
21
+ */
22
+ export declare function browserTransport(opts: {
23
+ serverProxyUrl: string;
24
+ }): TransportFn;
17
25
  //# sourceMappingURL=transport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAgF5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAE5E"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAsB5E,+CAA+C;AAC/C,eAAO,MAAM,eAAe,EAAE,WAuB7B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,WAAW,CAqCd"}
package/dist/transport.js CHANGED
@@ -16,7 +16,8 @@ async function corsBlockedNotUnreachable(url, timeoutMs) {
16
16
  return false;
17
17
  }
18
18
  }
19
- async function direct(args) {
19
+ /** Plain fetch from wherever the code runs. */
20
+ export const directTransport = async (args) => {
20
21
  try {
21
22
  const res = await fetch(args.url, {
22
23
  method: "POST",
@@ -39,41 +40,48 @@ async function direct(args) {
39
40
  (await corsBlockedNotUnreachable(args.url, args.timeoutMs)),
40
41
  };
41
42
  }
42
- }
43
- async function viaServer(args) {
44
- try {
45
- const res = await fetch("/api/models/verify/probe", {
46
- method: "POST",
47
- headers: { "content-type": "application/json" },
48
- body: JSON.stringify({
49
- url: args.url,
50
- headers: args.headers,
51
- reqBody: args.reqBody,
52
- }),
53
- signal: AbortSignal.timeout(args.timeoutMs + 5000),
54
- });
55
- const wrapped = rec(await res.json().catch(() => null));
56
- const inner = rec(wrapped?.data);
57
- if (!inner || typeof inner.status !== "number")
43
+ };
44
+ /**
45
+ * From a browser through the caller's own backend, which forwards
46
+ * `{ url, headers, reqBody }` and answers `{ data: { status, data } }`.
47
+ */
48
+ export function browserTransport(opts) {
49
+ return async (args) => {
50
+ try {
51
+ const res = await fetch(opts.serverProxyUrl, {
52
+ method: "POST",
53
+ headers: { "content-type": "application/json" },
54
+ body: JSON.stringify({
55
+ url: args.url,
56
+ headers: args.headers,
57
+ reqBody: args.reqBody,
58
+ }),
59
+ signal: AbortSignal.timeout(args.timeoutMs + 5000),
60
+ });
61
+ const wrapped = rec(await res.json().catch(() => null));
62
+ const inner = rec(wrapped?.data);
63
+ if (!inner || typeof inner.status !== "number")
64
+ return {
65
+ status: null,
66
+ data: null,
67
+ error: `proxy HTTP ${res.status}`,
68
+ corsBlocked: false,
69
+ };
70
+ return {
71
+ status: inner.status,
72
+ data: inner.data,
73
+ error: null,
74
+ corsBlocked: false,
75
+ };
76
+ }
77
+ catch (err) {
58
78
  return {
59
79
  status: null,
60
80
  data: null,
61
- error: `proxy HTTP ${res.status}`,
81
+ error: errMessage(err),
62
82
  corsBlocked: false,
63
83
  };
64
- return {
65
- status: inner.status,
66
- data: inner.data,
67
- error: null,
68
- corsBlocked: false,
69
- };
70
- }
71
- catch (err) {
72
- const msg = errMessage(err);
73
- return { status: null, data: null, error: msg, corsBlocked: false };
74
- }
75
- }
76
- export function probeTransport(args) {
77
- return args.mode === "server" ? viaServer(args) : direct(args);
84
+ }
85
+ };
78
86
  }
79
87
  //# sourceMappingURL=transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,19 +1,12 @@
1
- import type { SignatureResult } from "./detectors/thinking-signature";
2
- import type { TokenTruthResult } from "./detectors/token-truth";
3
- import type { ThinkingFloorResult } from "./detectors/thinking-floor";
4
- import type { TokenizerFingerprintResult } from "./detectors/tokenizer-fingerprint";
5
- import type { ResponseMetadata } from "./detectors/response-metadata";
6
- import type { ThroughputSample } from "./detectors/throughput";
7
- export type VerifyProvider = "anthropic" | "openai" | "gemini";
1
+ import type { ProbeLabel, ProbeSignal } from "./probes/table";
2
+ import type { Finding, Reports } from "./rules/types";
3
+ import type { RuleId } from "./rules/table";
4
+ import type { TransportFn, TransportMode } from "./transport";
5
+ import type { VendorId } from "./vendors/table";
6
+ import type { BuiltRequest, ProbeUsage } from "./vendors/types";
7
+ import type { TierSignatures } from "./rules/tokenizer-fingerprint";
8
+ export type { ProbeUsage, ProbeLabel, ProbeSignal, TransportMode, VendorId, RuleId, };
8
9
  export type VerifyVerdict = "genuine" | "suspicious" | "unverified";
9
- export type ProbeLabel = "emotional" | "creative" | "identity" | "model-name";
10
- export type ProbeSignal = "coding-tool" | "scam" | "foreign" | "cloud-host" | "cjk-leak" | "blank" | null;
11
- export type TransportMode = "direct" | "server";
12
- export type ProbeUsage = {
13
- prompt: number | null;
14
- completion: number | null;
15
- total: number | null;
16
- };
17
10
  export type ProbeOutcome = {
18
11
  label: ProbeLabel;
19
12
  pass: boolean;
@@ -28,13 +21,64 @@ export type ProbeOutcome = {
28
21
  detectedModel: string | null;
29
22
  reason: string | null;
30
23
  };
31
- export type VerifyResult = {
32
- provider: VerifyProvider;
24
+ /** One request of a probe, including the nonce retries; for a caller's own log. */
25
+ export type ProbeAttempt = {
26
+ label: ProbeLabel;
27
+ attempt: number;
28
+ pass: boolean;
29
+ signal: ProbeSignal;
30
+ request: BuiltRequest;
31
+ responseText: string | null;
32
+ error?: string;
33
+ };
34
+ export type Checks = {
35
+ /** Anthropic thinking signature; `strict` replays the block (see the rule). */
36
+ signature?: boolean | {
37
+ strict?: boolean;
38
+ };
39
+ /** Token accounting: billed deltas for a fixed text, count_tokens agreement. */
40
+ tokenTruth?: boolean;
41
+ /**
42
+ * Reject a must-think model answering with no reasoning tokens. `models`
43
+ * adds id globs to the always-thinks set for this run.
44
+ */
45
+ thinkingFloor?: boolean | {
46
+ models?: readonly string[];
47
+ minCompletionTokens?: number;
48
+ };
49
+ /** Input-token delta for a fixed text; `signatures` is a per-endpoint calibration. */
50
+ tokenizerFingerprint?: boolean | {
51
+ signatures?: TierSignatures;
52
+ };
53
+ };
54
+ export type VerifyOptions<V extends string = VendorId> = {
55
+ /** Wire format the endpoint is sold on. */
56
+ vendor: V;
57
+ baseUrl: string;
58
+ apiKey: string;
59
+ model: string;
60
+ mode: TransportMode;
61
+ timeoutMs?: number;
62
+ /** Where requests go; the default is plain fetch, or the proxy in server mode. */
63
+ transport?: TransportFn;
64
+ /** Backend that forwards probes for a browser; required in server mode without a transport. */
65
+ serverProxyUrl?: string;
66
+ /** Top-level fields merged into every JSON request body (a marketplace's seller pin). */
67
+ bodyExtras?: Record<string, unknown>;
68
+ /** Nonce source, injectable so a recorded run replays. */
69
+ nonce?: () => string;
70
+ onProbe?: (attempt: ProbeAttempt) => void;
71
+ checks?: Checks;
72
+ };
73
+ export type ConnectivityError = "cors-needs-backend" | "unreachable" | "invalid-key" | "model-rejected" | "endpoint-busy" | "no-format";
74
+ export type VerifyResult<V extends string = VendorId, R extends string = RuleId> = Reports & {
75
+ vendor: V;
33
76
  model: string;
34
77
  baseUrlHost: string;
35
78
  verdict: VerifyVerdict;
36
79
  versionUnverifiable: boolean;
37
80
  probes: ProbeOutcome[];
81
+ findings: Finding<R>[];
38
82
  reasons: string[];
39
83
  probesPassed: number;
40
84
  probesTotal: number;
@@ -43,19 +87,14 @@ export type VerifyResult = {
43
87
  corsBlocked: boolean;
44
88
  detectedModel: string | null;
45
89
  totalUsage: ProbeUsage | null;
46
- resolvedProvider: VerifyProvider;
47
- /** Present only when the signature check was requested and could run. */
48
- signature?: SignatureResult;
49
- /** Present only when the token-accounting check was requested. */
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;
55
- /** Envelope observations, free: read from responses already collected. */
56
- responseMetadata?: ResponseMetadata;
57
- /** Output rate, when a probe generated enough tokens to measure one. */
58
- throughput?: ThroughputSample | null;
59
- connectivityError: "cors-needs-backend" | "unreachable" | "invalid-key" | "model-rejected" | "endpoint-busy" | "no-format" | null;
90
+ /** Wire that answered the handshake; differs from `vendor` after a fallback. */
91
+ resolvedVendor: V;
92
+ connectivityError: ConnectivityError | null;
93
+ };
94
+ /** Output of `runRules`: judgement on a known wire, no handshake, no verdict. */
95
+ export type RuleRun<R extends string = RuleId> = {
96
+ findings: Finding<R>[];
97
+ reports: Reports;
98
+ probes: ProbeOutcome[];
60
99
  };
61
100
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type ChatRequest, type CountRequest, type ProbeMeta, type ThinkingBlockRead, type WireCtx } from "./types";
2
+ declare function chat(req: ChatRequest, ctx: WireCtx): {
3
+ url: string;
4
+ headers: Record<string, string>;
5
+ body: Record<string, unknown>;
6
+ };
7
+ declare function countTokens(req: CountRequest, ctx: WireCtx): {
8
+ url: string;
9
+ headers: Record<string, string>;
10
+ body: {
11
+ model: string;
12
+ messages: readonly import("./types").ChatMessage[];
13
+ };
14
+ };
15
+ declare function text(data: unknown): string | null;
16
+ declare function meta(data: unknown): ProbeMeta;
17
+ declare function thinkingBlock(data: unknown): ThinkingBlockRead | null;
18
+ declare function countedTokens(data: unknown): number | null;
19
+ export declare const anthropicVendor: {
20
+ readonly id: "anthropic";
21
+ readonly vendorName: "anthropic";
22
+ readonly envelope: "anthropic";
23
+ readonly fallbackWires: readonly ["openai"];
24
+ readonly ops: {
25
+ readonly chat: typeof chat;
26
+ readonly countTokens: typeof countTokens;
27
+ };
28
+ readonly read: {
29
+ readonly text: typeof text;
30
+ readonly meta: typeof meta;
31
+ readonly thinkingBlock: typeof thinkingBlock;
32
+ readonly countedTokens: typeof countedTokens;
33
+ };
34
+ readonly identity: {
35
+ readonly home: readonly ["anthropic"];
36
+ readonly foreign: string[];
37
+ readonly homeModelNames: readonly ["claude", "anthropic"];
38
+ readonly cloudModelNames: readonly ["amazon q", "q developer", "kiro"];
39
+ readonly acceptsCloudHost: true;
40
+ };
41
+ readonly tiers: readonly ["opus", "sonnet", "haiku", "fable"];
42
+ };
43
+ export {};
44
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/vendors/anthropic.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACb,MAAM,SAAS,CAAC;AAwCjB,iBAAS,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO;;;;EAoB3C;AAED,iBAAS,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO;IAEhD,GAAG;IACH,OAAO;IACP,IAAI;QAAI,KAAK;QAAa,QAAQ;;EAErC;AAED,iBAAS,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ1C;AAED,iBAAS,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAgBtC;AAED,iBAAS,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAU9D;AAED,iBAAS,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGnD;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;CAiB1B,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { intOf, rec } from "../internal/utils";
2
+ import { foreignPatternsExcept } from "../identity/patterns";
3
+ import { normalizeBaseUrl } from "./base-url";
4
+ import { defineVendor, } from "./types";
5
+ // Anthropic refuses a browser preflight unless the caller opts in with this
6
+ // header, and every relay that reimplements their API inherits the rule. The
7
+ // header is meaningless to endpoints that do not check it, so it goes on every
8
+ // direct probe rather than guessing which hosts enforce it.
9
+ const BROWSER_ACCESS_HEADER = "anthropic-dangerous-direct-browser-access";
10
+ function headers(ctx) {
11
+ const h = {
12
+ "content-type": "application/json",
13
+ "x-api-key": ctx.apiKey,
14
+ "anthropic-version": "2023-06-01",
15
+ };
16
+ if (ctx.direct)
17
+ h[BROWSER_ACCESS_HEADER] = "true";
18
+ return h;
19
+ }
20
+ const blocksOf = (data) => {
21
+ const d = rec(data) ?? {};
22
+ return Array.isArray(d.content)
23
+ ? d.content.filter((b) => !!b && typeof b === "object")
24
+ : [];
25
+ };
26
+ function chat(req, ctx) {
27
+ const body = {
28
+ model: req.model,
29
+ max_tokens: req.maxTokens,
30
+ messages: req.messages,
31
+ };
32
+ if (req.thinking) {
33
+ body["thinking"] =
34
+ req.thinking.kind === "extended"
35
+ ? { type: "enabled", budget_tokens: req.thinking.budgetTokens }
36
+ : { type: "adaptive", display: "summarized" };
37
+ // Sibling of `thinking`, never nested inside it: nesting is a 400.
38
+ if (req.thinking.kind === "adaptive")
39
+ body["output_config"] = { effort: "xhigh" };
40
+ }
41
+ return {
42
+ url: `${normalizeBaseUrl(ctx.baseUrl)}/v1/messages`,
43
+ headers: headers(ctx),
44
+ body,
45
+ };
46
+ }
47
+ function countTokens(req, ctx) {
48
+ return {
49
+ url: `${normalizeBaseUrl(ctx.baseUrl)}/v1/messages/count_tokens`,
50
+ headers: headers(ctx),
51
+ body: { model: req.model, messages: req.messages },
52
+ };
53
+ }
54
+ function text(data) {
55
+ const d = rec(data) ?? {};
56
+ if (d.type === "error")
57
+ return null;
58
+ return blocksOf(data)
59
+ .filter((b) => b.type === "text")
60
+ .map((b) => b.text ?? "")
61
+ .join(" ")
62
+ .toLowerCase();
63
+ }
64
+ function meta(data) {
65
+ const d = rec(data) ?? {};
66
+ const u = d.usage;
67
+ const prompt = intOf(u?.input_tokens);
68
+ const completion = intOf(u?.output_tokens);
69
+ return {
70
+ detectedModel: typeof d.model === "string" ? d.model : null,
71
+ usage: u
72
+ ? {
73
+ prompt,
74
+ completion,
75
+ total: prompt !== null && completion !== null ? prompt + completion : null,
76
+ }
77
+ : null,
78
+ };
79
+ }
80
+ function thinkingBlock(data) {
81
+ for (const b of blocksOf(data)) {
82
+ if (b.type !== "thinking" && b.type !== "redacted_thinking")
83
+ continue;
84
+ return {
85
+ block: b,
86
+ signature: typeof b.signature === "string" ? b.signature : "",
87
+ chars: typeof b.thinking === "string" ? b.thinking.length : 0,
88
+ };
89
+ }
90
+ return null;
91
+ }
92
+ function countedTokens(data) {
93
+ const d = rec(data) ?? {};
94
+ return intOf(d.input_tokens);
95
+ }
96
+ export const anthropicVendor = defineVendor({
97
+ id: "anthropic",
98
+ vendorName: "anthropic",
99
+ envelope: "anthropic",
100
+ fallbackWires: ["openai"],
101
+ ops: { chat, countTokens },
102
+ read: { text, meta, thinkingBlock, countedTokens },
103
+ identity: {
104
+ home: ["anthropic"],
105
+ foreign: foreignPatternsExcept("anthropic"),
106
+ homeModelNames: ["claude", "anthropic"],
107
+ cloudModelNames: ["amazon q", "q developer", "kiro"],
108
+ acceptsCloudHost: true,
109
+ },
110
+ // `fable` is load-bearing: without it tierOf() returns null for
111
+ // claude-fable-5 and a relay serving opus under a fable label is never checked.
112
+ tiers: ["opus", "sonnet", "haiku", "fable"],
113
+ });
114
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/vendors/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,YAAY,GAMb,MAAM,SAAS,CAAC;AAiBjB,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,4DAA4D;AAC5D,MAAM,qBAAqB,GAAG,2CAA2C,CAAC;AAE1E,SAAS,OAAO,CAAC,GAAY;IAC3B,MAAM,CAAC,GAA2B;QAChC,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,GAAG,CAAC,MAAM;QACvB,mBAAmB,EAAE,YAAY;KAClC,CAAC;IACF,IAAI,GAAG,CAAC,MAAM;QAAE,CAAC,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC;IAClD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAkB,EAAE;IACjD,MAAM,CAAC,GAAsB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;QAC1E,CAAC,CAAC,EAAE,CAAC;AACT,CAAC,CAAC;AAEF,SAAS,IAAI,CAAC,GAAgB,EAAE,GAAY;IAC1C,MAAM,IAAI,GAA4B;QACpC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC;IACF,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC;YACd,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU;gBAC9B,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE;gBAC/D,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAClD,mEAAmE;QACnE,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU;YAClC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IACD,OAAO;QACL,GAAG,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc;QACnD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;QACrB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAiB,EAAE,GAAY;IAClD,OAAO;QACL,GAAG,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B;QAChE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;QACrB,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,MAAM,CAAC,GAAsB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,QAAQ,CAAC,IAAI,CAAC;SAClB,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,IAAI,CAAC,IAAa;IACzB,MAAM,CAAC,GAAsB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAC3C,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC3D,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,SAAS,aAAa,CAAC,IAAa;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,mBAAmB;YAAE,SAAS;QACtE,OAAO;YACL,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YAC7D,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC9D,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,MAAM,CAAC,GAAsB,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;IAC1C,EAAE,EAAE,WAAW;IACf,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,WAAW;IACrB,aAAa,EAAE,CAAC,QAAQ,CAAC;IACzB,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;IAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE;IAClD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,WAAW,CAAC;QACnB,OAAO,EAAE,qBAAqB,CAAC,WAAW,CAAC;QAC3C,cAAc,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;QACvC,eAAe,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC;QACpD,gBAAgB,EAAE,IAAI;KACvB;IACD,gEAAgE;IAChE,gFAAgF;IAChF,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;CAC5C,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Adapters append their own version segment, so a pasted one would double it. */
2
+ export declare function normalizeBaseUrl(baseUrl: string): string;
3
+ //# sourceMappingURL=base-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-url.d.ts","sourceRoot":"","sources":["../../src/vendors/base-url.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -0,0 +1,6 @@
1
+ const VERSION_SUFFIX = /\/(?:v\d+(?:alpha|beta)?)\/*$/i;
2
+ /** Adapters append their own version segment, so a pasted one would double it. */
3
+ export function normalizeBaseUrl(baseUrl) {
4
+ return baseUrl.trim().replace(/\/+$/, "").replace(VERSION_SUFFIX, "");
5
+ }
6
+ //# sourceMappingURL=base-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-url.js","sourceRoot":"","sources":["../../src/vendors/base-url.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type ChatRequest, type ProbeMeta, type ReasoningUsage, type WireCtx } from "./types";
2
+ declare function chat(req: ChatRequest, ctx: WireCtx): {
3
+ url: string;
4
+ headers: {
5
+ "content-type": string;
6
+ "x-goog-api-key": string;
7
+ };
8
+ body: {
9
+ contents: {
10
+ role: string;
11
+ parts: readonly unknown[];
12
+ }[];
13
+ generationConfig: {
14
+ maxOutputTokens: number;
15
+ };
16
+ };
17
+ };
18
+ declare function text(data: unknown): string | null;
19
+ declare function meta(data: unknown): ProbeMeta;
20
+ declare function reasoningUsage(data: unknown): ReasoningUsage | null;
21
+ export declare const geminiVendor: {
22
+ readonly id: "gemini";
23
+ readonly vendorName: "google";
24
+ readonly envelope: "gemini";
25
+ readonly fallbackWires: readonly ["openai"];
26
+ readonly ops: {
27
+ readonly chat: typeof chat;
28
+ };
29
+ readonly read: {
30
+ readonly text: typeof text;
31
+ readonly meta: typeof meta;
32
+ readonly reasoningUsage: typeof reasoningUsage;
33
+ };
34
+ readonly identity: {
35
+ readonly home: readonly ["google", "deepmind"];
36
+ readonly foreign: string[];
37
+ readonly homeModelNames: readonly ["gemini", "google"];
38
+ readonly cloudModelNames: readonly [];
39
+ readonly acceptsCloudHost: false;
40
+ };
41
+ readonly tiers: null;
42
+ };
43
+ export {};
44
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/vendors/gemini.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,OAAO,EACb,MAAM,SAAS,CAAC;AAiBjB,iBAAS,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO;IAExC,GAAG;IACH,OAAO;QACL,cAAc;QACd,gBAAgB;;IAElB,IAAI;QACF,QAAQ;;;;QAKR,gBAAgB;YACd,eAAe;;;EAItB;AAED,iBAAS,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAS1C;AAED,iBAAS,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAatC;AAED,iBAAS,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAQ5D;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;CAevB,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { intOf, rec } from "../internal/utils";
2
+ import { foreignPatternsExcept } from "../identity/patterns";
3
+ import { normalizeBaseUrl } from "./base-url";
4
+ import { defineVendor, } from "./types";
5
+ /** A thinking budget would otherwise eat the whole output cap. */
6
+ const MIN_OUTPUT_TOKENS = 1024;
7
+ function chat(req, ctx) {
8
+ return {
9
+ url: `${normalizeBaseUrl(ctx.baseUrl)}/v1beta/models/${req.model}:generateContent`,
10
+ headers: {
11
+ "content-type": "application/json",
12
+ "x-goog-api-key": ctx.apiKey,
13
+ },
14
+ body: {
15
+ contents: req.messages.map((m) => ({
16
+ role: m.role === "assistant" ? "model" : "user",
17
+ parts: typeof m.content === "string" ? [{ text: m.content }] : m.content,
18
+ })),
19
+ generationConfig: {
20
+ maxOutputTokens: Math.max(req.maxTokens, MIN_OUTPUT_TOKENS),
21
+ },
22
+ },
23
+ };
24
+ }
25
+ function text(data) {
26
+ const d = rec(data) ?? {};
27
+ if (d.error)
28
+ return null;
29
+ const parts = d.candidates?.[0]?.content?.parts;
30
+ if (!parts)
31
+ return null;
32
+ return parts
33
+ .map((p) => p.text ?? "")
34
+ .join(" ")
35
+ .toLowerCase();
36
+ }
37
+ function meta(data) {
38
+ const d = rec(data) ?? {};
39
+ const u = d.usageMetadata;
40
+ return {
41
+ detectedModel: typeof d.modelVersion === "string" ? d.modelVersion : null,
42
+ usage: u
43
+ ? {
44
+ prompt: intOf(u.promptTokenCount),
45
+ completion: intOf(u.candidatesTokenCount),
46
+ total: intOf(u.totalTokenCount),
47
+ }
48
+ : null,
49
+ };
50
+ }
51
+ function reasoningUsage(data) {
52
+ const d = rec(data) ?? {};
53
+ const u = d.usageMetadata;
54
+ if (!u || typeof u !== "object")
55
+ return null;
56
+ return {
57
+ completion: intOf(u.candidatesTokenCount),
58
+ reasoning: intOf(u.thoughtsTokenCount),
59
+ };
60
+ }
61
+ export const geminiVendor = defineVendor({
62
+ id: "gemini",
63
+ vendorName: "google",
64
+ envelope: "gemini",
65
+ fallbackWires: ["openai"],
66
+ ops: { chat },
67
+ read: { text, meta, reasoningUsage },
68
+ identity: {
69
+ home: ["google", "deepmind"],
70
+ foreign: foreignPatternsExcept("google"),
71
+ homeModelNames: ["gemini", "google"],
72
+ cloudModelNames: [],
73
+ acceptsCloudHost: false,
74
+ },
75
+ tiers: null,
76
+ });
77
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/vendors/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { anthropicVendor } from "./anthropic";
2
+ export { openaiVendor } from "./openai";
3
+ export { geminiVendor } from "./gemini";
4
+ export { VENDORS, vendorFor } from "./table";
5
+ export type { VendorId } from "./table";
6
+ export { normalizeBaseUrl } from "./base-url";
7
+ export { defineVendor } from "./types";
8
+ export type * from "./types";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vendors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,mBAAmB,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { anthropicVendor } from "./anthropic";
2
+ export { openaiVendor } from "./openai";
3
+ export { geminiVendor } from "./gemini";
4
+ export { VENDORS, vendorFor } from "./table";
5
+ export { normalizeBaseUrl } from "./base-url";
6
+ export { defineVendor } from "./types";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vendors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}