Spaces:
Sleeping
Sleeping
| 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 }; | |
| //# sourceMappingURL=_server.ts-euSpQglJ.js.map | |