@morsehq-dev/sdk 0.5.0 → 0.6.0-rc.1
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 +11 -10
- package/dist/anthropic/index.cjs +11 -11
- package/dist/anthropic/index.d.cts +1 -1
- package/dist/anthropic/index.d.ts +1 -1
- package/dist/anthropic/index.js +4 -4
- package/dist/anthropic-agent-sdk/index.cjs +44 -40
- package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/anthropic-agent-sdk/index.d.cts +1 -1
- package/dist/anthropic-agent-sdk/index.d.ts +1 -1
- package/dist/anthropic-agent-sdk/index.js +10 -6
- package/dist/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/anthropic/index.cjs +11 -11
- package/dist/browser/anthropic/index.js +4 -4
- package/dist/browser/anthropic-agent-sdk/index.cjs +44 -40
- package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/browser/anthropic-agent-sdk/index.js +10 -6
- package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/{chunk-ELQ4LGAS.cjs → chunk-33WDUUKZ.cjs} +18 -18
- package/dist/browser/{chunk-ELQ4LGAS.cjs.map → chunk-33WDUUKZ.cjs.map} +1 -1
- package/dist/browser/{chunk-TV7TRP5O.cjs → chunk-3I7IGP3P.cjs} +5 -5
- package/dist/browser/chunk-3I7IGP3P.cjs.map +1 -0
- package/dist/browser/{chunk-YYUDZTHI.js → chunk-3OYHDDOJ.js} +27 -5
- package/dist/browser/chunk-3OYHDDOJ.js.map +1 -0
- package/dist/browser/{chunk-6BNMYEMW.cjs → chunk-4IUHXUCJ.cjs} +49 -9
- package/dist/browser/chunk-4IUHXUCJ.cjs.map +1 -0
- package/dist/browser/{chunk-BUCIE3DR.js → chunk-5TYTCLKA.js} +4 -4
- package/dist/browser/{chunk-BUCIE3DR.js.map → chunk-5TYTCLKA.js.map} +1 -1
- package/dist/browser/{chunk-VIOT3AOP.js → chunk-6JHMFFPE.js} +3 -3
- package/dist/browser/chunk-6JHMFFPE.js.map +1 -0
- package/dist/browser/{chunk-BIP66M44.cjs → chunk-FKYI3N5N.cjs} +7 -7
- package/dist/browser/{chunk-BIP66M44.cjs.map → chunk-FKYI3N5N.cjs.map} +1 -1
- package/dist/browser/{chunk-NU74H55W.js → chunk-FPTUHYDJ.js} +3 -3
- package/dist/browser/{chunk-NU74H55W.js.map → chunk-FPTUHYDJ.js.map} +1 -1
- package/dist/browser/{chunk-52JTU4LH.cjs → chunk-IDKQZ4X5.cjs} +38 -15
- package/dist/browser/chunk-IDKQZ4X5.cjs.map +1 -0
- package/dist/browser/{chunk-2X64OY2L.cjs → chunk-LIP3XCTK.cjs} +12 -12
- package/dist/browser/{chunk-2X64OY2L.cjs.map → chunk-LIP3XCTK.cjs.map} +1 -1
- package/dist/browser/{chunk-T6Z6UIBN.js → chunk-OUQAH27A.js} +3 -3
- package/dist/browser/{chunk-T6Z6UIBN.js.map → chunk-OUQAH27A.js.map} +1 -1
- package/dist/browser/{chunk-4CMVMTFB.cjs → chunk-PSNZZBQJ.cjs} +6 -6
- package/dist/browser/{chunk-4CMVMTFB.cjs.map → chunk-PSNZZBQJ.cjs.map} +1 -1
- package/dist/browser/{chunk-6T6ZPOKZ.js → chunk-PXHTLCEU.js} +49 -10
- package/dist/browser/chunk-PXHTLCEU.js.map +1 -0
- package/dist/browser/{chunk-KZFG23MO.js → chunk-TRVACYUN.js} +5 -5
- package/dist/browser/{chunk-KZFG23MO.js.map → chunk-TRVACYUN.js.map} +1 -1
- package/dist/browser/index.cjs +189 -124
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +111 -46
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/integrations/pino.cjs +4 -4
- package/dist/browser/integrations/pino.js +3 -3
- package/dist/browser/langchain/index.cjs +28 -26
- package/dist/browser/langchain/index.cjs.map +1 -1
- package/dist/browser/langchain/index.js +13 -11
- package/dist/browser/langchain/index.js.map +1 -1
- package/dist/browser/langgraph/index.cjs +32 -30
- package/dist/browser/langgraph/index.cjs.map +1 -1
- package/dist/browser/langgraph/index.js +10 -8
- package/dist/browser/langgraph/index.js.map +1 -1
- package/dist/browser/openai/index.cjs +11 -11
- package/dist/browser/openai/index.js +2 -2
- package/dist/browser/openai-agents/index.cjs +63 -35
- package/dist/browser/openai-agents/index.cjs.map +1 -1
- package/dist/browser/openai-agents/index.js +33 -5
- package/dist/browser/openai-agents/index.js.map +1 -1
- package/dist/browser/vercel-ai/index.cjs +14 -14
- package/dist/browser/vercel-ai/index.js +3 -3
- package/dist/{chunk-KMBKZLXH.cjs → chunk-7DALGJL2.cjs} +100 -25
- package/dist/chunk-7DALGJL2.cjs.map +1 -0
- package/dist/{chunk-D5NTF54A.cjs → chunk-B7TGG62X.cjs} +12 -12
- package/dist/{chunk-D5NTF54A.cjs.map → chunk-B7TGG62X.cjs.map} +1 -1
- package/dist/{chunk-LPLL2OXI.cjs → chunk-COZFARLL.cjs} +5 -5
- package/dist/chunk-COZFARLL.cjs.map +1 -0
- package/dist/{chunk-GTPKPUAV.cjs → chunk-DXTNU2KT.cjs} +38 -15
- package/dist/chunk-DXTNU2KT.cjs.map +1 -0
- package/dist/{chunk-6FLGLD72.js → chunk-ERH3TNXZ.js} +3 -3
- package/dist/{chunk-6FLGLD72.js.map → chunk-ERH3TNXZ.js.map} +1 -1
- package/dist/{chunk-7HYFOHM3.cjs → chunk-ESJJXXB6.cjs} +6 -6
- package/dist/{chunk-7HYFOHM3.cjs.map → chunk-ESJJXXB6.cjs.map} +1 -1
- package/dist/{chunk-SUEBUMHL.cjs → chunk-ETRNCI5Z.cjs} +18 -18
- package/dist/{chunk-SUEBUMHL.cjs.map → chunk-ETRNCI5Z.cjs.map} +1 -1
- package/dist/{chunk-KWOSUW7B.js → chunk-GULJAURY.js} +27 -5
- package/dist/chunk-GULJAURY.js.map +1 -0
- package/dist/{chunk-ZIMGB7IT.js → chunk-HJV35HWL.js} +100 -26
- package/dist/chunk-HJV35HWL.js.map +1 -0
- package/dist/{chunk-3ONFIKKC.js → chunk-L7AD4KUD.js} +3 -3
- package/dist/chunk-L7AD4KUD.js.map +1 -0
- package/dist/{chunk-SFI36VWW.js → chunk-QBDTQTMN.js} +3 -3
- package/dist/{chunk-SFI36VWW.js.map → chunk-QBDTQTMN.js.map} +1 -1
- package/dist/{chunk-NMARCV3R.cjs → chunk-WG4H5JC6.cjs} +7 -7
- package/dist/{chunk-NMARCV3R.cjs.map → chunk-WG4H5JC6.cjs.map} +1 -1
- package/dist/{chunk-J5FEPM7L.js → chunk-XS4P7XPV.js} +5 -5
- package/dist/{chunk-J5FEPM7L.js.map → chunk-XS4P7XPV.js.map} +1 -1
- package/dist/{chunk-ZZSVPAXM.js → chunk-YVLEDBN7.js} +4 -4
- package/dist/{chunk-ZZSVPAXM.js.map → chunk-YVLEDBN7.js.map} +1 -1
- package/dist/index.cjs +199 -134
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -2
- package/dist/index.d.ts +13 -2
- package/dist/index.js +112 -47
- package/dist/index.js.map +1 -1
- package/dist/integrations/pino.cjs +4 -4
- package/dist/integrations/pino.js +3 -3
- package/dist/langchain/index.cjs +28 -26
- package/dist/langchain/index.cjs.map +1 -1
- package/dist/langchain/index.d.cts +3 -3
- package/dist/langchain/index.d.ts +3 -3
- package/dist/langchain/index.js +13 -11
- package/dist/langchain/index.js.map +1 -1
- package/dist/langgraph/index.cjs +32 -30
- package/dist/langgraph/index.cjs.map +1 -1
- package/dist/langgraph/index.d.cts +3 -3
- package/dist/langgraph/index.d.ts +3 -3
- package/dist/langgraph/index.js +10 -8
- package/dist/langgraph/index.js.map +1 -1
- package/dist/openai/index.cjs +11 -11
- package/dist/openai/index.js +2 -2
- package/dist/openai-agents/index.cjs +63 -35
- package/dist/openai-agents/index.cjs.map +1 -1
- package/dist/openai-agents/index.d.cts +13 -4
- package/dist/openai-agents/index.d.ts +13 -4
- package/dist/openai-agents/index.js +33 -5
- package/dist/openai-agents/index.js.map +1 -1
- package/dist/{spans-DZtMuBvc.d.cts → spans-CBMWNg2C.d.cts} +1 -0
- package/dist/{spans-DZtMuBvc.d.ts → spans-CBMWNg2C.d.ts} +1 -0
- package/dist/{tracing-J8ZgxVzU.d.ts → tracing-BMWTyexr.d.ts} +1 -1
- package/dist/{tracing-CNlre8TK.d.cts → tracing-Bh-cbvr6.d.cts} +1 -1
- package/dist/vercel-ai/index.cjs +14 -14
- package/dist/vercel-ai/index.js +3 -3
- package/package.json +1 -1
- package/dist/browser/chunk-52JTU4LH.cjs.map +0 -1
- package/dist/browser/chunk-6BNMYEMW.cjs.map +0 -1
- package/dist/browser/chunk-6T6ZPOKZ.js.map +0 -1
- package/dist/browser/chunk-TV7TRP5O.cjs.map +0 -1
- package/dist/browser/chunk-VIOT3AOP.js.map +0 -1
- package/dist/browser/chunk-YYUDZTHI.js.map +0 -1
- package/dist/chunk-3ONFIKKC.js.map +0 -1
- package/dist/chunk-GTPKPUAV.cjs.map +0 -1
- package/dist/chunk-KMBKZLXH.cjs.map +0 -1
- package/dist/chunk-KWOSUW7B.js.map +0 -1
- package/dist/chunk-LPLL2OXI.cjs.map +0 -1
- package/dist/chunk-ZIMGB7IT.js.map +0 -1
package/dist/langchain/index.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkESJJXXB6_cjs = require('../chunk-ESJJXXB6.cjs');
|
|
4
4
|
var chunkHICEJ4LV_cjs = require('../chunk-HICEJ4LV.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunk7DALGJL2_cjs = require('../chunk-7DALGJL2.cjs');
|
|
6
6
|
|
|
7
7
|
// src/langchain/callback-handler.ts
|
|
8
|
-
|
|
8
|
+
chunk7DALGJL2_cjs.init_tracing();
|
|
9
9
|
var ADAPTER = "langchain-js";
|
|
10
10
|
var HANDLER_NAME = "morse_callback_handler";
|
|
11
11
|
var DEFAULT_AGENT_NAME = "langchain-agent";
|
|
@@ -205,7 +205,7 @@ var MorseCallbackHandler = class {
|
|
|
205
205
|
openSpan(runId, name, type, inputData, extraMetadata) {
|
|
206
206
|
if (typeof runId !== "string" || runId.length === 0) return null;
|
|
207
207
|
const metadata = { ...extraMetadata ?? {}, adapter: ADAPTER };
|
|
208
|
-
const handle =
|
|
208
|
+
const handle = chunk7DALGJL2_cjs.startSpan({ name, type, metadata });
|
|
209
209
|
if (handle === null) return null;
|
|
210
210
|
const wrapped = coerceStateValue(inputData);
|
|
211
211
|
if (wrapped !== void 0) handle.span.input_data = wrapped;
|
|
@@ -229,17 +229,18 @@ var MorseCallbackHandler = class {
|
|
|
229
229
|
/* ---------------------------------------------------------------------- */
|
|
230
230
|
/* Chain callbacks */
|
|
231
231
|
/* ---------------------------------------------------------------------- */
|
|
232
|
-
// NOTE: trailing `
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
//
|
|
236
|
-
//
|
|
232
|
+
// NOTE: trailing `runType`/`runName` parameters from
|
|
233
|
+
// `CallbackHandlerSurface` are intentionally omitted below (not just
|
|
234
|
+
// underscore-prefixed) — this adapter doesn't use them, and TypeScript
|
|
235
|
+
// structural typing allows an implementing function to declare fewer
|
|
236
|
+
// parameters than its interface signature. Declaring-then-ignoring
|
|
237
237
|
// trailing unused params trips `@typescript-eslint/no-unused-vars`'s
|
|
238
238
|
// default `args: "after-used"` mode (only params before the last *used*
|
|
239
239
|
// one are exempt); omitting them entirely is both lint-clean and reads
|
|
240
|
-
// as "these truly aren't consulted."
|
|
241
|
-
|
|
242
|
-
|
|
240
|
+
// as "these truly aren't consulted." `metadata` IS consulted as of
|
|
241
|
+
// MHQ-1029, so it and the params before it are declared.
|
|
242
|
+
handleChainStart(chain, inputs, runId, _parentRunId, _tags, metadata) {
|
|
243
|
+
_handleChainStart(this, chain, inputs, runId, metadata);
|
|
243
244
|
}
|
|
244
245
|
handleChainEnd(outputs, runId) {
|
|
245
246
|
_handleChainEnd(this, outputs, runId);
|
|
@@ -302,26 +303,27 @@ var MorseCallbackHandler = class {
|
|
|
302
303
|
return this.spanStack.get(runId);
|
|
303
304
|
}
|
|
304
305
|
};
|
|
305
|
-
var _handleChainStart =
|
|
306
|
-
(self, chain, inputs, runId) => {
|
|
306
|
+
var _handleChainStart = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
307
|
+
(self, chain, inputs, runId, metadata) => {
|
|
307
308
|
const chainName = resolveNameIdFirst(chain, "chain");
|
|
308
309
|
self._openSpan(runId, chainName, "agent", inputs);
|
|
310
|
+
if (metadata) chunk7DALGJL2_cjs.adoptThreadId(metadata.thread_id ?? metadata.threadId);
|
|
309
311
|
},
|
|
310
312
|
{ fingerprint: "morse.langchain.handleChainStart" }
|
|
311
313
|
);
|
|
312
|
-
var _handleChainEnd =
|
|
314
|
+
var _handleChainEnd = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
313
315
|
(self, outputs, runId) => {
|
|
314
316
|
self._closeSpan(runId, outputs);
|
|
315
317
|
},
|
|
316
318
|
{ fingerprint: "morse.langchain.handleChainEnd" }
|
|
317
319
|
);
|
|
318
|
-
var _handleChainError =
|
|
320
|
+
var _handleChainError = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
319
321
|
(self, err, runId) => {
|
|
320
322
|
self._closeSpan(runId, void 0, err ?? new Error("langchain chain error"));
|
|
321
323
|
},
|
|
322
324
|
{ fingerprint: "morse.langchain.handleChainError" }
|
|
323
325
|
);
|
|
324
|
-
var _handleLLMStart =
|
|
326
|
+
var _handleLLMStart = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
325
327
|
(self, llm, prompts, runId, extraParams) => {
|
|
326
328
|
const llmName = resolveNameIdFirst(llm, "llm");
|
|
327
329
|
const invocationParams = extraParams?.invocation_params;
|
|
@@ -354,7 +356,7 @@ function toolsFromExtra(extra) {
|
|
|
354
356
|
const invocationParams = extra?.invocation_params;
|
|
355
357
|
return invocationParams?.tools;
|
|
356
358
|
}
|
|
357
|
-
var _handleChatModelStart =
|
|
359
|
+
var _handleChatModelStart = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
358
360
|
(self, llm, messages, runId, extraParams) => {
|
|
359
361
|
const llmName = resolveNameIdFirst(llm, "llm");
|
|
360
362
|
const invocationParams = extraParams?.invocation_params;
|
|
@@ -369,7 +371,7 @@ var _handleChatModelStart = chunk7HYFOHM3_cjs.absorbErrorsSync(
|
|
|
369
371
|
},
|
|
370
372
|
{ fingerprint: "morse.langchain.handleChatModelStart" }
|
|
371
373
|
);
|
|
372
|
-
var _handleLLMEnd =
|
|
374
|
+
var _handleLLMEnd = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
373
375
|
(self, response, runId) => {
|
|
374
376
|
const handle = self._getSpan(runId);
|
|
375
377
|
const outputText = extractOutputText(response);
|
|
@@ -392,32 +394,32 @@ var _handleLLMEnd = chunk7HYFOHM3_cjs.absorbErrorsSync(
|
|
|
392
394
|
},
|
|
393
395
|
{ fingerprint: "morse.langchain.handleLLMEnd" }
|
|
394
396
|
);
|
|
395
|
-
var _handleLLMError =
|
|
397
|
+
var _handleLLMError = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
396
398
|
(self, err, runId) => {
|
|
397
399
|
self._closeSpan(runId, void 0, err ?? new Error("langchain llm error"));
|
|
398
400
|
},
|
|
399
401
|
{ fingerprint: "morse.langchain.handleLLMError" }
|
|
400
402
|
);
|
|
401
|
-
var _handleToolStart =
|
|
403
|
+
var _handleToolStart = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
402
404
|
(self, tool, input, runId) => {
|
|
403
405
|
const toolName = resolveNameNameFirst(tool, "tool");
|
|
404
406
|
self._openSpan(runId, toolName, "tool", { input });
|
|
405
407
|
},
|
|
406
408
|
{ fingerprint: "morse.langchain.handleToolStart" }
|
|
407
409
|
);
|
|
408
|
-
var _handleToolEnd =
|
|
410
|
+
var _handleToolEnd = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
409
411
|
(self, output, runId) => {
|
|
410
412
|
self._closeSpan(runId, { output: String(output) });
|
|
411
413
|
},
|
|
412
414
|
{ fingerprint: "morse.langchain.handleToolEnd" }
|
|
413
415
|
);
|
|
414
|
-
var _handleToolError =
|
|
416
|
+
var _handleToolError = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
415
417
|
(self, err, runId) => {
|
|
416
418
|
self._closeSpan(runId, void 0, err ?? new Error("langchain tool error"));
|
|
417
419
|
},
|
|
418
420
|
{ fingerprint: "morse.langchain.handleToolError" }
|
|
419
421
|
);
|
|
420
|
-
var _handleRetrieverStart =
|
|
422
|
+
var _handleRetrieverStart = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
421
423
|
(self, retriever, query, runId) => {
|
|
422
424
|
const idPath = retriever?.id;
|
|
423
425
|
const retrieverName = (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : void 0) || "retriever";
|
|
@@ -425,7 +427,7 @@ var _handleRetrieverStart = chunk7HYFOHM3_cjs.absorbErrorsSync(
|
|
|
425
427
|
},
|
|
426
428
|
{ fingerprint: "morse.langchain.handleRetrieverStart" }
|
|
427
429
|
);
|
|
428
|
-
var _handleRetrieverEnd =
|
|
430
|
+
var _handleRetrieverEnd = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
429
431
|
(self, documents, runId) => {
|
|
430
432
|
const docsOut = [];
|
|
431
433
|
for (const doc of documents ?? []) {
|
|
@@ -455,7 +457,7 @@ var _handleRetrieverEnd = chunk7HYFOHM3_cjs.absorbErrorsSync(
|
|
|
455
457
|
},
|
|
456
458
|
{ fingerprint: "morse.langchain.handleRetrieverEnd" }
|
|
457
459
|
);
|
|
458
|
-
var _handleRetrieverError =
|
|
460
|
+
var _handleRetrieverError = chunkESJJXXB6_cjs.absorbErrorsSync(
|
|
459
461
|
(self, err, runId) => {
|
|
460
462
|
self._closeSpan(runId, void 0, err ?? new Error("langchain retriever error"));
|
|
461
463
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/langchain/callback-handler.ts"],"names":["init_tracing","tokenUsage","model","startSpan","absorbErrorsSync","decomposeOpenAiMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/langchain` — `MorseCallbackHandler` for plain LangChain\n * (chains, LLMs, tools, retrievers). Port of\n * `apps/sdk/python/src/morse_ai/adapters/langchain.py` (MHQ-482).\n *\n * Usage:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langchain\";\n * import { runAsync } from \"@morsehq-dev/sdk\"; // or morse.run()\n *\n * const handler = new MorseCallbackHandler({ agentName: \"my-agent\" });\n * await runAsync({ agentName: \"my-agent\" }, async () => {\n * await chain.invoke(input, { callbacks: [handler] });\n * });\n * ```\n *\n * Span mapping (mirrors the Python adapter):\n * - handleChainStart / handleChainEnd / handleChainError → `type=agent`\n * - handleLLMStart / handleChatModelStart / handleLLMEnd / handleLLMError → `type=llm`\n * - handleToolStart / handleToolEnd / handleToolError → `type=tool`\n * - handleRetrieverStart / handleRetrieverEnd / handleRetrieverError (@beta)\n * → `type=retriever`\n *\n * ## Deviations from the Python adapter (see PR report for full rationale)\n *\n * 1. **No auto-trace creation.** Python's `MorseCallbackHandler` calls\n * `morse_ai.tracing.run(...)` itself when no trace is active (contextvars\n * support manually entering/exiting a context across independent callback\n * invocations). The TS SDK's trace context is `AsyncLocalStorage`-based\n * (`_internal/tracing.ts`), which only supports the `als.run(store, fn)`\n * callback shape — there is no way to open a trace and leave it open\n * across separate, unwrapped callback calls. Callers MUST wrap the\n * LangChain invocation in `morse.run()` / `runAsync()`. This mirrors the\n * constraint the existing `../langgraph/` adapter already operates under\n * (see its file-header comments) — every span helper silently no-ops\n * (returns `null`) when there is no active trace, exactly like this file.\n * 2. **No structural subclass relationship with `../langgraph/`.** The task\n * brief notes that Python's `langgraph.py::LangGraphCallbackHandler`\n * subclasses `langchain.py::MorseCallbackHandler`. `@langchain/core`'s\n * `BaseCallbackHandler` surface is identical for plain chains and for\n * LangGraph graphs (LangGraph JS is built on `@langchain/core`\n * callbacks), so structurally the two TS adapters COULD share a base.\n * But the existing `../langgraph/` files are off-limits for this task\n * (a separate, already-shipped gap) and refactoring them to extract a\n * shared base is out of scope / higher risk than the value it buys right\n * now. This adapter is therefore a structural sibling, not a subclass —\n * same conventions (span-emission via `startSpan`, `absorbErrorsSync`\n * everywhere, `metadata.adapter` tagging), independently implemented.\n * 3. **No cost computation.** Python's `on_llm_end` calls\n * `morse_ai.pricing.calculate_cost` and `merge_provider_reported_cost`.\n * Neither has a TS port yet (owned by a separate parallel MHQ-482 gap).\n * Token counts/model are still captured; `cost_usd` is left unset until\n * the pricing gap lands.\n * 4. **`type=retriever` uses a real, added `SpanType` variant** (see\n * `_internal/spans.ts`) rather than the `type=tool` +\n * `metadata.tool_kind` fallback pattern used for `hook`/`subagent` — the\n * backend already accepts `\"retriever\"` (Python's `SpanType.RETRIEVER`\n * has shipped since the Python adapter), so no fallback is needed.\n *\n * All public methods absorb internal errors (never throw into the LangChain\n * runtime) — mirrors Python's `try/except Exception: logger.debug(...)`\n * wrapping on every callback.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { startSpan } from \"../_internal/tracing\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n DocumentLike,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------------ */\n\nconst ADAPTER = \"langchain-js\" as const;\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME = \"langchain-agent\";\n\n// AGE-260 port: cap on the JSON-serialized size of any single input_data /\n// output_data payload. Mirrors the Python adapter's `_MAX_STATE_PAYLOAD_BYTES`.\nconst MAX_STATE_PAYLOAD_BYTES = 64 * 1024; // 64 KB JSON\n\n/* ------------------------------------------------------------------------ */\n/* Public options */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /** Falls back to `\"langchain-agent\"` when unset. Only used for documentation\n * purposes on this handler instance — the actual trace's agent name is set\n * by whatever `morse.run()` / `runAsync()` call wraps the invocation. */\n agentName?: string;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Name resolution helpers */\n/* ------------------------------------------------------------------------ */\n\n/** chain/llm: prefer `id` path tail, then `name`, then `fallback`. */\nfunction resolveNameIdFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n return fallback;\n}\n\n/** tool: prefer `name`, then `id` path tail, then `fallback`. */\nfunction resolveNameNameFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n return fallback;\n}\n\n/* ------------------------------------------------------------------------ */\n/* State coercion — port of Python's `_ensure_dict` */\n/* ------------------------------------------------------------------------ */\n\nfunction utf8ByteLength(s: string): number {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n // Rough fallback — good enough for a soft cap, never load-bearing for\n // correctness (only used to decide whether to truncate).\n return s.length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Coerce arbitrary LangChain chain/tool/retriever input or output into a\n * dict payload the wire schema requires (`SpanData.input_data` /\n * `output_data`). Port of Python's `MorseCallbackHandler._ensure_dict`:\n *\n * - `null` / `undefined` → `undefined` (legitimately absent)\n * - plain object → unchanged\n * - object with a callable `toJSON()` returning a plain object → that result\n * (JS analogue of Python's Pydantic `model_dump()` / `dict()` duck typing)\n * - other (string / number / array / class instance) → `{ value: String(x) }`\n *\n * Oversized payloads (JSON > `MAX_STATE_PAYLOAD_BYTES`) are replaced with a\n * truncation marker so the transport queue stays bounded but the dashboard\n * still shows a usable preview — never silently dropped to `undefined`.\n */\nexport function coerceStateValue(data: unknown): Record<string, unknown> | undefined {\n if (data === null || data === undefined) return undefined;\n\n let coerced: Record<string, unknown>;\n if (isPlainObject(data)) {\n coerced = data;\n } else {\n const toJSON = (data as { toJSON?: unknown }).toJSON;\n let viaToJSON: Record<string, unknown> | null = null;\n if (typeof toJSON === \"function\") {\n try {\n const result: unknown = (toJSON as () => unknown).call(data);\n if (isPlainObject(result)) viaToJSON = result;\n } catch {\n viaToJSON = null;\n }\n }\n if (viaToJSON !== null) {\n coerced = viaToJSON;\n } else if (Array.isArray(data)) {\n coerced = { value: safeStringify(data) };\n } else {\n coerced = { value: String(data) };\n }\n }\n\n let encoded: string;\n try {\n encoded = JSON.stringify(coerced) ?? \"null\";\n } catch {\n return {\n _truncated: true,\n _reason: \"unserializable\",\n value: String(coerced).slice(0, 1024),\n };\n }\n\n const byteLen = utf8ByteLength(encoded);\n if (byteLen > MAX_STATE_PAYLOAD_BYTES) {\n const preview = encoded.slice(0, Math.floor(MAX_STATE_PAYLOAD_BYTES / 2));\n return {\n _truncated: true,\n _reason: \"payload_too_large\",\n _original_size_bytes: byteLen,\n _max_bytes: MAX_STATE_PAYLOAD_BYTES,\n preview,\n };\n }\n\n return coerced;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* LLM response extraction — port of `_extract_token_usage` / `_extract_model` */\n/* ------------------------------------------------------------------------ */\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n}\n\nfunction numOrUndef(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nfunction firstGenerationMessage(\n response: LLMResultLike | null | undefined,\n): BaseMessageLike | undefined {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n return gens[0]![0]!.message;\n }\n return undefined;\n}\n\n/**\n * Returns token usage across the provider shapes LangChain JS integrations\n * use in practice. Field names below are snake_case because — unlike most\n * of the JS ecosystem — `@langchain/core`'s `usage_metadata` /\n * `response_metadata` fields ARE snake_case (verified against\n * `@langchain/core/dist/messages/ai.d.ts`), matching the Python SDK 1:1.\n * `llmOutput` is a free-form provider bag; we also check the camelCase\n * `tokenUsage` key the existing `../langgraph/` adapter established.\n */\nexport function extractTokenUsage(response: LLMResultLike | null | undefined): TokenUsage {\n try {\n const msg = firstGenerationMessage(response);\n if (msg) {\n const um = msg.usage_metadata;\n if (um && (um.input_tokens !== undefined || um.output_tokens !== undefined)) {\n const details = um.input_token_details ?? {};\n const cached = details.cache_read ?? details.cache_creation;\n return {\n inputTokens: numOrUndef(um.input_tokens),\n outputTokens: numOrUndef(um.output_tokens),\n totalTokens: numOrUndef(um.total_tokens),\n cachedInputTokens: numOrUndef(cached),\n };\n }\n const tokenUsage = msg.response_metadata?.token_usage;\n if (tokenUsage) {\n return {\n inputTokens: numOrUndef(tokenUsage.prompt_tokens ?? tokenUsage.input_tokens),\n outputTokens: numOrUndef(tokenUsage.completion_tokens ?? tokenUsage.output_tokens),\n totalTokens: numOrUndef(tokenUsage.total_tokens),\n };\n }\n }\n } catch {\n // fall through to llmOutput-based extraction\n }\n\n const llmOutput = response?.llmOutput ?? {};\n const tokenUsage = (llmOutput.tokenUsage ?? llmOutput.token_usage) as\n | Record<string, unknown>\n | undefined;\n if (tokenUsage && Object.keys(tokenUsage).length > 0) {\n return {\n inputTokens: numOrUndef(\n tokenUsage.promptTokens ??\n tokenUsage.prompt_tokens ??\n tokenUsage.inputTokens ??\n tokenUsage.input_tokens,\n ),\n outputTokens: numOrUndef(\n tokenUsage.completionTokens ??\n tokenUsage.completion_tokens ??\n tokenUsage.outputTokens ??\n tokenUsage.output_tokens,\n ),\n totalTokens: numOrUndef(tokenUsage.totalTokens ?? tokenUsage.total_tokens),\n };\n }\n\n const usage = llmOutput.usage as Record<string, unknown> | undefined;\n if (usage && Object.keys(usage).length > 0) {\n return {\n inputTokens: numOrUndef(usage.input_tokens),\n outputTokens: numOrUndef(usage.output_tokens),\n totalTokens: numOrUndef(usage.total_tokens),\n cachedInputTokens: numOrUndef(usage.cache_read_input_tokens),\n };\n }\n\n return {};\n}\n\n/** Best-effort model-name extraction from an `LLMResult`. */\nexport function extractModel(response: LLMResultLike | null | undefined): string | undefined {\n try {\n const msg = firstGenerationMessage(response);\n const meta = msg?.response_metadata;\n const model = meta?.model_name ?? meta?.model;\n if (typeof model === \"string\" && model.length > 0) return model;\n } catch {\n // fall through\n }\n const llmOutput = response?.llmOutput ?? {};\n const model = llmOutput.model_name ?? llmOutput.model;\n return typeof model === \"string\" && model.length > 0 ? model : undefined;\n}\n\n/** Best-effort output-text extraction from an `LLMResult`, for `output_data.text`. */\nexport function extractOutputText(response: LLMResultLike | null | undefined): string {\n try {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n const first = gens[0]![0]!;\n if (typeof first.text === \"string\" && first.text.length > 0) return first.text;\n const content = first.message?.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((block as Record<string, unknown>).text as string);\n }\n }\n return parts.join(\"\\n\");\n }\n }\n } catch {\n // fall through\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* MorseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangChain's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n public readonly agentName: string;\n\n /** Map of `runId` → open `SpanHandle`, spanning chain/llm/tool/retriever\n * spans together (mirrors Python's single `_span_stack` dict). */\n private readonly spanStack: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.agentName =\n options?.agentName && options.agentName.length > 0 ? options.agentName : DEFAULT_AGENT_NAME;\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal helpers */\n /* ---------------------------------------------------------------------- */\n\n private openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n if (typeof runId !== \"string\" || runId.length === 0) return null;\n const metadata: Record<string, unknown> = { ...(extraMetadata ?? {}), adapter: ADAPTER };\n const handle = startSpan({ name, type, metadata });\n if (handle === null) return null;\n const wrapped = coerceStateValue(inputData);\n if (wrapped !== undefined) handle.span.input_data = wrapped;\n this.spanStack.set(runId, handle);\n return handle;\n }\n\n private closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n const handle = this.spanStack.get(runId);\n if (handle === undefined) return;\n this.spanStack.delete(runId);\n if (outputData !== undefined) {\n const wrapped = coerceStateValue(outputData);\n if (wrapped !== undefined) handle.span.output_data = wrapped;\n }\n if (error !== undefined) {\n handle.end(error);\n } else {\n handle.end();\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Chain callbacks */\n /* ---------------------------------------------------------------------- */\n\n // NOTE: trailing `parentRunId`/`tags`/`metadata`/`runType`/`runName`\n // parameters from `CallbackHandlerSurface` are intentionally omitted below\n // (not just underscore-prefixed) — this adapter doesn't use them, and\n // TypeScript structural typing allows an implementing function to declare\n // fewer parameters than its interface signature. Declaring-then-ignoring\n // trailing unused params trips `@typescript-eslint/no-unused-vars`'s\n // default `args: \"after-used\"` mode (only params before the last *used*\n // one are exempt); omitting them entirely is both lint-clean and reads\n // as \"these truly aren't consulted.\"\n\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n _handleChainStart(this, chain, inputs, runId);\n }\n\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n _handleChainEnd(this, outputs, runId);\n }\n\n handleChainError(err: unknown, runId: string): void {\n _handleChainError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* LLM callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n _handleLLMStart(this, llm, prompts, runId, extraParams);\n }\n\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n // Chat models ARE LLMs — same span type as handleLLMStart (mirrors\n // Python's LangGraph override; the plain-LangChain adapter treats both\n // identically since it has no chat-model-specific behavior to add).\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments — mirrors `../langgraph/`'s\n // handleChatModelStart wiring via the same shared decomposer.\n _handleChatModelStart(this, llm, messages, runId, extraParams);\n }\n\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n _handleLLMEnd(this, output, runId);\n }\n\n handleLLMError(err: unknown, runId: string): void {\n _handleLLMError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Tool callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n _handleToolStart(this, tool, input, runId);\n }\n\n handleToolEnd(output: unknown, runId: string): void {\n _handleToolEnd(this, output, runId);\n }\n\n handleToolError(err: unknown, runId: string): void {\n _handleToolError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Retriever callbacks (@beta — subject to change before SDK v1.0) */\n /* ---------------------------------------------------------------------- */\n\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n _handleRetrieverStart(this, retriever, query, runId);\n }\n\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n _handleRetrieverEnd(this, documents, runId);\n }\n\n handleRetrieverError(err: unknown, runId: string): void {\n _handleRetrieverError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal accessors used by the absorbErrorsSync-wrapped impls */\n /* ---------------------------------------------------------------------- */\n\n /** @internal */\n _openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n return this.openSpan(runId, name, type, inputData, extraMetadata);\n }\n\n /** @internal */\n _closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n this.closeSpan(runId, outputData, error);\n }\n\n /** @internal */\n _getSpan(runId: string): SpanHandle | undefined {\n return this.spanStack.get(runId);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n ): void => {\n const chainName = resolveNameIdFirst(chain, \"chain\");\n self._openSpan(runId, chainName, \"agent\", inputs);\n },\n { fingerprint: \"morse.langchain.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n) => void;\n\nconst _handleChainEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string): void => {\n self._closeSpan(runId, outputs);\n },\n { fingerprint: \"morse.langchain.handleChainEnd\" },\n) as (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string) => void;\n\nconst _handleChainError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain chain error\"));\n },\n { fingerprint: \"morse.langchain.handleChainError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleLLMStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const handle = self._openSpan(\n runId,\n llmName,\n \"llm\",\n prompts && prompts.length > 0 ? { prompts } : undefined,\n );\n if (handle !== null && modelName) {\n handle.span.model = modelName;\n }\n },\n { fingerprint: \"morse.langchain.handleLLMStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\n/**\n * `@langchain/core` passes `handleChatModelStart` a nested\n * `BaseMessage[][]` — one array per \"prompt\" in a batch call. The\n * decomposer expects a flat list, so flatten one level (mirrors\n * `../langgraph/llm-and-tool-callbacks.ts`'s `flattenMessages`, itself a\n * port of Python's `_flatten_messages` in `adapters/langgraph.py`).\n */\nfunction flattenMessages(messages: BaseMessageLike[][] | undefined): BaseMessageLike[] {\n if (!Array.isArray(messages)) return [];\n const flat: BaseMessageLike[] = [];\n for (const item of messages) {\n if (Array.isArray(item)) {\n flat.push(...item);\n } else if (item !== undefined && item !== null) {\n flat.push(item as unknown as BaseMessageLike);\n }\n }\n return flat;\n}\n\n/** Extract the bound `tools` array from `handleChatModelStart`'s `extraParams.invocation_params`. */\nfunction toolsFromExtra(extra: Record<string, unknown> | undefined): unknown {\n const invocationParams = extra?.invocation_params as Record<string, unknown> | undefined;\n return invocationParams?.tools;\n}\n\nconst _handleChatModelStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n const handle = self._openSpan(runId, llmName, \"llm\", undefined);\n if (handle !== null) {\n if (modelName) handle.span.model = modelName;\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n },\n { fingerprint: \"morse.langchain.handleChatModelStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\nconst _handleLLMEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, response: LLMResultLike, runId: string): void => {\n const handle = self._getSpan(runId);\n const outputText = extractOutputText(response);\n\n if (handle !== undefined) {\n const usage = extractTokenUsage(response);\n if (usage.inputTokens !== undefined || usage.outputTokens !== undefined) {\n handle.span.input_tokens = usage.inputTokens;\n handle.span.output_tokens = usage.outputTokens;\n handle.span.total_tokens =\n usage.totalTokens !== undefined\n ? usage.totalTokens\n : (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) || undefined;\n if (usage.cachedInputTokens) {\n handle.span.cached_input_tokens = usage.cachedInputTokens;\n }\n }\n // Response model wins over the invocation-param model set in\n // handleLLMStart — the response carries the fully-resolved version\n // string. Mirrors Python's on_llm_end behavior.\n const resolvedModel = extractModel(response);\n if (resolvedModel) {\n handle.span.model = resolvedModel;\n }\n // NOTE: cost computation (calculate_cost / merge_provider_reported_cost\n // in the Python adapter) intentionally omitted — no TS pricing module\n // exists yet (separate MHQ-482 gap). See file-header deviation notes.\n }\n\n self._closeSpan(runId, { text: outputText });\n },\n { fingerprint: \"morse.langchain.handleLLMEnd\" },\n) as (self: MorseCallbackHandler, response: LLMResultLike, runId: string) => void;\n\nconst _handleLLMError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain llm error\"));\n },\n { fingerprint: \"morse.langchain.handleLLMError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleToolStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n ): void => {\n const toolName = resolveNameNameFirst(tool, \"tool\");\n self._openSpan(runId, toolName, \"tool\", { input });\n },\n { fingerprint: \"morse.langchain.handleToolStart\" },\n) as (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n) => void;\n\nconst _handleToolEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, output: unknown, runId: string): void => {\n self._closeSpan(runId, { output: String(output) });\n },\n { fingerprint: \"morse.langchain.handleToolEnd\" },\n) as (self: MorseCallbackHandler, output: unknown, runId: string) => void;\n\nconst _handleToolError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain tool error\"));\n },\n { fingerprint: \"morse.langchain.handleToolError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleRetrieverStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n ): void => {\n const idPath = retriever?.id;\n const retrieverName =\n (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : undefined) ||\n \"retriever\";\n self._openSpan(runId, String(retrieverName), \"retriever\", { query });\n },\n { fingerprint: \"morse.langchain.handleRetrieverStart\" },\n) as (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n) => void;\n\nconst _handleRetrieverEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, documents: DocumentLike[], runId: string): void => {\n const docsOut: Array<{ content_preview: string; source?: string; score?: number }> = [];\n for (const doc of documents ?? []) {\n if (doc && typeof doc === \"object\" && typeof doc.pageContent === \"string\") {\n const entry: { content_preview: string; source?: string; score?: number } = {\n content_preview: doc.pageContent.slice(0, 200),\n };\n const meta = doc.metadata;\n if (meta) {\n if (typeof meta.source === \"string\") entry.source = meta.source;\n const score = meta.score ?? meta.relevance_score;\n if (typeof score === \"number\") entry.score = score;\n }\n docsOut.push(entry);\n } else if (doc && typeof doc === \"object\") {\n docsOut.push(\n doc as unknown as { content_preview: string; source?: string; score?: number },\n );\n }\n }\n self._closeSpan(runId, {\n docs_count: documents?.length ?? 0,\n top_score: docsOut.length > 0 ? (docsOut[0]?.score ?? null) : null,\n sources: docsOut\n .map((d) => d.source)\n .filter((s): s is string => typeof s === \"string\" && s.length > 0),\n documents: docsOut.slice(0, 10),\n });\n },\n { fingerprint: \"morse.langchain.handleRetrieverEnd\" },\n) as (self: MorseCallbackHandler, documents: DocumentLike[], runId: string) => void;\n\nconst _handleRetrieverError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain retriever error\"));\n },\n { fingerprint: \"morse.langchain.handleRetrieverError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Optional peer-dep: real BaseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nasync function loadLangChainCoreCallbacks(): Promise<LangChainCoreCallbacksModuleLike | null> {\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@langchain/core/callbacks/base` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = (await (Function(\"m\", \"return import(m)\") as any)(\n \"@langchain/core/callbacks/base\",\n )) as LangChainCoreCallbacksModuleLike;\n return mod ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Best-effort: if `@langchain/core/callbacks/base` is installed at runtime,\n * return a `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the duck-typed\n * `MorseCallbackHandler` defined above. Mirrors `../langgraph/callback-handler.ts`'s\n * `getCallbackHandlerClass()`.\n */\nexport async function getCallbackHandlerClass(): Promise<typeof MorseCallbackHandler> {\n const mod = await loadLangChainCoreCallbacks();\n const Base = mod?.BaseCallbackHandler;\n if (!Base) return MorseCallbackHandler;\n\n class MorseCallbackHandlerWithBase extends (Base as unknown as {\n new (...args: unknown[]): object;\n }) {\n public readonly name: string = HANDLER_NAME;\n private readonly _av: MorseCallbackHandler;\n constructor(options?: MorseCallbackHandlerOptions) {\n super();\n this._av = new MorseCallbackHandler(options);\n }\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainStart(chain, inputs, runId);\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainEnd(outputs, runId);\n }\n handleChainError(err: unknown, runId: string): void {\n this._av.handleChainError(err, runId);\n }\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleLLMStart(llm, prompts, runId, parentRunId, extraParams);\n }\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleChatModelStart(llm, messages, runId, parentRunId, extraParams);\n }\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n this._av.handleLLMEnd(output, runId);\n }\n handleLLMError(err: unknown, runId: string): void {\n this._av.handleLLMError(err, runId);\n }\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n this._av.handleToolStart(tool, input, runId);\n }\n handleToolEnd(output: unknown, runId: string): void {\n this._av.handleToolEnd(output, runId);\n }\n handleToolError(err: unknown, runId: string): void {\n this._av.handleToolError(err, runId);\n }\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n this._av.handleRetrieverStart(retriever, query, runId);\n }\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n this._av.handleRetrieverEnd(documents, runId);\n }\n handleRetrieverError(err: unknown, runId: string): void {\n this._av.handleRetrieverError(err, runId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/langchain/callback-handler.ts"],"names":["init_tracing","tokenUsage","model","startSpan","absorbErrorsSync","adoptThreadId","decomposeOpenAiMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/langchain` — `MorseCallbackHandler` for plain LangChain\n * (chains, LLMs, tools, retrievers). Port of\n * `apps/sdk/python/src/morse_ai/adapters/langchain.py` (MHQ-482).\n *\n * Usage:\n *\n * ```ts\n * import { MorseCallbackHandler } from \"@morsehq-dev/sdk/langchain\";\n * import { runAsync } from \"@morsehq-dev/sdk\"; // or morse.run()\n *\n * const handler = new MorseCallbackHandler({ agentName: \"my-agent\" });\n * await runAsync({ agentName: \"my-agent\" }, async () => {\n * await chain.invoke(input, { callbacks: [handler] });\n * });\n * ```\n *\n * Span mapping (mirrors the Python adapter):\n * - handleChainStart / handleChainEnd / handleChainError → `type=agent`\n * - handleLLMStart / handleChatModelStart / handleLLMEnd / handleLLMError → `type=llm`\n * - handleToolStart / handleToolEnd / handleToolError → `type=tool`\n * - handleRetrieverStart / handleRetrieverEnd / handleRetrieverError (@beta)\n * → `type=retriever`\n *\n * ## Deviations from the Python adapter (see PR report for full rationale)\n *\n * 1. **No auto-trace creation.** Python's `MorseCallbackHandler` calls\n * `morse_ai.tracing.run(...)` itself when no trace is active (contextvars\n * support manually entering/exiting a context across independent callback\n * invocations). The TS SDK's trace context is `AsyncLocalStorage`-based\n * (`_internal/tracing.ts`), which only supports the `als.run(store, fn)`\n * callback shape — there is no way to open a trace and leave it open\n * across separate, unwrapped callback calls. Callers MUST wrap the\n * LangChain invocation in `morse.run()` / `runAsync()`. This mirrors the\n * constraint the existing `../langgraph/` adapter already operates under\n * (see its file-header comments) — every span helper silently no-ops\n * (returns `null`) when there is no active trace, exactly like this file.\n * 2. **No structural subclass relationship with `../langgraph/`.** The task\n * brief notes that Python's `langgraph.py::LangGraphCallbackHandler`\n * subclasses `langchain.py::MorseCallbackHandler`. `@langchain/core`'s\n * `BaseCallbackHandler` surface is identical for plain chains and for\n * LangGraph graphs (LangGraph JS is built on `@langchain/core`\n * callbacks), so structurally the two TS adapters COULD share a base.\n * But the existing `../langgraph/` files are off-limits for this task\n * (a separate, already-shipped gap) and refactoring them to extract a\n * shared base is out of scope / higher risk than the value it buys right\n * now. This adapter is therefore a structural sibling, not a subclass —\n * same conventions (span-emission via `startSpan`, `absorbErrorsSync`\n * everywhere, `metadata.adapter` tagging), independently implemented.\n * 3. **No cost computation.** Python's `on_llm_end` calls\n * `morse_ai.pricing.calculate_cost` and `merge_provider_reported_cost`.\n * Neither has a TS port yet (owned by a separate parallel MHQ-482 gap).\n * Token counts/model are still captured; `cost_usd` is left unset until\n * the pricing gap lands.\n * 4. **`type=retriever` uses a real, added `SpanType` variant** (see\n * `_internal/spans.ts`) rather than the `type=tool` +\n * `metadata.tool_kind` fallback pattern used for `hook`/`subagent` — the\n * backend already accepts `\"retriever\"` (Python's `SpanType.RETRIEVER`\n * has shipped since the Python adapter), so no fallback is needed.\n *\n * All public methods absorb internal errors (never throw into the LangChain\n * runtime) — mirrors Python's `try/except Exception: logger.debug(...)`\n * wrapping on every callback.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { adoptThreadId, startSpan } from \"../_internal/tracing\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type {\n BaseMessageLike,\n CallbackHandlerSurface,\n DocumentLike,\n LangChainCoreCallbacksModuleLike,\n LLMResultLike,\n SerializedLike,\n} from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------------ */\n\nconst ADAPTER = \"langchain-js\" as const;\nconst HANDLER_NAME = \"morse_callback_handler\";\nconst DEFAULT_AGENT_NAME = \"langchain-agent\";\n\n// AGE-260 port: cap on the JSON-serialized size of any single input_data /\n// output_data payload. Mirrors the Python adapter's `_MAX_STATE_PAYLOAD_BYTES`.\nconst MAX_STATE_PAYLOAD_BYTES = 64 * 1024; // 64 KB JSON\n\n/* ------------------------------------------------------------------------ */\n/* Public options */\n/* ------------------------------------------------------------------------ */\n\nexport interface MorseCallbackHandlerOptions {\n /** Falls back to `\"langchain-agent\"` when unset. Only used for documentation\n * purposes on this handler instance — the actual trace's agent name is set\n * by whatever `morse.run()` / `runAsync()` call wraps the invocation. */\n agentName?: string;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Name resolution helpers */\n/* ------------------------------------------------------------------------ */\n\n/** chain/llm: prefer `id` path tail, then `name`, then `fallback`. */\nfunction resolveNameIdFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n return fallback;\n}\n\n/** tool: prefer `name`, then `id` path tail, then `fallback`. */\nfunction resolveNameNameFirst(\n serialized: SerializedLike | null | undefined,\n fallback: string,\n): string {\n const s = serialized ?? {};\n if (typeof s.name === \"string\" && s.name.length > 0) return s.name;\n const idPath = s.id;\n if (Array.isArray(idPath) && idPath.length > 0) {\n const last = idPath[idPath.length - 1];\n if (typeof last === \"string\" && last.length > 0) return last;\n }\n return fallback;\n}\n\n/* ------------------------------------------------------------------------ */\n/* State coercion — port of Python's `_ensure_dict` */\n/* ------------------------------------------------------------------------ */\n\nfunction utf8ByteLength(s: string): number {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n // Rough fallback — good enough for a soft cap, never load-bearing for\n // correctness (only used to decide whether to truncate).\n return s.length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Coerce arbitrary LangChain chain/tool/retriever input or output into a\n * dict payload the wire schema requires (`SpanData.input_data` /\n * `output_data`). Port of Python's `MorseCallbackHandler._ensure_dict`:\n *\n * - `null` / `undefined` → `undefined` (legitimately absent)\n * - plain object → unchanged\n * - object with a callable `toJSON()` returning a plain object → that result\n * (JS analogue of Python's Pydantic `model_dump()` / `dict()` duck typing)\n * - other (string / number / array / class instance) → `{ value: String(x) }`\n *\n * Oversized payloads (JSON > `MAX_STATE_PAYLOAD_BYTES`) are replaced with a\n * truncation marker so the transport queue stays bounded but the dashboard\n * still shows a usable preview — never silently dropped to `undefined`.\n */\nexport function coerceStateValue(data: unknown): Record<string, unknown> | undefined {\n if (data === null || data === undefined) return undefined;\n\n let coerced: Record<string, unknown>;\n if (isPlainObject(data)) {\n coerced = data;\n } else {\n const toJSON = (data as { toJSON?: unknown }).toJSON;\n let viaToJSON: Record<string, unknown> | null = null;\n if (typeof toJSON === \"function\") {\n try {\n const result: unknown = (toJSON as () => unknown).call(data);\n if (isPlainObject(result)) viaToJSON = result;\n } catch {\n viaToJSON = null;\n }\n }\n if (viaToJSON !== null) {\n coerced = viaToJSON;\n } else if (Array.isArray(data)) {\n coerced = { value: safeStringify(data) };\n } else {\n coerced = { value: String(data) };\n }\n }\n\n let encoded: string;\n try {\n encoded = JSON.stringify(coerced) ?? \"null\";\n } catch {\n return {\n _truncated: true,\n _reason: \"unserializable\",\n value: String(coerced).slice(0, 1024),\n };\n }\n\n const byteLen = utf8ByteLength(encoded);\n if (byteLen > MAX_STATE_PAYLOAD_BYTES) {\n const preview = encoded.slice(0, Math.floor(MAX_STATE_PAYLOAD_BYTES / 2));\n return {\n _truncated: true,\n _reason: \"payload_too_large\",\n _original_size_bytes: byteLen,\n _max_bytes: MAX_STATE_PAYLOAD_BYTES,\n preview,\n };\n }\n\n return coerced;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* LLM response extraction — port of `_extract_token_usage` / `_extract_model` */\n/* ------------------------------------------------------------------------ */\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n}\n\nfunction numOrUndef(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nfunction firstGenerationMessage(\n response: LLMResultLike | null | undefined,\n): BaseMessageLike | undefined {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n return gens[0]![0]!.message;\n }\n return undefined;\n}\n\n/**\n * Returns token usage across the provider shapes LangChain JS integrations\n * use in practice. Field names below are snake_case because — unlike most\n * of the JS ecosystem — `@langchain/core`'s `usage_metadata` /\n * `response_metadata` fields ARE snake_case (verified against\n * `@langchain/core/dist/messages/ai.d.ts`), matching the Python SDK 1:1.\n * `llmOutput` is a free-form provider bag; we also check the camelCase\n * `tokenUsage` key the existing `../langgraph/` adapter established.\n */\nexport function extractTokenUsage(response: LLMResultLike | null | undefined): TokenUsage {\n try {\n const msg = firstGenerationMessage(response);\n if (msg) {\n const um = msg.usage_metadata;\n if (um && (um.input_tokens !== undefined || um.output_tokens !== undefined)) {\n const details = um.input_token_details ?? {};\n const cached = details.cache_read ?? details.cache_creation;\n return {\n inputTokens: numOrUndef(um.input_tokens),\n outputTokens: numOrUndef(um.output_tokens),\n totalTokens: numOrUndef(um.total_tokens),\n cachedInputTokens: numOrUndef(cached),\n };\n }\n const tokenUsage = msg.response_metadata?.token_usage;\n if (tokenUsage) {\n return {\n inputTokens: numOrUndef(tokenUsage.prompt_tokens ?? tokenUsage.input_tokens),\n outputTokens: numOrUndef(tokenUsage.completion_tokens ?? tokenUsage.output_tokens),\n totalTokens: numOrUndef(tokenUsage.total_tokens),\n };\n }\n }\n } catch {\n // fall through to llmOutput-based extraction\n }\n\n const llmOutput = response?.llmOutput ?? {};\n const tokenUsage = (llmOutput.tokenUsage ?? llmOutput.token_usage) as\n | Record<string, unknown>\n | undefined;\n if (tokenUsage && Object.keys(tokenUsage).length > 0) {\n return {\n inputTokens: numOrUndef(\n tokenUsage.promptTokens ??\n tokenUsage.prompt_tokens ??\n tokenUsage.inputTokens ??\n tokenUsage.input_tokens,\n ),\n outputTokens: numOrUndef(\n tokenUsage.completionTokens ??\n tokenUsage.completion_tokens ??\n tokenUsage.outputTokens ??\n tokenUsage.output_tokens,\n ),\n totalTokens: numOrUndef(tokenUsage.totalTokens ?? tokenUsage.total_tokens),\n };\n }\n\n const usage = llmOutput.usage as Record<string, unknown> | undefined;\n if (usage && Object.keys(usage).length > 0) {\n return {\n inputTokens: numOrUndef(usage.input_tokens),\n outputTokens: numOrUndef(usage.output_tokens),\n totalTokens: numOrUndef(usage.total_tokens),\n cachedInputTokens: numOrUndef(usage.cache_read_input_tokens),\n };\n }\n\n return {};\n}\n\n/** Best-effort model-name extraction from an `LLMResult`. */\nexport function extractModel(response: LLMResultLike | null | undefined): string | undefined {\n try {\n const msg = firstGenerationMessage(response);\n const meta = msg?.response_metadata;\n const model = meta?.model_name ?? meta?.model;\n if (typeof model === \"string\" && model.length > 0) return model;\n } catch {\n // fall through\n }\n const llmOutput = response?.llmOutput ?? {};\n const model = llmOutput.model_name ?? llmOutput.model;\n return typeof model === \"string\" && model.length > 0 ? model : undefined;\n}\n\n/** Best-effort output-text extraction from an `LLMResult`, for `output_data.text`. */\nexport function extractOutputText(response: LLMResultLike | null | undefined): string {\n try {\n const gens = response?.generations;\n if (Array.isArray(gens) && gens.length > 0 && Array.isArray(gens[0]) && gens[0]!.length > 0) {\n const first = gens[0]![0]!;\n if (typeof first.text === \"string\" && first.text.length > 0) return first.text;\n const content = first.message?.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === \"string\") {\n parts.push(block);\n } else if (\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((block as Record<string, unknown>).text as string);\n }\n }\n return parts.join(\"\\n\");\n }\n }\n } catch {\n // fall through\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* MorseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nexport class MorseCallbackHandler implements CallbackHandlerSurface {\n /** Required by LangChain's `BaseCallbackHandler` interface. */\n public readonly name: string = HANDLER_NAME;\n\n public readonly agentName: string;\n\n /** Map of `runId` → open `SpanHandle`, spanning chain/llm/tool/retriever\n * spans together (mirrors Python's single `_span_stack` dict). */\n private readonly spanStack: Map<string, SpanHandle> = new Map();\n\n constructor(options?: MorseCallbackHandlerOptions) {\n this.agentName =\n options?.agentName && options.agentName.length > 0 ? options.agentName : DEFAULT_AGENT_NAME;\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal helpers */\n /* ---------------------------------------------------------------------- */\n\n private openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n if (typeof runId !== \"string\" || runId.length === 0) return null;\n const metadata: Record<string, unknown> = { ...(extraMetadata ?? {}), adapter: ADAPTER };\n const handle = startSpan({ name, type, metadata });\n if (handle === null) return null;\n const wrapped = coerceStateValue(inputData);\n if (wrapped !== undefined) handle.span.input_data = wrapped;\n this.spanStack.set(runId, handle);\n return handle;\n }\n\n private closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n const handle = this.spanStack.get(runId);\n if (handle === undefined) return;\n this.spanStack.delete(runId);\n if (outputData !== undefined) {\n const wrapped = coerceStateValue(outputData);\n if (wrapped !== undefined) handle.span.output_data = wrapped;\n }\n if (error !== undefined) {\n handle.end(error);\n } else {\n handle.end();\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Chain callbacks */\n /* ---------------------------------------------------------------------- */\n\n // NOTE: trailing `runType`/`runName` parameters from\n // `CallbackHandlerSurface` are intentionally omitted below (not just\n // underscore-prefixed) — this adapter doesn't use them, and TypeScript\n // structural typing allows an implementing function to declare fewer\n // parameters than its interface signature. Declaring-then-ignoring\n // trailing unused params trips `@typescript-eslint/no-unused-vars`'s\n // default `args: \"after-used\"` mode (only params before the last *used*\n // one are exempt); omitting them entirely is both lint-clean and reads\n // as \"these truly aren't consulted.\" `metadata` IS consulted as of\n // MHQ-1029, so it and the params before it are declared.\n\n handleChainStart(\n chain: SerializedLike,\n inputs: Record<string, unknown>,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n metadata?: Record<string, unknown>,\n ): void {\n _handleChainStart(this, chain, inputs, runId, metadata);\n }\n\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n _handleChainEnd(this, outputs, runId);\n }\n\n handleChainError(err: unknown, runId: string): void {\n _handleChainError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* LLM callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n _handleLLMStart(this, llm, prompts, runId, extraParams);\n }\n\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n // Chat models ARE LLMs — same span type as handleLLMStart (mirrors\n // Python's LangGraph override; the plain-LangChain adapter treats both\n // identically since it has no chat-model-specific behavior to add).\n // MHQ-750: also decompose the flattened messages (+ bound tools, if\n // any) into context_segments — mirrors `../langgraph/`'s\n // handleChatModelStart wiring via the same shared decomposer.\n _handleChatModelStart(this, llm, messages, runId, extraParams);\n }\n\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n _handleLLMEnd(this, output, runId);\n }\n\n handleLLMError(err: unknown, runId: string): void {\n _handleLLMError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Tool callbacks */\n /* ---------------------------------------------------------------------- */\n\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n _handleToolStart(this, tool, input, runId);\n }\n\n handleToolEnd(output: unknown, runId: string): void {\n _handleToolEnd(this, output, runId);\n }\n\n handleToolError(err: unknown, runId: string): void {\n _handleToolError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Retriever callbacks (@beta — subject to change before SDK v1.0) */\n /* ---------------------------------------------------------------------- */\n\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n _handleRetrieverStart(this, retriever, query, runId);\n }\n\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n _handleRetrieverEnd(this, documents, runId);\n }\n\n handleRetrieverError(err: unknown, runId: string): void {\n _handleRetrieverError(this, err, runId);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Internal accessors used by the absorbErrorsSync-wrapped impls */\n /* ---------------------------------------------------------------------- */\n\n /** @internal */\n _openSpan(\n runId: string,\n name: string,\n type: \"agent\" | \"llm\" | \"tool\" | \"retriever\",\n inputData?: unknown,\n extraMetadata?: Record<string, unknown>,\n ): SpanHandle | null {\n return this.openSpan(runId, name, type, inputData, extraMetadata);\n }\n\n /** @internal */\n _closeSpan(runId: string, outputData?: unknown, error?: unknown): void {\n this.closeSpan(runId, outputData, error);\n }\n\n /** @internal */\n _getSpan(runId: string): SpanHandle | undefined {\n return this.spanStack.get(runId);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Implementation bodies (wrapped in absorbErrorsSync) */\n/* ------------------------------------------------------------------------ */\n\nconst _handleChainStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n metadata?: Record<string, unknown>,\n ): void => {\n const chainName = resolveNameIdFirst(chain, \"chain\");\n self._openSpan(runId, chainName, \"agent\", inputs);\n // MHQ-1029: LangGraph copies `configurable.thread_id` onto the run\n // metadata, which is the only place a checkpointed conversation's\n // identity reaches a callback handler.\n if (metadata) adoptThreadId(metadata.thread_id ?? metadata.threadId);\n },\n { fingerprint: \"morse.langchain.handleChainStart\" },\n) as (\n self: MorseCallbackHandler,\n chain: SerializedLike | null | undefined,\n inputs: Record<string, unknown>,\n runId: string,\n metadata?: Record<string, unknown>,\n) => void;\n\nconst _handleChainEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string): void => {\n self._closeSpan(runId, outputs);\n },\n { fingerprint: \"morse.langchain.handleChainEnd\" },\n) as (self: MorseCallbackHandler, outputs: Record<string, unknown>, runId: string) => void;\n\nconst _handleChainError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain chain error\"));\n },\n { fingerprint: \"morse.langchain.handleChainError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleLLMStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const handle = self._openSpan(\n runId,\n llmName,\n \"llm\",\n prompts && prompts.length > 0 ? { prompts } : undefined,\n );\n if (handle !== null && modelName) {\n handle.span.model = modelName;\n }\n },\n { fingerprint: \"morse.langchain.handleLLMStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n prompts: string[],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\n/**\n * `@langchain/core` passes `handleChatModelStart` a nested\n * `BaseMessage[][]` — one array per \"prompt\" in a batch call. The\n * decomposer expects a flat list, so flatten one level (mirrors\n * `../langgraph/llm-and-tool-callbacks.ts`'s `flattenMessages`, itself a\n * port of Python's `_flatten_messages` in `adapters/langgraph.py`).\n */\nfunction flattenMessages(messages: BaseMessageLike[][] | undefined): BaseMessageLike[] {\n if (!Array.isArray(messages)) return [];\n const flat: BaseMessageLike[] = [];\n for (const item of messages) {\n if (Array.isArray(item)) {\n flat.push(...item);\n } else if (item !== undefined && item !== null) {\n flat.push(item as unknown as BaseMessageLike);\n }\n }\n return flat;\n}\n\n/** Extract the bound `tools` array from `handleChatModelStart`'s `extraParams.invocation_params`. */\nfunction toolsFromExtra(extra: Record<string, unknown> | undefined): unknown {\n const invocationParams = extra?.invocation_params as Record<string, unknown> | undefined;\n return invocationParams?.tools;\n}\n\nconst _handleChatModelStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n ): void => {\n const llmName = resolveNameIdFirst(llm, \"llm\");\n const invocationParams = extraParams?.invocation_params as Record<string, unknown> | undefined;\n const modelName =\n (typeof invocationParams?.model_name === \"string\"\n ? invocationParams.model_name\n : undefined) ??\n (typeof invocationParams?.model === \"string\" ? invocationParams.model : undefined);\n const flatMessages = flattenMessages(messages);\n const contextSegments = decomposeOpenAiMessages(flatMessages, toolsFromExtra(extraParams));\n const handle = self._openSpan(runId, llmName, \"llm\", undefined);\n if (handle !== null) {\n if (modelName) handle.span.model = modelName;\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n },\n { fingerprint: \"morse.langchain.handleChatModelStart\" },\n) as (\n self: MorseCallbackHandler,\n llm: SerializedLike | null | undefined,\n messages: BaseMessageLike[][],\n runId: string,\n extraParams: Record<string, unknown> | undefined,\n) => void;\n\nconst _handleLLMEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, response: LLMResultLike, runId: string): void => {\n const handle = self._getSpan(runId);\n const outputText = extractOutputText(response);\n\n if (handle !== undefined) {\n const usage = extractTokenUsage(response);\n if (usage.inputTokens !== undefined || usage.outputTokens !== undefined) {\n handle.span.input_tokens = usage.inputTokens;\n handle.span.output_tokens = usage.outputTokens;\n handle.span.total_tokens =\n usage.totalTokens !== undefined\n ? usage.totalTokens\n : (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) || undefined;\n if (usage.cachedInputTokens) {\n handle.span.cached_input_tokens = usage.cachedInputTokens;\n }\n }\n // Response model wins over the invocation-param model set in\n // handleLLMStart — the response carries the fully-resolved version\n // string. Mirrors Python's on_llm_end behavior.\n const resolvedModel = extractModel(response);\n if (resolvedModel) {\n handle.span.model = resolvedModel;\n }\n // NOTE: cost computation (calculate_cost / merge_provider_reported_cost\n // in the Python adapter) intentionally omitted — no TS pricing module\n // exists yet (separate MHQ-482 gap). See file-header deviation notes.\n }\n\n self._closeSpan(runId, { text: outputText });\n },\n { fingerprint: \"morse.langchain.handleLLMEnd\" },\n) as (self: MorseCallbackHandler, response: LLMResultLike, runId: string) => void;\n\nconst _handleLLMError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain llm error\"));\n },\n { fingerprint: \"morse.langchain.handleLLMError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleToolStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n ): void => {\n const toolName = resolveNameNameFirst(tool, \"tool\");\n self._openSpan(runId, toolName, \"tool\", { input });\n },\n { fingerprint: \"morse.langchain.handleToolStart\" },\n) as (\n self: MorseCallbackHandler,\n tool: SerializedLike | null | undefined,\n input: string,\n runId: string,\n) => void;\n\nconst _handleToolEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, output: unknown, runId: string): void => {\n self._closeSpan(runId, { output: String(output) });\n },\n { fingerprint: \"morse.langchain.handleToolEnd\" },\n) as (self: MorseCallbackHandler, output: unknown, runId: string) => void;\n\nconst _handleToolError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain tool error\"));\n },\n { fingerprint: \"morse.langchain.handleToolError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\nconst _handleRetrieverStart = absorbErrorsSync(\n (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n ): void => {\n const idPath = retriever?.id;\n const retrieverName =\n (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : undefined) ||\n \"retriever\";\n self._openSpan(runId, String(retrieverName), \"retriever\", { query });\n },\n { fingerprint: \"morse.langchain.handleRetrieverStart\" },\n) as (\n self: MorseCallbackHandler,\n retriever: SerializedLike | null | undefined,\n query: string,\n runId: string,\n) => void;\n\nconst _handleRetrieverEnd = absorbErrorsSync(\n (self: MorseCallbackHandler, documents: DocumentLike[], runId: string): void => {\n const docsOut: Array<{ content_preview: string; source?: string; score?: number }> = [];\n for (const doc of documents ?? []) {\n if (doc && typeof doc === \"object\" && typeof doc.pageContent === \"string\") {\n const entry: { content_preview: string; source?: string; score?: number } = {\n content_preview: doc.pageContent.slice(0, 200),\n };\n const meta = doc.metadata;\n if (meta) {\n if (typeof meta.source === \"string\") entry.source = meta.source;\n const score = meta.score ?? meta.relevance_score;\n if (typeof score === \"number\") entry.score = score;\n }\n docsOut.push(entry);\n } else if (doc && typeof doc === \"object\") {\n docsOut.push(\n doc as unknown as { content_preview: string; source?: string; score?: number },\n );\n }\n }\n self._closeSpan(runId, {\n docs_count: documents?.length ?? 0,\n top_score: docsOut.length > 0 ? (docsOut[0]?.score ?? null) : null,\n sources: docsOut\n .map((d) => d.source)\n .filter((s): s is string => typeof s === \"string\" && s.length > 0),\n documents: docsOut.slice(0, 10),\n });\n },\n { fingerprint: \"morse.langchain.handleRetrieverEnd\" },\n) as (self: MorseCallbackHandler, documents: DocumentLike[], runId: string) => void;\n\nconst _handleRetrieverError = absorbErrorsSync(\n (self: MorseCallbackHandler, err: unknown, runId: string): void => {\n self._closeSpan(runId, undefined, err ?? new Error(\"langchain retriever error\"));\n },\n { fingerprint: \"morse.langchain.handleRetrieverError\" },\n) as (self: MorseCallbackHandler, err: unknown, runId: string) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Optional peer-dep: real BaseCallbackHandler */\n/* ------------------------------------------------------------------------ */\n\nasync function loadLangChainCoreCallbacks(): Promise<LangChainCoreCallbacksModuleLike | null> {\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@langchain/core/callbacks/base` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = (await (Function(\"m\", \"return import(m)\") as any)(\n \"@langchain/core/callbacks/base\",\n )) as LangChainCoreCallbacksModuleLike;\n return mod ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Best-effort: if `@langchain/core/callbacks/base` is installed at runtime,\n * return a `MorseCallbackHandler`-shaped class whose prototype chain\n * includes the real `BaseCallbackHandler` (for users relying on\n * `instanceof BaseCallbackHandler` checks). Otherwise return the duck-typed\n * `MorseCallbackHandler` defined above. Mirrors `../langgraph/callback-handler.ts`'s\n * `getCallbackHandlerClass()`.\n */\nexport async function getCallbackHandlerClass(): Promise<typeof MorseCallbackHandler> {\n const mod = await loadLangChainCoreCallbacks();\n const Base = mod?.BaseCallbackHandler;\n if (!Base) return MorseCallbackHandler;\n\n class MorseCallbackHandlerWithBase extends (Base as unknown as {\n new (...args: unknown[]): object;\n }) {\n public readonly name: string = HANDLER_NAME;\n private readonly _av: MorseCallbackHandler;\n constructor(options?: MorseCallbackHandlerOptions) {\n super();\n this._av = new MorseCallbackHandler(options);\n }\n handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainStart(chain, inputs, runId);\n }\n handleChainEnd(outputs: Record<string, unknown>, runId: string): void {\n this._av.handleChainEnd(outputs, runId);\n }\n handleChainError(err: unknown, runId: string): void {\n this._av.handleChainError(err, runId);\n }\n handleLLMStart(\n llm: SerializedLike,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleLLMStart(llm, prompts, runId, parentRunId, extraParams);\n }\n handleChatModelStart(\n llm: SerializedLike,\n messages: BaseMessageLike[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n ): void {\n this._av.handleChatModelStart(llm, messages, runId, parentRunId, extraParams);\n }\n handleLLMEnd(output: LLMResultLike, runId: string): void {\n this._av.handleLLMEnd(output, runId);\n }\n handleLLMError(err: unknown, runId: string): void {\n this._av.handleLLMError(err, runId);\n }\n handleToolStart(tool: SerializedLike, input: string, runId: string): void {\n this._av.handleToolStart(tool, input, runId);\n }\n handleToolEnd(output: unknown, runId: string): void {\n this._av.handleToolEnd(output, runId);\n }\n handleToolError(err: unknown, runId: string): void {\n this._av.handleToolError(err, runId);\n }\n handleRetrieverStart(retriever: SerializedLike, query: string, runId: string): void {\n this._av.handleRetrieverStart(retriever, query, runId);\n }\n handleRetrieverEnd(documents: DocumentLike[], runId: string): void {\n this._av.handleRetrieverEnd(documents, runId);\n }\n handleRetrieverError(err: unknown, runId: string): void {\n this._av.handleRetrieverError(err, runId);\n }\n }\n return MorseCallbackHandlerWithBase as unknown as typeof MorseCallbackHandler;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as SpanHandle } from '../tracing-
|
|
2
|
-
import '../spans-
|
|
1
|
+
import { S as SpanHandle } from '../tracing-Bh-cbvr6.cjs';
|
|
2
|
+
import '../spans-CBMWNg2C.cjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Structural types for `@langchain/core` (plain LangChain — chains, LLMs,
|
|
@@ -232,7 +232,7 @@ declare class MorseCallbackHandler implements CallbackHandlerSurface {
|
|
|
232
232
|
constructor(options?: MorseCallbackHandlerOptions);
|
|
233
233
|
private openSpan;
|
|
234
234
|
private closeSpan;
|
|
235
|
-
handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void;
|
|
235
|
+
handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string, _parentRunId?: string, _tags?: string[], metadata?: Record<string, unknown>): void;
|
|
236
236
|
handleChainEnd(outputs: Record<string, unknown>, runId: string): void;
|
|
237
237
|
handleChainError(err: unknown, runId: string): void;
|
|
238
238
|
handleLLMStart(llm: SerializedLike, prompts: string[], runId: string, _parentRunId?: string, extraParams?: Record<string, unknown>): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as SpanHandle } from '../tracing-
|
|
2
|
-
import '../spans-
|
|
1
|
+
import { S as SpanHandle } from '../tracing-BMWTyexr.js';
|
|
2
|
+
import '../spans-CBMWNg2C.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Structural types for `@langchain/core` (plain LangChain — chains, LLMs,
|
|
@@ -232,7 +232,7 @@ declare class MorseCallbackHandler implements CallbackHandlerSurface {
|
|
|
232
232
|
constructor(options?: MorseCallbackHandlerOptions);
|
|
233
233
|
private openSpan;
|
|
234
234
|
private closeSpan;
|
|
235
|
-
handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string): void;
|
|
235
|
+
handleChainStart(chain: SerializedLike, inputs: Record<string, unknown>, runId: string, _parentRunId?: string, _tags?: string[], metadata?: Record<string, unknown>): void;
|
|
236
236
|
handleChainEnd(outputs: Record<string, unknown>, runId: string): void;
|
|
237
237
|
handleChainError(err: unknown, runId: string): void;
|
|
238
238
|
handleLLMStart(llm: SerializedLike, prompts: string[], runId: string, _parentRunId?: string, extraParams?: Record<string, unknown>): void;
|
package/dist/langchain/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { absorbErrorsSync } from '../chunk-
|
|
1
|
+
import { absorbErrorsSync } from '../chunk-ERH3TNXZ.js';
|
|
2
2
|
import { decomposeOpenAiMessages } from '../chunk-4JPZV2VZ.js';
|
|
3
|
-
import { init_tracing, startSpan } from '../chunk-
|
|
3
|
+
import { init_tracing, adoptThreadId, startSpan } from '../chunk-HJV35HWL.js';
|
|
4
4
|
|
|
5
5
|
// src/langchain/callback-handler.ts
|
|
6
6
|
init_tracing();
|
|
@@ -227,17 +227,18 @@ var MorseCallbackHandler = class {
|
|
|
227
227
|
/* ---------------------------------------------------------------------- */
|
|
228
228
|
/* Chain callbacks */
|
|
229
229
|
/* ---------------------------------------------------------------------- */
|
|
230
|
-
// NOTE: trailing `
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
230
|
+
// NOTE: trailing `runType`/`runName` parameters from
|
|
231
|
+
// `CallbackHandlerSurface` are intentionally omitted below (not just
|
|
232
|
+
// underscore-prefixed) — this adapter doesn't use them, and TypeScript
|
|
233
|
+
// structural typing allows an implementing function to declare fewer
|
|
234
|
+
// parameters than its interface signature. Declaring-then-ignoring
|
|
235
235
|
// trailing unused params trips `@typescript-eslint/no-unused-vars`'s
|
|
236
236
|
// default `args: "after-used"` mode (only params before the last *used*
|
|
237
237
|
// one are exempt); omitting them entirely is both lint-clean and reads
|
|
238
|
-
// as "these truly aren't consulted."
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
// as "these truly aren't consulted." `metadata` IS consulted as of
|
|
239
|
+
// MHQ-1029, so it and the params before it are declared.
|
|
240
|
+
handleChainStart(chain, inputs, runId, _parentRunId, _tags, metadata) {
|
|
241
|
+
_handleChainStart(this, chain, inputs, runId, metadata);
|
|
241
242
|
}
|
|
242
243
|
handleChainEnd(outputs, runId) {
|
|
243
244
|
_handleChainEnd(this, outputs, runId);
|
|
@@ -301,9 +302,10 @@ var MorseCallbackHandler = class {
|
|
|
301
302
|
}
|
|
302
303
|
};
|
|
303
304
|
var _handleChainStart = absorbErrorsSync(
|
|
304
|
-
(self, chain, inputs, runId) => {
|
|
305
|
+
(self, chain, inputs, runId, metadata) => {
|
|
305
306
|
const chainName = resolveNameIdFirst(chain, "chain");
|
|
306
307
|
self._openSpan(runId, chainName, "agent", inputs);
|
|
308
|
+
if (metadata) adoptThreadId(metadata.thread_id ?? metadata.threadId);
|
|
307
309
|
},
|
|
308
310
|
{ fingerprint: "morse.langchain.handleChainStart" }
|
|
309
311
|
);
|