@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.
- 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 +94 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/patcher.d.ts +5 -0
- package/dist/cjs/patcher.d.ts.map +1 -0
- package/dist/cjs/patcher.js +131 -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 +126 -0
- package/dist/cjs/providers/anthropic.js.map +1 -0
- package/dist/cjs/providers/google.d.ts +4 -0
- package/dist/cjs/providers/google.d.ts.map +1 -0
- package/dist/cjs/providers/google.js +133 -0
- package/dist/cjs/providers/google.js.map +1 -0
- package/dist/cjs/providers/index.d.ts +4 -0
- package/dist/cjs/providers/index.d.ts.map +1 -0
- package/dist/cjs/providers/index.js +13 -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 +123 -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 +98 -0
- package/dist/cjs/schema.js.map +1 -0
- package/dist/cjs/transport.d.ts +15 -0
- package/dist/cjs/transport.d.ts.map +1 -0
- package/dist/cjs/transport.js +130 -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 +97 -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 +54 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/patcher.d.ts +5 -0
- package/dist/esm/patcher.d.ts.map +1 -0
- package/dist/esm/patcher.js +125 -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 +89 -0
- package/dist/esm/providers/anthropic.js.map +1 -0
- package/dist/esm/providers/google.d.ts +4 -0
- package/dist/esm/providers/google.d.ts.map +1 -0
- package/dist/esm/providers/google.js +96 -0
- package/dist/esm/providers/google.js.map +1 -0
- package/dist/esm/providers/index.d.ts +4 -0
- package/dist/esm/providers/index.d.ts.map +1 -0
- package/dist/esm/providers/index.js +4 -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 +86 -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 +93 -0
- package/dist/esm/schema.js.map +1 -0
- package/dist/esm/transport.d.ts +15 -0
- package/dist/esm/transport.d.ts.map +1 -0
- package/dist/esm/transport.js +122 -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 +61 -0
- package/dist/esm/wrapper.js.map +1 -0
- package/package.json +52 -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,97 @@
|
|
|
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
|
+
// 2b. For OpenAI streams, inject stream_options to get usage data
|
|
56
|
+
if (isStream && provider === 'openai') {
|
|
57
|
+
try {
|
|
58
|
+
if (!args[0].stream_options?.include_usage) {
|
|
59
|
+
args[0] = { ...args[0], stream_options: { ...args[0].stream_options, include_usage: true } };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// swallow — never modify args if something goes wrong
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 3. ALWAYS call original — never blocked, never modified
|
|
67
|
+
const start = performance.now();
|
|
68
|
+
const result = await originalFn.apply(this, args);
|
|
69
|
+
const elapsedMs = Math.round(performance.now() - start);
|
|
70
|
+
// 4. Handle streaming result
|
|
71
|
+
if (isStream && context) {
|
|
72
|
+
try {
|
|
73
|
+
return wrapStreamFn(result, context, elapsedMs, args);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 5. Handle non-streaming result
|
|
80
|
+
if (context) {
|
|
81
|
+
try {
|
|
82
|
+
const event = (0, schema_1.buildEvent)(context, parseResponseFn(result), elapsedMs);
|
|
83
|
+
transport.enqueue(event);
|
|
84
|
+
if (config_1.config.debug)
|
|
85
|
+
(0, schema_1.printCapture)(event);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// swallow silently
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
};
|
|
93
|
+
// Preserve function name for debugging
|
|
94
|
+
Object.defineProperty(wrapped, 'name', { value: originalFn.name });
|
|
95
|
+
return wrapped;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../src/wrapper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,4CAgEC;AApED,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,kEAAkE;QAClE,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,CAAC;oBAC3C,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC/F,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;QACH,CAAC;QAED,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.8";
|
|
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,CAuB5F;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,54 @@
|
|
|
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.8';
|
|
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
|
+
patcher.patchGoogle(config.debug);
|
|
21
|
+
if (config.debug)
|
|
22
|
+
console.log('[llmtracer] Ready. Events \u2192 dashboard.llmtracer.com');
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
config.enabled = false;
|
|
26
|
+
if (config.debug)
|
|
27
|
+
console.log(`[llmtracer] init() failed: ${e}. Tracing disabled.`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function trace(tags, fn) {
|
|
31
|
+
try {
|
|
32
|
+
if (!config.enabled) {
|
|
33
|
+
return fn();
|
|
34
|
+
}
|
|
35
|
+
return context.run(tags, fn);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return fn();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function flush() {
|
|
42
|
+
try {
|
|
43
|
+
await transport.flush();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// crash-proof: never throw
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// For testing only — not part of public API
|
|
50
|
+
export { patcher as _patcher, transport as _transport, config as _config };
|
|
51
|
+
// Default export for ESM: import llmtracer from 'llmtracer'
|
|
52
|
+
const llmtracer = { init, trace, flush, __version__ };
|
|
53
|
+
export default llmtracer;
|
|
54
|
+
//# 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;QACrC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElC,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 @@
|
|
|
1
|
+
{"version":3,"file":"patcher.d.ts","sourceRoot":"","sources":["../../src/patcher.ts"],"names":[],"mappings":"AA6BA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBhD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBnD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAqChD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAMjC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { makeAsyncWrapper } from './wrapper';
|
|
2
|
+
import { parseOpenAIResponse, wrapOpenAIStream } from './providers/openai';
|
|
3
|
+
import { parseAnthropicResponse, wrapAnthropicStream } from './providers/anthropic';
|
|
4
|
+
import { parseGoogleResponse, wrapGoogleStream } from './providers/google';
|
|
5
|
+
const originals = new Map();
|
|
6
|
+
function getPackageVersion(packageName) {
|
|
7
|
+
try {
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const entryPoint = require.resolve(packageName);
|
|
11
|
+
let dir = path.dirname(entryPoint);
|
|
12
|
+
while (dir !== path.dirname(dir)) {
|
|
13
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
14
|
+
try {
|
|
15
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
16
|
+
if (pkg.name === packageName)
|
|
17
|
+
return pkg.version || 'unknown';
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// no package.json here, keep walking up
|
|
21
|
+
}
|
|
22
|
+
dir = path.dirname(dir);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// ignore
|
|
27
|
+
}
|
|
28
|
+
return 'unknown';
|
|
29
|
+
}
|
|
30
|
+
export function patchOpenAI(debug) {
|
|
31
|
+
try {
|
|
32
|
+
const completionsModule = require('openai/resources/chat/completions');
|
|
33
|
+
const CompletionsProto = completionsModule.Completions?.prototype;
|
|
34
|
+
if (!CompletionsProto)
|
|
35
|
+
throw new Error('Completions prototype not found');
|
|
36
|
+
if (CompletionsProto._llmtracer_patched)
|
|
37
|
+
return;
|
|
38
|
+
const originalCreate = CompletionsProto.create;
|
|
39
|
+
CompletionsProto.create = makeAsyncWrapper(originalCreate, 'openai', parseOpenAIResponse, wrapOpenAIStream);
|
|
40
|
+
CompletionsProto._llmtracer_patched = true;
|
|
41
|
+
originals.set('openai.Completions.create', {
|
|
42
|
+
target: CompletionsProto,
|
|
43
|
+
methodName: 'create',
|
|
44
|
+
original: originalCreate,
|
|
45
|
+
});
|
|
46
|
+
if (debug) {
|
|
47
|
+
const version = getPackageVersion('openai');
|
|
48
|
+
console.log(`[llmtracer] \u2713 Patched openai (v${version})`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
if (debug)
|
|
53
|
+
console.log(`[llmtracer] \u2717 openai not found or patch failed: ${e}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function patchAnthropic(debug) {
|
|
57
|
+
try {
|
|
58
|
+
const messagesModule = require('@anthropic-ai/sdk/resources/messages');
|
|
59
|
+
const MessagesProto = messagesModule.Messages?.prototype;
|
|
60
|
+
if (!MessagesProto)
|
|
61
|
+
throw new Error('Messages prototype not found');
|
|
62
|
+
if (MessagesProto._llmtracer_patched)
|
|
63
|
+
return;
|
|
64
|
+
const originalCreate = MessagesProto.create;
|
|
65
|
+
MessagesProto.create = makeAsyncWrapper(originalCreate, 'anthropic', parseAnthropicResponse, wrapAnthropicStream);
|
|
66
|
+
MessagesProto._llmtracer_patched = true;
|
|
67
|
+
originals.set('anthropic.Messages.create', {
|
|
68
|
+
target: MessagesProto,
|
|
69
|
+
methodName: 'create',
|
|
70
|
+
original: originalCreate,
|
|
71
|
+
});
|
|
72
|
+
if (debug) {
|
|
73
|
+
const version = getPackageVersion('@anthropic-ai/sdk');
|
|
74
|
+
console.log(`[llmtracer] \u2713 Patched anthropic (v${version})`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (debug)
|
|
79
|
+
console.log(`[llmtracer] \u2717 anthropic not found or patch failed: ${e}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function patchGoogle(debug) {
|
|
83
|
+
try {
|
|
84
|
+
const googleModule = require('@google/genai');
|
|
85
|
+
const GenModel = googleModule.GenerativeModel?.prototype;
|
|
86
|
+
if (!GenModel)
|
|
87
|
+
throw new Error('GenerativeModel prototype not found');
|
|
88
|
+
if (GenModel._llmtracer_patched)
|
|
89
|
+
return;
|
|
90
|
+
const originalGenerate = GenModel.generateContent;
|
|
91
|
+
GenModel.generateContent = makeAsyncWrapper(originalGenerate, 'google', parseGoogleResponse, wrapGoogleStream);
|
|
92
|
+
GenModel._llmtracer_patched = true;
|
|
93
|
+
originals.set('google.GenerativeModel.generateContent', {
|
|
94
|
+
target: GenModel,
|
|
95
|
+
methodName: 'generateContent',
|
|
96
|
+
original: originalGenerate,
|
|
97
|
+
});
|
|
98
|
+
// Also patch generateContentStream if it exists
|
|
99
|
+
if (typeof GenModel.generateContentStream === 'function') {
|
|
100
|
+
const originalStream = GenModel.generateContentStream;
|
|
101
|
+
GenModel.generateContentStream = makeAsyncWrapper(originalStream, 'google', parseGoogleResponse, wrapGoogleStream);
|
|
102
|
+
originals.set('google.GenerativeModel.generateContentStream', {
|
|
103
|
+
target: GenModel,
|
|
104
|
+
methodName: 'generateContentStream',
|
|
105
|
+
original: originalStream,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (debug) {
|
|
109
|
+
const version = getPackageVersion('@google/genai');
|
|
110
|
+
console.log(`[llmtracer] \u2713 Patched google (v${version})`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
if (debug)
|
|
115
|
+
console.log(`[llmtracer] \u2717 google not found or patch failed: ${e}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function unpatchAll() {
|
|
119
|
+
for (const [, entry] of originals) {
|
|
120
|
+
entry.target[entry.methodName] = entry.original;
|
|
121
|
+
delete entry.target._llmtracer_patched;
|
|
122
|
+
}
|
|
123
|
+
originals.clear();
|
|
124
|
+
}
|
|
125
|
+
//# 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,CAoBhE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAsE1G"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { config } from '../config';
|
|
2
|
+
import { buildEvent, printCapture } from '../schema';
|
|
3
|
+
import * as transport from '../transport';
|
|
4
|
+
export function parseAnthropicResponse(result) {
|
|
5
|
+
const usage = result?.usage;
|
|
6
|
+
const baseInput = usage?.input_tokens || 0;
|
|
7
|
+
const baseOutput = usage?.output_tokens || 0;
|
|
8
|
+
const cacheCreation = usage?.cache_creation_input_tokens || 0;
|
|
9
|
+
const cacheRead = usage?.cache_read_input_tokens || 0;
|
|
10
|
+
if (config.debug) {
|
|
11
|
+
console.log(`[llmtracer] Anthropic tokens — in=${baseInput} out=${baseOutput} cache_create=${cacheCreation} cache_read=${cacheRead}`);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
provider: 'anthropic',
|
|
15
|
+
model: result?.model || 'unknown',
|
|
16
|
+
input_tokens: baseInput + cacheCreation + cacheRead,
|
|
17
|
+
output_tokens: baseOutput,
|
|
18
|
+
status: result?.stop_reason ? 'success' : 'error',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function wrapAnthropicStream(result, context, elapsedMs, args) {
|
|
22
|
+
let model = 'unknown';
|
|
23
|
+
let inputTokens = 0;
|
|
24
|
+
let outputTokens = 0;
|
|
25
|
+
let cacheCreation = 0;
|
|
26
|
+
let cacheRead = 0;
|
|
27
|
+
function record() {
|
|
28
|
+
if (config.debug) {
|
|
29
|
+
console.log(`[llmtracer] Anthropic tokens — in=${inputTokens} out=${outputTokens} cache_create=${cacheCreation} cache_read=${cacheRead}`);
|
|
30
|
+
}
|
|
31
|
+
const event = buildEvent(context, {
|
|
32
|
+
provider: 'anthropic',
|
|
33
|
+
model,
|
|
34
|
+
input_tokens: inputTokens + cacheCreation + cacheRead,
|
|
35
|
+
output_tokens: outputTokens,
|
|
36
|
+
status: 'success',
|
|
37
|
+
}, elapsedMs);
|
|
38
|
+
transport.enqueue(event);
|
|
39
|
+
if (config.debug)
|
|
40
|
+
printCapture(event);
|
|
41
|
+
}
|
|
42
|
+
return new Proxy(result, {
|
|
43
|
+
get(target, prop) {
|
|
44
|
+
if (prop === Symbol.asyncIterator) {
|
|
45
|
+
return function () {
|
|
46
|
+
const originalIterator = target[Symbol.asyncIterator]();
|
|
47
|
+
return {
|
|
48
|
+
async next() {
|
|
49
|
+
const iterResult = await originalIterator.next();
|
|
50
|
+
if (!iterResult.done) {
|
|
51
|
+
const event = iterResult.value;
|
|
52
|
+
// Anthropic stream events:
|
|
53
|
+
// - message_start: contains model and input token count
|
|
54
|
+
// - message_delta: contains output token count
|
|
55
|
+
// - content_block_delta: contains text deltas
|
|
56
|
+
if (event?.type === 'message_start' && event.message) {
|
|
57
|
+
model = event.message.model || model;
|
|
58
|
+
inputTokens = event.message.usage?.input_tokens || inputTokens;
|
|
59
|
+
cacheCreation = event.message.usage?.cache_creation_input_tokens || cacheCreation;
|
|
60
|
+
cacheRead = event.message.usage?.cache_read_input_tokens || cacheRead;
|
|
61
|
+
}
|
|
62
|
+
if (event?.type === 'message_delta' && event.usage) {
|
|
63
|
+
outputTokens = event.usage.output_tokens || outputTokens;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (iterResult.done) {
|
|
67
|
+
try {
|
|
68
|
+
record();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// swallow
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return iterResult;
|
|
75
|
+
},
|
|
76
|
+
return: originalIterator.return?.bind(originalIterator),
|
|
77
|
+
throw: originalIterator.throw?.bind(originalIterator),
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const value = target[prop];
|
|
82
|
+
if (typeof value === 'function') {
|
|
83
|
+
return value.bind(target);
|
|
84
|
+
}
|
|
85
|
+
return value;
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# 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,4 @@
|
|
|
1
|
+
import { ContextData, ResponseData } from '../schema';
|
|
2
|
+
export declare function parseGoogleResponse(result: any): ResponseData;
|
|
3
|
+
export declare function wrapGoogleStream(result: any, context: ContextData, elapsedMs: number, args: any[]): any;
|
|
4
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/providers/google.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAiChF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY,CAmB7D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAkEvG"}
|