@llmtracer/sdk 1.0.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/README.md +58 -0
- 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 -558
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -37,6 +37,64 @@ const response = await openai.chat.completions.create({
|
|
|
37
37
|
await tracer.flush();
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
## Tagging Guide
|
|
41
|
+
|
|
42
|
+
Tags let you slice costs by any dimension in the dashboard. Global tags (set in the constructor) apply to all calls. Per-call tags (set via the `llmtracer` property) override globals for that specific call.
|
|
43
|
+
|
|
44
|
+
### Track cost by feature
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
await openai.chat.completions.create({
|
|
48
|
+
model: "gpt-4o",
|
|
49
|
+
messages: [...],
|
|
50
|
+
llmtracer: { tags: { feature: "chat" } }
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Track cost by user (for B2B apps)
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
await openai.chat.completions.create({
|
|
58
|
+
model: "gpt-4o",
|
|
59
|
+
messages: [...],
|
|
60
|
+
llmtracer: { tags: { feature: "chat", user_id: req.user.id } }
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Track cost by customer/tenant
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
await openai.chat.completions.create({
|
|
68
|
+
model: "gpt-4o",
|
|
69
|
+
messages: [...],
|
|
70
|
+
llmtracer: { tags: { customer: req.tenant.name, feature: "search" } }
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Track cost by conversation
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
await openai.chat.completions.create({
|
|
78
|
+
model: "gpt-4o",
|
|
79
|
+
messages: [...],
|
|
80
|
+
llmtracer: { tags: { conversation_id: sessionId, feature: "chat" } }
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Track environment (global tag)
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
const tracer = new LLMTracer({
|
|
88
|
+
apiKey: "lt_...",
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
tracer.instrumentOpenAI(openai, {
|
|
92
|
+
tags: { env: process.env.NODE_ENV } // applies to all calls
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Tags appear in the dashboard's Breakdown page and Top Tags card. Use them to answer questions like "which customer costs the most?" or "which feature should I optimize?"
|
|
97
|
+
|
|
40
98
|
## Serverless Usage
|
|
41
99
|
|
|
42
100
|
In environments like AWS Lambda or Google Cloud Functions, call `flush()` before your function returns to ensure all events are sent:
|
|
@@ -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,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCallerInfo = getCallerInfo;
|
|
4
|
+
function getCallerInfo() {
|
|
5
|
+
try {
|
|
6
|
+
const err = new Error();
|
|
7
|
+
const stack = err.stack?.split('\n');
|
|
8
|
+
if (!stack)
|
|
9
|
+
return {};
|
|
10
|
+
for (let i = 1; i < stack.length; i++) {
|
|
11
|
+
const line = stack[i];
|
|
12
|
+
// Skip our own SDK frames (dist/ or src/ within the SDK package)
|
|
13
|
+
if (isInternalFrame(line)) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
// Skip node internals
|
|
17
|
+
if (line.includes('node:') || line.includes('(<anonymous>)')) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
// " at functionName (/path/to/file.js:line:col)"
|
|
21
|
+
const matchWithFn = line.match(/at\s+(.+?)\s+\((.+):(\d+):(\d+)\)/);
|
|
22
|
+
if (matchWithFn) {
|
|
23
|
+
return {
|
|
24
|
+
caller_function: matchWithFn[1],
|
|
25
|
+
caller_file: matchWithFn[2],
|
|
26
|
+
caller_line: parseInt(matchWithFn[3], 10),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// " at /path/to/file.js:line:col"
|
|
30
|
+
const matchNoFn = line.match(/at\s+(.+):(\d+):(\d+)/);
|
|
31
|
+
if (matchNoFn) {
|
|
32
|
+
return {
|
|
33
|
+
caller_file: matchNoFn[1],
|
|
34
|
+
caller_line: parseInt(matchNoFn[2], 10),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function isInternalFrame(line) {
|
|
45
|
+
// Match frames from our compiled output or source
|
|
46
|
+
// e.g. /path/to/@llmtracer/sdk/dist/cjs/wrapper.js
|
|
47
|
+
// or /path/to/llmtracer-sdk/dist/cjs/schema.js
|
|
48
|
+
// or /path/to/llmtracer-sdk/src/wrapper.ts
|
|
49
|
+
// Skip if it's within our dist/ or src/ directories
|
|
50
|
+
if (line.includes('node_modules/@llmtracer/') ||
|
|
51
|
+
line.includes('node_modules\\@llmtracer\\')) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
// When running from the repo itself (dev/test), skip dist/ and src/ paths
|
|
55
|
+
// but NOT test/ paths
|
|
56
|
+
const distOrSrc = /llmtracer-sdk[/\\](?:dist|src)[/\\]/;
|
|
57
|
+
if (distOrSrc.test(line)) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=caller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caller.js","sourceRoot":"","sources":["../../src/caller.ts"],"names":[],"mappings":";;AAAA,sCA0CC;AA1CD,SAAgB,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,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.config = {
|
|
5
|
+
apiKey: '',
|
|
6
|
+
endpoint: 'https://us-central1-llmtracer-alt.cloudfunctions.net/v1Events',
|
|
7
|
+
debug: false,
|
|
8
|
+
enabled: false,
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":";;;AAAa,QAAA,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,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCurrent = getCurrent;
|
|
4
|
+
exports.run = run;
|
|
5
|
+
const async_hooks_1 = require("async_hooks");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const store = new async_hooks_1.AsyncLocalStorage();
|
|
8
|
+
function getCurrent() {
|
|
9
|
+
return store.getStore();
|
|
10
|
+
}
|
|
11
|
+
function run(tags, fn) {
|
|
12
|
+
const parent = store.getStore();
|
|
13
|
+
const ctx = {
|
|
14
|
+
traceId: parent?.traceId || (0, crypto_1.randomUUID)(),
|
|
15
|
+
spanId: (0, crypto_1.randomUUID)(),
|
|
16
|
+
tags: { ...(parent?.tags || {}), ...tags },
|
|
17
|
+
parentSpanId: parent?.spanId,
|
|
18
|
+
};
|
|
19
|
+
return store.run(ctx, fn);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":";;AAYA,gCAEC;AAED,kBAWC;AA3BD,6CAAgD;AAChD,mCAAoC;AASpC,MAAM,KAAK,GAAG,IAAI,+BAAiB,EAAgB,CAAC;AAEpD,SAAgB,UAAU;IACxB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,SAAgB,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,IAAA,mBAAU,GAAE;QACxC,MAAM,EAAE,IAAA,mBAAU,GAAE;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,93 @@
|
|
|
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._config = exports._transport = exports._patcher = exports.__version__ = void 0;
|
|
37
|
+
exports.init = init;
|
|
38
|
+
exports.trace = trace;
|
|
39
|
+
exports.flush = flush;
|
|
40
|
+
const config_1 = require("./config");
|
|
41
|
+
Object.defineProperty(exports, "_config", { enumerable: true, get: function () { return config_1.config; } });
|
|
42
|
+
const context = __importStar(require("./context"));
|
|
43
|
+
const transport = __importStar(require("./transport"));
|
|
44
|
+
exports._transport = transport;
|
|
45
|
+
const patcher = __importStar(require("./patcher"));
|
|
46
|
+
exports._patcher = patcher;
|
|
47
|
+
exports.__version__ = '2.0.0';
|
|
48
|
+
function init(options) {
|
|
49
|
+
try {
|
|
50
|
+
config_1.config.apiKey = options?.apiKey || process.env.LLMTRACER_API_KEY || '';
|
|
51
|
+
config_1.config.debug = options?.debug || false;
|
|
52
|
+
config_1.config.endpoint = options?.endpoint || 'https://us-central1-llmtracer-alt.cloudfunctions.net/v1Events';
|
|
53
|
+
config_1.config.enabled = Boolean(config_1.config.apiKey);
|
|
54
|
+
if (!config_1.config.enabled) {
|
|
55
|
+
if (config_1.config.debug)
|
|
56
|
+
console.log('[llmtracer] No API key found. Tracing disabled.');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
transport.start();
|
|
60
|
+
patcher.patchOpenAI(config_1.config.debug);
|
|
61
|
+
patcher.patchAnthropic(config_1.config.debug);
|
|
62
|
+
if (config_1.config.debug)
|
|
63
|
+
console.log('[llmtracer] Ready. Events \u2192 dashboard.llmtracer.com');
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
config_1.config.enabled = false;
|
|
67
|
+
if (config_1.config.debug)
|
|
68
|
+
console.log(`[llmtracer] init() failed: ${e}. Tracing disabled.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function trace(tags, fn) {
|
|
72
|
+
try {
|
|
73
|
+
if (!config_1.config.enabled) {
|
|
74
|
+
return fn();
|
|
75
|
+
}
|
|
76
|
+
return context.run(tags, fn);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return fn();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function flush() {
|
|
83
|
+
try {
|
|
84
|
+
await transport.flush();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// crash-proof: never throw
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Default export for ESM: import llmtracer from 'llmtracer'
|
|
91
|
+
const llmtracer = { init, trace, flush, __version__: exports.__version__ };
|
|
92
|
+
exports.default = llmtracer;
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,oBAsBC;AAED,sBASC;AAED,sBAMC;AAhDD,qCAAkC;AAmD+B,wFAnDxD,eAAM,OAmDyD;AAlDxE,mDAAqC;AACrC,uDAAyC;AAiDE,+BAAU;AAhDrD,mDAAqC;AAgDjB,2BAAQ;AA9Cf,QAAA,WAAW,GAAG,OAAO,CAAC;AAEnC,SAAgB,IAAI,CAAC,OAAiE;IACpF,IAAI,CAAC;QACH,eAAM,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;QACvE,eAAM,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;QACvC,eAAM,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,+DAA+D,CAAC;QACvG,eAAM,CAAC,OAAO,GAAG,OAAO,CAAC,eAAM,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC,eAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,eAAM,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,eAAM,CAAC,KAAK,CAAC,CAAC;QAClC,OAAO,CAAC,cAAc,CAAC,eAAM,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,eAAM,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,eAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,IAAI,eAAM,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,qBAAqB,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAI,IAAyB,EAAE,EAAwB;IAC1E,IAAI,CAAC;QACH,IAAI,CAAC,eAAM,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;AAEM,KAAK,UAAU,KAAK;IACzB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;AACH,CAAC;AAKD,4DAA4D;AAC5D,MAAM,SAAS,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAX,mBAAW,EAAE,CAAC;AACtD,kBAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patcher.d.ts","sourceRoot":"","sources":["../../src/patcher.ts"],"names":[],"mappings":"AA4BA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBhD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAyBnD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAMjC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.patchOpenAI = patchOpenAI;
|
|
4
|
+
exports.patchAnthropic = patchAnthropic;
|
|
5
|
+
exports.unpatchAll = unpatchAll;
|
|
6
|
+
const wrapper_1 = require("./wrapper");
|
|
7
|
+
const openai_1 = require("./providers/openai");
|
|
8
|
+
const anthropic_1 = require("./providers/anthropic");
|
|
9
|
+
const originals = new Map();
|
|
10
|
+
function getPackageVersion(packageName) {
|
|
11
|
+
try {
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const entryPoint = require.resolve(packageName);
|
|
15
|
+
let dir = path.dirname(entryPoint);
|
|
16
|
+
while (dir !== path.dirname(dir)) {
|
|
17
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
18
|
+
try {
|
|
19
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
20
|
+
if (pkg.name === packageName)
|
|
21
|
+
return pkg.version || 'unknown';
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// no package.json here, keep walking up
|
|
25
|
+
}
|
|
26
|
+
dir = path.dirname(dir);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// ignore
|
|
31
|
+
}
|
|
32
|
+
return 'unknown';
|
|
33
|
+
}
|
|
34
|
+
function patchOpenAI(debug) {
|
|
35
|
+
try {
|
|
36
|
+
const completionsModule = require('openai/resources/chat/completions');
|
|
37
|
+
const CompletionsProto = completionsModule.Completions?.prototype;
|
|
38
|
+
if (!CompletionsProto)
|
|
39
|
+
throw new Error('Completions prototype not found');
|
|
40
|
+
if (CompletionsProto._llmtracer_patched)
|
|
41
|
+
return;
|
|
42
|
+
const originalCreate = CompletionsProto.create;
|
|
43
|
+
CompletionsProto.create = (0, wrapper_1.makeAsyncWrapper)(originalCreate, 'openai', openai_1.parseOpenAIResponse, openai_1.wrapOpenAIStream);
|
|
44
|
+
CompletionsProto._llmtracer_patched = true;
|
|
45
|
+
originals.set('openai.Completions.create', {
|
|
46
|
+
target: CompletionsProto,
|
|
47
|
+
methodName: 'create',
|
|
48
|
+
original: originalCreate,
|
|
49
|
+
});
|
|
50
|
+
if (debug) {
|
|
51
|
+
const version = getPackageVersion('openai');
|
|
52
|
+
console.log(`[llmtracer] \u2713 Patched openai (v${version})`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
if (debug)
|
|
57
|
+
console.log(`[llmtracer] \u2717 openai not found or patch failed: ${e}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function patchAnthropic(debug) {
|
|
61
|
+
try {
|
|
62
|
+
const messagesModule = require('@anthropic-ai/sdk/resources/messages');
|
|
63
|
+
const MessagesProto = messagesModule.Messages?.prototype;
|
|
64
|
+
if (!MessagesProto)
|
|
65
|
+
throw new Error('Messages prototype not found');
|
|
66
|
+
if (MessagesProto._llmtracer_patched)
|
|
67
|
+
return;
|
|
68
|
+
const originalCreate = MessagesProto.create;
|
|
69
|
+
MessagesProto.create = (0, wrapper_1.makeAsyncWrapper)(originalCreate, 'anthropic', anthropic_1.parseAnthropicResponse, anthropic_1.wrapAnthropicStream);
|
|
70
|
+
MessagesProto._llmtracer_patched = true;
|
|
71
|
+
originals.set('anthropic.Messages.create', {
|
|
72
|
+
target: MessagesProto,
|
|
73
|
+
methodName: 'create',
|
|
74
|
+
original: originalCreate,
|
|
75
|
+
});
|
|
76
|
+
if (debug) {
|
|
77
|
+
const version = getPackageVersion('@anthropic-ai/sdk');
|
|
78
|
+
console.log(`[llmtracer] \u2713 Patched anthropic (v${version})`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
if (debug)
|
|
83
|
+
console.log(`[llmtracer] \u2717 anthropic not found or patch failed: ${e}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function unpatchAll() {
|
|
87
|
+
for (const [, entry] of originals) {
|
|
88
|
+
entry.target[entry.methodName] = entry.original;
|
|
89
|
+
delete entry.target._llmtracer_patched;
|
|
90
|
+
}
|
|
91
|
+
originals.clear();
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=patcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patcher.js","sourceRoot":"","sources":["../../src/patcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ContextData, ResponseData } from '../schema';
|
|
2
|
+
export declare function parseAnthropicResponse(result: any): ResponseData;
|
|
3
|
+
export declare function wrapAnthropicStream(result: any, context: ContextData, elapsedMs: number, args: any[]): any;
|
|
4
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGhF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY,CAQhE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CA4D1G"}
|
|
@@ -0,0 +1,111 @@
|
|
|
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.parseAnthropicResponse = parseAnthropicResponse;
|
|
37
|
+
exports.wrapAnthropicStream = wrapAnthropicStream;
|
|
38
|
+
const config_1 = require("../config");
|
|
39
|
+
const schema_1 = require("../schema");
|
|
40
|
+
const transport = __importStar(require("../transport"));
|
|
41
|
+
function parseAnthropicResponse(result) {
|
|
42
|
+
return {
|
|
43
|
+
provider: 'anthropic',
|
|
44
|
+
model: result?.model || 'unknown',
|
|
45
|
+
input_tokens: result?.usage?.input_tokens || 0,
|
|
46
|
+
output_tokens: result?.usage?.output_tokens || 0,
|
|
47
|
+
status: result?.stop_reason ? 'success' : 'error',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function wrapAnthropicStream(result, context, elapsedMs, args) {
|
|
51
|
+
let model = 'unknown';
|
|
52
|
+
let inputTokens = 0;
|
|
53
|
+
let outputTokens = 0;
|
|
54
|
+
function record() {
|
|
55
|
+
const event = (0, schema_1.buildEvent)(context, {
|
|
56
|
+
provider: 'anthropic',
|
|
57
|
+
model,
|
|
58
|
+
input_tokens: inputTokens,
|
|
59
|
+
output_tokens: outputTokens,
|
|
60
|
+
status: 'success',
|
|
61
|
+
}, elapsedMs);
|
|
62
|
+
transport.enqueue(event);
|
|
63
|
+
if (config_1.config.debug)
|
|
64
|
+
(0, schema_1.printCapture)(event);
|
|
65
|
+
}
|
|
66
|
+
return new Proxy(result, {
|
|
67
|
+
get(target, prop) {
|
|
68
|
+
if (prop === Symbol.asyncIterator) {
|
|
69
|
+
return function () {
|
|
70
|
+
const originalIterator = target[Symbol.asyncIterator]();
|
|
71
|
+
return {
|
|
72
|
+
async next() {
|
|
73
|
+
const iterResult = await originalIterator.next();
|
|
74
|
+
if (!iterResult.done) {
|
|
75
|
+
const event = iterResult.value;
|
|
76
|
+
// Anthropic stream events:
|
|
77
|
+
// - message_start: contains model and input token count
|
|
78
|
+
// - message_delta: contains output token count
|
|
79
|
+
// - content_block_delta: contains text deltas
|
|
80
|
+
if (event?.type === 'message_start' && event.message) {
|
|
81
|
+
model = event.message.model || model;
|
|
82
|
+
inputTokens = event.message.usage?.input_tokens || inputTokens;
|
|
83
|
+
}
|
|
84
|
+
if (event?.type === 'message_delta' && event.usage) {
|
|
85
|
+
outputTokens = event.usage.output_tokens || outputTokens;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (iterResult.done) {
|
|
89
|
+
try {
|
|
90
|
+
record();
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// swallow
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return iterResult;
|
|
97
|
+
},
|
|
98
|
+
return: originalIterator.return?.bind(originalIterator),
|
|
99
|
+
throw: originalIterator.throw?.bind(originalIterator),
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const value = target[prop];
|
|
104
|
+
if (typeof value === 'function') {
|
|
105
|
+
return value.bind(target);
|
|
106
|
+
}
|
|
107
|
+
return value;
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
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
|
+
//# 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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ContextData, ResponseData } from '../schema';
|
|
2
|
+
export declare function parseOpenAIResponse(result: any): ResponseData;
|
|
3
|
+
export declare function wrapOpenAIStream(result: any, context: ContextData, elapsedMs: number, args: any[]): any;
|
|
4
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGhF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY,CAQ7D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CA0DvG"}
|