@llmtracer/sdk 1.1.0 → 2.0.8

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/caller.d.ts +6 -0
  2. package/dist/cjs/caller.d.ts.map +1 -0
  3. package/dist/cjs/caller.js +62 -0
  4. package/dist/cjs/caller.js.map +1 -0
  5. package/dist/cjs/config.d.ts +7 -0
  6. package/dist/cjs/config.d.ts.map +1 -0
  7. package/dist/cjs/config.js +10 -0
  8. package/dist/cjs/config.js.map +1 -0
  9. package/dist/cjs/context.d.ts +9 -0
  10. package/dist/cjs/context.d.ts.map +1 -0
  11. package/dist/cjs/context.js +21 -0
  12. package/dist/cjs/context.js.map +1 -0
  13. package/dist/cjs/index.d.ts +20 -0
  14. package/dist/cjs/index.d.ts.map +1 -0
  15. package/dist/cjs/index.js +94 -0
  16. package/dist/cjs/index.js.map +1 -0
  17. package/dist/cjs/patcher.d.ts +5 -0
  18. package/dist/cjs/patcher.d.ts.map +1 -0
  19. package/dist/cjs/patcher.js +131 -0
  20. package/dist/cjs/patcher.js.map +1 -0
  21. package/dist/cjs/providers/anthropic.d.ts +4 -0
  22. package/dist/cjs/providers/anthropic.d.ts.map +1 -0
  23. package/dist/cjs/providers/anthropic.js +126 -0
  24. package/dist/cjs/providers/anthropic.js.map +1 -0
  25. package/dist/cjs/providers/google.d.ts +4 -0
  26. package/dist/cjs/providers/google.d.ts.map +1 -0
  27. package/dist/cjs/providers/google.js +133 -0
  28. package/dist/cjs/providers/google.js.map +1 -0
  29. package/dist/cjs/providers/index.d.ts +4 -0
  30. package/dist/cjs/providers/index.d.ts.map +1 -0
  31. package/dist/cjs/providers/index.js +13 -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 +123 -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 +98 -0
  40. package/dist/cjs/schema.js.map +1 -0
  41. package/dist/cjs/transport.d.ts +15 -0
  42. package/dist/cjs/transport.d.ts.map +1 -0
  43. package/dist/cjs/transport.js +130 -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 +97 -0
  48. package/dist/cjs/wrapper.js.map +1 -0
  49. package/dist/esm/caller.d.ts +6 -0
  50. package/dist/esm/caller.d.ts.map +1 -0
  51. package/dist/esm/caller.js +59 -0
  52. package/dist/esm/caller.js.map +1 -0
  53. package/dist/esm/config.d.ts +7 -0
  54. package/dist/esm/config.d.ts.map +1 -0
  55. package/dist/esm/config.js +7 -0
  56. package/dist/esm/config.js.map +1 -0
  57. package/dist/esm/context.d.ts +9 -0
  58. package/dist/esm/context.d.ts.map +1 -0
  59. package/dist/esm/context.js +17 -0
  60. package/dist/esm/context.js.map +1 -0
  61. package/dist/esm/index.d.ts +20 -0
  62. package/dist/esm/index.d.ts.map +1 -0
  63. package/dist/esm/index.js +54 -0
  64. package/dist/esm/index.js.map +1 -0
  65. package/dist/esm/package.json +1 -0
  66. package/dist/esm/patcher.d.ts +5 -0
  67. package/dist/esm/patcher.d.ts.map +1 -0
  68. package/dist/esm/patcher.js +125 -0
  69. package/dist/esm/patcher.js.map +1 -0
  70. package/dist/esm/providers/anthropic.d.ts +4 -0
  71. package/dist/esm/providers/anthropic.d.ts.map +1 -0
  72. package/dist/esm/providers/anthropic.js +89 -0
  73. package/dist/esm/providers/anthropic.js.map +1 -0
  74. package/dist/esm/providers/google.d.ts +4 -0
  75. package/dist/esm/providers/google.d.ts.map +1 -0
  76. package/dist/esm/providers/google.js +96 -0
  77. package/dist/esm/providers/google.js.map +1 -0
  78. package/dist/esm/providers/index.d.ts +4 -0
  79. package/dist/esm/providers/index.d.ts.map +1 -0
  80. package/dist/esm/providers/index.js +4 -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 +86 -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 +93 -0
  89. package/dist/esm/schema.js.map +1 -0
  90. package/dist/esm/transport.d.ts +15 -0
  91. package/dist/esm/transport.d.ts.map +1 -0
  92. package/dist/esm/transport.js +122 -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 +61 -0
  97. package/dist/esm/wrapper.js.map +1 -0
  98. package/package.json +52 -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,133 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseGoogleResponse = parseGoogleResponse;
