{"version":3,"file":"utils.cjs","names":[],"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 { v4 as uuidv4 } from \"uuid\";\nimport Cerebras from \"@cerebras/cerebras_cloud_sdk\";\nimport { ToolChoice } from \"@langchain/core/language_models/chat_models\";\n\nexport type CerebrasMessageParam =\n  | Cerebras.ChatCompletionCreateParams.AssistantMessageRequest\n  | Cerebras.ChatCompletionCreateParams.SystemMessageRequest\n  | Cerebras.ChatCompletionCreateParams.ToolMessageRequest\n  | Cerebras.ChatCompletionCreateParams.UserMessageRequest;\nexport type CerebrasToolCall =\n  Cerebras.ChatCompletion.ChatCompletionResponse.Choice.Message.ToolCall;\n\nexport function convertCerebrasMessagesToLangChain(\n  messages: Cerebras.ChatCompletion.ChatCompletionResponse.Choice.Message,\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    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: extra?.responseMetadata,\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 convertAIMessageToCerebras(\n  messages: AIMessage\n): CerebrasMessageParam[] {\n  const toolCalls: CerebrasToolCall[] | undefined = messages.tool_calls?.map(\n    (tc) => ({\n      id: tc.id!,\n      type: \"function\",\n      function: {\n        name: tc.name,\n        arguments: JSON.stringify(tc.args),\n      },\n    })\n  );\n  if (typeof messages.content === \"string\") {\n    // Check if there are tool calls even with string content\n    if (messages.tool_calls?.length) {\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: CerebrasMessageParam[] = (\n    textFields as MessageContentText[]\n  ).map((c) => ({\n    role: \"assistant\",\n    content: c.text,\n  }));\n  let toolCallMsgs: CerebrasMessageParam | 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    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 convertHumanGenericMessagesToCerebras(\n  message: HumanMessage\n): CerebrasMessageParam[] {\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): CerebrasMessageParam => {\n    if (c.type === \"text\") {\n      return {\n        role: \"user\",\n        content: c.text as string,\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 (\n        typeof c.image_url === \"object\" &&\n        c.image_url !== null &&\n        \"url\" in c.image_url &&\n        typeof c.image_url.url === \"string\"\n      ) {\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 convertSystemMessageToCerebras(\n  message: SystemMessage\n): CerebrasMessageParam[] {\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 convertToolMessageToCerebras(\n  message: ToolMessage\n): CerebrasMessageParam[] {\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      tool_call_id: message.tool_call_id,\n    },\n  ];\n}\n\nexport function convertToCerebrasMessageParams(\n  messages: BaseMessage[]\n): CerebrasMessageParam[] {\n  return messages.flatMap((msg) => {\n    if ([\"human\", \"generic\"].includes(msg.type)) {\n      return convertHumanGenericMessagesToCerebras(msg as HumanMessage);\n    } else if (msg.type === \"ai\") {\n      return convertAIMessageToCerebras(msg as AIMessage);\n    } else if (msg.type === \"system\") {\n      return convertSystemMessageToCerebras(msg as SystemMessage);\n    } else if (msg.type === \"tool\") {\n      return convertToolMessageToCerebras(msg as ToolMessage);\n    } else {\n      throw new Error(`Unsupported message type: ${msg.type}`);\n    }\n  });\n}\n\nexport function formatToCerebrasToolChoice(\n  toolChoice?: ToolChoice\n): Cerebras.ChatCompletionCreateParams[\"tool_choice\"] {\n  if (!toolChoice) {\n    return undefined;\n  } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n    return \"required\";\n  } else if (toolChoice === \"auto\") {\n    return \"auto\";\n  } else if (toolChoice === \"none\") {\n    return \"none\";\n  } else if (typeof toolChoice === \"string\") {\n    return {\n      type: \"function\",\n      function: {\n        name: toolChoice,\n      },\n    };\n  } else {\n    return toolChoice as Cerebras.ChatCompletionCreateParams.Tool;\n  }\n}\n"],"mappings":";;;;AA4CA,SAAS,yBAAyB,SAAyB;CACzD,MAAM,QAAQ,QAAQ,MAAM,yBAAyB;AACrD,QAAO,QAAQ,MAAM,KAAK;;AAG5B,SAAS,2BACP,UACwB;CACxB,MAAM,YAA4C,SAAS,YAAY,KACpE,QAAQ;EACP,IAAI,GAAG;EACP,MAAM;EACN,UAAU;GACR,MAAM,GAAG;GACT,WAAW,KAAK,UAAU,GAAG,KAAK;GACnC;EACF,EACF;AACD,KAAI,OAAO,SAAS,YAAY,UAAU;AAExC,MAAI,SAAS,YAAY,OACvB,QAAO,CACL;GACE,MAAM;GACN,SAAS,SAAS;GAClB,YAAY;GACb,CACF;AAEH,SAAO,CACL;GACE,MAAM;GACN,SAAS,SAAS;GACnB,CACF;;CAMH,MAAM,eAHa,SAAS,QAAQ,QACjC,MAAM,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS,SAC/C,CAGC,KAAK,OAAO;EACZ,MAAM;EACN,SAAS,EAAE;EACZ,EAAE;CACH,IAAI;AAEJ,KACE,SAAS,QAAQ,MAAM,MAAM,EAAE,SAAS,WAAW,IACnD,SAAS,YAAY,QAGrB;MAAI,UACF,gBAAe;GACb,MAAM;GACN,YAAY;GACZ,SAAS;GACV;YAGH,SAAS,QAAQ,MAAM,MAAM,EAAE,SAAS,WAAW,IACnD,CAAC,SAAS,YAAY,OAEtB,OAAM,IAAI,MACR,+DACD;AAGH,QAAO,CAAC,GAAG,cAAc,GAAI,eAAe,CAAC,aAAa,GAAG,EAAE,CAAE;;AAGnE,SAAS,sCACP,SACwB;AACxB,KAAI,OAAO,QAAQ,YAAY,SAC7B,QAAO,CACL;EACE,MAAM;EACN,SAAS,QAAQ;EAClB,CACF;AAEH,QAAO,QAAQ,QAAQ,KAAK,MAA4B;AACtD,MAAI,EAAE,SAAS,OACb,QAAO;GACL,MAAM;GACN,SAAS,EAAE;GACZ;WACQ,EAAE,SAAS,aACpB;OAAI,OAAO,EAAE,cAAc,SACzB,QAAO;IACL,MAAM;IACN,SAAS;IACT,QAAQ,CAAC,yBAAyB,EAAE,UAAU,CAAC;IAChD;YAED,OAAO,EAAE,cAAc,YACvB,EAAE,cAAc,QAChB,SAAS,EAAE,aACX,OAAO,EAAE,UAAU,QAAQ,SAE3B,QAAO;IACL,MAAM;IACN,SAAS;IACT,QAAQ,CAAC,yBAAyB,EAAE,UAAU,IAAI,CAAC;IACpD;;AAGL,QAAM,IAAI,MAAM,6BAA6B,EAAE,OAAO;GACtD;;AAGJ,SAAS,+BACP,SACwB;AACxB,KAAI,OAAO,QAAQ,YAAY,SAC7B,QAAO,CACL;EACE,MAAM;EACN,SAAS,QAAQ;EAClB,CACF;UAED,QAAQ,QAAQ,OACb,MAAM,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS,SAC/C,CAED,QAAQ,QAAQ,QAAiC,KAAK,OAAO;EAC3D,MAAM;EACN,SAAS,EAAE;EACZ,EAAE;KAEH,OAAM,IAAI,MACR,gCAAgC,QAAQ,QACrC,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,GACd;;AAIL,SAAS,6BACP,SACwB;AACxB,KAAI,OAAO,QAAQ,YAAY,SAC7B,OAAM,IAAI,MAAM,mDAAmD;AAErE,QAAO,CACL;EACE,MAAM;EACN,SAAS,QAAQ;EACjB,cAAc,QAAQ;EACvB,CACF;;AAGH,SAAgB,+BACd,UACwB;AACxB,QAAO,SAAS,SAAS,QAAQ;AAC/B,MAAI,CAAC,SAAS,UAAU,CAAC,SAAS,IAAI,KAAK,CACzC,QAAO,sCAAsC,IAAoB;WACxD,IAAI,SAAS,KACtB,QAAO,2BAA2B,IAAiB;WAC1C,IAAI,SAAS,SACtB,QAAO,+BAA+B,IAAqB;WAClD,IAAI,SAAS,OACtB,QAAO,6BAA6B,IAAmB;MAEvD,OAAM,IAAI,MAAM,6BAA6B,IAAI,OAAO;GAE1D;;AAGJ,SAAgB,2BACd,YACoD;AACpD,KAAI,CAAC,WACH;UACS,eAAe,SAAS,eAAe,WAChD,QAAO;UACE,eAAe,OACxB,QAAO;UACE,eAAe,OACxB,QAAO;UACE,OAAO,eAAe,SAC/B,QAAO;EACL,MAAM;EACN,UAAU,EACR,MAAM,YACP;EACF;KAED,QAAO"}