@dexcost/sdk 0.2.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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/adapters/_netbytes.d.ts +31 -0
  4. package/dist/adapters/_netbytes.d.ts.map +1 -0
  5. package/dist/adapters/_netbytes.js +154 -0
  6. package/dist/adapters/_netbytes.js.map +1 -0
  7. package/dist/adapters/aws-lambda.d.ts +41 -0
  8. package/dist/adapters/aws-lambda.d.ts.map +1 -0
  9. package/dist/adapters/aws-lambda.js +65 -0
  10. package/dist/adapters/aws-lambda.js.map +1 -0
  11. package/dist/adapters/browser.d.ts +52 -0
  12. package/dist/adapters/browser.d.ts.map +1 -0
  13. package/dist/adapters/browser.js +127 -0
  14. package/dist/adapters/browser.js.map +1 -0
  15. package/dist/adapters/compute-wrap.d.ts +33 -0
  16. package/dist/adapters/compute-wrap.d.ts.map +1 -0
  17. package/dist/adapters/compute-wrap.js +188 -0
  18. package/dist/adapters/compute-wrap.js.map +1 -0
  19. package/dist/adapters/data/aws_lambda_pricing.json +61 -0
  20. package/dist/adapters/gpu-wrap.d.ts +31 -0
  21. package/dist/adapters/gpu-wrap.d.ts.map +1 -0
  22. package/dist/adapters/gpu-wrap.js +147 -0
  23. package/dist/adapters/gpu-wrap.js.map +1 -0
  24. package/dist/adapters/http.d.ts +58 -0
  25. package/dist/adapters/http.d.ts.map +1 -0
  26. package/dist/adapters/http.js +769 -0
  27. package/dist/adapters/http.js.map +1 -0
  28. package/dist/adapters/index.d.ts +11 -0
  29. package/dist/adapters/index.d.ts.map +1 -0
  30. package/dist/adapters/index.js +12 -0
  31. package/dist/adapters/index.js.map +1 -0
  32. package/dist/adapters/network-accountant.d.ts +63 -0
  33. package/dist/adapters/network-accountant.d.ts.map +1 -0
  34. package/dist/adapters/network-accountant.js +153 -0
  35. package/dist/adapters/network-accountant.js.map +1 -0
  36. package/dist/cli/index.d.ts +13 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +225 -0
  39. package/dist/cli/index.js.map +1 -0
  40. package/dist/cli/scanner.d.ts +39 -0
  41. package/dist/cli/scanner.d.ts.map +1 -0
  42. package/dist/cli/scanner.js +480 -0
  43. package/dist/cli/scanner.js.map +1 -0
  44. package/dist/clients.d.ts +54 -0
  45. package/dist/clients.d.ts.map +1 -0
  46. package/dist/clients.js +240 -0
  47. package/dist/clients.js.map +1 -0
  48. package/dist/cloud-detect.d.ts +96 -0
  49. package/dist/cloud-detect.d.ts.map +1 -0
  50. package/dist/cloud-detect.js +545 -0
  51. package/dist/cloud-detect.js.map +1 -0
  52. package/dist/core/auto-task.d.ts +20 -0
  53. package/dist/core/auto-task.d.ts.map +1 -0
  54. package/dist/core/auto-task.js +34 -0
  55. package/dist/core/auto-task.js.map +1 -0
  56. package/dist/core/cgroup-reader.d.ts +45 -0
  57. package/dist/core/cgroup-reader.d.ts.map +1 -0
  58. package/dist/core/cgroup-reader.js +124 -0
  59. package/dist/core/cgroup-reader.js.map +1 -0
  60. package/dist/core/cgroup-walker.d.ts +60 -0
  61. package/dist/core/cgroup-walker.d.ts.map +1 -0
  62. package/dist/core/cgroup-walker.js +166 -0
  63. package/dist/core/cgroup-walker.js.map +1 -0
  64. package/dist/core/compute-accountant.d.ts +51 -0
  65. package/dist/core/compute-accountant.d.ts.map +1 -0
  66. package/dist/core/compute-accountant.js +179 -0
  67. package/dist/core/compute-accountant.js.map +1 -0
  68. package/dist/core/compute-runtime.d.ts +42 -0
  69. package/dist/core/compute-runtime.d.ts.map +1 -0
  70. package/dist/core/compute-runtime.js +80 -0
  71. package/dist/core/compute-runtime.js.map +1 -0
  72. package/dist/core/config.d.ts +44 -0
  73. package/dist/core/config.d.ts.map +1 -0
  74. package/dist/core/config.js +66 -0
  75. package/dist/core/config.js.map +1 -0
  76. package/dist/core/context.d.ts +76 -0
  77. package/dist/core/context.d.ts.map +1 -0
  78. package/dist/core/context.js +91 -0
  79. package/dist/core/context.js.map +1 -0
  80. package/dist/core/fargate-metadata.d.ts +27 -0
  81. package/dist/core/fargate-metadata.d.ts.map +1 -0
  82. package/dist/core/fargate-metadata.js +102 -0
  83. package/dist/core/fargate-metadata.js.map +1 -0
  84. package/dist/core/gpu-accountant.d.ts +104 -0
  85. package/dist/core/gpu-accountant.d.ts.map +1 -0
  86. package/dist/core/gpu-accountant.js +383 -0
  87. package/dist/core/gpu-accountant.js.map +1 -0
  88. package/dist/core/gpu-runtime.d.ts +58 -0
  89. package/dist/core/gpu-runtime.d.ts.map +1 -0
  90. package/dist/core/gpu-runtime.js +131 -0
  91. package/dist/core/gpu-runtime.js.map +1 -0
  92. package/dist/core/heuristics.d.ts +74 -0
  93. package/dist/core/heuristics.d.ts.map +1 -0
  94. package/dist/core/heuristics.js +182 -0
  95. package/dist/core/heuristics.js.map +1 -0
  96. package/dist/core/models.d.ts +149 -0
  97. package/dist/core/models.d.ts.map +1 -0
  98. package/dist/core/models.js +226 -0
  99. package/dist/core/models.js.map +1 -0
  100. package/dist/core/nvml-reader.d.ts +114 -0
  101. package/dist/core/nvml-reader.d.ts.map +1 -0
  102. package/dist/core/nvml-reader.js +323 -0
  103. package/dist/core/nvml-reader.js.map +1 -0
  104. package/dist/core/session.d.ts +48 -0
  105. package/dist/core/session.d.ts.map +1 -0
  106. package/dist/core/session.js +123 -0
  107. package/dist/core/session.js.map +1 -0
  108. package/dist/core/tracker.d.ts +364 -0
  109. package/dist/core/tracker.d.ts.map +1 -0
  110. package/dist/core/tracker.js +1073 -0
  111. package/dist/core/tracker.js.map +1 -0
  112. package/dist/data/compute_prices.json +180 -0
  113. package/dist/data/egress_prices.json +418 -0
  114. package/dist/data/gpu_prices.json +412 -0
  115. package/dist/data/service_prices.json +2595 -0
  116. package/dist/dev-console.d.ts +12 -0
  117. package/dist/dev-console.d.ts.map +1 -0
  118. package/dist/dev-console.js +60 -0
  119. package/dist/dev-console.js.map +1 -0
  120. package/dist/index.d.ts +52 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +61 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/instruments/anthropic.d.ts +26 -0
  125. package/dist/instruments/anthropic.d.ts.map +1 -0
  126. package/dist/instruments/anthropic.js +242 -0
  127. package/dist/instruments/anthropic.js.map +1 -0
  128. package/dist/instruments/bedrock.d.ts +29 -0
  129. package/dist/instruments/bedrock.d.ts.map +1 -0
  130. package/dist/instruments/bedrock.js +215 -0
  131. package/dist/instruments/bedrock.js.map +1 -0
  132. package/dist/instruments/cohere.d.ts +29 -0
  133. package/dist/instruments/cohere.d.ts.map +1 -0
  134. package/dist/instruments/cohere.js +237 -0
  135. package/dist/instruments/cohere.js.map +1 -0
  136. package/dist/instruments/gemini.d.ts +30 -0
  137. package/dist/instruments/gemini.d.ts.map +1 -0
  138. package/dist/instruments/gemini.js +247 -0
  139. package/dist/instruments/gemini.js.map +1 -0
  140. package/dist/instruments/index.d.ts +35 -0
  141. package/dist/instruments/index.d.ts.map +1 -0
  142. package/dist/instruments/index.js +54 -0
  143. package/dist/instruments/index.js.map +1 -0
  144. package/dist/instruments/mcp.d.ts +24 -0
  145. package/dist/instruments/mcp.d.ts.map +1 -0
  146. package/dist/instruments/mcp.js +459 -0
  147. package/dist/instruments/mcp.js.map +1 -0
  148. package/dist/instruments/openai.d.ts +26 -0
  149. package/dist/instruments/openai.d.ts.map +1 -0
  150. package/dist/instruments/openai.js +221 -0
  151. package/dist/instruments/openai.js.map +1 -0
  152. package/dist/instruments/vercel-ai.d.ts +28 -0
  153. package/dist/instruments/vercel-ai.d.ts.map +1 -0
  154. package/dist/instruments/vercel-ai.js +192 -0
  155. package/dist/instruments/vercel-ai.js.map +1 -0
  156. package/dist/integrations/langchain.d.ts +65 -0
  157. package/dist/integrations/langchain.d.ts.map +1 -0
  158. package/dist/integrations/langchain.js +165 -0
  159. package/dist/integrations/langchain.js.map +1 -0
  160. package/dist/middleware/express.d.ts +55 -0
  161. package/dist/middleware/express.d.ts.map +1 -0
  162. package/dist/middleware/express.js +101 -0
  163. package/dist/middleware/express.js.map +1 -0
  164. package/dist/middleware/index.d.ts +6 -0
  165. package/dist/middleware/index.d.ts.map +1 -0
  166. package/dist/middleware/index.js +5 -0
  167. package/dist/middleware/index.js.map +1 -0
  168. package/dist/pricing/compute-pricing.d.ts +57 -0
  169. package/dist/pricing/compute-pricing.d.ts.map +1 -0
  170. package/dist/pricing/compute-pricing.js +627 -0
  171. package/dist/pricing/compute-pricing.js.map +1 -0
  172. package/dist/pricing/cost_map.json +37665 -0
  173. package/dist/pricing/egress-pricing.d.ts +55 -0
  174. package/dist/pricing/egress-pricing.d.ts.map +1 -0
  175. package/dist/pricing/egress-pricing.js +226 -0
  176. package/dist/pricing/egress-pricing.js.map +1 -0
  177. package/dist/pricing/engine.d.ts +24 -0
  178. package/dist/pricing/engine.d.ts.map +1 -0
  179. package/dist/pricing/engine.js +148 -0
  180. package/dist/pricing/engine.js.map +1 -0
  181. package/dist/pricing/gpu-pricing.d.ts +63 -0
  182. package/dist/pricing/gpu-pricing.d.ts.map +1 -0
  183. package/dist/pricing/gpu-pricing.js +484 -0
  184. package/dist/pricing/gpu-pricing.js.map +1 -0
  185. package/dist/pricing/rates.d.ts +17 -0
  186. package/dist/pricing/rates.d.ts.map +1 -0
  187. package/dist/pricing/rates.js +102 -0
  188. package/dist/pricing/rates.js.map +1 -0
  189. package/dist/pricing/service-catalog.d.ts +87 -0
  190. package/dist/pricing/service-catalog.d.ts.map +1 -0
  191. package/dist/pricing/service-catalog.js +406 -0
  192. package/dist/pricing/service-catalog.js.map +1 -0
  193. package/dist/schema/dexcost-event.v1.json +111 -0
  194. package/dist/schema/dexcost-task.v1.json +160 -0
  195. package/dist/schema/validate.d.ts +15 -0
  196. package/dist/schema/validate.d.ts.map +1 -0
  197. package/dist/schema/validate.js +87 -0
  198. package/dist/schema/validate.js.map +1 -0
  199. package/dist/security/redaction.d.ts +55 -0
  200. package/dist/security/redaction.d.ts.map +1 -0
  201. package/dist/security/redaction.js +144 -0
  202. package/dist/security/redaction.js.map +1 -0
  203. package/dist/transport/buffer.d.ts +117 -0
  204. package/dist/transport/buffer.d.ts.map +1 -0
  205. package/dist/transport/buffer.js +759 -0
  206. package/dist/transport/buffer.js.map +1 -0
  207. package/dist/transport/pusher.d.ts +89 -0
  208. package/dist/transport/pusher.d.ts.map +1 -0
  209. package/dist/transport/pusher.js +323 -0
  210. package/dist/transport/pusher.js.map +1 -0
  211. package/package.json +93 -0