37
+ exports.wrapGoogleStream = wrapGoogleStream;
38
+ const config_1 = require("../config");
39
+ const schema_1 = require("../schema");
40
+ const transport = __importStar(require("../transport"));
41
+ /**
42
+ * Extract token counts from a Google GenAI response.
43
+ * The JS SDK may use camelCase while Python uses snake_case — we check both.
44
+ */
45
+ function extractTokens(metadata) {
46
+ const inputTokens = metadata?.input_tokens ?? metadata?.inputTokens ??
47
+ metadata?.promptTokenCount ?? metadata?.prompt_token_count ?? 0;
48
+ const outputTokens = metadata?.output_tokens ?? metadata?.outputTokens ??
49
+ metadata?.candidatesTokenCount ?? metadata?.candidates_token_count ?? 0;
50
+ const cachedTokens = metadata?.cached_content_token_count ?? metadata?.cachedContentTokenCount ?? 0;
51
+ const thoughtsTokens = metadata?.thoughts_token_count ?? metadata?.thoughtsTokenCount ?? 0;
52
+ const toolUseTokens = metadata?.tool_use_prompt_token_count ?? metadata?.toolUsePromptTokenCount ?? 0;
53
+ const totalReported = metadata?.total_token_count ?? metadata?.totalTokenCount ?? 0;
54
+ return { inputTokens, outputTokens, cachedTokens, thoughtsTokens, toolUseTokens, totalReported };
55
+ }
56
+ function parseGoogleResponse(result) {
57
+ // Usage metadata may be at result.usageMetadata or result.usage_metadata
58
+ const metadata = result?.usageMetadata ?? result?.usage_metadata;
59
+ const { inputTokens, outputTokens, cachedTokens, thoughtsTokens, toolUseTokens, totalReported } = extractTokens(metadata);
60
+ if (config_1.config.debug) {
61
+ console.log(`[llmtracer] Google tokens — base_in=${inputTokens} cached=${cachedTokens} tools=${toolUseTokens} base_out=${outputTokens} thoughts=${thoughtsTokens} total_reported=${totalReported}`);
62
+ }
63
+ return {
64
+ provider: 'google',
65
+ model: result?.model ?? result?.modelVersion ?? 'unknown',
66
+ input_tokens: inputTokens + cachedTokens + toolUseTokens,
67
+ output_tokens: outputTokens + thoughtsTokens,
68
+ status: 'success',
69
+ };
70
+ }
71
+ function wrapGoogleStream(result, context, elapsedMs, args) {
72
+ let model = 'unknown';
73
+ let lastMetadata = null;
74
+ function record() {
75
+ const { inputTokens, outputTokens, cachedTokens, thoughtsTokens, toolUseTokens, totalReported } = extractTokens(lastMetadata);
76
+ if (config_1.config.debug) {
77
+ console.log(`[llmtracer] Google tokens — base_in=${inputTokens} cached=${cachedTokens} tools=${toolUseTokens} base_out=${outputTokens} thoughts=${thoughtsTokens} total_reported=${totalReported}`);
78
+ }
79
+ const event = (0, schema_1.buildEvent)(context, {
80
+ provider: 'google',
81
+ model,
82
+ input_tokens: inputTokens + cachedTokens + toolUseTokens,
83
+ output_tokens: outputTokens + thoughtsTokens,
84
+ status: 'success',
85
+ }, elapsedMs);
86
+ transport.enqueue(event);
87
+ if (config_1.config.debug)
88
+ (0, schema_1.printCapture)(event);
89
+ }
90
+ return new Proxy(result, {
91
+ get(target, prop) {
92
+ if (prop === Symbol.asyncIterator) {
93
+ return function () {
94
+ const originalIterator = target[Symbol.asyncIterator]();
95
+ return {
96
+ async next() {
97
+ const iterResult = await originalIterator.next();
98
+ if (!iterResult.done) {
99
+ const chunk = iterResult.value;
100
+ // Extract model from chunk if available
101
+ if (chunk?.model || chunk?.modelVersion) {
102
+ model = chunk.model ?? chunk.modelVersion ?? model;
103
+ }
104
+ // Accumulate usage metadata — last chunk typically has the final totals
105
+ const metadata = chunk?.usageMetadata ?? chunk?.usage_metadata;
106
+ if (metadata) {
107
+ lastMetadata = metadata;
108
+ }
109
+ }
110
+ if (iterResult.done) {
111
+ try {
112
+ record();
113
+ }
114
+ catch {
115
+ // swallow
116
+ }
117
+ }
118
+ return iterResult;
119
+ },
120
+ return: originalIterator.return?.bind(originalIterator),
121
+ throw: originalIterator.throw?.bind(originalIterator),
122
+ };
123
+ };
124
+ }
125
+ const value = target[prop];
126
+ if (typeof value === 'function') {
127
+ return value.bind(target);
128
+ }
129
+ return value;
130
+ },
131
+ });
132
+ }
133
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/providers/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { parseOpenAIResponse, wrapOpenAIStream } from './openai';
2
+ export { parseAnthropicResponse, wrapAnthropicStream } from './anthropic';
3
+ export { parseGoogleResponse, wrapGoogleStream } from './google';
4
+ //# 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;AAC1E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapGoogleStream = exports.parseGoogleResponse = exports.wrapAnthropicStream = exports.parseAnthropicResponse = exports.wrapOpenAIStream = exports.parseOpenAIResponse = void 0;
4
+ var openai_1 = require("./openai");
5
+ Object.defineProperty(exports, "parseOpenAIResponse", { enumerable: true, get: function () { return openai_1.parseOpenAIResponse; } });
6
+ Object.defineProperty(exports, "wrapOpenAIStream", { enumerable: true, get: function () { return openai_1.wrapOpenAIStream; } });
7
+ var anthropic_1 = require("./anthropic");
8
+ Object.defineProperty(exports, "parseAnthropicResponse", { enumerable: true, get: function () { return anthropic_1.parseAnthropicResponse; } });
9
+ Object.defineProperty(exports, "wrapAnthropicStream", { enumerable: true, get: function () { return anthropic_1.wrapAnthropicStream; } });
10
+ var google_1 = require("./google");
11
+ Object.defineProperty(exports, "parseGoogleResponse", { enumerable: true, get: function () { return google_1.parseGoogleResponse; } });
12
+ Object.defineProperty(exports, "wrapGoogleStream", { enumerable: true, get: function () { return google_1.wrapGoogleStream; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":";;;AAAA,mCAAiE;AAAxD,6GAAA,mBAAmB,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAC9C,yCAA0E;AAAjE,mHAAA,sBAAsB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AACpD,mCAAiE;AAAxD,6GAAA,mBAAmB,OAAA;AAAE,0GAAA,gBAAgB,OAAA"}
@@ -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,CAoB7D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAqEvG"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseOpenAIResponse = parseOpenAIResponse;
37
+ exports.wrapOpenAIStream = wrapOpenAIStream;
38
+ const config_1 = require("../config");
39
+ const schema_1 = require("../schema");
40
+ const transport = __importStar(require("../transport"));
41
+ function parseOpenAIResponse(result) {
42
+ const usage = result?.usage;
43
+ const inputTokens = usage?.prompt_tokens || 0;
44
+ const outputTokens = usage?.completion_tokens || 0;
45
+ if (config_1.config.debug) {
46
+ const reasoning = usage?.completion_tokens_details?.reasoning_tokens || 0;
47
+ const cached = usage?.prompt_tokens_details?.cached_tokens || 0;
48
+ console.log(`[llmtracer] OpenAI tokens — in=${inputTokens} out=${outputTokens} reasoning=${reasoning} cached=${cached}`);
49
+ }
50
+ return {
51
+ provider: 'openai',
52
+ model: result?.model || 'unknown',
53
+ input_tokens: inputTokens,
54
+ output_tokens: outputTokens,
55
+ status: 'success',
56
+ };
57
+ }
58
+ function wrapOpenAIStream(result, context, elapsedMs, args) {
59
+ const chunks = [];
60
+ function record() {
61
+ // Look for usage in final chunks (OpenAI includes it when stream_options.include_usage = true)
62
+ let usage = null;
63
+ for (let i = chunks.length - 1; i >= 0; i--) {
64
+ if (chunks[i]?.usage) {
65
+ usage = chunks[i].usage;
66
+ break;
67
+ }
68
+ }
69
+ const model = chunks[0]?.model || 'unknown';
70
+ const inputTokens = usage?.prompt_tokens || 0;
71
+ const outputTokens = usage?.completion_tokens || 0;
72
+ if (config_1.config.debug) {
73
+ const reasoning = usage?.completion_tokens_details?.reasoning_tokens || 0;
74
+ const cached = usage?.prompt_tokens_details?.cached_tokens || 0;
75
+ console.log(`[llmtracer] OpenAI tokens — in=${inputTokens} out=${outputTokens} reasoning=${reasoning} cached=${cached}`);
76
+ }
77
+ const event = (0, schema_1.buildEvent)(context, {
78
+ provider: 'openai',
79
+ model,
80
+ input_tokens: inputTokens,
81
+ output_tokens: outputTokens,
82
+ status: 'success',
83
+ }, elapsedMs);
84
+ transport.enqueue(event);
85
+ if (config_1.config.debug)
86
+ (0, schema_1.printCapture)(event);
87
+ }
88
+ // Create a proxy that wraps the async iterator while forwarding everything else
89
+ return new Proxy(result, {
90
+ get(target, prop) {
91
+ if (prop === Symbol.asyncIterator) {
92
+ return function () {
93
+ const originalIterator = target[Symbol.asyncIterator]();
94
+ return {
95
+ async next() {
96
+ const iterResult = await originalIterator.next();
97
+ if (!iterResult.done) {
98
+ chunks.push(iterResult.value);
99
+ }
100
+ if (iterResult.done) {
101
+ try {
102
+ record();
103
+ }
104
+ catch {
105
+ // swallow
106
+ }
107
+ }
108
+ return iterResult;
109
+ },
110
+ return: originalIterator.return?.bind(originalIterator),
111
+ throw: originalIterator.throw?.bind(originalIterator),
112
+ };
113
+ };
114
+ }
115
+ const value = target[prop];
116
+ if (typeof value === 'function') {
117
+ return value.bind(target);
118
+ }
119
+ return value;
120
+ },
121
+ });
122
+ }
123
+ //# 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;AAwCD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAyB7D"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildContext = buildContext;
4
+ exports.buildEvent = buildEvent;
5
+ exports.printCapture = printCapture;
6
+ const crypto_1 = require("crypto");
7
+ const context_1 = require("./context");
8
+ const caller_1 = require("./caller");
9
+ const SDK_VERSION = '2.0.8';
10
+ const SDK_LANGUAGE = 'typescript';
11
+ function buildContext(provider, args) {
12
+ return {
13
+ context: (0, context_1.getCurrent)(),
14
+ caller: (0, caller_1.getCallerInfo)(),
15
+ provider,
16
+ };
17
+ }
18
+ function buildEvent(contextData, responseData, latencyMs) {
19
+ const event = {
20
+ event_id: (0, crypto_1.randomUUID)(),
21
+ timestamp: new Date().toISOString(),
22
+ latency_ms: latencyMs,
23
+ sdk_version: SDK_VERSION,
24
+ sdk_language: SDK_LANGUAGE,
25
+ ...responseData,
26
+ ...contextData.caller,
27
+ };
28
+ if (contextData.context) {
29
+ event.trace_id = contextData.context.traceId;
30
+ event.span_id = contextData.context.spanId;
31
+ if (contextData.context.parentSpanId) {
32
+ event.parent_span_id = contextData.context.parentSpanId;
33
+ }
34
+ if (contextData.context.tags && Object.keys(contextData.context.tags).length > 0) {
35
+ event.tags = { ...contextData.context.tags };
36
+ }
37
+ }
38
+ return event;
39
+ }
40
+ // Cost lookup table for debug printing (per 1M tokens)
41
+ const COST_PER_M = {
42
+ 'gpt-4o': [2.5, 10],
43
+ 'gpt-4o-mini': [0.15, 0.6],
44
+ 'gpt-4-turbo': [10, 30],
45
+ 'gpt-4': [30, 60],
46
+ 'gpt-3.5-turbo': [0.5, 1.5],
47
+ 'o1': [15, 60],
48
+ 'o1-mini': [3, 12],
49
+ 'o3-mini': [1.1, 4.4],
50
+ 'claude-3-5-sonnet': [3, 15],
51
+ 'claude-3-5-haiku': [0.8, 4],
52
+ 'claude-3-opus': [15, 75],
53
+ 'claude-sonnet-4-5': [3, 15],
54
+ 'claude-haiku-4-5': [0.8, 4],
55
+ 'claude-opus-4-6': [15, 75],
56
+ 'gemini-2.5-pro': [1.25, 10],
57
+ 'gemini-2.5-flash': [0.15, 0.6],
58
+ 'gemini-2.0-flash': [0.1, 0.4],
59
+ 'gemini-1.5-pro': [1.25, 5],
60
+ 'gemini-1.5-flash': [0.075, 0.3],
61
+ };
62
+ function estimateCost(model, inputTokens, outputTokens) {
63
+ // Try exact match first, then prefix match
64
+ let rates = COST_PER_M[model];
65
+ if (!rates) {
66
+ for (const key of Object.keys(COST_PER_M)) {
67
+ if (model.startsWith(key)) {
68
+ rates = COST_PER_M[key];
69
+ break;
70
+ }
71
+ }
72
+ }
73
+ if (!rates)
74
+ return 0;
75
+ return (inputTokens * rates[0] + outputTokens * rates[1]) / 1000000;
76
+ }
77
+ function printCapture(event) {
78
+ const model = event.model || 'unknown';
79
+ const input = (event.input_tokens || 0).toLocaleString();
80
+ const output = (event.output_tokens || 0).toLocaleString();
81
+ const cost = estimateCost(model, event.input_tokens || 0, event.output_tokens || 0);
82
+ const latency = ((event.latency_ms || 0) / 1000).toFixed(1);
83
+ let file = '';
84
+ if (event.caller_file) {
85
+ const parts = event.caller_file.replace(/\\/g, '/').split('/');
86
+ const filename = parts[parts.length - 1];
87
+ file = event.caller_line ? `${filename}:${event.caller_line}` : filename;
88
+ }
89
+ let traceInfo = '';
90
+ if (event.tags) {
91
+ const firstValue = Object.values(event.tags)[0];
92
+ if (firstValue)
93
+ traceInfo = ` trace:${firstValue}`;
94
+ }
95
+ const costStr = cost > 0 ? ` $${cost.toFixed(4)}` : '';
96
+ console.log(`[llmtracer] ${event.provider}/${model} ${input}\u2192${output} tokens${costStr} ${latency}s (${file})${traceInfo}`);
97
+ }
98
+ //# 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,15 @@
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
+ declare function exitFlush(): void;
7
+ declare function registerExitHandlers(): void;
8
+ export declare const _testExports: {
9
+ exitFlush: typeof exitFlush;
10
+ registerExitHandlers: typeof registerExitHandlers;
11
+ readonly exitHandlersRegistered: boolean;
12
+ resetExitFlag(): void;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AAOA,wBAAgB,KAAK,IAAI,IAAI,CAI5B;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;AAiCD,iBAAS,SAAS,IAAI,IAAI,CAoBzB;AAED,iBAAS,oBAAoB,IAAI,IAAI,CAqBpC;AAGD,eAAO,MAAM,YAAY;;;;;CAKxB,CAAC"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports._testExports = void 0;
4
+ exports.start = start;
5
+ exports.enqueue = enqueue;
6
+ exports.flush = flush;
7
+ exports.stop = stop;
8
+ exports.getQueueLength = getQueueLength;
9
+ const config_1 = require("./config");
10
+ let eventQueue = [];
11
+ let flushTimer = null;
12
+ let firstBatch = true;
13
+ let exitHandlersRegistered = false;
14
+ function start() {
15
+ // Reset state for fresh start
16
+ firstBatch = true;
17
+ registerExitHandlers();
18
+ }
19
+ function enqueue(event) {
20
+ eventQueue.push(event);
21
+ if (firstBatch) {
22
+ firstBatch = false;
23
+ // Flush immediately on first event
24
+ setImmediate(() => doFlush());
25
+ // Start regular 5s interval
26
+ flushTimer = setInterval(() => doFlush(), 5000);
27
+ flushTimer.unref();
28
+ }
29
+ }
30
+ async function flush() {
31
+ await doFlush();
32
+ }
33
+ function stop() {
34
+ if (flushTimer) {
35
+ clearInterval(flushTimer);
36
+ flushTimer = null;
37
+ }
38
+ eventQueue = [];
39
+ firstBatch = true;
40
+ }
41
+ function getQueueLength() {
42
+ return eventQueue.length;
43
+ }
44
+ async function doFlush(timeoutMs = 10000) {
45
+ if (eventQueue.length === 0)
46
+ return;
47
+ const events = eventQueue.splice(0);
48
+ try {
49
+ const payload = JSON.stringify({ events });
50
+ const response = await fetch(config_1.config.endpoint, {
51
+ method: 'POST',
52
+ headers: {
53
+ 'Content-Type': 'application/json',
54
+ 'Authorization': `Bearer ${config_1.config.apiKey}`,
55
+ },
56
+ body: payload,
57
+ signal: AbortSignal.timeout(timeoutMs),
58
+ });
59
+ if (config_1.config.debug) {
60
+ console.log(`[llmtracer] Flushed ${events.length} events \u2192 ${response.status}`);
61
+ }
62
+ }
63
+ catch (e) {
64
+ if (config_1.config.debug) {
65
+ console.log(`[llmtracer] Flush failed: ${e}`);
66
+ }
67
+ // Re-queue up to 100 events for retry
68
+ const requeue = events.slice(0, 100);
69
+ eventQueue.unshift(...requeue);
70
+ }
71
+ }
72
+ function exitFlush() {
73
+ try {
74
+ if (eventQueue.length === 0)
75
+ return;
76
+ const events = eventQueue.splice(0);
77
+ const payload = JSON.stringify({ events });
78
+ // Best-effort flush with short timeout — never log, never throw
79
+ fetch(config_1.config.endpoint, {
80
+ method: 'POST',
81
+ headers: {
82
+ 'Content-Type': 'application/json',
83
+ 'Authorization': `Bearer ${config_1.config.apiKey}`,
84
+ },
85
+ body: payload,
86
+ signal: AbortSignal.timeout(3000),
87
+ }).catch(() => { });
88
+ }
89
+ catch {
90
+ // crash-proof: swallow everything
91
+ }
92
+ }
93
+ function registerExitHandlers() {
94
+ if (exitHandlersRegistered)
95
+ return;
96
+ exitHandlersRegistered = true;
97
+ try {
98
+ process.on('beforeExit', () => {
99
+ try {
100
+ exitFlush();
101
+ }
102
+ catch { /* swallow */ }
103
+ });
104
+ process.on('SIGINT', () => {
105
+ try {
106
+ exitFlush();
107
+ }
108
+ catch { /* swallow */ }
109
+ process.exit(0);
110
+ });
111
+ process.on('SIGTERM', () => {
112
+ try {
113
+ exitFlush();
114
+ }
115
+ catch { /* swallow */ }
116
+ process.exit(0);
117
+ });
118
+ }
119
+ catch {
120
+ // crash-proof: if process.on fails, just skip
121
+ }
122
+ }
123
+ // Export for testing only
124
+ exports._testExports = {
125
+ exitFlush,
126
+ registerExitHandlers,
127
+ get exitHandlersRegistered() { return exitHandlersRegistered; },
128
+ resetExitFlag() { exitHandlersRegistered = false; },
129
+ };
130
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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"}
@@ -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,CA2DV"}