modelrig 0.0.1 → 0.1.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 (220) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +115 -8
  3. package/dist/adapters/anthropic.d.ts +46 -0
  4. package/dist/adapters/anthropic.d.ts.map +1 -0
  5. package/dist/adapters/anthropic.js +202 -0
  6. package/dist/adapters/deepseek.d.ts +41 -0
  7. package/dist/adapters/deepseek.d.ts.map +1 -0
  8. package/dist/adapters/deepseek.js +163 -0
  9. package/dist/adapters/gemini.d.ts +44 -0
  10. package/dist/adapters/gemini.d.ts.map +1 -0
  11. package/dist/adapters/gemini.js +222 -0
  12. package/dist/adapters/grok.d.ts +44 -0
  13. package/dist/adapters/grok.d.ts.map +1 -0
  14. package/dist/adapters/grok.js +168 -0
  15. package/dist/adapters/openai-compat.d.ts +74 -0
  16. package/dist/adapters/openai-compat.d.ts.map +1 -0
  17. package/dist/adapters/openai-compat.js +187 -0
  18. package/dist/adapters/openai.d.ts +49 -0
  19. package/dist/adapters/openai.d.ts.map +1 -0
  20. package/dist/adapters/openai.js +222 -0
  21. package/dist/bakeoff/engine.d.ts +52 -0
  22. package/dist/bakeoff/engine.d.ts.map +1 -0
  23. package/dist/bakeoff/engine.js +163 -0
  24. package/dist/bakeoff/replay.d.ts +52 -0
  25. package/dist/bakeoff/replay.d.ts.map +1 -0
  26. package/dist/bakeoff/replay.js +94 -0
  27. package/dist/bakeoff/samples.d.ts +62 -0
  28. package/dist/bakeoff/samples.d.ts.map +1 -0
  29. package/dist/bakeoff/samples.js +128 -0
  30. package/dist/bakeoff/stats.d.ts +13 -0
  31. package/dist/bakeoff/stats.d.ts.map +1 -0
  32. package/dist/bakeoff/stats.js +48 -0
  33. package/dist/bakeoff/types.d.ts +37 -0
  34. package/dist/bakeoff/types.d.ts.map +1 -0
  35. package/dist/bakeoff/types.js +10 -0
  36. package/dist/cli.d.ts +27 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +572 -0
  39. package/dist/config.d.ts +104 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +148 -0
  42. package/dist/feedback/coverage.d.ts +32 -0
  43. package/dist/feedback/coverage.d.ts.map +1 -0
  44. package/dist/feedback/coverage.js +95 -0
  45. package/dist/feedback/feedback.d.ts +35 -0
  46. package/dist/feedback/feedback.d.ts.map +1 -0
  47. package/dist/feedback/feedback.js +39 -0
  48. package/dist/index.d.ts +155 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +448 -0
  51. package/dist/init/finder.d.ts +79 -0
  52. package/dist/init/finder.d.ts.map +1 -0
  53. package/dist/init/finder.js +297 -0
  54. package/dist/init/run.d.ts +99 -0
  55. package/dist/init/run.d.ts.map +1 -0
  56. package/dist/init/run.js +281 -0
  57. package/dist/init/signatures.d.ts +39 -0
  58. package/dist/init/signatures.d.ts.map +1 -0
  59. package/dist/init/signatures.js +116 -0
  60. package/dist/matrix/aggregate.d.ts +89 -0
  61. package/dist/matrix/aggregate.d.ts.map +1 -0
  62. package/dist/matrix/aggregate.js +186 -0
  63. package/dist/query/grammar.d.ts +35 -0
  64. package/dist/query/grammar.d.ts.map +1 -0
  65. package/dist/query/grammar.js +279 -0
  66. package/dist/query/run.d.ts +8 -0
  67. package/dist/query/run.d.ts.map +1 -0
  68. package/dist/query/run.js +21 -0
  69. package/dist/registry/build.d.ts +126 -0
  70. package/dist/registry/build.d.ts.map +1 -0
  71. package/dist/registry/build.js +192 -0
  72. package/dist/registry/call-notes.d.ts +11 -0
  73. package/dist/registry/call-notes.d.ts.map +1 -0
  74. package/dist/registry/call-notes.js +72 -0
  75. package/dist/registry/claims.d.ts +63 -0
  76. package/dist/registry/claims.d.ts.map +1 -0
  77. package/dist/registry/claims.js +107 -0
  78. package/dist/registry/facts.d.ts +32 -0
  79. package/dist/registry/facts.d.ts.map +1 -0
  80. package/dist/registry/facts.js +120 -0
  81. package/dist/registry/fingerprint.d.ts +20 -0
  82. package/dist/registry/fingerprint.d.ts.map +1 -0
  83. package/dist/registry/fingerprint.js +150 -0
  84. package/dist/registry/parity.d.ts +26 -0
  85. package/dist/registry/parity.d.ts.map +1 -0
  86. package/dist/registry/parity.js +41 -0
  87. package/dist/registry/pricing.d.ts +19 -0
  88. package/dist/registry/pricing.d.ts.map +1 -0
  89. package/dist/registry/pricing.js +69 -0
  90. package/dist/registry/rows.d.ts +16 -0
  91. package/dist/registry/rows.d.ts.map +1 -0
  92. package/dist/registry/rows.js +57 -0
  93. package/dist/registry/seed.d.ts +43 -0
  94. package/dist/registry/seed.d.ts.map +1 -0
  95. package/dist/registry/seed.js +97 -0
  96. package/dist/registry/select.d.ts +68 -0
  97. package/dist/registry/select.d.ts.map +1 -0
  98. package/dist/registry/select.js +141 -0
  99. package/dist/registry/staleness.d.ts +18 -0
  100. package/dist/registry/staleness.d.ts.map +1 -0
  101. package/dist/registry/staleness.js +39 -0
  102. package/dist/routes/draft.d.ts +83 -0
  103. package/dist/routes/draft.d.ts.map +1 -0
  104. package/dist/routes/draft.js +135 -0
  105. package/dist/routes/loader.d.ts +26 -0
  106. package/dist/routes/loader.d.ts.map +1 -0
  107. package/dist/routes/loader.js +436 -0
  108. package/dist/routes/manifest.d.ts +24 -0
  109. package/dist/routes/manifest.d.ts.map +1 -0
  110. package/dist/routes/manifest.js +118 -0
  111. package/dist/routes/serveability.d.ts +52 -0
  112. package/dist/routes/serveability.d.ts.map +1 -0
  113. package/dist/routes/serveability.js +73 -0
  114. package/dist/routes/template.d.ts +18 -0
  115. package/dist/routes/template.d.ts.map +1 -0
  116. package/dist/routes/template.js +94 -0
  117. package/dist/run/cost.d.ts +26 -0
  118. package/dist/run/cost.d.ts.map +1 -0
  119. package/dist/run/cost.js +41 -0
  120. package/dist/run/envelope.d.ts +21 -0
  121. package/dist/run/envelope.d.ts.map +1 -0
  122. package/dist/run/envelope.js +45 -0
  123. package/dist/run/grounding.d.ts +56 -0
  124. package/dist/run/grounding.d.ts.map +1 -0
  125. package/dist/run/grounding.js +89 -0
  126. package/dist/run/repair.d.ts +36 -0
  127. package/dist/run/repair.d.ts.map +1 -0
  128. package/dist/run/repair.js +61 -0
  129. package/dist/run/resolve.d.ts +26 -0
  130. package/dist/run/resolve.d.ts.map +1 -0
  131. package/dist/run/resolve.js +81 -0
  132. package/dist/run/retry.d.ts +19 -0
  133. package/dist/run/retry.d.ts.map +1 -0
  134. package/dist/run/retry.js +50 -0
  135. package/dist/run/run.d.ts +41 -0
  136. package/dist/run/run.d.ts.map +1 -0
  137. package/dist/run/run.js +0 -0
  138. package/dist/run/validate.d.ts +15 -0
  139. package/dist/run/validate.d.ts.map +1 -0
  140. package/dist/run/validate.js +56 -0
  141. package/dist/savings/emit.d.ts +25 -0
  142. package/dist/savings/emit.d.ts.map +1 -0
  143. package/dist/savings/emit.js +75 -0
  144. package/dist/savings/odometer.d.ts +32 -0
  145. package/dist/savings/odometer.d.ts.map +1 -0
  146. package/dist/savings/odometer.js +70 -0
  147. package/dist/savings/swap-execute.d.ts +44 -0
  148. package/dist/savings/swap-execute.d.ts.map +1 -0
  149. package/dist/savings/swap-execute.js +87 -0
  150. package/dist/savings/swaps-client.d.ts +41 -0
  151. package/dist/savings/swaps-client.d.ts.map +1 -0
  152. package/dist/savings/swaps-client.js +81 -0
  153. package/dist/telemetry/capture.d.ts +28 -0
  154. package/dist/telemetry/capture.d.ts.map +1 -0
  155. package/dist/telemetry/capture.js +74 -0
  156. package/dist/telemetry/exporter.d.ts +62 -0
  157. package/dist/telemetry/exporter.d.ts.map +1 -0
  158. package/dist/telemetry/exporter.js +233 -0
  159. package/dist/telemetry/ingest-protocol.d.ts +161 -0
  160. package/dist/telemetry/ingest-protocol.d.ts.map +1 -0
  161. package/dist/telemetry/ingest-protocol.js +163 -0
  162. package/dist/telemetry/sinks.d.ts +54 -0
  163. package/dist/telemetry/sinks.d.ts.map +1 -0
  164. package/dist/telemetry/sinks.js +89 -0
  165. package/dist/telemetry/store.d.ts +38 -0
  166. package/dist/telemetry/store.d.ts.map +1 -0
  167. package/dist/telemetry/store.js +332 -0
  168. package/dist/telemetry/supabase-exporter.d.ts +64 -0
  169. package/dist/telemetry/supabase-exporter.d.ts.map +1 -0
  170. package/dist/telemetry/supabase-exporter.js +211 -0
  171. package/dist/tenancy/api-key-format.d.ts +67 -0
  172. package/dist/tenancy/api-key-format.d.ts.map +1 -0
  173. package/dist/tenancy/api-key-format.js +91 -0
  174. package/dist/tenancy/constants.d.ts +23 -0
  175. package/dist/tenancy/constants.d.ts.map +1 -0
  176. package/dist/tenancy/constants.js +25 -0
  177. package/dist/tenancy/scrub.d.ts +47 -0
  178. package/dist/tenancy/scrub.d.ts.map +1 -0
  179. package/dist/tenancy/scrub.js +85 -0
  180. package/dist/types/failures-teaching.d.ts +56 -0
  181. package/dist/types/failures-teaching.d.ts.map +1 -0
  182. package/dist/types/failures-teaching.js +177 -0
  183. package/dist/types/failures.d.ts +27 -0
  184. package/dist/types/failures.d.ts.map +1 -0
  185. package/dist/types/failures.js +41 -0
  186. package/dist/types/provider.d.ts +79 -0
  187. package/dist/types/provider.d.ts.map +1 -0
  188. package/dist/types/provider.js +20 -0
  189. package/dist/types/route.d.ts +127 -0
  190. package/dist/types/route.d.ts.map +1 -0
  191. package/dist/types/route.js +6 -0
  192. package/dist/types/telemetry.d.ts +89 -0
  193. package/dist/types/telemetry.d.ts.map +1 -0
  194. package/dist/types/telemetry.js +6 -0
  195. package/dist/watch/budget.d.ts +19 -0
  196. package/dist/watch/budget.d.ts.map +1 -0
  197. package/dist/watch/budget.js +35 -0
  198. package/dist/watch/evaluate.d.ts +66 -0
  199. package/dist/watch/evaluate.d.ts.map +1 -0
  200. package/dist/watch/evaluate.js +94 -0
  201. package/dist/watch/proposals.d.ts +73 -0
  202. package/dist/watch/proposals.d.ts.map +1 -0
  203. package/dist/watch/proposals.js +169 -0
  204. package/dist/watch/run-record.d.ts +64 -0
  205. package/dist/watch/run-record.d.ts.map +1 -0
  206. package/dist/watch/run-record.js +86 -0
  207. package/dist/watch/run-reported.d.ts +20 -0
  208. package/dist/watch/run-reported.d.ts.map +1 -0
  209. package/dist/watch/run-reported.js +53 -0
  210. package/dist/watch/run.d.ts +40 -0
  211. package/dist/watch/run.d.ts.map +1 -0
  212. package/dist/watch/run.js +44 -0
  213. package/dist/watch/state-store.d.ts +48 -0
  214. package/dist/watch/state-store.d.ts.map +1 -0
  215. package/dist/watch/state-store.js +86 -0
  216. package/dist/watch/state.d.ts +21 -0
  217. package/dist/watch/state.d.ts.map +1 -0
  218. package/dist/watch/state.js +93 -0
  219. package/package.json +50 -14
  220. package/index.js +0 -3
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Watch state — Phase 4 WS1. The cycle's memory: a JSON snapshot of the
3
+ * last-seen pricing universe (provider/model → token rates), diffed against
4
+ * the current pricing map each run. Seed runs emit no events by design.
5
+ *
6
+ * The universe is restricted to providers the loaded routes actually
7
+ * declare — a price move on a provider nobody routes to is not news.
8
+ */
9
+ import type { TokenRates, WatchEvent } from "./evaluate";
10
+ /** provider/model → rates. Keys use OUR provider ids, not LiteLLM's. */
11
+ export type PriceUniverse = Record<string, TokenRates>;
12
+ /** Build the current universe from the vendored pricing map, filtered to
13
+ * the providers in scope. Model ids are normalized to the bare form route
14
+ * candidates use ("gemini/gemini-2.5-pro" → "gemini-2.5-pro"). */
15
+ export declare function buildPriceUniverse(providersInScope: ReadonlySet<string>, pricingMapPath?: string): PriceUniverse;
16
+ /** Pure diff: current vs last-seen → events. Null previous = seed run,
17
+ * nothing fires. Delisted models are silence, not events. */
18
+ export declare function computeWatchEvents(current: PriceUniverse, previous: PriceUniverse | null): WatchEvent[];
19
+ export declare function loadWatchState(path: string): PriceUniverse | null;
20
+ export declare function saveWatchState(path: string, universe: PriceUniverse): void;
21
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/watch/state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD,wEAAwE;AACxE,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAkCvD;;kEAEkE;AAClE,wBAAgB,kBAAkB,CAChC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,cAAc,CAAC,EAAE,MAAM,GACtB,aAAa,CAoBf;AAED;6DAC6D;AAC7D,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,UAAU,EAAE,CAkBd;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAGjE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAG1E"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Watch state — Phase 4 WS1. The cycle's memory: a JSON snapshot of the
4
+ * last-seen pricing universe (provider/model → token rates), diffed against
5
+ * the current pricing map each run. Seed runs emit no events by design.
6
+ *
7
+ * The universe is restricted to providers the loaded routes actually
8
+ * declare — a price move on a provider nobody routes to is not news.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.buildPriceUniverse = buildPriceUniverse;
12
+ exports.computeWatchEvents = computeWatchEvents;
13
+ exports.loadWatchState = loadWatchState;
14
+ exports.saveWatchState = saveWatchState;
15
+ const node_fs_1 = require("node:fs");
16
+ const node_path_1 = require("node:path");
17
+ /** LiteLLM's litellm_provider values → our ProviderId space (watch scope:
18
+ * the launch providers; extending = adding a line). */
19
+ const LITELLM_PROVIDER_MAP = {
20
+ gemini: "gemini",
21
+ openai: "openai",
22
+ deepseek: "deepseek",
23
+ anthropic: "anthropic",
24
+ xai: "grok",
25
+ // A1 hosts (openai-compatible generic adapter).
26
+ deepinfra: "deepinfra",
27
+ fireworks_ai: "fireworks",
28
+ };
29
+ /** Normalize a pricing-map key to the bare model id route candidates use:
30
+ * strip the leading litellm-provider segment, then Fireworks' wire prefix.
31
+ * DeepInfra org paths ("Qwen/QwQ-32B") are PART of the model id — kept. */
32
+ function normalizeModelId(rawKey, litellmProvider) {
33
+ let model = rawKey.startsWith(`${litellmProvider}/`)
34
+ ? rawKey.slice(litellmProvider.length + 1)
35
+ : rawKey;
36
+ if (model.startsWith("accounts/fireworks/models/")) {
37
+ model = model.slice("accounts/fireworks/models/".length);
38
+ }
39
+ return model;
40
+ }
41
+ /** Build the current universe from the vendored pricing map, filtered to
42
+ * the providers in scope. Model ids are normalized to the bare form route
43
+ * candidates use ("gemini/gemini-2.5-pro" → "gemini-2.5-pro"). */
44
+ function buildPriceUniverse(providersInScope, pricingMapPath) {
45
+ const path = pricingMapPath ?? (0, node_path_1.join)(__dirname, "..", "..", "data", "pricing-map.json");
46
+ const map = JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
47
+ const universe = {};
48
+ for (const [rawKey, entry] of Object.entries(map)) {
49
+ const provider = LITELLM_PROVIDER_MAP[entry.litellm_provider ?? ""];
50
+ if (provider === undefined || !providersInScope.has(provider))
51
+ continue;
52
+ if (typeof entry.input_cost_per_token !== "number" ||
53
+ typeof entry.output_cost_per_token !== "number") {
54
+ continue;
55
+ }
56
+ const model = normalizeModelId(rawKey, entry.litellm_provider ?? "");
57
+ universe[`${provider}/${model}`] = {
58
+ inputUsdPerTok: entry.input_cost_per_token,
59
+ outputUsdPerTok: entry.output_cost_per_token,
60
+ };
61
+ }
62
+ return universe;
63
+ }
64
+ /** Pure diff: current vs last-seen → events. Null previous = seed run,
65
+ * nothing fires. Delisted models are silence, not events. */
66
+ function computeWatchEvents(current, previous) {
67
+ if (previous === null)
68
+ return [];
69
+ const events = [];
70
+ for (const [key, rates] of Object.entries(current)) {
71
+ const slash = key.indexOf("/");
72
+ const provider = key.slice(0, slash);
73
+ const model = key.slice(slash + 1);
74
+ const before = previous[key];
75
+ if (before === undefined) {
76
+ events.push({ type: "new_model", provider, model, pricing: rates });
77
+ }
78
+ else if (before.inputUsdPerTok !== rates.inputUsdPerTok ||
79
+ before.outputUsdPerTok !== rates.outputUsdPerTok) {
80
+ events.push({ type: "price_change", provider, model, old: before, new: rates });
81
+ }
82
+ }
83
+ return events;
84
+ }
85
+ function loadWatchState(path) {
86
+ if (!(0, node_fs_1.existsSync)(path))
87
+ return null;
88
+ return JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
89
+ }
90
+ function saveWatchState(path, universe) {
91
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true });
92
+ (0, node_fs_1.writeFileSync)(path, `${JSON.stringify(universe, null, 2)}\n`);
93
+ }
package/package.json CHANGED
@@ -1,20 +1,56 @@
1
1
  {
2
2
  "name": "modelrig",
3
- "version": "0.0.1",
4
- "description": "ModelRig — the capability-aware AI gateway. Rig it. Prove it. Sell it. Full release coming soon.",
5
- "homepage": "https://modelrig.ai",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "ModelRig — capability-aware AI gateway: routes-as-code, provider adapters, typed failures, budget envelopes, and local-first telemetry.",
6
6
  "license": "Apache-2.0",
7
- "main": "index.js",
8
- "files": [
9
- "index.js",
10
- "README.md"
11
- ],
7
+ "homepage": "https://modelrig.dev",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/modelrig/modelrig.git"
11
+ },
12
12
  "keywords": [
13
- "ai",
14
13
  "llm",
15
- "gateway",
16
- "routing",
17
- "evals",
18
- "structured-output"
19
- ]
14
+ "ai-gateway",
15
+ "model-routing",
16
+ "openai",
17
+ "anthropic",
18
+ "gemini",
19
+ "telemetry",
20
+ "failover"
21
+ ],
22
+ "engines": {
23
+ "node": ">=20"
24
+ },
25
+ "main": "dist/index.js",
26
+ "types": "dist/index.d.ts",
27
+ "//files": "ALLOWLIST, not a denylist, and the difference is not academic. Without this field npm falls back to .npmignore, then to THIS DIRECTORY's .gitignore — never the repo root's. The root ignores `.env.*`, which is why git has never committed .env.local; the package-level .gitignore says nothing about it, so `npm pack` happily included it. A publish would have shipped 13 live secrets, the Supabase service-role key among them, into an immutable public tarball. Anything added here must be something we would hand a stranger. See __tests__/publish-safety.test.ts.",
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "type-check": "tsc --noEmit && tsc -p tsconfig.test.json",
36
+ "test": "vitest run",
37
+ "test:live": "MODELRIG_LIVE=1 vitest run"
38
+ },
39
+ "dependencies": {
40
+ "@anthropic-ai/sdk": "^0.71.2",
41
+ "@google/genai": "^2.4.0",
42
+ "ajv": "^8.17.0",
43
+ "better-sqlite3": "^11.10.0",
44
+ "openai": "^4.77.0",
45
+ "yaml": "^2.6.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/better-sqlite3": "^7.6.12",
49
+ "tsx": "^4.21.0",
50
+ "typescript": "^5.2.0",
51
+ "vitest": "^2.1.0"
52
+ },
53
+ "bin": {
54
+ "modelrig": "dist/cli.js"
55
+ }
20
56
  }
package/index.js DELETED
@@ -1,3 +0,0 @@
1
- module.exports = {
2
- message: "ModelRig is coming soon. See https://modelrig.ai",
3
- };