@peakinfer/cli 1.0.133

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 (367) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.env.example +6 -0
  3. package/.github/workflows/peakinfer.yml +64 -0
  4. package/CHANGELOG.md +31 -0
  5. package/LICENSE +190 -0
  6. package/README.md +335 -0
  7. package/data/inferencemax.json +274 -0
  8. package/dist/agent-analyzer.d.ts +45 -0
  9. package/dist/agent-analyzer.d.ts.map +1 -0
  10. package/dist/agent-analyzer.js +374 -0
  11. package/dist/agent-analyzer.js.map +1 -0
  12. package/dist/agent.d.ts +76 -0
  13. package/dist/agent.d.ts.map +1 -0
  14. package/dist/agent.js +965 -0
  15. package/dist/agent.js.map +1 -0
  16. package/dist/agents/correlation-analyzer.d.ts +34 -0
  17. package/dist/agents/correlation-analyzer.d.ts.map +1 -0
  18. package/dist/agents/correlation-analyzer.js +261 -0
  19. package/dist/agents/correlation-analyzer.js.map +1 -0
  20. package/dist/agents/index.d.ts +91 -0
  21. package/dist/agents/index.d.ts.map +1 -0
  22. package/dist/agents/index.js +111 -0
  23. package/dist/agents/index.js.map +1 -0
  24. package/dist/agents/runtime-analyzer.d.ts +38 -0
  25. package/dist/agents/runtime-analyzer.d.ts.map +1 -0
  26. package/dist/agents/runtime-analyzer.js +244 -0
  27. package/dist/agents/runtime-analyzer.js.map +1 -0
  28. package/dist/analysis-types.d.ts +500 -0
  29. package/dist/analysis-types.d.ts.map +1 -0
  30. package/dist/analysis-types.js +11 -0
  31. package/dist/analysis-types.js.map +1 -0
  32. package/dist/analytics.d.ts +25 -0
  33. package/dist/analytics.d.ts.map +1 -0
  34. package/dist/analytics.js +94 -0
  35. package/dist/analytics.js.map +1 -0
  36. package/dist/analyzer.d.ts +48 -0
  37. package/dist/analyzer.d.ts.map +1 -0
  38. package/dist/analyzer.js +547 -0
  39. package/dist/analyzer.js.map +1 -0
  40. package/dist/artifacts.d.ts +44 -0
  41. package/dist/artifacts.d.ts.map +1 -0
  42. package/dist/artifacts.js +165 -0
  43. package/dist/artifacts.js.map +1 -0
  44. package/dist/benchmarks/index.d.ts +88 -0
  45. package/dist/benchmarks/index.d.ts.map +1 -0
  46. package/dist/benchmarks/index.js +205 -0
  47. package/dist/benchmarks/index.js.map +1 -0
  48. package/dist/cli.d.ts +3 -0
  49. package/dist/cli.d.ts.map +1 -0
  50. package/dist/cli.js +427 -0
  51. package/dist/cli.js.map +1 -0
  52. package/dist/commands/ci.d.ts +19 -0
  53. package/dist/commands/ci.d.ts.map +1 -0
  54. package/dist/commands/ci.js +253 -0
  55. package/dist/commands/ci.js.map +1 -0
  56. package/dist/commands/config.d.ts +16 -0
  57. package/dist/commands/config.d.ts.map +1 -0
  58. package/dist/commands/config.js +249 -0
  59. package/dist/commands/config.js.map +1 -0
  60. package/dist/commands/demo.d.ts +15 -0
  61. package/dist/commands/demo.d.ts.map +1 -0
  62. package/dist/commands/demo.js +106 -0
  63. package/dist/commands/demo.js.map +1 -0
  64. package/dist/commands/export.d.ts +14 -0
  65. package/dist/commands/export.d.ts.map +1 -0
  66. package/dist/commands/export.js +209 -0
  67. package/dist/commands/export.js.map +1 -0
  68. package/dist/commands/history.d.ts +15 -0
  69. package/dist/commands/history.d.ts.map +1 -0
  70. package/dist/commands/history.js +389 -0
  71. package/dist/commands/history.js.map +1 -0
  72. package/dist/commands/template.d.ts +14 -0
  73. package/dist/commands/template.d.ts.map +1 -0
  74. package/dist/commands/template.js +341 -0
  75. package/dist/commands/template.js.map +1 -0
  76. package/dist/commands/validate-map.d.ts +12 -0
  77. package/dist/commands/validate-map.d.ts.map +1 -0
  78. package/dist/commands/validate-map.js +274 -0
  79. package/dist/commands/validate-map.js.map +1 -0
  80. package/dist/commands/whatif.d.ts +17 -0
  81. package/dist/commands/whatif.d.ts.map +1 -0
  82. package/dist/commands/whatif.js +206 -0
  83. package/dist/commands/whatif.js.map +1 -0
  84. package/dist/comparison.d.ts +38 -0
  85. package/dist/comparison.d.ts.map +1 -0
  86. package/dist/comparison.js +223 -0
  87. package/dist/comparison.js.map +1 -0
  88. package/dist/config.d.ts +42 -0
  89. package/dist/config.d.ts.map +1 -0
  90. package/dist/config.js +158 -0
  91. package/dist/config.js.map +1 -0
  92. package/dist/connectors/helicone.d.ts +9 -0
  93. package/dist/connectors/helicone.d.ts.map +1 -0
  94. package/dist/connectors/helicone.js +106 -0
  95. package/dist/connectors/helicone.js.map +1 -0
  96. package/dist/connectors/index.d.ts +37 -0
  97. package/dist/connectors/index.d.ts.map +1 -0
  98. package/dist/connectors/index.js +65 -0
  99. package/dist/connectors/index.js.map +1 -0
  100. package/dist/connectors/langsmith.d.ts +9 -0
  101. package/dist/connectors/langsmith.d.ts.map +1 -0
  102. package/dist/connectors/langsmith.js +122 -0
  103. package/dist/connectors/langsmith.js.map +1 -0
  104. package/dist/connectors/types.d.ts +83 -0
  105. package/dist/connectors/types.d.ts.map +1 -0
  106. package/dist/connectors/types.js +98 -0
  107. package/dist/connectors/types.js.map +1 -0
  108. package/dist/cost-estimator.d.ts +46 -0
  109. package/dist/cost-estimator.d.ts.map +1 -0
  110. package/dist/cost-estimator.js +104 -0
  111. package/dist/cost-estimator.js.map +1 -0
  112. package/dist/costs.d.ts +57 -0
  113. package/dist/costs.d.ts.map +1 -0
  114. package/dist/costs.js +251 -0
  115. package/dist/costs.js.map +1 -0
  116. package/dist/counterfactuals.d.ts +29 -0
  117. package/dist/counterfactuals.d.ts.map +1 -0
  118. package/dist/counterfactuals.js +448 -0
  119. package/dist/counterfactuals.js.map +1 -0
  120. package/dist/enhancement-prompts.d.ts +41 -0
  121. package/dist/enhancement-prompts.d.ts.map +1 -0
  122. package/dist/enhancement-prompts.js +88 -0
  123. package/dist/enhancement-prompts.js.map +1 -0
  124. package/dist/envelopes.d.ts +20 -0
  125. package/dist/envelopes.d.ts.map +1 -0
  126. package/dist/envelopes.js +790 -0
  127. package/dist/envelopes.js.map +1 -0
  128. package/dist/format-normalizer.d.ts +71 -0
  129. package/dist/format-normalizer.d.ts.map +1 -0
  130. package/dist/format-normalizer.js +1331 -0
  131. package/dist/format-normalizer.js.map +1 -0
  132. package/dist/history.d.ts +79 -0
  133. package/dist/history.d.ts.map +1 -0
  134. package/dist/history.js +313 -0
  135. package/dist/history.js.map +1 -0
  136. package/dist/html.d.ts +11 -0
  137. package/dist/html.d.ts.map +1 -0
  138. package/dist/html.js +463 -0
  139. package/dist/html.js.map +1 -0
  140. package/dist/impact.d.ts +42 -0
  141. package/dist/impact.d.ts.map +1 -0
  142. package/dist/impact.js +443 -0
  143. package/dist/impact.js.map +1 -0
  144. package/dist/index.d.ts +26 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +34 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/insights.d.ts +5 -0
  149. package/dist/insights.d.ts.map +1 -0
  150. package/dist/insights.js +271 -0
  151. package/dist/insights.js.map +1 -0
  152. package/dist/joiner.d.ts +9 -0
  153. package/dist/joiner.d.ts.map +1 -0
  154. package/dist/joiner.js +247 -0
  155. package/dist/joiner.js.map +1 -0
  156. package/dist/orchestrator.d.ts +34 -0
  157. package/dist/orchestrator.d.ts.map +1 -0
  158. package/dist/orchestrator.js +827 -0
  159. package/dist/orchestrator.js.map +1 -0
  160. package/dist/pdf.d.ts +26 -0
  161. package/dist/pdf.d.ts.map +1 -0
  162. package/dist/pdf.js +84 -0
  163. package/dist/pdf.js.map +1 -0
  164. package/dist/prediction.d.ts +33 -0
  165. package/dist/prediction.d.ts.map +1 -0
  166. package/dist/prediction.js +316 -0
  167. package/dist/prediction.js.map +1 -0
  168. package/dist/prompts/loader.d.ts +38 -0
  169. package/dist/prompts/loader.d.ts.map +1 -0
  170. package/dist/prompts/loader.js +60 -0
  171. package/dist/prompts/loader.js.map +1 -0
  172. package/dist/renderer.d.ts +64 -0
  173. package/dist/renderer.d.ts.map +1 -0
  174. package/dist/renderer.js +923 -0
  175. package/dist/renderer.js.map +1 -0
  176. package/dist/runid.d.ts +57 -0
  177. package/dist/runid.d.ts.map +1 -0
  178. package/dist/runid.js +199 -0
  179. package/dist/runid.js.map +1 -0
  180. package/dist/runtime.d.ts +29 -0
  181. package/dist/runtime.d.ts.map +1 -0
  182. package/dist/runtime.js +366 -0
  183. package/dist/runtime.js.map +1 -0
  184. package/dist/scanner.d.ts +11 -0
  185. package/dist/scanner.d.ts.map +1 -0
  186. package/dist/scanner.js +426 -0
  187. package/dist/scanner.js.map +1 -0
  188. package/dist/templates.d.ts +120 -0
  189. package/dist/templates.d.ts.map +1 -0
  190. package/dist/templates.js +429 -0
  191. package/dist/templates.js.map +1 -0
  192. package/dist/tools/index.d.ts +153 -0
  193. package/dist/tools/index.d.ts.map +1 -0
  194. package/dist/tools/index.js +177 -0
  195. package/dist/tools/index.js.map +1 -0
  196. package/dist/types.d.ts +3647 -0
  197. package/dist/types.d.ts.map +1 -0
  198. package/dist/types.js +703 -0
  199. package/dist/types.js.map +1 -0
  200. package/dist/version.d.ts +7 -0
  201. package/dist/version.d.ts.map +1 -0
  202. package/dist/version.js +23 -0
  203. package/dist/version.js.map +1 -0
  204. package/docs/demo-guide.md +423 -0
  205. package/docs/events-format.md +295 -0
  206. package/docs/inferencemap-spec.md +344 -0
  207. package/docs/migration-v2.md +293 -0
  208. package/fixtures/demo/precomputed.json +142 -0
  209. package/fixtures/demo-project/README.md +52 -0
  210. package/fixtures/demo-project/ai-service.ts +65 -0
  211. package/fixtures/demo-project/sample-events.jsonl +15 -0
  212. package/fixtures/demo-project/src/ai-service.ts +128 -0
  213. package/fixtures/demo-project/src/llm-client.ts +155 -0
  214. package/package.json +65 -0
  215. package/prompts/agent-analyzer.yaml +47 -0
  216. package/prompts/ci-gate.yaml +98 -0
  217. package/prompts/correlation-analyzer.yaml +178 -0
  218. package/prompts/format-normalizer.yaml +46 -0
  219. package/prompts/peak-performance.yaml +180 -0
  220. package/prompts/pr-comment.yaml +111 -0
  221. package/prompts/runtime-analyzer.yaml +189 -0
  222. package/prompts/unified-analyzer.yaml +241 -0
  223. package/schemas/inference-map.v0.1.json +215 -0
  224. package/scripts/benchmark.ts +394 -0
  225. package/scripts/demo-v1.5.sh +158 -0
  226. package/scripts/sync-from-site.sh +197 -0
  227. package/scripts/validate-sync.sh +178 -0
  228. package/src/agent-analyzer.ts +481 -0
  229. package/src/agent.ts +1232 -0
  230. package/src/agents/correlation-analyzer.ts +353 -0
  231. package/src/agents/index.ts +235 -0
  232. package/src/agents/runtime-analyzer.ts +343 -0
  233. package/src/analysis-types.ts +558 -0
  234. package/src/analytics.ts +100 -0
  235. package/src/analyzer.ts +692 -0
  236. package/src/artifacts.ts +218 -0
  237. package/src/benchmarks/index.ts +309 -0
  238. package/src/cli.ts +503 -0
  239. package/src/commands/ci.ts +336 -0
  240. package/src/commands/config.ts +288 -0
  241. package/src/commands/demo.ts +175 -0
  242. package/src/commands/export.ts +297 -0
  243. package/src/commands/history.ts +425 -0
  244. package/src/commands/template.ts +385 -0
  245. package/src/commands/validate-map.ts +324 -0
  246. package/src/commands/whatif.ts +272 -0
  247. package/src/comparison.ts +283 -0
  248. package/src/config.ts +188 -0
  249. package/src/connectors/helicone.ts +164 -0
  250. package/src/connectors/index.ts +93 -0
  251. package/src/connectors/langsmith.ts +179 -0
  252. package/src/connectors/types.ts +180 -0
  253. package/src/cost-estimator.ts +146 -0
  254. package/src/costs.ts +347 -0
  255. package/src/counterfactuals.ts +516 -0
  256. package/src/enhancement-prompts.ts +118 -0
  257. package/src/envelopes.ts +814 -0
  258. package/src/format-normalizer.ts +1486 -0
  259. package/src/history.ts +400 -0
  260. package/src/html.ts +512 -0
  261. package/src/impact.ts +522 -0
  262. package/src/index.ts +83 -0
  263. package/src/insights.ts +341 -0
  264. package/src/joiner.ts +289 -0
  265. package/src/orchestrator.ts +1015 -0
  266. package/src/pdf.ts +110 -0
  267. package/src/prediction.ts +392 -0
  268. package/src/prompts/loader.ts +88 -0
  269. package/src/renderer.ts +1045 -0
  270. package/src/runid.ts +261 -0
  271. package/src/runtime.ts +450 -0
  272. package/src/scanner.ts +508 -0
  273. package/src/templates.ts +561 -0
  274. package/src/tools/index.ts +214 -0
  275. package/src/types.ts +873 -0
  276. package/src/version.ts +24 -0
  277. package/templates/context-accumulation.yaml +23 -0
  278. package/templates/cost-concentration.yaml +20 -0
  279. package/templates/dead-code.yaml +20 -0
  280. package/templates/latency-explainer.yaml +23 -0
  281. package/templates/optimizations/ab-testing-framework.yaml +74 -0
  282. package/templates/optimizations/api-gateway-optimization.yaml +81 -0
  283. package/templates/optimizations/api-model-routing-strategy.yaml +126 -0
  284. package/templates/optimizations/auto-scaling-optimization.yaml +85 -0
  285. package/templates/optimizations/batch-utilization-diagnostic.yaml +142 -0
  286. package/templates/optimizations/comprehensive-apm.yaml +76 -0
  287. package/templates/optimizations/context-window-optimization.yaml +91 -0
  288. package/templates/optimizations/cost-sensitive-batch-processing.yaml +77 -0
  289. package/templates/optimizations/distributed-training-optimization.yaml +77 -0
  290. package/templates/optimizations/document-analysis-edge.yaml +77 -0
  291. package/templates/optimizations/document-pipeline-optimization.yaml +78 -0
  292. package/templates/optimizations/domain-specific-distillation.yaml +78 -0
  293. package/templates/optimizations/error-handling-optimization.yaml +76 -0
  294. package/templates/optimizations/gptq-4bit-quantization.yaml +96 -0
  295. package/templates/optimizations/long-context-memory-management.yaml +78 -0
  296. package/templates/optimizations/max-tokens-optimization.yaml +76 -0
  297. package/templates/optimizations/memory-bandwidth-optimization.yaml +73 -0
  298. package/templates/optimizations/multi-framework-resilience.yaml +75 -0
  299. package/templates/optimizations/multi-tenant-optimization.yaml +75 -0
  300. package/templates/optimizations/prompt-caching-optimization.yaml +143 -0
  301. package/templates/optimizations/pytorch-to-onnx-migration.yaml +109 -0
  302. package/templates/optimizations/quality-monitoring.yaml +74 -0
  303. package/templates/optimizations/realtime-budget-controls.yaml +74 -0
  304. package/templates/optimizations/realtime-latency-optimization.yaml +74 -0
  305. package/templates/optimizations/sglang-concurrency-optimization.yaml +78 -0
  306. package/templates/optimizations/smart-model-routing.yaml +96 -0
  307. package/templates/optimizations/streaming-batch-selection.yaml +167 -0
  308. package/templates/optimizations/system-prompt-optimization.yaml +75 -0
  309. package/templates/optimizations/tensorrt-llm-performance.yaml +77 -0
  310. package/templates/optimizations/vllm-high-throughput-optimization.yaml +93 -0
  311. package/templates/optimizations/vllm-migration-memory-bound.yaml +78 -0
  312. package/templates/overpowered-extraction.yaml +32 -0
  313. package/templates/overpowered-model.yaml +31 -0
  314. package/templates/prompt-bloat.yaml +24 -0
  315. package/templates/retry-explosion.yaml +28 -0
  316. package/templates/schema/insight.schema.json +113 -0
  317. package/templates/schema/optimization.schema.json +180 -0
  318. package/templates/streaming-drift.yaml +30 -0
  319. package/templates/throughput-gap.yaml +21 -0
  320. package/templates/token-underutilization.yaml +28 -0
  321. package/templates/untested-fallback.yaml +21 -0
  322. package/tests/accuracy/drift-detection.test.ts +184 -0
  323. package/tests/accuracy/false-positives.test.ts +166 -0
  324. package/tests/accuracy/templates.test.ts +205 -0
  325. package/tests/action/commands.test.ts +125 -0
  326. package/tests/action/comments.test.ts +347 -0
  327. package/tests/cli.test.ts +203 -0
  328. package/tests/comparison.test.ts +309 -0
  329. package/tests/correlation-analyzer.test.ts +534 -0
  330. package/tests/counterfactuals.test.ts +347 -0
  331. package/tests/fixtures/events/missing-id.jsonl +1 -0
  332. package/tests/fixtures/events/missing-input.jsonl +1 -0
  333. package/tests/fixtures/events/missing-latency.jsonl +1 -0
  334. package/tests/fixtures/events/missing-model.jsonl +1 -0
  335. package/tests/fixtures/events/missing-output.jsonl +1 -0
  336. package/tests/fixtures/events/missing-provider.jsonl +1 -0
  337. package/tests/fixtures/events/missing-ts.jsonl +1 -0
  338. package/tests/fixtures/events/valid.csv +3 -0
  339. package/tests/fixtures/events/valid.json +1 -0
  340. package/tests/fixtures/events/valid.jsonl +2 -0
  341. package/tests/fixtures/events/with-callsite.jsonl +1 -0
  342. package/tests/fixtures/events/with-intent.jsonl +1 -0
  343. package/tests/fixtures/events/wrong-type.jsonl +1 -0
  344. package/tests/fixtures/repos/empty/.gitkeep +0 -0
  345. package/tests/fixtures/repos/hybrid-router/router.py +35 -0
  346. package/tests/fixtures/repos/saas-anthropic/agent.ts +27 -0
  347. package/tests/fixtures/repos/saas-openai/assistant.js +33 -0
  348. package/tests/fixtures/repos/saas-openai/client.py +26 -0
  349. package/tests/fixtures/repos/self-hosted-vllm/inference.py +22 -0
  350. package/tests/github-action.test.ts +292 -0
  351. package/tests/insights.test.ts +878 -0
  352. package/tests/joiner.test.ts +168 -0
  353. package/tests/performance/action-latency.test.ts +132 -0
  354. package/tests/performance/benchmark.test.ts +189 -0
  355. package/tests/performance/cli-latency.test.ts +102 -0
  356. package/tests/pr-comment.test.ts +313 -0
  357. package/tests/prediction.test.ts +296 -0
  358. package/tests/runtime-analyzer.test.ts +375 -0
  359. package/tests/runtime.test.ts +205 -0
  360. package/tests/scanner.test.ts +122 -0
  361. package/tests/template-conformance.test.ts +526 -0
  362. package/tests/unit/cost-calculator.test.ts +303 -0
  363. package/tests/unit/credits.test.ts +180 -0
  364. package/tests/unit/inference-map.test.ts +276 -0
  365. package/tests/unit/schema.test.ts +300 -0
  366. package/tsconfig.json +20 -0
  367. package/vitest.config.ts +14 -0
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Shared types for runtime data connectors
3
+ *
4
+ * These types define the normalized format for runtime events
5
+ * from various sources (Helicone, LangSmith, etc.)
6
+ */
7
+ export class ConnectorError extends Error {
8
+ source;
9
+ statusCode;
10
+ code;
11
+ constructor(message, source, statusCode, code) {
12
+ super(message);
13
+ this.source = source;
14
+ this.statusCode = statusCode;
15
+ this.code = code;
16
+ this.name = 'ConnectorError';
17
+ }
18
+ }
19
+ // Helper functions for calculating summary statistics
20
+ export function calculatePercentile(values, percentile) {
21
+ if (values.length === 0)
22
+ return 0;
23
+ const sorted = [...values].sort((a, b) => a - b);
24
+ const index = Math.ceil((percentile / 100) * sorted.length) - 1;
25
+ return sorted[Math.max(0, index)];
26
+ }
27
+ export function calculateSummary(events) {
28
+ if (events.length === 0) {
29
+ return {
30
+ total_requests: 0,
31
+ total_cost_usd: 0,
32
+ avg_latency_ms: 0,
33
+ p50_latency_ms: 0,
34
+ p95_latency_ms: 0,
35
+ p99_latency_ms: 0,
36
+ error_rate: 0,
37
+ streaming_rate: 0,
38
+ by_model: {},
39
+ by_provider: {},
40
+ time_range: { start: '', end: '' },
41
+ };
42
+ }
43
+ const latencies = events.map(e => e.latency_ms).filter(l => l > 0);
44
+ const costs = events.map(e => e.cost_usd || 0);
45
+ const errors = events.filter(e => !e.success).length;
46
+ const streaming = events.filter(e => e.streaming).length;
47
+ // Group by model
48
+ const byModel = {};
49
+ for (const event of events) {
50
+ const model = event.model || 'unknown';
51
+ if (!byModel[model]) {
52
+ byModel[model] = { count: 0, cost: 0, avg_latency_ms: 0, p95_latency_ms: 0, error_rate: 0 };
53
+ }
54
+ byModel[model].count++;
55
+ byModel[model].cost += event.cost_usd || 0;
56
+ }
57
+ // Calculate per-model stats
58
+ for (const model of Object.keys(byModel)) {
59
+ const modelEvents = events.filter(e => (e.model || 'unknown') === model);
60
+ const modelLatencies = modelEvents.map(e => e.latency_ms).filter(l => l > 0);
61
+ const modelErrors = modelEvents.filter(e => !e.success).length;
62
+ byModel[model].avg_latency_ms = modelLatencies.length > 0
63
+ ? Math.round(modelLatencies.reduce((a, b) => a + b, 0) / modelLatencies.length)
64
+ : 0;
65
+ byModel[model].p95_latency_ms = calculatePercentile(modelLatencies, 95);
66
+ byModel[model].error_rate = modelEvents.length > 0 ? modelErrors / modelEvents.length : 0;
67
+ }
68
+ // Group by provider
69
+ const byProvider = {};
70
+ for (const event of events) {
71
+ const provider = event.provider || 'unknown';
72
+ if (!byProvider[provider]) {
73
+ byProvider[provider] = { count: 0, cost: 0 };
74
+ }
75
+ byProvider[provider].count++;
76
+ byProvider[provider].cost += event.cost_usd || 0;
77
+ }
78
+ // Time range
79
+ const timestamps = events.map(e => new Date(e.timestamp).getTime()).filter(t => !isNaN(t));
80
+ const timeRange = {
81
+ start: timestamps.length > 0 ? new Date(Math.min(...timestamps)).toISOString() : '',
82
+ end: timestamps.length > 0 ? new Date(Math.max(...timestamps)).toISOString() : '',
83
+ };
84
+ return {
85
+ total_requests: events.length,
86
+ total_cost_usd: costs.reduce((a, b) => a + b, 0),
87
+ avg_latency_ms: latencies.length > 0 ? Math.round(latencies.reduce((a, b) => a + b, 0) / latencies.length) : 0,
88
+ p50_latency_ms: calculatePercentile(latencies, 50),
89
+ p95_latency_ms: calculatePercentile(latencies, 95),
90
+ p99_latency_ms: calculatePercentile(latencies, 99),
91
+ error_rate: events.length > 0 ? errors / events.length : 0,
92
+ streaming_rate: events.length > 0 ? streaming / events.length : 0,
93
+ by_model: byModel,
94
+ by_provider: byProvider,
95
+ time_range: timeRange,
96
+ };
97
+ }
98
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connectors/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Cost Estimation Module for PeakInfer CLI
3
+ *
4
+ * Estimates LLM API costs before running analysis to prevent surprise bills
5
+ * on large repositories. Uses LiteLLM pricing data with 24hr cache.
6
+ *
7
+ * PRD v1.9.3 Section 2.3: Cost Estimation (Pre-Analysis Transparency)
8
+ */
9
+ export interface CostEstimate {
10
+ model: string;
11
+ filesToScan: number;
12
+ estimatedInputTokens: number;
13
+ estimatedOutputTokens: number;
14
+ inputCost: number;
15
+ outputCost: number;
16
+ totalCost: number;
17
+ pricing: {
18
+ inputPerMillion: number;
19
+ outputPerMillion: number;
20
+ source: 'litellm' | 'fallback';
21
+ };
22
+ warnings: CostWarning[];
23
+ }
24
+ export interface CostWarning {
25
+ level: 'yellow' | 'red' | 'critical';
26
+ message: string;
27
+ }
28
+ /**
29
+ * Estimate the cost of analyzing a codebase before running the analysis.
30
+ *
31
+ * @param path - Path to the codebase to analyze
32
+ * @param options - Optional model override
33
+ * @returns Cost estimate with warnings
34
+ */
35
+ export declare function estimateAnalysisCost(path: string, options?: {
36
+ model?: string;
37
+ }): Promise<CostEstimate>;
38
+ /**
39
+ * Check if estimated cost exceeds a threshold.
40
+ *
41
+ * @param estimate - Cost estimate to check
42
+ * @param maxCost - Maximum allowed cost in USD
43
+ * @returns true if cost exceeds threshold
44
+ */
45
+ export declare function exceedsMaxCost(estimate: CostEstimate, maxCost: number): boolean;
46
+ //# sourceMappingURL=cost-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-estimator.d.ts","sourceRoot":"","sources":["../src/cost-estimator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;KAChC,CAAC;IACF,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AA4BD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,YAAY,CAAC,CA6DvB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE/E"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Cost Estimation Module for PeakInfer CLI
3
+ *
4
+ * Estimates LLM API costs before running analysis to prevent surprise bills
5
+ * on large repositories. Uses LiteLLM pricing data with 24hr cache.
6
+ *
7
+ * PRD v1.9.3 Section 2.3: Cost Estimation (Pre-Analysis Transparency)
8
+ */
9
+ import { scan } from './scanner.js';
10
+ import { loadPricing, getModelCost } from './costs.js';
11
+ // =============================================================================
12
+ // CONSTANTS
13
+ // =============================================================================
14
+ // Token estimation constants (based on empirical analysis of codebases)
15
+ const AVG_TOKENS_PER_FILE = 2000; // Average input tokens per code file
16
+ const AVG_OUTPUT_RATIO = 0.35; // Output tokens as ratio of input
17
+ // Warning thresholds (in USD)
18
+ const WARNING_THRESHOLD_YELLOW = 5;
19
+ const WARNING_THRESHOLD_RED = 20;
20
+ const WARNING_THRESHOLD_CRITICAL = 100;
21
+ // Default model if not specified (matches agent.ts default)
22
+ const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
23
+ // Fallback pricing if LiteLLM fetch fails (Claude Sonnet pricing)
24
+ const FALLBACK_PRICING = {
25
+ input: 3.00, // $3.00 per 1M input tokens
26
+ output: 15.00, // $15.00 per 1M output tokens
27
+ };
28
+ // =============================================================================
29
+ // MAIN FUNCTION
30
+ // =============================================================================
31
+ /**
32
+ * Estimate the cost of analyzing a codebase before running the analysis.
33
+ *
34
+ * @param path - Path to the codebase to analyze
35
+ * @param options - Optional model override
36
+ * @returns Cost estimate with warnings
37
+ */
38
+ export async function estimateAnalysisCost(path, options = {}) {
39
+ const model = options.model || DEFAULT_MODEL;
40
+ // Step 1: Scan codebase to count files
41
+ const scanResult = await scan(path);
42
+ const filesToScan = scanResult.summary.totalFiles;
43
+ // Step 2: Estimate tokens
44
+ const estimatedInputTokens = filesToScan * AVG_TOKENS_PER_FILE;
45
+ const estimatedOutputTokens = Math.round(estimatedInputTokens * AVG_OUTPUT_RATIO);
46
+ // Step 3: Load pricing data
47
+ await loadPricing();
48
+ const modelCost = getModelCost(model);
49
+ // Determine if using LiteLLM or fallback
50
+ const useFallback = modelCost.input === 0 && modelCost.output === 0;
51
+ const pricing = useFallback
52
+ ? { input: FALLBACK_PRICING.input, output: FALLBACK_PRICING.output }
53
+ : { input: modelCost.input, output: modelCost.output };
54
+ // Step 4: Calculate costs
55
+ const inputCost = (estimatedInputTokens * pricing.input) / 1_000_000;
56
+ const outputCost = (estimatedOutputTokens * pricing.output) / 1_000_000;
57
+ const totalCost = inputCost + outputCost;
58
+ // Step 5: Generate warnings based on cost
59
+ const warnings = [];
60
+ if (totalCost > WARNING_THRESHOLD_CRITICAL) {
61
+ warnings.push({
62
+ level: 'critical',
63
+ message: 'Very high cost estimate. Strongly recommend limiting scope.',
64
+ });
65
+ }
66
+ else if (totalCost > WARNING_THRESHOLD_RED) {
67
+ warnings.push({
68
+ level: 'red',
69
+ message: 'High cost estimate. Consider analyzing a subdirectory.',
70
+ });
71
+ }
72
+ else if (totalCost > WARNING_THRESHOLD_YELLOW) {
73
+ warnings.push({
74
+ level: 'yellow',
75
+ message: 'Moderate cost. Consider analyzing a subdirectory for faster results.',
76
+ });
77
+ }
78
+ return {
79
+ model,
80
+ filesToScan,
81
+ estimatedInputTokens,
82
+ estimatedOutputTokens,
83
+ inputCost,
84
+ outputCost,
85
+ totalCost,
86
+ pricing: {
87
+ inputPerMillion: pricing.input,
88
+ outputPerMillion: pricing.output,
89
+ source: useFallback ? 'fallback' : 'litellm',
90
+ },
91
+ warnings,
92
+ };
93
+ }
94
+ /**
95
+ * Check if estimated cost exceeds a threshold.
96
+ *
97
+ * @param estimate - Cost estimate to check
98
+ * @param maxCost - Maximum allowed cost in USD
99
+ * @returns true if cost exceeds threshold
100
+ */
101
+ export function exceedsMaxCost(estimate, maxCost) {
102
+ return estimate.totalCost > maxCost;
103
+ }
104
+ //# sourceMappingURL=cost-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-estimator.js","sourceRoot":"","sources":["../src/cost-estimator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export interface ModelCost {
2
+ input: number;
3
+ output: number;
4
+ }
5
+ export interface PricingProvider {
6
+ name: string;
7
+ fetch(): Promise<Record<string, ModelCost>>;
8
+ }
9
+ /**
10
+ * Set a custom pricing provider.
11
+ * Call this before loadPricing() to use a different data source.
12
+ *
13
+ * Example:
14
+ * setPricingProvider({ name: 'local', fetch: async () => ({ ... }) });
15
+ */
16
+ export declare function setPricingProvider(provider: PricingProvider): void;
17
+ export declare function isCacheValid(): boolean;
18
+ export declare function loadPricing(): Promise<void>;
19
+ export declare function getModelCost(model: string): ModelCost;
20
+ export declare function calculateCost(model: string, inputTokens: number, outputTokens: number): number;
21
+ export declare function setTestPricing(data: Record<string, {
22
+ input: number;
23
+ output: number;
24
+ }>): void;
25
+ /**
26
+ * Pricing tier classification based on cost per 1M tokens
27
+ */
28
+ export type PricingTier = 'expensive' | 'moderate' | 'cheap' | 'unknown';
29
+ /**
30
+ * Classify a model into pricing tiers
31
+ */
32
+ export declare function classifyModelCost(model: string): PricingTier;
33
+ /**
34
+ * Get pricing context for LLM analysis
35
+ * Returns a condensed pricing map for models used in the data
36
+ */
37
+ export interface PricingContext {
38
+ models: Record<string, {
39
+ input: number;
40
+ output: number;
41
+ tier: PricingTier;
42
+ }>;
43
+ thresholds: {
44
+ expensive: number;
45
+ moderate: number;
46
+ };
47
+ }
48
+ export declare function getPricingContext(models: string[]): PricingContext;
49
+ /**
50
+ * Calculate total cost for a set of events
51
+ */
52
+ export declare function calculateTotalCost(events: Array<{
53
+ model: string;
54
+ input_tokens: number;
55
+ output_tokens: number;
56
+ }>): number;
57
+ //# sourceMappingURL=costs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.d.ts","sourceRoot":"","sources":["../src/costs.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAcD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CAC7C;AAqFD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAIlE;AAqCD,wBAAgB,YAAY,IAAI,OAAO,CAKtC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA0CjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAmCrD;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAGR;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAM5F;AAMD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAKzE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAgB5D;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,WAAW,CAAC;KACnB,CAAC,CAAC;IACH,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAmBlE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,GAAG,MAAM,CAIV"}
package/dist/costs.js ADDED
@@ -0,0 +1,251 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ // =============================================================================
4
+ // LITELLM PROVIDER (Default)
5
+ // =============================================================================
6
+ const LITELLM_PRICING_URL = 'https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json';
7
+ function normalizeLiteLLMPricing(litellmData) {
8
+ const result = {};
9
+ for (const [model, info] of Object.entries(litellmData)) {
10
+ if (typeof info !== 'object' || info === null)
11
+ continue;
12
+ const data = info;
13
+ const inputCost = data.input_cost_per_token;
14
+ const outputCost = data.output_cost_per_token;
15
+ if (typeof inputCost === 'number' && typeof outputCost === 'number') {
16
+ // Convert per-token to per-1M-tokens
17
+ result[model] = {
18
+ input: inputCost * 1_000_000,
19
+ output: outputCost * 1_000_000,
20
+ };
21
+ }
22
+ }
23
+ return result;
24
+ }
25
+ const litellmProvider = {
26
+ name: 'litellm',
27
+ async fetch() {
28
+ const response = await fetch(LITELLM_PRICING_URL);
29
+ if (!response.ok) {
30
+ throw new Error(`HTTP ${response.status}`);
31
+ }
32
+ const rawData = await response.json();
33
+ return normalizeLiteLLMPricing(rawData);
34
+ },
35
+ };
36
+ // =============================================================================
37
+ // LOCAL PROVIDER (Ready for future use)
38
+ // =============================================================================
39
+ // Uncomment and populate to use local pricing instead of LiteLLM.
40
+ // Then call: setPricingProvider(localProvider)
41
+ /*
42
+ const localProvider: PricingProvider = {
43
+ name: 'local',
44
+ async fetch(): Promise<Record<string, ModelCost>> {
45
+ // Local pricing data - $/1M tokens
46
+ return {
47
+ 'gpt-4o': { input: 2.50, output: 10.00 },
48
+ 'gpt-4o-mini': { input: 0.15, output: 0.60 },
49
+ 'gpt-4-turbo': { input: 10.00, output: 30.00 },
50
+ 'claude-3-5-sonnet': { input: 3.00, output: 15.00 },
51
+ 'claude-3-haiku': { input: 0.25, output: 1.25 },
52
+ 'claude-sonnet-4-20250514': { input: 3.00, output: 15.00 },
53
+ // Add more models as needed
54
+ };
55
+ },
56
+ };
57
+ */
58
+ // =============================================================================
59
+ // CONSTANTS
60
+ // =============================================================================
61
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
62
+ const CACHE_DIR = '.peakinfer/cache';
63
+ const CACHE_FILE = 'pricing.json';
64
+ // =============================================================================
65
+ // STATE
66
+ // =============================================================================
67
+ let pricingCache = null;
68
+ let activeProvider = litellmProvider;
69
+ // =============================================================================
70
+ // PROVIDER MANAGEMENT
71
+ // =============================================================================
72
+ /**
73
+ * Set a custom pricing provider.
74
+ * Call this before loadPricing() to use a different data source.
75
+ *
76
+ * Example:
77
+ * setPricingProvider({ name: 'local', fetch: async () => ({ ... }) });
78
+ */
79
+ export function setPricingProvider(provider) {
80
+ activeProvider = provider;
81
+ // Invalidate cache when provider changes
82
+ pricingCache = null;
83
+ }
84
+ // =============================================================================
85
+ // HELPERS
86
+ // =============================================================================
87
+ function getCachePath() {
88
+ return join(process.cwd(), CACHE_DIR, CACHE_FILE);
89
+ }
90
+ function loadCacheFromDisk() {
91
+ const cachePath = getCachePath();
92
+ if (!existsSync(cachePath)) {
93
+ return null;
94
+ }
95
+ try {
96
+ const raw = readFileSync(cachePath, 'utf-8');
97
+ return JSON.parse(raw);
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ function saveCacheToDisk(cache) {
104
+ const cachePath = getCachePath();
105
+ const cacheDir = join(process.cwd(), CACHE_DIR);
106
+ if (!existsSync(cacheDir)) {
107
+ mkdirSync(cacheDir, { recursive: true });
108
+ }
109
+ writeFileSync(cachePath, JSON.stringify(cache, null, 2));
110
+ }
111
+ // =============================================================================
112
+ // PUBLIC API
113
+ // =============================================================================
114
+ export function isCacheValid() {
115
+ if (!pricingCache)
116
+ return false;
117
+ // Also invalidate if provider changed
118
+ if (pricingCache.source !== activeProvider.name)
119
+ return false;
120
+ return Date.now() - pricingCache.fetchedAt < CACHE_TTL_MS;
121
+ }
122
+ export async function loadPricing() {
123
+ // Check memory cache
124
+ if (isCacheValid()) {
125
+ return;
126
+ }
127
+ // Check disk cache (only if same provider)
128
+ const diskCache = loadCacheFromDisk();
129
+ if (diskCache &&
130
+ diskCache.source === activeProvider.name &&
131
+ Date.now() - diskCache.fetchedAt < CACHE_TTL_MS) {
132
+ pricingCache = diskCache;
133
+ return;
134
+ }
135
+ // Fetch from active provider
136
+ try {
137
+ const data = await activeProvider.fetch();
138
+ pricingCache = {
139
+ data,
140
+ fetchedAt: Date.now(),
141
+ source: activeProvider.name,
142
+ };
143
+ saveCacheToDisk(pricingCache);
144
+ }
145
+ catch (error) {
146
+ // Fall back to stale cache if available and same provider
147
+ if (diskCache && diskCache.source === activeProvider.name) {
148
+ console.warn(`[costs] Failed to fetch from ${activeProvider.name}, using stale cache`);
149
+ pricingCache = diskCache;
150
+ return;
151
+ }
152
+ // No cache at all - use empty with warning
153
+ console.warn(`[costs] Failed to fetch from ${activeProvider.name}, no cache available`);
154
+ pricingCache = {
155
+ data: {},
156
+ fetchedAt: Date.now(),
157
+ source: activeProvider.name,
158
+ };
159
+ }
160
+ }
161
+ export function getModelCost(model) {
162
+ if (!pricingCache) {
163
+ return { input: 0, output: 0 };
164
+ }
165
+ // Try exact match
166
+ if (pricingCache.data[model]) {
167
+ return pricingCache.data[model];
168
+ }
169
+ // Try with provider prefix variations
170
+ const variations = [
171
+ model,
172
+ `openai/${model}`,
173
+ `anthropic/${model}`,
174
+ `azure/${model}`,
175
+ `together_ai/${model}`,
176
+ `fireworks_ai/${model}`,
177
+ ];
178
+ for (const variant of variations) {
179
+ if (pricingCache.data[variant]) {
180
+ return pricingCache.data[variant];
181
+ }
182
+ }
183
+ // Try partial match (model name contains)
184
+ const lowerModel = model.toLowerCase();
185
+ for (const [key, cost] of Object.entries(pricingCache.data)) {
186
+ if (key.toLowerCase().includes(lowerModel)) {
187
+ return cost;
188
+ }
189
+ }
190
+ return { input: 0, output: 0 };
191
+ }
192
+ export function calculateCost(model, inputTokens, outputTokens) {
193
+ const cost = getModelCost(model);
194
+ return (inputTokens * cost.input + outputTokens * cost.output) / 1_000_000;
195
+ }
196
+ export function setTestPricing(data) {
197
+ pricingCache = {
198
+ data,
199
+ fetchedAt: Date.now(),
200
+ source: 'test',
201
+ };
202
+ }
203
+ const EXPENSIVE_THRESHOLD = 10.0; // >$10/1M = expensive
204
+ const MODERATE_THRESHOLD = 1.0; // $1-10/1M = moderate
205
+ /**
206
+ * Classify a model into pricing tiers
207
+ */
208
+ export function classifyModelCost(model) {
209
+ const cost = getModelCost(model);
210
+ if (cost.input === 0 && cost.output === 0) {
211
+ return 'unknown';
212
+ }
213
+ // Use average of input/output cost for classification
214
+ const avgCost = (cost.input + cost.output) / 2;
215
+ if (avgCost > EXPENSIVE_THRESHOLD) {
216
+ return 'expensive';
217
+ }
218
+ else if (avgCost > MODERATE_THRESHOLD) {
219
+ return 'moderate';
220
+ }
221
+ else {
222
+ return 'cheap';
223
+ }
224
+ }
225
+ export function getPricingContext(models) {
226
+ const result = {
227
+ models: {},
228
+ thresholds: {
229
+ expensive: EXPENSIVE_THRESHOLD,
230
+ moderate: MODERATE_THRESHOLD,
231
+ },
232
+ };
233
+ for (const model of models) {
234
+ const cost = getModelCost(model);
235
+ result.models[model] = {
236
+ input: cost.input,
237
+ output: cost.output,
238
+ tier: classifyModelCost(model),
239
+ };
240
+ }
241
+ return result;
242
+ }
243
+ /**
244
+ * Calculate total cost for a set of events
245
+ */
246
+ export function calculateTotalCost(events) {
247
+ return events.reduce((total, event) => {
248
+ return total + calculateCost(event.model, event.input_tokens, event.output_tokens);
249
+ }, 0);
250
+ }
251
+ //# sourceMappingURL=costs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.js","sourceRoot":"","sources":["../src/costs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Counterfactual Insights Module (v1.5)
3
+ *
4
+ * Generates "what if" optimization scenarios for inference points based on:
5
+ * - Model alternatives (cheaper/faster models)
6
+ * - Pattern opportunities (batching, caching, streaming)
7
+ * - Provider alternatives (cloud vs self-hosted)
8
+ *
9
+ * Shows the road not taken and its potential impact,
10
+ * enabling informed optimization decisions.
11
+ */
12
+ import type { InferenceMap, Counterfactual, CounterfactualResult } from './types.js';
13
+ /**
14
+ * Generate counterfactual insights for inference points.
15
+ */
16
+ export declare function generateCounterfactuals(inferenceMap: InferenceMap): CounterfactualResult;
17
+ /**
18
+ * Format counterfactual summary for display.
19
+ */
20
+ export declare function formatCounterfactualSummary(result: CounterfactualResult): string;
21
+ /**
22
+ * Check if there are significant counterfactual opportunities.
23
+ */
24
+ export declare function hasSignificantOpportunities(result: CounterfactualResult): boolean;
25
+ /**
26
+ * Rank counterfactuals by a specific priority.
27
+ */
28
+ export declare function rankCounterfactuals(result: CounterfactualResult, priority: 'latency' | 'cost' | 'balanced'): Counterfactual[];
29
+ //# sourceMappingURL=counterfactuals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counterfactuals.d.ts","sourceRoot":"","sources":["../src/counterfactuals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAEV,YAAY,EACZ,cAAc,EACd,oBAAoB,EAKrB,MAAM,YAAY,CAAC;AA4XpB;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,oBAAoB,CAqBxF;AAuCD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAehF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAGjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,GACxC,cAAc,EAAE,CAiBlB"}