|
|
import { isURLLocal } from "../isURLLocal"; |
|
|
import { env } from "$env/dynamic/private"; |
|
|
import { collections } from "$lib/server/database"; |
|
|
import type { Assistant } from "$lib/types/Assistant"; |
|
|
import type { ObjectId } from "mongodb"; |
|
|
|
|
|
export async function processPreprompt(preprompt: string, user_message: string | undefined) { |
|
|
|
|
|
const today = new Intl.DateTimeFormat("en-US", { |
|
|
weekday: "long", |
|
|
day: "numeric", |
|
|
month: "long", |
|
|
year: "numeric", |
|
|
}).format(new Date()); |
|
|
preprompt = preprompt.replaceAll("{{today}}", today); |
|
|
const requestRegex = /{{\s?(get|post|url)=(.*?)\s?}}/g; |
|
|
|
|
|
for (const match of preprompt.matchAll(requestRegex)) { |
|
|
const method = match[1].toUpperCase(); |
|
|
const urlString = match[2]; |
|
|
try { |
|
|
const url = new URL(urlString); |
|
|
if ((await isURLLocal(url)) && env.ENABLE_LOCAL_FETCH !== "true") { |
|
|
throw new Error("URL couldn't be fetched, it resolved to a local address."); |
|
|
} |
|
|
|
|
|
let res; |
|
|
if (method == "POST") { |
|
|
res = await fetch(url.href, { |
|
|
method: "POST", |
|
|
body: user_message, |
|
|
headers: { |
|
|
"Content-Type": "text/plain", |
|
|
}, |
|
|
}); |
|
|
} else if (method == "GET" || method == "URL") { |
|
|
res = await fetch(url.href); |
|
|
} else { |
|
|
throw new Error("Invalid method " + method); |
|
|
} |
|
|
|
|
|
if (!res.ok) { |
|
|
throw new Error("URL couldn't be fetched, error " + res.status); |
|
|
} |
|
|
const text = await res.text(); |
|
|
preprompt = preprompt.replaceAll(match[0], text); |
|
|
} catch (e) { |
|
|
preprompt = preprompt.replaceAll(match[0], (e as Error).message); |
|
|
} |
|
|
} |
|
|
|
|
|
return preprompt; |
|
|
} |
|
|
|
|
|
export async function getAssistantById(id?: ObjectId) { |
|
|
return collections.assistants |
|
|
.findOne< |
|
|
Pick<Assistant, "rag" | "dynamicPrompt" | "generateSettings" | "tools"> |
|
|
>({ _id: id }, { projection: { rag: 1, dynamicPrompt: 1, generateSettings: 1, tools: 1 } }) |
|
|
.then((a) => a ?? undefined); |
|
|
} |
|
|
|
|
|
export function assistantHasWebSearch(assistant?: Pick<Assistant, "rag"> | null) { |
|
|
return ( |
|
|
env.ENABLE_ASSISTANTS_RAG === "true" && |
|
|
!!assistant?.rag && |
|
|
(assistant.rag.allowedLinks.length > 0 || |
|
|
assistant.rag.allowedDomains.length > 0 || |
|
|
assistant.rag.allowAllDomains) |
|
|
); |
|
|
} |
|
|
|
|
|
export function assistantHasDynamicPrompt(assistant?: Pick<Assistant, "dynamicPrompt">) { |
|
|
return env.ENABLE_ASSISTANTS_RAG === "true" && Boolean(assistant?.dynamicPrompt); |
|
|
} |
|
|
|