{"version":3,"file":"utils.cjs","names":["AIMessageChunk"],"sources":["../src/utils.ts"],"sourcesContent":["import {\n  AIMessage,\n  AIMessageChunk,\n  BaseMessage,\n  HumanMessage,\n  MessageContentText,\n  SystemMessage,\n  ToolMessage,\n  UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type {\n  Message as OllamaMessage,\n  ToolCall as OllamaToolCall,\n} from \"ollama\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport function convertOllamaMessagesToLangChain(\n  messages: OllamaMessage,\n  extra?: {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    responseMetadata?: Record<string, any>;\n    usageMetadata?: UsageMetadata;\n  }\n): AIMessageChunk {\n  return new AIMessageChunk({\n    content: messages.content ?? \"\",\n    additional_kwargs:\n      messages.thinking && messages.thinking !== \"\"\n        ? { reasoning_content: messages.thinking }\n        : {},\n    tool_call_chunks: messages.tool_calls?.map((tc) => ({\n      name: tc.function.name,\n      args: JSON.stringify(tc.function.arguments),\n      type: \"tool_call_chunk\",\n      index: 0,\n      id: uuidv4(),\n    })),\n    response_metadata: {\n      ...extra?.responseMetadata,\n      model_provider: \"ollama\",\n    },\n    usage_metadata: extra?.usageMetadata,\n  });\n}\n\nfunction extractBase64FromDataUrl(dataUrl: string): string {\n  const match = dataUrl.match(/^data:.*?;base64,(.*)$/);\n  return match ? match[1] : \"\";\n}\n\nfunction convertAMessagesToOllama(messages: AIMessage): OllamaMessage[] {\n  if (typeof messages.content === \"string\") {\n    if (messages.tool_calls?.length) {\n      const toolCalls: OllamaToolCall[] = messages.tool_calls.map((tc) => ({\n        id: tc.id,\n        type: \"function\",\n        function: {\n          name: tc.name,\n          arguments: tc.args,\n        },\n      }));\n      return [\n        {\n          role: \"assistant\",\n          content: messages.content,\n          tool_calls: toolCalls,\n        },\n      ];\n    }\n    return [\n      {\n        role: \"assistant\",\n        content: messages.content,\n      },\n    ];\n  }\n\n  const textFields = messages.content.filter(\n    (c) => c.type === \"text\" && typeof c.text === \"string\"\n  );\n  const textMessages = (textFields as MessageContentText[]).map((c) => ({\n    role: \"assistant\",\n    content: c.text,\n  }));\n  let toolCallMsgs: OllamaMessage | undefined;\n\n  if (\n    messages.content.find((c) => c.type === \"tool_use\") &&\n    messages.tool_calls?.length\n  ) {\n    // `tool_use` content types are accepted if the message has tool calls\n    const toolCalls: OllamaToolCall[] | undefined = messages.tool_calls?.map(\n      (tc) => ({\n        id: tc.id,\n        type: \"function\",\n        function: {\n          name: tc.name,\n          arguments: tc.args,\n        },\n      })\n    );\n\n    if (toolCalls) {\n      toolCallMsgs = {\n        role: \"assistant\",\n        tool_calls: toolCalls,\n        content: \"\",\n      };\n    }\n  } else if (\n    messages.content.find((c) => c.type === \"tool_use\") &&\n    !messages.tool_calls?.length\n  ) {\n    throw new Error(\n      \"'tool_use' content type is not supported without tool calls.\"\n    );\n  }\n\n  return [...textMessages, ...(toolCallMsgs ? [toolCallMsgs] : [])];\n}\n\nfunction convertHumanGenericMessagesToOllama(\n  message: HumanMessage\n): OllamaMessage[] {\n  if (typeof message.content === \"string\") {\n    return [\n      {\n        role: \"user\",\n        content: message.content,\n      },\n    ];\n  }\n  return message.content.map((c) => {\n    if (c.type === \"text\") {\n      return {\n        role: \"user\",\n        content: c.text,\n      };\n    } else if (c.type === \"image_url\") {\n      if (typeof c.image_url === \"string\") {\n        return {\n          role: \"user\",\n          content: \"\",\n          images: [extractBase64FromDataUrl(c.image_url)],\n        };\n      } else if (c.image_url.url && typeof c.image_url.url === \"string\") {\n        return {\n          role: \"user\",\n          content: \"\",\n          images: [extractBase64FromDataUrl(c.image_url.url)],\n        };\n      }\n    }\n    throw new Error(`Unsupported content type: ${c.type}`);\n  });\n}\n\nfunction convertSystemMessageToOllama(message: SystemMessage): OllamaMessage[] {\n  if (typeof message.content === \"string\") {\n    return [\n      {\n        role: \"system\",\n        content: message.content,\n      },\n    ];\n  } else if (\n    message.content.every(\n      (c) => c.type === \"text\" && typeof c.text === \"string\"\n    )\n  ) {\n    return (message.content as MessageContentText[]).map((c) => ({\n      role: \"system\",\n      content: c.text,\n    }));\n  } else {\n    throw new Error(\n      `Unsupported content type(s): ${message.content\n        .map((c) => c.type)\n        .join(\", \")}`\n    );\n  }\n}\n\nfunction convertToolMessageToOllama(message: ToolMessage): OllamaMessage[] {\n  if (typeof message.content !== \"string\") {\n    throw new Error(\"Non string tool message content is not supported\");\n  }\n  return [\n    {\n      role: \"tool\",\n      content: message.content,\n    },\n  ];\n}\n\nexport function convertToOllamaMessages(\n  messages: BaseMessage[]\n): OllamaMessage[] {\n  return messages.flatMap((msg) => {\n    if ([\"human\", \"generic\"].includes(msg._getType())) {\n      return convertHumanGenericMessagesToOllama(msg);\n    } else if (msg._getType() === \"ai\") {\n      return convertAMessagesToOllama(msg);\n    } else if (msg._getType() === \"system\") {\n      return convertSystemMessageToOllama(msg);\n    } else if (msg._getType() === \"tool\") {\n      return convertToolMessageToOllama(msg as ToolMessage);\n    } else {\n      throw new Error(`Unsupported message type: ${msg._getType()}`);\n    }\n  });\n}\n"],"mappings":"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"}