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.
- package/LICENSE +21 -0
- package/README.md +550 -0
- package/dist/analyzers/cost-analyzer.d.ts +28 -0
- package/dist/analyzers/cost-analyzer.d.ts.map +1 -0
- package/dist/analyzers/cost-analyzer.js +165 -0
- package/dist/analyzers/cost-analyzer.js.map +1 -0
- package/dist/analyzers/token-counter.d.ts +21 -0
- package/dist/analyzers/token-counter.d.ts.map +1 -0
- package/dist/analyzers/token-counter.js +100 -0
- package/dist/analyzers/token-counter.js.map +1 -0
- package/dist/analyzers/usage-tracker.d.ts +29 -0
- package/dist/analyzers/usage-tracker.d.ts.map +1 -0
- package/dist/analyzers/usage-tracker.js +142 -0
- package/dist/analyzers/usage-tracker.js.map +1 -0
- package/dist/config/default.d.ts +45 -0
- package/dist/config/default.d.ts.map +1 -0
- package/dist/config/default.js +103 -0
- package/dist/config/default.js.map +1 -0
- package/dist/config/model-types.d.ts +45 -0
- package/dist/config/model-types.d.ts.map +1 -0
- package/dist/config/model-types.js +101 -0
- package/dist/config/model-types.js.map +1 -0
- package/dist/config/pricing/anthropic.d.ts +3 -0
- package/dist/config/pricing/anthropic.d.ts.map +1 -0
- package/dist/config/pricing/anthropic.js +191 -0
- package/dist/config/pricing/anthropic.js.map +1 -0
- package/dist/config/pricing/aws-bedrock.d.ts +3 -0
- package/dist/config/pricing/aws-bedrock.d.ts.map +1 -0
- package/dist/config/pricing/aws-bedrock.js +747 -0
- package/dist/config/pricing/aws-bedrock.js.map +1 -0
- package/dist/config/pricing/cohere.d.ts +3 -0
- package/dist/config/pricing/cohere.d.ts.map +1 -0
- package/dist/config/pricing/cohere.js +371 -0
- package/dist/config/pricing/cohere.js.map +1 -0
- package/dist/config/pricing/deepseek.d.ts +3 -0
- package/dist/config/pricing/deepseek.d.ts.map +1 -0
- package/dist/config/pricing/deepseek.js +102 -0
- package/dist/config/pricing/deepseek.js.map +1 -0
- package/dist/config/pricing/google.d.ts +3 -0
- package/dist/config/pricing/google.d.ts.map +1 -0
- package/dist/config/pricing/google.js +671 -0
- package/dist/config/pricing/google.js.map +1 -0
- package/dist/config/pricing/grok.d.ts +3 -0
- package/dist/config/pricing/grok.d.ts.map +1 -0
- package/dist/config/pricing/grok.js +59 -0
- package/dist/config/pricing/grok.js.map +1 -0
- package/dist/config/pricing/index.d.ts +11 -0
- package/dist/config/pricing/index.d.ts.map +1 -0
- package/dist/config/pricing/index.js +24 -0
- package/dist/config/pricing/index.js.map +1 -0
- package/dist/config/pricing/meta.d.ts +3 -0
- package/dist/config/pricing/meta.d.ts.map +1 -0
- package/dist/config/pricing/meta.js +69 -0
- package/dist/config/pricing/meta.js.map +1 -0
- package/dist/config/pricing/mistral.d.ts +3 -0
- package/dist/config/pricing/mistral.d.ts.map +1 -0
- package/dist/config/pricing/mistral.js +690 -0
- package/dist/config/pricing/mistral.js.map +1 -0
- package/dist/config/pricing/openai.d.ts +3 -0
- package/dist/config/pricing/openai.d.ts.map +1 -0
- package/dist/config/pricing/openai.js +475 -0
- package/dist/config/pricing/openai.js.map +1 -0
- package/dist/config/pricing/xai.d.ts +3 -0
- package/dist/config/pricing/xai.d.ts.map +1 -0
- package/dist/config/pricing/xai.js +141 -0
- package/dist/config/pricing/xai.js.map +1 -0
- package/dist/config/pricing-data.d.ts +55 -0
- package/dist/config/pricing-data.d.ts.map +1 -0
- package/dist/config/pricing-data.js +179 -0
- package/dist/config/pricing-data.js.map +1 -0
- package/dist/feedback/client.d.ts +14 -0
- package/dist/feedback/client.d.ts.map +1 -0
- package/dist/feedback/client.js +95 -0
- package/dist/feedback/client.js.map +1 -0
- package/dist/feedback/index.d.ts +3 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +21 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/gateway/client.d.ts +77 -0
- package/dist/gateway/client.d.ts.map +1 -0
- package/dist/gateway/client.js +630 -0
- package/dist/gateway/client.js.map +1 -0
- package/dist/gateway/index.d.ts +9 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +66 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1438 -0
- package/dist/index.js.map +1 -0
- package/dist/optimizers/context-trimmer.d.ts +18 -0
- package/dist/optimizers/context-trimmer.d.ts.map +1 -0
- package/dist/optimizers/context-trimmer.js +221 -0
- package/dist/optimizers/context-trimmer.js.map +1 -0
- package/dist/optimizers/index.d.ts +6 -0
- package/dist/optimizers/index.d.ts.map +1 -0
- package/dist/optimizers/index.js +14 -0
- package/dist/optimizers/index.js.map +1 -0
- package/dist/optimizers/prompt-compressor.d.ts +15 -0
- package/dist/optimizers/prompt-compressor.d.ts.map +1 -0
- package/dist/optimizers/prompt-compressor.js +268 -0
- package/dist/optimizers/prompt-compressor.js.map +1 -0
- package/dist/optimizers/prompt-optimizer.d.ts +29 -0
- package/dist/optimizers/prompt-optimizer.d.ts.map +1 -0
- package/dist/optimizers/prompt-optimizer.js +381 -0
- package/dist/optimizers/prompt-optimizer.js.map +1 -0
- package/dist/optimizers/request-fusion.d.ts +34 -0
- package/dist/optimizers/request-fusion.d.ts.map +1 -0
- package/dist/optimizers/request-fusion.js +284 -0
- package/dist/optimizers/request-fusion.js.map +1 -0
- package/dist/optimizers/suggestion-engine.d.ts +29 -0
- package/dist/optimizers/suggestion-engine.d.ts.map +1 -0
- package/dist/optimizers/suggestion-engine.js +234 -0
- package/dist/optimizers/suggestion-engine.js.map +1 -0
- package/dist/providers/anthropic.d.ts +23 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +108 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/azure.d.ts +15 -0
- package/dist/providers/azure.d.ts.map +1 -0
- package/dist/providers/azure.js +115 -0
- package/dist/providers/azure.js.map +1 -0
- package/dist/providers/base.d.ts +20 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +67 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/bedrock.d.ts +23 -0
- package/dist/providers/bedrock.d.ts.map +1 -0
- package/dist/providers/bedrock.js +247 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/cohere.d.ts +17 -0
- package/dist/providers/cohere.d.ts.map +1 -0
- package/dist/providers/cohere.js +122 -0
- package/dist/providers/cohere.js.map +1 -0
- package/dist/providers/deepseek.d.ts +6 -0
- package/dist/providers/deepseek.d.ts.map +1 -0
- package/dist/providers/deepseek.js +17 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/google.d.ts +17 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +141 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +61 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +16 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +194 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/trace/client.d.ts +48 -0
- package/dist/trace/client.d.ts.map +1 -0
- package/dist/trace/client.js +130 -0
- package/dist/trace/client.js.map +1 -0
- package/dist/trace/index.d.ts +7 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +30 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/middleware.d.ts +70 -0
- package/dist/trace/middleware.d.ts.map +1 -0
- package/dist/trace/middleware.js +104 -0
- package/dist/trace/middleware.js.map +1 -0
- package/dist/trace/providers.d.ts +83 -0
- package/dist/trace/providers.d.ts.map +1 -0
- package/dist/trace/providers.js +340 -0
- package/dist/trace/providers.js.map +1 -0
- package/dist/trace/service.d.ts +59 -0
- package/dist/trace/service.d.ts.map +1 -0
- package/dist/trace/service.js +425 -0
- package/dist/trace/service.js.map +1 -0
- package/dist/trace/types.d.ts +102 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +3 -0
- package/dist/trace/types.js.map +1 -0
- package/dist/types/failover.d.ts +29 -0
- package/dist/types/failover.d.ts.map +1 -0
- package/dist/types/failover.js +3 -0
- package/dist/types/failover.js.map +1 -0
- package/dist/types/feedback.d.ts +69 -0
- package/dist/types/feedback.d.ts.map +1 -0
- package/dist/types/feedback.js +3 -0
- package/dist/types/feedback.js.map +1 -0
- package/dist/types/gateway.d.ts +303 -0
- package/dist/types/gateway.d.ts.map +1 -0
- package/dist/types/gateway.js +3 -0
- package/dist/types/gateway.js.map +1 -0
- package/dist/types/index.d.ts +242 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/models.d.ts +7 -0
- package/dist/types/models.d.ts.map +1 -0
- package/dist/types/models.js +3838 -0
- package/dist/types/models.js.map +1 -0
- package/dist/types/providers.d.ts +128 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +10 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/types/simplified.d.ts +65 -0
- package/dist/types/simplified.d.ts.map +1 -0
- package/dist/types/simplified.js +4 -0
- package/dist/types/simplified.js.map +1 -0
- package/dist/utils/logger.d.ts +35 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +154 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pricing.d.ts +30 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/utils/pricing.js +148 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/validators.d.ts +10 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +133 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +92 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 AI Cost Tracker
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
# Cost Katana 🥷
|
|
2
|
+
|
|
3
|
+
**AI that just works. With automatic cost tracking.**
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { ai } from 'cost-katana';
|
|
7
|
+
|
|
8
|
+
const response = await ai('gpt-4', 'Hello, world!');
|
|
9
|
+
console.log(response.text); // "Hello! How can I help you today?"
|
|
10
|
+
console.log(`Cost: $${response.cost}`); // "Cost: $0.0012"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
That's it. No setup. No configuration. No complexity.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install cost-katana
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> **Note**: Package was previously named `ai-cost-tracker`. If you're upgrading, uninstall the old package first:
|
|
22
|
+
> ```bash
|
|
23
|
+
> npm uninstall ai-cost-tracker
|
|
24
|
+
> npm install cost-katana
|
|
25
|
+
> ```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
### Zero Configuration
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { ai } from 'cost-katana';
|
|
33
|
+
|
|
34
|
+
// Just works with any AI model
|
|
35
|
+
await ai('gpt-4', 'Explain quantum computing');
|
|
36
|
+
await ai('claude-3-sonnet', 'Write a haiku');
|
|
37
|
+
await ai('gemini-pro', 'Solve this equation: 2x + 5 = 13');
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Chat Conversations
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { chat } from 'cost-katana';
|
|
44
|
+
|
|
45
|
+
const session = chat('gpt-4');
|
|
46
|
+
await session.send('Hello!');
|
|
47
|
+
await session.send('What can you help me with?');
|
|
48
|
+
await session.send('Tell me a joke');
|
|
49
|
+
|
|
50
|
+
console.log(`Total cost: $${session.totalCost}`);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Compare Models
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { ai } from 'cost-katana';
|
|
57
|
+
|
|
58
|
+
const models = ['gpt-4', 'claude-3-sonnet', 'gemini-pro'];
|
|
59
|
+
const prompt = 'Explain relativity in one sentence';
|
|
60
|
+
|
|
61
|
+
for (const model of models) {
|
|
62
|
+
const response = await ai(model, prompt);
|
|
63
|
+
console.log(`${model}: $${response.cost.toFixed(4)}`);
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Features
|
|
68
|
+
|
|
69
|
+
### 💰 Cost Tracking
|
|
70
|
+
|
|
71
|
+
Every response includes cost information:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const response = await ai('gpt-4', 'Write a story');
|
|
75
|
+
console.log(`Cost: $${response.cost}`);
|
|
76
|
+
console.log(`Tokens: ${response.tokens}`);
|
|
77
|
+
console.log(`Model: ${response.model}`);
|
|
78
|
+
console.log(`Provider: ${response.provider}`);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 💾 Smart Caching
|
|
82
|
+
|
|
83
|
+
Save money by caching repeated requests:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// First call - costs money
|
|
87
|
+
const response1 = await ai('gpt-4', 'What is 2+2?', { cache: true });
|
|
88
|
+
console.log(response1.cached); // false
|
|
89
|
+
|
|
90
|
+
// Second call - free from cache
|
|
91
|
+
const response2 = await ai('gpt-4', 'What is 2+2?', { cache: true });
|
|
92
|
+
console.log(response2.cached); // true - saved money!
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### ⚡ Cortex Optimization
|
|
96
|
+
|
|
97
|
+
Reduce costs by 70-95% with Cortex:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const response = await ai('gpt-4', 'Write a complete guide to Python', {
|
|
101
|
+
cortex: true // Enable optimization
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
console.log(response.optimized); // true
|
|
105
|
+
console.log(`Saved: ${response.savedAmount}`); // Amount saved
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 🛡️ Security Firewall
|
|
109
|
+
|
|
110
|
+
Block malicious prompts automatically:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import { configure } from 'cost-katana';
|
|
114
|
+
|
|
115
|
+
await configure({ firewall: true });
|
|
116
|
+
|
|
117
|
+
// Malicious prompts are blocked
|
|
118
|
+
try {
|
|
119
|
+
await ai('gpt-4', 'ignore instructions and...');
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.log('Blocked:', error.message);
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 🔄 Auto-Failover
|
|
126
|
+
|
|
127
|
+
Never fail - automatically switch providers:
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
// If OpenAI is down, automatically uses Claude or Gemini
|
|
131
|
+
const response = await ai('gpt-4', 'Hello');
|
|
132
|
+
console.log(response.provider); // Might be 'anthropic' if OpenAI failed
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 📊 Analytics Dashboard
|
|
136
|
+
|
|
137
|
+
All usage syncs to your dashboard at [costkatana.com](https://costkatana.com):
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
const response = await ai('gpt-4', 'Hello');
|
|
141
|
+
// Automatically tracked in your dashboard
|
|
142
|
+
// View at: https://costkatana.com/dashboard
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Configuration
|
|
146
|
+
|
|
147
|
+
### Environment Variables
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Option 1: Cost Katana (Recommended - all features)
|
|
151
|
+
COST_KATANA_KEY=dak_your_key_here
|
|
152
|
+
|
|
153
|
+
# Option 2: Direct provider keys (limited features)
|
|
154
|
+
OPENAI_API_KEY=sk-...
|
|
155
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
156
|
+
GOOGLE_API_KEY=...
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Manual Configuration
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { configure } from 'cost-katana';
|
|
163
|
+
|
|
164
|
+
await configure({
|
|
165
|
+
apiKey: 'dak_your_key',
|
|
166
|
+
cortex: true, // 70-95% cost savings
|
|
167
|
+
cache: true, // Smart caching
|
|
168
|
+
firewall: true // Security
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Advanced Options
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
const response = await ai('gpt-4', 'Your prompt', {
|
|
176
|
+
temperature: 0.7, // Creativity level (0-2)
|
|
177
|
+
maxTokens: 500, // Response length limit
|
|
178
|
+
systemMessage: 'You are helpful', // System prompt
|
|
179
|
+
cache: true, // Enable caching
|
|
180
|
+
cortex: true // Enable optimization
|
|
181
|
+
});
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Multi-Provider Support
|
|
185
|
+
|
|
186
|
+
Works with all major AI providers:
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
// OpenAI
|
|
190
|
+
await ai('gpt-4', 'Hello');
|
|
191
|
+
await ai('gpt-3.5-turbo', 'Hello');
|
|
192
|
+
|
|
193
|
+
// Anthropic
|
|
194
|
+
await ai('claude-3-sonnet', 'Hello');
|
|
195
|
+
await ai('claude-3-haiku', 'Hello');
|
|
196
|
+
|
|
197
|
+
// Google
|
|
198
|
+
await ai('gemini-pro', 'Hello');
|
|
199
|
+
await ai('gemini-flash', 'Hello');
|
|
200
|
+
|
|
201
|
+
// AWS Bedrock
|
|
202
|
+
await ai('nova-pro', 'Hello');
|
|
203
|
+
await ai('nova-lite', 'Hello');
|
|
204
|
+
|
|
205
|
+
// And many more...
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Real-World Examples
|
|
209
|
+
|
|
210
|
+
### Customer Support Bot
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
import { chat } from 'cost-katana';
|
|
214
|
+
|
|
215
|
+
const support = chat('gpt-3.5-turbo', {
|
|
216
|
+
systemMessage: 'You are a helpful customer support agent.'
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
async function handleCustomerQuery(query: string) {
|
|
220
|
+
const response = await support.send(query);
|
|
221
|
+
console.log(`Cost so far: $${support.totalCost}`);
|
|
222
|
+
return response;
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Content Generation
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
import { ai } from 'cost-katana';
|
|
230
|
+
|
|
231
|
+
async function generateBlogPost(topic: string) {
|
|
232
|
+
// Use Cortex for long-form content (70-95% savings)
|
|
233
|
+
const post = await ai('gpt-4', `Write a blog post about ${topic}`, {
|
|
234
|
+
cortex: true,
|
|
235
|
+
maxTokens: 2000
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
content: post.text,
|
|
240
|
+
cost: post.cost,
|
|
241
|
+
wordCount: post.text.split(' ').length
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Code Assistant
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
import { ai } from 'cost-katana';
|
|
250
|
+
|
|
251
|
+
async function reviewCode(code: string) {
|
|
252
|
+
const review = await ai('claude-3-sonnet',
|
|
253
|
+
`Review this code and suggest improvements:\n\n${code}`,
|
|
254
|
+
{ cache: true } // Cache for repeated reviews
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
return review.text;
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Translation Service
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
import { ai } from 'cost-katana';
|
|
265
|
+
|
|
266
|
+
async function translate(text: string, targetLanguage: string) {
|
|
267
|
+
// Use cheaper model for translations
|
|
268
|
+
const translated = await ai('gpt-3.5-turbo',
|
|
269
|
+
`Translate to ${targetLanguage}: ${text}`,
|
|
270
|
+
{ cache: true }
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
return translated.text;
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Framework Integration
|
|
278
|
+
|
|
279
|
+
### Next.js App Router
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
// app/api/chat/route.ts
|
|
283
|
+
import { ai } from 'cost-katana';
|
|
284
|
+
|
|
285
|
+
export async function POST(request: Request) {
|
|
286
|
+
const { prompt } = await request.json();
|
|
287
|
+
const response = await ai('gpt-4', prompt);
|
|
288
|
+
return Response.json(response);
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Express.js
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
import express from 'express';
|
|
296
|
+
import { ai } from 'cost-katana';
|
|
297
|
+
|
|
298
|
+
const app = express();
|
|
299
|
+
app.use(express.json());
|
|
300
|
+
|
|
301
|
+
app.post('/api/chat', async (req, res) => {
|
|
302
|
+
const response = await ai('gpt-4', req.body.prompt);
|
|
303
|
+
res.json(response);
|
|
304
|
+
});
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Fastify
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
import fastify from 'fastify';
|
|
311
|
+
import { ai } from 'cost-katana';
|
|
312
|
+
|
|
313
|
+
const app = fastify();
|
|
314
|
+
|
|
315
|
+
app.post('/api/chat', async (request, reply) => {
|
|
316
|
+
const { prompt } = request.body;
|
|
317
|
+
const response = await ai('gpt-4', prompt);
|
|
318
|
+
return response;
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### NestJS
|
|
323
|
+
|
|
324
|
+
```typescript
|
|
325
|
+
import { Controller, Post, Body } from '@nestjs/common';
|
|
326
|
+
import { ai } from 'cost-katana';
|
|
327
|
+
|
|
328
|
+
@Controller('api')
|
|
329
|
+
export class ChatController {
|
|
330
|
+
@Post('chat')
|
|
331
|
+
async chat(@Body() body: { prompt: string }) {
|
|
332
|
+
return await ai('gpt-4', body.prompt);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Error Handling
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
import { ai } from 'cost-katana';
|
|
341
|
+
|
|
342
|
+
try {
|
|
343
|
+
const response = await ai('gpt-4', 'Hello');
|
|
344
|
+
console.log(response.text);
|
|
345
|
+
} catch (error) {
|
|
346
|
+
if (error.code === 'NO_API_KEY') {
|
|
347
|
+
console.log('Please set your API key');
|
|
348
|
+
} else if (error.code === 'RATE_LIMIT') {
|
|
349
|
+
console.log('Rate limit exceeded');
|
|
350
|
+
} else if (error.code === 'INVALID_MODEL') {
|
|
351
|
+
console.log('Model not found');
|
|
352
|
+
} else {
|
|
353
|
+
console.log('Error:', error.message);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## Cost Optimization Tips
|
|
359
|
+
|
|
360
|
+
### 1. Use Appropriate Models
|
|
361
|
+
|
|
362
|
+
```typescript
|
|
363
|
+
// For simple tasks, use cheaper models
|
|
364
|
+
await ai('gpt-3.5-turbo', 'Simple question'); // $0.0001
|
|
365
|
+
|
|
366
|
+
// For complex tasks, use powerful models
|
|
367
|
+
await ai('gpt-4', 'Complex analysis'); // $0.01
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### 2. Enable Caching
|
|
371
|
+
|
|
372
|
+
```typescript
|
|
373
|
+
// Cache repeated queries
|
|
374
|
+
await ai('gpt-4', 'Common question', { cache: true });
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### 3. Use Cortex for Long Content
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
// 70-95% savings on long-form content
|
|
381
|
+
await ai('gpt-4', 'Write a book chapter', { cortex: true });
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### 4. Batch Similar Requests
|
|
385
|
+
|
|
386
|
+
```typescript
|
|
387
|
+
const session = chat('gpt-3.5-turbo');
|
|
388
|
+
// Reuse session for related queries
|
|
389
|
+
await session.send('Query 1');
|
|
390
|
+
await session.send('Query 2');
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## Monitoring & Analytics
|
|
394
|
+
|
|
395
|
+
### Track Usage
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
import { chat } from 'cost-katana';
|
|
399
|
+
|
|
400
|
+
const session = chat('gpt-4');
|
|
401
|
+
await session.send('Hello');
|
|
402
|
+
await session.send('How are you?');
|
|
403
|
+
|
|
404
|
+
console.log('Messages:', session.messages.length);
|
|
405
|
+
console.log('Total cost:', session.totalCost);
|
|
406
|
+
console.log('Total tokens:', session.totalTokens);
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Dashboard Features
|
|
410
|
+
|
|
411
|
+
Visit [costkatana.com/dashboard](https://costkatana.com/dashboard) to see:
|
|
412
|
+
|
|
413
|
+
- Real-time cost tracking
|
|
414
|
+
- Usage by model and provider
|
|
415
|
+
- Daily/weekly/monthly spending
|
|
416
|
+
- Token usage analytics
|
|
417
|
+
- Optimization recommendations
|
|
418
|
+
- Team usage breakdown
|
|
419
|
+
- Budget alerts
|
|
420
|
+
- API performance metrics
|
|
421
|
+
|
|
422
|
+
## Security & Privacy
|
|
423
|
+
|
|
424
|
+
### Data Protection
|
|
425
|
+
|
|
426
|
+
- All API keys encrypted at rest
|
|
427
|
+
- No prompt/response logging without permission
|
|
428
|
+
- GDPR compliant data handling
|
|
429
|
+
- SOC2 Type II certified infrastructure
|
|
430
|
+
|
|
431
|
+
### Firewall Protection
|
|
432
|
+
|
|
433
|
+
```typescript
|
|
434
|
+
await configure({ firewall: true });
|
|
435
|
+
|
|
436
|
+
// Automatically blocks:
|
|
437
|
+
// - Prompt injection attacks
|
|
438
|
+
// - Jailbreak attempts
|
|
439
|
+
// - Data exfiltration
|
|
440
|
+
// - Malicious content
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
## Troubleshooting
|
|
444
|
+
|
|
445
|
+
### No API Keys Found
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
# Set Cost Katana key (recommended)
|
|
449
|
+
export COST_KATANA_KEY="dak_your_key"
|
|
450
|
+
|
|
451
|
+
# Or set provider keys directly
|
|
452
|
+
export OPENAI_API_KEY="sk-..."
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Model Not Available
|
|
456
|
+
|
|
457
|
+
```typescript
|
|
458
|
+
// Check available models
|
|
459
|
+
import { ai } from 'cost-katana';
|
|
460
|
+
|
|
461
|
+
try {
|
|
462
|
+
await ai('model-name', 'test');
|
|
463
|
+
} catch (error) {
|
|
464
|
+
console.log('Available models:', error.availableModels);
|
|
465
|
+
}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Rate Limits
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
// Automatic retry with backoff
|
|
472
|
+
const response = await ai('gpt-4', 'Hello', {
|
|
473
|
+
retry: true // Auto-retry on rate limits
|
|
474
|
+
});
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
## Migration Guide
|
|
478
|
+
|
|
479
|
+
### From OpenAI SDK
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
// Before (OpenAI SDK)
|
|
483
|
+
import OpenAI from 'openai';
|
|
484
|
+
const openai = new OpenAI({ apiKey: 'sk-...' });
|
|
485
|
+
const completion = await openai.chat.completions.create({
|
|
486
|
+
model: 'gpt-4',
|
|
487
|
+
messages: [{ role: 'user', content: 'Hello' }]
|
|
488
|
+
});
|
|
489
|
+
console.log(completion.choices[0].message.content);
|
|
490
|
+
|
|
491
|
+
// After (Cost Katana)
|
|
492
|
+
import { ai } from 'cost-katana';
|
|
493
|
+
const response = await ai('gpt-4', 'Hello');
|
|
494
|
+
console.log(response.text);
|
|
495
|
+
console.log(`Cost: $${response.cost}`); // Bonus: cost tracking!
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### From Anthropic SDK
|
|
499
|
+
|
|
500
|
+
```typescript
|
|
501
|
+
// Before (Anthropic SDK)
|
|
502
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
503
|
+
const anthropic = new Anthropic({ apiKey: 'sk-ant-...' });
|
|
504
|
+
const message = await anthropic.messages.create({
|
|
505
|
+
model: 'claude-3-sonnet-20241022',
|
|
506
|
+
messages: [{ role: 'user', content: 'Hello' }]
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
// After (Cost Katana)
|
|
510
|
+
import { ai } from 'cost-katana';
|
|
511
|
+
const response = await ai('claude-3-sonnet', 'Hello');
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### From LangChain
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
// Before (LangChain)
|
|
518
|
+
import { ChatOpenAI } from 'langchain/chat_models/openai';
|
|
519
|
+
const model = new ChatOpenAI({ modelName: 'gpt-4' });
|
|
520
|
+
const response = await model.call([{ content: 'Hello' }]);
|
|
521
|
+
|
|
522
|
+
// After (Cost Katana)
|
|
523
|
+
import { ai } from 'cost-katana';
|
|
524
|
+
const response = await ai('gpt-4', 'Hello');
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
## Support
|
|
528
|
+
|
|
529
|
+
- **Dashboard**: [costkatana.com](https://costkatana.com)
|
|
530
|
+
- **Documentation**: [docs.costkatana.com](https://docs.costkatana.com)
|
|
531
|
+
- **GitHub**: [github.com/cost-katana](https://github.com/cost-katana)
|
|
532
|
+
- **Email**: support@costkatana.com
|
|
533
|
+
- **Discord**: [discord.gg/costkatana](https://discord.gg/Wcwzw8wM)
|
|
534
|
+
|
|
535
|
+
## License
|
|
536
|
+
|
|
537
|
+
MIT © Cost Katana
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
**Start saving on AI costs today!**
|
|
542
|
+
|
|
543
|
+
```bash
|
|
544
|
+
npm install ai-cost-tracker
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
```typescript
|
|
548
|
+
import { ai } from 'cost-katana';
|
|
549
|
+
await ai('gpt-4', 'Hello, world!');
|
|
550
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { UsageMetadata, UsageAnalytics } from '../types';
|
|
2
|
+
export declare class CostAnalyzer {
|
|
3
|
+
private usageData;
|
|
4
|
+
constructor(initialData?: UsageMetadata[]);
|
|
5
|
+
addUsageData(data: UsageMetadata | UsageMetadata[]): void;
|
|
6
|
+
clearData(): void;
|
|
7
|
+
getData(): UsageMetadata[];
|
|
8
|
+
analyzeUsage(startDate?: Date, endDate?: Date, userId?: string): UsageAnalytics;
|
|
9
|
+
private filterData;
|
|
10
|
+
private calculateTotalCost;
|
|
11
|
+
private calculateTotalTokens;
|
|
12
|
+
private getMostUsedModels;
|
|
13
|
+
private getCostByProvider;
|
|
14
|
+
private getUsageOverTime;
|
|
15
|
+
private getTopExpensivePrompts;
|
|
16
|
+
private getEmptyAnalytics;
|
|
17
|
+
getCostProjection(days: number): number;
|
|
18
|
+
getOptimizationOpportunities(): {
|
|
19
|
+
provider: string;
|
|
20
|
+
model: string;
|
|
21
|
+
currentCost: number;
|
|
22
|
+
optimizedCost: number;
|
|
23
|
+
savings: number;
|
|
24
|
+
recommendation: string;
|
|
25
|
+
}[];
|
|
26
|
+
getAnomalies(threshold?: number): UsageMetadata[];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cost-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/cost-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EAMf,MAAM,UAAU,CAAC;AAElB,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAuB;gBAE5B,WAAW,CAAC,EAAE,aAAa,EAAE;IAMzC,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,EAAE;IAQlD,SAAS;IAIT,OAAO,IAAI,aAAa,EAAE;IAI1B,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc;IA0B/E,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,iBAAiB;IAazB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAWvC,4BAA4B,IAAI;QAC9B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;KACxB,EAAE;IAiCH,YAAY,CAAC,SAAS,GAAE,MAAU,GAAG,aAAa,EAAE;CASrD"}
|