|
|
import type { Message } from "$lib/types/Message"; |
|
|
import type { EndpointMessage } from "./endpoints"; |
|
|
import { downloadFile } from "../files/downloadFile"; |
|
|
import type { ObjectId } from "mongodb"; |
|
|
|
|
|
export async function preprocessMessages( |
|
|
messages: Message[], |
|
|
convId: ObjectId |
|
|
): Promise<EndpointMessage[]> { |
|
|
return Promise.resolve(messages) |
|
|
.then((msgs) => downloadFiles(msgs, convId)) |
|
|
.then((msgs) => injectClipboardFiles(msgs)) |
|
|
.then(stripEmptyInitialSystemMessage); |
|
|
} |
|
|
|
|
|
async function downloadFiles(messages: Message[], convId: ObjectId): Promise<EndpointMessage[]> { |
|
|
return Promise.all( |
|
|
messages.map<Promise<EndpointMessage>>((message) => |
|
|
Promise.all((message.files ?? []).map((file) => downloadFile(file.value, convId))).then( |
|
|
(files) => ({ ...message, files }) |
|
|
) |
|
|
) |
|
|
); |
|
|
} |
|
|
|
|
|
async function injectClipboardFiles(messages: EndpointMessage[]) { |
|
|
return Promise.all( |
|
|
messages.map((message) => { |
|
|
const plaintextFiles = message.files |
|
|
?.filter((file) => file.mime === "application/vnd.chatui.clipboard") |
|
|
.map((file) => Buffer.from(file.value, "base64").toString("utf-8")); |
|
|
|
|
|
if (!plaintextFiles || plaintextFiles.length === 0) return message; |
|
|
|
|
|
return { |
|
|
...message, |
|
|
content: `${plaintextFiles.join("\n\n")}\n\n${message.content}`, |
|
|
files: message.files?.filter((file) => file.mime !== "application/vnd.chatui.clipboard"), |
|
|
}; |
|
|
}) |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function stripEmptyInitialSystemMessage(messages: EndpointMessage[]): EndpointMessage[] { |
|
|
if (!messages?.length) return messages; |
|
|
const first = messages[0]; |
|
|
if (first?.from !== "system") return messages; |
|
|
|
|
|
const content = first?.content as unknown; |
|
|
const isEmpty = typeof content === "string" ? content.trim().length === 0 : false; |
|
|
|
|
|
if (isEmpty) { |
|
|
return messages.slice(1); |
|
|
} |
|
|
|
|
|
return messages; |
|
|
} |
|
|
|