|
import { d as private_env } from './shared-server-49TKSBDM.js'; |
|
import { c as redirect, b as base } from './index-JNnR1J8_.js'; |
|
import { L as LlamaCppService } from './LlamaCppService-lwZ2ZT0u.js'; |
|
import { F as FullTextSearchService } from './FullTextSearchService-0xoNRjpt.js'; |
|
import 'fs'; |
|
import 'path'; |
|
import 'node:dns'; |
|
import 'node-fetch'; |
|
|
|
const POST = async ({ locals, request }) => { |
|
const body = await request.json(); |
|
let prompt = body.user_query; |
|
let template = body.prompt_template; |
|
const defaultTemplate = 'Ты бухгалтер. Ты отвечаешь на русском языке. Ты всегда следуешь моим инструкциям.\n Ты отвечаешь на вопросы клиентов. Чтобы ответить, ты обязательно используешь только "источники", которые я тебе предоставляю. Ты используешь только официально-деловой стиль и необходимую терминологию. Соблюдай этические нормы. \nПри ответе на вопрос ты используешь только такой формат ответа:\n 1) Четкий и краткий ответ на поставленный вопрос. Ты можешь начать свой ответ так: "По Вашему вопросу сообщаем...". Используй по возможности слова: да, можно, нет, нельзя.\n 2) Обоснование (ты используешь для обоснования "источники". Ты используешь только "источники" для поиска необходимых "законов", "статей", "пунктов" и "подпунктов" для ответа на вопрос пользователя).\n 3) Аргументация (Ты используешь только "источники" для поиска необходимых "писем" и "судебных решений", чтобы аргументировать свой ответ)."\n 4) Заключение (ты подводишь итоги всего, что сказал выше. Избегай повторения и сложных конструкций). Если в источниках нельзя найти подходящую информацию для ответа, ты отвечаешь так: "Мы не можем ответить на данный вопрос. Обратитесь к специалисту."\n Вопрос: {{ВОПРОС}} \nИсточники: {{ИСТОЧНИКИ}}'; |
|
if (!template) { |
|
template = defaultTemplate; |
|
} |
|
const abortController = new AbortController(); |
|
let service = new FullTextSearchService(private_env.SEARCH_API_URL); |
|
let results = await service.search(prompt, { abortController }); |
|
function searchResultsToLlmSources(input) { |
|
return input.map(({ title, text }) => `${title} |
|
${text}`).join("\n\n"); |
|
} |
|
const userPrompt = template.replace("{{ВОПРОС}}", prompt).replace("{{ИСТОЧНИКИ}}", searchResultsToLlmSources(results)); |
|
let llmService = new LlamaCppService(private_env.LLM_API_URL); |
|
let llmGenerator = await llmService.predict(userPrompt, { abortController }); |
|
let response = ""; |
|
for await (const output of await llmGenerator({ prompt: userPrompt })) { |
|
response += output.token.text; |
|
} |
|
return new Response( |
|
JSON.stringify({ response, search_results: results }), |
|
{ |
|
headers: { "Content-Type": "application/json" } |
|
} |
|
); |
|
}; |
|
const GET = async () => { |
|
throw redirect(302, `${base}/`); |
|
}; |
|
|
|
export { GET, POST }; |
|
|
|
|