import type { Message } from "$lib/types/Message"; import { format } from "date-fns"; import { generateFromDefaultEndpoint } from "../generateFromDefaultEndpoint"; import { defaultModel } from "../models"; export async function generateQuery(messages: Message[]) { const currentDate = format(new Date(), "MMMM d, yyyy"); const userMessages = messages.filter(({ from }) => from === "user"); const previousUserMessages = userMessages.slice(0, -1); const lastMessage = userMessages.slice(-1)[0]; const promptSearchQuery = defaultModel.webSearchQueryPromptRender({ message: lastMessage, previousMessages: previousUserMessages.map(({ content }) => content).join(" "), currentDate, }); const searchQuery = await generateFromDefaultEndpoint(promptSearchQuery).then((query) => { // example of generating google query: // case 1 // user: tell me what happened yesterday // LLM: google query is "news september 12, 2023" // the regex below will try to capture the last "phrase" (i.e. words between quotes or double quotes or ticks) // in this case, it is "news september 12, 2023" // if there is no "phrase", we will just use the user query, which was "tell me what happened yesterday" const regexLastPhrase = /("|'|`)((?:(?!\1).)+)\1$/; let match = query.match(regexLastPhrase); if (match) { return match[2]; } // case 2 // user: tell me what happened yesterday // LLM: Here is a query: news september 12, 2023 // the regex below will try to capture the last sentences starting from : // in this case, it is "news september 12, 2023" // if there is no math, we will just use the user query, which was "tell me what happened yesterday" const regexColon = /:\s(.*)$/; match = query.match(regexColon); if (match) { return match[1]; } return lastMessage.content; }); return searchQuery; }