@llmtracer/sdk 1.1.0 → 2.1.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 (102) hide show
  1. package/dist/cjs/auto.d.ts +2 -0
  2. package/dist/cjs/auto.d.ts.map +1 -0
  3. package/dist/cjs/auto.js +5 -0
  4. package/dist/cjs/auto.js.map +1 -0
  5. package/dist/cjs/caller.d.ts +6 -0
  6. package/dist/cjs/caller.d.ts.map +1 -0
  7. package/dist/cjs/caller.js +62 -0
  8. package/dist/cjs/caller.js.map +1 -0
  9. package/dist/cjs/config.d.ts +7 -0
  10. package/dist/cjs/config.d.ts.map +1 -0
  11. package/dist/cjs/config.js +10 -0
  12. package/dist/cjs/config.js.map +1 -0
  13. package/dist/cjs/context.d.ts +9 -0
  14. package/dist/cjs/context.d.ts.map +1 -0
  15. package/dist/cjs/context.js +21 -0
  16. package/dist/cjs/context.js.map +1 -0
  17. package/dist/cjs/index.d.ts +20 -0
  18. package/dist/cjs/index.d.ts.map +1 -0
  19. package/dist/cjs/index.js +93 -0
  20. package/dist/cjs/index.js.map +1 -0
  21. package/dist/cjs/patcher.d.ts +4 -0
  22. package/dist/cjs/patcher.d.ts.map +1 -0
  23. package/dist/cjs/patcher.js +93 -0
  24. package/dist/cjs/patcher.js.map +1 -0
  25. package/dist/cjs/providers/anthropic.d.ts +4 -0
  26. package/dist/cjs/providers/anthropic.d.ts.map +1 -0
  27. package/dist/cjs/providers/anthropic.js +111 -0
  28. package/dist/cjs/providers/anthropic.js.map +1 -0
  29. package/dist/cjs/providers/index.d.ts +3 -0
  30. package/dist/cjs/providers/index.d.ts.map +1 -0
  31. package/dist/cjs/providers/index.js +10 -0
  32. package/dist/cjs/providers/index.js.map +1 -0
  33. package/dist/cjs/providers/openai.d.ts +4 -0
  34. package/dist/cjs/providers/openai.d.ts.map +1 -0
  35. package/dist/cjs/providers/openai.js +108 -0
  36. package/dist/cjs/providers/openai.js.map +1 -0
  37. package/dist/cjs/schema.d.ts +18 -0
  38. package/dist/cjs/schema.d.ts.map +1 -0
  39. package/dist/cjs/schema.js +93 -0
  40. package/dist/cjs/schema.js.map +1 -0
  41. package/dist/cjs/transport.d.ts +6 -0
  42. package/dist/cjs/transport.d.ts.map +1 -0
  43. package/dist/cjs/transport.js +69 -0
  44. package/dist/cjs/transport.js.map +1 -0
  45. package/dist/cjs/wrapper.d.ts +3 -0
  46. package/dist/cjs/wrapper.d.ts.map +1 -0
  47. package/dist/cjs/wrapper.js +86 -0
  48. package/dist/cjs/wrapper.js.map +1 -0
  49. package/dist/esm/auto.d.ts +2 -0
  50. package/dist/esm/auto.d.ts.map +1 -0
  51. package/dist/esm/auto.js +3 -0
  52. package/dist/esm/auto.js.map +1 -0
  53. package/dist/esm/caller.d.ts +6 -0
  54. package/dist/esm/caller.d.ts.map +1 -0
  55. package/dist/esm/caller.js +59 -0
  56. package/dist/esm/caller.js.map +1 -0
  57. package/dist/esm/config.d.ts +7 -0
  58. package/dist/esm/config.d.ts.map +1 -0
  59. package/dist/esm/config.js +7 -0
  60. package/dist/esm/config.js.map +1 -0
  61. package/dist/esm/context.d.ts +9 -0
  62. package/dist/esm/context.d.ts.map +1 -0
  63. package/dist/esm/context.js +17 -0
  64. package/dist/esm/context.js.map +1 -0
  65. package/dist/esm/index.d.ts +20 -0
  66. package/dist/esm/index.d.ts.map +1 -0
  67. package/dist/esm/index.js +53 -0
  68. package/dist/esm/index.js.map +1 -0
  69. package/dist/esm/package.json +1 -0
  70. package/dist/esm/patcher.d.ts +4 -0
  71. package/dist/esm/patcher.d.ts.map +1 -0
  72. package/dist/esm/patcher.js +88 -0
  73. package/dist/esm/patcher.js.map +1 -0
  74. package/dist/esm/providers/anthropic.d.ts +4 -0
  75. package/dist/esm/providers/anthropic.d.ts.map +1 -0
  76. package/dist/esm/providers/anthropic.js +74 -0
  77. package/dist/esm/providers/anthropic.js.map +1 -0
  78. package/dist/esm/providers/index.d.ts +3 -0
  79. package/dist/esm/providers/index.d.ts.map +1 -0
  80. package/dist/esm/providers/index.js +3 -0
  81. package/dist/esm/providers/index.js.map +1 -0
  82. package/dist/esm/providers/openai.d.ts +4 -0
  83. package/dist/esm/providers/openai.d.ts.map +1 -0
  84. package/dist/esm/providers/openai.js +71 -0
  85. package/dist/esm/providers/openai.js.map +1 -0
  86. package/dist/esm/schema.d.ts +18 -0
  87. package/dist/esm/schema.d.ts.map +1 -0
  88. package/dist/esm/schema.js +88 -0
  89. package/dist/esm/schema.js.map +1 -0
  90. package/dist/esm/transport.d.ts +6 -0
  91. package/dist/esm/transport.d.ts.map +1 -0
  92. package/dist/esm/transport.js +62 -0
  93. package/dist/esm/transport.js.map +1 -0
  94. package/dist/esm/wrapper.d.ts +3 -0
  95. package/dist/esm/wrapper.d.ts.map +1 -0
  96. package/dist/esm/wrapper.js +50 -0
  97. package/dist/esm/wrapper.js.map +1 -0
  98. package/package.json +56 -11
  99. package/dist/index.d.ts +0 -118
  100. package/dist/index.d.ts.map +0 -1
  101. package/dist/index.js +0 -568
  102. package/dist/index.js.map +0 -1
