{"version":3,"sources":["../../../src/llm/provider_format/mistralai.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { ChatContext } from '../chat_context.js';\nimport { isInstructions } from '../chat_context.js';\n\nexport interface MistralFormatData {\n  instructions: string;\n}\n\n/**\n * Convert a LiveKit ChatContext into Mistral Conversations API entries.\n *\n * - System/developer messages are extracted as `instructions` (passed separately).\n * - User messages become `MessageInputEntry` items (`message.input`, role `user`).\n * - Assistant messages become `MessageOutputEntry` items (`message.output`, role `assistant`).\n * - Function calls become `FunctionCallEntry` items (`function.call`).\n * - Function call outputs become `FunctionResultEntry` items (`function.result`).\n * - If entries would be empty (e.g. only system messages), or the final entry is an assistant\n *   message, a dummy user message is injected so the API receives a valid `inputs` array.\n */\nexport function toChatCtx(\n  chatCtx: ChatContext,\n  injectDummyUserMessage: boolean = true,\n): [Record<string, unknown>[], MistralFormatData] {\n  const entries: Record<string, unknown>[] = [];\n  const instructionParts: string[] = [];\n\n  for (const item of chatCtx.items) {\n    if (item.type === 'message') {\n      const text = item.content\n        .filter((c) => typeof c === 'string' || isInstructions(c))\n        .map((c) => (typeof c === 'string' ? c : c.value))\n        .join('\\n');\n\n      if (item.role === 'system' || item.role === 'developer') {\n        instructionParts.push(text);\n      } else if (item.role === 'user') {\n        entries.push({ type: 'message.input', role: 'user', content: text });\n      } else if (item.role === 'assistant') {\n        entries.push({ type: 'message.output', role: 'assistant', content: text });\n      }\n    } else if (item.type === 'function_call') {\n      entries.push({\n        type: 'function.call',\n        toolCallId: item.callId,\n        name: item.name,\n        arguments: item.args,\n      });\n    } else if (item.type === 'function_call_output') {\n      entries.push({\n        type: 'function.result',\n        toolCallId: item.callId,\n        result: item.output,\n      });\n    }\n  }\n\n  if (entries.length === 0 && injectDummyUserMessage) {\n    entries.push({ type: 'message.input', role: 'user', content: '.' });\n  } else if (injectDummyUserMessage && entries.at(-1)?.role === 'assistant') {\n    entries.push({ type: 'message.input', role: 'user', content: '(empty)' });\n  }\n\n  return [entries, { instructions: instructionParts.join('\\n') }];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAA+B;AAiBxB,SAAS,UACd,SACA,yBAAkC,MACc;AAxBlD;AAyBE,QAAM,UAAqC,CAAC;AAC5C,QAAM,mBAA6B,CAAC;AAEpC,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,OAAO,KAAK,QACf,OAAO,CAAC,MAAM,OAAO,MAAM,gBAAY,oCAAe,CAAC,CAAC,EACxD,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,KAAM,EAChD,KAAK,IAAI;AAEZ,UAAI,KAAK,SAAS,YAAY,KAAK,SAAS,aAAa;AACvD,yBAAiB,KAAK,IAAI;AAAA,MAC5B,WAAW,KAAK,SAAS,QAAQ;AAC/B,gBAAQ,KAAK,EAAE,MAAM,iBAAiB,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,MACrE,WAAW,KAAK,SAAS,aAAa;AACpC,gBAAQ,KAAK,EAAE,MAAM,kBAAkB,MAAM,aAAa,SAAS,KAAK,CAAC;AAAA,MAC3E;AAAA,IACF,WAAW,KAAK,SAAS,iBAAiB;AACxC,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH,WAAW,KAAK,SAAS,wBAAwB;AAC/C,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,KAAK,wBAAwB;AAClD,YAAQ,KAAK,EAAE,MAAM,iBAAiB,MAAM,QAAQ,SAAS,IAAI,CAAC;AAAA,EACpE,WAAW,4BAA0B,aAAQ,GAAG,EAAE,MAAb,mBAAgB,UAAS,aAAa;AACzE,YAAQ,KAAK,EAAE,MAAM,iBAAiB,MAAM,QAAQ,SAAS,UAAU,CAAC;AAAA,EAC1E;AAEA,SAAO,CAAC,SAAS,EAAE,cAAc,iBAAiB,KAAK,IAAI,EAAE,CAAC;AAChE;","names":[]}