@langchain/core 1.2.17 → 1.2.19
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 +21 -0
- package/dist/language_models/base.cjs +1 -1
- package/dist/language_models/base.js +1 -1
- package/dist/language_models/event.cjs.map +1 -1
- package/dist/language_models/event.d.cts +27 -2
- package/dist/language_models/event.d.cts.map +1 -1
- package/dist/language_models/event.d.ts +27 -2
- package/dist/language_models/event.d.ts.map +1 -1
- package/dist/language_models/event.js.map +1 -1
- package/dist/language_models/stream.cjs +8 -1
- package/dist/language_models/stream.cjs.map +1 -1
- package/dist/language_models/stream.d.cts.map +1 -1
- package/dist/language_models/stream.d.ts.map +1 -1
- package/dist/language_models/stream.js +8 -1
- package/dist/language_models/stream.js.map +1 -1
- package/dist/messages/ai.cjs +41 -13
- package/dist/messages/ai.cjs.map +1 -1
- package/dist/messages/ai.d.cts +6 -0
- package/dist/messages/ai.d.cts.map +1 -1
- package/dist/messages/ai.d.ts +6 -0
- package/dist/messages/ai.d.ts.map +1 -1
- package/dist/messages/ai.js +41 -13
- package/dist/messages/ai.js.map +1 -1
- package/dist/tracers/tracer_langchain.cjs +15 -6
- package/dist/tracers/tracer_langchain.cjs.map +1 -1
- package/dist/tracers/tracer_langchain.d.cts +3 -1
- package/dist/tracers/tracer_langchain.d.cts.map +1 -1
- package/dist/tracers/tracer_langchain.d.ts +3 -1
- package/dist/tracers/tracer_langchain.d.ts.map +1 -1
- package/dist/tracers/tracer_langchain.js +15 -6
- package/dist/tracers/tracer_langchain.js.map +1 -1
- package/package.json +2 -2
|
@@ -5,7 +5,6 @@ const require_ai = require("../messages/ai.cjs");
|
|
|
5
5
|
const require_tracers_base = require("./base.cjs");
|
|
6
6
|
const require_tracer = require("../singletons/tracer.cjs");
|
|
7
7
|
let langsmith_run_trees = require("langsmith/run_trees");
|
|
8
|
-
let langsmith = require("langsmith");
|
|
9
8
|
let langsmith_singletons_traceable = require("langsmith/singletons/traceable");
|
|
10
9
|
//#region src/tracers/tracer_langchain.ts
|
|
11
10
|
var tracer_langchain_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
@@ -39,6 +38,7 @@ var LangChainTracer = class LangChainTracer extends require_tracers_base.BaseTra
|
|
|
39
38
|
fields;
|
|
40
39
|
name = "langchain_tracer";
|
|
41
40
|
projectName;
|
|
41
|
+
address;
|
|
42
42
|
exampleId;
|
|
43
43
|
client;
|
|
44
44
|
replicas;
|
|
@@ -48,8 +48,9 @@ var LangChainTracer = class LangChainTracer extends require_tracers_base.BaseTra
|
|
|
48
48
|
constructor(fields = {}) {
|
|
49
49
|
super(fields);
|
|
50
50
|
this.fields = fields;
|
|
51
|
-
const { exampleId, projectName, client, replicas, metadata, tags } = fields;
|
|
52
|
-
this.projectName = projectName
|
|
51
|
+
const { exampleId, projectName, address, client, replicas, metadata, tags } = fields;
|
|
52
|
+
this.projectName = projectName;
|
|
53
|
+
this.address = address;
|
|
53
54
|
this.replicas = replicas;
|
|
54
55
|
this.exampleId = exampleId;
|
|
55
56
|
this.client = client ?? require_tracer.getDefaultLangChainClientSingleton();
|
|
@@ -127,27 +128,35 @@ var LangChainTracer = class LangChainTracer extends require_tracers_base.BaseTra
|
|
|
127
128
|
}
|
|
128
129
|
this.client = runTree.client ?? this.client;
|
|
129
130
|
this.replicas = runTree.replicas ?? this.replicas;
|
|
130
|
-
|
|
131
|
+
if (runTree.project_name || runTree.address) {
|
|
132
|
+
this.projectName = runTree.project_name;
|
|
133
|
+
this.address = runTree.address;
|
|
134
|
+
}
|
|
131
135
|
this.exampleId = runTree.reference_example_id ?? this.exampleId;
|
|
132
136
|
this.fields = {
|
|
133
137
|
...this.fields,
|
|
134
138
|
client: this.client,
|
|
135
139
|
replicas: this.replicas,
|
|
136
140
|
projectName: this.projectName,
|
|
141
|
+
address: this.address,
|
|
137
142
|
exampleId: this.exampleId
|
|
138
143
|
};
|
|
139
144
|
}
|
|
140
145
|
getRunTreeWithTracingConfig(id) {
|
|
141
146
|
const runTree = this.runTreeMap.get(id);
|
|
142
147
|
if (!runTree) return void 0;
|
|
143
|
-
|
|
148
|
+
const config = {
|
|
144
149
|
...runTree,
|
|
145
150
|
client: this.client,
|
|
146
151
|
project_name: this.projectName,
|
|
152
|
+
address: this.address,
|
|
147
153
|
replicas: this.replicas,
|
|
148
154
|
reference_example_id: this.exampleId,
|
|
149
155
|
tracingEnabled: true
|
|
150
|
-
}
|
|
156
|
+
};
|
|
157
|
+
if (config.project_name == null) delete config.project_name;
|
|
158
|
+
if (config.address == null) delete config.address;
|
|
159
|
+
return new langsmith_run_trees.RunTree(config);
|
|
151
160
|
}
|
|
152
161
|
static getTraceableRunTree() {
|
|
153
162
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer_langchain.cjs","names":["AIMessage","mergeUsageMetadata","BaseTracer","getDefaultProjectName","getDefaultLangChainClientSingleton","RunTree","getCurrentRunTree"],"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 /** @internal */\n _getRunStoreKey(): object {\n return this.runTreeMap;\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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"}
|
|
1
|
+
{"version":3,"file":"tracer_langchain.cjs","names":["AIMessage","mergeUsageMetadata","BaseTracer","getDefaultLangChainClientSingleton","RunTree","getCurrentRunTree"],"sources":["../../src/tracers/tracer_langchain.ts"],"sourcesContent":["import {\n type Client,\n type AgentAddress,\n type LangSmithTracingClientInterface,\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 address?: AgentAddress;\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 address?: AgentAddress;\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 {\n exampleId,\n projectName,\n address,\n client,\n replicas,\n metadata,\n tags,\n } = fields;\n\n this.projectName = projectName;\n this.address = address;\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 /** @internal */\n _getRunStoreKey(): object {\n return this.runTreeMap;\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 if (runTree.project_name || runTree.address) {\n this.projectName = runTree.project_name;\n this.address = runTree.address;\n }\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 address: this.address,\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 const config: RunTreeConfig = {\n ...runTree,\n client: this.client as Client,\n project_name: this.projectName,\n address: this.address,\n replicas: this.replicas,\n reference_example_id: this.exampleId,\n tracingEnabled: true,\n };\n\n // Older SDKs merge the config over their defaults, so an explicit undefined\n // would erase the project instead of letting the SDK resolve it.\n if (config.project_name == null) delete config.project_name;\n if (config.address == null) delete config.address;\n return new RunTree(config);\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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"}
|
|
@@ -2,7 +2,7 @@ import { BaseCallbackHandlerInput } from "../callbacks/base.cjs";
|
|
|
2
2
|
import { BaseTracer, Run as Run$2 } from "./base.cjs";
|
|
3
3
|
import { BaseRun, KVMap, RunCreate, RunUpdate as RunUpdate$1 } from "langsmith/schemas";
|
|
4
4
|
import { RunTree, RunTreeConfig } from "langsmith/run_trees";
|
|
5
|
-
import { LangSmithTracingClientInterface } from "langsmith";
|
|
5
|
+
import { AgentAddress, LangSmithTracingClientInterface } from "langsmith";
|
|
6
6
|
//#region src/tracers/tracer_langchain.d.ts
|
|
7
7
|
export interface Run extends BaseRun {
|
|
8
8
|
id: string;
|
|
@@ -24,6 +24,7 @@ export interface RunUpdate extends RunUpdate$1 {
|
|
|
24
24
|
export interface LangChainTracerFields extends BaseCallbackHandlerInput {
|
|
25
25
|
exampleId?: string;
|
|
26
26
|
projectName?: string;
|
|
27
|
+
address?: AgentAddress;
|
|
27
28
|
client?: LangSmithTracingClientInterface;
|
|
28
29
|
replicas?: RunTreeConfig["replicas"];
|
|
29
30
|
metadata?: Record<string, unknown>;
|
|
@@ -45,6 +46,7 @@ export declare class LangChainTracer extends BaseTracer implements LangChainTrac
|
|
|
45
46
|
protected fields: LangChainTracerFields;
|
|
46
47
|
name: string;
|
|
47
48
|
projectName?: string;
|
|
49
|
+
address?: AgentAddress;
|
|
48
50
|
exampleId?: string;
|
|
49
51
|
client: LangSmithTracingClientInterface;
|
|
50
52
|
replicas?: RunTreeConfig["replicas"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer_langchain.d.cts","names":["BaseRunUpdate","BaseTracerRun"],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;iBAqBiB,YAAY;EAC3B;EACA;EACA;EACA;EACA;;iBAGe,mBAAmB;EAClC;EACA;;iBAGe,kBAAkBA;EACjC,QAAQ;EACR,QAAQ;EACR;EACA;;iBAGe,8BAA8B;EAC7C;EACA;EACA,SAAS;EACT,WAAW;EACX,WAAW;EACX;;;;;;;;;;;;;qBAcW,iDAA+C;qBA2B/C,wBACH,sBACG;
|
|
1
|
+
{"version":3,"file":"tracer_langchain.d.cts","names":["BaseRunUpdate","BaseTracerRun"],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;iBAqBiB,YAAY;EAC3B;EACA;EACA;EACA;EACA;;iBAGe,mBAAmB;EAClC;EACA;;iBAGe,kBAAkBA;EACjC,QAAQ;EACR,QAAQ;EACR;EACA;;iBAGe,8BAA8B;EAC7C;EACA;EACA,UAAU;EACV,SAAS;EACT,WAAW;EACX,WAAW;EACX;;;;;;;;;;;;;qBAcW,iDAA+C;qBA2B/C,wBACH,sBACG;YAoBW,QAAQ;EAlB9B;EAEA;EAEA,UAAU;EAEV;EAEA,QAAQ;EAER,WAAW;EAEX;EAEA,kBAAkB;EAElB;EAEA,YAAsB,SAAQ;YA0Bd,WAAW,MAAM,MAAM;EAIjC,YAAY,KAAK,MAAM;EAQvB,YAAY,KAAK,MAAM;EAU7B,SAAS,KAAKC;EAmBd,wBACE,UACA;IAEA,WAAW;IACX;MACE;;EAwCJ;EAIA,OAAO,aAAa;EAIpB,kBAAkB,SAAS;EA0C3B,4BAA4B,aAAa;SAqBlC,uBAAuB;UAgBtB,OAAO,aAAa"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseCallbackHandlerInput } from "../callbacks/base.js";
|
|
2
2
|
import { BaseTracer, Run as Run$2 } from "./base.js";
|
|
3
3
|
import { RunTree, RunTreeConfig } from "langsmith/run_trees";
|
|
4
|
-
import { LangSmithTracingClientInterface } from "langsmith";
|
|
4
|
+
import { AgentAddress, LangSmithTracingClientInterface } from "langsmith";
|
|
5
5
|
import { BaseRun, KVMap, RunCreate, RunUpdate as RunUpdate$1 } from "langsmith/schemas";
|
|
6
6
|
//#region src/tracers/tracer_langchain.d.ts
|
|
7
7
|
export interface Run extends BaseRun {
|
|
@@ -24,6 +24,7 @@ export interface RunUpdate extends RunUpdate$1 {
|
|
|
24
24
|
export interface LangChainTracerFields extends BaseCallbackHandlerInput {
|
|
25
25
|
exampleId?: string;
|
|
26
26
|
projectName?: string;
|
|
27
|
+
address?: AgentAddress;
|
|
27
28
|
client?: LangSmithTracingClientInterface;
|
|
28
29
|
replicas?: RunTreeConfig["replicas"];
|
|
29
30
|
metadata?: Record<string, unknown>;
|
|
@@ -45,6 +46,7 @@ export declare class LangChainTracer extends BaseTracer implements LangChainTrac
|
|
|
45
46
|
protected fields: LangChainTracerFields;
|
|
46
47
|
name: string;
|
|
47
48
|
projectName?: string;
|
|
49
|
+
address?: AgentAddress;
|
|
48
50
|
exampleId?: string;
|
|
49
51
|
client: LangSmithTracingClientInterface;
|
|
50
52
|
replicas?: RunTreeConfig["replicas"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer_langchain.d.ts","names":["BaseRunUpdate","BaseTracerRun"],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;iBAqBiB,YAAY;EAC3B;EACA;EACA;EACA;EACA;;iBAGe,mBAAmB;EAClC;EACA;;iBAGe,kBAAkBA;EACjC,QAAQ;EACR,QAAQ;EACR;EACA;;iBAGe,8BAA8B;EAC7C;EACA;EACA,SAAS;EACT,WAAW;EACX,WAAW;EACX;;;;;;;;;;;;;qBAcW,iDAA+C;qBA2B/C,wBACH,sBACG;
|
|
1
|
+
{"version":3,"file":"tracer_langchain.d.ts","names":["BaseRunUpdate","BaseTracerRun"],"sources":["../../src/tracers/tracer_langchain.ts"],"mappings":";;;;;;iBAqBiB,YAAY;EAC3B;EACA;EACA;EACA;EACA;;iBAGe,mBAAmB;EAClC;EACA;;iBAGe,kBAAkBA;EACjC,QAAQ;EACR,QAAQ;EACR;EACA;;iBAGe,8BAA8B;EAC7C;EACA;EACA,UAAU;EACV,SAAS;EACT,WAAW;EACX,WAAW;EACX;;;;;;;;;;;;;qBAcW,iDAA+C;qBA2B/C,wBACH,sBACG;YAoBW,QAAQ;EAlB9B;EAEA;EAEA,UAAU;EAEV;EAEA,QAAQ;EAER,WAAW;EAEX;EAEA,kBAAkB;EAElB;EAEA,YAAsB,SAAQ;YA0Bd,WAAW,MAAM,MAAM;EAIjC,YAAY,KAAK,MAAM;EAQvB,YAAY,KAAK,MAAM;EAU7B,SAAS,KAAKC;EAmBd,wBACE,UACA;IAEA,WAAW;IACX;MACE;;EAwCJ;EAIA,OAAO,aAAa;EAIpB,kBAAkB,SAAS;EA0C3B,4BAA4B,aAAa;SAqBlC,uBAAuB;UAgBtB,OAAO,aAAa"}
|
|
@@ -4,7 +4,6 @@ import { AIMessage } from "../messages/ai.js";
|
|
|
4
4
|
import { BaseTracer } from "./base.js";
|
|
5
5
|
import { getDefaultLangChainClientSingleton } from "../singletons/tracer.js";
|
|
6
6
|
import { RunTree } from "langsmith/run_trees";
|
|
7
|
-
import { getDefaultProjectName } from "langsmith";
|
|
8
7
|
import { getCurrentRunTree } from "langsmith/singletons/traceable";
|
|
9
8
|
//#region src/tracers/tracer_langchain.ts
|
|
10
9
|
var tracer_langchain_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -38,6 +37,7 @@ var LangChainTracer = class LangChainTracer extends BaseTracer {
|
|
|
38
37
|
fields;
|
|
39
38
|
name = "langchain_tracer";
|
|
40
39
|
projectName;
|
|
40
|
+
address;
|
|
41
41
|
exampleId;
|
|
42
42
|
client;
|
|
43
43
|
replicas;
|
|
@@ -47,8 +47,9 @@ var LangChainTracer = class LangChainTracer extends BaseTracer {
|
|
|
47
47
|
constructor(fields = {}) {
|
|
48
48
|
super(fields);
|
|
49
49
|
this.fields = fields;
|
|
50
|
-
const { exampleId, projectName, client, replicas, metadata, tags } = fields;
|
|
51
|
-
this.projectName = projectName
|
|
50
|
+
const { exampleId, projectName, address, client, replicas, metadata, tags } = fields;
|
|
51
|
+
this.projectName = projectName;
|
|
52
|
+
this.address = address;
|
|
52
53
|
this.replicas = replicas;
|
|
53
54
|
this.exampleId = exampleId;
|
|
54
55
|
this.client = client ?? getDefaultLangChainClientSingleton();
|
|
@@ -126,27 +127,35 @@ var LangChainTracer = class LangChainTracer extends BaseTracer {
|
|
|
126
127
|
}
|
|
127
128
|
this.client = runTree.client ?? this.client;
|
|
128
129
|
this.replicas = runTree.replicas ?? this.replicas;
|
|
129
|
-
|
|
130
|
+
if (runTree.project_name || runTree.address) {
|
|
131
|
+
this.projectName = runTree.project_name;
|
|
132
|
+
this.address = runTree.address;
|
|
133
|
+
}
|
|
130
134
|
this.exampleId = runTree.reference_example_id ?? this.exampleId;
|
|
131
135
|
this.fields = {
|
|
132
136
|
...this.fields,
|
|
133
137
|
client: this.client,
|
|
134
138
|
replicas: this.replicas,
|
|
135
139
|
projectName: this.projectName,
|
|
140
|
+
address: this.address,
|
|
136
141
|
exampleId: this.exampleId
|
|
137
142
|
};
|
|
138
143
|
}
|
|
139
144
|
getRunTreeWithTracingConfig(id) {
|
|
140
145
|
const runTree = this.runTreeMap.get(id);
|
|
141
146
|
if (!runTree) return void 0;
|
|
142
|
-
|
|
147
|
+
const config = {
|
|
143
148
|
...runTree,
|
|
144
149
|
client: this.client,
|
|
145
150
|
project_name: this.projectName,
|
|
151
|
+
address: this.address,
|
|
146
152
|
replicas: this.replicas,
|
|
147
153
|
reference_example_id: this.exampleId,
|
|
148
154
|
tracingEnabled: true
|
|
149
|
-
}
|
|
155
|
+
};
|
|
156
|
+
if (config.project_name == null) delete config.project_name;
|
|
157
|
+
if (config.address == null) delete config.address;
|
|
158
|
+
return new RunTree(config);
|
|
150
159
|
}
|
|
151
160
|
static getTraceableRunTree() {
|
|
152
161
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer_langchain.js","names":[],"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 /** @internal */\n _getRunStoreKey(): object {\n return this.runTreeMap;\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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"}
|
|
1
|
+
{"version":3,"file":"tracer_langchain.js","names":[],"sources":["../../src/tracers/tracer_langchain.ts"],"sourcesContent":["import {\n type Client,\n type AgentAddress,\n type LangSmithTracingClientInterface,\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 address?: AgentAddress;\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 address?: AgentAddress;\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 {\n exampleId,\n projectName,\n address,\n client,\n replicas,\n metadata,\n tags,\n } = fields;\n\n this.projectName = projectName;\n this.address = address;\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 /** @internal */\n _getRunStoreKey(): object {\n return this.runTreeMap;\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 if (runTree.project_name || runTree.address) {\n this.projectName = runTree.project_name;\n this.address = runTree.address;\n }\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 address: this.address,\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 const config: RunTreeConfig = {\n ...runTree,\n client: this.client as Client,\n project_name: this.projectName,\n address: this.address,\n replicas: this.replicas,\n reference_example_id: this.exampleId,\n tracingEnabled: true,\n };\n\n // Older SDKs merge the config over their defaults, so an explicit undefined\n // would erase the project instead of letting the SDK resolve it.\n if (config.project_name == null) delete config.project_name;\n if (config.address == null) delete config.address;\n return new RunTree(config);\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/core",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.19",
|
|
4
4
|
"description": "Core LangChain.js abstractions and schemas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@cfworker/json-schema": "^4.0.2",
|
|
20
20
|
"@standard-schema/spec": "^1.1.0",
|
|
21
21
|
"js-tiktoken": "^1.0.12",
|
|
22
|
-
"langsmith": ">=0.
|
|
22
|
+
"langsmith": ">=0.11.0 <1.0.0",
|
|
23
23
|
"mustache": "^4.2.0",
|
|
24
24
|
"p-queue": "^6.6.2",
|
|
25
25
|
"zod": "^3.25.76 || ^4"
|