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.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/caching.js +226 -0
  3. package/dist/cjs/caching.js.map +1 -0
  4. package/dist/cjs/conversation-history.js +213 -0
  5. package/dist/cjs/conversation-history.js.map +1 -0
  6. package/dist/cjs/cost-tracking.js +355 -0
  7. package/dist/cjs/cost-tracking.js.map +1 -0
  8. package/dist/cjs/index.js +37 -0
  9. package/dist/cjs/index.js.map +1 -0
  10. package/dist/cjs/logging.js +174 -0
  11. package/dist/cjs/logging.js.map +1 -0
  12. package/dist/cjs/opentelemetry.js +499 -0
  13. package/dist/cjs/opentelemetry.js.map +1 -0
  14. package/dist/cjs/retry.js +205 -0
  15. package/dist/cjs/retry.js.map +1 -0
  16. package/dist/cjs/security.js +175 -0
  17. package/dist/cjs/security.js.map +1 -0
  18. package/dist/cjs/telemetry.js +216 -0
  19. package/dist/cjs/telemetry.js.map +1 -0
  20. package/dist/cjs/transform.js +284 -0
  21. package/dist/cjs/transform.js.map +1 -0
  22. package/dist/cjs/validation.js +506 -0
  23. package/dist/cjs/validation.js.map +1 -0
  24. package/dist/esm/caching.js +221 -0
  25. package/dist/esm/caching.js.map +1 -0
  26. package/dist/esm/conversation-history.js +207 -0
  27. package/dist/esm/conversation-history.js.map +1 -0
  28. package/dist/esm/cost-tracking.js +347 -0
  29. package/dist/esm/cost-tracking.js.map +1 -0
  30. package/dist/esm/index.js +21 -0
  31. package/dist/esm/index.js.map +1 -0
  32. package/dist/esm/logging.js +171 -0
  33. package/dist/esm/logging.js.map +1 -0
  34. package/dist/esm/opentelemetry.js +458 -0
  35. package/dist/esm/opentelemetry.js.map +1 -0
  36. package/dist/esm/retry.js +198 -0
  37. package/dist/esm/retry.js.map +1 -0
  38. package/dist/esm/security.js +169 -0
  39. package/dist/esm/security.js.map +1 -0
  40. package/dist/esm/telemetry.js +210 -0
  41. package/dist/esm/telemetry.js.map +1 -0
  42. package/dist/esm/transform.js +272 -0
  43. package/dist/esm/transform.js.map +1 -0
  44. package/dist/esm/validation.js +494 -0
  45. package/dist/esm/validation.js.map +1 -0
  46. package/dist/types/caching.d.ts +98 -0
  47. package/dist/types/caching.d.ts.map +1 -0
  48. package/dist/types/conversation-history.d.ts +188 -0
  49. package/dist/types/conversation-history.d.ts.map +1 -0
  50. package/dist/types/cost-tracking.d.ts +262 -0
  51. package/dist/types/cost-tracking.d.ts.map +1 -0
  52. package/dist/types/index.d.ts +20 -0
  53. package/dist/types/index.d.ts.map +1 -0
  54. package/dist/types/logging.d.ts +82 -0
  55. package/dist/types/logging.d.ts.map +1 -0
  56. package/dist/types/opentelemetry.d.ts +219 -0
  57. package/dist/types/opentelemetry.d.ts.map +1 -0
  58. package/dist/types/retry.d.ts +86 -0
  59. package/dist/types/retry.d.ts.map +1 -0
  60. package/dist/types/security.d.ts +120 -0
  61. package/dist/types/security.d.ts.map +1 -0
  62. package/dist/types/telemetry.d.ts +120 -0
  63. package/dist/types/telemetry.d.ts.map +1 -0
  64. package/dist/types/transform.d.ts +184 -0
  65. package/dist/types/transform.d.ts.map +1 -0
  66. package/dist/types/validation.d.ts +356 -0
  67. package/dist/types/validation.d.ts.map +1 -0
  68. package/package.json +203 -0
  69. 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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"}