cost-katana 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +550 -0
  3. package/dist/analyzers/cost-analyzer.d.ts +28 -0
  4. package/dist/analyzers/cost-analyzer.d.ts.map +1 -0
  5. package/dist/analyzers/cost-analyzer.js +165 -0
  6. package/dist/analyzers/cost-analyzer.js.map +1 -0
  7. package/dist/analyzers/token-counter.d.ts +21 -0
  8. package/dist/analyzers/token-counter.d.ts.map +1 -0
  9. package/dist/analyzers/token-counter.js +100 -0
  10. package/dist/analyzers/token-counter.js.map +1 -0
  11. package/dist/analyzers/usage-tracker.d.ts +29 -0
  12. package/dist/analyzers/usage-tracker.d.ts.map +1 -0
  13. package/dist/analyzers/usage-tracker.js +142 -0
  14. package/dist/analyzers/usage-tracker.js.map +1 -0
  15. package/dist/config/default.d.ts +45 -0
  16. package/dist/config/default.d.ts.map +1 -0
  17. package/dist/config/default.js +103 -0
  18. package/dist/config/default.js.map +1 -0
  19. package/dist/config/model-types.d.ts +45 -0
  20. package/dist/config/model-types.d.ts.map +1 -0
  21. package/dist/config/model-types.js +101 -0
  22. package/dist/config/model-types.js.map +1 -0
  23. package/dist/config/pricing/anthropic.d.ts +3 -0
  24. package/dist/config/pricing/anthropic.d.ts.map +1 -0
  25. package/dist/config/pricing/anthropic.js +191 -0
  26. package/dist/config/pricing/anthropic.js.map +1 -0
  27. package/dist/config/pricing/aws-bedrock.d.ts +3 -0
  28. package/dist/config/pricing/aws-bedrock.d.ts.map +1 -0
  29. package/dist/config/pricing/aws-bedrock.js +747 -0
  30. package/dist/config/pricing/aws-bedrock.js.map +1 -0
  31. package/dist/config/pricing/cohere.d.ts +3 -0
  32. package/dist/config/pricing/cohere.d.ts.map +1 -0
  33. package/dist/config/pricing/cohere.js +371 -0
  34. package/dist/config/pricing/cohere.js.map +1 -0
  35. package/dist/config/pricing/deepseek.d.ts +3 -0
  36. package/dist/config/pricing/deepseek.d.ts.map +1 -0
  37. package/dist/config/pricing/deepseek.js +102 -0
  38. package/dist/config/pricing/deepseek.js.map +1 -0
  39. package/dist/config/pricing/google.d.ts +3 -0
  40. package/dist/config/pricing/google.d.ts.map +1 -0
  41. package/dist/config/pricing/google.js +671 -0
  42. package/dist/config/pricing/google.js.map +1 -0
  43. package/dist/config/pricing/grok.d.ts +3 -0
  44. package/dist/config/pricing/grok.d.ts.map +1 -0
  45. package/dist/config/pricing/grok.js +59 -0
  46. package/dist/config/pricing/grok.js.map +1 -0
  47. package/dist/config/pricing/index.d.ts +11 -0
  48. package/dist/config/pricing/index.d.ts.map +1 -0
  49. package/dist/config/pricing/index.js +24 -0
  50. package/dist/config/pricing/index.js.map +1 -0
  51. package/dist/config/pricing/meta.d.ts +3 -0
  52. package/dist/config/pricing/meta.d.ts.map +1 -0
  53. package/dist/config/pricing/meta.js +69 -0
  54. package/dist/config/pricing/meta.js.map +1 -0
  55. package/dist/config/pricing/mistral.d.ts +3 -0
  56. package/dist/config/pricing/mistral.d.ts.map +1 -0
  57. package/dist/config/pricing/mistral.js +690 -0
  58. package/dist/config/pricing/mistral.js.map +1 -0
  59. package/dist/config/pricing/openai.d.ts +3 -0
  60. package/dist/config/pricing/openai.d.ts.map +1 -0
  61. package/dist/config/pricing/openai.js +475 -0
  62. package/dist/config/pricing/openai.js.map +1 -0
  63. package/dist/config/pricing/xai.d.ts +3 -0
  64. package/dist/config/pricing/xai.d.ts.map +1 -0
  65. package/dist/config/pricing/xai.js +141 -0
  66. package/dist/config/pricing/xai.js.map +1 -0
  67. package/dist/config/pricing-data.d.ts +55 -0
  68. package/dist/config/pricing-data.d.ts.map +1 -0
  69. package/dist/config/pricing-data.js +179 -0
  70. package/dist/config/pricing-data.js.map +1 -0
  71. package/dist/feedback/client.d.ts +14 -0
  72. package/dist/feedback/client.d.ts.map +1 -0
  73. package/dist/feedback/client.js +95 -0
  74. package/dist/feedback/client.js.map +1 -0
  75. package/dist/feedback/index.d.ts +3 -0
  76. package/dist/feedback/index.d.ts.map +1 -0
  77. package/dist/feedback/index.js +21 -0
  78. package/dist/feedback/index.js.map +1 -0
  79. package/dist/gateway/client.d.ts +77 -0
  80. package/dist/gateway/client.d.ts.map +1 -0
  81. package/dist/gateway/client.js +630 -0
  82. package/dist/gateway/client.js.map +1 -0
  83. package/dist/gateway/index.d.ts +9 -0
  84. package/dist/gateway/index.d.ts.map +1 -0
  85. package/dist/gateway/index.js +66 -0
  86. package/dist/gateway/index.js.map +1 -0
  87. package/dist/index.d.ts +183 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +1438 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/optimizers/context-trimmer.d.ts +18 -0
  92. package/dist/optimizers/context-trimmer.d.ts.map +1 -0
  93. package/dist/optimizers/context-trimmer.js +221 -0
  94. package/dist/optimizers/context-trimmer.js.map +1 -0
  95. package/dist/optimizers/index.d.ts +6 -0
  96. package/dist/optimizers/index.d.ts.map +1 -0
  97. package/dist/optimizers/index.js +14 -0
  98. package/dist/optimizers/index.js.map +1 -0
  99. package/dist/optimizers/prompt-compressor.d.ts +15 -0
  100. package/dist/optimizers/prompt-compressor.d.ts.map +1 -0
  101. package/dist/optimizers/prompt-compressor.js +268 -0
  102. package/dist/optimizers/prompt-compressor.js.map +1 -0
  103. package/dist/optimizers/prompt-optimizer.d.ts +29 -0
  104. package/dist/optimizers/prompt-optimizer.d.ts.map +1 -0
  105. package/dist/optimizers/prompt-optimizer.js +381 -0
  106. package/dist/optimizers/prompt-optimizer.js.map +1 -0
  107. package/dist/optimizers/request-fusion.d.ts +34 -0
  108. package/dist/optimizers/request-fusion.d.ts.map +1 -0
  109. package/dist/optimizers/request-fusion.js +284 -0
  110. package/dist/optimizers/request-fusion.js.map +1 -0
  111. package/dist/optimizers/suggestion-engine.d.ts +29 -0
  112. package/dist/optimizers/suggestion-engine.d.ts.map +1 -0
  113. package/dist/optimizers/suggestion-engine.js +234 -0
  114. package/dist/optimizers/suggestion-engine.js.map +1 -0
  115. package/dist/providers/anthropic.d.ts +23 -0
  116. package/dist/providers/anthropic.d.ts.map +1 -0
  117. package/dist/providers/anthropic.js +108 -0
  118. package/dist/providers/anthropic.js.map +1 -0
  119. package/dist/providers/azure.d.ts +15 -0
  120. package/dist/providers/azure.d.ts.map +1 -0
  121. package/dist/providers/azure.js +115 -0
  122. package/dist/providers/azure.js.map +1 -0
  123. package/dist/providers/base.d.ts +20 -0
  124. package/dist/providers/base.d.ts.map +1 -0
  125. package/dist/providers/base.js +67 -0
  126. package/dist/providers/base.js.map +1 -0
  127. package/dist/providers/bedrock.d.ts +23 -0
  128. package/dist/providers/bedrock.d.ts.map +1 -0
  129. package/dist/providers/bedrock.js +247 -0
  130. package/dist/providers/bedrock.js.map +1 -0
  131. package/dist/providers/cohere.d.ts +17 -0
  132. package/dist/providers/cohere.d.ts.map +1 -0
  133. package/dist/providers/cohere.js +122 -0
  134. package/dist/providers/cohere.js.map +1 -0
  135. package/dist/providers/deepseek.d.ts +6 -0
  136. package/dist/providers/deepseek.d.ts.map +1 -0
  137. package/dist/providers/deepseek.js +17 -0
  138. package/dist/providers/deepseek.js.map +1 -0
  139. package/dist/providers/google.d.ts +17 -0
  140. package/dist/providers/google.d.ts.map +1 -0
  141. package/dist/providers/google.js +141 -0
  142. package/dist/providers/google.js.map +1 -0
  143. package/dist/providers/index.d.ts +13 -0
  144. package/dist/providers/index.d.ts.map +1 -0
  145. package/dist/providers/index.js +61 -0
  146. package/dist/providers/index.js.map +1 -0
  147. package/dist/providers/openai.d.ts +16 -0
  148. package/dist/providers/openai.d.ts.map +1 -0
  149. package/dist/providers/openai.js +194 -0
  150. package/dist/providers/openai.js.map +1 -0
  151. package/dist/trace/client.d.ts +48 -0
  152. package/dist/trace/client.d.ts.map +1 -0
  153. package/dist/trace/client.js +130 -0
  154. package/dist/trace/client.js.map +1 -0
  155. package/dist/trace/index.d.ts +7 -0
  156. package/dist/trace/index.d.ts.map +1 -0
  157. package/dist/trace/index.js +30 -0
  158. package/dist/trace/index.js.map +1 -0
  159. package/dist/trace/middleware.d.ts +70 -0
  160. package/dist/trace/middleware.d.ts.map +1 -0
  161. package/dist/trace/middleware.js +104 -0
  162. package/dist/trace/middleware.js.map +1 -0
  163. package/dist/trace/providers.d.ts +83 -0
  164. package/dist/trace/providers.d.ts.map +1 -0
  165. package/dist/trace/providers.js +340 -0
  166. package/dist/trace/providers.js.map +1 -0
  167. package/dist/trace/service.d.ts +59 -0
  168. package/dist/trace/service.d.ts.map +1 -0
  169. package/dist/trace/service.js +425 -0
  170. package/dist/trace/service.js.map +1 -0
  171. package/dist/trace/types.d.ts +102 -0
  172. package/dist/trace/types.d.ts.map +1 -0
  173. package/dist/trace/types.js +3 -0
  174. package/dist/trace/types.js.map +1 -0
  175. package/dist/types/failover.d.ts +29 -0
  176. package/dist/types/failover.d.ts.map +1 -0
  177. package/dist/types/failover.js +3 -0
  178. package/dist/types/failover.js.map +1 -0
  179. package/dist/types/feedback.d.ts +69 -0
  180. package/dist/types/feedback.d.ts.map +1 -0
  181. package/dist/types/feedback.js +3 -0
  182. package/dist/types/feedback.js.map +1 -0
  183. package/dist/types/gateway.d.ts +303 -0
  184. package/dist/types/gateway.d.ts.map +1 -0
  185. package/dist/types/gateway.js +3 -0
  186. package/dist/types/gateway.js.map +1 -0
  187. package/dist/types/index.d.ts +242 -0
  188. package/dist/types/index.d.ts.map +1 -0
  189. package/dist/types/index.js +37 -0
  190. package/dist/types/index.js.map +1 -0
  191. package/dist/types/models.d.ts +7 -0
  192. package/dist/types/models.d.ts.map +1 -0
  193. package/dist/types/models.js +3838 -0
  194. package/dist/types/models.js.map +1 -0
  195. package/dist/types/providers.d.ts +128 -0
  196. package/dist/types/providers.d.ts.map +1 -0
  197. package/dist/types/providers.js +10 -0
  198. package/dist/types/providers.js.map +1 -0
  199. package/dist/types/simplified.d.ts +65 -0
  200. package/dist/types/simplified.d.ts.map +1 -0
  201. package/dist/types/simplified.js +4 -0
  202. package/dist/types/simplified.js.map +1 -0
  203. package/dist/utils/logger.d.ts +35 -0
  204. package/dist/utils/logger.d.ts.map +1 -0
  205. package/dist/utils/logger.js +154 -0
  206. package/dist/utils/logger.js.map +1 -0
  207. package/dist/utils/pricing.d.ts +30 -0
  208. package/dist/utils/pricing.d.ts.map +1 -0
  209. package/dist/utils/pricing.js +148 -0
  210. package/dist/utils/pricing.js.map +1 -0
  211. package/dist/utils/validators.d.ts +10 -0
  212. package/dist/utils/validators.d.ts.map +1 -0
  213. package/dist/utils/validators.js +133 -0
  214. package/dist/utils/validators.js.map +1 -0
  215. package/package.json +92 -0
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateCost = calculateCost;
4
+ exports.estimateMonthlyCost = estimateMonthlyCost;
5
+ exports.compareCosts = compareCosts;
6
+ exports.calculateROI = calculateROI;
7
+ exports.formatCurrency = formatCurrency;
8
+ exports.calculateBatchingEconomics = calculateBatchingEconomics;
9
+ const providers_1 = require("../types/providers");
10
+ function toPricingUnit(unit) {
11
+ switch (unit) {
12
+ case 'per-token':
13
+ return providers_1.PricingUnit.PerToken;
14
+ case 'per-1k-tokens':
15
+ return providers_1.PricingUnit.Per1KTokens;
16
+ case 'per-1m-tokens':
17
+ return providers_1.PricingUnit.Per1MTokens;
18
+ default:
19
+ throw new Error(`Unknown pricing unit: ${unit}`);
20
+ }
21
+ }
22
+ function calculateCost(promptTokens, completionTokens, model, customPricing) {
23
+ const custom = customPricing?.[model.id];
24
+ const isCustom = !!custom;
25
+ const pricing = isCustom ? custom : model.pricing;
26
+ let unit;
27
+ if (isCustom) {
28
+ unit = toPricingUnit(custom.unit);
29
+ }
30
+ else {
31
+ unit = pricing.unit;
32
+ }
33
+ const promptUnits = convertTokensToUnit(promptTokens, unit);
34
+ const completionUnits = convertTokensToUnit(completionTokens, unit);
35
+ const promptCost = isCustom
36
+ ? promptUnits * custom.promptPrice
37
+ : promptUnits * pricing.prompt;
38
+ const completionCost = isCustom
39
+ ? completionUnits * custom.completionPrice
40
+ : completionUnits * pricing.completion;
41
+ const totalCost = promptCost + completionCost;
42
+ return {
43
+ promptCost,
44
+ completionCost,
45
+ totalCost,
46
+ currency: isCustom
47
+ ? model.pricing.currency || 'USD'
48
+ : pricing.currency,
49
+ breakdown: {
50
+ promptTokens,
51
+ completionTokens,
52
+ pricePerPromptToken: isCustom
53
+ ? custom.promptPrice / getUnitMultiplier(unit)
54
+ : pricing.prompt / getUnitMultiplier(unit),
55
+ pricePerCompletionToken: isCustom
56
+ ? custom.completionPrice / getUnitMultiplier(unit)
57
+ : pricing.completion / getUnitMultiplier(unit)
58
+ }
59
+ };
60
+ }
61
+ function convertTokensToUnit(tokens, unit) {
62
+ switch (unit) {
63
+ case providers_1.PricingUnit.PerToken:
64
+ return tokens;
65
+ case providers_1.PricingUnit.Per1KTokens:
66
+ return tokens / 1000;
67
+ case providers_1.PricingUnit.Per1MTokens:
68
+ return tokens / 1000000;
69
+ default:
70
+ throw new Error(`Unknown pricing unit: ${unit}`);
71
+ }
72
+ }
73
+ function getUnitMultiplier(unit) {
74
+ switch (unit) {
75
+ case providers_1.PricingUnit.PerToken:
76
+ return 1;
77
+ case providers_1.PricingUnit.Per1KTokens:
78
+ return 1000;
79
+ case providers_1.PricingUnit.Per1MTokens:
80
+ return 1000000;
81
+ default:
82
+ return 1;
83
+ }
84
+ }
85
+ function estimateMonthlyCost(dailyRequests, avgPromptTokens, avgCompletionTokens, model, customPricing) {
86
+ const singleRequestCost = calculateCost(avgPromptTokens, avgCompletionTokens, model, customPricing);
87
+ const daily = singleRequestCost.totalCost * dailyRequests;
88
+ const weekly = daily * 7;
89
+ const monthly = daily * 30;
90
+ const yearly = daily * 365;
91
+ return {
92
+ daily,
93
+ weekly,
94
+ monthly,
95
+ yearly,
96
+ breakdown: singleRequestCost
97
+ };
98
+ }
99
+ function compareCosts(promptTokens, completionTokens, models, customPricing) {
100
+ const results = models.map(model => ({
101
+ model: model.id,
102
+ provider: model.provider,
103
+ cost: calculateCost(promptTokens, completionTokens, model, customPricing)
104
+ }));
105
+ const highestCost = Math.max(...results.map(r => r.cost.totalCost));
106
+ return results
107
+ .map(result => ({
108
+ ...result,
109
+ savingsVsHighest: ((highestCost - result.cost.totalCost) / highestCost) * 100
110
+ }))
111
+ .sort((a, b) => a.cost.totalCost - b.cost.totalCost);
112
+ }
113
+ function calculateROI(implementationCost, currentMonthlyCost, optimizedMonthlyCost, months = 12) {
114
+ const monthlySavings = currentMonthlyCost - optimizedMonthlyCost;
115
+ const paybackPeriod = implementationCost / monthlySavings;
116
+ const totalSavings = monthlySavings * months - implementationCost;
117
+ const roi = (totalSavings / implementationCost) * 100;
118
+ return {
119
+ monthlySavings,
120
+ paybackPeriod,
121
+ totalSavings,
122
+ roi
123
+ };
124
+ }
125
+ function formatCurrency(amount, currency = 'USD', locale = 'en-US') {
126
+ return new Intl.NumberFormat(locale, {
127
+ style: 'currency',
128
+ currency,
129
+ minimumFractionDigits: 2,
130
+ maximumFractionDigits: 4
131
+ }).format(amount);
132
+ }
133
+ function calculateBatchingEconomics(individualRequests, tokensPerRequest, batchSize, model, overheadTokensPerBatch = 50) {
134
+ const totalIndividualTokens = individualRequests * tokensPerRequest;
135
+ const numberOfBatches = Math.ceil(individualRequests / batchSize);
136
+ const batchedTokens = totalIndividualTokens + numberOfBatches * overheadTokensPerBatch;
137
+ const individualCost = calculateCost(totalIndividualTokens, 0, model).totalCost;
138
+ const batchedCost = calculateCost(batchedTokens, 0, model).totalCost;
139
+ const savings = individualCost - batchedCost;
140
+ const savingsPercentage = (savings / individualCost) * 100;
141
+ return {
142
+ individualCost,
143
+ batchedCost,
144
+ savings,
145
+ savingsPercentage
146
+ };
147
+ }
148
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/utils/pricing.ts"],"names":[],"mappings":";;AAgBA,sCAkDC;AA4BD,kDAgCC;AAED,oCAyBC;AAED,oCAsBC;AAED,wCAWC;AAED,gEA6BC;AA5ND,kDAAgE;AAEhE,SAAS,aAAa,CAAC,IAAY;IACjC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,uBAAW,CAAC,QAAQ,CAAC;QAC9B,KAAK,eAAe;YAClB,OAAO,uBAAW,CAAC,WAAW,CAAC;QACjC,KAAK,eAAe;YAClB,OAAO,uBAAW,CAAC,WAAW,CAAC;QACjC;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAC3B,YAAoB,EACpB,gBAAwB,EACxB,KAAoB,EACpB,aAA6B;IAG7B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAGlD,IAAI,IAAiB,CAAC;IACtB,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,IAAI,GAAI,OAAgC,CAAC,IAAI,CAAC;IAChD,CAAC;IAGD,MAAM,WAAW,GAAG,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAGpE,MAAM,UAAU,GAAG,QAAQ;QACzB,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;QAClC,CAAC,CAAC,WAAW,GAAI,OAAgC,CAAC,MAAM,CAAC;IAC3D,MAAM,cAAc,GAAG,QAAQ;QAC7B,CAAC,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;QAC1C,CAAC,CAAC,eAAe,GAAI,OAAgC,CAAC,UAAU,CAAC;IACnE,MAAM,SAAS,GAAG,UAAU,GAAG,cAAc,CAAC;IAE9C,OAAO;QACL,UAAU;QACV,cAAc;QACd,SAAS;QACT,QAAQ,EAAE,QAAQ;YAChB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,KAAK;YACjC,CAAC,CAAE,OAAgC,CAAC,QAAQ;QAC9C,SAAS,EAAE;YACT,YAAY;YACZ,gBAAgB;YAChB,mBAAmB,EAAE,QAAQ;gBAC3B,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC;gBAC9C,CAAC,CAAE,OAAgC,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC;YACtE,uBAAuB,EAAE,QAAQ;gBAC/B,CAAC,CAAC,MAAM,CAAC,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC;gBAClD,CAAC,CAAE,OAAgC,CAAC,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC;SAC3E;KACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,IAAiB;IAC5D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,uBAAW,CAAC,QAAQ;YACvB,OAAO,MAAM,CAAC;QAChB,KAAK,uBAAW,CAAC,WAAW;YAC1B,OAAO,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,uBAAW,CAAC,WAAW;YAC1B,OAAO,MAAM,GAAG,OAAO,CAAC;QAC1B;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAc,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAiB;IAC1C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,uBAAW,CAAC,QAAQ;YACvB,OAAO,CAAC,CAAC;QACX,KAAK,uBAAW,CAAC,WAAW;YAC1B,OAAO,IAAI,CAAC;QACd,KAAK,uBAAW,CAAC,WAAW;YAC1B,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CACjC,aAAqB,EACrB,eAAuB,EACvB,mBAA2B,EAC3B,KAAoB,EACpB,aAA6B;IAQ7B,MAAM,iBAAiB,GAAG,aAAa,CACrC,eAAe,EACf,mBAAmB,EACnB,KAAK,EACL,aAAa,CACd,CAAC;IAEF,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,GAAG,aAAa,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;IAE3B,OAAO;QACL,KAAK;QACL,MAAM;QACN,OAAO;QACP,MAAM;QACN,SAAS,EAAE,iBAAiB;KAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAC1B,YAAoB,EACpB,gBAAwB,EACxB,MAAuB,EACvB,aAA6B;IAO7B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,aAAa,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,CAAC;KAC1E,CAAC,CAAC,CAAC;IAEJ,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpE,OAAO,OAAO;SACX,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACd,GAAG,MAAM;QACT,gBAAgB,EAAE,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG;KAC9E,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,YAAY,CAC1B,kBAA0B,EAC1B,kBAA0B,EAC1B,oBAA4B,EAC5B,SAAiB,EAAE;IAOnB,MAAM,cAAc,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;IACjE,MAAM,aAAa,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAC1D,MAAM,YAAY,GAAG,cAAc,GAAG,MAAM,GAAG,kBAAkB,CAAC;IAClE,MAAM,GAAG,GAAG,CAAC,YAAY,GAAG,kBAAkB,CAAC,GAAG,GAAG,CAAC;IAEtD,OAAO;QACL,cAAc;QACd,aAAa;QACb,YAAY;QACZ,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAC5B,MAAc,EACd,WAAmB,KAAK,EACxB,SAAiB,OAAO;IAExB,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;QACnC,KAAK,EAAE,UAAU;QACjB,QAAQ;QACR,qBAAqB,EAAE,CAAC;QACxB,qBAAqB,EAAE,CAAC;KACzB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC;AAED,SAAgB,0BAA0B,CACxC,kBAA0B,EAC1B,gBAAwB,EACxB,SAAiB,EACjB,KAAoB,EACpB,yBAAiC,EAAE;IAOnC,MAAM,qBAAqB,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;IACpE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,qBAAqB,GAAG,eAAe,GAAG,sBAAsB,CAAC;IAEvF,MAAM,cAAc,GAAG,aAAa,CAAC,qBAAqB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;IAEhF,MAAM,WAAW,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;IAErE,MAAM,OAAO,GAAG,cAAc,GAAG,WAAW,CAAC;IAC7C,MAAM,iBAAiB,GAAG,CAAC,OAAO,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC;IAE3D,OAAO;QACL,cAAc;QACd,WAAW;QACX,OAAO;QACP,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { AIProvider, TrackerConfig, ProviderConfig } from '../types';
2
+ export declare function validateProvider(provider: string): AIProvider;
3
+ export declare function validateModel(modelId: string): void;
4
+ export declare function validateProviderConfig(config: ProviderConfig): void;
5
+ export declare function validateTrackerConfig(config: TrackerConfig): void;
6
+ export declare function validatePrompt(prompt: string): void;
7
+ export declare function validateUserId(userId: string): void;
8
+ export declare function validateDateRange(startDate?: Date, endDate?: Date): void;
9
+ export declare function sanitizeInput(input: string): string;
10
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGrE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAU7D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMnD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CA4CnE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAmDjE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBnD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAQxE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateProvider = validateProvider;
4
+ exports.validateModel = validateModel;
5
+ exports.validateProviderConfig = validateProviderConfig;
6
+ exports.validateTrackerConfig = validateTrackerConfig;
7
+ exports.validatePrompt = validatePrompt;
8
+ exports.validateUserId = validateUserId;
9
+ exports.validateDateRange = validateDateRange;
10
+ exports.sanitizeInput = sanitizeInput;
11
+ const types_1 = require("../types");
12
+ const models_1 = require("../types/models");
13
+ function validateProvider(provider) {
14
+ const validProviders = Object.values(types_1.AIProvider);
15
+ if (!validProviders.includes(provider)) {
16
+ throw new Error(`Invalid provider: ${provider}. Valid providers are: ${validProviders.join(', ')}`);
17
+ }
18
+ return provider;
19
+ }
20
+ function validateModel(modelId) {
21
+ const model = (0, models_1.getModelById)(modelId);
22
+ if (!model) {
23
+ throw new Error(`Unknown model: ${modelId}`);
24
+ }
25
+ }
26
+ function validateProviderConfig(config) {
27
+ validateProvider(config.provider);
28
+ if (config.provider === types_1.AIProvider.OpenAI && !config.apiKey) {
29
+ throw new Error('OpenAI provider requires an API key');
30
+ }
31
+ if (config.provider === types_1.AIProvider.AWSBedrock) {
32
+ const validRegions = [
33
+ 'us-east-1',
34
+ 'us-west-2',
35
+ 'eu-west-1',
36
+ 'eu-central-1',
37
+ 'ap-northeast-1',
38
+ 'ap-southeast-1',
39
+ 'ap-southeast-2'
40
+ ];
41
+ if (config.region && !validRegions.includes(config.region)) {
42
+ throw new Error(`Invalid AWS region: ${config.region}. Valid regions are: ${validRegions.join(', ')}`);
43
+ }
44
+ }
45
+ if (config.customPricing) {
46
+ Object.entries(config.customPricing).forEach(([modelId, pricing]) => {
47
+ if (pricing.promptPrice < 0 || pricing.completionPrice < 0) {
48
+ throw new Error(`Invalid pricing for model ${modelId}: prices must be non-negative`);
49
+ }
50
+ const validUnits = ['per-token', 'per-1k-tokens', 'per-1m-tokens'];
51
+ if (!validUnits.includes(pricing.unit)) {
52
+ throw new Error(`Invalid pricing unit for model ${modelId}: ${pricing.unit}. ` +
53
+ `Valid units are: ${validUnits.join(', ')}`);
54
+ }
55
+ });
56
+ }
57
+ }
58
+ function validateTrackerConfig(config) {
59
+ if (!config.providers || config.providers.length === 0) {
60
+ throw new Error('At least one provider configuration is required');
61
+ }
62
+ config.providers.forEach(validateProviderConfig);
63
+ if (config.optimization) {
64
+ if (config.optimization.bedrockConfig) {
65
+ const { region, modelId } = config.optimization.bedrockConfig;
66
+ if (!region) {
67
+ throw new Error('Bedrock configuration requires a region');
68
+ }
69
+ if (!modelId) {
70
+ throw new Error('Bedrock configuration requires a modelId');
71
+ }
72
+ const model = (0, models_1.getModelById)(modelId);
73
+ if (!model) {
74
+ throw new Error(`Unknown Bedrock model: ${modelId}`);
75
+ }
76
+ if (model.provider !== types_1.AIProvider.AWSBedrock) {
77
+ throw new Error(`Model ${modelId} is not a Bedrock model`);
78
+ }
79
+ }
80
+ }
81
+ if (config.alerts) {
82
+ if (config.alerts.costThreshold && config.alerts.costThreshold < 0) {
83
+ throw new Error('Cost threshold must be non-negative');
84
+ }
85
+ if (config.alerts.tokenThreshold && config.alerts.tokenThreshold < 0) {
86
+ throw new Error('Token threshold must be non-negative');
87
+ }
88
+ if (config.alerts.webhookUrl) {
89
+ try {
90
+ new URL(config.alerts.webhookUrl);
91
+ }
92
+ catch {
93
+ throw new Error('Invalid webhook URL');
94
+ }
95
+ }
96
+ }
97
+ }
98
+ function validatePrompt(prompt) {
99
+ if (!prompt || typeof prompt !== 'string') {
100
+ throw new Error('Prompt must be a non-empty string');
101
+ }
102
+ if (prompt.length > 1000000) {
103
+ throw new Error('Prompt exceeds maximum length of 1,000,000 characters');
104
+ }
105
+ }
106
+ function validateUserId(userId) {
107
+ if (!userId || typeof userId !== 'string') {
108
+ throw new Error('User ID must be a non-empty string');
109
+ }
110
+ if (userId.length > 256) {
111
+ throw new Error('User ID exceeds maximum length of 256 characters');
112
+ }
113
+ const validIdPattern = /^[a-zA-Z0-9_\-@.]+$/;
114
+ if (!validIdPattern.test(userId)) {
115
+ throw new Error('User ID contains invalid characters. ' +
116
+ 'Only alphanumeric characters, underscore, hyphen, @ and dot are allowed');
117
+ }
118
+ }
119
+ function validateDateRange(startDate, endDate) {
120
+ if (startDate && endDate && startDate > endDate) {
121
+ throw new Error('Start date must be before or equal to end date');
122
+ }
123
+ if (startDate && startDate > new Date()) {
124
+ throw new Error('Start date cannot be in the future');
125
+ }
126
+ }
127
+ function sanitizeInput(input) {
128
+ return input
129
+ .replace(/<script[^>]*>.*?<\/script>/gi, '')
130
+ .replace(/<[^>]+>/g, '')
131
+ .trim();
132
+ }
133
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "cost-katana",
3
+ "version": "2.0.0",
4
+ "description": "The simplest way to use AI with automatic cost tracking and optimization. Works with OpenAI, Anthropic, Google, AWS Bedrock, and more.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc -p tsconfig.build.json",
9
+ "clean": "rm -rf dist",
10
+ "prebuild": "npm run clean",
11
+ "test": "jest",
12
+ "test:watch": "jest --watch",
13
+ "test:coverage": "jest --coverage",
14
+ "lint": "eslint 'src/**/*.ts'",
15
+ "lint:fix": "eslint 'src/**/*.ts' --fix",
16
+ "format": "prettier --write 'src/**/*.ts'",
17
+ "prepublishOnly": "npm run test && npm run build",
18
+ "prepare": "npm run build",
19
+ "dev": "tsc -w",
20
+ "ci:test": "npm test",
21
+ "ci:lint": "npm run lint",
22
+ "ci:format": "npx prettier --check 'src/**/*.ts'",
23
+ "ci:build": "npm run build",
24
+ "ci:check": "npm pack --dry-run",
25
+ "ci:security": "npm audit --audit-level=moderate",
26
+ "release:prepare": "./scripts/prepare-release.sh",
27
+ "release:push": "git push origin main && git push --tags",
28
+ "release:full": "npm run release:prepare && npm run release:push"
29
+ },
30
+ "keywords": [
31
+ "ai",
32
+ "cost-tracking",
33
+ "openai",
34
+ "anthropic",
35
+ "claude",
36
+ "gpt",
37
+ "gemini",
38
+ "google-ai",
39
+ "aws-bedrock",
40
+ "cost-optimization",
41
+ "llm",
42
+ "ai-sdk",
43
+ "simple-ai",
44
+ "cost-katana",
45
+ "multi-provider",
46
+ "ai-gateway",
47
+ "cortex",
48
+ "caching",
49
+ "typescript",
50
+ "nodejs"
51
+ ],
52
+ "author": "Abdul Sagheer",
53
+ "license": "MIT",
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "git+https://github.com/Hypothesize-Tech/costkatana-core.git"
57
+ },
58
+ "bugs": {
59
+ "url": "https://github.com/Hypothesize-Tech/costkatana-core/issues"
60
+ },
61
+ "homepage": "https://github.com/Hypothesize-Tech/costkatana-core#readme",
62
+ "engines": {
63
+ "node": ">=18.0.0"
64
+ },
65
+ "files": [
66
+ "dist",
67
+ "README.md",
68
+ "LICENSE"
69
+ ],
70
+ "dependencies": {
71
+ "@aws-sdk/client-bedrock-runtime": "^3.450.0",
72
+ "@aws-sdk/credential-providers": "^3.450.0",
73
+ "axios": "^1.11.0",
74
+ "dotenv": "^16.5.0",
75
+ "gpt-3-encoder": "^1.1.4",
76
+ "uuid": "^9.0.1"
77
+ },
78
+ "devDependencies": {
79
+ "@types/jest": "^29.5.14",
80
+ "@types/node": "^20.10.5",
81
+ "@types/uuid": "^9.0.7",
82
+ "@typescript-eslint/eslint-plugin": "^8.39.0",
83
+ "@typescript-eslint/parser": "^8.39.0",
84
+ "eslint": "^8.56.0",
85
+ "eslint-config-prettier": "^9.1.0",
86
+ "eslint-plugin-prettier": "^5.1.2",
87
+ "jest": "^29.7.0",
88
+ "prettier": "^3.1.1",
89
+ "ts-jest": "^29.1.1",
90
+ "typescript": "^5.3.3"
91
+ }
92
+ }