arkna-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +562 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +257 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +948 -0
- package/dist/client.js.map +1 -0
- package/dist/enforcement.d.ts +67 -0
- package/dist/enforcement.d.ts.map +1 -0
- package/dist/enforcement.js +303 -0
- package/dist/enforcement.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +74 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +333 -0
- package/dist/init.js.map +1 -0
- package/dist/instrumentations/langchain.d.ts +79 -0
- package/dist/instrumentations/langchain.d.ts.map +1 -0
- package/dist/instrumentations/langchain.js +398 -0
- package/dist/instrumentations/langchain.js.map +1 -0
- package/dist/instrumentations/vercel-ai.d.ts +40 -0
- package/dist/instrumentations/vercel-ai.d.ts.map +1 -0
- package/dist/instrumentations/vercel-ai.js +212 -0
- package/dist/instrumentations/vercel-ai.js.map +1 -0
- package/dist/license.d.ts +89 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +198 -0
- package/dist/license.js.map +1 -0
- package/dist/types.d.ts +402 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
package/dist/init.js
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ARKNA Auto-Instrumentation for Node.js
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* import { init } from '@arkna/sdk';
|
|
7
|
+
* init('intk_...');
|
|
8
|
+
*
|
|
9
|
+
* Or with env vars:
|
|
10
|
+
* ARKNA_TOKEN=intk_... node app.js
|
|
11
|
+
* import { init } from '@arkna/sdk';
|
|
12
|
+
* init();
|
|
13
|
+
*
|
|
14
|
+
* All OpenAI and Anthropic SDK calls are automatically recorded as ARKNA runs.
|
|
15
|
+
* Each LLM call becomes a run with a reasoning step. Use trace() to group
|
|
16
|
+
* multiple LLM calls into a single run.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.init = init;
|
|
20
|
+
exports.trace = trace;
|
|
21
|
+
exports.shutdown = shutdown;
|
|
22
|
+
const async_hooks_1 = require("async_hooks");
|
|
23
|
+
const _config = { apiKey: '', ingestionUrl: '', debug: false };
|
|
24
|
+
let _initialized = false;
|
|
25
|
+
const _runCtx = new async_hooks_1.AsyncLocalStorage();
|
|
26
|
+
// ── HTTP helpers (zero dependencies, uses Node 18+ fetch) ───
|
|
27
|
+
async function _post(path, body) {
|
|
28
|
+
try {
|
|
29
|
+
const resp = await fetch(`${_config.ingestionUrl}${path}`, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: {
|
|
32
|
+
'X-Integration-Token': _config.apiKey,
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
},
|
|
35
|
+
body: JSON.stringify(body),
|
|
36
|
+
signal: AbortSignal.timeout(10_000),
|
|
37
|
+
});
|
|
38
|
+
return resp.ok ? await resp.json() : null;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function _patch(path, body) {
|
|
45
|
+
try {
|
|
46
|
+
const resp = await fetch(`${_config.ingestionUrl}${path}`, {
|
|
47
|
+
method: 'PATCH',
|
|
48
|
+
headers: {
|
|
49
|
+
'X-Integration-Token': _config.apiKey,
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify(body),
|
|
53
|
+
signal: AbortSignal.timeout(10_000),
|
|
54
|
+
});
|
|
55
|
+
return resp.ok ? await resp.json() : null;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ── Cost estimation (per 1K tokens, USD) ────────────────────
|
|
62
|
+
const _COSTS = {
|
|
63
|
+
'gpt-4o': [0.0025, 0.01],
|
|
64
|
+
'gpt-4o-mini': [0.00015, 0.0006],
|
|
65
|
+
'gpt-4-turbo': [0.01, 0.03],
|
|
66
|
+
'gpt-4': [0.03, 0.06],
|
|
67
|
+
'gpt-3.5-turbo': [0.0005, 0.0015],
|
|
68
|
+
'claude-opus-4-6': [0.015, 0.075],
|
|
69
|
+
'claude-sonnet-4-5-20250929': [0.003, 0.015],
|
|
70
|
+
'claude-haiku-4-5-20251001': [0.0008, 0.004],
|
|
71
|
+
'claude-3-5-sonnet-20241022': [0.003, 0.015],
|
|
72
|
+
'claude-3-haiku-20240307': [0.00025, 0.00125],
|
|
73
|
+
};
|
|
74
|
+
function _costCents(model, inp, out) {
|
|
75
|
+
let c = _COSTS[model];
|
|
76
|
+
if (!c) {
|
|
77
|
+
for (const [k, v] of Object.entries(_COSTS)) {
|
|
78
|
+
if (model.startsWith(k)) {
|
|
79
|
+
c = v;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!c)
|
|
85
|
+
return 0;
|
|
86
|
+
return Math.round(((inp / 1000) * c[0] + (out / 1000) * c[1]) * 10000) / 100;
|
|
87
|
+
}
|
|
88
|
+
// ── Recording (fire-and-forget) ─────────────────────────────
|
|
89
|
+
function _record(provider, model, input, output, durationMs, tokens, error) {
|
|
90
|
+
const run = _runCtx.getStore();
|
|
91
|
+
const cost = _costCents(model, tokens.inp, tokens.out);
|
|
92
|
+
const stepBody = {
|
|
93
|
+
step_type: error ? 'error' : 'reasoning',
|
|
94
|
+
input: input.substring(0, 10000),
|
|
95
|
+
output: (error ? `${error.type}: ${error.message}` : output).substring(0, 10000),
|
|
96
|
+
duration_ms: durationMs,
|
|
97
|
+
tokens_used: tokens.total || undefined,
|
|
98
|
+
cost_cents: cost || undefined,
|
|
99
|
+
metadata: {
|
|
100
|
+
provider,
|
|
101
|
+
model,
|
|
102
|
+
prompt_tokens: tokens.inp,
|
|
103
|
+
completion_tokens: tokens.out,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
if (error) {
|
|
107
|
+
stepBody.error_type = error.type;
|
|
108
|
+
stepBody.error_message = error.message;
|
|
109
|
+
}
|
|
110
|
+
if (run) {
|
|
111
|
+
// Inside a trace() — record as step in existing run
|
|
112
|
+
_post(`/runs/${run.runId}/steps`, stepBody).catch(() => { });
|
|
113
|
+
run.stepCount++;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Standalone call — create run → record step → complete run
|
|
117
|
+
(async () => {
|
|
118
|
+
const r = await _post('/runs', {
|
|
119
|
+
trigger_type: 'auto',
|
|
120
|
+
input: input.substring(0, 5000),
|
|
121
|
+
metadata: { provider, model, auto_instrumented: true },
|
|
122
|
+
});
|
|
123
|
+
if (!r?.run_id)
|
|
124
|
+
return;
|
|
125
|
+
await _post(`/runs/${r.run_id}/steps`, stepBody);
|
|
126
|
+
const completeBody = {
|
|
127
|
+
status: error ? 'failed' : 'completed',
|
|
128
|
+
output: output.substring(0, 5000),
|
|
129
|
+
total_tokens: tokens.total || undefined,
|
|
130
|
+
total_cost_cents: cost || undefined,
|
|
131
|
+
};
|
|
132
|
+
if (error) {
|
|
133
|
+
completeBody.error_type = error.type;
|
|
134
|
+
completeBody.error_message = error.message;
|
|
135
|
+
}
|
|
136
|
+
await _patch(`/runs/${r.run_id}`, completeBody);
|
|
137
|
+
})().catch(() => { });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ── OpenAI patch ────────────────────────────────────────────
|
|
141
|
+
function _patchOpenAI() {
|
|
142
|
+
try {
|
|
143
|
+
const mod = require('openai/resources/chat/completions');
|
|
144
|
+
const Cls = mod.Completions;
|
|
145
|
+
if (!Cls?.prototype?.create || Cls.prototype.create.__arkna)
|
|
146
|
+
return false;
|
|
147
|
+
const orig = Cls.prototype.create;
|
|
148
|
+
const patched = async function (body, opts) {
|
|
149
|
+
const t0 = Date.now();
|
|
150
|
+
const msgs = body?.messages;
|
|
151
|
+
const inputStr = Array.isArray(msgs)
|
|
152
|
+
? JSON.stringify(msgs.slice(-3))
|
|
153
|
+
: String(msgs ?? '');
|
|
154
|
+
try {
|
|
155
|
+
const res = await orig.call(this, body, opts);
|
|
156
|
+
if (!body?.stream && res?.choices) {
|
|
157
|
+
const out = res.choices[0]?.message?.content ?? '';
|
|
158
|
+
const u = res.usage ?? {};
|
|
159
|
+
_record('openai', body.model ?? 'unknown', inputStr, out, Date.now() - t0, {
|
|
160
|
+
inp: u.prompt_tokens ?? 0,
|
|
161
|
+
out: u.completion_tokens ?? 0,
|
|
162
|
+
total: u.total_tokens ?? 0,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return res;
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
_record('openai', body?.model ?? 'unknown', inputStr, '', Date.now() - t0, { inp: 0, out: 0, total: 0 }, { type: e.name || 'Error', message: e.message });
|
|
169
|
+
throw e;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
patched.__arkna = true;
|
|
173
|
+
Cls.prototype.create = patched;
|
|
174
|
+
if (_config.debug)
|
|
175
|
+
console.log('[arkna] Patched openai.chat.completions.create');
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// ── Anthropic patch ─────────────────────────────────────────
|
|
183
|
+
function _patchAnthropic() {
|
|
184
|
+
try {
|
|
185
|
+
const mod = require('@anthropic-ai/sdk/resources/messages');
|
|
186
|
+
const Cls = mod.Messages;
|
|
187
|
+
if (!Cls?.prototype?.create || Cls.prototype.create.__arkna)
|
|
188
|
+
return false;
|
|
189
|
+
const orig = Cls.prototype.create;
|
|
190
|
+
const patched = async function (body, opts) {
|
|
191
|
+
const t0 = Date.now();
|
|
192
|
+
const msgs = body?.messages;
|
|
193
|
+
const inputStr = Array.isArray(msgs)
|
|
194
|
+
? JSON.stringify(msgs.slice(-3))
|
|
195
|
+
: String(msgs ?? '');
|
|
196
|
+
try {
|
|
197
|
+
const res = await orig.call(this, body, opts);
|
|
198
|
+
if (!body?.stream && res?.content) {
|
|
199
|
+
const out = res.content.map((c) => c.text ?? '').join('');
|
|
200
|
+
const u = res.usage ?? {};
|
|
201
|
+
const inp = u.input_tokens ?? 0;
|
|
202
|
+
const outp = u.output_tokens ?? 0;
|
|
203
|
+
_record('anthropic', body.model ?? 'unknown', inputStr, out, Date.now() - t0, {
|
|
204
|
+
inp,
|
|
205
|
+
out: outp,
|
|
206
|
+
total: inp + outp,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return res;
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
_record('anthropic', body?.model ?? 'unknown', inputStr, '', Date.now() - t0, { inp: 0, out: 0, total: 0 }, { type: e.name || 'Error', message: e.message });
|
|
213
|
+
throw e;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
patched.__arkna = true;
|
|
217
|
+
Cls.prototype.create = patched;
|
|
218
|
+
if (_config.debug)
|
|
219
|
+
console.log('[arkna] Patched anthropic.messages.create');
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Initialize ARKNA auto-instrumentation.
|
|
228
|
+
*
|
|
229
|
+
* Monkey-patches OpenAI and Anthropic SDKs to automatically record all LLM
|
|
230
|
+
* calls as ARKNA observability runs. Each call creates a run with a reasoning
|
|
231
|
+
* step capturing model, tokens, cost, latency, and input/output.
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```typescript
|
|
235
|
+
* import { init } from '@arkna/sdk';
|
|
236
|
+
*
|
|
237
|
+
* // With API key directly
|
|
238
|
+
* init('intk_...');
|
|
239
|
+
*
|
|
240
|
+
* // With env vars (ARKNA_TOKEN)
|
|
241
|
+
* init();
|
|
242
|
+
*
|
|
243
|
+
* // With options
|
|
244
|
+
* init({ apiKey: 'intk_...', debug: true });
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
function init(apiKeyOrOptions) {
|
|
248
|
+
if (_initialized)
|
|
249
|
+
return;
|
|
250
|
+
const opts = typeof apiKeyOrOptions === 'string'
|
|
251
|
+
? { apiKey: apiKeyOrOptions }
|
|
252
|
+
: (apiKeyOrOptions ?? {});
|
|
253
|
+
const apiKey = opts.apiKey || process.env.ARKNA_TOKEN || '';
|
|
254
|
+
const baseUrl = (opts.baseUrl || process.env.ARKNA_URL || 'https://api.arkna.com.au')
|
|
255
|
+
.replace(/\/+$/, '');
|
|
256
|
+
_config.debug = opts.debug ?? false;
|
|
257
|
+
if (!apiKey) {
|
|
258
|
+
if (_config.debug)
|
|
259
|
+
console.warn('[arkna] No API key. Set ARKNA_TOKEN or pass to init().');
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
_config.apiKey = apiKey;
|
|
263
|
+
_config.ingestionUrl = baseUrl.endsWith('/api/v1') ? baseUrl : `${baseUrl}/api/v1`;
|
|
264
|
+
_initialized = true;
|
|
265
|
+
const patched = [];
|
|
266
|
+
if (_patchOpenAI())
|
|
267
|
+
patched.push('openai');
|
|
268
|
+
if (_patchAnthropic())
|
|
269
|
+
patched.push('anthropic');
|
|
270
|
+
if (_config.debug) {
|
|
271
|
+
console.log(`[arkna] Initialized. Patched: ${patched.length ? patched.join(', ') : 'none (install openai or @anthropic-ai/sdk)'}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Trace a function as a single ARKNA run.
|
|
276
|
+
*
|
|
277
|
+
* All LLM calls made inside the function are recorded as steps in a single
|
|
278
|
+
* run, rather than creating separate runs for each call.
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
* ```typescript
|
|
282
|
+
* import { init, trace } from '@arkna/sdk';
|
|
283
|
+
* init();
|
|
284
|
+
*
|
|
285
|
+
* const result = await trace('research-task', async () => {
|
|
286
|
+
* const plan = await openai.chat.completions.create({ ... });
|
|
287
|
+
* const result = await openai.chat.completions.create({ ... });
|
|
288
|
+
* return result.choices[0].message.content;
|
|
289
|
+
* });
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
async function trace(name, fn, options) {
|
|
293
|
+
if (!_initialized)
|
|
294
|
+
return fn();
|
|
295
|
+
const run = await _post('/runs', {
|
|
296
|
+
trigger_type: 'auto',
|
|
297
|
+
input: name,
|
|
298
|
+
session_id: options?.sessionId,
|
|
299
|
+
metadata: { ...options?.metadata, auto_instrumented: true },
|
|
300
|
+
});
|
|
301
|
+
if (!run?.run_id)
|
|
302
|
+
return fn();
|
|
303
|
+
const ctx = { runId: run.run_id, stepCount: 0 };
|
|
304
|
+
return _runCtx.run(ctx, async () => {
|
|
305
|
+
try {
|
|
306
|
+
const result = await fn();
|
|
307
|
+
const out = typeof result === 'string' ? result : JSON.stringify(result);
|
|
308
|
+
_patch(`/runs/${run.run_id}`, {
|
|
309
|
+
status: 'completed',
|
|
310
|
+
output: out?.substring(0, 5000),
|
|
311
|
+
}).catch(() => { });
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
_patch(`/runs/${run.run_id}`, {
|
|
316
|
+
status: 'failed',
|
|
317
|
+
error_type: err.name || 'Error',
|
|
318
|
+
error_message: err.message,
|
|
319
|
+
}).catch(() => { });
|
|
320
|
+
throw err;
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Shut down ARKNA instrumentation and clear internal state.
|
|
326
|
+
* Call before process exit if you want to ensure clean teardown.
|
|
327
|
+
*/
|
|
328
|
+
function shutdown() {
|
|
329
|
+
_initialized = false;
|
|
330
|
+
_config.apiKey = '';
|
|
331
|
+
_config.ingestionUrl = '';
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ARKNA LangChain Auto-Instrumentation
|
|
3
|
+
*
|
|
4
|
+
* Callback handler that automatically captures LangChain chain/agent
|
|
5
|
+
* executions as ARKNA observability runs — no manual SDK calls needed.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { ArknaClient, ArknaLangChainHandler } from '@arkna/sdk';
|
|
9
|
+
* const client = new ArknaClient();
|
|
10
|
+
* const handler = new ArknaLangChainHandler(client);
|
|
11
|
+
* const result = await chain.invoke(input, { callbacks: [handler] });
|
|
12
|
+
*
|
|
13
|
+
* Requires: langchain >= 0.2.0 (peer dependency, not bundled)
|
|
14
|
+
*/
|
|
15
|
+
import type { ArknaClient } from '../client';
|
|
16
|
+
/** Options for the ARKNA LangChain handler */
|
|
17
|
+
export interface ArknaLangChainHandlerOptions {
|
|
18
|
+
/** Session ID to group related runs */
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
/** How the run was triggered (e.g. 'api', 'user', 'cron') */
|
|
21
|
+
trigger?: string;
|
|
22
|
+
/** Additional metadata attached to the run */
|
|
23
|
+
metadata?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* LangChain callback handler that auto-captures runs into ARKNA observability.
|
|
27
|
+
*
|
|
28
|
+
* Event mapping:
|
|
29
|
+
* chain start → startRun() (top-level) or recordStep(reasoning) (nested)
|
|
30
|
+
* LLM start → recordStep(reasoning)
|
|
31
|
+
* LLM end → update step with output + token usage
|
|
32
|
+
* tool start → recordToolCall()
|
|
33
|
+
* tool end → (tool result captured)
|
|
34
|
+
* retriever → recordStep(retrieval)
|
|
35
|
+
* chain end → completeRun(completed)
|
|
36
|
+
* chain error → completeRun(failed)
|
|
37
|
+
*
|
|
38
|
+
* This class dynamically extends BaseCallbackHandler at runtime so that
|
|
39
|
+
* `@langchain/core` is only required at runtime (peer dependency).
|
|
40
|
+
*/
|
|
41
|
+
export declare class ArknaLangChainHandler {
|
|
42
|
+
private client;
|
|
43
|
+
private sessionId?;
|
|
44
|
+
private trigger;
|
|
45
|
+
private runMetadata;
|
|
46
|
+
private runs;
|
|
47
|
+
private parentToArknaRun;
|
|
48
|
+
private rootRunId;
|
|
49
|
+
private _handler;
|
|
50
|
+
constructor(client: ArknaClient, options?: ArknaLangChainHandlerOptions);
|
|
51
|
+
/**
|
|
52
|
+
* Get the LangChain-compatible callback handler instance.
|
|
53
|
+
* Lazily creates a BaseCallbackHandler subclass on first access.
|
|
54
|
+
* Pass this to LangChain's `callbacks` option.
|
|
55
|
+
*/
|
|
56
|
+
get handler(): any;
|
|
57
|
+
/**
|
|
58
|
+
* Also allow using the ArknaLangChainHandler directly as a callback
|
|
59
|
+
* by implementing the key callback methods on the instance itself.
|
|
60
|
+
* LangChain checks for method existence, so this works as a duck-typed handler.
|
|
61
|
+
*/
|
|
62
|
+
private createHandler;
|
|
63
|
+
private post;
|
|
64
|
+
private patch;
|
|
65
|
+
private handleChainStart;
|
|
66
|
+
private handleChainEnd;
|
|
67
|
+
private handleChainError;
|
|
68
|
+
private handleLLMStart;
|
|
69
|
+
private handleLLMEnd;
|
|
70
|
+
private handleLLMError;
|
|
71
|
+
private handleToolStart;
|
|
72
|
+
private handleToolError;
|
|
73
|
+
private handleRetrieverStart;
|
|
74
|
+
private handleRetrieverEnd;
|
|
75
|
+
private handleRetrieverError;
|
|
76
|
+
private getArknaRunId;
|
|
77
|
+
private cleanup;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=langchain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/instrumentations/langchain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,8CAA8C;AAC9C,MAAM,WAAW,4BAA4B;IAC3C,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAQD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAA0B;IAG7C,OAAO,CAAC,IAAI,CAA+B;IAE3C,OAAO,CAAC,gBAAgB,CAA6B;IAErD,OAAO,CAAC,SAAS,CAAuB;IAGxC,OAAO,CAAC,QAAQ,CAAa;gBAEjB,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,4BAA4B;IAOvE;;;;OAIG;IACH,IAAI,OAAO,IAAI,GAAG,CAKjB;IAED;;;;OAIG;IACH,OAAO,CAAC,aAAa;YAuDP,IAAI;YAIJ,KAAK;YAQL,gBAAgB;YA6ChB,cAAc;YAkBd,gBAAgB;YAyBhB,cAAc;YA8Bd,YAAY;YA8BZ,cAAc;YAsBd,eAAe;YA+Cf,eAAe;YAsBf,oBAAoB;YA6BpB,kBAAkB;YAwBlB,oBAAoB;IAsBlC,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,OAAO;CAKhB"}
|