| 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; | |
| } | |