@llmtracer/sdk 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/caller.d.ts +6 -0
- package/dist/cjs/caller.d.ts.map +1 -0
- package/dist/cjs/caller.js +62 -0
- package/dist/cjs/caller.js.map +1 -0
- package/dist/cjs/config.d.ts +7 -0
- package/dist/cjs/config.d.ts.map +1 -0
- package/dist/cjs/config.js +10 -0
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/context.d.ts +9 -0
- package/dist/cjs/context.d.ts.map +1 -0
- package/dist/cjs/context.js +21 -0
- package/dist/cjs/context.js.map +1 -0
- package/dist/cjs/index.d.ts +20 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +93 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/patcher.d.ts +4 -0
- package/dist/cjs/patcher.d.ts.map +1 -0
- package/dist/cjs/patcher.js +93 -0
- package/dist/cjs/patcher.js.map +1 -0
- package/dist/cjs/providers/anthropic.d.ts +4 -0
- package/dist/cjs/providers/anthropic.d.ts.map +1 -0
- package/dist/cjs/providers/anthropic.js +111 -0
- package/dist/cjs/providers/anthropic.js.map +1 -0
- package/dist/cjs/providers/index.d.ts +3 -0
- package/dist/cjs/providers/index.d.ts.map +1 -0
- package/dist/cjs/providers/index.js +10 -0
- package/dist/cjs/providers/index.js.map +1 -0
- package/dist/cjs/providers/openai.d.ts +4 -0
- package/dist/cjs/providers/openai.d.ts.map +1 -0
- package/dist/cjs/providers/openai.js +108 -0
- package/dist/cjs/providers/openai.js.map +1 -0
- package/dist/cjs/schema.d.ts +18 -0
- package/dist/cjs/schema.d.ts.map +1 -0
- package/dist/cjs/schema.js +93 -0
- package/dist/cjs/schema.js.map +1 -0
- package/dist/cjs/transport.d.ts +6 -0
- package/dist/cjs/transport.d.ts.map +1 -0
- package/dist/cjs/transport.js +69 -0
- package/dist/cjs/transport.js.map +1 -0
- package/dist/cjs/wrapper.d.ts +3 -0
- package/dist/cjs/wrapper.d.ts.map +1 -0
- package/dist/cjs/wrapper.js +86 -0
- package/dist/cjs/wrapper.js.map +1 -0
- package/dist/esm/caller.d.ts +6 -0
- package/dist/esm/caller.d.ts.map +1 -0
- package/dist/esm/caller.js +59 -0
- package/dist/esm/caller.js.map +1 -0
- package/dist/esm/config.d.ts +7 -0
- package/dist/esm/config.d.ts.map +1 -0
- package/dist/esm/config.js +7 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/context.d.ts +9 -0
- package/dist/esm/context.d.ts.map +1 -0
- package/dist/esm/context.js +17 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/index.d.ts +20 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +53 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/patcher.d.ts +4 -0
- package/dist/esm/patcher.d.ts.map +1 -0
- package/dist/esm/patcher.js +88 -0
- package/dist/esm/patcher.js.map +1 -0
- package/dist/esm/providers/anthropic.d.ts +4 -0
- package/dist/esm/providers/anthropic.d.ts.map +1 -0
- package/dist/esm/providers/anthropic.js +74 -0
- package/dist/esm/providers/anthropic.js.map +1 -0
- package/dist/esm/providers/index.d.ts +3 -0
- package/dist/esm/providers/index.d.ts.map +1 -0
- package/dist/esm/providers/index.js +3 -0
- package/dist/esm/providers/index.js.map +1 -0
- package/dist/esm/providers/openai.d.ts +4 -0
- package/dist/esm/providers/openai.d.ts.map +1 -0
- package/dist/esm/providers/openai.js +71 -0
- package/dist/esm/providers/openai.js.map +1 -0
- package/dist/esm/schema.d.ts +18 -0
- package/dist/esm/schema.d.ts.map +1 -0
- package/dist/esm/schema.js +88 -0
- package/dist/esm/schema.js.map +1 -0
- package/dist/esm/transport.d.ts +6 -0
- package/dist/esm/transport.d.ts.map +1 -0
- package/dist/esm/transport.js +62 -0
- package/dist/esm/transport.js.map +1 -0
- package/dist/esm/wrapper.d.ts +3 -0
- package/dist/esm/wrapper.d.ts.map +1 -0
- package/dist/esm/wrapper.js +50 -0
- package/dist/esm/wrapper.js.map +1 -0
- package/package.json +46 -11
- package/dist/index.d.ts +0 -118
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -568
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
return {
|
|
43
|
+
provider: 'openai',
|
|
44
|
+
model: result?.model || 'unknown',
|
|
45
|
+
input_tokens: result?.usage?.prompt_tokens || 0,
|
|
46
|
+
output_tokens: result?.usage?.completion_tokens || 0,
|
|
47
|
+
status: 'success',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function wrapOpenAIStream(result, context, elapsedMs, args) {
|
|
51
|
+
const chunks = [];
|
|
52
|
+
function record() {
|
|
53
|
+
// Look for usage in final chunks (OpenAI includes it when stream_options.include_usage = true)
|
|
54
|
+
let usage = null;
|
|
55
|
+
for (let i = chunks.length - 1; i >= 0; i--) {
|
|
56
|
+
if (chunks[i]?.usage) {
|
|
57
|
+
usage = chunks[i].usage;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const model = chunks[0]?.model || 'unknown';
|
|
62
|
+
const event = (0, schema_1.buildEvent)(context, {
|
|
63
|
+
provider: 'openai',
|
|
64
|
+
model,
|
|
65
|
+
input_tokens: usage?.prompt_tokens || 0,
|
|
66
|
+
output_tokens: usage?.completion_tokens || 0,
|
|
67
|
+
status: 'success',
|
|
68
|
+
}, elapsedMs);
|
|
69
|
+
transport.enqueue(event);
|
|
70
|
+
if (config_1.config.debug)
|
|
71
|
+
(0, schema_1.printCapture)(event);
|
|
72
|
+
}
|
|
73
|
+
// Create a proxy that wraps the async iterator while forwarding everything else
|
|
74
|
+
return new Proxy(result, {
|
|
75
|
+
get(target, prop) {
|
|
76
|
+
if (prop === Symbol.asyncIterator) {
|
|
77
|
+
return function () {
|
|
78
|
+
const originalIterator = target[Symbol.asyncIterator]();
|
|
79
|
+
return {
|
|
80
|
+
async next() {
|
|
81
|
+
const iterResult = await originalIterator.next();
|
|
82
|
+
if (!iterResult.done) {
|
|
83
|
+
chunks.push(iterResult.value);
|
|
84
|
+
}
|
|
85
|
+
if (iterResult.done) {
|
|
86
|
+
try {
|
|
87
|
+
record();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// swallow
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return iterResult;
|
|
94
|
+
},
|
|
95
|
+
return: originalIterator.return?.bind(originalIterator),
|
|
96
|
+
throw: originalIterator.throw?.bind(originalIterator),
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const value = target[prop];
|
|
101
|
+
if (typeof value === 'function') {
|
|
102
|
+
return value.bind(target);
|
|
103
|
+
}
|
|
104
|
+
return value;
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# 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,93 @@
|
|
|
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.0';
|
|
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
|
+
};
|
|
57
|
+
function estimateCost(model, inputTokens, outputTokens) {
|
|
58
|
+
// Try exact match first, then prefix match
|
|
59
|
+
let rates = COST_PER_M[model];
|
|
60
|
+
if (!rates) {
|
|
61
|
+
for (const key of Object.keys(COST_PER_M)) {
|
|
62
|
+
if (model.startsWith(key)) {
|
|
63
|
+
rates = COST_PER_M[key];
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!rates)
|
|
69
|
+
return 0;
|
|
70
|
+
return (inputTokens * rates[0] + outputTokens * rates[1]) / 1000000;
|
|
71
|
+
}
|
|
72
|
+
function printCapture(event) {
|
|
73
|
+
const model = event.model || 'unknown';
|
|
74
|
+
const input = (event.input_tokens || 0).toLocaleString();
|
|
75
|
+
const output = (event.output_tokens || 0).toLocaleString();
|
|
76
|
+
const cost = estimateCost(model, event.input_tokens || 0, event.output_tokens || 0);
|
|
77
|
+
const latency = ((event.latency_ms || 0) / 1000).toFixed(1);
|
|
78
|
+
let file = '';
|
|
79
|
+
if (event.caller_file) {
|
|
80
|
+
const parts = event.caller_file.replace(/\\/g, '/').split('/');
|
|
81
|
+
const filename = parts[parts.length - 1];
|
|
82
|
+
file = event.caller_line ? `${filename}:${event.caller_line}` : filename;
|
|
83
|
+
}
|
|
84
|
+
let traceInfo = '';
|
|
85
|
+
if (event.tags) {
|
|
86
|
+
const firstValue = Object.values(event.tags)[0];
|
|
87
|
+
if (firstValue)
|
|
88
|
+
traceInfo = ` trace:${firstValue}`;
|
|
89
|
+
}
|
|
90
|
+
const costStr = cost > 0 ? ` $${cost.toFixed(4)}` : '';
|
|
91
|
+
console.log(`[llmtracer] ${event.provider}/${model} ${input}\u2192${output} tokens${costStr} ${latency}s (${file})${traceInfo}`);
|
|
92
|
+
}
|
|
93
|
+
//# 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,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.start = start;
|
|
4
|
+
exports.enqueue = enqueue;
|
|
5
|
+
exports.flush = flush;
|
|
6
|
+
exports.stop = stop;
|
|
7
|
+
exports.getQueueLength = getQueueLength;
|
|
8
|
+
const config_1 = require("./config");
|
|
9
|
+
let eventQueue = [];
|
|
10
|
+
let flushTimer = null;
|
|
11
|
+
let firstBatch = true;
|
|
12
|
+
function start() {
|
|
13
|
+
// Reset state for fresh start
|
|
14
|
+
firstBatch = true;
|
|
15
|
+
}
|
|
16
|
+
function enqueue(event) {
|
|
17
|
+
eventQueue.push(event);
|
|
18
|
+
if (firstBatch) {
|
|
19
|
+
firstBatch = false;
|
|
20
|
+
// Flush immediately on first event
|
|
21
|
+
setImmediate(() => doFlush());
|
|
22
|
+
// Start regular 5s interval
|
|
23
|
+
flushTimer = setInterval(() => doFlush(), 5000);
|
|
24
|
+
flushTimer.unref();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function flush() {
|
|
28
|
+
await doFlush();
|
|
29
|
+
}
|
|
30
|
+
function stop() {
|
|
31
|
+
if (flushTimer) {
|
|
32
|
+
clearInterval(flushTimer);
|
|
33
|
+
flushTimer = null;
|
|
34
|
+
}
|
|
35
|
+
eventQueue = [];
|
|
36
|
+
firstBatch = true;
|
|
37
|
+
}
|
|
38
|
+
function getQueueLength() {
|
|
39
|
+
return eventQueue.length;
|
|
40
|
+
}
|
|
41
|
+
async function doFlush() {
|
|
42
|
+
if (eventQueue.length === 0)
|
|
43
|
+
return;
|
|
44
|
+
const events = eventQueue.splice(0);
|
|
45
|
+
try {
|
|
46
|
+
const payload = JSON.stringify({ events });
|
|
47
|
+
const response = await fetch(config_1.config.endpoint, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: {
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
'Authorization': `Bearer ${config_1.config.apiKey}`,
|
|
52
|
+
},
|
|
53
|
+
body: payload,
|
|
54
|
+
signal: AbortSignal.timeout(10000),
|
|
55
|
+
});
|
|
56
|
+
if (config_1.config.debug) {
|
|
57
|
+
console.log(`[llmtracer] Flushed ${events.length} events \u2192 ${response.status}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
if (config_1.config.debug) {
|
|
62
|
+
console.log(`[llmtracer] Flush failed: ${e}`);
|
|
63
|
+
}
|
|
64
|
+
// Re-queue up to 100 events for retry
|
|
65
|
+
const requeue = events.slice(0, 100);
|
|
66
|
+
eventQueue.unshift(...requeue);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":";;AAMA,sBAGC;AAED,0BAWC;AAED,sBAEC;AAED,oBAOC;AAED,wCAEC;AAvCD,qCAAkC;AAElC,IAAI,UAAU,GAA0B,EAAE,CAAC;AAC3C,IAAI,UAAU,GAA0C,IAAI,CAAC;AAC7D,IAAI,UAAU,GAAG,IAAI,CAAC;AAEtB,SAAgB,KAAK;IACnB,8BAA8B;IAC9B,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,SAAgB,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;AAEM,KAAK,UAAU,KAAK;IACzB,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC;AAED,SAAgB,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,SAAgB,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,eAAM,CAAC,QAAQ,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,eAAM,CAAC,MAAM,EAAE;aAC3C;YACD,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,eAAM,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,eAAM,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,86 @@
|
|
|
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.makeAsyncWrapper = makeAsyncWrapper;
|
|
37
|
+
const config_1 = require("./config");
|
|
38
|
+
const schema_1 = require("./schema");
|
|
39
|
+
const transport = __importStar(require("./transport"));
|
|
40
|
+
function makeAsyncWrapper(originalFn, provider, parseResponseFn, wrapStreamFn) {
|
|
41
|
+
const wrapped = async function (...args) {
|
|
42
|
+
if (!config_1.config.enabled) {
|
|
43
|
+
return originalFn.apply(this, args);
|
|
44
|
+
}
|
|
45
|
+
// 1. Capture context (safe, no-throw)
|
|
46
|
+
let context = null;
|
|
47
|
+
try {
|
|
48
|
+
context = (0, schema_1.buildContext)(provider, args);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// context stays null
|
|
52
|
+
}
|
|
53
|
+
// 2. Detect streaming
|
|
54
|
+
const isStream = args[0]?.stream === true;
|
|
55
|
+
// 3. ALWAYS call original — never blocked, never modified
|
|
56
|
+
const start = performance.now();
|
|
57
|
+
const result = await originalFn.apply(this, args);
|
|
58
|
+
const elapsedMs = Math.round(performance.now() - start);
|
|
59
|
+
// 4. Handle streaming result
|
|
60
|
+
if (isStream && context) {
|
|
61
|
+
try {
|
|
62
|
+
return wrapStreamFn(result, context, elapsedMs, args);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 5. Handle non-streaming result
|
|
69
|
+
if (context) {
|
|
70
|
+
try {
|
|
71
|
+
const event = (0, schema_1.buildEvent)(context, parseResponseFn(result), elapsedMs);
|
|
72
|
+
transport.enqueue(event);
|
|
73
|
+
if (config_1.config.debug)
|
|
74
|
+
(0, schema_1.printCapture)(event);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// swallow silently
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
};
|
|
82
|
+
// Preserve function name for debugging
|
|
83
|
+
Object.defineProperty(wrapped, 'name', { value: originalFn.name });
|
|
84
|
+
return wrapped;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../src/wrapper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,4CAqDC;AAzDD,qCAAkC;AAClC,qCAAgF;AAChF,uDAAyC;AAEzC,SAAgB,gBAAgB,CAC9B,UAAoB,EACpB,QAAgB,EAChB,eAA8C,EAC9C,YAAgF;IAEhF,MAAM,OAAO,GAAG,KAAK,WAAsB,GAAG,IAAW;QACvD,IAAI,CAAC,eAAM,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,IAAA,qBAAY,EAAC,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,IAAA,mBAAU,EAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;gBACtE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,eAAM,CAAC,KAAK;oBAAE,IAAA,qBAAY,EAAC,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caller.d.ts","sourceRoot":"","sources":["../../src/caller.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,IAAI;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CA0CxG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function getCallerInfo() {
|
|
2
|
+
try {
|
|
3
|
+
const err = new Error();
|
|
4
|
+
const stack = err.stack?.split('\n');
|
|
5
|
+
if (!stack)
|
|
6
|
+
return {};
|
|
7
|
+
for (let i = 1; i < stack.length; i++) {
|
|
8
|
+
const line = stack[i];
|
|
9
|
+
// Skip our own SDK frames (dist/ or src/ within the SDK package)
|
|
10
|
+
if (isInternalFrame(line)) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
// Skip node internals
|
|
14
|
+
if (line.includes('node:') || line.includes('(<anonymous>)')) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
// " at functionName (/path/to/file.js:line:col)"
|
|
18
|
+
const matchWithFn = line.match(/at\s+(.+?)\s+\((.+):(\d+):(\d+)\)/);
|
|
19
|
+
if (matchWithFn) {
|
|
20
|
+
return {
|
|
21
|
+
caller_function: matchWithFn[1],
|
|
22
|
+
caller_file: matchWithFn[2],
|
|
23
|
+
caller_line: parseInt(matchWithFn[3], 10),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// " at /path/to/file.js:line:col"
|
|
27
|
+
const matchNoFn = line.match(/at\s+(.+):(\d+):(\d+)/);
|
|
28
|
+
if (matchNoFn) {
|
|
29
|
+
return {
|
|
30
|
+
caller_file: matchNoFn[1],
|
|
31
|
+
caller_line: parseInt(matchNoFn[2], 10),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function isInternalFrame(line) {
|
|
42
|
+
// Match frames from our compiled output or source
|
|
43
|
+
// e.g. /path/to/@llmtracer/sdk/dist/cjs/wrapper.js
|
|
44
|
+
// or /path/to/llmtracer-sdk/dist/cjs/schema.js
|
|
45
|
+
// or /path/to/llmtracer-sdk/src/wrapper.ts
|
|
46
|
+
// Skip if it's within our dist/ or src/ directories
|
|
47
|
+
if (line.includes('node_modules/@llmtracer/') ||
|
|
48
|
+
line.includes('node_modules\\@llmtracer\\')) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
// When running from the repo itself (dev/test), skip dist/ and src/ paths
|
|
52
|
+
// but NOT test/ paths
|
|
53
|
+
const distOrSrc = /llmtracer-sdk[/\\](?:dist|src)[/\\]/;
|
|
54
|
+
if (distOrSrc.test(line)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=caller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caller.js","sourceRoot":"","sources":["../../src/caller.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,iEAAiE;YACjE,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,sBAAsB;YACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC7D,SAAS;YACX,CAAC;YAED,oDAAoD;YACpD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACpE,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO;oBACL,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC/B,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;iBAC1C,CAAC;YACJ,CAAC;YAED,qCAAqC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACtD,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;oBACL,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;oBACzB,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;iBACxC,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,kDAAkD;IAClD,mDAAmD;IACnD,iDAAiD;IACjD,6CAA6C;IAE7C,oDAAoD;IACpD,IACE,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAC1E,sBAAsB;IACtB,MAAM,SAAS,GAAG,qCAAqC,CAAC;IACxD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;CAKlB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,+DAA+D;IACzE,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,KAAK;CACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface TraceContext {
|
|
2
|
+
traceId: string;
|
|
3
|
+
spanId: string;
|
|
4
|
+
tags: Record<string, any>;
|
|
5
|
+
parentSpanId?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getCurrent(): TraceContext | undefined;
|
|
8
|
+
export declare function run<T>(tags: Record<string, any>, fn: () => T): T;
|
|
9
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,UAAU,IAAI,YAAY,GAAG,SAAS,CAErD;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAWhE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
const store = new AsyncLocalStorage();
|
|
4
|
+
export function getCurrent() {
|
|
5
|
+
return store.getStore();
|
|
6
|
+
}
|
|
7
|
+
export function run(tags, fn) {
|
|
8
|
+
const parent = store.getStore();
|
|
9
|
+
const ctx = {
|
|
10
|
+
traceId: parent?.traceId || randomUUID(),
|
|
11
|
+
spanId: randomUUID(),
|
|
12
|
+
tags: { ...(parent?.tags || {}), ...tags },
|
|
13
|
+
parentSpanId: parent?.spanId,
|
|
14
|
+
};
|
|
15
|
+
return store.run(ctx, fn);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AASpC,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAgB,CAAC;AAEpD,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,IAAyB,EAAE,EAAW;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAEhC,MAAM,GAAG,GAAiB;QACxB,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,UAAU,EAAE;QACxC,MAAM,EAAE,UAAU,EAAE;QACpB,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE;QAC1C,YAAY,EAAE,MAAM,EAAE,MAAM;KAC7B,CAAC;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { config } from './config';
|
|
2
|
+
import * as transport from './transport';
|
|
3
|
+
import * as patcher from './patcher';
|
|
4
|
+
export declare const __version__ = "2.0.0";
|
|
5
|
+
export declare function init(options?: {
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
debug?: boolean;
|
|
8
|
+
endpoint?: string;
|
|
9
|
+
}): void;
|
|
10
|
+
export declare function trace<T>(tags: Record<string, any>, fn: () => T | Promise<T>): T | Promise<T>;
|
|
11
|
+
export declare function flush(): Promise<void>;
|
|
12
|
+
export { patcher as _patcher, transport as _transport, config as _config };
|
|
13
|
+
declare const llmtracer: {
|
|
14
|
+
init: typeof init;
|
|
15
|
+
trace: typeof trace;
|
|
16
|
+
flush: typeof flush;
|
|
17
|
+
__version__: string;
|
|
18
|
+
};
|
|
19
|
+
export default llmtracer;
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AAErC,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,wBAAgB,IAAI,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsB5F;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAS5F;AAED,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAM3C;AAGD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,SAAS,IAAI,UAAU,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC;AAG3E,QAAA,MAAM,SAAS;;;;;CAAsC,CAAC;AACtD,eAAe,SAAS,CAAC"}
|
|
@@ -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"}
|