UNPKG

@langchain/core

Version:
266 lines (264 loc) 9.62 kB
import { parsePartialJson } from "../utils/json.js"; import { BaseMessage, BaseMessageChunk, _mergeDicts, _mergeLists, mergeContent } from "./base.js"; import { getTranslator } from "./block_translators/index.js"; import { mergeResponseMetadata, mergeUsageMetadata } from "./metadata.js"; import { defaultToolCallParser } from "./tool.js"; //#region src/messages/ai.ts var AIMessage = class extends BaseMessage { type = "ai"; tool_calls = []; invalid_tool_calls = []; usage_metadata; get lc_aliases() { return { ...super.lc_aliases, tool_calls: "tool_calls", invalid_tool_calls: "invalid_tool_calls" }; } constructor(fields) { let initParams; if (typeof fields === "string" || Array.isArray(fields)) initParams = { content: fields, tool_calls: [], invalid_tool_calls: [], additional_kwargs: {} }; else { initParams = fields; const rawToolCalls = initParams.additional_kwargs?.tool_calls; const toolCalls = initParams.tool_calls; if (!(rawToolCalls == null) && rawToolCalls.length > 0 && (toolCalls === void 0 || toolCalls.length === 0)) console.warn([ "New LangChain packages are available that more efficiently handle", "tool calling.\n\nPlease upgrade your packages to versions that set", "message tool calls. e.g., `pnpm install @langchain/anthropic`,", "pnpm install @langchain/openai`, etc." ].join(" ")); try { if (!(rawToolCalls == null) && toolCalls === void 0) { const [toolCalls$1, invalidToolCalls] = defaultToolCallParser(rawToolCalls); initParams.tool_calls = toolCalls$1 ?? []; initParams.invalid_tool_calls = invalidToolCalls ?? []; } else { initParams.tool_calls = initParams.tool_calls ?? []; initParams.invalid_tool_calls = initParams.invalid_tool_calls ?? []; } } catch { initParams.tool_calls = []; initParams.invalid_tool_calls = []; } if (initParams.response_metadata !== void 0 && "output_version" in initParams.response_metadata && initParams.response_metadata.output_version === "v1") { initParams.contentBlocks = initParams.content; initParams.content = void 0; } if (initParams.contentBlocks !== void 0) { initParams.contentBlocks.push(...initParams.tool_calls.map((toolCall) => ({ type: "tool_call", id: toolCall.id, name: toolCall.name, args: toolCall.args }))); const missingToolCalls = initParams.contentBlocks.filter((block) => block.type === "tool_call").filter((block) => !initParams.tool_calls?.some((toolCall) => toolCall.id === block.id && toolCall.name === block.name)); if (missingToolCalls.length > 0) initParams.tool_calls = missingToolCalls.map((block) => ({ type: "tool_call", id: block.id, name: block.name, args: block.args })); } } super(initParams); if (typeof initParams !== "string") { this.tool_calls = initParams.tool_calls ?? this.tool_calls; this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls; } this.usage_metadata = initParams.usage_metadata; } static lc_name() { return "AIMessage"; } get contentBlocks() { if (this.response_metadata && "output_version" in this.response_metadata && this.response_metadata.output_version === "v1") return this.content; if (this.response_metadata && "model_provider" in this.response_metadata && typeof this.response_metadata.model_provider === "string") { const translator = getTranslator(this.response_metadata.model_provider); if (translator) return translator.translateContent(this); } const blocks = super.contentBlocks; if (this.tool_calls) { const missingToolCalls = this.tool_calls.filter((block) => !blocks.some((b) => b.id === block.id && b.name === block.name)); blocks.push(...missingToolCalls.map((block) => ({ ...block, type: "tool_call", id: block.id, name: block.name, args: block.args }))); } return blocks; } get _printableFields() { return { ...super._printableFields, tool_calls: this.tool_calls, invalid_tool_calls: this.invalid_tool_calls, usage_metadata: this.usage_metadata }; } static isInstance(obj) { return super.isInstance(obj) && obj.type === "ai"; } }; /** * @deprecated Use {@link AIMessage.isInstance} instead */ function isAIMessage(x) { return x._getType() === "ai"; } /** * @deprecated Use {@link AIMessageChunk.isInstance} instead */ function isAIMessageChunk(x) { return x._getType() === "ai"; } /** * Represents a chunk of an AI message, which can be concatenated with * other AI message chunks. */ var AIMessageChunk = class extends BaseMessageChunk { type = "ai"; tool_calls = []; invalid_tool_calls = []; tool_call_chunks = []; usage_metadata; constructor(fields) { let initParams; if (typeof fields === "string" || Array.isArray(fields)) initParams = { content: fields, tool_calls: [], invalid_tool_calls: [], tool_call_chunks: [] }; else if (fields.tool_call_chunks === void 0 || fields.tool_call_chunks.length === 0) initParams = { ...fields, tool_calls: fields.tool_calls ?? [], invalid_tool_calls: [], tool_call_chunks: [], usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0 }; else { const toolCallChunks = fields.tool_call_chunks ?? []; const groupedToolCallChunks = toolCallChunks.reduce((acc, chunk) => { const matchedChunkIndex = acc.findIndex(([match]) => { if ("id" in chunk && chunk.id && "index" in chunk && chunk.index !== void 0) return chunk.id === match.id && chunk.index === match.index; if ("id" in chunk && chunk.id) return chunk.id === match.id; if ("index" in chunk && chunk.index !== void 0) return chunk.index === match.index; return false; }); if (matchedChunkIndex !== -1) acc[matchedChunkIndex].push(chunk); else acc.push([chunk]); return acc; }, []); const toolCalls = []; const invalidToolCalls = []; for (const chunks of groupedToolCallChunks) { let parsedArgs = null; const name = chunks[0]?.name ?? ""; const joinedArgs = chunks.map((c) => c.args || "").join(""); const argsStr = joinedArgs.length ? joinedArgs : "{}"; const id = chunks[0]?.id; try { parsedArgs = parsePartialJson(argsStr); if (!id || parsedArgs === null || typeof parsedArgs !== "object" || Array.isArray(parsedArgs)) throw new Error("Malformed tool call chunk args."); toolCalls.push({ name, args: parsedArgs, id, type: "tool_call" }); } catch { invalidToolCalls.push({ name, args: argsStr, id, error: "Malformed args.", type: "invalid_tool_call" }); } } initParams = { ...fields, tool_calls: toolCalls, invalid_tool_calls: invalidToolCalls, usage_metadata: fields.usage_metadata !== void 0 ? fields.usage_metadata : void 0 }; } super(initParams); this.tool_call_chunks = initParams.tool_call_chunks ?? this.tool_call_chunks; this.tool_calls = initParams.tool_calls ?? this.tool_calls; this.invalid_tool_calls = initParams.invalid_tool_calls ?? this.invalid_tool_calls; this.usage_metadata = initParams.usage_metadata; } get lc_aliases() { return { ...super.lc_aliases, tool_calls: "tool_calls", invalid_tool_calls: "invalid_tool_calls", tool_call_chunks: "tool_call_chunks" }; } static lc_name() { return "AIMessageChunk"; } get contentBlocks() { if (this.response_metadata && "output_version" in this.response_metadata && this.response_metadata.output_version === "v1") return this.content; if (this.response_metadata && "model_provider" in this.response_metadata && typeof this.response_metadata.model_provider === "string") { const translator = getTranslator(this.response_metadata.model_provider); if (translator) return translator.translateContent(this); } const blocks = super.contentBlocks; if (this.tool_calls) { if (typeof this.content !== "string") { const contentToolCalls = this.content.filter((block) => block.type === "tool_call").map((block) => block.id); for (const toolCall of this.tool_calls) if (toolCall.id && !contentToolCalls.includes(toolCall.id)) blocks.push({ ...toolCall, type: "tool_call", id: toolCall.id, name: toolCall.name, args: toolCall.args }); } } return blocks; } get _printableFields() { return { ...super._printableFields, tool_calls: this.tool_calls, tool_call_chunks: this.tool_call_chunks, invalid_tool_calls: this.invalid_tool_calls, usage_metadata: this.usage_metadata }; } concat(chunk) { const combinedFields = { content: mergeContent(this.content, chunk.content), additional_kwargs: _mergeDicts(this.additional_kwargs, chunk.additional_kwargs), response_metadata: mergeResponseMetadata(this.response_metadata, chunk.response_metadata), tool_call_chunks: [], id: this.id ?? chunk.id }; if (this.tool_call_chunks !== void 0 || chunk.tool_call_chunks !== void 0) { const rawToolCalls = _mergeLists(this.tool_call_chunks, chunk.tool_call_chunks); if (rawToolCalls !== void 0 && rawToolCalls.length > 0) combinedFields.tool_call_chunks = rawToolCalls; } if (this.usage_metadata !== void 0 || chunk.usage_metadata !== void 0) combinedFields.usage_metadata = mergeUsageMetadata(this.usage_metadata, chunk.usage_metadata); const Cls = this.constructor; return new Cls(combinedFields); } static isInstance(obj) { return super.isInstance(obj) && obj.type === "ai"; } }; //#endregion export { AIMessage, AIMessageChunk, isAIMessage, isAIMessageChunk }; //# sourceMappingURL=ai.js.map