package/dist/index.js DELETED
@@ -1,568 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LLMTracer = void 0;
4
- const crypto_1 = require("crypto");
5
- // ─── SDK Version ───────────────────────────────────────────────────
6
- const SDK_VERSION = "1.1.0";
7
- const SDK_LANGUAGE = "typescript";
8
- // ─── Main SDK Class ────────────────────────────────────────────────
9
- class LLMTracer {
10
- constructor(config) {
11
- // Event queue
12
- this.queue = [];
13
- this.droppedCount = 0;
14
- // Flush timer
15
- this.flushTimer = null;
16
- // Circuit breaker (Section 6.3: 5 failures → open, 60s cooldown)
17
- this.circuitState = "closed";
18
- this.consecutiveFailures = 0;
19
- this.circuitOpenedAt = 0;
20
- this.lastErrorSummary = "";
21
- this.circuitFailureThreshold = 5;
22
- this.circuitCooldownMs = 60000;
23
- // Trace context for agentic workflows
24
- this.activeTraceId = null;
25
- this.activePhase = null;
26
- this.activeTraceSampled = true;
27
- // Flush lock to prevent concurrent flushes
28
- this.flushing = false;
29
- this.apiKey = config.apiKey;
30
- this.endpoint = config.endpoint || "https://v1events-agbjrxekeq-uc.a.run.app";
31
- this.maxBatchSize = config.maxBatchSize ?? 50;
32
- this.flushIntervalMs = config.flushIntervalMs ?? 10000;
33
- this.maxQueueSize = config.maxQueueSize ?? 10000;
34
- this.maxRetries = config.maxRetries ?? 3;
35
- this.retryBaseMs = config.retryBaseMs ?? 1000;
36
- this.sampleRate = config.sampleRate ?? 1.0;
37
- this.capturePrompt = config.capturePrompt ?? false;
38
- this.debugMode = config.debug ?? false;
39
- this.onFlushCallback = config.onFlush ?? null;
40
- this.onErrorCallback = config.onError ?? null;
41
- // Start auto-flush timer
42
- this.flushTimer = setInterval(() => {
43
- this.flush().catch(() => { });
44
- }, this.flushIntervalMs);
45
- // Unref so it doesn't keep the process alive
46
- if (this.flushTimer && typeof this.flushTimer.unref === "function") {
47
- this.flushTimer.unref();
48
- }
49
- // Best-effort process exit hooks (Section 6.1)
50
- try {
51
- process.on("beforeExit", () => {
52
- this.flush().catch(() => { });
53
- });
54
- }
55
- catch {
56
- // Not in Node.js environment — skip
57
- }
58
- this.log("LLMTracer initialized");
59
- }
60
- // ─── Public API: instrumentOpenAI (Section 3.1) ─────────────────
61
- /**
62
- * Wraps an OpenAI client to automatically capture usage events.
63
- * Supports both non-streaming and streaming calls.
64
- *
65
- * Usage:
66
- * tracer.instrumentOpenAI(openai, { tags: { service: "api" } });
67
- */
68
- instrumentOpenAI(openai, options) {
69
- try {
70
- const defaultTags = options?.tags || {};
71
- const self = this;
72
- // Store original create method
73
- const originalCreate = openai.chat?.completions?.create?.bind(openai.chat.completions);
74
- if (!originalCreate) {
75
- this.log("Warning: Could not find openai.chat.completions.create");
76
- return;
77
- }
78
- // Replace with instrumented version
79
- openai.chat.completions.create = async function (params, requestOptions) {
80
- const startTime = Date.now();
81
- // Extract per-call tags from llmtracer property, then remove it
82
- // so the real OpenAI API doesn't see it.
83
- let mergedTags = defaultTags;
84
- if (params?.llmtracer) {
85
- const perCallTags = params.llmtracer.tags || {};
86
- mergedTags = { ...defaultTags, ...perCallTags };
87
- // Shallow-clone to avoid mutating user's object
88
- params = { ...params };
89
- delete params.llmtracer;
90
- }
91
- const isStreaming = params?.stream === true;
92
- if (isStreaming) {
93
- return self.handleStreamingCall(originalCreate, params, requestOptions, startTime, mergedTags);
94
- }
95
- else {
96
- return self.handleNonStreamingCall(originalCreate, params, requestOptions, startTime, mergedTags);
97
- }
98
- };
99
- this.log("OpenAI client instrumented");
100
- }
101
- catch (err) {
102
- // P0: Never break customer app
103
- this.handleInternalError("instrumentOpenAI", err);
104
- }
105
- }
106
- // ─── Public API: flush (Section 3.2) ─────────────────────────────
107
- /**
108
- * Flush all buffered events to the backend.
109
- * CRITICAL: Call this before returning in serverless environments.
110
- *
111
- * Usage:
112
- * await tracer.flush();
113
- */
114
- async flush() {
115
- if (this.flushing || this.queue.length === 0) {
116
- return;
117
- }
118
- this.flushing = true;
119
- try {
120
- // Check circuit breaker
121
- if (this.circuitState === "open") {
122
- const elapsed = Date.now() - this.circuitOpenedAt;
123
- if (elapsed < this.circuitCooldownMs) {
124
- this.log(`Circuit open, ${Math.round((this.circuitCooldownMs - elapsed) / 1000)}s until retry`);
125
- return;
126
- }
127
- // Try half-open
128
- this.circuitState = "half_open";
129
- this.log("Circuit half-open, attempting flush");
130
- }
131
- // Take batch from queue (up to maxBatchSize)
132
- const batch = this.queue.splice(0, this.maxBatchSize);
133
- const droppedThisFlush = this.droppedCount;
134
- this.droppedCount = 0;
135
- let lastError = null;
136
- let accepted = 0;
137
- let rejected = 0;
138
- try {
139
- const result = await this.sendBatch(batch);
140
- accepted = result.accepted;
141
- rejected = result.rejected;
142
- // Success — reset circuit breaker
143
- this.consecutiveFailures = 0;
144
- if (this.circuitState === "half_open") {
145
- this.circuitState = "closed";
146
- this.log("Circuit closed");
147
- }
148
- }
149
- catch (err) {
150
- lastError = err instanceof Error ? err : new Error(String(err));
151
- this.handleTransportError(lastError);
152
- // Put events back in queue for retry
153
- this.queue.unshift(...batch);
154
- this.enforceQueueLimit();
155
- }
156
- // Invoke onFlush callback (Section 9.2)
157
- if (this.onFlushCallback) {
158
- try {
159
- this.onFlushCallback({
160
- sent: batch.length,
161
- accepted,
162
- rejected,
163
- dropped: droppedThisFlush,
164
- last_error: lastError,
165
- });
166
- }
167
- catch {
168
- // Never break on callback errors
169
- }
170
- }
171
- }
172
- finally {
173
- this.flushing = false;
174
- }
175
- // If there are more events queued, schedule another flush
176
- if (this.queue.length >= this.maxBatchSize) {
177
- // Use setImmediate/setTimeout to avoid stack overflow
178
- setTimeout(() => this.flush().catch(() => { }), 0);
179
- }
180
- }
181
- // ─── Public API: trace (Section 3.3 — Agentic Workflows) ────────
182
- /**
183
- * Track an agentic workflow with phases.
184
- * All LLM calls within this trace are grouped together.
185
- * Sampling is per-trace (Section 11.1).
186
- *
187
- * Usage:
188
- * await tracer.trace("user-request-123", async (t) => {
189
- * await t.phase("planning", async () => {
190
- * await openai.chat.completions.create(...);
191
- * });
192
- * });
193
- */
194
- async trace(traceId, fn) {
195
- try {
196
- // Per-trace sampling (Section 11.1)
197
- const sampled = Math.random() < this.sampleRate;
198
- this.activeTraceId = traceId;
199
- this.activeTraceSampled = sampled;
200
- this.activePhase = null;
201
- const ctx = {
202
- traceId,
203
- currentPhase: null,
204
- sampled,
205
- phase: async (name, phaseFn) => {
206
- this.activePhase = name;
207
- ctx.currentPhase = name;
208
- try {
209
- await phaseFn();
210
- }
211
- finally {
212
- this.activePhase = null;
213
- ctx.currentPhase = null;
214
- }
215
- },
216
- };
217
- await fn(ctx);
218
- }
219
- catch (err) {
220
- // Re-throw user errors — we only swallow our own errors
221
- throw err;
222
- }
223
- finally {
224
- this.activeTraceId = null;
225
- this.activePhase = null;
226
- this.activeTraceSampled = true;
227
- }
228
- }
229
- // ─── Public API: shutdown ────────────────────────────────────────
230
- /**
231
- * Flush remaining events and stop the auto-flush timer.
232
- */
233
- async shutdown() {
234
- if (this.flushTimer) {
235
- clearInterval(this.flushTimer);
236
- this.flushTimer = null;
237
- }
238
- await this.flush();
239
- }
240
- // ─── Non-Streaming Handler ───────────────────────────────────────
241
- async handleNonStreamingCall(originalCreate, params, requestOptions, startTime, defaultTags) {
242
- let response;
243
- let success = true;
244
- let error = null;
245
- try {
246
- response = await originalCreate(params, requestOptions);
247
- }
248
- catch (err) {
249
- success = false;
250
- error = err;
251
- }
252
- // Capture event asynchronously (P0: no awaits on hot path)
253
- try {
254
- const latencyMs = Date.now() - startTime;
255
- const model = response?.model || params?.model || "unknown";
256
- const tokensIn = response?.usage?.prompt_tokens ?? 0;
257
- const tokensOut = response?.usage?.completion_tokens ?? 0;
258
- this.captureEvent({
259
- provider: "openai",
260
- model,
261
- tokens_in: tokensIn,
262
- tokens_out: tokensOut,
263
- latency_ms: latencyMs,
264
- success,
265
- messages: params?.messages,
266
- tags: defaultTags,
267
- });
268
- }
269
- catch (err) {
270
- // P0: Never break customer app
271
- this.handleInternalError("handleNonStreamingCall", err);
272
- }
273
- // Re-throw the original error if the API call failed
274
- if (!success) {
275
- throw error;
276
- }
277
- return response;
278
- }
279
- // ─── Streaming Handler (Section 7) ───────────────────────────────
280
- async handleStreamingCall(originalCreate, params, requestOptions, startTime, defaultTags) {
281
- try {
282
- // Shallow-clone to avoid mutating user's params (Section 7.3)
283
- const clonedParams = { ...params };
284
- // Inject stream_options for accurate token counts (Section 7.3)
285
- if (!clonedParams.stream_options) {
286
- clonedParams.stream_options = { include_usage: true };
287
- }
288
- else if (clonedParams.stream_options.include_usage === false) {
289
- // Debug warning when user explicitly disables usage
290
- this.log("Warning: stream_options.include_usage is false — token counts will be 0");
291
- }
292
- const stream = await originalCreate(clonedParams, requestOptions);
293
- // Wrap the async iterator to capture the final usage event
294
- const self = this;
295
- const model = params?.model || "unknown";
296
- const messages = params?.messages;
297
- let tokensIn = 0;
298
- let tokensOut = 0;
299
- let streamSuccess = true;
300
- let streamModel = model;
301
- const originalIterator = stream[Symbol.asyncIterator].bind(stream);
302
- stream[Symbol.asyncIterator] = function () {
303
- const iterator = originalIterator();
304
- return {
305
- async next() {
306
- try {
307
- const result = await iterator.next();
308
- if (!result.done) {
309
- const chunk = result.value;
310
- // Capture usage from the final chunk (Section 7.1)
311
- if (chunk.usage) {
312
- tokensIn = chunk.usage.prompt_tokens ?? tokensIn;
313
- tokensOut = chunk.usage.completion_tokens ?? tokensOut;
314
- }
315
- // Capture model from chunk if available
316
- if (chunk.model) {
317
- streamModel = chunk.model;
318
- }
319
- }
320
- if (result.done) {
321
- // Stream complete — capture one event (Section 7.1)
322
- const latencyMs = Date.now() - startTime;
323
- self.captureEvent({
324
- provider: "openai",
325
- model: streamModel,
326
- tokens_in: tokensIn,
327
- tokens_out: tokensOut,
328
- latency_ms: latencyMs,
329
- success: streamSuccess,
330
- messages,
331
- tags: defaultTags,
332
- });
333
- }
334
- return result;
335
- }
336
- catch (err) {
337
- // Stream error (Section 7.4)
338
- streamSuccess = false;
339
- const latencyMs = Date.now() - startTime;
340
- self.captureEvent({
341
- provider: "openai",
342
- model: streamModel,
343
- tokens_in: tokensIn,
344
- tokens_out: tokensOut,
345
- latency_ms: latencyMs,
346
- success: false,
347
- messages,
348
- tags: defaultTags,
349
- });
350
- throw err; // Re-throw to customer code
351
- }
352
- },
353
- return: iterator.return?.bind(iterator),
354
- throw: iterator.throw?.bind(iterator),
355
- };
356
- };
357
- return stream;
358
- }
359
- catch (err) {
360
- // Stream setup failed
361
- const latencyMs = Date.now() - startTime;
362
- this.captureEvent({
363
- provider: "openai",
364
- model: params?.model || "unknown",
365
- tokens_in: 0,
366
- tokens_out: 0,
367
- latency_ms: latencyMs,
368
- success: false,
369
- messages: params?.messages,
370
- tags: defaultTags,
371
- });
372
- throw err; // Re-throw to customer code
373
- }
374
- }
375
- // ─── Event Capture ───────────────────────────────────────────────
376
- captureEvent(data) {
377
- try {
378
- // Per-trace sampling (Section 11.1)
379
- if (this.activeTraceId && !this.activeTraceSampled) {
380
- return;
381
- }
382
- // Per-event sampling (Section 11.2)
383
- if (!this.activeTraceId && Math.random() >= this.sampleRate) {
384
- return;
385
- }
386
- // Compute prompt_hash (Section 10.1)
387
- let promptHash = null;
388
- let promptContent = null;
389
- if (data.messages) {
390
- const messagesJson = JSON.stringify(data.messages);
391
- promptHash = (0, crypto_1.createHash)("sha256").update(messagesJson).digest("hex");
392
- if (this.capturePrompt) {
393
- promptContent = messagesJson;
394
- }
395
- }
396
- const event = {
397
- event_id: `evt_${(0, crypto_1.randomUUID)()}`,
398
- timestamp: new Date().toISOString(),
399
- provider: data.provider,
400
- model: data.model,
401
- tokens_in: data.tokens_in,
402
- tokens_out: data.tokens_out,
403
- latency_ms: data.latency_ms,
404
- success: data.success,
405
- trace_id: this.activeTraceId,
406
- span_id: null,
407
- parent_span_id: null,
408
- phase: this.activePhase,
409
- prompt_hash: promptHash,
410
- prompt_content: promptContent,
411
- tags: { ...data.tags },
412
- sdk_version: SDK_VERSION,
413
- sdk_language: SDK_LANGUAGE,
414
- };
415
- this.queue.push(event);
416
- this.enforceQueueLimit();
417
- this.log(`Event captured: ${event.model} (${event.tokens_in}in/${event.tokens_out}out)`);
418
- // Auto-flush if batch is full
419
- if (this.queue.length >= this.maxBatchSize) {
420
- this.flush().catch(() => { });
421
- }
422
- }
423
- catch (err) {
424
- // P0: Never break customer app
425
- this.handleInternalError("captureEvent", err);
426
- }
427
- }
428
- // ─── Transport (Section 5 & 6) ──────────────────────────────────
429
- async sendBatch(events) {
430
- const idempotencyKey = `idem_${(0, crypto_1.randomUUID)()}`;
431
- const body = JSON.stringify({
432
- schema_version: "1.0",
433
- events,
434
- });
435
- let lastError = null;
436
- for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
437
- try {
438
- if (attempt > 0) {
439
- // Exponential backoff with jitter (Section 6.2)
440
- const delay = this.retryBaseMs * Math.pow(2, attempt - 1) * (0.5 + Math.random() * 0.5);
441
- await this.sleep(delay);
442
- }
443
- const response = await fetch(this.endpoint, {
444
- method: "POST",
445
- headers: {
446
- "Content-Type": "application/json",
447
- Authorization: `Bearer ${this.apiKey}`,
448
- "X-Idempotency-Key": idempotencyKey,
449
- },
450
- body,
451
- });
452
- // Success
453
- if (response.status === 202) {
454
- const data = (await response.json());
455
- this.log(`Flush success: ${data.accepted} accepted, ${data.rejected} rejected`);
456
- return { accepted: data.accepted ?? 0, rejected: data.rejected ?? 0 };
457
- }
458
- // Read response body for error details
459
- let responseBody = "";
460
- try {
461
- responseBody = await response.text();
462
- }
463
- catch {
464
- // Ignore body read failures
465
- }
466
- // Rate limited or tier exceeded (Section 5.5, 5.6)
467
- if (response.status === 429) {
468
- const retryAfter = response.headers.get("Retry-After");
469
- this.log(`Flush failed: 429 Rate Limited - retry after ${retryAfter}s`);
470
- lastError = new Error(`Rate limited (429)`);
471
- this.lastErrorSummary = "429 Rate Limited";
472
- continue;
473
- }
474
- // Auth error — don't retry
475
- if (response.status === 401) {
476
- this.log(`Flush failed: 401 Unauthorized - ${responseBody}`);
477
- this.log("Hint: API key may be invalid. Check your apiKey value.");
478
- lastError = new Error("Unauthorized — check your API key");
479
- this.lastErrorSummary = "401 Unauthorized";
480
- break;
481
- }
482
- // Bad request — don't retry
483
- if (response.status === 400) {
484
- this.log(`Flush failed: 400 Bad Request - ${responseBody}`);
485
- this.log("Hint: Request rejected. SDK version may be outdated.");
486
- lastError = new Error(`Bad request (400): ${responseBody}`);
487
- this.lastErrorSummary = "400 Bad Request";
488
- break;
489
- }
490
- // Server error — retry
491
- if (response.status >= 500) {
492
- this.log(`Flush failed: ${response.status} Server Error - ${responseBody}`);
493
- lastError = new Error(`Server error (${response.status})`);
494
- this.lastErrorSummary = `${response.status} Server Error`;
495
- continue;
496
- }
497
- // Other client error — don't retry
498
- this.log(`Flush failed: ${response.status} - ${responseBody}`);
499
- lastError = new Error(`HTTP ${response.status}: ${responseBody}`);
500
- this.lastErrorSummary = `${response.status}`;
501
- break;
502
- }
503
- catch (err) {
504
- // Network error — retry
505
- lastError = err instanceof Error ? err : new Error(String(err));
506
- this.log(`Flush failed: Network error - ${lastError.message}`);
507
- this.log("Hint: Check your internet connection.");
508
- this.lastErrorSummary = "Network error";
509
- continue;
510
- }
511
- }
512
- throw lastError || new Error("Unknown transport error");
513
- }
514
- // ─── Circuit Breaker (Section 6.3) ──────────────────────────────
515
- handleTransportError(error) {
516
- this.consecutiveFailures++;
517
- if (this.consecutiveFailures >= this.circuitFailureThreshold) {
518
- this.circuitState = "open";
519
- this.circuitOpenedAt = Date.now();
520
- this.log(`Circuit opened after ${this.consecutiveFailures} failures (last error: ${this.lastErrorSummary}). Will retry in ${this.circuitCooldownMs / 1000}s.`);
521
- }
522
- // Invoke onError callback (Section 9.2)
523
- if (this.onErrorCallback) {
524
- try {
525
- this.onErrorCallback(error);
526
- }
527
- catch {
528
- // Never break on callback errors
529
- }
530
- }
531
- }
532
- // ─── Queue Management (Section 6.4) ─────────────────────────────
533
- enforceQueueLimit() {
534
- if (this.queue.length > this.maxQueueSize) {
535
- const excess = this.queue.length - this.maxQueueSize;
536
- this.queue.splice(0, excess); // Drop oldest (FIFO)
537
- this.droppedCount += excess;
538
- if (this.debugMode) {
539
- console.warn(`[LLMTracer] Dropped ${excess} events (queue full)`);
540
- }
541
- }
542
- }
543
- // ─── Helpers ─────────────────────────────────────────────────────
544
- handleInternalError(context, err) {
545
- // P0: Never break customer app — swallow and log
546
- if (this.debugMode) {
547
- console.warn(`[LLMTracer] Internal error in ${context}:`, err);
548
- }
549
- if (this.onErrorCallback) {
550
- try {
551
- this.onErrorCallback(err instanceof Error ? err : new Error(String(err)));
552
- }
553
- catch {
554
- // Even callback errors are swallowed
555
- }
556
- }
557
- }
558
- log(message) {
559
- if (this.debugMode) {
560
- console.log(`[LLMTracer] ${message}`);
561
- }
562
- }
563
- sleep(ms) {
564
- return new Promise((resolve) => setTimeout(resolve, ms));
565
- }
566
- }
567
- exports.LLMTracer = LLMTracer;
568
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}