/** * Extracts text content from a multimodal message * If the content has multiple text items, it will join them together with a newline. * @param {string|Array} content - Message content that could be string or array of content objects * @returns {string} - The text content */ function extractTextContent(content) { if (!Array.isArray(content)) return content; return content .filter((item) => item.type === "text") .map((item) => item.text) .join("\n"); } /** * Detects mime type from a base64 data URL string, defaults to PNG if not detected * @param {string} dataUrl - The data URL string (e.g. data:image/jpeg;base64,...) * @returns {string} - The mime type or 'image/png' if not detected */ function getMimeTypeFromDataUrl(dataUrl) { try { const matches = dataUrl.match(/^data:([^;]+);base64,/); return matches ? matches[1].toLowerCase() : "image/png"; } catch (e) { return "image/png"; } } /** * Extracts attachments from a multimodal message * The attachments provided are in OpenAI format since this util is used in the OpenAI compatible chat. * However, our backend internal chat uses the Attachment type we use elsewhere in the app so we have to convert it. * @param {Array} content - Message content that could be string or array of content objects * @returns {import("../../../utils/helpers").Attachment[]} - The attachments */ function extractAttachments(content) { if (!Array.isArray(content)) return []; return content .filter((item) => item.type === "image_url") .map((item, index) => ({ name: `uploaded_image_${index}`, mime: getMimeTypeFromDataUrl(item.image_url.url), contentString: item.image_url.url, })); } module.exports = { extractTextContent, extractAttachments, };