ai.matey.middleware 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/cjs/caching.js +226 -0
- package/dist/cjs/caching.js.map +1 -0
- package/dist/cjs/conversation-history.js +213 -0
- package/dist/cjs/conversation-history.js.map +1 -0
- package/dist/cjs/cost-tracking.js +355 -0
- package/dist/cjs/cost-tracking.js.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logging.js +174 -0
- package/dist/cjs/logging.js.map +1 -0
- package/dist/cjs/opentelemetry.js +499 -0
- package/dist/cjs/opentelemetry.js.map +1 -0
- package/dist/cjs/retry.js +205 -0
- package/dist/cjs/retry.js.map +1 -0
- package/dist/cjs/security.js +175 -0
- package/dist/cjs/security.js.map +1 -0
- package/dist/cjs/telemetry.js +216 -0
- package/dist/cjs/telemetry.js.map +1 -0
- package/dist/cjs/transform.js +284 -0
- package/dist/cjs/transform.js.map +1 -0
- package/dist/cjs/validation.js +506 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/caching.js +221 -0
- package/dist/esm/caching.js.map +1 -0
- package/dist/esm/conversation-history.js +207 -0
- package/dist/esm/conversation-history.js.map +1 -0
- package/dist/esm/cost-tracking.js +347 -0
- package/dist/esm/cost-tracking.js.map +1 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logging.js +171 -0
- package/dist/esm/logging.js.map +1 -0
- package/dist/esm/opentelemetry.js +458 -0
- package/dist/esm/opentelemetry.js.map +1 -0
- package/dist/esm/retry.js +198 -0
- package/dist/esm/retry.js.map +1 -0
- package/dist/esm/security.js +169 -0
- package/dist/esm/security.js.map +1 -0
- package/dist/esm/telemetry.js +210 -0
- package/dist/esm/telemetry.js.map +1 -0
- package/dist/esm/transform.js +272 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/validation.js +494 -0
- package/dist/esm/validation.js.map +1 -0
- package/dist/types/caching.d.ts +98 -0
- package/dist/types/caching.d.ts.map +1 -0
- package/dist/types/conversation-history.d.ts +188 -0
- package/dist/types/conversation-history.d.ts.map +1 -0
- package/dist/types/cost-tracking.d.ts +262 -0
- package/dist/types/cost-tracking.d.ts.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logging.d.ts +82 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/opentelemetry.d.ts +219 -0
- package/dist/types/opentelemetry.d.ts.map +1 -0
- package/dist/types/retry.d.ts +86 -0
- package/dist/types/retry.d.ts.map +1 -0
- package/dist/types/security.d.ts +120 -0
- package/dist/types/security.d.ts.map +1 -0
- package/dist/types/telemetry.d.ts +120 -0
- package/dist/types/telemetry.d.ts.map +1 -0
- package/dist/types/transform.d.ts +184 -0
- package/dist/types/transform.d.ts.map +1 -0
- package/dist/types/validation.d.ts +356 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/package.json +203 -0
- package/readme.md +103 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cost Tracking Middleware
|
|
4
|
+
*
|
|
5
|
+
* Track and monitor API costs across different providers.
|
|
6
|
+
* Essential for production deployments to control spending.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.DEFAULT_PRICING = exports.InMemoryCostStorage = void 0;
|
|
12
|
+
exports.calculateCost = calculateCost;
|
|
13
|
+
exports.createCostTrackingMiddleware = createCostTrackingMiddleware;
|
|
14
|
+
exports.createStreamingCostTrackingMiddleware = createStreamingCostTrackingMiddleware;
|
|
15
|
+
exports.getCostStats = getCostStats;
|
|
16
|
+
/**
|
|
17
|
+
* In-memory cost storage
|
|
18
|
+
*/
|
|
19
|
+
class InMemoryCostStorage {
|
|
20
|
+
costs = [];
|
|
21
|
+
record(cost) {
|
|
22
|
+
this.costs.push(cost);
|
|
23
|
+
return Promise.resolve();
|
|
24
|
+
}
|
|
25
|
+
getTotal(startTime, endTime) {
|
|
26
|
+
return Promise.resolve(this.filterCosts(startTime, endTime).reduce((sum, c) => sum + c.totalCost, 0));
|
|
27
|
+
}
|
|
28
|
+
getByProvider(startTime, endTime) {
|
|
29
|
+
const result = new Map();
|
|
30
|
+
for (const cost of this.filterCosts(startTime, endTime)) {
|
|
31
|
+
const current = result.get(cost.provider) || 0;
|
|
32
|
+
result.set(cost.provider, current + cost.totalCost);
|
|
33
|
+
}
|
|
34
|
+
return Promise.resolve(result);
|
|
35
|
+
}
|
|
36
|
+
getByModel(startTime, endTime) {
|
|
37
|
+
const result = new Map();
|
|
38
|
+
for (const cost of this.filterCosts(startTime, endTime)) {
|
|
39
|
+
const current = result.get(cost.model) || 0;
|
|
40
|
+
result.set(cost.model, current + cost.totalCost);
|
|
41
|
+
}
|
|
42
|
+
return Promise.resolve(result);
|
|
43
|
+
}
|
|
44
|
+
clear() {
|
|
45
|
+
this.costs = [];
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
}
|
|
48
|
+
filterCosts(startTime, endTime) {
|
|
49
|
+
return this.costs.filter((c) => {
|
|
50
|
+
if (startTime && c.timestamp < startTime) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
if (endTime && c.timestamp > endTime) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get all cost records (for debugging/export)
|
|
61
|
+
*/
|
|
62
|
+
getAllCosts() {
|
|
63
|
+
return [...this.costs];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.InMemoryCostStorage = InMemoryCostStorage;
|
|
67
|
+
/**
|
|
68
|
+
* Default pricing for common providers (as of 2024)
|
|
69
|
+
* Prices in USD per 1M tokens
|
|
70
|
+
*/
|
|
71
|
+
exports.DEFAULT_PRICING = {
|
|
72
|
+
// Anthropic Claude
|
|
73
|
+
anthropic: {
|
|
74
|
+
inputCostPer1M: 3.0,
|
|
75
|
+
outputCostPer1M: 15.0,
|
|
76
|
+
},
|
|
77
|
+
'anthropic:claude-3-opus': {
|
|
78
|
+
inputCostPer1M: 15.0,
|
|
79
|
+
outputCostPer1M: 75.0,
|
|
80
|
+
},
|
|
81
|
+
'anthropic:claude-3-sonnet': {
|
|
82
|
+
inputCostPer1M: 3.0,
|
|
83
|
+
outputCostPer1M: 15.0,
|
|
84
|
+
},
|
|
85
|
+
'anthropic:claude-3-haiku': {
|
|
86
|
+
inputCostPer1M: 0.25,
|
|
87
|
+
outputCostPer1M: 1.25,
|
|
88
|
+
},
|
|
89
|
+
// OpenAI
|
|
90
|
+
openai: {
|
|
91
|
+
inputCostPer1M: 10.0,
|
|
92
|
+
outputCostPer1M: 30.0,
|
|
93
|
+
},
|
|
94
|
+
'openai:gpt-4': {
|
|
95
|
+
inputCostPer1M: 30.0,
|
|
96
|
+
outputCostPer1M: 60.0,
|
|
97
|
+
},
|
|
98
|
+
'openai:gpt-4-turbo': {
|
|
99
|
+
inputCostPer1M: 10.0,
|
|
100
|
+
outputCostPer1M: 30.0,
|
|
101
|
+
},
|
|
102
|
+
'openai:gpt-3.5-turbo': {
|
|
103
|
+
inputCostPer1M: 0.5,
|
|
104
|
+
outputCostPer1M: 1.5,
|
|
105
|
+
},
|
|
106
|
+
// Google Gemini
|
|
107
|
+
gemini: {
|
|
108
|
+
inputCostPer1M: 0.125,
|
|
109
|
+
outputCostPer1M: 0.375,
|
|
110
|
+
},
|
|
111
|
+
'gemini:gemini-pro': {
|
|
112
|
+
inputCostPer1M: 0.5,
|
|
113
|
+
outputCostPer1M: 1.5,
|
|
114
|
+
},
|
|
115
|
+
// Mistral
|
|
116
|
+
mistral: {
|
|
117
|
+
inputCostPer1M: 1.0,
|
|
118
|
+
outputCostPer1M: 3.0,
|
|
119
|
+
},
|
|
120
|
+
// DeepSeek
|
|
121
|
+
deepseek: {
|
|
122
|
+
inputCostPer1M: 0.14,
|
|
123
|
+
outputCostPer1M: 0.28,
|
|
124
|
+
},
|
|
125
|
+
// Groq (very low cost)
|
|
126
|
+
groq: {
|
|
127
|
+
inputCostPer1M: 0.05,
|
|
128
|
+
outputCostPer1M: 0.1,
|
|
129
|
+
},
|
|
130
|
+
// Local/Free providers
|
|
131
|
+
ollama: {
|
|
132
|
+
inputCostPer1M: 0,
|
|
133
|
+
outputCostPer1M: 0,
|
|
134
|
+
},
|
|
135
|
+
lmstudio: {
|
|
136
|
+
inputCostPer1M: 0,
|
|
137
|
+
outputCostPer1M: 0,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Calculate cost for a request/response
|
|
142
|
+
*/
|
|
143
|
+
function calculateCost(usage, provider, model, config) {
|
|
144
|
+
// Find pricing for this provider/model
|
|
145
|
+
let pricing;
|
|
146
|
+
// Check model-specific pricing first
|
|
147
|
+
if (config.models) {
|
|
148
|
+
for (const modelPricing of config.models) {
|
|
149
|
+
if (typeof modelPricing.model === 'string') {
|
|
150
|
+
if (model === modelPricing.model || model.includes(modelPricing.model)) {
|
|
151
|
+
pricing = modelPricing.pricing;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (modelPricing.model instanceof RegExp) {
|
|
156
|
+
if (modelPricing.model.test(model)) {
|
|
157
|
+
pricing = modelPricing.pricing;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Fall back to provider pricing
|
|
164
|
+
if (!pricing && config.providers) {
|
|
165
|
+
const providerKey = `${provider}:${model}`;
|
|
166
|
+
pricing = config.providers[providerKey] || config.providers[provider];
|
|
167
|
+
}
|
|
168
|
+
// Fall back to default pricing
|
|
169
|
+
if (!pricing) {
|
|
170
|
+
const providerKey = `${provider}:${model}`;
|
|
171
|
+
pricing = exports.DEFAULT_PRICING[providerKey] || exports.DEFAULT_PRICING[provider];
|
|
172
|
+
}
|
|
173
|
+
// If still no pricing, use zero cost
|
|
174
|
+
if (!pricing) {
|
|
175
|
+
pricing = { inputCostPer1M: 0, outputCostPer1M: 0 };
|
|
176
|
+
}
|
|
177
|
+
// Calculate costs
|
|
178
|
+
const inputCost = (usage.promptTokens / 1_000_000) * pricing.inputCostPer1M;
|
|
179
|
+
const outputCost = (usage.completionTokens / 1_000_000) * pricing.outputCostPer1M;
|
|
180
|
+
const totalCost = inputCost + outputCost;
|
|
181
|
+
return {
|
|
182
|
+
provider,
|
|
183
|
+
model,
|
|
184
|
+
inputTokens: usage.promptTokens,
|
|
185
|
+
outputTokens: usage.completionTokens,
|
|
186
|
+
totalTokens: usage.totalTokens,
|
|
187
|
+
inputCost,
|
|
188
|
+
outputCost,
|
|
189
|
+
totalCost,
|
|
190
|
+
timestamp: Date.now(),
|
|
191
|
+
requestId: '',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Create cost tracking middleware
|
|
196
|
+
*
|
|
197
|
+
* @param config - Cost tracking configuration
|
|
198
|
+
* @returns Middleware function
|
|
199
|
+
*
|
|
200
|
+
* @example Basic Usage
|
|
201
|
+
* ```typescript
|
|
202
|
+
* import { createCostTrackingMiddleware } from 'ai.matey';
|
|
203
|
+
*
|
|
204
|
+
* const costTracking = createCostTrackingMiddleware({
|
|
205
|
+
* logCosts: true,
|
|
206
|
+
* onCost: (cost) => {
|
|
207
|
+
* console.log(`Request cost: $${cost.totalCost.toFixed(6)}`);
|
|
208
|
+
* }
|
|
209
|
+
* });
|
|
210
|
+
*
|
|
211
|
+
* bridge.use(costTracking);
|
|
212
|
+
* ```
|
|
213
|
+
*
|
|
214
|
+
* @example With Custom Pricing
|
|
215
|
+
* ```typescript
|
|
216
|
+
* const costTracking = createCostTrackingMiddleware({
|
|
217
|
+
* providers: {
|
|
218
|
+
* 'anthropic': {
|
|
219
|
+
* inputCostPer1M: 3.0,
|
|
220
|
+
* outputCostPer1M: 15.0
|
|
221
|
+
* }
|
|
222
|
+
* },
|
|
223
|
+
* models: [
|
|
224
|
+
* {
|
|
225
|
+
* model: /gpt-4-turbo/,
|
|
226
|
+
* pricing: {
|
|
227
|
+
* inputCostPer1M: 10.0,
|
|
228
|
+
* outputCostPer1M: 30.0
|
|
229
|
+
* }
|
|
230
|
+
* }
|
|
231
|
+
* ]
|
|
232
|
+
* });
|
|
233
|
+
* ```
|
|
234
|
+
*
|
|
235
|
+
* @example With Thresholds
|
|
236
|
+
* ```typescript
|
|
237
|
+
* const costTracking = createCostTrackingMiddleware({
|
|
238
|
+
* requestThreshold: 0.10, // Warn if request costs > $0.10
|
|
239
|
+
* hourlyThreshold: 10.00, // Warn if hourly cost > $10
|
|
240
|
+
* dailyThreshold: 100.00, // Warn if daily cost > $100
|
|
241
|
+
* onThresholdExceeded: (cost, threshold) => {
|
|
242
|
+
* console.warn(`Cost threshold exceeded: $${cost.totalCost} > $${threshold}`);
|
|
243
|
+
* }
|
|
244
|
+
* });
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
function createCostTrackingMiddleware(config = {}) {
|
|
248
|
+
const storage = config.storage || new InMemoryCostStorage();
|
|
249
|
+
return async (context, next) => {
|
|
250
|
+
// Execute request
|
|
251
|
+
const response = await next();
|
|
252
|
+
// Calculate cost if usage is available
|
|
253
|
+
if (response.usage) {
|
|
254
|
+
const provider = context.request.metadata?.provenance?.backend || 'unknown';
|
|
255
|
+
const model = context.request.parameters?.model || 'unknown';
|
|
256
|
+
const cost = calculateCost(response.usage, provider, model, config);
|
|
257
|
+
cost.requestId = context.request.metadata?.requestId || '';
|
|
258
|
+
cost.metadata = context.request.metadata?.custom;
|
|
259
|
+
// Store cost
|
|
260
|
+
await storage.record(cost);
|
|
261
|
+
// Check thresholds
|
|
262
|
+
if (config.requestThreshold && cost.totalCost > config.requestThreshold) {
|
|
263
|
+
await config.onThresholdExceeded?.(cost, config.requestThreshold);
|
|
264
|
+
}
|
|
265
|
+
if (config.hourlyThreshold) {
|
|
266
|
+
const hourAgo = Date.now() - 60 * 60 * 1000;
|
|
267
|
+
const hourTotal = await storage.getTotal(hourAgo);
|
|
268
|
+
if (hourTotal > config.hourlyThreshold) {
|
|
269
|
+
await config.onThresholdExceeded?.(cost, config.hourlyThreshold);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (config.dailyThreshold) {
|
|
273
|
+
const dayAgo = Date.now() - 24 * 60 * 60 * 1000;
|
|
274
|
+
const dayTotal = await storage.getTotal(dayAgo);
|
|
275
|
+
if (dayTotal > config.dailyThreshold) {
|
|
276
|
+
await config.onThresholdExceeded?.(cost, config.dailyThreshold);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Log cost if configured
|
|
280
|
+
if (config.logCosts) {
|
|
281
|
+
console.warn(`[Cost] ${provider}/${model}: $${cost.totalCost.toFixed(6)} ` +
|
|
282
|
+
`(${cost.inputTokens} in, ${cost.outputTokens} out)`);
|
|
283
|
+
}
|
|
284
|
+
// Call callback
|
|
285
|
+
await config.onCost?.(cost);
|
|
286
|
+
// Include in metadata if configured
|
|
287
|
+
if (config.includeInMetadata) {
|
|
288
|
+
return {
|
|
289
|
+
...response,
|
|
290
|
+
metadata: {
|
|
291
|
+
...response.metadata,
|
|
292
|
+
custom: {
|
|
293
|
+
...(response.metadata?.custom || {}),
|
|
294
|
+
cost,
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return response;
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Create streaming cost tracking middleware
|
|
305
|
+
*
|
|
306
|
+
* Note: For streaming, cost is calculated at the end when usage is available
|
|
307
|
+
*/
|
|
308
|
+
function createStreamingCostTrackingMiddleware(config = {}) {
|
|
309
|
+
const storage = config.storage || new InMemoryCostStorage();
|
|
310
|
+
return async (context, next) => {
|
|
311
|
+
const stream = await next();
|
|
312
|
+
// Wrap stream to track usage
|
|
313
|
+
async function* wrappedStream() {
|
|
314
|
+
let usage;
|
|
315
|
+
for await (const chunk of stream) {
|
|
316
|
+
yield chunk;
|
|
317
|
+
// Capture usage from done chunk
|
|
318
|
+
if (chunk.type === 'done' && chunk.usage) {
|
|
319
|
+
usage = chunk.usage;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Calculate cost after stream completes
|
|
323
|
+
if (usage) {
|
|
324
|
+
const provider = context.request.metadata?.provenance?.backend || 'unknown';
|
|
325
|
+
const model = context.request.parameters?.model || 'unknown';
|
|
326
|
+
const cost = calculateCost(usage, provider, model, config);
|
|
327
|
+
cost.requestId = context.request.metadata?.requestId || '';
|
|
328
|
+
cost.metadata = context.request.metadata?.custom;
|
|
329
|
+
await storage.record(cost);
|
|
330
|
+
if (config.logCosts) {
|
|
331
|
+
console.warn(`[Cost] ${provider}/${model}: $${cost.totalCost.toFixed(6)} ` +
|
|
332
|
+
`(${cost.inputTokens} in, ${cost.outputTokens} out)`);
|
|
333
|
+
}
|
|
334
|
+
await config.onCost?.(cost);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return wrappedStream();
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Get cost statistics from storage
|
|
342
|
+
*/
|
|
343
|
+
async function getCostStats(storage, hours = 24) {
|
|
344
|
+
const since = Date.now() - hours * 60 * 60 * 1000;
|
|
345
|
+
const total = await storage.getTotal(since);
|
|
346
|
+
const byProvider = await storage.getByProvider(since);
|
|
347
|
+
const byModel = await storage.getByModel(since);
|
|
348
|
+
return {
|
|
349
|
+
period: `Last ${hours} hours`,
|
|
350
|
+
total,
|
|
351
|
+
byProvider: Object.fromEntries(byProvider),
|
|
352
|
+
byModel: Object.fromEntries(byModel),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=cost-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-tracking.js","sourceRoot":"","sources":["../../src/cost-tracking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AI Matey Middleware
|
|
4
|
+
*
|
|
5
|
+
* Consolidated package containing all middleware components.
|
|
6
|
+
* Middleware provides cross-cutting concerns like caching, retry,
|
|
7
|
+
* logging, and security for the AI adapter system.
|
|
8
|
+
*
|
|
9
|
+
* @module ai.matey.middleware
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
23
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
// Middleware components
|
|
27
|
+
__exportStar(require("./caching.js"), exports);
|
|
28
|
+
__exportStar(require("./conversation-history.js"), exports);
|
|
29
|
+
__exportStar(require("./cost-tracking.js"), exports);
|
|
30
|
+
__exportStar(require("./logging.js"), exports);
|
|
31
|
+
__exportStar(require("./opentelemetry.js"), exports);
|
|
32
|
+
__exportStar(require("./retry.js"), exports);
|
|
33
|
+
__exportStar(require("./security.js"), exports);
|
|
34
|
+
__exportStar(require("./telemetry.js"), exports);
|
|
35
|
+
__exportStar(require("./transform.js"), exports);
|
|
36
|
+
__exportStar(require("./validation.js"), exports);
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;AAEH,wBAAwB;AACxB,+CAA6B;AAC7B,4DAA0C;AAC1C,qDAAmC;AACnC,+CAA6B;AAC7B,qDAAmC;AACnC,6CAA2B;AAC3B,gDAA8B;AAC9B,iDAA+B;AAC/B,iDAA+B;AAC/B,kDAAgC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logging Middleware
|
|
4
|
+
*
|
|
5
|
+
* Logs requests, responses, and errors with configurable levels and sanitization.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createLoggingMiddleware = createLoggingMiddleware;
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Default Logger
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Default console logger.
|
|
16
|
+
*/
|
|
17
|
+
const defaultLogger = {
|
|
18
|
+
debug: (message, data) => {
|
|
19
|
+
// eslint-disable-next-line no-console
|
|
20
|
+
console.debug(message, data !== undefined ? data : '');
|
|
21
|
+
},
|
|
22
|
+
info: (message, data) => {
|
|
23
|
+
// eslint-disable-next-line no-console
|
|
24
|
+
console.info(message, data !== undefined ? data : '');
|
|
25
|
+
},
|
|
26
|
+
warn: (message, data) => {
|
|
27
|
+
console.warn(message, data !== undefined ? data : '');
|
|
28
|
+
},
|
|
29
|
+
error: (message, data) => {
|
|
30
|
+
console.error(message, data !== undefined ? data : '');
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Sanitization
|
|
35
|
+
// ============================================================================
|
|
36
|
+
/**
|
|
37
|
+
* Sanitize sensitive data from objects.
|
|
38
|
+
*/
|
|
39
|
+
function sanitizeData(data) {
|
|
40
|
+
if (data === null || data === undefined) {
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
if (typeof data !== 'object') {
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(data)) {
|
|
47
|
+
return data.map(sanitizeData);
|
|
48
|
+
}
|
|
49
|
+
const sanitized = {};
|
|
50
|
+
const sensitiveKeys = ['apiKey', 'api_key', 'authorization', 'token', 'secret', 'password'];
|
|
51
|
+
for (const [key, value] of Object.entries(data)) {
|
|
52
|
+
const lowerKey = key.toLowerCase();
|
|
53
|
+
if (sensitiveKeys.some((sensitive) => lowerKey.includes(sensitive))) {
|
|
54
|
+
sanitized[key] = '[REDACTED]';
|
|
55
|
+
}
|
|
56
|
+
else if (typeof value === 'object' && value !== null) {
|
|
57
|
+
sanitized[key] = sanitizeData(value);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
sanitized[key] = value;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return sanitized;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sanitize request for logging.
|
|
67
|
+
*/
|
|
68
|
+
function sanitizeRequest(request, shouldSanitize) {
|
|
69
|
+
if (!shouldSanitize) {
|
|
70
|
+
return request;
|
|
71
|
+
}
|
|
72
|
+
return sanitizeData(request);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Sanitize response for logging.
|
|
76
|
+
*/
|
|
77
|
+
function sanitizeResponse(response, shouldSanitize) {
|
|
78
|
+
if (!shouldSanitize) {
|
|
79
|
+
return response;
|
|
80
|
+
}
|
|
81
|
+
return sanitizeData(response);
|
|
82
|
+
}
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// Log Level Comparison
|
|
85
|
+
// ============================================================================
|
|
86
|
+
const LOG_LEVELS = {
|
|
87
|
+
debug: 0,
|
|
88
|
+
info: 1,
|
|
89
|
+
warn: 2,
|
|
90
|
+
error: 3,
|
|
91
|
+
};
|
|
92
|
+
function shouldLog(currentLevel, targetLevel) {
|
|
93
|
+
return LOG_LEVELS[targetLevel] >= LOG_LEVELS[currentLevel];
|
|
94
|
+
}
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// Middleware Factory
|
|
97
|
+
// ============================================================================
|
|
98
|
+
/**
|
|
99
|
+
* Create logging middleware.
|
|
100
|
+
*
|
|
101
|
+
* Logs requests, responses, and errors at configurable levels.
|
|
102
|
+
*
|
|
103
|
+
* @param config Logging configuration
|
|
104
|
+
* @returns Logging middleware
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* const logging = createLoggingMiddleware({
|
|
109
|
+
* level: 'info',
|
|
110
|
+
* logRequests: true,
|
|
111
|
+
* logResponses: true,
|
|
112
|
+
* sanitize: true
|
|
113
|
+
* });
|
|
114
|
+
*
|
|
115
|
+
* bridge.use(logging);
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
function createLoggingMiddleware(config = {}) {
|
|
119
|
+
const { level = 'info', logRequests = true, logResponses = true, logErrors = true, sanitize = true, logger = defaultLogger, prefix = '[Bridge]', } = config;
|
|
120
|
+
return async (context, next) => {
|
|
121
|
+
const startTime = Date.now();
|
|
122
|
+
const requestId = context.request.metadata.requestId;
|
|
123
|
+
// Log request
|
|
124
|
+
if (logRequests && shouldLog(level, 'debug')) {
|
|
125
|
+
logger.debug(`${prefix} Request ${requestId}`, {
|
|
126
|
+
model: context.request.parameters?.model,
|
|
127
|
+
messages: context.request.messages.length,
|
|
128
|
+
stream: context.request.stream,
|
|
129
|
+
frontend: context.request.metadata.provenance?.frontend,
|
|
130
|
+
backend: context.request.metadata.provenance?.backend,
|
|
131
|
+
});
|
|
132
|
+
if (shouldLog(level, 'debug')) {
|
|
133
|
+
logger.debug(`${prefix} Request details ${requestId}`, {
|
|
134
|
+
request: sanitizeRequest(context.request, sanitize),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
// Call next middleware/handler
|
|
140
|
+
const response = await next();
|
|
141
|
+
// Calculate duration
|
|
142
|
+
const duration = Date.now() - startTime;
|
|
143
|
+
// Log response
|
|
144
|
+
if (logResponses && shouldLog(level, 'info')) {
|
|
145
|
+
logger.info(`${prefix} Response ${requestId}`, {
|
|
146
|
+
duration: `${duration}ms`,
|
|
147
|
+
finishReason: response.finishReason,
|
|
148
|
+
tokens: response.usage?.totalTokens,
|
|
149
|
+
backend: response.metadata.provenance?.backend,
|
|
150
|
+
});
|
|
151
|
+
if (shouldLog(level, 'debug')) {
|
|
152
|
+
logger.debug(`${prefix} Response details ${requestId}`, {
|
|
153
|
+
response: sanitizeResponse(response, sanitize),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return response;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
const duration = Date.now() - startTime;
|
|
161
|
+
// Log error
|
|
162
|
+
if (logErrors && shouldLog(level, 'error')) {
|
|
163
|
+
logger.error(`${prefix} Error ${requestId}`, {
|
|
164
|
+
duration: `${duration}ms`,
|
|
165
|
+
error: error instanceof Error ? error.message : String(error),
|
|
166
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// Re-throw error
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":"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"}
|