From 2cb3f0e80b08de7c800167b4169dd7127f0ef88b Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Thu, 19 Mar 2026 15:50:58 -0700 Subject: [PATCH] Feat: Extract unified attachments logic --- src/attachments.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/attachments.js diff --git a/src/attachments.js b/src/attachments.js new file mode 100644 index 0000000..71f7e88 --- /dev/null +++ b/src/attachments.js @@ -0,0 +1,38 @@ +import { asDataURL, imgToWebp, b64 } from './utils.js'; + +export async function toAttach(file) { + if (!file) return null; + if (file instanceof File) { + const name = file.name || 'file', mime = (file.type || 'application/octet-stream').toLowerCase(); + if (/^image\//.test(mime) || /\.(png|jpe?g|webp|gif)$/i.test(name)) { + const data = mime === 'image/webp' || /\.webp$/i.test(name) ? await asDataURL(file) : await imgToWebp(file, 2048, 94); + return { type: 'image_url', image_url: { url: data } }; + } + if (mime === 'application/pdf' || /\.pdf$/i.test(name)) { + const data = await asDataURL(file), bin = b64(data); + return { type: 'file', file: { filename: name.endsWith('.pdf') ? name : name + '.pdf', file_data: bin } }; + } + if (/^audio\//.test(mime) || /\.(wav|mp3)$/i.test(name)) { + const data = await asDataURL(file), bin = b64(data), fmt = /mp3/.test(mime) || /\.mp3$/i.test(name) ? 'mp3' : 'wav'; + return { type: 'input_audio', input_audio: { data: bin, format: fmt } }; + } + const data = await asDataURL(file), bin = b64(data); + return { type: 'file', file: { filename: name, file_data: bin } }; + } + if (file && file.name == null && file.data) { + const name = file.name || 'file', mime = (file.mime || 'application/octet-stream').toLowerCase(); + if (/^image\//.test(mime)) { + const url = `data:${mime};base64,${file.data}`; + return { type: 'image_url', image_url: { url } }; + } + if (mime === 'application/pdf') { + return { type: 'file', file: { filename: name, file_data: file.data } }; + } + if (/^audio\//.test(mime)) { + const fmt = /mp3/.test(mime) ? 'mp3' : 'wav'; + return { type: 'input_audio', input_audio: { data: file.data, format: fmt } }; + } + return { type: 'file', file: { filename: name, file_data: file.data } }; + } + return null; +}