@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
@@ -0,0 +1,53 @@
1
+ import { config } from './config';
2
+ import * as context from './context';
3
+ import * as transport from './transport';
4
+ import * as patcher from './patcher';
5
+ export const __version__ = '2.0.0';
6
+ export function init(options) {
7
+ try {
8
+ config.apiKey = options?.apiKey || process.env.LLMTRACER_API_KEY || '';
9
+ config.debug = options?.debug || false;
10
+ config.endpoint = options?.endpoint || 'https://us-central1-llmtracer-alt.cloudfunctions.net/v1Events';
11
+ config.enabled = Boolean(config.apiKey);
12
+ if (!config.enabled) {
13
+ if (config.debug)
14
+ console.log('[llmtracer] No API key found. Tracing disabled.');
15
+ return;
16
+ }
17
+ transport.start();
18
+ patcher.patchOpenAI(config.debug);
19
+ patcher.patchAnthropic(config.debug);
20
+ if (config.debug)
21
+ console.log('[llmtracer] Ready. Events \u2192 dashboard.llmtracer.com');
22
+ }
23
+ catch (e) {
24
+ config.enabled = false;
25
+ if (config.debug)
26
+ console.log(`[llmtracer] init() failed: ${e}. Tracing disabled.`);
27
+ }
28
+ }
29
+ export function trace(tags, fn) {
30
+ try {
31
+ if (!config.enabled) {
32
+ return fn();
33
+ }
34
+ return context.run(tags, fn);
35
+ }
36
+ catch {
37
+ return fn();
38
+ }
39
+ }
40
+ export async function flush() {
41
+ try {
42
+ await transport.flush();
43
+ }
44
+ catch {
45
+ // crash-proof: never throw
46
+ }
47
+ }
48
+ // For testing only — not part of public API
49
+ export { patcher as _patcher, transport as _transport, config as _config };
50
+ // Default export for ESM: import llmtracer from 'llmtracer'
51
+ const llmtracer = { init, trace, flush, __version__ };
52
+ export default llmtracer;
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,MAAM,UAAU,IAAI,CAAC,OAAiE;IACpF,IAAI,CAAC;QACH,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACvE,MAAM,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;QACvC,MAAM,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,+DAA+D,CAAC;QACvG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,SAAS,CAAC,KAAK,EAAE,CAAC;QAElB,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,qBAAqB,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAI,IAAyB,EAAE,EAAwB;IAC1E,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,SAAS,IAAI,UAAU,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC;AAE3E,4DAA4D;AAC5D,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACtD,eAAe,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,4 @@
1
+ export declare function patchOpenAI(debug: boolean): void;
2
+ export declare function patchAnthropic(debug: boolean): void;
3
+ export declare function unpatchAll(): void;
4
+ //# sourceMappingURL=patcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patcher.d.ts","sourceRoot":"","sources":["../../src/patcher.ts"],"names":[],"mappings":"AA4BA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBhD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBnD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAMjC"}
@@ -0,0 +1,88 @@
1
+ import { makeAsyncWrapper } from './wrapper';
2
+ import { parseOpenAIResponse, wrapOpenAIStream } from './providers/openai';
3
+ import { parseAnthropicResponse, wrapAnthropicStream } from './providers/anthropic';
4
+ const originals = new Map();
5
+ function getPackageVersion(packageName) {
6
+ try {
7
+ const path = require('path');
8
+ const fs = require('fs');
9
+ const entryPoint = require.resolve(packageName);
10
+ let dir = path.dirname(entryPoint);
11
+ while (dir !== path.dirname(dir)) {
12
+ const pkgPath = path.join(dir, 'package.json');
13
+ try {
14
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
15
+ if (pkg.name === packageName)
16
+ return pkg.version || 'unknown';
17
+ }
18
+ catch {
19
+ // no package.json here, keep walking up
20
+ }
21
+ dir = path.dirname(dir);
22
+ }
23
+ }
24
+ catch {
25
+ // ignore
26
+ }
27
+ return 'unknown';
28
+ }
29
+ export function patchOpenAI(debug) {
30
+ try {
31
+ const completionsModule = require('openai/resources/chat/completions');
32
+ const CompletionsProto = completionsModule.Completions?.prototype;
33
+ if (!CompletionsProto)
34
+ throw new Error('Completions prototype not found');
35
+ if (CompletionsProto._llmtracer_patched)
36
+ return;
37
+ const originalCreate = CompletionsProto.create;
38
+ CompletionsProto.create = makeAsyncWrapper(originalCreate, 'openai', parseOpenAIResponse, wrapOpenAIStream);
39
+ CompletionsProto._llmtracer_patched = true;
40
+ originals.set('openai.Completions.create', {
41
+ target: CompletionsProto,
42
+ methodName: 'create',
43
+ original: originalCreate,
44
+ });
45
+ if (debug) {
46
+ const version = getPackageVersion('openai');
47
+ console.log(`[llmtracer] \u2713 Patched openai (v${version})`);
48
+ }
49
+ }
50
+ catch (e) {
51
+ if (debug)
52
+ console.log(`[llmtracer] \u2717 openai not found or patch failed: ${e}`);
53
+ }
54
+ }
55
+ export function patchAnthropic(debug) {
56
+ try {
57
+ const messagesModule = require('@anthropic-ai/sdk/resources/messages');
58
+ const MessagesProto = messagesModule.Messages?.prototype;
59
+ if (!MessagesProto)
60
+ throw new Error('Messages prototype not found');
61
+ if (MessagesProto._llmtracer_patched)
62
+ return;
63
+ const originalCreate = MessagesProto.create;
64
+ MessagesProto.create = makeAsyncWrapper(originalCreate, 'anthropic', parseAnthropicResponse, wrapAnthropicStream);
65
+ MessagesProto._llmtracer_patched = true;
66
+ originals.set('anthropic.Messages.create', {
67
+ target: MessagesProto,
68
+ methodName: 'create',
69
+ original: originalCreate,
70
+ });
71
+ if (debug) {
72
+ const version = getPackageVersion('@anthropic-ai/sdk');
73
+ console.log(`[llmtracer] \u2713 Patched anthropic (v${version})`);
74
+ }
75
+ }
76
+ catch (e) {
77
+ if (debug)
78
+ console.log(`[llmtracer] \u2717 anthropic not found or patch failed: ${e}`);
79
+ }
80
+ }
81
+ export function unpatchAll() {
82
+ for (const [, entry] of originals) {
83
+ entry.target[entry.methodName] = entry.original;
84
+ delete entry.target._llmtracer_patched;
85
+ }
86
+ originals.clear();
87
+ }
88
+ //# sourceMappingURL=patcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patcher.js","sourceRoot":"","sources":["../../src/patcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ContextData, ResponseData } from '../schema';
2
+ export declare function parseAnthropicResponse(result: any): ResponseData;
3
+ export declare function wrapAnthropicStream(result: any, context: ContextData, elapsedMs: number, args: any[]): any;
4
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGhF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY,CAQhE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CA4D1G"}
@@ -0,0 +1,74 @@
1
+ import { config } from '../config';
2
+ import { buildEvent, printCapture } from '../schema';
3
+ import * as transport from '../transport';
4
+ export function parseAnthropicResponse(result) {
5
+ return {
6
+ provider: 'anthropic',
7
+ model: result?.model || 'unknown',
8
+ input_tokens: result?.usage?.input_tokens || 0,
9
+ output_tokens: result?.usage?.output_tokens || 0,
10
+ status: result?.stop_reason ? 'success' : 'error',
11
+ };
12
+ }
13
+ export function wrapAnthropicStream(result, context, elapsedMs, args) {
14
+ let model = 'unknown';
15
+ let inputTokens = 0;
16
+ let outputTokens = 0;
17
+ function record() {
18
+ const event = buildEvent(context, {
19
+ provider: 'anthropic',
20
+ model,
21
+ input_tokens: inputTokens,
22
+ output_tokens: outputTokens,
23
+ status: 'success',
24
+ }, elapsedMs);
25
+ transport.enqueue(event);
26
+ if (config.debug)
27
+ printCapture(event);
28
+ }
29
+ return new Proxy(result, {
30
+ get(target, prop) {
31
+ if (prop === Symbol.asyncIterator) {
32
+ return function () {
33
+ const originalIterator = target[Symbol.asyncIterator]();
34
+ return {
35
+ async next() {
36
+ const iterResult = await originalIterator.next();
37
+ if (!iterResult.done) {
38
+ const event = iterResult.value;
39
+ // Anthropic stream events:
40
+ // - message_start: contains model and input token count
41
+ // - message_delta: contains output token count
42
+ // - content_block_delta: contains text deltas
43
+ if (event?.type === 'message_start' && event.message) {
44
+ model = event.message.model || model;
45
+ inputTokens = event.message.usage?.input_tokens || inputTokens;
46
+ }
47
+ if (event?.type === 'message_delta' && event.usage) {
48
+ outputTokens = event.usage.output_tokens || outputTokens;
49
+ }
50
+ }
51
+ if (iterResult.done) {
52
+ try {
53
+ record();
54
+ }
55
+ catch {
56
+ // swallow
57
+ }
58
+ }
59
+ return iterResult;
60
+ },
61
+ return: originalIterator.return?.bind(originalIterator),
62
+ throw: originalIterator.throw?.bind(originalIterator),
63
+ };
64
+ };
65
+ }
66
+ const value = target[prop];
67
+ if (typeof value === 'function') {
68
+ return value.bind(target);
69
+ }
70
+ return value;
71
+ },
72
+ });
73
+ }
74
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { parseOpenAIResponse, wrapOpenAIStream } from './openai';
2
+ export { parseAnthropicResponse, wrapAnthropicStream } from './anthropic';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseOpenAIResponse, wrapOpenAIStream } from './openai';
2
+ export { parseAnthropicResponse, wrapAnthropicStream } from './anthropic';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ContextData, ResponseData } from '../schema';
2
+ export declare function parseOpenAIResponse(result: any): ResponseData;
3
+ export declare function wrapOpenAIStream(result: any, context: ContextData, elapsedMs: number, args: any[]): any;
4
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGhF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY,CAQ7D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CA0DvG"}
@@ -0,0 +1,71 @@
1
+ import { config } from '../config';
2
+ import { buildEvent, printCapture } from '../schema';
3
+ import * as transport from '../transport';
4
+ export function parseOpenAIResponse(result) {
5
+ return {
6
+ provider: 'openai',
7
+ model: result?.model || 'unknown',
8
+ input_tokens: result?.usage?.prompt_tokens || 0,
9
+ output_tokens: result?.usage?.completion_tokens || 0,
10
+ status: 'success',
11
+ };
12
+ }
13
+ export function wrapOpenAIStream(result, context, elapsedMs, args) {
14
+ const chunks = [];
15
+ function record() {
16
+ // Look for usage in final chunks (OpenAI includes it when stream_options.include_usage = true)
17
+ let usage = null;
18
+ for (let i = chunks.length - 1; i >= 0; i--) {
19
+ if (chunks[i]?.usage) {
20
+ usage = chunks[i].usage;
21
+ break;
22
+ }
23
+ }
24
+ const model = chunks[0]?.model || 'unknown';
25
+ const event = buildEvent(context, {
26
+ provider: 'openai',
27
+ model,
28
+ input_tokens: usage?.prompt_tokens || 0,
29
+ output_tokens: usage?.completion_tokens || 0,
30
+ status: 'success',
31
+ }, elapsedMs);
32
+ transport.enqueue(event);
33
+ if (config.debug)
34
+ printCapture(event);
35
+ }
36
+ // Create a proxy that wraps the async iterator while forwarding everything else
37
+ return new Proxy(result, {
38
+ get(target, prop) {
39
+ if (prop === Symbol.asyncIterator) {
40
+ return function () {
41
+ const originalIterator = target[Symbol.asyncIterator]();
42
+ return {
43
+ async next() {
44
+ const iterResult = await originalIterator.next();
45
+ if (!iterResult.done) {
46
+ chunks.push(iterResult.value);
47
+ }
48
+ if (iterResult.done) {
49
+ try {
50
+ record();
51
+ }
52
+ catch {
53
+ // swallow
54
+ }
55
+ }
56
+ return iterResult;
57
+ },
58
+ return: originalIterator.return?.bind(originalIterator),
59
+ throw: originalIterator.throw?.bind(originalIterator),
60
+ };
61
+ };
62
+ }
63
+ const value = target[prop];
64
+ if (typeof value === 'function') {
65
+ return value.bind(target);
66
+ }
67
+ return value;
68
+ },
69
+ });
70
+ }
71
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { TraceContext } from './context';
2
+ import { getCallerInfo } from './caller';
3
+ export interface ContextData {
4
+ context: TraceContext | undefined;
5
+ caller: ReturnType<typeof getCallerInfo>;
6
+ provider: string;
7
+ }
8
+ export interface ResponseData {
9
+ provider: string;
10
+ model: string;
11
+ input_tokens: number;
12
+ output_tokens: number;
13
+ status: string;
14
+ }
15
+ export declare function buildContext(provider: string, args: any[]): ContextData;
16
+ export declare function buildEvent(contextData: ContextData, responseData: ResponseData, latencyMs: number): Record<string, any>;
17
+ export declare function printCapture(event: Record<string, any>): void;
18
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAc,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,WAAW,CAMvE;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAuBvH;AAmCD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAyB7D"}
@@ -0,0 +1,88 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { getCurrent } from './context';
3
+ import { getCallerInfo } from './caller';
4
+ const SDK_VERSION = '2.0.0';
5
+ const SDK_LANGUAGE = 'typescript';
6
+ export function buildContext(provider, args) {
7
+ return {
8
+ context: getCurrent(),
9
+ caller: getCallerInfo(),
10
+ provider,
11
+ };
12
+ }
13
+ export function buildEvent(contextData, responseData, latencyMs) {
14
+ const event = {
15
+ event_id: randomUUID(),
16
+ timestamp: new Date().toISOString(),
17
+ latency_ms: latencyMs,
18
+ sdk_version: SDK_VERSION,
19
+ sdk_language: SDK_LANGUAGE,
20
+ ...responseData,
21
+ ...contextData.caller,
22
+ };
23
+ if (contextData.context) {
24
+ event.trace_id = contextData.context.traceId;
25
+ event.span_id = contextData.context.spanId;
26
+ if (contextData.context.parentSpanId) {
27
+ event.parent_span_id = contextData.context.parentSpanId;
28
+ }
29
+ if (contextData.context.tags && Object.keys(contextData.context.tags).length > 0) {
30
+ event.tags = { ...contextData.context.tags };
31
+ }
32
+ }
33
+ return event;
34
+ }
35
+ // Cost lookup table for debug printing (per 1M tokens)
36
+ const COST_PER_M = {
37
+ 'gpt-4o': [2.5, 10],
38
+ 'gpt-4o-mini': [0.15, 0.6],
39
+ 'gpt-4-turbo': [10, 30],
40
+ 'gpt-4': [30, 60],
41
+ 'gpt-3.5-turbo': [0.5, 1.5],
42
+ 'o1': [15, 60],
43
+ 'o1-mini': [3, 12],
44
+ 'o3-mini': [1.1, 4.4],
45
+ 'claude-3-5-sonnet': [3, 15],
46
+ 'claude-3-5-haiku': [0.8, 4],
47
+ 'claude-3-opus': [15, 75],
48
+ 'claude-sonnet-4-5': [3, 15],
49
+ 'claude-haiku-4-5': [0.8, 4],
50
+ 'claude-opus-4-6': [15, 75],
51
+ };
52
+ function estimateCost(model, inputTokens, outputTokens) {
53
+ // Try exact match first, then prefix match
54
+ let rates = COST_PER_M[model];
55
+ if (!rates) {
56
+ for (const key of Object.keys(COST_PER_M)) {
57
+ if (model.startsWith(key)) {
58
+ rates = COST_PER_M[key];
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ if (!rates)
64
+ return 0;
65
+ return (inputTokens * rates[0] + outputTokens * rates[1]) / 1000000;
66
+ }
67
+ export function printCapture(event) {
68
+ const model = event.model || 'unknown';
69
+ const input = (event.input_tokens || 0).toLocaleString();
70
+ const output = (event.output_tokens || 0).toLocaleString();
71
+ const cost = estimateCost(model, event.input_tokens || 0, event.output_tokens || 0);
72
+ const latency = ((event.latency_ms || 0) / 1000).toFixed(1);
73
+ let file = '';
74
+ if (event.caller_file) {
75
+ const parts = event.caller_file.replace(/\\/g, '/').split('/');
76
+ const filename = parts[parts.length - 1];
77
+ file = event.caller_line ? `${filename}:${event.caller_line}` : filename;
78
+ }
79
+ let traceInfo = '';
80
+ if (event.tags) {
81
+ const firstValue = Object.values(event.tags)[0];
82
+ if (firstValue)
83
+ traceInfo = ` trace:${firstValue}`;
84
+ }
85
+ const costStr = cost > 0 ? ` $${cost.toFixed(4)}` : '';
86
+ console.log(`[llmtracer] ${event.provider}/${model} ${input}\u2192${output} tokens${costStr} ${latency}s (${file})${traceInfo}`);
87
+ }
88
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function start(): void;
2
+ export declare function enqueue(event: Record<string, any>): void;
3
+ export declare function flush(): Promise<void>;
4
+ export declare function stop(): void;
5
+ export declare function getQueueLength(): number;
6
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AAMA,wBAAgB,KAAK,IAAI,IAAI,CAG5B;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAWxD;AAED,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C;AAED,wBAAgB,IAAI,IAAI,IAAI,CAO3B;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,62 @@
1
+ import { config } from './config';
2
+ let eventQueue = [];
3
+ let flushTimer = null;
4
+ let firstBatch = true;
5
+ export function start() {
6
+ // Reset state for fresh start
7
+ firstBatch = true;
8
+ }
9
+ export function enqueue(event) {
10
+ eventQueue.push(event);
11
+ if (firstBatch) {
12
+ firstBatch = false;
13
+ // Flush immediately on first event
14
+ setImmediate(() => doFlush());
15
+ // Start regular 5s interval
16
+ flushTimer = setInterval(() => doFlush(), 5000);
17
+ flushTimer.unref();
18
+ }
19
+ }
20
+ export async function flush() {
21
+ await doFlush();
22
+ }
23
+ export function stop() {
24
+ if (flushTimer) {
25
+ clearInterval(flushTimer);
26
+ flushTimer = null;
27
+ }
28
+ eventQueue = [];
29
+ firstBatch = true;
30
+ }
31
+ export function getQueueLength() {
32
+ return eventQueue.length;
33
+ }
34
+ async function doFlush() {
35
+ if (eventQueue.length === 0)
36
+ return;
37
+ const events = eventQueue.splice(0);
38
+ try {
39
+ const payload = JSON.stringify({ events });
40
+ const response = await fetch(config.endpoint, {
41
+ method: 'POST',
42
+ headers: {
43
+ 'Content-Type': 'application/json',
44
+ 'Authorization': `Bearer ${config.apiKey}`,
45
+ },
46
+ body: payload,
47
+ signal: AbortSignal.timeout(10000),
48
+ });
49
+ if (config.debug) {
50
+ console.log(`[llmtracer] Flushed ${events.length} events \u2192 ${response.status}`);
51
+ }
52
+ }
53
+ catch (e) {
54
+ if (config.debug) {
55
+ console.log(`[llmtracer] Flush failed: ${e}`);
56
+ }
57
+ // Re-queue up to 100 events for retry
58
+ const requeue = events.slice(0, 100);
59
+ eventQueue.unshift(...requeue);
60
+ }
61
+ }
62
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,IAAI,UAAU,GAA0B,EAAE,CAAC;AAC3C,IAAI,UAAU,GAA0C,IAAI,CAAC;AAC7D,IAAI,UAAU,GAAG,IAAI,CAAC;AAEtB,MAAM,UAAU,KAAK;IACnB,8BAA8B;IAC9B,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAA0B;IAChD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,GAAG,KAAK,CAAC;QACnB,mCAAmC;QACnC,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9B,4BAA4B;QAC5B,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QAChD,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,UAAU,GAAG,EAAE,CAAC;IAChB,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEpC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;aAC3C;YACD,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,MAAM,kBAAkB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,sCAAsC;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrC,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ResponseData } from './schema';
2
+ export declare function makeAsyncWrapper(originalFn: Function, provider: string, parseResponseFn: (result: any) => ResponseData, wrapStreamFn: (result: any, context: any, elapsedMs: number, args: any[]) => any): Function;
3
+ //# sourceMappingURL=wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../src/wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,YAAY,EAAE,MAAM,UAAU,CAAC;AAGhF,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,QAAQ,EACpB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,YAAY,EAC9C,YAAY,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAC/E,QAAQ,CAgDV"}
@@ -0,0 +1,50 @@
1
+ import { config } from './config';
2
+ import { buildContext, buildEvent, printCapture } from './schema';
3
+ import * as transport from './transport';
4
+ export function makeAsyncWrapper(originalFn, provider, parseResponseFn, wrapStreamFn) {
5
+ const wrapped = async function (...args) {
6
+ if (!config.enabled) {
7
+ return originalFn.apply(this, args);
8
+ }
9
+ // 1. Capture context (safe, no-throw)
10
+ let context = null;
11
+ try {
12
+ context = buildContext(provider, args);
13
+ }
14
+ catch {
15
+ // context stays null
16
+ }
17
+ // 2. Detect streaming
18
+ const isStream = args[0]?.stream === true;
19
+ // 3. ALWAYS call original — never blocked, never modified
20
+ const start = performance.now();
21
+ const result = await originalFn.apply(this, args);
22
+ const elapsedMs = Math.round(performance.now() - start);
23
+ // 4. Handle streaming result
24
+ if (isStream && context) {
25
+ try {
26
+ return wrapStreamFn(result, context, elapsedMs, args);
27
+ }
28
+ catch {
29
+ return result;
30
+ }
31
+ }
32
+ // 5. Handle non-streaming result
33
+ if (context) {
34
+ try {
35
+ const event = buildEvent(context, parseResponseFn(result), elapsedMs);
36
+ transport.enqueue(event);
37
+ if (config.debug)
38
+ printCapture(event);
39
+ }
40
+ catch {
41
+ // swallow silently
42
+ }
43
+ }
44
+ return result;
45
+ };
46
+ // Preserve function name for debugging
47
+ Object.defineProperty(wrapped, 'name', { value: originalFn.name });
48
+ return wrapped;
49
+ }
50
+ //# sourceMappingURL=wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../src/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAgB,MAAM,UAAU,CAAC;AAChF,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAC9B,UAAoB,EACpB,QAAgB,EAChB,eAA8C,EAC9C,YAAgF;IAEhF,MAAM,OAAO,GAAG,KAAK,WAAsB,GAAG,IAAW;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,sCAAsC;QACtC,IAAI,OAAO,GAAQ,IAAI,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;QAED,sBAAsB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAE1C,0DAA0D;QAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;QAExD,6BAA6B;QAC7B,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;gBACtE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,MAAM,CAAC,KAAK;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,uCAAuC;IACvC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC;AACjB,CAAC"}