@@ -0,0 +1,484 @@
1
+ /**
2
+ * GPU pricing engine — Phase 2 v2.
3
+ *
4
+ * Dispatches on `details.billing_model` and applies the per-billing-model
5
+ * math from spec §6. Four discriminator values:
6
+ *
7
+ * - per_gpu_second_active — Modal / RunPod / Replicate
8
+ * - per_instance_hour — AWS EC2 GPU / GCP GCE bundled / Azure VM GPU
9
+ * - per_gpu_hour_reserved — Lambda Labs / CoreWeave / GCP N1+accelerator
10
+ * - per_vgpu_hour — Azure NVadsA10 v5 fractional (Decision #10)
11
+ *
12
+ * Per Decision #7: NO per-runtime memory-unit conversion table. VRAM tier
13
+ * is encoded in the SKU key (h100-80gb-sxm5 vs a100-40gb are separate
14
+ * catalog entries).
15
+ *
16
+ * Fail-silent (convention §9): every code path returns a usable GpuCost.
17
+ * Five-tier degradation ladder:
18
+ * Tier 1: per-region SKU exact
19
+ * Tier 2: per-runtime default
20
+ * Tier 3a: device-class fallback (Decision #4)
21
+ * Tier 3b: universal _meta default
22
+ * Tier 4: hardcoded constants
23
+ * Tier 5: try/except returns cost=0 + unknown
24
+ *
25
+ * Decision #1 measurement-side fallback: when details carries
26
+ * `_cgroup_scope_fallback`, it is appended to pricing_source and confidence
27
+ * drops to `estimated`.
28
+ *
29
+ * Mirrors python/src/dexcost/gpu_pricing.py.
30
+ */
31
+ import { Decimal } from "decimal.js";
32
+ import { readFileSync } from "node:fs";
33
+ import { createRequire } from "node:module";
34
+ // ─── Warn-once tracking ─────────────────────────────────────────────────────
35
+ const _warnedModes = new Set();
36
+ export function _resetWarningStateForTests() {
37
+ _warnedModes.clear();
38
+ }
39
+ function _warnOnce(mode, message) {
40
+ if (_warnedModes.has(mode))
41
+ return;
42
+ _warnedModes.add(mode);
43
+ // eslint-disable-next-line no-console
44
+ console.warn(message);
45
+ }
46
+ // ─── Constants ──────────────────────────────────────────────────────────────
47
+ const HOUR_S = new Decimal(3600);
48
+ const MS_PER_S = new Decimal(1000);
49
+ // Tier-4 hardcoded constants — MUST mirror _meta defaults in gpu_prices.json.
50
+ const HARDCODED = {
51
+ per_instance_hour: { hourly_usd: new Decimal("55.04") },
52
+ per_gpu_second_active: { gpu_second_usd: new Decimal("0.000694") },
53
+ per_gpu_hour_reserved: { gpu_hour_usd: new Decimal("3.99") },
54
+ per_vgpu_hour: { vgpu_hour_usd: new Decimal("0.454") },
55
+ };
56
+ // Decision #4 device-class default rates — cold-start fallback for unknown SKUs.
57
+ const DEVICE_CLASS_DEFAULTS = {
58
+ hopper: {
59
+ per_instance_hour: new Decimal("98.32"),
60
+ per_gpu_second_active: new Decimal("0.001097"),
61
+ per_gpu_hour_reserved: new Decimal("3.99"),
62
+ per_vgpu_hour: new Decimal("3.99"),
63
+ },
64
+ ampere: {
65
+ per_instance_hour: new Decimal("32.77"),
66
+ per_gpu_second_active: new Decimal("0.000833"),
67
+ per_gpu_hour_reserved: new Decimal("2.20"),
68
+ per_vgpu_hour: new Decimal("2.20"),
69
+ },
70
+ ada_lovelace: {
71
+ per_instance_hour: new Decimal("12.00"),
72
+ per_gpu_second_active: new Decimal("0.000400"),
73
+ per_gpu_hour_reserved: new Decimal("1.50"),
74
+ per_vgpu_hour: new Decimal("1.50"),
75
+ },
76
+ blackwell: {
77
+ per_instance_hour: new Decimal("180.00"),
78
+ per_gpu_second_active: new Decimal("0.002500"),
79
+ per_gpu_hour_reserved: new Decimal("6.50"),
80
+ per_vgpu_hour: new Decimal("6.50"),
81
+ },
82
+ };
83
+ // productName substring → device-class (most specific first).
84
+ const DEVICE_CLASS_PATTERNS = [
85
+ ["blackwell", ["b100", "b200", "gb200", "b300", "blackwell"]],
86
+ ["hopper", ["h100", "h200", "hopper"]],
87
+ ["ada_lovelace", ["l4", "l40", "ada lovelace", "rtx 4090", "rtx 5090"]],
88
+ ["ampere", ["a100", "a40", "a10", "ampere", "rtx 3090", "rtx a6000"]],
89
+ ];
90
+ function detectDeviceClass(productNameLower) {
91
+ if (!productNameLower)
92
+ return null;
93
+ for (const [cls, patterns] of DEVICE_CLASS_PATTERNS) {
94
+ for (const p of patterns) {
95
+ if (productNameLower.includes(p))
96
+ return cls;
97
+ }
98
+ }
99
+ return null;
100
+ }
101
+ // ─── Helpers ────────────────────────────────────────────────────────────────
102
+ function toDecimal(v) {
103
+ // Always go through String() to avoid JS-float coercion (matches Python's
104
+ // `Decimal(str(x))` pattern). Throws InvalidOperation on bad input → caught
105
+ // by the Tier-5 try/except wrapper.
106
+ return new Decimal(String(v));
107
+ }
108
+ // ═════════════════════════════════════════════════════════════════════════════
109
+ // GpuPricingEngine
110
+ // ═════════════════════════════════════════════════════════════════════════════
111
+ export class GpuPricingEngine {
112
+ _catalog = {};
113
+ _catalogVersion = "unknown";
114
+ constructor(opts) {
115
+ if (opts?.catalog !== undefined) {
116
+ this._catalog = opts.catalog;
117
+ const meta = this._catalog._meta;
118
+ if (meta && typeof meta === "object") {
119
+ this._catalogVersion = String(meta.version ?? "unknown");
120
+ }
121
+ return;
122
+ }
123
+ this._load(opts?.catalogPath);
124
+ }
125
+ // ------------------------------------------------------------------
126
+ // Catalog loading
127
+ // ------------------------------------------------------------------
128
+ _load(catalogPath) {
129
+ let raw;
130
+ try {
131
+ if (catalogPath !== undefined) {
132
+ raw = readFileSync(catalogPath, "utf-8");
133
+ }
134
+ else {
135
+ try {
136
+ const req = createRequire(import.meta.url);
137
+ const obj = req("../data/gpu_prices.json");
138
+ this._catalog = obj;
139
+ const meta = obj._meta;
140
+ if (meta && typeof meta === "object") {
141
+ this._catalogVersion = String(meta.version ?? "unknown");
142
+ }
143
+ return;
144
+ }
145
+ catch (err) {
146
+ _warnOnce("gpu_catalog_missing", `gpu catalog file not found; falling back to hardcoded ` +
147
+ `per-billing-model defaults (${String(err)})`);
148
+ return;
149
+ }
150
+ }
151
+ }
152
+ catch (err) {
153
+ const code = err?.code;
154
+ _warnOnce(code === "ENOENT" ? "gpu_catalog_missing" : "gpu_catalog_unreadable", code === "ENOENT"
155
+ ? `gpu catalog file not found; falling back to hardcoded per-billing-model defaults`
156
+ : `gpu catalog unreadable (${String(err)}); falling back to hardcoded`);
157
+ return;
158
+ }
159
+ try {
160
+ this._catalog = JSON.parse(raw);
161
+ }
162
+ catch (err) {
163
+ _warnOnce("gpu_catalog_malformed", `gpu catalog malformed JSON (${String(err)}); falling back to hardcoded`);
164
+ this._catalog = {};
165
+ return;
166
+ }
167
+ const meta = this._catalog._meta;
168
+ if (meta && typeof meta === "object") {
169
+ this._catalogVersion = String(meta.version ?? "unknown");
170
+ }
171
+ }
172
+ get catalogVersion() {
173
+ return this._catalogVersion;
174
+ }
175
+ /** Read-only catalog accessor — used by tests to verify rate sources. */
176
+ get catalog() {
177
+ return this._catalog;
178
+ }
179
+ // ------------------------------------------------------------------
180
+ // Public entry point — Tier-5 wrapper + Decision #1 suffix
181
+ // ------------------------------------------------------------------
182
+ resolveGpuCost(details, cloudEnv, windowS) {
183
+ const billingModel = (details && details.billing_model) || "unknown";
184
+ let cost;
185
+ try {
186
+ cost = this._dispatch(billingModel, details, cloudEnv, windowS);
187
+ }
188
+ catch (exc) {
189
+ _warnOnce(`gpu_pricing_failure:${billingModel}`, `gpu pricing failed for billing_model=${billingModel}: ${String(exc)}; ` +
190
+ `emitting cost_usd=0`);
191
+ return {
192
+ costUsd: new Decimal(0),
193
+ pricingSource: `gpu_catalog:error:${billingModel}`,
194
+ costConfidence: "unknown",
195
+ };
196
+ }
197
+ // Decision #1 measurement-side fallback suffix.
198
+ const scopeFb = (details || {})._cgroup_scope_fallback;
199
+ if (scopeFb) {
200
+ return {
201
+ costUsd: cost.costUsd,
202
+ pricingSource: `${cost.pricingSource}:${String(scopeFb)}`,
203
+ costConfidence: "estimated",
204
+ };
205
+ }
206
+ return cost;
207
+ }
208
+ // ------------------------------------------------------------------
209
+ // Dispatch
210
+ // ------------------------------------------------------------------
211
+ _dispatch(billingModel, details, cloudEnv, windowS) {
212
+ if (billingModel === "per_gpu_second_active") {
213
+ return this._perGpuSecond(details, cloudEnv);
214
+ }
215
+ if (billingModel === "per_instance_hour") {
216
+ return this._perInstanceHour(details, cloudEnv, windowS);
217
+ }
218
+ if (billingModel === "per_gpu_hour_reserved") {
219
+ return this._perGpuHour(details, cloudEnv, windowS);
220
+ }
221
+ if (billingModel === "per_vgpu_hour") {
222
+ return this._perVgpuHour(details, cloudEnv, windowS);
223
+ }
224
+ _warnOnce(`gpu_unsupported_billing_model:${billingModel}`, `gpu pricing has no math for billing_model=${billingModel}`);
225
+ return {
226
+ costUsd: new Decimal(0),
227
+ pricingSource: `gpu_catalog:unsupported:${billingModel}`,
228
+ costConfidence: "unknown",
229
+ };
230
+ }
231
+ // ─── per_gpu_second_active ───────────────────────────────────────────
232
+ _perGpuSecond(details, cloudEnv) {
233
+ const provider = cloudEnv.provider;
234
+ const gpuSku = details.gpu_sku;
235
+ const { rate, source, confidence } = this._resolvePerGpuSecondRate(provider, gpuSku, details);
236
+ const gpuSeconds = toDecimal(details.gpu_seconds_used);
237
+ return {
238
+ costUsd: gpuSeconds.times(rate),
239
+ pricingSource: source,
240
+ costConfidence: confidence,
241
+ };
242
+ }
243
+ _resolvePerGpuSecondRate(provider, gpuSku, details) {
244
+ if (provider && gpuSku) {
245
+ const block = this._catalog[provider]?.per_gpu_second_active;
246
+ if (block && typeof block === "object") {
247
+ const def = (block.default || {});
248
+ // Direct (Modal / Replicate) → entry.gpu_sku === gpuSku
249
+ for (const [key, entry] of Object.entries(def)) {
250
+ if (entry && typeof entry === "object" && entry.gpu_sku === gpuSku) {
251
+ try {
252
+ return {
253
+ rate: new Decimal(String(entry.gpu_second_usd)),
254
+ source: `gpu_catalog:${provider}:per_gpu_second_active:${key}`,
255
+ confidence: "computed",
256
+ };
257
+ }
258
+ catch {
259
+ // fall through
260
+ }
261
+ }
262
+ // Nested (RunPod on_demand / community_cloud)
263
+ if (entry && typeof entry === "object") {
264
+ for (const [skuKey, skuEntry] of Object.entries(entry)) {
265
+ if (skuEntry &&
266
+ typeof skuEntry === "object" &&
267
+ skuEntry.gpu_sku === gpuSku) {
268
+ try {
269
+ return {
270
+ rate: new Decimal(String(skuEntry.gpu_second_usd)),
271
+ source: `gpu_catalog:${provider}:per_gpu_second_active:${key}:${skuKey}`,
272
+ confidence: "computed",
273
+ };
274
+ }
275
+ catch {
276
+ // fall through
277
+ }
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ }
284
+ return this._deviceClassOrMetaFallback(details, "per_gpu_second_active", "gpu_second_usd");
285
+ }
286
+ // ─── per_instance_hour ───────────────────────────────────────────────
287
+ _perInstanceHour(details, cloudEnv, windowS) {
288
+ let window = windowS;
289
+ if (window === undefined || window.lessThanOrEqualTo(0)) {
290
+ window = toDecimal(details.duration_ms).dividedBy(MS_PER_S);
291
+ }
292
+ const provider = cloudEnv.provider;
293
+ const region = details.region;
294
+ const instanceType = details.instance_type ||
295
+ cloudEnv.instanceType ||
296
+ null;
297
+ const { rate: hourlyRate, source, confidence } = this._resolvePerInstanceRate(provider, region, instanceType, details);
298
+ const gpuCount = toDecimal(details.gpu_count);
299
+ const gpuSeconds = toDecimal(details.gpu_seconds_used);
300
+ if (gpuCount.lessThanOrEqualTo(0) || window.lessThanOrEqualTo(0)) {
301
+ return { costUsd: new Decimal(0), pricingSource: source, costConfidence: confidence };
302
+ }
303
+ const shareFactor = gpuSeconds.dividedBy(gpuCount.times(window));
304
+ const taskInstanceHours = shareFactor.times(window.dividedBy(HOUR_S));
305
+ return {
306
+ costUsd: taskInstanceHours.times(hourlyRate),
307
+ pricingSource: source,
308
+ costConfidence: confidence,
309
+ };
310
+ }
311
+ _resolvePerInstanceRate(provider, region, instanceType, details) {
312
+ const blockKeys = {
313
+ aws: "ec2_gpu",
314
+ gcp: "gce_gpu_bundled",
315
+ azure: "vm_gpu",
316
+ };
317
+ const blockKey = provider ? blockKeys[provider] : undefined;
318
+ if (provider && blockKey && instanceType && region) {
319
+ const entry = this._catalog?.[provider]?.[blockKey]?.regions?.[region]?.instance_types?.[instanceType];
320
+ if (entry) {
321
+ try {
322
+ return {
323
+ rate: new Decimal(String(entry.hourly_usd)),
324
+ source: `gpu_catalog:${provider}:${blockKey}:${region}:${instanceType}`,
325
+ confidence: "computed",
326
+ };
327
+ }
328
+ catch {
329
+ // fall through
330
+ }
331
+ }
332
+ }
333
+ return this._deviceClassOrMetaFallback(details, "per_instance_hour", "hourly_usd");
334
+ }
335
+ // ─── per_gpu_hour_reserved ───────────────────────────────────────────
336
+ _perGpuHour(details, cloudEnv, windowS) {
337
+ let window = windowS;
338
+ if (window === undefined || window.lessThanOrEqualTo(0)) {
339
+ window = toDecimal(details.duration_ms).dividedBy(MS_PER_S);
340
+ }
341
+ const provider = cloudEnv.provider;
342
+ const gpuSku = details.gpu_sku;
343
+ const { rate: gpuHourUsd, source, confidence } = this._resolvePerGpuHourRate(provider, gpuSku, details);
344
+ const gpuCount = toDecimal(details.gpu_count);
345
+ const gpuSeconds = toDecimal(details.gpu_seconds_used);
346
+ if (gpuCount.lessThanOrEqualTo(0) || window.lessThanOrEqualTo(0)) {
347
+ return { costUsd: new Decimal(0), pricingSource: source, costConfidence: confidence };
348
+ }
349
+ const shareFactor = gpuSeconds.dividedBy(gpuCount.times(window));
350
+ const taskGpuHours = shareFactor.times(window.dividedBy(HOUR_S)).times(gpuCount);
351
+ return {
352
+ costUsd: taskGpuHours.times(gpuHourUsd),
353
+ pricingSource: source,
354
+ costConfidence: confidence,
355
+ };
356
+ }
357
+ _resolvePerGpuHourRate(provider, gpuSku, details) {
358
+ if (provider && gpuSku) {
359
+ const block = this._catalog[provider]?.per_gpu_hour_reserved;
360
+ if (block && typeof block === "object") {
361
+ const def = (block.default || {});
362
+ for (const [key, entry] of Object.entries(def)) {
363
+ if (entry && typeof entry === "object" && entry.gpu_sku === gpuSku) {
364
+ try {
365
+ return {
366
+ rate: new Decimal(String(entry.gpu_hour_usd)),
367
+ source: `gpu_catalog:${provider}:per_gpu_hour_reserved:${key}`,
368
+ confidence: "computed",
369
+ };
370
+ }
371
+ catch {
372
+ // fall through
373
+ }
374
+ }
375
+ }
376
+ }
377
+ }
378
+ // GCP N1+accelerator path (Decision #9) — separate block.
379
+ if (provider === "gcp" && gpuSku) {
380
+ const region = details.region;
381
+ if (region) {
382
+ const accelerators = this._catalog.gcp?.gce_gpu_attached?.regions?.[region]?.accelerator_types || {};
383
+ for (const [accKey, entry] of Object.entries(accelerators)) {
384
+ if (entry && typeof entry === "object" && entry.gpu_sku === gpuSku) {
385
+ try {
386
+ return {
387
+ rate: new Decimal(String(entry.gpu_hour_usd)),
388
+ source: `gpu_catalog:gcp:gce_gpu_attached:${region}:${accKey}`,
389
+ confidence: "computed",
390
+ };
391
+ }
392
+ catch {
393
+ // fall through
394
+ }
395
+ }
396
+ }
397
+ }
398
+ }
399
+ return this._deviceClassOrMetaFallback(details, "per_gpu_hour_reserved", "gpu_hour_usd");
400
+ }
401
+ // ─── per_vgpu_hour (Azure NVadsA10 v5) — Decision #10 ─────────────────
402
+ _perVgpuHour(details, cloudEnv, windowS) {
403
+ let window = windowS;
404
+ if (window === undefined || window.lessThanOrEqualTo(0)) {
405
+ window = toDecimal(details.duration_ms).dividedBy(MS_PER_S);
406
+ }
407
+ const provider = cloudEnv.provider;
408
+ const region = details.region;
409
+ const instanceType = details.instance_type ||
410
+ cloudEnv.instanceType ||
411
+ null;
412
+ const { rate: vgpuHourUsd, source, confidence } = this._resolvePerVgpuRate(provider, region, instanceType, details);
413
+ const gpuSeconds = toDecimal(details.gpu_seconds_used);
414
+ if (window.lessThanOrEqualTo(0)) {
415
+ return { costUsd: new Decimal(0), pricingSource: source, costConfidence: confidence };
416
+ }
417
+ const shareFactor = gpuSeconds.dividedBy(window);
418
+ const taskVgpuHours = shareFactor.times(window.dividedBy(HOUR_S));
419
+ return {
420
+ costUsd: taskVgpuHours.times(vgpuHourUsd),
421
+ pricingSource: source,
422
+ costConfidence: confidence,
423
+ };
424
+ }
425
+ _resolvePerVgpuRate(provider, region, instanceType, details) {
426
+ if (provider === "azure" && instanceType && region) {
427
+ const entry = this._catalog.azure?.vm_vgpu?.regions?.[region]?.instance_types?.[instanceType];
428
+ if (entry) {
429
+ try {
430
+ return {
431
+ rate: new Decimal(String(entry.vgpu_hour_usd)),
432
+ source: `gpu_catalog:azure:vm_vgpu:${region}:${instanceType}`,
433
+ confidence: "computed",
434
+ };
435
+ }
436
+ catch {
437
+ // fall through
438
+ }
439
+ }
440
+ }
441
+ return this._deviceClassOrMetaFallback(details, "per_vgpu_hour", "vgpu_hour_usd");
442
+ }
443
+ // ─── Tier-3 → Tier-3b → Tier-4 fallback ladder ────────────────────────
444
+ _deviceClassOrMetaFallback(details, billingModel, rateKey) {
445
+ // Tier-3a: device-class fallback via productName substring.
446
+ const productName = details._nvml_product_name_lower;
447
+ const deviceClass = detectDeviceClass(productName);
448
+ if (deviceClass &&
449
+ ["per_instance_hour", "per_gpu_second_active", "per_gpu_hour_reserved", "per_vgpu_hour"].includes(billingModel)) {
450
+ const rate = DEVICE_CLASS_DEFAULTS[deviceClass][billingModel];
451
+ _warnOnce(`gpu_sku_unknown:${productName}`, `GPU SKU not in catalog (productName=${String(productName)}); ` +
452
+ `falling back to device_class=${deviceClass} default rate ` +
453
+ `(~30% accuracy band)`);
454
+ return {
455
+ rate,
456
+ source: `gpu_catalog:device_class_fallback:${deviceClass}:${billingModel}`,
457
+ confidence: "estimated",
458
+ };
459
+ }
460
+ // Tier-3b: universal _meta default.
461
+ const meta = (this._catalog._meta || {});
462
+ const metaKey = `default_${billingModel}_usd`;
463
+ if (metaKey in meta) {
464
+ try {
465
+ return {
466
+ rate: new Decimal(String(meta[metaKey])),
467
+ source: `gpu_catalog:default:${billingModel}`,
468
+ confidence: "estimated",
469
+ };
470
+ }
471
+ catch {
472
+ // fall through to hardcoded
473
+ }
474
+ }
475
+ // Tier-4: hardcoded constants.
476
+ const hc = HARDCODED[billingModel];
477
+ return {
478
+ rate: hc[rateKey],
479
+ source: `gpu_catalog:hardcoded:${billingModel}`,
480
+ confidence: "estimated",
481
+ };
482
+ }
483
+ }
484
+ //# sourceMappingURL=gpu-pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu-pricing.js","sourceRoot":"","sources":["../../src/pricing/gpu-pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface RateEntry {
2
+ service: string;
3
+ per: string;
4
+ costUsd: number;
5
+ }
6
+ export declare class RateRegistry {
7
+ private _rates;
8
+ private _version;
9
+ register(service: string, per: string, costUsd: number): void;
10
+ get(service: string): RateEntry | undefined;
11
+ get rates(): Record<string, RateEntry>;
12
+ get pricingVersion(): string;
13
+ load(path: string): void;
14
+ export(path: string): void;
15
+ private _computeVersion;
16
+ }
17
+ //# sourceMappingURL=rates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rates.d.ts","sourceRoot":"","sources":["../../src/pricing/rates.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,QAAQ,CAAuB;IAEvC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAK7D,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI3C,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAMrC;IAED,IAAI,cAAc,IAAI,MAAM,CAK3B;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8CxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA0B1B,OAAO,CAAC,eAAe;CASxB"}
@@ -0,0 +1,102 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, writeFileSync } from "node:fs";
3
+ export class RateRegistry {
4
+ _rates = new Map();
5
+ _version = null;
6
+ register(service, per, costUsd) {
7
+ this._rates.set(service, { service, per, costUsd });
8
+ this._version = null; // Invalidate cached version hash
9
+ }
10
+ get(service) {
11
+ return this._rates.get(service);
12
+ }
13
+ get rates() {
14
+ const copy = {};
15
+ for (const [key, value] of this._rates) {
16
+ copy[key] = { ...value };
17
+ }
18
+ return copy;
19
+ }
20
+ get pricingVersion() {
21
+ if (this._version === null) {
22
+ this._version = this._computeVersion();
23
+ }
24
+ return this._version;
25
+ }
26
+ load(path) {
27
+ let content;
28
+ try {
29
+ content = readFileSync(path, "utf-8");
30
+ }
31
+ catch (err) {
32
+ throw new Error(`Cannot read rates file ${path}: ${err instanceof Error ? err.message : err}`);
33
+ }
34
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
35
+ let yaml;
36
+ try {
37
+ yaml = require("js-yaml");
38
+ }
39
+ catch {
40
+ throw new Error("The 'js-yaml' package is required for YAML rate loading. Install it with: npm install js-yaml");
41
+ }
42
+ let parsed;
43
+ try {
44
+ parsed = yaml.load(content);
45
+ }
46
+ catch (err) {
47
+ throw new Error(`Invalid YAML in rates file ${path}: ${err instanceof Error ? err.message : err}`);
48
+ }
49
+ const parsedObj = (parsed ?? {});
50
+ const ratesData = parsedObj["rates"];
51
+ if (typeof ratesData !== "object" || ratesData === null || Array.isArray(ratesData)) {
52
+ throw new Error("Expected 'rates' key with a mapping in the YAML file.");
53
+ }
54
+ for (const [service, info] of Object.entries(ratesData)) {
55
+ if (typeof info !== "object" ||
56
+ info === null ||
57
+ Array.isArray(info) ||
58
+ !("cost_usd" in info)) {
59
+ throw new Error(`Rate entry for ${JSON.stringify(service)} must be a mapping with at least 'cost_usd'.`);
60
+ }
61
+ const entry = info;
62
+ const per = entry["per"] != null ? String(entry["per"]) : "unit";
63
+ const costUsd = parseFloat(String(entry["cost_usd"]));
64
+ this.register(String(service), per, costUsd);
65
+ }
66
+ }
67
+ export(path) {
68
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
69
+ let yaml;
70
+ try {
71
+ yaml = require("js-yaml");
72
+ }
73
+ catch {
74
+ throw new Error("The 'js-yaml' package is required for YAML rate export. Install it with: npm install js-yaml");
75
+ }
76
+ const ratesData = {};
77
+ for (const service of Array.from(this._rates.keys()).sort()) {
78
+ const entry = this._rates.get(service);
79
+ ratesData[service] = {
80
+ per: entry.per,
81
+ cost_usd: String(entry.costUsd),
82
+ };
83
+ }
84
+ const output = yaml.dump({ rates: ratesData }, { sortKeys: false });
85
+ try {
86
+ writeFileSync(path, output, "utf-8");
87
+ }
88
+ catch (err) {
89
+ throw new Error(`Cannot write rates file ${path}: ${err instanceof Error ? err.message : err}`);
90
+ }
91
+ }
92
+ _computeVersion() {
93
+ const parts = [];
94
+ for (const service of Array.from(this._rates.keys()).sort()) {
95
+ const entry = this._rates.get(service);
96
+ parts.push(`${service}:${entry.per}:${entry.costUsd}`);
97
+ }
98
+ const raw = parts.join("|");
99
+ return createHash("sha256").update(raw, "utf-8").digest("hex").slice(0, 12);
100
+ }
101
+ }
102
+ //# sourceMappingURL=rates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rates.js","sourceRoot":"","sources":["../../src/pricing/rates.ts"],"names":[],"mappings":"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"}