|
|
import type { Message } from "$lib/types/Message"; |
|
|
import Handlebars from "handlebars"; |
|
|
import { Template } from "@huggingface/jinja"; |
|
|
|
|
|
|
|
|
Handlebars.registerHelper("ifUser", function (this: Pick<Message, "from" | "content">, options) { |
|
|
if (this.from == "user") return options.fn(this); |
|
|
}); |
|
|
|
|
|
Handlebars.registerHelper( |
|
|
"ifAssistant", |
|
|
function (this: Pick<Message, "from" | "content">, options) { |
|
|
if (this.from == "assistant") return options.fn(this); |
|
|
} |
|
|
); |
|
|
|
|
|
|
|
|
export function compileTemplate<T>( |
|
|
input: string, |
|
|
model: { preprompt: string; templateEngine?: string } |
|
|
) { |
|
|
let jinjaTemplate: Template | undefined; |
|
|
try { |
|
|
|
|
|
jinjaTemplate = new Template(input); |
|
|
} catch (e) { |
|
|
|
|
|
jinjaTemplate = undefined; |
|
|
} |
|
|
|
|
|
const hbTemplate = Handlebars.compile<T>(input, { |
|
|
knownHelpers: { ifUser: true, ifAssistant: true }, |
|
|
knownHelpersOnly: true, |
|
|
noEscape: true, |
|
|
strict: true, |
|
|
preventIndent: true, |
|
|
}); |
|
|
|
|
|
return function render(inputs: T) { |
|
|
if (jinjaTemplate) { |
|
|
try { |
|
|
return jinjaTemplate.render({ ...model, ...inputs }); |
|
|
} catch (e) { |
|
|
|
|
|
return hbTemplate({ ...model, ...inputs }); |
|
|
} |
|
|
} |
|
|
return hbTemplate({ ...model, ...inputs }); |
|
|
}; |
|
|
} |
|
|
|