Spaces:
Sleeping
Sleeping
import type { BackendModel } from "./server/models"; | |
import type { Message } from "./types/Message"; | |
import { collections } from "$lib/server/database"; | |
import { ObjectId } from "mongodb"; | |
/** | |
* Convert [{user: "assistant", content: "hi"}, {user: "user", content: "hello"}] to: | |
* | |
* <|assistant|>hi<|endoftext|><|prompter|>hello<|endoftext|><|assistant|> | |
*/ | |
export async function buildPrompt( | |
messages: Pick<Message, "from" | "content">[], | |
model: BackendModel, | |
webSearchId?: string | |
): Promise<string> { | |
const prompt = | |
messages | |
.map( | |
(m) => | |
(m.from === "user" | |
? model.userMessageToken + m.content | |
: model.assistantMessageToken + m.content) + | |
(model.messageEndToken | |
? m.content.endsWith(model.messageEndToken) | |
? "" | |
: model.messageEndToken | |
: "") | |
) | |
.join("") + model.assistantMessageToken; | |
let webPrompt = ""; | |
if (webSearchId) { | |
const webSearch = await collections.webSearches.findOne({ | |
_id: new ObjectId(webSearchId), | |
}); | |
if (!webSearch) throw new Error("Web search not found"); | |
if (webSearch.summary) { | |
webPrompt = | |
model.assistantMessageToken + | |
`The following context was found while searching the internet: ${webSearch.summary}` + | |
model.messageEndToken; | |
} | |
} | |
const finalPrompt = | |
model.preprompt + | |
webPrompt + | |
prompt | |
.split(" ") | |
.slice(-(model.parameters?.truncate ?? 0)) | |
.join(" "); | |
// Not super precise, but it's truncated in the model's backend anyway | |
return finalPrompt; | |
} | |