@langchain/core 1.1.39 → 1.1.41
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/CHANGELOG.md +17 -0
- package/dist/callbacks/base.d.cts.map +1 -1
- package/dist/callbacks/base.d.ts.map +1 -1
- package/dist/callbacks/manager.cjs +12 -0
- package/dist/callbacks/manager.cjs.map +1 -1
- package/dist/callbacks/manager.d.cts +2 -0
- package/dist/callbacks/manager.d.cts.map +1 -1
- package/dist/callbacks/manager.d.ts +2 -0
- package/dist/callbacks/manager.d.ts.map +1 -1
- package/dist/callbacks/manager.js +12 -0
- package/dist/callbacks/manager.js.map +1 -1
- package/dist/language_models/base.cjs +9 -1
- package/dist/language_models/base.cjs.map +1 -1
- package/dist/language_models/base.d.cts +5 -0
- package/dist/language_models/base.d.cts.map +1 -1
- package/dist/language_models/base.d.ts +5 -0
- package/dist/language_models/base.d.ts.map +1 -1
- package/dist/language_models/base.js +9 -1
- package/dist/language_models/base.js.map +1 -1
- package/dist/language_models/chat_models.cjs +18 -6
- package/dist/language_models/chat_models.cjs.map +1 -1
- package/dist/language_models/chat_models.d.cts.map +1 -1
- package/dist/language_models/chat_models.d.ts.map +1 -1
- package/dist/language_models/chat_models.js +18 -6
- package/dist/language_models/chat_models.js.map +1 -1
- package/dist/language_models/llms.cjs +18 -6
- package/dist/language_models/llms.cjs.map +1 -1
- package/dist/language_models/llms.d.cts.map +1 -1
- package/dist/language_models/llms.d.ts.map +1 -1
- package/dist/language_models/llms.js +18 -6
- package/dist/language_models/llms.js.map +1 -1
- package/dist/runnables/config.cjs +16 -8
- package/dist/runnables/config.cjs.map +1 -1
- package/dist/runnables/config.d.cts.map +1 -1
- package/dist/runnables/config.d.ts.map +1 -1
- package/dist/runnables/config.js +16 -8
- package/dist/runnables/config.js.map +1 -1
- package/dist/tracers/tracer_langchain.cjs +70 -2
- package/dist/tracers/tracer_langchain.cjs.map +1 -1
- package/dist/tracers/tracer_langchain.d.cts +26 -1
- package/dist/tracers/tracer_langchain.d.cts.map +1 -1
- package/dist/tracers/tracer_langchain.d.ts +26 -1
- package/dist/tracers/tracer_langchain.d.ts.map +1 -1
- package/dist/tracers/tracer_langchain.js +70 -3
- package/dist/tracers/tracer_langchain.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,8 +2,21 @@ const require_callbacks_manager = require("../callbacks/manager.cjs");
|
|
|
2
2
|
const require_index = require("../singletons/async_local_storage/index.cjs");
|
|
3
3
|
require("../singletons/index.cjs");
|
|
4
4
|
//#region src/runnables/config.ts
|
|
5
|
+
const CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS = new Set(["api_key"]);
|
|
6
|
+
const PRIMITIVES = new Set([
|
|
7
|
+
"string",
|
|
8
|
+
"number",
|
|
9
|
+
"boolean"
|
|
10
|
+
]);
|
|
11
|
+
function _getTracingInheritableMetadataFromConfig(config) {
|
|
12
|
+
const configurable = config.configurable ?? {};
|
|
13
|
+
const metadata = config.metadata ?? {};
|
|
14
|
+
const langSmithMetadata = {};
|
|
15
|
+
for (const [key, value] of Object.entries(configurable)) if (!key.startsWith("__") && !Object.prototype.hasOwnProperty.call(metadata, key) && !CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS.has(key) && PRIMITIVES.has(typeof value)) langSmithMetadata[key] = value;
|
|
16
|
+
return Object.keys(langSmithMetadata).length > 0 ? langSmithMetadata : void 0;
|
|
17
|
+
}
|
|
5
18
|
async function getCallbackManagerForConfig(config) {
|
|
6
|
-
return require_callbacks_manager.CallbackManager._configureSync(config?.callbacks, void 0, config?.tags, void 0, config?.metadata);
|
|
19
|
+
return require_callbacks_manager.CallbackManager._configureSync(config?.callbacks, void 0, config?.tags, void 0, config?.metadata, void 0, { tracerInheritableMetadata: config ? _getTracingInheritableMetadataFromConfig(config) : void 0 });
|
|
7
20
|
}
|
|
8
21
|
function mergeConfigs(...configs) {
|
|
9
22
|
const copy = {};
|
|
@@ -56,11 +69,6 @@ function mergeConfigs(...configs) {
|
|
|
56
69
|
}
|
|
57
70
|
return copy;
|
|
58
71
|
}
|
|
59
|
-
const PRIMITIVES = new Set([
|
|
60
|
-
"string",
|
|
61
|
-
"number",
|
|
62
|
-
"boolean"
|
|
63
|
-
]);
|
|
64
72
|
/**
|
|
65
73
|
* Ensure that a passed config is an object with all required keys present.
|
|
66
74
|
*/
|
|
@@ -84,9 +92,9 @@ function ensureConfig(config) {
|
|
|
84
92
|
return currentConfig;
|
|
85
93
|
}, empty);
|
|
86
94
|
if (empty?.configurable) {
|
|
87
|
-
|
|
95
|
+
if (typeof empty.configurable.model === "string" && empty.metadata?.model === void 0) {
|
|
88
96
|
if (!empty.metadata) empty.metadata = {};
|
|
89
|
-
empty.metadata
|
|
97
|
+
empty.metadata.model = empty.configurable.model;
|
|
90
98
|
}
|
|
91
99
|
}
|
|
92
100
|
if (empty.timeout !== void 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.cjs","names":["CallbackManager","ensureHandler","AsyncLocalStorageProviderSingleton"],"sources":["../../src/runnables/config.ts"],"sourcesContent":["import { CallbackManager, ensureHandler } from \"../callbacks/manager.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport { RunnableConfig } from \"./types.js\";\n\nexport const DEFAULT_RECURSION_LIMIT = 25;\n\nexport { type RunnableConfig };\n\nexport async function getCallbackManagerForConfig(config?: RunnableConfig) {\n return CallbackManager._configureSync(\n config?.callbacks,\n undefined,\n config?.tags,\n undefined,\n config?.metadata\n );\n}\n\nexport function mergeConfigs<CallOptions extends RunnableConfig>(\n ...configs: (CallOptions | RunnableConfig | undefined | null)[]\n): Partial<CallOptions> {\n // We do not want to call ensureConfig on the empty state here as this may cause\n // double loading of callbacks if async local storage is being used.\n const copy: Partial<CallOptions> = {};\n for (const options of configs.filter((c): c is CallOptions => !!c)) {\n for (const key of Object.keys(options)) {\n if (key === \"metadata\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"tags\") {\n const baseKeys: string[] = copy[key] ?? [];\n copy[key] = [...new Set(baseKeys.concat(options[key] ?? []))];\n } else if (key === \"configurable\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"timeout\") {\n if (copy.timeout === undefined) {\n copy.timeout = options.timeout;\n } else if (options.timeout !== undefined) {\n copy.timeout = Math.min(copy.timeout, options.timeout);\n }\n } else if (key === \"signal\") {\n if (copy.signal === undefined) {\n copy.signal = options.signal;\n } else if (options.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n copy.signal = (AbortSignal as any).any([\n copy.signal,\n options.signal,\n ]);\n } else {\n copy.signal = options.signal;\n }\n }\n } else if (key === \"callbacks\") {\n const baseCallbacks = copy.callbacks;\n const providedCallbacks = options.callbacks;\n // callbacks can be either undefined, Array<handler> or manager\n // so merging two callbacks values has 6 cases\n if (Array.isArray(providedCallbacks)) {\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n copy.callbacks = baseCallbacks.concat(providedCallbacks);\n } else {\n // baseCallbacks is a manager\n const manager = baseCallbacks.copy();\n for (const callback of providedCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n }\n } else if (providedCallbacks) {\n // providedCallbacks is a manager\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n const manager = providedCallbacks.copy();\n for (const callback of baseCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n } else {\n // baseCallbacks is also a manager\n copy.callbacks = new CallbackManager(\n providedCallbacks._parentRunId,\n {\n handlers: baseCallbacks.handlers.concat(\n providedCallbacks.handlers\n ),\n inheritableHandlers: baseCallbacks.inheritableHandlers.concat(\n providedCallbacks.inheritableHandlers\n ),\n tags: Array.from(\n new Set(baseCallbacks.tags.concat(providedCallbacks.tags))\n ),\n inheritableTags: Array.from(\n new Set(\n baseCallbacks.inheritableTags.concat(\n providedCallbacks.inheritableTags\n )\n )\n ),\n metadata: {\n ...baseCallbacks.metadata,\n ...providedCallbacks.metadata,\n },\n }\n );\n }\n }\n } else {\n const typedKey = key as keyof CallOptions;\n copy[typedKey] = options[typedKey] ?? copy[typedKey];\n }\n }\n }\n return copy as Partial<CallOptions>;\n}\n\nconst PRIMITIVES = new Set([\"string\", \"number\", \"boolean\"]);\n\n/**\n * Ensure that a passed config is an object with all required keys present.\n */\nexport function ensureConfig<CallOptions extends RunnableConfig>(\n config?: CallOptions\n): CallOptions {\n const implicitConfig = AsyncLocalStorageProviderSingleton.getRunnableConfig();\n let empty: RunnableConfig = {\n tags: [],\n metadata: {},\n recursionLimit: 25,\n runId: undefined,\n };\n if (implicitConfig) {\n // Don't allow runId and runName to be loaded implicitly, as this can cause\n // child runs to improperly inherit their parents' run ids.\n const { runId, runName, ...rest } = implicitConfig;\n empty = Object.entries(rest).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (config) {\n empty = Object.entries(config).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (empty?.configurable) {\n for (const key of Object.keys(empty.configurable)) {\n if (\n PRIMITIVES.has(typeof empty.configurable[key]) &&\n !empty.metadata?.[key]\n ) {\n if (!empty.metadata) {\n empty.metadata = {};\n }\n empty.metadata[key] = empty.configurable[key];\n }\n }\n }\n if (empty.timeout !== undefined) {\n if (empty.timeout <= 0) {\n throw new Error(\"Timeout must be a positive number\");\n }\n const originalTimeoutMs = empty.timeout;\n const timeoutSignal = AbortSignal.timeout(originalTimeoutMs);\n // Preserve the numeric timeout for downstream consumers that need to pass\n // an explicit timeout value to underlying SDKs in addition to an AbortSignal.\n // We store it in metadata to avoid changing the public config shape.\n if (!empty.metadata) {\n empty.metadata = {};\n }\n // Do not overwrite if already set upstream.\n if (empty.metadata.timeoutMs === undefined) {\n empty.metadata.timeoutMs = originalTimeoutMs;\n }\n if (empty.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n empty.signal = (AbortSignal as any).any([empty.signal, timeoutSignal]);\n }\n } else {\n empty.signal = timeoutSignal;\n }\n\n /**\n * We are deleting the timeout key for the following reasons:\n * - Idempotent normalization: ensureConfig may be called multiple times down the stack. If timeout remains,\n * each call would synthesize new timeout signals and combine them, changing the effective timeout unpredictably.\n * - Single enforcement path: downstream code relies on signal to enforce cancellation. Leaving timeout means two\n * competing mechanisms (numeric timeout and signal) can be applied, sometimes with different semantics.\n * - Propagation to children: pickRunnableConfigKeys would keep forwarding timeout to nested runnables, causing\n * repeated re-normalization and stacked timeouts.\n * - Backward compatibility: a lot of components and tests assume ensureConfig removes timeout post-normalization;\n * changing that would be a breaking change.\n */\n delete empty.timeout;\n }\n return empty as CallOptions;\n}\n\n/**\n * Helper function that patches runnable configs with updated properties.\n */\nexport function patchConfig<CallOptions extends RunnableConfig>(\n config: Partial<CallOptions> = {},\n {\n callbacks,\n maxConcurrency,\n recursionLimit,\n runName,\n configurable,\n runId,\n }: RunnableConfig = {}\n): Partial<CallOptions> {\n const newConfig = ensureConfig(config);\n if (callbacks !== undefined) {\n /**\n * If we're replacing callbacks we need to unset runName\n * since that should apply only to the same run as the original callbacks\n */\n delete newConfig.runName;\n newConfig.callbacks = callbacks;\n }\n if (recursionLimit !== undefined) {\n newConfig.recursionLimit = recursionLimit;\n }\n if (maxConcurrency !== undefined) {\n newConfig.maxConcurrency = maxConcurrency;\n }\n if (runName !== undefined) {\n newConfig.runName = runName;\n }\n if (configurable !== undefined) {\n newConfig.configurable = { ...newConfig.configurable, ...configurable };\n }\n if (runId !== undefined) {\n delete newConfig.runId;\n }\n return newConfig;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function pickRunnableConfigKeys<CallOptions extends Record<string, any>>(\n config?: CallOptions\n): Partial<RunnableConfig> | undefined {\n if (!config) return undefined;\n\n return {\n configurable: config.configurable,\n recursionLimit: config.recursionLimit,\n callbacks: config.callbacks,\n tags: config.tags,\n metadata: config.metadata,\n maxConcurrency: config.maxConcurrency,\n timeout: config.timeout,\n signal: config.signal,\n // @ts-expect-error - Store is a LangGraph-specific property\n // which wewant to pass through to all runnables.\n // (eg. tools should have access to writing to the store)\n store: config.store,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.cjs","names":["CallbackManager","ensureHandler","AsyncLocalStorageProviderSingleton"],"sources":["../../src/runnables/config.ts"],"sourcesContent":["import { CallbackManager, ensureHandler } from \"../callbacks/manager.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport { RunnableConfig } from \"./types.js\";\n\nexport const DEFAULT_RECURSION_LIMIT = 25;\n\nexport { type RunnableConfig };\n\nconst CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS = new Set([\"api_key\"]);\nconst PRIMITIVES = new Set([\"string\", \"number\", \"boolean\"]);\n\nexport function _getTracingInheritableMetadataFromConfig(\n config: RunnableConfig\n): Record<string, unknown> | undefined {\n const configurable = config.configurable ?? {};\n const metadata = config.metadata ?? {};\n const langSmithMetadata: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(configurable)) {\n if (\n !key.startsWith(\"__\") &&\n !Object.prototype.hasOwnProperty.call(metadata, key) &&\n !CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS.has(key) &&\n PRIMITIVES.has(typeof value)\n ) {\n langSmithMetadata[key] = value;\n }\n }\n return Object.keys(langSmithMetadata).length > 0\n ? langSmithMetadata\n : undefined;\n}\n\nexport async function getCallbackManagerForConfig(config?: RunnableConfig) {\n return CallbackManager._configureSync(\n config?.callbacks,\n undefined,\n config?.tags,\n undefined,\n config?.metadata,\n undefined,\n {\n tracerInheritableMetadata: config\n ? _getTracingInheritableMetadataFromConfig(config)\n : undefined,\n }\n );\n}\n\nexport function mergeConfigs<CallOptions extends RunnableConfig>(\n ...configs: (CallOptions | RunnableConfig | undefined | null)[]\n): Partial<CallOptions> {\n // We do not want to call ensureConfig on the empty state here as this may cause\n // double loading of callbacks if async local storage is being used.\n const copy: Partial<CallOptions> = {};\n for (const options of configs.filter((c): c is CallOptions => !!c)) {\n for (const key of Object.keys(options)) {\n if (key === \"metadata\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"tags\") {\n const baseKeys: string[] = copy[key] ?? [];\n copy[key] = [...new Set(baseKeys.concat(options[key] ?? []))];\n } else if (key === \"configurable\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"timeout\") {\n if (copy.timeout === undefined) {\n copy.timeout = options.timeout;\n } else if (options.timeout !== undefined) {\n copy.timeout = Math.min(copy.timeout, options.timeout);\n }\n } else if (key === \"signal\") {\n if (copy.signal === undefined) {\n copy.signal = options.signal;\n } else if (options.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n copy.signal = (AbortSignal as any).any([\n copy.signal,\n options.signal,\n ]);\n } else {\n copy.signal = options.signal;\n }\n }\n } else if (key === \"callbacks\") {\n const baseCallbacks = copy.callbacks;\n const providedCallbacks = options.callbacks;\n // callbacks can be either undefined, Array<handler> or manager\n // so merging two callbacks values has 6 cases\n if (Array.isArray(providedCallbacks)) {\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n copy.callbacks = baseCallbacks.concat(providedCallbacks);\n } else {\n // baseCallbacks is a manager\n const manager = baseCallbacks.copy();\n for (const callback of providedCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n }\n } else if (providedCallbacks) {\n // providedCallbacks is a manager\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n const manager = providedCallbacks.copy();\n for (const callback of baseCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n } else {\n // baseCallbacks is also a manager\n copy.callbacks = new CallbackManager(\n providedCallbacks._parentRunId,\n {\n handlers: baseCallbacks.handlers.concat(\n providedCallbacks.handlers\n ),\n inheritableHandlers: baseCallbacks.inheritableHandlers.concat(\n providedCallbacks.inheritableHandlers\n ),\n tags: Array.from(\n new Set(baseCallbacks.tags.concat(providedCallbacks.tags))\n ),\n inheritableTags: Array.from(\n new Set(\n baseCallbacks.inheritableTags.concat(\n providedCallbacks.inheritableTags\n )\n )\n ),\n metadata: {\n ...baseCallbacks.metadata,\n ...providedCallbacks.metadata,\n },\n }\n );\n }\n }\n } else {\n const typedKey = key as keyof CallOptions;\n copy[typedKey] = options[typedKey] ?? copy[typedKey];\n }\n }\n }\n return copy as Partial<CallOptions>;\n}\n\n/**\n * Ensure that a passed config is an object with all required keys present.\n */\nexport function ensureConfig<CallOptions extends RunnableConfig>(\n config?: CallOptions\n): CallOptions {\n const implicitConfig = AsyncLocalStorageProviderSingleton.getRunnableConfig();\n let empty: RunnableConfig = {\n tags: [],\n metadata: {},\n recursionLimit: 25,\n runId: undefined,\n };\n if (implicitConfig) {\n // Don't allow runId and runName to be loaded implicitly, as this can cause\n // child runs to improperly inherit their parents' run ids.\n const { runId, runName, ...rest } = implicitConfig;\n empty = Object.entries(rest).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (config) {\n empty = Object.entries(config).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (empty?.configurable) {\n if (\n typeof empty.configurable.model === \"string\" &&\n empty.metadata?.model === undefined\n ) {\n if (!empty.metadata) {\n empty.metadata = {};\n }\n empty.metadata.model = empty.configurable.model;\n }\n }\n if (empty.timeout !== undefined) {\n if (empty.timeout <= 0) {\n throw new Error(\"Timeout must be a positive number\");\n }\n const originalTimeoutMs = empty.timeout;\n const timeoutSignal = AbortSignal.timeout(originalTimeoutMs);\n // Preserve the numeric timeout for downstream consumers that need to pass\n // an explicit timeout value to underlying SDKs in addition to an AbortSignal.\n // We store it in metadata to avoid changing the public config shape.\n if (!empty.metadata) {\n empty.metadata = {};\n }\n // Do not overwrite if already set upstream.\n if (empty.metadata.timeoutMs === undefined) {\n empty.metadata.timeoutMs = originalTimeoutMs;\n }\n if (empty.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n empty.signal = (AbortSignal as any).any([empty.signal, timeoutSignal]);\n }\n } else {\n empty.signal = timeoutSignal;\n }\n\n /**\n * We are deleting the timeout key for the following reasons:\n * - Idempotent normalization: ensureConfig may be called multiple times down the stack. If timeout remains,\n * each call would synthesize new timeout signals and combine them, changing the effective timeout unpredictably.\n * - Single enforcement path: downstream code relies on signal to enforce cancellation. Leaving timeout means two\n * competing mechanisms (numeric timeout and signal) can be applied, sometimes with different semantics.\n * - Propagation to children: pickRunnableConfigKeys would keep forwarding timeout to nested runnables, causing\n * repeated re-normalization and stacked timeouts.\n * - Backward compatibility: a lot of components and tests assume ensureConfig removes timeout post-normalization;\n * changing that would be a breaking change.\n */\n delete empty.timeout;\n }\n return empty as CallOptions;\n}\n\n/**\n * Helper function that patches runnable configs with updated properties.\n */\nexport function patchConfig<CallOptions extends RunnableConfig>(\n config: Partial<CallOptions> = {},\n {\n callbacks,\n maxConcurrency,\n recursionLimit,\n runName,\n configurable,\n runId,\n }: RunnableConfig = {}\n): Partial<CallOptions> {\n const newConfig = ensureConfig(config);\n if (callbacks !== undefined) {\n /**\n * If we're replacing callbacks we need to unset runName\n * since that should apply only to the same run as the original callbacks\n */\n delete newConfig.runName;\n newConfig.callbacks = callbacks;\n }\n if (recursionLimit !== undefined) {\n newConfig.recursionLimit = recursionLimit;\n }\n if (maxConcurrency !== undefined) {\n newConfig.maxConcurrency = maxConcurrency;\n }\n if (runName !== undefined) {\n newConfig.runName = runName;\n }\n if (configurable !== undefined) {\n newConfig.configurable = { ...newConfig.configurable, ...configurable };\n }\n if (runId !== undefined) {\n delete newConfig.runId;\n }\n return newConfig;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function pickRunnableConfigKeys<CallOptions extends Record<string, any>>(\n config?: CallOptions\n): Partial<RunnableConfig> | undefined {\n if (!config) return undefined;\n\n return {\n configurable: config.configurable,\n recursionLimit: config.recursionLimit,\n callbacks: config.callbacks,\n tags: config.tags,\n metadata: config.metadata,\n maxConcurrency: config.maxConcurrency,\n timeout: config.timeout,\n signal: config.signal,\n // @ts-expect-error - Store is a LangGraph-specific property\n // which wewant to pass through to all runnables.\n // (eg. tools should have access to writing to the store)\n store: config.store,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.cts","names":[],"sources":["../../src/runnables/config.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"config.d.cts","names":[],"sources":["../../src/runnables/config.ts"],"mappings":";;;;iBAgCsB,2BAAA,CAA4B,MAAA,GAAS,cAAA,GAAc,OAAA,CAAA,eAAA;AAAA,iBAgBzD,YAAA,qBAAiC,cAAA,CAAA,CAAA,GAC5C,OAAA,GAAU,WAAA,GAAc,cAAA,yBAC1B,OAAA,CAAQ,WAAA;;;;iBAsGK,YAAA,qBAAiC,cAAA,CAAA,CAC/C,MAAA,GAAS,WAAA,GACR,WAAA;;;;iBA0Fa,WAAA,qBAAgC,cAAA,CAAA,CAC9C,MAAA,GAAQ,OAAA,CAAQ,WAAA;EAEd,SAAA;EACA,cAAA;EACA,cAAA;EACA,OAAA;EACA,YAAA;EACA;AAAA,IACC,cAAA,GACF,OAAA,CAAQ,WAAA;AAAA,iBA6BK,sBAAA,qBAA2C,MAAA,cAAA,CACzD,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,cAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","names":[],"sources":["../../src/runnables/config.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"config.d.ts","names":[],"sources":["../../src/runnables/config.ts"],"mappings":";;;;iBAgCsB,2BAAA,CAA4B,MAAA,GAAS,cAAA,GAAc,OAAA,CAAA,eAAA;AAAA,iBAgBzD,YAAA,qBAAiC,cAAA,CAAA,CAAA,GAC5C,OAAA,GAAU,WAAA,GAAc,cAAA,yBAC1B,OAAA,CAAQ,WAAA;;;;iBAsGK,YAAA,qBAAiC,cAAA,CAAA,CAC/C,MAAA,GAAS,WAAA,GACR,WAAA;;;;iBA0Fa,WAAA,qBAAgC,cAAA,CAAA,CAC9C,MAAA,GAAQ,OAAA,CAAQ,WAAA;EAEd,SAAA;EACA,cAAA;EACA,cAAA;EACA,OAAA;EACA,YAAA;EACA;AAAA,IACC,cAAA,GACF,OAAA,CAAQ,WAAA;AAAA,iBA6BK,sBAAA,qBAA2C,MAAA,cAAA,CACzD,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,cAAA"}
|
package/dist/runnables/config.js
CHANGED
|
@@ -2,8 +2,21 @@ import { CallbackManager, ensureHandler } from "../callbacks/manager.js";
|
|
|
2
2
|
import { AsyncLocalStorageProviderSingleton } from "../singletons/async_local_storage/index.js";
|
|
3
3
|
import "../singletons/index.js";
|
|
4
4
|
//#region src/runnables/config.ts
|
|
5
|
+
const CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS = new Set(["api_key"]);
|
|
6
|
+
const PRIMITIVES = new Set([
|
|
7
|
+
"string",
|
|
8
|
+
"number",
|
|
9
|
+
"boolean"
|
|
10
|
+
]);
|
|
11
|
+
function _getTracingInheritableMetadataFromConfig(config) {
|
|
12
|
+
const configurable = config.configurable ?? {};
|
|
13
|
+
const metadata = config.metadata ?? {};
|
|
14
|
+
const langSmithMetadata = {};
|
|
15
|
+
for (const [key, value] of Object.entries(configurable)) if (!key.startsWith("__") && !Object.prototype.hasOwnProperty.call(metadata, key) && !CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS.has(key) && PRIMITIVES.has(typeof value)) langSmithMetadata[key] = value;
|
|
16
|
+
return Object.keys(langSmithMetadata).length > 0 ? langSmithMetadata : void 0;
|
|
17
|
+
}
|
|
5
18
|
async function getCallbackManagerForConfig(config) {
|
|
6
|
-
return CallbackManager._configureSync(config?.callbacks, void 0, config?.tags, void 0, config?.metadata);
|
|
19
|
+
return CallbackManager._configureSync(config?.callbacks, void 0, config?.tags, void 0, config?.metadata, void 0, { tracerInheritableMetadata: config ? _getTracingInheritableMetadataFromConfig(config) : void 0 });
|
|
7
20
|
}
|
|
8
21
|
function mergeConfigs(...configs) {
|
|
9
22
|
const copy = {};
|
|
@@ -56,11 +69,6 @@ function mergeConfigs(...configs) {
|
|
|
56
69
|
}
|
|
57
70
|
return copy;
|
|
58
71
|
}
|
|
59
|
-
const PRIMITIVES = new Set([
|
|
60
|
-
"string",
|
|
61
|
-
"number",
|
|
62
|
-
"boolean"
|
|
63
|
-
]);
|
|
64
72
|
/**
|
|
65
73
|
* Ensure that a passed config is an object with all required keys present.
|
|
66
74
|
*/
|
|
@@ -84,9 +92,9 @@ function ensureConfig(config) {
|
|
|
84
92
|
return currentConfig;
|
|
85
93
|
}, empty);
|
|
86
94
|
if (empty?.configurable) {
|
|
87
|
-
|
|
95
|
+
if (typeof empty.configurable.model === "string" && empty.metadata?.model === void 0) {
|
|
88
96
|
if (!empty.metadata) empty.metadata = {};
|
|
89
|
-
empty.metadata
|
|
97
|
+
empty.metadata.model = empty.configurable.model;
|
|
90
98
|
}
|
|
91
99
|
}
|
|
92
100
|
if (empty.timeout !== void 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../../src/runnables/config.ts"],"sourcesContent":["import { CallbackManager, ensureHandler } from \"../callbacks/manager.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport { RunnableConfig } from \"./types.js\";\n\nexport const DEFAULT_RECURSION_LIMIT = 25;\n\nexport { type RunnableConfig };\n\nexport async function getCallbackManagerForConfig(config?: RunnableConfig) {\n return CallbackManager._configureSync(\n config?.callbacks,\n undefined,\n config?.tags,\n undefined,\n config?.metadata\n );\n}\n\nexport function mergeConfigs<CallOptions extends RunnableConfig>(\n ...configs: (CallOptions | RunnableConfig | undefined | null)[]\n): Partial<CallOptions> {\n // We do not want to call ensureConfig on the empty state here as this may cause\n // double loading of callbacks if async local storage is being used.\n const copy: Partial<CallOptions> = {};\n for (const options of configs.filter((c): c is CallOptions => !!c)) {\n for (const key of Object.keys(options)) {\n if (key === \"metadata\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"tags\") {\n const baseKeys: string[] = copy[key] ?? [];\n copy[key] = [...new Set(baseKeys.concat(options[key] ?? []))];\n } else if (key === \"configurable\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"timeout\") {\n if (copy.timeout === undefined) {\n copy.timeout = options.timeout;\n } else if (options.timeout !== undefined) {\n copy.timeout = Math.min(copy.timeout, options.timeout);\n }\n } else if (key === \"signal\") {\n if (copy.signal === undefined) {\n copy.signal = options.signal;\n } else if (options.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n copy.signal = (AbortSignal as any).any([\n copy.signal,\n options.signal,\n ]);\n } else {\n copy.signal = options.signal;\n }\n }\n } else if (key === \"callbacks\") {\n const baseCallbacks = copy.callbacks;\n const providedCallbacks = options.callbacks;\n // callbacks can be either undefined, Array<handler> or manager\n // so merging two callbacks values has 6 cases\n if (Array.isArray(providedCallbacks)) {\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n copy.callbacks = baseCallbacks.concat(providedCallbacks);\n } else {\n // baseCallbacks is a manager\n const manager = baseCallbacks.copy();\n for (const callback of providedCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n }\n } else if (providedCallbacks) {\n // providedCallbacks is a manager\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n const manager = providedCallbacks.copy();\n for (const callback of baseCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n } else {\n // baseCallbacks is also a manager\n copy.callbacks = new CallbackManager(\n providedCallbacks._parentRunId,\n {\n handlers: baseCallbacks.handlers.concat(\n providedCallbacks.handlers\n ),\n inheritableHandlers: baseCallbacks.inheritableHandlers.concat(\n providedCallbacks.inheritableHandlers\n ),\n tags: Array.from(\n new Set(baseCallbacks.tags.concat(providedCallbacks.tags))\n ),\n inheritableTags: Array.from(\n new Set(\n baseCallbacks.inheritableTags.concat(\n providedCallbacks.inheritableTags\n )\n )\n ),\n metadata: {\n ...baseCallbacks.metadata,\n ...providedCallbacks.metadata,\n },\n }\n );\n }\n }\n } else {\n const typedKey = key as keyof CallOptions;\n copy[typedKey] = options[typedKey] ?? copy[typedKey];\n }\n }\n }\n return copy as Partial<CallOptions>;\n}\n\nconst PRIMITIVES = new Set([\"string\", \"number\", \"boolean\"]);\n\n/**\n * Ensure that a passed config is an object with all required keys present.\n */\nexport function ensureConfig<CallOptions extends RunnableConfig>(\n config?: CallOptions\n): CallOptions {\n const implicitConfig = AsyncLocalStorageProviderSingleton.getRunnableConfig();\n let empty: RunnableConfig = {\n tags: [],\n metadata: {},\n recursionLimit: 25,\n runId: undefined,\n };\n if (implicitConfig) {\n // Don't allow runId and runName to be loaded implicitly, as this can cause\n // child runs to improperly inherit their parents' run ids.\n const { runId, runName, ...rest } = implicitConfig;\n empty = Object.entries(rest).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (config) {\n empty = Object.entries(config).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (empty?.configurable) {\n for (const key of Object.keys(empty.configurable)) {\n if (\n PRIMITIVES.has(typeof empty.configurable[key]) &&\n !empty.metadata?.[key]\n ) {\n if (!empty.metadata) {\n empty.metadata = {};\n }\n empty.metadata[key] = empty.configurable[key];\n }\n }\n }\n if (empty.timeout !== undefined) {\n if (empty.timeout <= 0) {\n throw new Error(\"Timeout must be a positive number\");\n }\n const originalTimeoutMs = empty.timeout;\n const timeoutSignal = AbortSignal.timeout(originalTimeoutMs);\n // Preserve the numeric timeout for downstream consumers that need to pass\n // an explicit timeout value to underlying SDKs in addition to an AbortSignal.\n // We store it in metadata to avoid changing the public config shape.\n if (!empty.metadata) {\n empty.metadata = {};\n }\n // Do not overwrite if already set upstream.\n if (empty.metadata.timeoutMs === undefined) {\n empty.metadata.timeoutMs = originalTimeoutMs;\n }\n if (empty.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n empty.signal = (AbortSignal as any).any([empty.signal, timeoutSignal]);\n }\n } else {\n empty.signal = timeoutSignal;\n }\n\n /**\n * We are deleting the timeout key for the following reasons:\n * - Idempotent normalization: ensureConfig may be called multiple times down the stack. If timeout remains,\n * each call would synthesize new timeout signals and combine them, changing the effective timeout unpredictably.\n * - Single enforcement path: downstream code relies on signal to enforce cancellation. Leaving timeout means two\n * competing mechanisms (numeric timeout and signal) can be applied, sometimes with different semantics.\n * - Propagation to children: pickRunnableConfigKeys would keep forwarding timeout to nested runnables, causing\n * repeated re-normalization and stacked timeouts.\n * - Backward compatibility: a lot of components and tests assume ensureConfig removes timeout post-normalization;\n * changing that would be a breaking change.\n */\n delete empty.timeout;\n }\n return empty as CallOptions;\n}\n\n/**\n * Helper function that patches runnable configs with updated properties.\n */\nexport function patchConfig<CallOptions extends RunnableConfig>(\n config: Partial<CallOptions> = {},\n {\n callbacks,\n maxConcurrency,\n recursionLimit,\n runName,\n configurable,\n runId,\n }: RunnableConfig = {}\n): Partial<CallOptions> {\n const newConfig = ensureConfig(config);\n if (callbacks !== undefined) {\n /**\n * If we're replacing callbacks we need to unset runName\n * since that should apply only to the same run as the original callbacks\n */\n delete newConfig.runName;\n newConfig.callbacks = callbacks;\n }\n if (recursionLimit !== undefined) {\n newConfig.recursionLimit = recursionLimit;\n }\n if (maxConcurrency !== undefined) {\n newConfig.maxConcurrency = maxConcurrency;\n }\n if (runName !== undefined) {\n newConfig.runName = runName;\n }\n if (configurable !== undefined) {\n newConfig.configurable = { ...newConfig.configurable, ...configurable };\n }\n if (runId !== undefined) {\n delete newConfig.runId;\n }\n return newConfig;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function pickRunnableConfigKeys<CallOptions extends Record<string, any>>(\n config?: CallOptions\n): Partial<RunnableConfig> | undefined {\n if (!config) return undefined;\n\n return {\n configurable: config.configurable,\n recursionLimit: config.recursionLimit,\n callbacks: config.callbacks,\n tags: config.tags,\n metadata: config.metadata,\n maxConcurrency: config.maxConcurrency,\n timeout: config.timeout,\n signal: config.signal,\n // @ts-expect-error - Store is a LangGraph-specific property\n // which wewant to pass through to all runnables.\n // (eg. tools should have access to writing to the store)\n store: config.store,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../src/runnables/config.ts"],"sourcesContent":["import { CallbackManager, ensureHandler } from \"../callbacks/manager.js\";\nimport { AsyncLocalStorageProviderSingleton } from \"../singletons/index.js\";\nimport { RunnableConfig } from \"./types.js\";\n\nexport const DEFAULT_RECURSION_LIMIT = 25;\n\nexport { type RunnableConfig };\n\nconst CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS = new Set([\"api_key\"]);\nconst PRIMITIVES = new Set([\"string\", \"number\", \"boolean\"]);\n\nexport function _getTracingInheritableMetadataFromConfig(\n config: RunnableConfig\n): Record<string, unknown> | undefined {\n const configurable = config.configurable ?? {};\n const metadata = config.metadata ?? {};\n const langSmithMetadata: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(configurable)) {\n if (\n !key.startsWith(\"__\") &&\n !Object.prototype.hasOwnProperty.call(metadata, key) &&\n !CONFIGURABLE_TO_TRACING_METADATA_EXCLUDED_KEYS.has(key) &&\n PRIMITIVES.has(typeof value)\n ) {\n langSmithMetadata[key] = value;\n }\n }\n return Object.keys(langSmithMetadata).length > 0\n ? langSmithMetadata\n : undefined;\n}\n\nexport async function getCallbackManagerForConfig(config?: RunnableConfig) {\n return CallbackManager._configureSync(\n config?.callbacks,\n undefined,\n config?.tags,\n undefined,\n config?.metadata,\n undefined,\n {\n tracerInheritableMetadata: config\n ? _getTracingInheritableMetadataFromConfig(config)\n : undefined,\n }\n );\n}\n\nexport function mergeConfigs<CallOptions extends RunnableConfig>(\n ...configs: (CallOptions | RunnableConfig | undefined | null)[]\n): Partial<CallOptions> {\n // We do not want to call ensureConfig on the empty state here as this may cause\n // double loading of callbacks if async local storage is being used.\n const copy: Partial<CallOptions> = {};\n for (const options of configs.filter((c): c is CallOptions => !!c)) {\n for (const key of Object.keys(options)) {\n if (key === \"metadata\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"tags\") {\n const baseKeys: string[] = copy[key] ?? [];\n copy[key] = [...new Set(baseKeys.concat(options[key] ?? []))];\n } else if (key === \"configurable\") {\n copy[key] = { ...copy[key], ...options[key] };\n } else if (key === \"timeout\") {\n if (copy.timeout === undefined) {\n copy.timeout = options.timeout;\n } else if (options.timeout !== undefined) {\n copy.timeout = Math.min(copy.timeout, options.timeout);\n }\n } else if (key === \"signal\") {\n if (copy.signal === undefined) {\n copy.signal = options.signal;\n } else if (options.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n copy.signal = (AbortSignal as any).any([\n copy.signal,\n options.signal,\n ]);\n } else {\n copy.signal = options.signal;\n }\n }\n } else if (key === \"callbacks\") {\n const baseCallbacks = copy.callbacks;\n const providedCallbacks = options.callbacks;\n // callbacks can be either undefined, Array<handler> or manager\n // so merging two callbacks values has 6 cases\n if (Array.isArray(providedCallbacks)) {\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n copy.callbacks = baseCallbacks.concat(providedCallbacks);\n } else {\n // baseCallbacks is a manager\n const manager = baseCallbacks.copy();\n for (const callback of providedCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n }\n } else if (providedCallbacks) {\n // providedCallbacks is a manager\n if (!baseCallbacks) {\n copy.callbacks = providedCallbacks;\n } else if (Array.isArray(baseCallbacks)) {\n const manager = providedCallbacks.copy();\n for (const callback of baseCallbacks) {\n manager.addHandler(ensureHandler(callback), true);\n }\n copy.callbacks = manager;\n } else {\n // baseCallbacks is also a manager\n copy.callbacks = new CallbackManager(\n providedCallbacks._parentRunId,\n {\n handlers: baseCallbacks.handlers.concat(\n providedCallbacks.handlers\n ),\n inheritableHandlers: baseCallbacks.inheritableHandlers.concat(\n providedCallbacks.inheritableHandlers\n ),\n tags: Array.from(\n new Set(baseCallbacks.tags.concat(providedCallbacks.tags))\n ),\n inheritableTags: Array.from(\n new Set(\n baseCallbacks.inheritableTags.concat(\n providedCallbacks.inheritableTags\n )\n )\n ),\n metadata: {\n ...baseCallbacks.metadata,\n ...providedCallbacks.metadata,\n },\n }\n );\n }\n }\n } else {\n const typedKey = key as keyof CallOptions;\n copy[typedKey] = options[typedKey] ?? copy[typedKey];\n }\n }\n }\n return copy as Partial<CallOptions>;\n}\n\n/**\n * Ensure that a passed config is an object with all required keys present.\n */\nexport function ensureConfig<CallOptions extends RunnableConfig>(\n config?: CallOptions\n): CallOptions {\n const implicitConfig = AsyncLocalStorageProviderSingleton.getRunnableConfig();\n let empty: RunnableConfig = {\n tags: [],\n metadata: {},\n recursionLimit: 25,\n runId: undefined,\n };\n if (implicitConfig) {\n // Don't allow runId and runName to be loaded implicitly, as this can cause\n // child runs to improperly inherit their parents' run ids.\n const { runId, runName, ...rest } = implicitConfig;\n empty = Object.entries(rest).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (config) {\n empty = Object.entries(config).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (currentConfig: Record<string, any>, [key, value]) => {\n if (value !== undefined) {\n currentConfig[key] = value;\n }\n return currentConfig;\n },\n empty\n );\n }\n if (empty?.configurable) {\n if (\n typeof empty.configurable.model === \"string\" &&\n empty.metadata?.model === undefined\n ) {\n if (!empty.metadata) {\n empty.metadata = {};\n }\n empty.metadata.model = empty.configurable.model;\n }\n }\n if (empty.timeout !== undefined) {\n if (empty.timeout <= 0) {\n throw new Error(\"Timeout must be a positive number\");\n }\n const originalTimeoutMs = empty.timeout;\n const timeoutSignal = AbortSignal.timeout(originalTimeoutMs);\n // Preserve the numeric timeout for downstream consumers that need to pass\n // an explicit timeout value to underlying SDKs in addition to an AbortSignal.\n // We store it in metadata to avoid changing the public config shape.\n if (!empty.metadata) {\n empty.metadata = {};\n }\n // Do not overwrite if already set upstream.\n if (empty.metadata.timeoutMs === undefined) {\n empty.metadata.timeoutMs = originalTimeoutMs;\n }\n if (empty.signal !== undefined) {\n if (\"any\" in AbortSignal) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n empty.signal = (AbortSignal as any).any([empty.signal, timeoutSignal]);\n }\n } else {\n empty.signal = timeoutSignal;\n }\n\n /**\n * We are deleting the timeout key for the following reasons:\n * - Idempotent normalization: ensureConfig may be called multiple times down the stack. If timeout remains,\n * each call would synthesize new timeout signals and combine them, changing the effective timeout unpredictably.\n * - Single enforcement path: downstream code relies on signal to enforce cancellation. Leaving timeout means two\n * competing mechanisms (numeric timeout and signal) can be applied, sometimes with different semantics.\n * - Propagation to children: pickRunnableConfigKeys would keep forwarding timeout to nested runnables, causing\n * repeated re-normalization and stacked timeouts.\n * - Backward compatibility: a lot of components and tests assume ensureConfig removes timeout post-normalization;\n * changing that would be a breaking change.\n */\n delete empty.timeout;\n }\n return empty as CallOptions;\n}\n\n/**\n * Helper function that patches runnable configs with updated properties.\n */\nexport function patchConfig<CallOptions extends RunnableConfig>(\n config: Partial<CallOptions> = {},\n {\n callbacks,\n maxConcurrency,\n recursionLimit,\n runName,\n configurable,\n runId,\n }: RunnableConfig = {}\n): Partial<CallOptions> {\n const newConfig = ensureConfig(config);\n if (callbacks !== undefined) {\n /**\n * If we're replacing callbacks we need to unset runName\n * since that should apply only to the same run as the original callbacks\n */\n delete newConfig.runName;\n newConfig.callbacks = callbacks;\n }\n if (recursionLimit !== undefined) {\n newConfig.recursionLimit = recursionLimit;\n }\n if (maxConcurrency !== undefined) {\n newConfig.maxConcurrency = maxConcurrency;\n }\n if (runName !== undefined) {\n newConfig.runName = runName;\n }\n if (configurable !== undefined) {\n newConfig.configurable = { ...newConfig.configurable, ...configurable };\n }\n if (runId !== undefined) {\n delete newConfig.runId;\n }\n return newConfig;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function pickRunnableConfigKeys<CallOptions extends Record<string, any>>(\n config?: CallOptions\n): Partial<RunnableConfig> | undefined {\n if (!config) return undefined;\n\n return {\n configurable: config.configurable,\n recursionLimit: config.recursionLimit,\n callbacks: config.callbacks,\n tags: config.tags,\n metadata: config.metadata,\n maxConcurrency: config.maxConcurrency,\n timeout: config.timeout,\n signal: config.signal,\n // @ts-expect-error - Store is a LangGraph-specific property\n // which wewant to pass through to all runnables.\n // (eg. tools should have access to writing to the store)\n store: config.store,\n };\n}\n"],"mappings":"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"}
|
|
@@ -8,7 +8,22 @@ let langsmith_run_trees = require("langsmith/run_trees");
|
|
|
8
8
|
let langsmith = require("langsmith");
|
|
9
9
|
let langsmith_singletons_traceable = require("langsmith/singletons/traceable");
|
|
10
10
|
//#region src/tracers/tracer_langchain.ts
|
|
11
|
-
var tracer_langchain_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
11
|
+
var tracer_langchain_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
12
|
+
LangChainTracer: () => LangChainTracer,
|
|
13
|
+
OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS: () => OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Keys that should be inherited from `tracerInheritableMetadata` even when
|
|
17
|
+
* the run already has a value for them. This lets nested contexts
|
|
18
|
+
* (e.g. a subagent invoked from inside a parent agent) override a
|
|
19
|
+
* LangSmith-only tracing metadata value that was set by an ancestor.
|
|
20
|
+
*
|
|
21
|
+
* Keep this list very small: every key here loses the default
|
|
22
|
+
* "first wins" protection and is always clobbered by the nearest
|
|
23
|
+
* enclosing tracer config. Only keys that are strictly for LangSmith
|
|
24
|
+
* tracing bookkeeping should be added.
|
|
25
|
+
*/
|
|
26
|
+
const OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS = new Set(["ls_agent_type"]);
|
|
12
27
|
/**
|
|
13
28
|
* Extract usage_metadata from chat generations.
|
|
14
29
|
*
|
|
@@ -27,21 +42,28 @@ var LangChainTracer = class LangChainTracer extends require_tracers_base.BaseTra
|
|
|
27
42
|
client;
|
|
28
43
|
replicas;
|
|
29
44
|
usesRunTreeMap = true;
|
|
45
|
+
tracingMetadata;
|
|
46
|
+
tracingTags = [];
|
|
30
47
|
constructor(fields = {}) {
|
|
31
48
|
super(fields);
|
|
32
|
-
|
|
49
|
+
this.fields = fields;
|
|
50
|
+
const { exampleId, projectName, client, replicas, metadata, tags } = fields;
|
|
33
51
|
this.projectName = projectName ?? (0, langsmith.getDefaultProjectName)();
|
|
34
52
|
this.replicas = replicas;
|
|
35
53
|
this.exampleId = exampleId;
|
|
36
54
|
this.client = client ?? require_tracer.getDefaultLangChainClientSingleton();
|
|
55
|
+
this.tracingMetadata = metadata ? { ...metadata } : void 0;
|
|
56
|
+
this.tracingTags = tags ?? [];
|
|
37
57
|
const traceableTree = LangChainTracer.getTraceableRunTree();
|
|
38
58
|
if (traceableTree) this.updateFromRunTree(traceableTree);
|
|
39
59
|
}
|
|
40
60
|
async persistRun(_run) {}
|
|
41
61
|
async onRunCreate(run) {
|
|
62
|
+
_patchMissingTracingDefaults(this, run);
|
|
42
63
|
if (!run.extra?.lc_defers_inputs) await this.getRunTreeWithTracingConfig(run.id)?.postRun();
|
|
43
64
|
}
|
|
44
65
|
async onRunUpdate(run) {
|
|
66
|
+
_patchMissingTracingDefaults(this, run);
|
|
45
67
|
const runTree = this.getRunTreeWithTracingConfig(run.id);
|
|
46
68
|
if (run.extra?.lc_defers_inputs) await runTree?.postRun();
|
|
47
69
|
else await runTree?.patchRun();
|
|
@@ -58,6 +80,24 @@ var LangChainTracer = class LangChainTracer extends require_tracers_base.BaseTra
|
|
|
58
80
|
}
|
|
59
81
|
}
|
|
60
82
|
}
|
|
83
|
+
copyWithTracingConfig({ metadata, tags }) {
|
|
84
|
+
let mergedMetadata;
|
|
85
|
+
if (metadata === void 0) mergedMetadata = this.tracingMetadata ? { ...this.tracingMetadata } : void 0;
|
|
86
|
+
else if (this.tracingMetadata === void 0) mergedMetadata = { ...metadata };
|
|
87
|
+
else {
|
|
88
|
+
mergedMetadata = { ...this.tracingMetadata };
|
|
89
|
+
for (const [key, value] of Object.entries(metadata)) if (!Object.prototype.hasOwnProperty.call(mergedMetadata, key) || OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS.has(key)) mergedMetadata[key] = value;
|
|
90
|
+
}
|
|
91
|
+
const mergedTags = tags ? Array.from(new Set([...this.tracingTags, ...tags])) : [...this.tracingTags];
|
|
92
|
+
const copied = new LangChainTracer({
|
|
93
|
+
...this.fields,
|
|
94
|
+
metadata: mergedMetadata,
|
|
95
|
+
tags: mergedTags
|
|
96
|
+
});
|
|
97
|
+
copied.runMap = this.runMap;
|
|
98
|
+
copied.runTreeMap = this.runTreeMap;
|
|
99
|
+
return copied;
|
|
100
|
+
}
|
|
61
101
|
getRun(id) {
|
|
62
102
|
return this.runTreeMap.get(id);
|
|
63
103
|
}
|
|
@@ -84,6 +124,13 @@ var LangChainTracer = class LangChainTracer extends require_tracers_base.BaseTra
|
|
|
84
124
|
this.replicas = runTree.replicas ?? this.replicas;
|
|
85
125
|
this.projectName = runTree.project_name ?? this.projectName;
|
|
86
126
|
this.exampleId = runTree.reference_example_id ?? this.exampleId;
|
|
127
|
+
this.fields = {
|
|
128
|
+
...this.fields,
|
|
129
|
+
client: this.client,
|
|
130
|
+
replicas: this.replicas,
|
|
131
|
+
projectName: this.projectName,
|
|
132
|
+
exampleId: this.exampleId
|
|
133
|
+
};
|
|
87
134
|
}
|
|
88
135
|
getRunTreeWithTracingConfig(id) {
|
|
89
136
|
const runTree = this.runTreeMap.get(id);
|
|
@@ -104,9 +151,30 @@ var LangChainTracer = class LangChainTracer extends require_tracers_base.BaseTra
|
|
|
104
151
|
return;
|
|
105
152
|
}
|
|
106
153
|
}
|
|
154
|
+
static [Symbol.hasInstance](instance) {
|
|
155
|
+
if (typeof instance !== "object" || instance === null) return false;
|
|
156
|
+
const candidate = instance;
|
|
157
|
+
return "name" in candidate && candidate.name === "langchain_tracer" && "copyWithTracingConfig" in candidate && typeof candidate.copyWithTracingConfig === "function" && "getRunTreeWithTracingConfig" in candidate && typeof candidate.getRunTreeWithTracingConfig === "function";
|
|
158
|
+
}
|
|
107
159
|
};
|
|
160
|
+
function _patchMissingTracingDefaults(tracer, run) {
|
|
161
|
+
if (tracer.tracingMetadata) {
|
|
162
|
+
run.extra ??= {};
|
|
163
|
+
const metadata = run.extra.metadata ?? {};
|
|
164
|
+
let didPatchMetadata = false;
|
|
165
|
+
for (const [key, value] of Object.entries(tracer.tracingMetadata)) if (!Object.prototype.hasOwnProperty.call(metadata, key) || OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS.has(key)) {
|
|
166
|
+
if (metadata[key] !== value) {
|
|
167
|
+
metadata[key] = value;
|
|
168
|
+
didPatchMetadata = true;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (didPatchMetadata) run.extra.metadata = metadata;
|
|
172
|
+
}
|
|
173
|
+
if (tracer.tracingTags.length > 0) run.tags = Array.from(new Set([...run.tags ?? [], ...tracer.tracingTags]));
|
|
174
|
+
}
|
|
108
175
|
//#endregion
|
|
109
176
|
exports.LangChainTracer = LangChainTracer;
|
|
177
|
+
exports.OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS = OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS;
|
|
110
178
|
Object.defineProperty(exports, "tracer_langchain_exports", {
|
|
111
179
|
enumerable: true,
|
|
112
180
|
get: function() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer_langchain.cjs","names":["AIMessage","mergeUsageMetadata","BaseTracer","getDefaultLangChainClientSingleton","RunTree"],"sources":["../../src/tracers/tracer_langchain.ts"],"sourcesContent":["import {\n type Client,\n type LangSmithTracingClientInterface,\n getDefaultProjectName,\n} from \"langsmith\";\nimport { RunTree, type RunTreeConfig } from \"langsmith/run_trees\";\nimport { getCurrentRunTree } from \"langsmith/singletons/traceable\";\n\nimport {\n BaseRun,\n RunCreate,\n RunUpdate as BaseRunUpdate,\n KVMap,\n} from \"langsmith/schemas\";\nimport { BaseTracer, Run as BaseTracerRun } from \"./base.js\";\nimport { BaseCallbackHandlerInput } from \"../callbacks/base.js\";\nimport { getDefaultLangChainClientSingleton } from \"../singletons/tracer.js\";\nimport { ChatGeneration } from \"../outputs.js\";\nimport { AIMessage } from \"../messages/ai.js\";\nimport { mergeUsageMetadata, UsageMetadata } from \"../messages/metadata.js\";\n\nexport interface Run extends BaseRun {\n id: string;\n child_runs: this[];\n child_execution_order: number;\n dotted_order?: string;\n trace_id?: string;\n}\n\nexport interface RunCreate2 extends RunCreate {\n trace_id?: string;\n dotted_order?: string;\n}\n\nexport interface RunUpdate extends BaseRunUpdate {\n events: BaseRun[\"events\"];\n inputs: KVMap;\n trace_id?: string;\n dotted_order?: string;\n}\n\nexport interface LangChainTracerFields extends BaseCallbackHandlerInput {\n exampleId?: string;\n projectName?: string;\n client?: LangSmithTracingClientInterface;\n replicas?: RunTreeConfig[\"replicas\"];\n}\n\n/**\n * Extract usage_metadata from chat generations.\n *\n * Iterates through generations to find and aggregates all usage_metadata\n * found in chat messages. This is typically present in chat model outputs.\n */\nfunction _getUsageMetadataFromGenerations(\n generations: ChatGeneration[][]\n): UsageMetadata | undefined {\n let output: UsageMetadata | undefined = undefined;\n for (const generationBatch of generations) {\n for (const generation of generationBatch) {\n if (\n AIMessage.isInstance(generation.message) &&\n generation.message.usage_metadata !== undefined\n ) {\n output = mergeUsageMetadata(output, generation.message.usage_metadata);\n }\n }\n }\n return output;\n}\n\nexport class LangChainTracer\n extends BaseTracer\n implements LangChainTracerFields\n{\n name = \"langchain_tracer\";\n\n projectName?: string;\n\n exampleId?: string;\n\n client: LangSmithTracingClientInterface;\n\n replicas?: RunTreeConfig[\"replicas\"];\n\n usesRunTreeMap = true;\n\n constructor(fields: LangChainTracerFields = {}) {\n super(fields);\n const { exampleId, projectName, client, replicas } = fields;\n\n this.projectName = projectName ?? getDefaultProjectName();\n this.replicas = replicas;\n this.exampleId = exampleId;\n this.client = client ?? getDefaultLangChainClientSingleton();\n\n const traceableTree = LangChainTracer.getTraceableRunTree();\n if (traceableTree) {\n this.updateFromRunTree(traceableTree);\n }\n }\n\n protected async persistRun(_run: Run): Promise<void> {\n // empty\n }\n\n async onRunCreate(run: Run): Promise<void> {\n if (!run.extra?.lc_defers_inputs) {\n const runTree = this.getRunTreeWithTracingConfig(run.id);\n await runTree?.postRun();\n }\n }\n\n async onRunUpdate(run: Run): Promise<void> {\n const runTree = this.getRunTreeWithTracingConfig(run.id);\n if (run.extra?.lc_defers_inputs) {\n await runTree?.postRun();\n } else {\n await runTree?.patchRun();\n }\n }\n\n onLLMEnd(run: BaseTracerRun): void {\n // Extract usage_metadata from outputs and store in extra.metadata\n const outputs = run.outputs as\n | { generations?: ChatGeneration[][] }\n | undefined;\n if (outputs?.generations) {\n const usageMetadata = _getUsageMetadataFromGenerations(\n outputs.generations\n );\n if (usageMetadata !== undefined) {\n run.extra = run.extra ?? {};\n const metadata =\n (run.extra.metadata as Record<string, unknown> | undefined) ?? {};\n metadata.usage_metadata = usageMetadata;\n run.extra.metadata = metadata;\n }\n }\n }\n\n getRun(id: string): Run | undefined {\n return this.runTreeMap.get(id);\n }\n\n updateFromRunTree(runTree: RunTree) {\n this.runTreeMap.set(runTree.id, runTree);\n let rootRun: RunTree = runTree;\n const visited = new Set<string>();\n while (rootRun.parent_run) {\n if (visited.has(rootRun.id)) break;\n visited.add(rootRun.id);\n\n if (!rootRun.parent_run) break;\n rootRun = rootRun.parent_run as RunTree;\n }\n visited.clear();\n\n const queue = [rootRun];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || visited.has(current.id)) continue;\n visited.add(current.id);\n\n this.runTreeMap.set(current.id, current);\n if (current.child_runs) {\n queue.push(...current.child_runs);\n }\n }\n\n this.client = runTree.client ?? this.client;\n this.replicas = runTree.replicas ?? this.replicas;\n this.projectName = runTree.project_name ?? this.projectName;\n this.exampleId = runTree.reference_example_id ?? this.exampleId;\n }\n\n getRunTreeWithTracingConfig(id: string): RunTree | undefined {\n const runTree = this.runTreeMap.get(id);\n if (!runTree) return undefined;\n\n return new RunTree({\n ...runTree,\n client: this.client as Client,\n project_name: this.projectName,\n replicas: this.replicas,\n reference_example_id: this.exampleId,\n tracingEnabled: true,\n });\n }\n\n static getTraceableRunTree(): RunTree | undefined {\n try {\n return (\n // The type cast here provides forward compatibility. Old versions of LangSmith will just\n // ignore the permitAbsentRunTree arg.\n (\n getCurrentRunTree as (\n permitAbsentRunTree: boolean\n ) => ReturnType<typeof getCurrentRunTree> | undefined\n )(true)\n );\n } catch {\n return undefined;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAsDA,SAAS,iCACP,aAC2B;CAC3B,IAAI,SAAoC,KAAA;AACxC,MAAK,MAAM,mBAAmB,YAC5B,MAAK,MAAM,cAAc,gBACvB,KACEA,WAAAA,UAAU,WAAW,WAAW,QAAQ,IACxC,WAAW,QAAQ,mBAAmB,KAAA,EAEtC,UAASC,iBAAAA,mBAAmB,QAAQ,WAAW,QAAQ,eAAe;AAI5E,QAAO;;AAGT,IAAa,kBAAb,MAAa,wBACHC,qBAAAA,WAEV;CACE,OAAO;CAEP;CAEA;CAEA;CAEA;CAEA,iBAAiB;CAEjB,YAAY,SAAgC,EAAE,EAAE;AAC9C,QAAM,OAAO;EACb,MAAM,EAAE,WAAW,aAAa,QAAQ,aAAa;AAErD,OAAK,cAAc,gBAAA,GAAA,UAAA,wBAAsC;AACzD,OAAK,WAAW;AAChB,OAAK,YAAY;AACjB,OAAK,SAAS,UAAUC,eAAAA,oCAAoC;EAE5D,MAAM,gBAAgB,gBAAgB,qBAAqB;AAC3D,MAAI,cACF,MAAK,kBAAkB,cAAc;;CAIzC,MAAgB,WAAW,MAA0B;CAIrD,MAAM,YAAY,KAAyB;AACzC,MAAI,CAAC,IAAI,OAAO,iBAEd,OADgB,KAAK,4BAA4B,IAAI,GAAG,EACzC,SAAS;;CAI5B,MAAM,YAAY,KAAyB;EACzC,MAAM,UAAU,KAAK,4BAA4B,IAAI,GAAG;AACxD,MAAI,IAAI,OAAO,iBACb,OAAM,SAAS,SAAS;MAExB,OAAM,SAAS,UAAU;;CAI7B,SAAS,KAA0B;EAEjC,MAAM,UAAU,IAAI;AAGpB,MAAI,SAAS,aAAa;GACxB,MAAM,gBAAgB,iCACpB,QAAQ,YACT;AACD,OAAI,kBAAkB,KAAA,GAAW;AAC/B,QAAI,QAAQ,IAAI,SAAS,EAAE;IAC3B,MAAM,WACH,IAAI,MAAM,YAAoD,EAAE;AACnE,aAAS,iBAAiB;AAC1B,QAAI,MAAM,WAAW;;;;CAK3B,OAAO,IAA6B;AAClC,SAAO,KAAK,WAAW,IAAI,GAAG;;CAGhC,kBAAkB,SAAkB;AAClC,OAAK,WAAW,IAAI,QAAQ,IAAI,QAAQ;EACxC,IAAI,UAAmB;EACvB,MAAM,0BAAU,IAAI,KAAa;AACjC,SAAO,QAAQ,YAAY;AACzB,OAAI,QAAQ,IAAI,QAAQ,GAAG,CAAE;AAC7B,WAAQ,IAAI,QAAQ,GAAG;AAEvB,OAAI,CAAC,QAAQ,WAAY;AACzB,aAAU,QAAQ;;AAEpB,UAAQ,OAAO;EAEf,MAAM,QAAQ,CAAC,QAAQ;AACvB,SAAO,MAAM,SAAS,GAAG;GACvB,MAAM,UAAU,MAAM,OAAO;AAC7B,OAAI,CAAC,WAAW,QAAQ,IAAI,QAAQ,GAAG,CAAE;AACzC,WAAQ,IAAI,QAAQ,GAAG;AAEvB,QAAK,WAAW,IAAI,QAAQ,IAAI,QAAQ;AACxC,OAAI,QAAQ,WACV,OAAM,KAAK,GAAG,QAAQ,WAAW;;AAIrC,OAAK,SAAS,QAAQ,UAAU,KAAK;AACrC,OAAK,WAAW,QAAQ,YAAY,KAAK;AACzC,OAAK,cAAc,QAAQ,gBAAgB,KAAK;AAChD,OAAK,YAAY,QAAQ,wBAAwB,KAAK;;CAGxD,4BAA4B,IAAiC;EAC3D,MAAM,UAAU,KAAK,WAAW,IAAI,GAAG;AACvC,MAAI,CAAC,QAAS,QAAO,KAAA;AAErB,SAAO,IAAIC,oBAAAA,QAAQ;GACjB,GAAG;GACH,QAAQ,KAAK;GACb,cAAc,KAAK;GACnB,UAAU,KAAK;GACf,sBAAsB,KAAK;GAC3B,gBAAgB;GACjB,CAAC;;CAGJ,OAAO,sBAA2C;AAChD,MAAI;AACF,WAAA,GAAA,+BAAA,mBAOI,KAAK;UAEH;AACN"}
|
|
1
|
+
{"version":3,"file":"tracer_langchain.cjs","names":["AIMessage","mergeUsageMetadata","BaseTracer","getDefaultLangChainClientSingleton","RunTree"],"sources":["../../src/tracers/tracer_langchain.ts"],"sourcesContent":["import {\n type Client,\n type LangSmithTracingClientInterface,\n getDefaultProjectName,\n} from \"langsmith\";\nimport { RunTree, type RunTreeConfig } from \"langsmith/run_trees\";\nimport { getCurrentRunTree } from \"langsmith/singletons/traceable\";\n\nimport {\n BaseRun,\n RunCreate,\n RunUpdate as BaseRunUpdate,\n KVMap,\n} from \"langsmith/schemas\";\nimport { BaseTracer, Run as BaseTracerRun } from \"./base.js\";\nimport { BaseCallbackHandlerInput } from \"../callbacks/base.js\";\nimport { getDefaultLangChainClientSingleton } from \"../singletons/tracer.js\";\nimport { ChatGeneration } from \"../outputs.js\";\nimport { AIMessage } from \"../messages/ai.js\";\nimport { mergeUsageMetadata, UsageMetadata } from \"../messages/metadata.js\";\n\nexport interface Run extends BaseRun {\n id: string;\n child_runs: this[];\n child_execution_order: number;\n dotted_order?: string;\n trace_id?: string;\n}\n\nexport interface RunCreate2 extends RunCreate {\n trace_id?: string;\n dotted_order?: string;\n}\n\nexport interface RunUpdate extends BaseRunUpdate {\n events: BaseRun[\"events\"];\n inputs: KVMap;\n trace_id?: string;\n dotted_order?: string;\n}\n\nexport interface LangChainTracerFields extends BaseCallbackHandlerInput {\n exampleId?: string;\n projectName?: string;\n client?: LangSmithTracingClientInterface;\n replicas?: RunTreeConfig[\"replicas\"];\n metadata?: Record<string, unknown>;\n tags?: string[];\n}\n\n/**\n * Keys that should be inherited from `tracerInheritableMetadata` even when\n * the run already has a value for them. This lets nested contexts\n * (e.g. a subagent invoked from inside a parent agent) override a\n * LangSmith-only tracing metadata value that was set by an ancestor.\n *\n * Keep this list very small: every key here loses the default\n * \"first wins\" protection and is always clobbered by the nearest\n * enclosing tracer config. Only keys that are strictly for LangSmith\n * tracing bookkeeping should be added.\n */\nexport const OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS = new Set<string>([\n \"ls_agent_type\",\n]);\n\n/**\n * Extract usage_metadata from chat generations.\n *\n * Iterates through generations to find and aggregates all usage_metadata\n * found in chat messages. This is typically present in chat model outputs.\n */\nfunction _getUsageMetadataFromGenerations(\n generations: ChatGeneration[][]\n): UsageMetadata | undefined {\n let output: UsageMetadata | undefined = undefined;\n for (const generationBatch of generations) {\n for (const generation of generationBatch) {\n if (\n AIMessage.isInstance(generation.message) &&\n generation.message.usage_metadata !== undefined\n ) {\n output = mergeUsageMetadata(output, generation.message.usage_metadata);\n }\n }\n }\n return output;\n}\n\nexport class LangChainTracer\n extends BaseTracer\n implements LangChainTracerFields\n{\n name = \"langchain_tracer\";\n\n projectName?: string;\n\n exampleId?: string;\n\n client: LangSmithTracingClientInterface;\n\n replicas?: RunTreeConfig[\"replicas\"];\n\n usesRunTreeMap = true;\n\n tracingMetadata?: Record<string, unknown>;\n\n tracingTags: string[] = [];\n\n constructor(protected fields: LangChainTracerFields = {}) {\n super(fields);\n const { exampleId, projectName, client, replicas, metadata, tags } = fields;\n\n this.projectName = projectName ?? getDefaultProjectName();\n this.replicas = replicas;\n this.exampleId = exampleId;\n this.client = client ?? getDefaultLangChainClientSingleton();\n this.tracingMetadata = metadata ? { ...metadata } : undefined;\n this.tracingTags = tags ?? [];\n\n const traceableTree = LangChainTracer.getTraceableRunTree();\n if (traceableTree) {\n this.updateFromRunTree(traceableTree);\n }\n }\n\n protected async persistRun(_run: Run): Promise<void> {\n // empty\n }\n\n async onRunCreate(run: Run): Promise<void> {\n _patchMissingTracingDefaults(this, run);\n if (!run.extra?.lc_defers_inputs) {\n const runTree = this.getRunTreeWithTracingConfig(run.id);\n await runTree?.postRun();\n }\n }\n\n async onRunUpdate(run: Run): Promise<void> {\n _patchMissingTracingDefaults(this, run);\n const runTree = this.getRunTreeWithTracingConfig(run.id);\n if (run.extra?.lc_defers_inputs) {\n await runTree?.postRun();\n } else {\n await runTree?.patchRun();\n }\n }\n\n onLLMEnd(run: BaseTracerRun): void {\n // Extract usage_metadata from outputs and store in extra.metadata\n const outputs = run.outputs as\n | { generations?: ChatGeneration[][] }\n | undefined;\n if (outputs?.generations) {\n const usageMetadata = _getUsageMetadataFromGenerations(\n outputs.generations\n );\n if (usageMetadata !== undefined) {\n run.extra = run.extra ?? {};\n const metadata =\n (run.extra.metadata as Record<string, unknown> | undefined) ?? {};\n metadata.usage_metadata = usageMetadata;\n run.extra.metadata = metadata;\n }\n }\n }\n\n copyWithTracingConfig({\n metadata,\n tags,\n }: {\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): LangChainTracer {\n let mergedMetadata: Record<string, unknown> | undefined;\n if (metadata === undefined) {\n mergedMetadata = this.tracingMetadata\n ? { ...this.tracingMetadata }\n : undefined;\n } else if (this.tracingMetadata === undefined) {\n mergedMetadata = { ...metadata };\n } else {\n mergedMetadata = { ...this.tracingMetadata };\n for (const [key, value] of Object.entries(metadata)) {\n // For allowlisted LangSmith-only inheritable metadata keys (e.g.\n // `ls_agent_type`), nested callers are allowed to OVERRIDE the\n // value inherited from an ancestor. For all other keys we keep\n // the existing \"first wins\" behavior so that ancestor-provided\n // tracing metadata is not accidentally clobbered by child runs.\n if (\n !Object.prototype.hasOwnProperty.call(mergedMetadata, key) ||\n OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS.has(key)\n ) {\n mergedMetadata[key] = value;\n }\n }\n }\n\n const mergedTags = tags\n ? Array.from(new Set([...this.tracingTags, ...tags]))\n : [...this.tracingTags];\n\n const copied = new LangChainTracer({\n ...this.fields,\n metadata: mergedMetadata,\n tags: mergedTags,\n });\n copied.runMap = this.runMap;\n copied.runTreeMap = this.runTreeMap;\n return copied;\n }\n\n getRun(id: string): Run | undefined {\n return this.runTreeMap.get(id);\n }\n\n updateFromRunTree(runTree: RunTree) {\n this.runTreeMap.set(runTree.id, runTree);\n let rootRun: RunTree = runTree;\n const visited = new Set<string>();\n while (rootRun.parent_run) {\n if (visited.has(rootRun.id)) break;\n visited.add(rootRun.id);\n\n if (!rootRun.parent_run) break;\n rootRun = rootRun.parent_run as RunTree;\n }\n visited.clear();\n\n const queue = [rootRun];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || visited.has(current.id)) continue;\n visited.add(current.id);\n\n this.runTreeMap.set(current.id, current);\n if (current.child_runs) {\n queue.push(...current.child_runs);\n }\n }\n\n this.client = runTree.client ?? this.client;\n this.replicas = runTree.replicas ?? this.replicas;\n this.projectName = runTree.project_name ?? this.projectName;\n this.exampleId = runTree.reference_example_id ?? this.exampleId;\n this.fields = {\n ...this.fields,\n client: this.client,\n replicas: this.replicas,\n projectName: this.projectName,\n exampleId: this.exampleId,\n };\n }\n\n getRunTreeWithTracingConfig(id: string): RunTree | undefined {\n const runTree = this.runTreeMap.get(id);\n if (!runTree) return undefined;\n\n return new RunTree({\n ...runTree,\n client: this.client as Client,\n project_name: this.projectName,\n replicas: this.replicas,\n reference_example_id: this.exampleId,\n tracingEnabled: true,\n });\n }\n\n static getTraceableRunTree(): RunTree | undefined {\n try {\n return (\n // The type cast here provides forward compatibility. Old versions of LangSmith will just\n // ignore the permitAbsentRunTree arg.\n (\n getCurrentRunTree as (\n permitAbsentRunTree: boolean\n ) => ReturnType<typeof getCurrentRunTree> | undefined\n )(true)\n );\n } catch {\n return undefined;\n }\n }\n\n static [Symbol.hasInstance](instance: unknown): boolean {\n if (typeof instance !== \"object\" || instance === null) {\n return false;\n }\n const candidate = instance as Record<string, unknown>;\n return (\n \"name\" in candidate &&\n candidate.name === \"langchain_tracer\" &&\n \"copyWithTracingConfig\" in candidate &&\n typeof candidate.copyWithTracingConfig === \"function\" &&\n \"getRunTreeWithTracingConfig\" in candidate &&\n typeof candidate.getRunTreeWithTracingConfig === \"function\"\n );\n }\n}\n\nfunction _patchMissingTracingDefaults(tracer: LangChainTracer, run: Run): void {\n if (tracer.tracingMetadata) {\n run.extra ??= {};\n const metadata: Record<string, unknown> =\n (run.extra.metadata as Record<string, unknown> | undefined) ?? {};\n let didPatchMetadata = false;\n for (const [key, value] of Object.entries(tracer.tracingMetadata)) {\n // `OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS` are a small, LangSmith-only\n // allowlist that bypasses the \"first wins\" merge so a nested caller\n // (e.g. a subagent) can override a parent-set value.\n if (\n !Object.prototype.hasOwnProperty.call(metadata, key) ||\n OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS.has(key)\n ) {\n if (metadata[key] !== value) {\n metadata[key] = value;\n didPatchMetadata = true;\n }\n }\n }\n if (didPatchMetadata) {\n run.extra.metadata = metadata;\n }\n }\n\n if (tracer.tracingTags.length > 0) {\n run.tags = Array.from(\n new Set([...(run.tags ?? []), ...tracer.tracingTags])\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -27,24 +27,49 @@ interface LangChainTracerFields extends BaseCallbackHandlerInput {
|
|
|
27
27
|
projectName?: string;
|
|
28
28
|
client?: LangSmithTracingClientInterface;
|
|
29
29
|
replicas?: RunTreeConfig["replicas"];
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
tags?: string[];
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Keys that should be inherited from `tracerInheritableMetadata` even when
|
|
35
|
+
* the run already has a value for them. This lets nested contexts
|
|
36
|
+
* (e.g. a subagent invoked from inside a parent agent) override a
|
|
37
|
+
* LangSmith-only tracing metadata value that was set by an ancestor.
|
|
38
|
+
*
|
|
39
|
+
* Keep this list very small: every key here loses the default
|
|
40
|
+
* "first wins" protection and is always clobbered by the nearest
|
|
41
|
+
* enclosing tracer config. Only keys that are strictly for LangSmith
|
|
42
|
+
* tracing bookkeeping should be added.
|
|
43
|
+
*/
|
|
44
|
+
declare const OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS: Set<string>;
|
|
31
45
|
declare class LangChainTracer extends BaseTracer implements LangChainTracerFields {
|
|
46
|
+
protected fields: LangChainTracerFields;
|
|
32
47
|
name: string;
|
|
33
48
|
projectName?: string;
|
|
34
49
|
exampleId?: string;
|
|
35
50
|
client: LangSmithTracingClientInterface;
|
|
36
51
|
replicas?: RunTreeConfig["replicas"];
|
|
37
52
|
usesRunTreeMap: boolean;
|
|
53
|
+
tracingMetadata?: Record<string, unknown>;
|
|
54
|
+
tracingTags: string[];
|
|
38
55
|
constructor(fields?: LangChainTracerFields);
|
|
39
56
|
protected persistRun(_run: Run): Promise<void>;
|
|
40
57
|
onRunCreate(run: Run): Promise<void>;
|
|
41
58
|
onRunUpdate(run: Run): Promise<void>;
|
|
42
59
|
onLLMEnd(run: Run$2): void;
|
|
60
|
+
copyWithTracingConfig({
|
|
61
|
+
metadata,
|
|
62
|
+
tags
|
|
63
|
+
}: {
|
|
64
|
+
metadata?: Record<string, unknown>;
|
|
65
|
+
tags?: string[];
|
|
66
|
+
}): LangChainTracer;
|
|
43
67
|
getRun(id: string): Run | undefined;
|
|
44
68
|
updateFromRunTree(runTree: RunTree): void;
|
|
45
69
|
getRunTreeWithTracingConfig(id: string): RunTree | undefined;
|
|
46
70
|
static getTraceableRunTree(): RunTree | undefined;
|
|
71
|
+
static [Symbol.hasInstance](instance: unknown): boolean;
|
|
47
72
|
}
|
|
48
73
|
//#endregion
|
|
49
|
-
export { LangChainTracer, LangChainTracerFields, Run, RunCreate2, RunUpdate };
|
|
74
|
+
export { LangChainTracer, LangChainTracerFields, OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS, Run, RunCreate2, RunUpdate };
|
|
50
75
|
//# sourceMappingURL=tracer_langchain.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer_langchain.d.cts","names":[],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;;UAqBiB,GAAA,SAAY,OAAA;EAC3B,EAAA;EACA,UAAA;EACA,qBAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,UAGe,UAAA,SAAmB,SAAA;EAClC,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,WAAA;EACjC,MAAA,EAAQ,OAAA;EACR,MAAA,EAAQ,KAAA;EACR,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,wBAAA;EAC7C,SAAA;EACA,WAAA;EACA,MAAA,GAAS,+BAAA;EACT,QAAA,GAAW,aAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"tracer_langchain.d.cts","names":[],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;;UAqBiB,GAAA,SAAY,OAAA;EAC3B,EAAA;EACA,UAAA;EACA,qBAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,UAGe,UAAA,SAAmB,SAAA;EAClC,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,WAAA;EACjC,MAAA,EAAQ,OAAA;EACR,MAAA,EAAQ,KAAA;EACR,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,wBAAA;EAC7C,SAAA;EACA,WAAA;EACA,MAAA,GAAS,+BAAA;EACT,QAAA,GAAW,aAAA;EACX,QAAA,GAAW,MAAA;EACX,IAAA;AAAA;;;;;;;;;;;;cAcW,+CAAA,EAA+C,GAAA;AAAA,cA2B/C,eAAA,SACH,UAAA,YACG,qBAAA;EAAA,UAkBW,MAAA,EAAQ,qBAAA;EAhB9B,IAAA;EAEA,WAAA;EAEA,SAAA;EAEA,MAAA,EAAQ,+BAAA;EAER,QAAA,GAAW,aAAA;EAEX,cAAA;EAEA,eAAA,GAAkB,MAAA;EAElB,WAAA;EAEA,WAAA,CAAsB,MAAA,GAAQ,qBAAA;EAAA,UAiBd,UAAA,CAAW,IAAA,EAAM,GAAA,GAAM,OAAA;EAIjC,WAAA,CAAY,GAAA,EAAK,GAAA,GAAM,OAAA;EAQvB,WAAA,CAAY,GAAA,EAAK,GAAA,GAAM,OAAA;EAU7B,QAAA,CAAS,GAAA,EAAK,KAAA;EAmBd,qBAAA,CAAA;IACE,QAAA;IACA;EAAA;IAEA,QAAA,GAAW,MAAA;IACX,IAAA;EAAA,IACE,eAAA;EAuCJ,MAAA,CAAO,EAAA,WAAa,GAAA;EAIpB,iBAAA,CAAkB,OAAA,EAAS,OAAA;EAsC3B,2BAAA,CAA4B,EAAA,WAAa,OAAA;EAAA,OAclC,mBAAA,CAAA,GAAuB,OAAA;EAAA,QAgBtB,MAAA,CAAO,WAAA,EAAa,QAAA;AAAA"}
|
|
@@ -27,24 +27,49 @@ interface LangChainTracerFields extends BaseCallbackHandlerInput {
|
|
|
27
27
|
projectName?: string;
|
|
28
28
|
client?: LangSmithTracingClientInterface;
|
|
29
29
|
replicas?: RunTreeConfig["replicas"];
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
tags?: string[];
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Keys that should be inherited from `tracerInheritableMetadata` even when
|
|
35
|
+
* the run already has a value for them. This lets nested contexts
|
|
36
|
+
* (e.g. a subagent invoked from inside a parent agent) override a
|
|
37
|
+
* LangSmith-only tracing metadata value that was set by an ancestor.
|
|
38
|
+
*
|
|
39
|
+
* Keep this list very small: every key here loses the default
|
|
40
|
+
* "first wins" protection and is always clobbered by the nearest
|
|
41
|
+
* enclosing tracer config. Only keys that are strictly for LangSmith
|
|
42
|
+
* tracing bookkeeping should be added.
|
|
43
|
+
*/
|
|
44
|
+
declare const OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS: Set<string>;
|
|
31
45
|
declare class LangChainTracer extends BaseTracer implements LangChainTracerFields {
|
|
46
|
+
protected fields: LangChainTracerFields;
|
|
32
47
|
name: string;
|
|
33
48
|
projectName?: string;
|
|
34
49
|
exampleId?: string;
|
|
35
50
|
client: LangSmithTracingClientInterface;
|
|
36
51
|
replicas?: RunTreeConfig["replicas"];
|
|
37
52
|
usesRunTreeMap: boolean;
|
|
53
|
+
tracingMetadata?: Record<string, unknown>;
|
|
54
|
+
tracingTags: string[];
|
|
38
55
|
constructor(fields?: LangChainTracerFields);
|
|
39
56
|
protected persistRun(_run: Run): Promise<void>;
|
|
40
57
|
onRunCreate(run: Run): Promise<void>;
|
|
41
58
|
onRunUpdate(run: Run): Promise<void>;
|
|
42
59
|
onLLMEnd(run: Run$2): void;
|
|
60
|
+
copyWithTracingConfig({
|
|
61
|
+
metadata,
|
|
62
|
+
tags
|
|
63
|
+
}: {
|
|
64
|
+
metadata?: Record<string, unknown>;
|
|
65
|
+
tags?: string[];
|
|
66
|
+
}): LangChainTracer;
|
|
43
67
|
getRun(id: string): Run | undefined;
|
|
44
68
|
updateFromRunTree(runTree: RunTree): void;
|
|
45
69
|
getRunTreeWithTracingConfig(id: string): RunTree | undefined;
|
|
46
70
|
static getTraceableRunTree(): RunTree | undefined;
|
|
71
|
+
static [Symbol.hasInstance](instance: unknown): boolean;
|
|
47
72
|
}
|
|
48
73
|
//#endregion
|
|
49
|
-
export { LangChainTracer, LangChainTracerFields, Run, RunCreate2, RunUpdate };
|
|
74
|
+
export { LangChainTracer, LangChainTracerFields, OVERRIDABLE_LANGSMITH_INHERITABLE_METADATA_KEYS, Run, RunCreate2, RunUpdate };
|
|
50
75
|
//# sourceMappingURL=tracer_langchain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer_langchain.d.ts","names":[],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;;UAqBiB,GAAA,SAAY,OAAA;EAC3B,EAAA;EACA,UAAA;EACA,qBAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,UAGe,UAAA,SAAmB,SAAA;EAClC,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,WAAA;EACjC,MAAA,EAAQ,OAAA;EACR,MAAA,EAAQ,KAAA;EACR,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,wBAAA;EAC7C,SAAA;EACA,WAAA;EACA,MAAA,GAAS,+BAAA;EACT,QAAA,GAAW,aAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"tracer_langchain.d.ts","names":[],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;;UAqBiB,GAAA,SAAY,OAAA;EAC3B,EAAA;EACA,UAAA;EACA,qBAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,UAGe,UAAA,SAAmB,SAAA;EAClC,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,WAAA;EACjC,MAAA,EAAQ,OAAA;EACR,MAAA,EAAQ,KAAA;EACR,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,wBAAA;EAC7C,SAAA;EACA,WAAA;EACA,MAAA,GAAS,+BAAA;EACT,QAAA,GAAW,aAAA;EACX,QAAA,GAAW,MAAA;EACX,IAAA;AAAA;;;;;;;;;;;;cAcW,+CAAA,EAA+C,GAAA;AAAA,cA2B/C,eAAA,SACH,UAAA,YACG,qBAAA;EAAA,UAkBW,MAAA,EAAQ,qBAAA;EAhB9B,IAAA;EAEA,WAAA;EAEA,SAAA;EAEA,MAAA,EAAQ,+BAAA;EAER,QAAA,GAAW,aAAA;EAEX,cAAA;EAEA,eAAA,GAAkB,MAAA;EAElB,WAAA;EAEA,WAAA,CAAsB,MAAA,GAAQ,qBAAA;EAAA,UAiBd,UAAA,CAAW,IAAA,EAAM,GAAA,GAAM,OAAA;EAIjC,WAAA,CAAY,GAAA,EAAK,GAAA,GAAM,OAAA;EAQvB,WAAA,CAAY,GAAA,EAAK,GAAA,GAAM,OAAA;EAU7B,QAAA,CAAS,GAAA,EAAK,KAAA;EAmBd,qBAAA,CAAA;IACE,QAAA;IACA;EAAA;IAEA,QAAA,GAAW,MAAA;IACX,IAAA;EAAA,IACE,eAAA;EAuCJ,MAAA,CAAO,EAAA,WAAa,GAAA;EAIpB,iBAAA,CAAkB,OAAA,EAAS,OAAA;EAsC3B,2BAAA,CAA4B,EAAA,WAAa,OAAA;EAAA,OAclC,mBAAA,CAAA,GAAuB,OAAA;EAAA,QAgBtB,MAAA,CAAO,WAAA,EAAa,QAAA;AAAA"}
|