{"version":3,"file":"utils.cjs","names":["_isToolCall","HumanMessage","AIMessage","SystemMessage","ToolMessage","RemoveMessage","addLangChainErrorFields","isBaseMessage","_isMessageFieldWithRole","FunctionMessage","ChatMessage","HumanMessageChunk","AIMessageChunk","SystemMessageChunk","FunctionMessageChunk","ChatMessageChunk","parsePartialJson"],"sources":["../../src/messages/utils.ts"],"sourcesContent":["import { addLangChainErrorFields } from \"../errors/index.js\";\nimport { SerializedConstructor } from \"../load/serializable.js\";\nimport { _isToolCall } from \"../tools/utils.js\";\nimport { parsePartialJson } from \"../utils/json.js\";\nimport { AIMessage, AIMessageChunk, AIMessageChunkFields } from \"./ai.js\";\nimport {\n  BaseMessageLike,\n  BaseMessage,\n  isBaseMessage,\n  StoredMessage,\n  StoredMessageV1,\n  BaseMessageFields,\n  _isMessageFieldWithRole,\n} from \"./base.js\";\nimport { ChatMessage, ChatMessageFields, ChatMessageChunk } from \"./chat.js\";\nimport {\n  FunctionMessage,\n  FunctionMessageChunk,\n  FunctionMessageFields,\n} from \"./function.js\";\nimport { HumanMessage, HumanMessageChunk } from \"./human.js\";\nimport { RemoveMessage } from \"./modifier.js\";\nimport { SystemMessage, SystemMessageChunk } from \"./system.js\";\nimport {\n  InvalidToolCall,\n  ToolCall,\n  ToolCallChunk,\n  ToolMessage,\n  ToolMessageFields,\n} from \"./tool.js\";\n\nexport type $Expand<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;\n\n/**\n * Extracts the explicitly declared keys from a type T.\n *\n * @template T - The type to extract keys from\n * @returns A union of keys that are not string, number, or symbol\n */\ntype $KnownKeys<T> = {\n  [K in keyof T]: string extends K\n    ? never\n    : number extends K\n      ? never\n      : symbol extends K\n        ? never\n        : K;\n}[keyof T];\n\n/**\n * Detects if T has an index signature.\n *\n * @template T - The type to check for index signatures\n * @returns True if T has an index signature, false otherwise\n */\ntype $HasIndexSignature<T> = string extends keyof T\n  ? true\n  : number extends keyof T\n    ? true\n    : symbol extends keyof T\n      ? true\n      : false;\n\n/**\n * Detects if T has an index signature and no known keys.\n *\n * @template T - The type to check for index signatures and no known keys\n * @returns True if T has an index signature and no known keys, false otherwise\n */\ntype $OnlyIndexSignatures<T> =\n  $HasIndexSignature<T> extends true\n    ? [$KnownKeys<T>] extends [never]\n      ? true\n      : false\n    : false;\n\n/**\n * Recursively merges two object types T and U, with U taking precedence over T.\n *\n * This utility type performs a deep merge of two object types:\n * - For keys that exist in both T and U:\n *   - If both values are objects (Record<string, unknown>), recursively merge them\n *   - Otherwise, U's value takes precedence\n * - For keys that exist only in T, use T's value\n * - For keys that exist only in U, use U's value\n *\n * @template T - The first object type to merge\n * @template U - The second object type to merge (takes precedence over T)\n *\n * @example\n * ```ts\n * type ObjectA = {\n *   shared: { a: string; b: number };\n *   onlyInA: boolean;\n * };\n *\n * type ObjectB = {\n *   shared: { b: string; c: Date };\n *   onlyInB: symbol;\n * };\n *\n * type Merged = $MergeObjects<ObjectA, ObjectB>;\n * // Result: {\n * //   shared: { a: string; b: string; c: Date };\n * //   onlyInA: boolean;\n * //   onlyInB: symbol;\n * // }\n * ```\n */\nexport type $MergeObjects<T, U> =\n  // If U is purely index-signature based, prefer U as a whole\n  $OnlyIndexSignatures<U> extends true\n    ? U\n    : // If T is purely index-signature based, prefer U as a whole (prevents leaking broad index signatures)\n      $OnlyIndexSignatures<T> extends true\n      ? U\n      : {\n          [K in keyof T | keyof U]: K extends keyof T\n            ? K extends keyof U\n              ? T[K] extends Record<string, unknown>\n                ? U[K] extends Record<string, unknown>\n                  ? $MergeObjects<T[K], U[K]>\n                  : U[K]\n                : U[K]\n              : T[K]\n            : K extends keyof U\n              ? U[K]\n              : never;\n        };\n\n/**\n * Merges two discriminated unions A and B based on a discriminator key (defaults to \"type\").\n * For each possible value of the discriminator across both unions:\n * - If B has a member with that discriminator value, use B's member\n * - Otherwise use A's member with that discriminator value\n * This effectively merges the unions while giving B's members precedence over A's members.\n *\n * @template A - First discriminated union type that extends Record<Key, PropertyKey>\n * @template B - Second discriminated union type that extends Record<Key, PropertyKey>\n * @template Key - The discriminator key property, defaults to \"type\"\n */\nexport type $MergeDiscriminatedUnion<\n  A extends Record<Key, PropertyKey>,\n  B extends Record<Key, PropertyKey>,\n  Key extends PropertyKey = \"type\",\n> = {\n  // Create a mapped type over all possible discriminator values from both A and B\n  [T in A[Key] | B[Key]]: [Extract<B, Record<Key, T>>] extends [never] // Check if B has a member with this discriminator value\n    ? // If B doesn't have this discriminator value, use A's member\n      Extract<A, Record<Key, T>>\n    : // If B does have this discriminator value, merge A's and B's members (B takes precedence)\n      [Extract<A, Record<Key, T>>] extends [never]\n      ? Extract<B, Record<Key, T>>\n      : $MergeObjects<Extract<A, Record<Key, T>>, Extract<B, Record<Key, T>>>;\n  // Index into the mapped type with all possible discriminator values\n  // This converts the mapped type back into a union\n}[A[Key] | B[Key]];\n\nexport type Constructor<T> = new (...args: unknown[]) => T;\n\n/**\n * Immediately-invoked function expression.\n *\n * @param fn - The function to execute\n * @returns The result of the function\n */\nexport const iife = <T>(fn: () => T) => fn();\n\nfunction _coerceToolCall(\n  toolCall: ToolCall | Record<string, unknown>\n): ToolCall {\n  if (_isToolCall(toolCall)) {\n    return toolCall;\n  } else if (\n    typeof toolCall.id === \"string\" &&\n    toolCall.type === \"function\" &&\n    typeof toolCall.function === \"object\" &&\n    toolCall.function !== null &&\n    \"arguments\" in toolCall.function &&\n    typeof toolCall.function.arguments === \"string\" &&\n    \"name\" in toolCall.function &&\n    typeof toolCall.function.name === \"string\"\n  ) {\n    // Handle OpenAI tool call format\n    return {\n      id: toolCall.id,\n      args: JSON.parse(toolCall.function.arguments),\n      name: toolCall.function.name,\n      type: \"tool_call\",\n    };\n  } else {\n    // TODO: Throw an error?\n    return toolCall as unknown as ToolCall;\n  }\n}\n\nfunction isSerializedConstructor(x: unknown): x is SerializedConstructor {\n  return (\n    typeof x === \"object\" &&\n    x != null &&\n    (x as SerializedConstructor).lc === 1 &&\n    Array.isArray((x as SerializedConstructor).id) &&\n    (x as SerializedConstructor).kwargs != null &&\n    typeof (x as SerializedConstructor).kwargs === \"object\"\n  );\n}\n\nfunction _constructMessageFromParams(\n  params:\n    | (BaseMessageFields & { type: string } & Record<string, unknown>)\n    | SerializedConstructor\n) {\n  let type: string;\n  let rest: BaseMessageFields & Record<string, unknown>;\n  // Support serialized messages\n  if (isSerializedConstructor(params)) {\n    const className = params.id.at(-1);\n    if (className === \"HumanMessage\" || className === \"HumanMessageChunk\") {\n      type = \"user\";\n    } else if (className === \"AIMessage\" || className === \"AIMessageChunk\") {\n      type = \"assistant\";\n    } else if (\n      className === \"SystemMessage\" ||\n      className === \"SystemMessageChunk\"\n    ) {\n      type = \"system\";\n    } else if (\n      className === \"FunctionMessage\" ||\n      className === \"FunctionMessageChunk\"\n    ) {\n      type = \"function\";\n    } else if (\n      className === \"ToolMessage\" ||\n      className === \"ToolMessageChunk\"\n    ) {\n      type = \"tool\";\n    } else {\n      type = \"unknown\";\n    }\n    rest = params.kwargs as BaseMessageFields;\n  } else {\n    const { type: extractedType, ...otherParams } = params;\n    type = extractedType;\n    rest = otherParams;\n  }\n  if (type === \"human\" || type === \"user\") {\n    return new HumanMessage(rest);\n  } else if (type === \"ai\" || type === \"assistant\") {\n    const { tool_calls: rawToolCalls, ...other } = rest;\n    if (!Array.isArray(rawToolCalls)) {\n      return new AIMessage(rest);\n    }\n    const tool_calls = rawToolCalls.map(_coerceToolCall);\n    return new AIMessage({ ...other, tool_calls });\n  } else if (type === \"system\") {\n    return new SystemMessage(rest);\n  } else if (type === \"developer\") {\n    return new SystemMessage({\n      ...rest,\n      additional_kwargs: {\n        ...rest.additional_kwargs,\n        __openai_role__: \"developer\",\n      },\n    });\n  } else if (type === \"tool\" && \"tool_call_id\" in rest) {\n    return new ToolMessage({\n      ...rest,\n      content: rest.content,\n      tool_call_id: rest.tool_call_id as string,\n      name: rest.name,\n    });\n  } else if (type === \"remove\" && \"id\" in rest && typeof rest.id === \"string\") {\n    return new RemoveMessage({ ...rest, id: rest.id });\n  } else {\n    const error = addLangChainErrorFields(\n      new Error(\n        `Unable to coerce message from array: only human, AI, system, developer, or tool message coercion is currently supported.\\n\\nReceived: ${JSON.stringify(\n          params,\n          null,\n          2\n        )}`\n      ),\n      \"MESSAGE_COERCION_FAILURE\"\n    );\n    throw error;\n  }\n}\n\nexport function coerceMessageLikeToMessage(\n  messageLike: BaseMessageLike\n): BaseMessage {\n  if (typeof messageLike === \"string\") {\n    return new HumanMessage(messageLike);\n  } else if (isBaseMessage(messageLike)) {\n    return messageLike;\n  }\n  if (Array.isArray(messageLike)) {\n    const [type, content] = messageLike;\n    return _constructMessageFromParams({ type, content });\n  } else if (_isMessageFieldWithRole(messageLike)) {\n    const { role: type, ...rest } = messageLike;\n    return _constructMessageFromParams({ ...rest, type });\n  } else {\n    return _constructMessageFromParams(messageLike);\n  }\n}\n\n/**\n * Renders a single content block to a compact string representation.\n * Text blocks are returned as-is; multimodal blocks (image, audio, video, file)\n * become short placeholders like `[image]` so their existence is preserved\n * without inflating token counts with base64 data or metadata.\n */\nfunction _contentBlockToString(\n  block: string | { type?: string; [key: string]: unknown }\n): string {\n  if (typeof block === \"string\") return block;\n  switch (block.type) {\n    case \"text\":\n      return (block as { text: string }).text ?? \"\";\n    case \"text-plain\":\n      return (block as { text?: string }).text ?? \"[text-plain file]\";\n    case \"image\":\n    case \"image_url\":\n      return \"[image]\";\n    case \"audio\":\n    case \"input_audio\":\n      return \"[audio]\";\n    case \"video\":\n      return \"[video]\";\n    case \"file\":\n      return \"[file]\";\n    case \"reasoning\":\n    case \"tool_call\":\n    case \"tool_call_chunk\":\n    case \"invalid_tool_call\":\n    case \"server_tool_call\":\n    case \"server_tool_call_chunk\":\n    case \"server_tool_call_result\":\n    case \"non_standard\":\n      return \"\";\n    default:\n      return block.type ? `[${block.type}]` : \"\";\n  }\n}\n\n/**\n * This function is used by memory classes to get a string representation\n * of the chat message history, based on the message content and role.\n *\n * Produces compact output like:\n * ```\n * Human: What's the weather?\n * AI: Let me check...[tool_calls]\n * Tool: 72°F and sunny\n * ```\n *\n * This avoids token inflation from metadata when stringifying message objects directly.\n */\nexport function getBufferString(\n  messages: BaseMessage[],\n  humanPrefix = \"Human\",\n  aiPrefix = \"AI\"\n): string {\n  const string_messages: string[] = [];\n  for (const m of messages) {\n    let role: string;\n    if (m.type === \"human\") {\n      role = humanPrefix;\n    } else if (m.type === \"ai\") {\n      role = aiPrefix;\n    } else if (m.type === \"system\") {\n      role = \"System\";\n    } else if (m.type === \"tool\") {\n      role = \"Tool\";\n    } else if (m.type === \"generic\") {\n      role = (m as ChatMessage).role;\n    } else {\n      throw new Error(`Got unsupported message type: ${m.type}`);\n    }\n    const nameStr = m.name ? `${m.name}, ` : \"\";\n\n    // Render content compactly: text as-is, multimodal blocks as placeholders\n    const readableContent =\n      typeof m.content === \"string\"\n        ? m.content\n        : Array.isArray(m.content)\n          ? m.content.map(_contentBlockToString).filter(Boolean).join(\"\")\n          : \"\";\n\n    let message = `${role}: ${nameStr}${readableContent}`;\n\n    // Include tool calls for AI messages (matching Python's get_buffer_string behavior)\n    if (m.type === \"ai\") {\n      const aiMessage = m as AIMessage;\n      if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) {\n        message += JSON.stringify(aiMessage.tool_calls);\n      } else if (\n        aiMessage.additional_kwargs &&\n        \"function_call\" in aiMessage.additional_kwargs\n      ) {\n        // Legacy behavior assumes only one function call per message\n        message += JSON.stringify(aiMessage.additional_kwargs.function_call);\n      }\n    }\n\n    string_messages.push(message);\n  }\n  return string_messages.join(\"\\n\");\n}\n\n/**\n * Maps messages from an older format (V1) to the current `StoredMessage`\n * format. If the message is already in the `StoredMessage` format, it is\n * returned as is. Otherwise, it transforms the V1 message into a\n * `StoredMessage`. This function is important for maintaining\n * compatibility with older message formats.\n */\nfunction mapV1MessageToStoredMessage(\n  message: StoredMessage | StoredMessageV1\n): StoredMessage {\n  // TODO: Remove this mapper when we deprecate the old message format.\n  if ((message as StoredMessage).data !== undefined) {\n    return message as StoredMessage;\n  } else {\n    const v1Message = message as StoredMessageV1;\n    return {\n      type: v1Message.type,\n      data: {\n        content: v1Message.text,\n        role: v1Message.role,\n        name: undefined,\n        tool_call_id: undefined,\n      },\n    };\n  }\n}\n\nexport function mapStoredMessageToChatMessage(message: StoredMessage) {\n  const storedMessage = mapV1MessageToStoredMessage(message);\n  switch (storedMessage.type) {\n    case \"human\":\n      return new HumanMessage(storedMessage.data);\n    case \"ai\":\n      return new AIMessage(storedMessage.data);\n    case \"system\":\n      return new SystemMessage(storedMessage.data);\n    case \"function\":\n      if (storedMessage.data.name === undefined) {\n        throw new Error(\"Name must be defined for function messages\");\n      }\n      return new FunctionMessage(storedMessage.data as FunctionMessageFields);\n    case \"tool\":\n      if (storedMessage.data.tool_call_id === undefined) {\n        throw new Error(\"Tool call ID must be defined for tool messages\");\n      }\n      return new ToolMessage(storedMessage.data as ToolMessageFields);\n    case \"generic\": {\n      if (storedMessage.data.role === undefined) {\n        throw new Error(\"Role must be defined for chat messages\");\n      }\n      return new ChatMessage(storedMessage.data as ChatMessageFields);\n    }\n    default:\n      throw new Error(`Got unexpected type: ${storedMessage.type}`);\n  }\n}\n\n/**\n * Transforms an array of `StoredMessage` instances into an array of\n * `BaseMessage` instances. It uses the `mapV1MessageToStoredMessage`\n * function to ensure all messages are in the `StoredMessage` format, then\n * creates new instances of the appropriate `BaseMessage` subclass based\n * on the type of each message. This function is used to prepare stored\n * messages for use in a chat context.\n */\nexport function mapStoredMessagesToChatMessages(\n  messages: StoredMessage[]\n): BaseMessage[] {\n  return messages.map(mapStoredMessageToChatMessage);\n}\n\n/**\n * Transforms an array of `BaseMessage` instances into an array of\n * `StoredMessage` instances. It does this by calling the `toDict` method\n * on each `BaseMessage`, which returns a `StoredMessage`. This function\n * is used to prepare chat messages for storage.\n */\nexport function mapChatMessagesToStoredMessages(\n  messages: BaseMessage[]\n): StoredMessage[] {\n  return messages.map((message) => message.toDict());\n}\n\nexport function convertToChunk(message: BaseMessage) {\n  const type = message._getType();\n  if (type === \"human\") {\n    return new HumanMessageChunk({ ...message });\n  } else if (type === \"ai\") {\n    let aiChunkFields: AIMessageChunkFields = {\n      ...message,\n    };\n    if (\"tool_calls\" in aiChunkFields) {\n      aiChunkFields = {\n        ...aiChunkFields,\n        tool_call_chunks: aiChunkFields.tool_calls?.map((tc) => ({\n          ...tc,\n          type: \"tool_call_chunk\",\n          index: undefined,\n          args: JSON.stringify(tc.args),\n        })),\n      };\n    }\n    return new AIMessageChunk({ ...aiChunkFields });\n  } else if (type === \"system\") {\n    return new SystemMessageChunk({ ...message });\n  } else if (type === \"function\") {\n    return new FunctionMessageChunk({ ...message });\n  } else if (ChatMessage.isInstance(message)) {\n    return new ChatMessageChunk({ ...message });\n  } else {\n    throw new Error(\"Unknown message type.\");\n  }\n}\n\n/**\n * Collapses an array of tool call chunks into complete tool calls.\n *\n * This function groups tool call chunks by their id and/or index, then attempts to\n * parse and validate the accumulated arguments for each group. Successfully parsed\n * tool calls are returned as valid `ToolCall` objects, while malformed ones are\n * returned as `InvalidToolCall` objects.\n *\n * @param chunks - An array of `ToolCallChunk` objects to collapse\n * @returns An object containing:\n *   - `tool_call_chunks`: The original input chunks\n *   - `tool_calls`: An array of successfully parsed and validated tool calls\n *   - `invalid_tool_calls`: An array of tool calls that failed parsing or validation\n *\n * @remarks\n * Chunks are grouped using the following matching logic:\n * - If a chunk has both an id and index, it matches chunks with the same id and index\n * - If a chunk has only an id, it matches chunks with the same id\n * - If a chunk has only an index, it matches chunks with the same index\n *\n * For each group, the function:\n * 1. Concatenates all `args` strings from the chunks\n * 2. Attempts to parse the concatenated string as JSON\n * 3. Validates that the result is a non-null object with a valid id\n * 4. Creates either a `ToolCall` (if valid) or `InvalidToolCall` (if invalid)\n */\nexport function collapseToolCallChunks(chunks: ToolCallChunk[]): {\n  tool_call_chunks: ToolCallChunk[];\n  tool_calls: ToolCall[];\n  invalid_tool_calls: InvalidToolCall[];\n} {\n  const groupedToolCallChunks = chunks.reduce((acc, chunk) => {\n    const matchedChunkIndex = acc.findIndex(([match]) => {\n      // If chunk has an id and index, match if both are present\n      if (\n        \"id\" in chunk &&\n        chunk.id &&\n        \"index\" in chunk &&\n        chunk.index !== undefined\n      ) {\n        return chunk.id === match.id && chunk.index === match.index;\n      }\n      // If chunk has an id, we match on id\n      if (\"id\" in chunk && chunk.id) {\n        return chunk.id === match.id;\n      }\n      // If chunk has an index, we match on index\n      if (\"index\" in chunk && chunk.index !== undefined) {\n        return chunk.index === match.index;\n      }\n      return false;\n    });\n    if (matchedChunkIndex !== -1) {\n      acc[matchedChunkIndex].push(chunk);\n    } else {\n      acc.push([chunk]);\n    }\n    return acc;\n  }, [] as ToolCallChunk[][]);\n\n  const toolCalls: ToolCall[] = [];\n  const invalidToolCalls: InvalidToolCall[] = [];\n  for (const chunks of groupedToolCallChunks) {\n    let parsedArgs: Record<string, unknown> | null = null;\n    const name = chunks[0]?.name ?? \"\";\n    const joinedArgs = chunks\n      .map((c) => c.args || \"\")\n      .join(\"\")\n      .trim();\n    const argsStr = joinedArgs.length ? joinedArgs : \"{}\";\n    const id = chunks[0]?.id;\n    try {\n      parsedArgs = parsePartialJson(argsStr);\n      if (\n        !id ||\n        parsedArgs === null ||\n        typeof parsedArgs !== \"object\" ||\n        Array.isArray(parsedArgs)\n      ) {\n        throw new Error(\"Malformed tool call chunk args.\");\n      }\n      toolCalls.push({\n        name,\n        args: parsedArgs,\n        id,\n        type: \"tool_call\",\n      });\n    } catch {\n      invalidToolCalls.push({\n        name,\n        args: argsStr,\n        id,\n        error: \"Malformed args.\",\n        type: \"invalid_tool_call\",\n      });\n    }\n  }\n  return {\n    tool_call_chunks: chunks,\n    tool_calls: toolCalls,\n    invalid_tool_calls: invalidToolCalls,\n  };\n}\n"],"mappings":"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"}