feat(assistant): «Спроси» через бесплатную LLM (Groq по умолчанию), грунтовка по FAQ

ask() умеет вызывать OpenAI-совместимую модель: топ-FAQ как контекст, краткий
ответ на русском (source:'model'), таймаут 12с, при ошибке/без ключа — мягкий
откат на FAQ. Конфиг через ENV (ASSISTANT_LLM_URL/KEY/MODEL): дефолт — Groq
(бесплатный ключ), поддержан и локальный Ollama без ключа. Фронт показывает
ответ модели сверху, FAQ и поиск по платформе — ниже. .env.example дополнен.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-04 17:22:32 +03:00
parent e1cde834d0
commit 9dbc0443af
3 changed files with 73 additions and 17 deletions
+6
View File
@@ -389,9 +389,15 @@
LS.assistantAsk(q).catch(function () { return { answers: [] }; }),
(LS.globalSearch ? LS.globalSearch(q, 'all', 4) : Promise.resolve({ results: [] })).catch(function () { return { results: [] }; }),
]).then(function (res) {
var modelAnswer = res[0] && res[0].answer;
var ans = (res[0] && res[0].answers) || [];
var found = (res[1] && res[1].results) || [];
var html = '';
if (modelAnswer) {
html += '<div class="asst-ans"><div class="asst-ans-q">Квантик</div>' +
'<div style="white-space:pre-line">' + esc(modelAnswer) + '</div></div>';
if (ans.length) html += '<div class="asst-ans-sec">Из справки</div>';
}
if (ans.length) {
html += ans.map(function (a) {
return '<div class="asst-ans"><div class="asst-ans-q">' + esc(a.q) + '</div>' + esc(a.a) +