@langchain/core 1.2.16 → 1.2.18
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 +18 -0
- package/dist/language_models/base.cjs +1 -1
- package/dist/language_models/base.js +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/runnables/config.cjs +2 -1
- package/dist/runnables/config.cjs.map +1 -1
- package/dist/runnables/config.js +2 -1
- package/dist/runnables/config.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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @langchain/core
|
|
2
2
|
|
|
3
|
+
## 1.2.18
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#11956](https://github.com/langchain-ai/langchainjs/pull/11956) [`93d62b0`](https://github.com/langchain-ai/langchainjs/commit/93d62b008e13e10f28724a5ab09ab6eda584f1cb) Thanks [@hntrl](https://github.com/hntrl)! - Require langsmith >=0.11.0 to include the restored NullableHeaders type declarations.
|
|
8
|
+
|
|
9
|
+
- [#11822](https://github.com/langchain-ai/langchainjs/pull/11822) [`d3e6fe6`](https://github.com/langchain-ai/langchainjs/commit/d3e6fe66a5f902fa615f076ca71d9541f1291166) Thanks [@dqbd](https://github.com/dqbd)! - Add explicit agent address support to `LangChainTracer`, inherit project and address destinations together, and delegate default destination resolution to the LangSmith SDK.
|
|
10
|
+
|
|
11
|
+
- [#11150](https://github.com/langchain-ai/langchainjs/pull/11150) [`cea15cf`](https://github.com/langchain-ai/langchainjs/commit/cea15cf9ef5216125b24f23bb5ad06b7c1a91b33) Thanks [@mdnanocom](https://github.com/mdnanocom)! - fix(core): defer tool call chunk collapsing in AIMessageChunk to fix O(n²) streaming aggregation
|
|
12
|
+
|
|
13
|
+
`AIMessageChunk` eagerly re-ran `collapseToolCallChunks` in its constructor on every streamed delta `concat`, re-parsing all accumulated tool args each time — O(n²) over a stream, which can block the event loop for seconds on long tool-call streams. Collapsing now runs lazily, once, on first read of `tool_calls` / `invalid_tool_calls`.
|
|
14
|
+
|
|
15
|
+
## 1.2.17
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- [#11849](https://github.com/langchain-ai/langchainjs/pull/11849) [`b1d9c7a`](https://github.com/langchain-ai/langchainjs/commit/b1d9c7acf82b545c102c5178eb57b16f7a7f5710) Thanks [@KyleCodes](https://github.com/KyleCodes)! - Preserve runtime context in ambient runnable config across tool calls, nested runnables, and streaming.
|
|
20
|
+
|
|
3
21
|
## 1.2.16
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -139,7 +139,7 @@ var BaseLangChain = class extends require_base.Runnable {
|
|
|
139
139
|
this.callbacks = params.callbacks;
|
|
140
140
|
this.tags = params.tags ?? [];
|
|
141
141
|
this.metadata = params.metadata ?? {};
|
|
142
|
-
this._addVersion("@langchain/core", "1.2.
|
|
142
|
+
this._addVersion("@langchain/core", "1.2.18");
|
|
143
143
|
}
|
|
144
144
|
_addVersion(pkg, version) {
|
|
145
145
|
const existing = this.metadata?.versions;
|
|
@@ -138,7 +138,7 @@ var BaseLangChain = class extends Runnable {
|
|
|
138
138
|
this.callbacks = params.callbacks;
|
|
139
139
|
this.tags = params.tags ?? [];
|
|
140
140
|
this.metadata = params.metadata ?? {};
|
|
141
|
-
this._addVersion("@langchain/core", "1.2.
|
|
141
|
+
this._addVersion("@langchain/core", "1.2.18");
|
|
142
142
|
}
|
|
143
143
|
_addVersion(pkg, version) {
|
|
144
144
|
const existing = this.metadata?.versions;
|
package/dist/messages/ai.cjs
CHANGED
|
@@ -161,22 +161,50 @@ var AIMessageChunk = class extends require_base.BaseMessageChunk {
|
|
|
161
161
|
tool_call_chunks: [],
|
|
162
162
|
usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
|
|
163
163
|
};
|
|
164
|
-
else {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
tool_call_chunks: collapsed.tool_call_chunks,
|
|
169
|
-
tool_calls: collapsed.tool_calls,
|
|
170
|
-
invalid_tool_calls: collapsed.invalid_tool_calls,
|
|
171
|
-
usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
|
|
172
|
-
};
|
|
173
|
-
}
|
|
164
|
+
else initParams = {
|
|
165
|
+
...fields,
|
|
166
|
+
usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
|
|
167
|
+
};
|
|
174
168
|
super(initParams);
|
|
175
169
|
this.tool_call_chunks = initParams.tool_call_chunks ?? this.tool_call_chunks;
|
|
176
|
-
|
|
177
|
-
|
|
170
|
+
if (typeof fields !== "string" && !Array.isArray(fields) && fields.tool_call_chunks !== void 0 && fields.tool_call_chunks.length > 0) this._defineLazyToolCallGetters(fields.tool_call_chunks.map((chunk) => ({ ...chunk })));
|
|
171
|
+
else {
|
|
172
|
+
this.tool_calls = initParams.tool_calls ?? this.tool_calls;
|
|
173
|
+
this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls;
|
|
174
|
+
}
|
|
178
175
|
this.usage_metadata = initParams.usage_metadata;
|
|
179
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
|
|
179
|
+
* Own-property getters (not prototype accessors) so spread / Object.entries still see
|
|
180
|
+
* the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
|
|
181
|
+
*/
|
|
182
|
+
_defineLazyToolCallGetters(toolCallChunks) {
|
|
183
|
+
let collapsed;
|
|
184
|
+
const getCollapsed = () => {
|
|
185
|
+
collapsed ??= require_utils.collapseToolCallChunks(toolCallChunks);
|
|
186
|
+
return collapsed;
|
|
187
|
+
};
|
|
188
|
+
const defineLazy = (target, prop) => {
|
|
189
|
+
Object.defineProperty(target, prop, {
|
|
190
|
+
get: () => getCollapsed()[prop],
|
|
191
|
+
set: (value) => {
|
|
192
|
+
Object.defineProperty(target, prop, {
|
|
193
|
+
value,
|
|
194
|
+
writable: true,
|
|
195
|
+
enumerable: true,
|
|
196
|
+
configurable: true
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
enumerable: true,
|
|
200
|
+
configurable: true
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
defineLazy(this, "tool_calls");
|
|
204
|
+
defineLazy(this, "invalid_tool_calls");
|
|
205
|
+
defineLazy(this.lc_kwargs, "tool_calls");
|
|
206
|
+
defineLazy(this.lc_kwargs, "invalid_tool_calls");
|
|
207
|
+
}
|
|
180
208
|
get lc_aliases() {
|
|
181
209
|
return {
|
|
182
210
|
...super.lc_aliases,
|
|
@@ -232,7 +260,7 @@ var AIMessageChunk = class extends require_base.BaseMessageChunk {
|
|
|
232
260
|
const rawToolCalls = require_base._mergeLists(this.tool_call_chunks, chunk.tool_call_chunks);
|
|
233
261
|
if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_call_chunks = rawToolCalls;
|
|
234
262
|
}
|
|
235
|
-
if (this.tool_calls !== void 0 || chunk.tool_calls !== void 0) {
|
|
263
|
+
if ((combinedFields.tool_call_chunks === void 0 || combinedFields.tool_call_chunks.length === 0) && (this.tool_calls !== void 0 || chunk.tool_calls !== void 0)) {
|
|
236
264
|
const rawToolCalls = require_base._mergeLists(this.tool_calls, chunk.tool_calls);
|
|
237
265
|
if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_calls = rawToolCalls;
|
|
238
266
|
}
|
package/dist/messages/ai.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.cjs","names":["BaseMessage","defaultToolCallParser","getTranslator","BaseMessageChunk","collapseToolCallChunks","mergeContent","_mergeDicts","mergeResponseMetadata","_mergeLists","mergeUsageMetadata"],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n const collapsed = collapseToolCallChunks(fields.tool_call_chunks ?? []);\n initParams = {\n ...fields,\n tool_call_chunks: collapsed.tool_call_chunks,\n tool_calls: collapsed.tool_calls as $InferToolCalls<TStructure>[],\n invalid_tool_calls: collapsed.invalid_tool_calls,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n this.usage_metadata = initParams.usage_metadata;\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n if (this.tool_calls !== undefined || chunk.tool_calls !== undefined) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai.cjs","names":["BaseMessage","defaultToolCallParser","getTranslator","BaseMessageChunk","collapseToolCallChunks","mergeContent","_mergeDicts","mergeResponseMetadata","_mergeLists","mergeUsageMetadata"],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n // Collapsed lazily on first read; see _defineLazyToolCallGetters.\n initParams = {\n ...fields,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n if (\n typeof fields !== \"string\" &&\n !Array.isArray(fields) &&\n fields.tool_call_chunks !== undefined &&\n fields.tool_call_chunks.length > 0\n ) {\n this._defineLazyToolCallGetters(\n fields.tool_call_chunks.map((chunk) => ({ ...chunk }))\n );\n } else {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n /**\n * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.\n * Own-property getters (not prototype accessors) so spread / Object.entries still see\n * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.\n */\n private _defineLazyToolCallGetters(toolCallChunks: ToolCallChunk[]) {\n let collapsed: ReturnType<typeof collapseToolCallChunks> | undefined;\n const getCollapsed = () => {\n collapsed ??= collapseToolCallChunks(toolCallChunks);\n return collapsed;\n };\n const defineLazy = (\n target: object,\n prop: \"tool_calls\" | \"invalid_tool_calls\"\n ) => {\n Object.defineProperty(target, prop, {\n get: () => getCollapsed()[prop],\n // Writing to the property replaces the getter with a plain value,\n // restoring normal assignment semantics.\n set: (value: unknown) => {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n },\n enumerable: true,\n configurable: true,\n });\n };\n defineLazy(this, \"tool_calls\");\n defineLazy(this, \"invalid_tool_calls\");\n defineLazy(this.lc_kwargs, \"tool_calls\");\n defineLazy(this.lc_kwargs, \"invalid_tool_calls\");\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n // Skip when chunks exist: the constructor derives tool_calls, and reading here forces a collapse.\n if (\n (combinedFields.tool_call_chunks === undefined ||\n combinedFields.tool_call_chunks.length === 0) &&\n (this.tool_calls !== undefined || chunk.tool_calls !== undefined)\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":"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"}
|
package/dist/messages/ai.d.cts
CHANGED
|
@@ -53,6 +53,12 @@ export declare class AIMessageChunk<TStructure extends MessageStructure = Messag
|
|
|
53
53
|
tool_call_chunks?: ToolCallChunk[];
|
|
54
54
|
usage_metadata?: AIMessageChunkFields<TStructure>["usage_metadata"];
|
|
55
55
|
constructor(fields: $InferMessageContent<TStructure, "ai"> | AIMessageChunkFields<TStructure>);
|
|
56
|
+
/**
|
|
57
|
+
* Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
|
|
58
|
+
* Own-property getters (not prototype accessors) so spread / Object.entries still see
|
|
59
|
+
* the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
|
|
60
|
+
*/
|
|
61
|
+
private _defineLazyToolCallGetters;
|
|
56
62
|
get lc_aliases(): Record<string, string>;
|
|
57
63
|
static lc_name(): string;
|
|
58
64
|
get contentBlocks(): Array<ContentBlock.Standard>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.cts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;
|
|
1
|
+
{"version":3,"file":"ai.d.cts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;;;;;;UA6DnB;MAgCJ,cAAc;SAWX;MAIH,iBAAiB,MAAM,aAAa;MA4C3B,oBAAoB;EAUjC,OAAO,OAAO,eAAe;;;;;;SA4DtB,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,eAAe;;;;;SAKnC,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,eAAA,iBAPAA"}
|
package/dist/messages/ai.d.ts
CHANGED
|
@@ -53,6 +53,12 @@ export declare class AIMessageChunk<TStructure extends MessageStructure = Messag
|
|
|
53
53
|
tool_call_chunks?: ToolCallChunk[];
|
|
54
54
|
usage_metadata?: AIMessageChunkFields<TStructure>["usage_metadata"];
|
|
55
55
|
constructor(fields: $InferMessageContent<TStructure, "ai"> | AIMessageChunkFields<TStructure>);
|
|
56
|
+
/**
|
|
57
|
+
* Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
|
|
58
|
+
* Own-property getters (not prototype accessors) so spread / Object.entries still see
|
|
59
|
+
* the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
|
|
60
|
+
*/
|
|
61
|
+
private _defineLazyToolCallGetters;
|
|
56
62
|
get lc_aliases(): Record<string, string>;
|
|
57
63
|
static lc_name(): string;
|
|
58
64
|
get contentBlocks(): Array<ContentBlock.Standard>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","names":["_$__message_js0.MessageToolSet"],"sources":["../../src/messages/ai.ts"],"mappings":";;;;;iBAqCiB,gBACf,mBAAmB,mBAAmB,0BAC9B,kBAAkB;EAC1B,aAAa,gBAAgB;EAC7B,qBAAqB;EACrB,iBAAiB,sBAAsB;;qBAG5B,UAAU,mBAAmB,mBAAmB,0BACnD,YAAY,6BACT,gBAAgB;WAElB;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,iBAAiB,gBAAgB;MAE7B,cAAc;EAUlB,YACE,QAAQ,qBAAqB,oBAAoB,gBAAgB;SA0H5D;MAIH,iBAAiB,MAAM,aAAa;MAwC3B,oBAAoB;;;;;;SAc1B,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,UAAU;;;;;SAK9B,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,UAAA,iBAPAA;;;;;wBAe1B,YAAY,mBAAmB,kBAC7C,GAAG,cACF,KAAK,UAAU;;;;wBAOF,iBAAiB,mBAAmB,kBAClD,GAAG,mBACF,KAAK,eAAe;YAIX,qBACV,mBAAmB,mBAAmB,oBACpC,gBAAgB;EAClB,mBAAmB;;;;;;qBAOR,eACX,mBAAmB,mBAAmB,0BAE9B,iBAAiB,6BACd,UAAU,aAAa,qBAAqB;WAE9C;EAET,aAAa,gBAAgB;EAE7B,qBAAqB;EAErB,mBAAmB;EAEnB,iBAAiB,qBAAqB;EAEtC,YACE,QACI,qBAAqB,oBACrB,qBAAqB;;;;;;UA6DnB;MAgCJ,cAAc;SAWX;MAIH,iBAAiB,MAAM,aAAa;MA4C3B,oBAAoB;EAUjC,OAAO,OAAO,eAAe;;;;;;SA4DtB,WAAW,UAAU,kBAC1B,KAAK,YAAY,KAChB,OAAO,YAAY,KAAK,eAAe;;;;;SAKnC,WAAW,eAAe,OAAO;UAOhC,OAAO,aAAa,eAAY,OAAA,eAAA,iBAPAA"}
|
package/dist/messages/ai.js
CHANGED
|
@@ -161,22 +161,50 @@ var AIMessageChunk = class extends BaseMessageChunk {
|
|
|
161
161
|
tool_call_chunks: [],
|
|
162
162
|
usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
|
|
163
163
|
};
|
|
164
|
-
else {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
tool_call_chunks: collapsed.tool_call_chunks,
|
|
169
|
-
tool_calls: collapsed.tool_calls,
|
|
170
|
-
invalid_tool_calls: collapsed.invalid_tool_calls,
|
|
171
|
-
usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
|
|
172
|
-
};
|
|
173
|
-
}
|
|
164
|
+
else initParams = {
|
|
165
|
+
...fields,
|
|
166
|
+
usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0
|
|
167
|
+
};
|
|
174
168
|
super(initParams);
|
|
175
169
|
this.tool_call_chunks = initParams.tool_call_chunks ?? this.tool_call_chunks;
|
|
176
|
-
|
|
177
|
-
|
|
170
|
+
if (typeof fields !== "string" && !Array.isArray(fields) && fields.tool_call_chunks !== void 0 && fields.tool_call_chunks.length > 0) this._defineLazyToolCallGetters(fields.tool_call_chunks.map((chunk) => ({ ...chunk })));
|
|
171
|
+
else {
|
|
172
|
+
this.tool_calls = initParams.tool_calls ?? this.tool_calls;
|
|
173
|
+
this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls;
|
|
174
|
+
}
|
|
178
175
|
this.usage_metadata = initParams.usage_metadata;
|
|
179
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.
|
|
179
|
+
* Own-property getters (not prototype accessors) so spread / Object.entries still see
|
|
180
|
+
* the values; mirrored on lc_kwargs so serialized output matches the eager behavior.
|
|
181
|
+
*/
|
|
182
|
+
_defineLazyToolCallGetters(toolCallChunks) {
|
|
183
|
+
let collapsed;
|
|
184
|
+
const getCollapsed = () => {
|
|
185
|
+
collapsed ??= collapseToolCallChunks(toolCallChunks);
|
|
186
|
+
return collapsed;
|
|
187
|
+
};
|
|
188
|
+
const defineLazy = (target, prop) => {
|
|
189
|
+
Object.defineProperty(target, prop, {
|
|
190
|
+
get: () => getCollapsed()[prop],
|
|
191
|
+
set: (value) => {
|
|
192
|
+
Object.defineProperty(target, prop, {
|
|
193
|
+
value,
|
|
194
|
+
writable: true,
|
|
195
|
+
enumerable: true,
|
|
196
|
+
configurable: true
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
enumerable: true,
|
|
200
|
+
configurable: true
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
defineLazy(this, "tool_calls");
|
|
204
|
+
defineLazy(this, "invalid_tool_calls");
|
|
205
|
+
defineLazy(this.lc_kwargs, "tool_calls");
|
|
206
|
+
defineLazy(this.lc_kwargs, "invalid_tool_calls");
|
|
207
|
+
}
|
|
180
208
|
get lc_aliases() {
|
|
181
209
|
return {
|
|
182
210
|
...super.lc_aliases,
|
|
@@ -232,7 +260,7 @@ var AIMessageChunk = class extends BaseMessageChunk {
|
|
|
232
260
|
const rawToolCalls = _mergeLists(this.tool_call_chunks, chunk.tool_call_chunks);
|
|
233
261
|
if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_call_chunks = rawToolCalls;
|
|
234
262
|
}
|
|
235
|
-
if (this.tool_calls !== void 0 || chunk.tool_calls !== void 0) {
|
|
263
|
+
if ((combinedFields.tool_call_chunks === void 0 || combinedFields.tool_call_chunks.length === 0) && (this.tool_calls !== void 0 || chunk.tool_calls !== void 0)) {
|
|
236
264
|
const rawToolCalls = _mergeLists(this.tool_calls, chunk.tool_calls);
|
|
237
265
|
if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_calls = rawToolCalls;
|
|
238
266
|
}
|
package/dist/messages/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","names":[],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n const collapsed = collapseToolCallChunks(fields.tool_call_chunks ?? []);\n initParams = {\n ...fields,\n tool_call_chunks: collapsed.tool_call_chunks,\n tool_calls: collapsed.tool_calls as $InferToolCalls<TStructure>[],\n invalid_tool_calls: collapsed.invalid_tool_calls,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n this.usage_metadata = initParams.usage_metadata;\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n if (this.tool_calls !== undefined || chunk.tool_calls !== undefined) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":";;;;;;AAwBA,SAAS,sBAAsB,OAAyC;CACtE,IAAI,OAAO,UAAU,UACnB,OAAO,MAAM,SAAS,IAAI,CAAC;EAAE,MAAM;EAAQ,MAAM;CAAM,CAAC,IAAI,CAAC;CAE/D,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO;CAET,IAAI,SAAS,MACX,OAAO,CAAC;CAEV,OAAO,CAAC,KAA8B;AACxC;AAUA,IAAa,YAAb,cACU,YAEV;CACE,OAAgB;CAEhB,aAA6C,CAAC;CAE9C,qBAAyC,CAAC;CAE1C;CAEA,IAAI,aAAqC;EAEvC,OAAO;GACL,GAAG,MAAM;GACT,YAAY;GACZ,oBAAoB;GACpB,gBAAgB;EAClB;CACF;CAEA,YACE,QACA;EACA,IAAI;EACJ,IAAI,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GACpD,aAAa;GACX,SAAS;GACT,YAAY,CAAC;GACb,oBAAoB,CAAC;GACrB,mBAAmB,CAAC;EACtB;OACK;GACL,aAAa;GACb,MAAM,eAAe,WAAW,mBAAmB;GACnD,MAAM,YAAY,WAAW;GAC7B,IACE,EAAE,gBAAgB,SAClB,aAAa,SAAS,MACrB,cAAc,KAAA,KAAa,UAAU,WAAW,IAEjD,QAAQ,KACN;IACE;IACA;IACA;IACA;GACF,CAAC,CAAC,KAAK,GAAG,CACZ;GAEF,IAAI;IACF,IAAI,EAAE,gBAAgB,SAAS,cAAc,KAAA,GAAW;KACtD,MAAM,CAAC,iBAAiB,oBACtB,sBAAsB,YAAY;KACpC,WAAW,aACR,mBAAqD,CAAC;KACzD,WAAW,qBAAqB,oBAAoB,CAAC;IACvD,OAAO;KACL,WAAW,aAAa,WAAW,cAAc,CAAC;KAClD,WAAW,qBAAqB,WAAW,sBAAsB,CAAC;IACpE;GACF,QAAQ;IAEN,WAAW,aAAa,CAAC;IACzB,WAAW,qBAAqB,CAAC;GACnC;GAKA,IACE,WAAW,sBAAsB,KAAA,KACjC,oBAAoB,WAAW,qBAC/B,WAAW,kBAAkB,mBAAmB,QAChD,WAAW,YAAY,KAAA,GACvB;IACA,WAAW,gBAAgB,sBAAsB,WAAW,OAAO;IACnE,WAAW,UAAU,KAAA;GACvB;GAEA,IAAI,WAAW,kBAAkB,KAAA,GAAW;IAC1C,IAAI,CAAC,MAAM,QAAQ,WAAW,aAAa,GACzC,WAAW,gBAAgB,sBACzB,WAAW,aACb;IAIF,IAAI,WAAW,YAAY;KACzB,MAAM,+BAA+B,WAAW,WAAW,QACxD,aACC,CAAC,WAAW,eAAe,MACxB,UACC,MAAM,SAAS,eACf,MAAM,OAAO,SAAS,MACtB,MAAM,SAAS,SAAS,IAC5B,CACJ;KACA,WAAW,cAAc,KACvB,GAAG,6BAA6B,KAAK,cAAc;MACjD,MAAM;MACN,IAAI,SAAS;MACb,MAAM,SAAS;MACf,MAAM,SAAS;KACjB,EAAE,CACJ;IACF;IAEA,MAAM,mBAAmB,WAAW,cACjC,QACE,UACC,MAAM,SAAS,WACnB,CAAC,CACA,QACE,UACC,CAAC,WAAW,YAAY,MACrB,aACC,SAAS,OAAO,MAAM,MAAM,SAAS,SAAS,MAAM,IACxD,CACJ;IACF,IAAI,iBAAiB,SAAS,GAC5B,WAAW,aAAa,CACtB,GAAI,WAAW,cAAc,CAAC,GAC9B,GAAG,iBAAiB,KAAK,WAAW;KAClC,MAAM;KACN,IAAI,MAAM;KACV,MAAM,MAAM;KACZ,MAAM,MAAM;IACd,EAAE,CACJ;GAEJ;EACF;EAGA,MAAM,UAAU;EAChB,IAAI,OAAO,eAAe,UAAU;GAClC,KAAK,aAAa,WAAW,cAAc,KAAK;GAChD,KAAK,qBACH,WAAW,sBAAsB,KAAK;EAC1C;EACA,KAAK,iBAAiB,WAAW;CACnC;CAEA,OAAO,UAAU;EACf,OAAO;CACT;CAEA,IAAI,gBAA8C;EAChD,IACE,KAAK,qBACL,oBAAoB,KAAK,qBACzB,KAAK,kBAAkB,mBAAmB,MAE1C,OAAO,KAAK;EAGd,IACE,KAAK,qBACL,oBAAoB,KAAK,qBACzB,OAAO,KAAK,kBAAkB,mBAAmB,UACjD;GACA,MAAM,aAAa,cAAc,KAAK,kBAAkB,cAAc;GACtE,IAAI,YACF,OAAO,WAAW,iBAAiB,IAAiB;EAExD;EAEA,MAAM,SAAS,MAAM;EAErB,IAAI,KAAK,YAAY;GACnB,MAAM,mBAAmB,KAAK,WAAW,QACtC,UACC,CAAC,OAAO,MAAM,MAAM,EAAE,OAAO,MAAM,MAAM,EAAE,SAAS,MAAM,IAAI,CAClE;GACA,OAAO,KACL,GAAI,iBAAiB,KAAK,WAAW;IACnC,MAAM;IACN,IAAI,MAAM;IACV,MAAM,MAAM;IACZ,MAAM,MAAM;GACd,EAAE,CACJ;EACF;EAEA,OAAO;CACT;CAEA,IAAa,mBAA4C;EACvD,OAAO;GACL,GAAG,MAAM;GACT,YAAY,KAAK;GACjB,oBAAoB,KAAK;GACzB,gBAAgB,KAAK;EACvB;CACF;CAeA,OAAO,WACL,KACqB;EACrB,OAAO,MAAM,WAAW,GAAG,KAAM,IAAyB,SAAS;CACrE;CAEA,QAAQ,OAAO,aAAa,KAAc;EACxC,OAAO,KAAK,WAAW,GAAG;CAC5B;AACF;;;;AAKA,SAAgB,YACd,GAC4B;CAC5B,OAAO,EAAE,SAAS,MAAM;AAC1B;;;;AAKA,SAAgB,iBACd,GACiC;CACjC,OAAO,EAAE,SAAS,MAAM;AAC1B;;;;;AAYA,IAAa,iBAAb,cAGU,iBAEV;CACE,OAAgB;CAEhB,aAA6C,CAAC;CAE9C,qBAAyC,CAAC;CAE1C,mBAAqC,CAAC;CAEtC;CAEA,YACE,QAGA;EACA,IAAI;EACJ,IAAI,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GACpD,aAAa;GACX,SAAS;GACT,YAAY,CAAC;GACb,oBAAoB,CAAC;GACrB,kBAAkB,CAAC;EACrB;OACK,IACL,OAAO,qBAAqB,KAAA,KAC5B,OAAO,iBAAiB,WAAW,GAEnC,aAAa;GACX,GAAG;GACH,YAAY,OAAO,cAAc,CAAC;GAClC,oBAAoB,CAAC;GACrB,kBAAkB,CAAC;GACnB,gBACE,OAAO,mBAAmB,KAAA,IACtB,OAAO,iBACP,KAAA;EACR;OACK;GACL,MAAM,YAAY,uBAAuB,OAAO,oBAAoB,CAAC,CAAC;GACtE,aAAa;IACX,GAAG;IACH,kBAAkB,UAAU;IAC5B,YAAY,UAAU;IACtB,oBAAoB,UAAU;IAC9B,gBACE,OAAO,mBAAmB,KAAA,IACtB,OAAO,iBACP,KAAA;GACR;EACF;EAGA,MAAM,UAAU;EAChB,KAAK,mBACH,WAAW,oBAAoB,KAAK;EACtC,KAAK,aAAa,WAAW,cAAc,KAAK;EAChD,KAAK,qBACH,WAAW,sBAAsB,KAAK;EACxC,KAAK,iBAAiB,WAAW;CACnC;CAEA,IAAI,aAAqC;EAEvC,OAAO;GACL,GAAG,MAAM;GACT,YAAY;GACZ,oBAAoB;GACpB,kBAAkB;GAClB,gBAAgB;EAClB;CACF;CAEA,OAAO,UAAU;EACf,OAAO;CACT;CAEA,IAAI,gBAA8C;EAChD,IACE,KAAK,qBACL,oBAAoB,KAAK,qBACzB,KAAK,kBAAkB,mBAAmB,MAE1C,OAAO,KAAK;EAGd,IACE,KAAK,qBACL,oBAAoB,KAAK,qBACzB,OAAO,KAAK,kBAAkB,mBAAmB,UACjD;GACA,MAAM,aAAa,cAAc,KAAK,kBAAkB,cAAc;GACtE,IAAI,YACF,OAAO,WAAW,iBAAiB,IAAiB;EAExD;EAEA,MAAM,SAAS,MAAM;EAErB,IAAI,KAAK,YACH;OAAA,OAAO,KAAK,YAAY,UAAU;IACpC,MAAM,mBAAmB,KAAK,QAC3B,QAAQ,UAAU,MAAM,SAAS,WAAW,CAAC,CAC7C,KAAK,UAAU,MAAM,EAAE;IAC1B,KAAK,MAAM,YAAY,KAAK,YAC1B,IAAI,SAAS,MAAM,CAAC,iBAAiB,SAAS,SAAS,EAAE,GACvD,OAAO,KAAK;KACV,GAAG;KACH,MAAM;KACN,IAAI,SAAS;KACb,MAAM,SAAS;KACf,MAAM,SAAS;IACjB,CAAC;GAGP;;EAGF,OAAO;CACT;CAEA,IAAa,mBAA4C;EACvD,OAAO;GACL,GAAG,MAAM;GACT,YAAY,KAAK;GACjB,kBAAkB,KAAK;GACvB,oBAAoB,KAAK;GACzB,gBAAgB,KAAK;EACvB;CACF;CAEA,OAAO,OAAmC;EACxC,MAAM,iBAAuC;GAC3C,SAAS,aAAa,KAAK,SAAS,MAAM,OAAO;GACjD,mBAAmB,YACjB,KAAK,mBACL,MAAM,iBACR;GACA,mBAAmB,sBACjB,KAAK,mBACL,MAAM,iBACR;GACA,kBAAkB,CAAC;GACnB,YAAY,CAAC;GACb,IAAI,KAAK,MAAM,MAAM;EACvB;EACA,IACE,KAAK,qBAAqB,KAAA,KAC1B,MAAM,qBAAqB,KAAA,GAC3B;GACA,MAAM,eAAe,YACnB,KAAK,kBACL,MAAM,gBACR;GACA,IAAI,iBAAiB,KAAA,KAAa,aAAa,SAAS,GACtD,eAAe,mBAAmB;EAEtC;EACA,IAAI,KAAK,eAAe,KAAA,KAAa,MAAM,eAAe,KAAA,GAAW;GACnE,MAAM,eAAe,YACnB,KAAK,YACL,MAAM,UACR;GACA,IAAI,iBAAiB,KAAA,KAAa,aAAa,SAAS,GACtD,eAAe,aACb;EAEN;EACA,IACE,KAAK,mBAAmB,KAAA,KACxB,MAAM,mBAAmB,KAAA,GAEzB,eAAe,iBAAiB,mBAC9B,KAAK,gBACL,MAAM,cACR;EAEF,MAAM,MAAM,KAAK;EACjB,OAAO,IAAI,IAAI,cAAc;CAC/B;CAeA,OAAO,WACL,KAC0B;EAC1B,OAAO,MAAM,WAAW,GAAG,KAAM,IAAyB,SAAS;CACrE;CAEA,QAAQ,OAAO,aAAa,KAAc;EACxC,OAAO,KAAK,WAAW,GAAG;CAC5B;AACF"}
|
|
1
|
+
{"version":3,"file":"ai.js","names":[],"sources":["../../src/messages/ai.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n mergeContent,\n _mergeDicts,\n _mergeLists,\n BaseMessageFields,\n} from \"./base.js\";\nimport { getTranslator } from \"./block_translators/index.js\";\nimport { ContentBlock } from \"./content/index.js\";\nimport {\n $InferMessageContent,\n $InferMessageProperty,\n $InferToolCalls,\n MessageStructure,\n} from \"./message.js\";\nimport { mergeResponseMetadata, mergeUsageMetadata } from \"./metadata.js\";\nimport {\n InvalidToolCall,\n ToolCallChunk,\n defaultToolCallParser,\n} from \"./tool.js\";\nimport { collapseToolCallChunks, Constructor } from \"./utils.js\";\n\nfunction coerceToContentBlocks(value: unknown): ContentBlock.Standard[] {\n if (typeof value === \"string\") {\n return value.length > 0 ? [{ type: \"text\", text: value }] : [];\n }\n if (Array.isArray(value)) {\n return value as Array<ContentBlock.Standard>;\n }\n if (value == null) {\n return [];\n }\n return [value as ContentBlock.Standard];\n}\n\nexport interface AIMessageFields<\n TStructure extends MessageStructure = MessageStructure,\n> extends BaseMessageFields<TStructure, \"ai\"> {\n tool_calls?: $InferToolCalls<TStructure>[];\n invalid_tool_calls?: InvalidToolCall[];\n usage_metadata?: $InferMessageProperty<TStructure, \"ai\", \"usage_metadata\">;\n}\n\nexport class AIMessage<TStructure extends MessageStructure = MessageStructure>\n extends BaseMessage<TStructure, \"ai\">\n implements AIMessageFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n usage_metadata?: AIMessageFields<TStructure>[\"usage_metadata\"];\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n constructor(\n fields: $InferMessageContent<TStructure, \"ai\"> | AIMessageFields<TStructure>\n ) {\n let initParams: AIMessageFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n additional_kwargs: {},\n };\n } else {\n initParams = fields;\n const rawToolCalls = initParams.additional_kwargs?.tool_calls;\n const toolCalls = initParams.tool_calls;\n if (\n !(rawToolCalls == null) &&\n rawToolCalls.length > 0 &&\n (toolCalls === undefined || toolCalls.length === 0)\n ) {\n console.warn(\n [\n \"New LangChain packages are available that more efficiently handle\",\n \"tool calling.\\n\\nPlease upgrade your packages to versions that set\",\n \"message tool calls. e.g., `pnpm install @langchain/anthropic`,\",\n \"pnpm install @langchain/openai`, etc.\",\n ].join(\" \")\n );\n }\n try {\n if (!(rawToolCalls == null) && toolCalls === undefined) {\n const [parsedToolCalls, invalidToolCalls] =\n defaultToolCallParser(rawToolCalls);\n initParams.tool_calls =\n (parsedToolCalls as $InferToolCalls<TStructure>[]) ?? [];\n initParams.invalid_tool_calls = invalidToolCalls ?? [];\n } else {\n initParams.tool_calls = initParams.tool_calls ?? [];\n initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? [];\n }\n } catch {\n // Do nothing if parsing fails\n initParams.tool_calls = [] as $InferToolCalls<TStructure>[];\n initParams.invalid_tool_calls = [];\n }\n\n // Convert content to content blocks if output version is v1.\n // Serialized LangGraph payloads often still carry string `content` even\n // when `output_version` is \"v1\"; normalize to an array before mutating.\n if (\n initParams.response_metadata !== undefined &&\n \"output_version\" in initParams.response_metadata &&\n initParams.response_metadata.output_version === \"v1\" &&\n initParams.content !== undefined\n ) {\n initParams.contentBlocks = coerceToContentBlocks(initParams.content);\n initParams.content = undefined;\n }\n\n if (initParams.contentBlocks !== undefined) {\n if (!Array.isArray(initParams.contentBlocks)) {\n initParams.contentBlocks = coerceToContentBlocks(\n initParams.contentBlocks\n );\n }\n // Add constructor tool calls as content blocks only when they are not\n // already represented in the v1 content payload.\n if (initParams.tool_calls) {\n const missingContentBlockToolCalls = initParams.tool_calls.filter(\n (toolCall) =>\n !initParams.contentBlocks?.some(\n (block) =>\n block.type === \"tool_call\" &&\n block.id === toolCall.id &&\n block.name === toolCall.name\n )\n );\n initParams.contentBlocks.push(\n ...missingContentBlockToolCalls.map((toolCall) => ({\n type: \"tool_call\" as const,\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n }))\n );\n }\n // Add content block tool calls that aren't in the constructor tool calls\n const missingToolCalls = initParams.contentBlocks\n .filter<ContentBlock.Tools.ToolCall>(\n (block): block is ContentBlock.Tools.ToolCall =>\n block.type === \"tool_call\"\n )\n .filter(\n (block) =>\n !initParams.tool_calls?.some(\n (toolCall) =>\n toolCall.id === block.id && toolCall.name === block.name\n )\n );\n if (missingToolCalls.length > 0) {\n initParams.tool_calls = [\n ...(initParams.tool_calls ?? []),\n ...missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id!,\n name: block.name,\n args: block.args as Record<string, unknown>,\n })),\n ] as $InferToolCalls<TStructure>[];\n }\n }\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n if (typeof initParams !== \"string\") {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n static lc_name() {\n return \"AIMessage\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n const missingToolCalls = this.tool_calls.filter(\n (block) =>\n !blocks.some((b) => b.id === block.id && b.name === block.name)\n );\n blocks.push(\n ...(missingToolCalls.map((block) => ({\n type: \"tool_call\" as const,\n id: block.id,\n name: block.name,\n args: block.args,\n })) as ContentBlock.Tools.ToolCall[])\n );\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n /**\n * Type guard to check if an object is an AIMessage.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessage<T>;\n /**\n * Type guard to check if an object is an AIMessage.\n * @overload When called with unknown, returns base AIMessage type\n */\n static isInstance(obj: unknown): obj is AIMessage;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessage<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n\n/**\n * @deprecated Use {@link AIMessage.isInstance} instead\n */\nexport function isAIMessage<TStructure extends MessageStructure>(\n x: BaseMessage\n): x is AIMessage<TStructure> {\n return x._getType() === \"ai\";\n}\n\n/**\n * @deprecated Use {@link AIMessageChunk.isInstance} instead\n */\nexport function isAIMessageChunk<TStructure extends MessageStructure>(\n x: BaseMessageChunk\n): x is AIMessageChunk<TStructure> {\n return x._getType() === \"ai\";\n}\n\nexport type AIMessageChunkFields<\n TStructure extends MessageStructure = MessageStructure,\n> = AIMessageFields<TStructure> & {\n tool_call_chunks?: ToolCallChunk[];\n};\n\n/**\n * Represents a chunk of an AI message, which can be concatenated with\n * other AI message chunks.\n */\nexport class AIMessageChunk<\n TStructure extends MessageStructure = MessageStructure,\n>\n extends BaseMessageChunk<TStructure, \"ai\">\n implements AIMessage<TStructure>, AIMessageChunkFields<TStructure>\n{\n readonly type = \"ai\" as const;\n\n tool_calls?: $InferToolCalls<TStructure>[] = [];\n\n invalid_tool_calls?: InvalidToolCall[] = [];\n\n tool_call_chunks?: ToolCallChunk[] = [];\n\n usage_metadata?: AIMessageChunkFields<TStructure>[\"usage_metadata\"];\n\n constructor(\n fields:\n | $InferMessageContent<TStructure, \"ai\">\n | AIMessageChunkFields<TStructure>\n ) {\n let initParams: AIMessageChunkFields<TStructure>;\n if (typeof fields === \"string\" || Array.isArray(fields)) {\n initParams = {\n content: fields,\n tool_calls: [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n };\n } else if (\n fields.tool_call_chunks === undefined ||\n fields.tool_call_chunks.length === 0\n ) {\n initParams = {\n ...fields,\n tool_calls: fields.tool_calls ?? [],\n invalid_tool_calls: [],\n tool_call_chunks: [],\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n } else {\n // Collapsed lazily on first read; see _defineLazyToolCallGetters.\n initParams = {\n ...fields,\n usage_metadata:\n fields.usage_metadata !== undefined\n ? fields.usage_metadata\n : undefined,\n };\n }\n // Sadly, TypeScript only allows super() calls at root if the class has\n // properties with initializers, so we have to check types twice.\n super(initParams);\n this.tool_call_chunks =\n initParams.tool_call_chunks ?? this.tool_call_chunks;\n if (\n typeof fields !== \"string\" &&\n !Array.isArray(fields) &&\n fields.tool_call_chunks !== undefined &&\n fields.tool_call_chunks.length > 0\n ) {\n this._defineLazyToolCallGetters(\n fields.tool_call_chunks.map((chunk) => ({ ...chunk }))\n );\n } else {\n this.tool_calls = initParams.tool_calls ?? this.tool_calls;\n this.invalid_tool_calls =\n initParams.invalid_tool_calls ?? this.invalid_tool_calls;\n }\n this.usage_metadata = initParams.usage_metadata;\n }\n\n /**\n * Lazily collapses tool_call_chunks into tool_calls / invalid_tool_calls on first read.\n * Own-property getters (not prototype accessors) so spread / Object.entries still see\n * the values; mirrored on lc_kwargs so serialized output matches the eager behavior.\n */\n private _defineLazyToolCallGetters(toolCallChunks: ToolCallChunk[]) {\n let collapsed: ReturnType<typeof collapseToolCallChunks> | undefined;\n const getCollapsed = () => {\n collapsed ??= collapseToolCallChunks(toolCallChunks);\n return collapsed;\n };\n const defineLazy = (\n target: object,\n prop: \"tool_calls\" | \"invalid_tool_calls\"\n ) => {\n Object.defineProperty(target, prop, {\n get: () => getCollapsed()[prop],\n // Writing to the property replaces the getter with a plain value,\n // restoring normal assignment semantics.\n set: (value: unknown) => {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n },\n enumerable: true,\n configurable: true,\n });\n };\n defineLazy(this, \"tool_calls\");\n defineLazy(this, \"invalid_tool_calls\");\n defineLazy(this.lc_kwargs, \"tool_calls\");\n defineLazy(this.lc_kwargs, \"invalid_tool_calls\");\n }\n\n get lc_aliases(): Record<string, string> {\n // exclude snake case conversion to pascal case\n return {\n ...super.lc_aliases,\n tool_calls: \"tool_calls\",\n invalid_tool_calls: \"invalid_tool_calls\",\n tool_call_chunks: \"tool_call_chunks\",\n usage_metadata: \"usage_metadata\",\n };\n }\n\n static lc_name() {\n return \"AIMessageChunk\";\n }\n\n get contentBlocks(): Array<ContentBlock.Standard> {\n if (\n this.response_metadata &&\n \"output_version\" in this.response_metadata &&\n this.response_metadata.output_version === \"v1\"\n ) {\n return this.content as Array<ContentBlock.Standard>;\n }\n\n if (\n this.response_metadata &&\n \"model_provider\" in this.response_metadata &&\n typeof this.response_metadata.model_provider === \"string\"\n ) {\n const translator = getTranslator(this.response_metadata.model_provider);\n if (translator) {\n return translator.translateContent(this as AIMessage);\n }\n }\n\n const blocks = super.contentBlocks;\n\n if (this.tool_calls) {\n if (typeof this.content !== \"string\") {\n const contentToolCalls = this.content\n .filter((block) => block.type === \"tool_call\")\n .map((block) => block.id);\n for (const toolCall of this.tool_calls) {\n if (toolCall.id && !contentToolCalls.includes(toolCall.id)) {\n blocks.push({\n ...toolCall,\n type: \"tool_call\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n });\n }\n }\n }\n }\n\n return blocks;\n }\n\n override get _printableFields(): Record<string, unknown> {\n return {\n ...super._printableFields,\n tool_calls: this.tool_calls,\n tool_call_chunks: this.tool_call_chunks,\n invalid_tool_calls: this.invalid_tool_calls,\n usage_metadata: this.usage_metadata,\n };\n }\n\n concat(chunk: AIMessageChunk<TStructure>) {\n const combinedFields: AIMessageChunkFields = {\n content: mergeContent(this.content, chunk.content),\n additional_kwargs: _mergeDicts(\n this.additional_kwargs,\n chunk.additional_kwargs\n ),\n response_metadata: mergeResponseMetadata(\n this.response_metadata,\n chunk.response_metadata\n ),\n tool_call_chunks: [],\n tool_calls: [],\n id: this.id ?? chunk.id,\n };\n if (\n this.tool_call_chunks !== undefined ||\n chunk.tool_call_chunks !== undefined\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[],\n chunk.tool_call_chunks as ContentBlock.Tools.ToolCallChunk[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_call_chunks = rawToolCalls as ToolCallChunk[];\n }\n }\n // Skip when chunks exist: the constructor derives tool_calls, and reading here forces a collapse.\n if (\n (combinedFields.tool_call_chunks === undefined ||\n combinedFields.tool_call_chunks.length === 0) &&\n (this.tool_calls !== undefined || chunk.tool_calls !== undefined)\n ) {\n const rawToolCalls = _mergeLists(\n this.tool_calls as ContentBlock.Tools.ToolCall[],\n chunk.tool_calls as ContentBlock.Tools.ToolCall[]\n );\n if (rawToolCalls !== undefined && rawToolCalls.length > 0) {\n combinedFields.tool_calls =\n rawToolCalls as $InferToolCalls<TStructure>[];\n }\n }\n if (\n this.usage_metadata !== undefined ||\n chunk.usage_metadata !== undefined\n ) {\n combinedFields.usage_metadata = mergeUsageMetadata(\n this.usage_metadata,\n chunk.usage_metadata\n );\n }\n const Cls = this.constructor as Constructor<this>;\n return new Cls(combinedFields);\n }\n\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * Preserves the MessageStructure type parameter when called with a typed BaseMessage.\n * @overload When called with a typed BaseMessage, preserves the TStructure type\n */\n static isInstance<T extends MessageStructure>(\n obj: BaseMessage<T>\n ): obj is BaseMessage<T> & AIMessageChunk<T>;\n /**\n * Type guard to check if an object is an AIMessageChunk.\n * @overload When called with unknown, returns base AIMessageChunk type\n */\n static isInstance(obj: unknown): obj is AIMessageChunk;\n static isInstance<T extends MessageStructure = MessageStructure>(\n obj: BaseMessage<T> | unknown\n ): obj is AIMessageChunk<T> {\n return super.isInstance(obj) && (obj as { type: string }).type === \"ai\";\n }\n\n static [Symbol.hasInstance](obj: unknown) {\n return this.isInstance(obj);\n }\n}\n"],"mappings":"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"}
|
|
@@ -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\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
|
+
{"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 // Preserve LangGraph runtime fields for helpers inside child runnables/tools.\n // @ts-expect-error - Store and context are not declared on RunnableConfig.\n store: config.store,\n context: config.context,\n };\n}\n"],"mappings":"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"}
|
package/dist/runnables/config.js
CHANGED
|
@@ -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\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
|
+
{"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 // Preserve LangGraph runtime fields for helpers inside child runnables/tools.\n // @ts-expect-error - Store and context are not declared on RunnableConfig.\n store: config.store,\n context: config.context,\n };\n}\n"],"mappings":"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"}
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,MAAa,kEAAkD,IAAI,IAAY,CAC7E,eACF,CAAC;;;;;;;AAQD,SAAS,iCACP,aAC2B;CAC3B,IAAI,SAAoC,KAAA;CACxC,KAAK,MAAM,mBAAmB,aAC5B,KAAK,MAAM,cAAc,iBACvB,IACEA,WAAAA,UAAU,WAAW,WAAW,OAAO,KACvC,WAAW,QAAQ,mBAAmB,KAAA,GAEtC,SAASC,iBAAAA,mBAAmB,QAAQ,WAAW,QAAQ,cAAc;CAI3E,OAAO;AACT;AAEA,IAAa,kBAAb,MAAa,wBACHC,qBAAAA,WAEV;CAiBwB;CAhBtB,OAAO;CAEP;CAEA;CAEA;CAEA;CAEA,iBAAiB;CAEjB;CAEA,cAAwB,CAAC;CAEzB,YAAY,SAA0C,CAAC,GAAG;EACxD,MAAM,MAAM;EADQ,KAAA,SAAA;EAEpB,MAAM,EAAE,WAAW,aAAa,QAAQ,UAAU,UAAU,SAAS;EAErE,KAAK,cAAc,gBAAA,GAAeC,UAAAA,sBAAAA,CAAsB;EACxD,KAAK,WAAW;EAChB,KAAK,YAAY;EACjB,KAAK,SAAS,UAAUC,eAAAA,mCAAmC;EAC3D,KAAK,kBAAkB,WAAW,EAAE,GAAG,SAAS,IAAI,KAAA;EACpD,KAAK,cAAc,QAAQ,CAAC;EAE5B,MAAM,gBAAgB,gBAAgB,oBAAoB;EAC1D,IAAI,eACF,KAAK,kBAAkB,aAAa;CAExC;CAEA,MAAgB,WAAW,MAA0B,CAErD;CAEA,MAAM,YAAY,KAAyB;EACzC,6BAA6B,MAAM,GAAG;EACtC,IAAI,CAAC,IAAI,OAAO,kBAEd,MADgB,KAAK,4BAA4B,IAAI,EACzC,CAAC,EAAE,QAAQ;CAE3B;CAEA,MAAM,YAAY,KAAyB;EACzC,6BAA6B,MAAM,GAAG;EACtC,MAAM,UAAU,KAAK,4BAA4B,IAAI,EAAE;EACvD,IAAI,IAAI,OAAO,kBACb,MAAM,SAAS,QAAQ;OAEvB,MAAM,SAAS,SAAS;CAE5B;CAEA,SAAS,KAA0B;EAEjC,MAAM,UAAU,IAAI;EAGpB,IAAI,SAAS,aAAa;GACxB,MAAM,gBAAgB,iCACpB,QAAQ,WACV;GACA,IAAI,kBAAkB,KAAA,GAAW;IAC/B,IAAI,QAAQ,IAAI,SAAS,CAAC;IAC1B,MAAM,WACH,IAAI,MAAM,YAAoD,CAAC;IAClE,SAAS,iBAAiB;IAC1B,IAAI,MAAM,WAAW;GACvB;EACF;CACF;CAEA,sBAAsB,EACpB,UACA,QAIkB;EAClB,IAAI;EACJ,IAAI,aAAa,KAAA,GACf,iBAAiB,KAAK,kBAClB,EAAE,GAAG,KAAK,gBAAgB,IAC1B,KAAA;OACC,IAAI,KAAK,oBAAoB,KAAA,GAClC,iBAAiB,EAAE,GAAG,SAAS;OAC1B;GACL,iBAAiB,EAAE,GAAG,KAAK,gBAAgB;GAC3C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAMhD,IACE,CAAC,OAAO,UAAU,eAAe,KAAK,gBAAgB,GAAG,KACzD,gDAAgD,IAAI,GAAG,GAEvD,eAAe,OAAO;EAG5B;EAEA,MAAM,aAAa,OACf,MAAM,qBAAK,IAAI,IAAI,CAAC,GAAG,KAAK,aAAa,GAAG,IAAI,CAAC,CAAC,IAClD,CAAC,GAAG,KAAK,WAAW;EAExB,MAAM,SAAS,IAAI,gBAAgB;GACjC,GAAG,KAAK;GACR,UAAU;GACV,MAAM;EACR,CAAC;EACD,OAAO,SAAS,KAAK;EACrB,OAAO,aAAa,KAAK;EACzB,OAAO;CACT;;CAGA,kBAA0B;EACxB,OAAO,KAAK;CACd;CAEA,OAAO,IAA6B;EAClC,OAAO,KAAK,WAAW,IAAI,EAAE;CAC/B;CAEA,kBAAkB,SAAkB;EAClC,KAAK,WAAW,IAAI,QAAQ,IAAI,OAAO;EACvC,IAAI,UAAmB;EACvB,MAAM,0BAAU,IAAI,IAAY;EAChC,OAAO,QAAQ,YAAY;GACzB,IAAI,QAAQ,IAAI,QAAQ,EAAE,GAAG;GAC7B,QAAQ,IAAI,QAAQ,EAAE;GAEtB,IAAI,CAAC,QAAQ,YAAY;GACzB,UAAU,QAAQ;EACpB;EACA,QAAQ,MAAM;EAEd,MAAM,QAAQ,CAAC,OAAO;EACtB,OAAO,MAAM,SAAS,GAAG;GACvB,MAAM,UAAU,MAAM,MAAM;GAC5B,IAAI,CAAC,WAAW,QAAQ,IAAI,QAAQ,EAAE,GAAG;GACzC,QAAQ,IAAI,QAAQ,EAAE;GAEtB,KAAK,WAAW,IAAI,QAAQ,IAAI,OAAO;GACvC,IAAI,QAAQ,YACV,MAAM,KAAK,GAAG,QAAQ,UAAU;EAEpC;EAEA,KAAK,SAAS,QAAQ,UAAU,KAAK;EACrC,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,cAAc,QAAQ,gBAAgB,KAAK;EAChD,KAAK,YAAY,QAAQ,wBAAwB,KAAK;EACtD,KAAK,SAAS;GACZ,GAAG,KAAK;GACR,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,aAAa,KAAK;GAClB,WAAW,KAAK;EAClB;CACF;CAEA,4BAA4B,IAAiC;EAC3D,MAAM,UAAU,KAAK,WAAW,IAAI,EAAE;EACtC,IAAI,CAAC,SAAS,OAAO,KAAA;EAErB,OAAO,IAAIC,oBAAAA,QAAQ;GACjB,GAAG;GACH,QAAQ,KAAK;GACb,cAAc,KAAK;GACnB,UAAU,KAAK;GACf,sBAAsB,KAAK;GAC3B,gBAAgB;EAClB,CAAC;CACH;CAEA,OAAO,sBAA2C;EAChD,IAAI;GACF,QAAA,GAIIC,+BAAAA,kBAAAA,CAGA,IAAI;EAEV,QAAQ;GACN;EACF;CACF;CAEA,QAAQ,OAAO,aAAa,UAA4B;EACtD,IAAI,OAAO,aAAa,YAAY,aAAa,MAC/C,OAAO;EAET,MAAM,YAAY;EAClB,OACE,UAAU,aACV,UAAU,SAAS,sBACnB,2BAA2B,aAC3B,OAAO,UAAU,0BAA0B,cAC3C,iCAAiC,aACjC,OAAO,UAAU,gCAAgC;CAErD;AACF;AAEA,SAAS,6BAA6B,QAAyB,KAAgB;CAC7E,IAAI,OAAO,iBAAiB;EAC1B,IAAI,UAAU,CAAC;EACf,MAAM,WACH,IAAI,MAAM,YAAoD,CAAC;EAClE,IAAI,mBAAmB;EACvB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,eAAe,GAI9D,IACE,CAAC,OAAO,UAAU,eAAe,KAAK,UAAU,GAAG,KACnD,gDAAgD,IAAI,GAAG,GAEnD;OAAA,SAAS,SAAS,OAAO;IAC3B,SAAS,OAAO;IAChB,mBAAmB;GACrB;;EAGJ,IAAI,kBACF,IAAI,MAAM,WAAW;CAEzB;CAEA,IAAI,OAAO,YAAY,SAAS,GAC9B,IAAI,OAAO,MAAM,qBACf,IAAI,IAAI,CAAC,GAAI,IAAI,QAAQ,CAAC,GAAI,GAAG,OAAO,WAAW,CAAC,CACtD;AAEJ"}
|
|
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.18",
|
|
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"
|