risicare 0.4.0 → 0.4.2
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/frameworks/instructor.cjs +94 -81
- package/dist/frameworks/instructor.cjs.map +1 -1
- package/dist/frameworks/instructor.d.cts +19 -7
- package/dist/frameworks/instructor.d.ts +19 -7
- package/dist/frameworks/instructor.js +94 -83
- package/dist/frameworks/instructor.js.map +1 -1
- package/dist/frameworks/langchain.cjs +192 -101
- package/dist/frameworks/langchain.cjs.map +1 -1
- package/dist/frameworks/langchain.d.cts +97 -3
- package/dist/frameworks/langchain.d.ts +97 -3
- package/dist/frameworks/langchain.js +196 -101
- package/dist/frameworks/langchain.js.map +1 -1
- package/dist/frameworks/langgraph.cjs +192 -101
- package/dist/frameworks/langgraph.cjs.map +1 -1
- package/dist/frameworks/langgraph.js +196 -101
- package/dist/frameworks/langgraph.js.map +1 -1
- package/dist/frameworks/llamaindex.cjs +92 -74
- package/dist/frameworks/llamaindex.cjs.map +1 -1
- package/dist/frameworks/llamaindex.d.cts +33 -17
- package/dist/frameworks/llamaindex.d.ts +33 -17
- package/dist/frameworks/llamaindex.js +92 -76
- package/dist/frameworks/llamaindex.js.map +1 -1
- package/dist/index.cjs +2681 -2367
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -1
- package/dist/index.d.ts +35 -1
- package/dist/index.js +2613 -2318
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic/index.cjs +41 -49
- package/dist/providers/anthropic/index.cjs.map +1 -1
- package/dist/providers/anthropic/index.js +41 -51
- package/dist/providers/anthropic/index.js.map +1 -1
- package/dist/providers/bedrock/index.cjs +64 -59
- package/dist/providers/bedrock/index.cjs.map +1 -1
- package/dist/providers/bedrock/index.d.cts +13 -1
- package/dist/providers/bedrock/index.d.ts +13 -1
- package/dist/providers/bedrock/index.js +63 -61
- package/dist/providers/bedrock/index.js.map +1 -1
- package/dist/providers/cerebras/index.cjs +41 -49
- package/dist/providers/cerebras/index.cjs.map +1 -1
- package/dist/providers/cerebras/index.js +41 -51
- package/dist/providers/cerebras/index.js.map +1 -1
- package/dist/providers/cohere/index.cjs +43 -51
- package/dist/providers/cohere/index.cjs.map +1 -1
- package/dist/providers/cohere/index.js +43 -53
- package/dist/providers/cohere/index.js.map +1 -1
- package/dist/providers/google/index.cjs +41 -49
- package/dist/providers/google/index.cjs.map +1 -1
- package/dist/providers/google/index.js +41 -51
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/groq/index.cjs +41 -49
- package/dist/providers/groq/index.cjs.map +1 -1
- package/dist/providers/groq/index.js +41 -51
- package/dist/providers/groq/index.js.map +1 -1
- package/dist/providers/huggingface/index.cjs +41 -49
- package/dist/providers/huggingface/index.cjs.map +1 -1
- package/dist/providers/huggingface/index.js +41 -51
- package/dist/providers/huggingface/index.js.map +1 -1
- package/dist/providers/mistral/index.cjs +45 -53
- package/dist/providers/mistral/index.cjs.map +1 -1
- package/dist/providers/mistral/index.js +45 -55
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/ollama/index.cjs +49 -49
- package/dist/providers/ollama/index.cjs.map +1 -1
- package/dist/providers/ollama/index.js +49 -51
- package/dist/providers/ollama/index.js.map +1 -1
- package/dist/providers/openai/index.cjs +44 -50
- package/dist/providers/openai/index.cjs.map +1 -1
- package/dist/providers/openai/index.js +44 -52
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/together/index.cjs +41 -49
- package/dist/providers/together/index.cjs.map +1 -1
- package/dist/providers/together/index.js +41 -51
- package/dist/providers/together/index.js.map +1 -1
- package/dist/providers/vercel-ai/index.cjs +28 -43
- package/dist/providers/vercel-ai/index.cjs.map +1 -1
- package/dist/providers/vercel-ai/index.js +28 -45
- package/dist/providers/vercel-ai/index.js.map +1 -1
- package/package.json +94 -33
|
@@ -3,9 +3,6 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __esm = (fn, res) => function __init() {
|
|
7
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
-
};
|
|
9
6
|
var __export = (target, all) => {
|
|
10
7
|
for (var name in all)
|
|
11
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -20,34 +17,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
20
17
|
};
|
|
21
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
22
19
|
|
|
23
|
-
// src/globals.ts
|
|
24
|
-
function getTracer() {
|
|
25
|
-
return G[PREFIX + "tracer"];
|
|
26
|
-
}
|
|
27
|
-
function getContextStorage() {
|
|
28
|
-
if (!G[PREFIX + "ctx"]) {
|
|
29
|
-
G[PREFIX + "ctx"] = new import_node_async_hooks.AsyncLocalStorage();
|
|
30
|
-
}
|
|
31
|
-
return G[PREFIX + "ctx"];
|
|
32
|
-
}
|
|
33
|
-
var import_node_async_hooks, G, PREFIX;
|
|
34
|
-
var init_globals = __esm({
|
|
35
|
-
"src/globals.ts"() {
|
|
36
|
-
"use strict";
|
|
37
|
-
import_node_async_hooks = require("async_hooks");
|
|
38
|
-
G = globalThis;
|
|
39
|
-
PREFIX = "__risicare_";
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// src/utils/log.ts
|
|
44
|
-
var init_log = __esm({
|
|
45
|
-
"src/utils/log.ts"() {
|
|
46
|
-
"use strict";
|
|
47
|
-
init_globals();
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
|
|
51
20
|
// src/frameworks/langchain.ts
|
|
52
21
|
var langchain_exports = {};
|
|
53
22
|
__export(langchain_exports, {
|
|
@@ -128,8 +97,24 @@ var NOOP_SPAN = Object.freeze({
|
|
|
128
97
|
}
|
|
129
98
|
});
|
|
130
99
|
|
|
100
|
+
// src/globals.ts
|
|
101
|
+
var import_node_async_hooks = require("async_hooks");
|
|
102
|
+
var G = globalThis;
|
|
103
|
+
var PREFIX = "__risicare_";
|
|
104
|
+
function getTracer() {
|
|
105
|
+
return G[PREFIX + "tracer"];
|
|
106
|
+
}
|
|
107
|
+
function getContextStorage() {
|
|
108
|
+
if (!G[PREFIX + "ctx"]) {
|
|
109
|
+
G[PREFIX + "ctx"] = new import_node_async_hooks.AsyncLocalStorage();
|
|
110
|
+
}
|
|
111
|
+
return G[PREFIX + "ctx"];
|
|
112
|
+
}
|
|
113
|
+
function getDebug() {
|
|
114
|
+
return G[PREFIX + "debug"] ?? false;
|
|
115
|
+
}
|
|
116
|
+
|
|
131
117
|
// src/context/storage.ts
|
|
132
|
-
init_globals();
|
|
133
118
|
function storage() {
|
|
134
119
|
return getContextStorage();
|
|
135
120
|
}
|
|
@@ -142,15 +127,18 @@ function runWithContext(overrides, fn) {
|
|
|
142
127
|
return storage().run(merged, fn);
|
|
143
128
|
}
|
|
144
129
|
|
|
145
|
-
// src/
|
|
146
|
-
|
|
130
|
+
// src/utils/log.ts
|
|
131
|
+
function debug(msg) {
|
|
132
|
+
if (getDebug()) {
|
|
133
|
+
process.stderr.write(`[risicare] ${msg}
|
|
134
|
+
`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
147
137
|
|
|
148
|
-
// src/
|
|
149
|
-
|
|
138
|
+
// src/runtime/applier.ts
|
|
139
|
+
var import_node_crypto2 = require("crypto");
|
|
150
140
|
|
|
151
141
|
// src/client.ts
|
|
152
|
-
init_log();
|
|
153
|
-
init_globals();
|
|
154
142
|
function getTracer2() {
|
|
155
143
|
return getTracer();
|
|
156
144
|
}
|
|
@@ -162,9 +150,62 @@ function suppressProviderInstrumentation(fn) {
|
|
|
162
150
|
}
|
|
163
151
|
|
|
164
152
|
// src/frameworks/langchain.ts
|
|
165
|
-
var
|
|
153
|
+
var import_meta = {};
|
|
154
|
+
function resolveBaseCallbackHandler() {
|
|
155
|
+
try {
|
|
156
|
+
const { createRequire } = require("module");
|
|
157
|
+
const req = createRequire(import_meta.url);
|
|
158
|
+
const mod = req("@langchain/core/callbacks/base");
|
|
159
|
+
if (mod?.BaseCallbackHandler) {
|
|
160
|
+
return mod.BaseCallbackHandler;
|
|
161
|
+
}
|
|
162
|
+
} catch {
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
const mod = require("@langchain/core/callbacks/base");
|
|
166
|
+
if (mod?.BaseCallbackHandler) {
|
|
167
|
+
return mod.BaseCallbackHandler;
|
|
168
|
+
}
|
|
169
|
+
} catch {
|
|
170
|
+
debug("RisicareCallbackHandler: @langchain/core not installed; handler will not satisfy LangChain v0.2+ instanceof check");
|
|
171
|
+
}
|
|
172
|
+
return Object;
|
|
173
|
+
}
|
|
174
|
+
var _BaseCallbackHandler = resolveBaseCallbackHandler();
|
|
175
|
+
var RisicareCallbackHandler = class _RisicareCallbackHandler extends _BaseCallbackHandler {
|
|
176
|
+
// PR-4+5 review B1: duck-type markers that LangChain v0.3's
|
|
177
|
+
// `isBaseCallbackHandler(x)` checks. This is the ONLY reliable way to be
|
|
178
|
+
// recognised across the CJS↔ESM identity split — `instanceof` cannot work
|
|
179
|
+
// when our `createRequire`-loaded BaseCallbackHandler is a different
|
|
180
|
+
// class object from the customer's ESM-imported BaseCallbackHandler.
|
|
181
|
+
// Keep these as instance properties (not prototype) so they survive any
|
|
182
|
+
// Object-fallback path when @langchain/core is absent.
|
|
166
183
|
name = "RisicareCallbackHandler";
|
|
184
|
+
awaitHandlers = true;
|
|
185
|
+
ignoreLLM = false;
|
|
186
|
+
ignoreChain = false;
|
|
187
|
+
ignoreAgent = false;
|
|
188
|
+
ignoreRetriever = false;
|
|
189
|
+
ignoreCustomEvent = false;
|
|
190
|
+
raiseError = false;
|
|
191
|
+
lc_serializable = false;
|
|
192
|
+
lc_kwargs = {};
|
|
167
193
|
_spans = /* @__PURE__ */ new Map();
|
|
194
|
+
constructor() {
|
|
195
|
+
super();
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Required by LangChain's `isBaseCallbackHandler(x)` duck-type check
|
|
199
|
+
* (`typeof x.copy === 'function'`). When @langchain/core is installed
|
|
200
|
+
* BaseCallbackHandler's prototype provides its own `copy()`; this
|
|
201
|
+
* declaration overrides with a Risicare-aware copy that re-instantiates
|
|
202
|
+
* — sufficient for the handler-cloning paths LangChain uses internally
|
|
203
|
+
* (e.g., per-run isolation in concurrent chains). Spans map starts empty
|
|
204
|
+
* because a fresh handler should not share span state with its parent.
|
|
205
|
+
*/
|
|
206
|
+
copy() {
|
|
207
|
+
return new _RisicareCallbackHandler();
|
|
208
|
+
}
|
|
168
209
|
/**
|
|
169
210
|
* Run a function with provider instrumentation suppressed.
|
|
170
211
|
*
|
|
@@ -181,57 +222,75 @@ var RisicareCallbackHandler = class {
|
|
|
181
222
|
withSuppression(fn) {
|
|
182
223
|
return suppressProviderInstrumentation(fn);
|
|
183
224
|
}
|
|
184
|
-
// ──
|
|
185
|
-
|
|
225
|
+
// ── Internal helpers ──────────────────────────────────────────────────────
|
|
226
|
+
_startSpan(runId, parentRunId, name, kind, extraAttrs = {}) {
|
|
186
227
|
const tracer = getTracer2();
|
|
187
228
|
if (!tracer?.enabled) return;
|
|
188
229
|
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
189
230
|
const span = tracer.createSpan({
|
|
190
|
-
name
|
|
191
|
-
kind
|
|
231
|
+
name,
|
|
232
|
+
kind,
|
|
192
233
|
parentSpanId: parentEntry?.span.spanId,
|
|
193
234
|
traceId: parentEntry?.span.traceId,
|
|
194
235
|
attributes: {
|
|
195
|
-
|
|
236
|
+
framework: "langchain",
|
|
196
237
|
"langchain.run_id": runId,
|
|
197
238
|
...parentRunId ? { "langchain.parent_run_id": parentRunId } : {},
|
|
198
|
-
...
|
|
239
|
+
...extraAttrs
|
|
199
240
|
}
|
|
200
241
|
});
|
|
201
242
|
this._spans.set(runId, { span, startTime: Date.now() });
|
|
202
243
|
}
|
|
203
|
-
|
|
244
|
+
_endSpan(runId, extraAttrs = {}) {
|
|
204
245
|
const entry = this._spans.get(runId);
|
|
205
246
|
if (!entry) return;
|
|
247
|
+
for (const [k, v] of Object.entries(extraAttrs)) {
|
|
248
|
+
entry.span.setAttribute(k, v);
|
|
249
|
+
}
|
|
206
250
|
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
207
251
|
entry.span.end();
|
|
208
252
|
this._spans.delete(runId);
|
|
209
253
|
}
|
|
210
|
-
|
|
254
|
+
_errorSpan(runId, error) {
|
|
211
255
|
const entry = this._spans.get(runId);
|
|
212
256
|
if (!entry) return;
|
|
213
257
|
entry.span.recordException(error);
|
|
214
258
|
entry.span.end();
|
|
215
259
|
this._spans.delete(runId);
|
|
216
260
|
}
|
|
261
|
+
// ── Chain lifecycle ────────────────────────────────────────────────────────
|
|
262
|
+
handleChainStart(chain, _inputs, runId, parentRunId) {
|
|
263
|
+
this._startSpan(runId, parentRunId, chain.name || chain._type || "chain", "internal" /* INTERNAL */, {
|
|
264
|
+
...chain._type ? { "langchain.chain_type": chain._type } : {}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
handleChainEnd(_outputs, runId) {
|
|
268
|
+
this._endSpan(runId);
|
|
269
|
+
}
|
|
270
|
+
handleChainError(error, runId) {
|
|
271
|
+
this._errorSpan(runId, error);
|
|
272
|
+
}
|
|
217
273
|
// ── LLM lifecycle ─────────────────────────────────────────────────────────
|
|
218
274
|
handleLLMStart(llm, _prompts, runId, parentRunId) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
275
|
+
this._startSpan(runId, parentRunId, llm.name || llm._type || "llm", "llm_call" /* LLM_CALL */, {
|
|
276
|
+
"gen_ai.system": "langchain",
|
|
277
|
+
"gen_ai.prompt.count": _prompts.length
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* F-882: chat-model lifecycle — LangChain v0.2+ emits this for any
|
|
282
|
+
* ChatModel (which is EVERY production LLM today). Without this method,
|
|
283
|
+
* not a single `langchain` LLM span fires when used via LCEL.
|
|
284
|
+
*
|
|
285
|
+
* The messages payload is an array-of-arrays (one inner array per prompt);
|
|
286
|
+
* we just count rather than materialize content (PII boundary).
|
|
287
|
+
*/
|
|
288
|
+
handleChatModelStart(llm, messages, runId, parentRunId) {
|
|
289
|
+
const messageCount = Array.isArray(messages) ? messages.reduce((sum, arr) => sum + (Array.isArray(arr) ? arr.length : 0), 0) : 0;
|
|
290
|
+
this._startSpan(runId, parentRunId, llm.name || llm._type || "chat_model", "llm_call" /* LLM_CALL */, {
|
|
291
|
+
"gen_ai.system": "langchain",
|
|
292
|
+
"gen_ai.message.count": messageCount
|
|
233
293
|
});
|
|
234
|
-
this._spans.set(runId, { span, startTime: Date.now() });
|
|
235
294
|
}
|
|
236
295
|
handleLLMEnd(output, runId) {
|
|
237
296
|
const entry = this._spans.get(runId);
|
|
@@ -253,73 +312,105 @@ var RisicareCallbackHandler = class {
|
|
|
253
312
|
this._spans.delete(runId);
|
|
254
313
|
}
|
|
255
314
|
handleLLMError(error, runId) {
|
|
315
|
+
this._errorSpan(runId, error);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* F-883: streaming-token event. We do NOT create a new span (the LLM span
|
|
319
|
+
* already exists from handleLLMStart/handleChatModelStart) — just count tokens
|
|
320
|
+
* on the existing span. This is a HIGH-FREQUENCY event; do the cheap work only.
|
|
321
|
+
*/
|
|
322
|
+
handleLLMNewToken(_token, _idx, runId) {
|
|
256
323
|
const entry = this._spans.get(runId);
|
|
257
324
|
if (!entry) return;
|
|
258
|
-
entry.span.
|
|
259
|
-
entry.span.
|
|
260
|
-
this._spans.delete(runId);
|
|
325
|
+
const prior = entry.span.attributes?.["gen_ai.stream.token_count"] ?? 0;
|
|
326
|
+
entry.span.setAttribute("gen_ai.stream.token_count", prior + 1);
|
|
261
327
|
}
|
|
262
328
|
// ── Tool lifecycle ────────────────────────────────────────────────────────
|
|
263
329
|
handleToolStart(tool, input, runId, parentRunId) {
|
|
330
|
+
this._startSpan(runId, parentRunId, tool.name || "tool", "tool_call" /* TOOL_CALL */, {
|
|
331
|
+
"tool.name": tool.name || "unknown",
|
|
332
|
+
"tool.input_length": input?.length ?? 0
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
handleToolEnd(output, runId) {
|
|
336
|
+
this._endSpan(runId, { "tool.output_length": output?.length ?? 0 });
|
|
337
|
+
}
|
|
338
|
+
handleToolError(error, runId) {
|
|
339
|
+
this._errorSpan(runId, error);
|
|
340
|
+
}
|
|
341
|
+
// ── Retriever lifecycle ───────────────────────────────────────────────────
|
|
342
|
+
handleRetrieverStart(retriever, _query, runId, parentRunId) {
|
|
343
|
+
this._startSpan(runId, parentRunId, retriever.name || "retriever", "retrieval" /* RETRIEVAL */);
|
|
344
|
+
}
|
|
345
|
+
handleRetrieverEnd(documents, runId) {
|
|
346
|
+
this._endSpan(runId, { "retriever.document_count": documents?.length ?? 0 });
|
|
347
|
+
}
|
|
348
|
+
handleRetrieverError(error, runId) {
|
|
349
|
+
this._errorSpan(runId, error);
|
|
350
|
+
}
|
|
351
|
+
// ── Agent lifecycle (F-882) ───────────────────────────────────────────────
|
|
352
|
+
/**
|
|
353
|
+
* Agent decided to take an action (call a tool). LangChain v0.2 agents emit
|
|
354
|
+
* this between LLM calls. Cheap span, no parent change.
|
|
355
|
+
*/
|
|
356
|
+
handleAgentAction(action, runId, parentRunId) {
|
|
264
357
|
const tracer = getTracer2();
|
|
265
358
|
if (!tracer?.enabled) return;
|
|
266
359
|
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
267
360
|
const span = tracer.createSpan({
|
|
268
|
-
name: tool
|
|
269
|
-
kind: "
|
|
361
|
+
name: `agent.action:${action.tool ?? "unknown"}`,
|
|
362
|
+
kind: "internal" /* INTERNAL */,
|
|
270
363
|
parentSpanId: parentEntry?.span.spanId,
|
|
271
364
|
traceId: parentEntry?.span.traceId,
|
|
272
365
|
attributes: {
|
|
273
|
-
|
|
366
|
+
framework: "langchain",
|
|
274
367
|
"langchain.run_id": runId,
|
|
275
|
-
"tool
|
|
276
|
-
"tool.input_length": input?.length ?? 0
|
|
368
|
+
"agent.action.tool": action.tool ?? ""
|
|
277
369
|
}
|
|
278
370
|
});
|
|
279
|
-
|
|
371
|
+
span.end();
|
|
280
372
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
286
|
-
entry.span.end();
|
|
287
|
-
this._spans.delete(runId);
|
|
288
|
-
}
|
|
289
|
-
handleToolError(error, runId) {
|
|
290
|
-
const entry = this._spans.get(runId);
|
|
291
|
-
if (!entry) return;
|
|
292
|
-
entry.span.recordException(error);
|
|
293
|
-
entry.span.end();
|
|
294
|
-
this._spans.delete(runId);
|
|
295
|
-
}
|
|
296
|
-
// ── Retriever lifecycle ───────────────────────────────────────────────────
|
|
297
|
-
handleRetrieverStart(retriever, _query, runId, parentRunId) {
|
|
373
|
+
/**
|
|
374
|
+
* Agent finished (final answer produced). Mirror of handleAgentAction.
|
|
375
|
+
*/
|
|
376
|
+
handleAgentEnd(action, runId, parentRunId) {
|
|
298
377
|
const tracer = getTracer2();
|
|
299
378
|
if (!tracer?.enabled) return;
|
|
300
379
|
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
301
380
|
const span = tracer.createSpan({
|
|
302
|
-
name:
|
|
303
|
-
kind: "
|
|
381
|
+
name: "agent.end",
|
|
382
|
+
kind: "internal" /* INTERNAL */,
|
|
304
383
|
parentSpanId: parentEntry?.span.spanId,
|
|
305
384
|
traceId: parentEntry?.span.traceId,
|
|
306
385
|
attributes: {
|
|
307
|
-
|
|
308
|
-
"langchain.run_id": runId
|
|
386
|
+
framework: "langchain",
|
|
387
|
+
"langchain.run_id": runId,
|
|
388
|
+
"agent.return_keys": action.returnValues ? Object.keys(action.returnValues).length : 0
|
|
309
389
|
}
|
|
310
390
|
});
|
|
311
|
-
|
|
391
|
+
span.end();
|
|
312
392
|
}
|
|
313
|
-
|
|
393
|
+
// ── Misc (F-882) ──────────────────────────────────────────────────────────
|
|
394
|
+
/**
|
|
395
|
+
* Free-text emission (logging-style). Used by ConversationalRetrievalChain
|
|
396
|
+
* and verbose prints. Adds an event to the current chain span if one exists.
|
|
397
|
+
*/
|
|
398
|
+
handleText(text, runId, _parentRunId) {
|
|
314
399
|
const entry = this._spans.get(runId);
|
|
315
400
|
if (!entry) return;
|
|
316
|
-
entry.span.
|
|
317
|
-
"
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
401
|
+
entry.span.addEvent("langchain.text", {
|
|
402
|
+
"text.length": text?.length ?? 0
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Custom event hook (introduced in @langchain/core 0.2.14). Customer code can
|
|
407
|
+
* `dispatchCustomEvent(name, payload)` from inside a runnable. We surface as
|
|
408
|
+
* a span event on the closest enclosing run so it shows up in the trace.
|
|
409
|
+
*/
|
|
410
|
+
handleCustomEvent(eventName, _payload, runId, _tags, _metadata) {
|
|
411
|
+
const entry = this._spans.get(runId);
|
|
412
|
+
if (!entry) return;
|
|
413
|
+
entry.span.addEvent("langchain.custom_event", { name: eventName });
|
|
323
414
|
}
|
|
324
415
|
};
|
|
325
416
|
// Annotate the CommonJS export names for ESM import in node:
|