File size: 2,984 Bytes
dd6cddb
39a2f10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd6cddb
 
 
 
 
 
39a2f10
 
 
 
 
 
 
dd6cddb
39a2f10
dd6cddb
39a2f10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { SAIGA_PROMPT_WEB_SEARCH_GENERATE_QUERY, SAIGA_BYPASS_WEBSEARCH_QUERY } from "$env/static/private";
import type { Message } from "$lib/types/Message";
import { format } from "date-fns";
import { modelEndpoint } from "../modelEndpoint";
import { defaultModel } from "$lib/server/models";

export async function generateQuery(messages: Message[]) {
	const currentDate = format(new Date(), "yyyy.mm.dd");
	const userMessages = messages.filter(({ from }) => from === "user");
	const previousUserMessages = userMessages.slice(0, -1);
	const lastMessage = userMessages[userMessages.length - 1];
	// const promptSearchQuery = defaultModel.webSearchQueryPromptRender({
	// 	message: lastMessage,
	// 	previousMessages: previousUserMessages.map(({ content }) => content).join(" "),
	// 	currentDate,
	// });
	const prepromt = ""
	console.log('SAIGA_BYPASS_WEBSEARCH_QUERY', SAIGA_BYPASS_WEBSEARCH_QUERY)
	if (SAIGA_BYPASS_WEBSEARCH_QUERY === 'true'){
		return lastMessage.content;
	}else{
		return await generateSearchQuery(lastMessage.content, {});
	}

	// const regex = /"([^"]+)"/;
	// const matches = searchQuery.match(regex);

	// if (matches && matches.length > 1) {
	// 	searchQuery = matches[1];
	// }
	// console.log('searchQuery', searchQuery)

	// return searchQuery;
}


async function generateSearchQuery(prompt: string,
	parameters?: Partial<Parameters>,
	maxRetries: number = 3
): Promise<string> {

	const newParameters = {
		...defaultModel.parameters,
		...parameters,
		return_full_text: false,
	};

	const randomEndpoint = modelEndpoint(defaultModel);

	const apiUrl = randomEndpoint.url;
	const requestOptions = {
		method: 'POST',
		headers: {
			'Content-Type': 'application/json',
		},
		body: JSON.stringify({
			messages: [{ from: 'user', content: SAIGA_PROMPT_WEB_SEARCH_GENERATE_QUERY.replace('{{query}}', prompt) }],
			parameters: {
				temperature: '0.01',
				top_p: 0.95,
				top_k: 25
			}
		}),
	};

	let retries = 0;

	while (retries < maxRetries) {
		try {
			const response = await fetch(apiUrl, requestOptions);

			if (!response.ok) {
				console.error(`HTTP ${response.status} - ${response.statusText}`);
				throw new Error(`HTTP ${response.status} - ${response.statusText}`);
			}

			// Check if the response has a body
			if (!response.body) {
				console.error(response);
				throw new Error('Response has no body');
			}

			const textDecoder = new TextDecoder();
			const reader = response.body.getReader();
			let fullText = '';

			while (true) {
				const { done, value } = await reader.read();

				if (done) {
					reader.releaseLock();
					break;
				}

				// Process the chunk of text (value) here
				const chunk = textDecoder.decode(value);
				fullText += chunk
			}

			return fullText;

		} catch (error) {
			console.error('Error:', error);
			retries++;
			console.log(`Retrying request (${retries}/${maxRetries})...`);
			continue; // Retry the loop

		}
	}

	throw new Error(`Max retries (${maxRetries}) exceeded.`);
}