1
0
Эх сурвалжийг харах

Merge pull request #1539 from cheahjs/feat/customizable-title-prompt-length

feat: add {{prompt:start:length}} and {{prompt:end:length}} to title gen
Timothy Jaeryang Baek 1 жил өмнө
parent
commit
8b10b058e5

+ 2 - 1
src/lib/apis/ollama/index.ts

@@ -1,4 +1,5 @@
 import { OLLAMA_API_BASE_URL } from '$lib/constants';
+import { promptTemplate } from '$lib/utils';
 
 export const getOllamaUrls = async (token: string = '') => {
 	let error = null;
@@ -144,7 +145,7 @@ export const generateTitle = async (
 ) => {
 	let error = null;
 
-	template = template.replace(/{{prompt}}/g, prompt);
+	template = promptTemplate(template, prompt);
 
 	console.log(template);
 

+ 2 - 1
src/lib/apis/openai/index.ts

@@ -1,4 +1,5 @@
 import { OPENAI_API_BASE_URL } from '$lib/constants';
+import { promptTemplate } from '$lib/utils';
 
 export const getOpenAIUrls = async (token: string = '') => {
 	let error = null;
@@ -273,7 +274,7 @@ export const generateTitle = async (
 ) => {
 	let error = null;
 
-	template = template.replace(/{{prompt}}/g, prompt);
+	template = promptTemplate(template, prompt);
 
 	console.log(template);
 

+ 27 - 0
src/lib/utils/index.ts

@@ -468,6 +468,33 @@ export const blobToFile = (blob, fileName) => {
 	return file;
 };
 
+// promptTemplate replaces any occurrences of the following in the template with the prompt
+// {{prompt}} will be replaced with the prompt
+// {{prompt:start:<length>}} will be replaced with the first <length> characters of the prompt
+// {{prompt:end:<length>}} will be replaced with the last <length> characters of the prompt
+// Character length is used as we don't have the ability to tokenize the prompt
+export const promptTemplate = (template: string, prompt: string) => {
+	template = template.replace(/{{prompt}}/g, prompt);
+
+	// Replace all instances of {{prompt:start:<length>}} with the first <length> characters of the prompt
+	const startRegex = /{{prompt:start:(\d+)}}/g;
+	let startMatch: RegExpMatchArray | null;
+	while ((startMatch = startRegex.exec(template)) !== null) {
+		const length = parseInt(startMatch[1]);
+		template = template.replace(startMatch[0], prompt.substring(0, length));
+	}
+
+	// Replace all instances of {{prompt:end:<length>}} with the last <length> characters of the prompt
+	const endRegex = /{{prompt:end:(\d+)}}/g;
+	let endMatch: RegExpMatchArray | null;
+	while ((endMatch = endRegex.exec(template)) !== null) {
+		const length = parseInt(endMatch[1]);
+		template = template.replace(endMatch[0], prompt.substring(prompt.length - length));
+	}
+
+	return template;
+};
+
 export const approximateToHumanReadable = (nanoseconds: number) => {
 	const seconds = Math.floor((nanoseconds / 1e9) % 60);
 	const minutes = Math.floor((nanoseconds / 6e10) % 60);