File size: 3,703 Bytes
cf07b75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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-Bqc2roDm.js';
import { F as FullTextSearchService } from './FullTextSearchService-12fm-h8u.js';
import 'fs';
import 'path';

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-CSwmyTMa.js.map