@iola_adm/iola-cli 0.1.49 → 0.1.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/cli.js +36 -11
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -5904,7 +5904,8 @@ async function aiAsk(args, context = {}) {
|
|
|
5904
5904
|
return localToolAsk(question, providerConfig, options);
|
|
5905
5905
|
}
|
|
5906
5906
|
applyRuntimeConfig(providerConfig, options.config);
|
|
5907
|
-
const
|
|
5907
|
+
const useDataContext = !options.bare && shouldUseDataContext(question, options);
|
|
5908
|
+
const dataContext = useDataContext ? await buildDataContext(question) : emptyDataContext(question);
|
|
5908
5909
|
emitEvent(options, "context_loaded", { schools: dataContext.schools.length, kindergartens: dataContext.kindergartens.length });
|
|
5909
5910
|
const historyEnabled = !options.bare && !options["no-history"] && isFeatureEnabled("sqlite-history");
|
|
5910
5911
|
const sessionId = historyEnabled && isFeatureEnabled("sessions") ? ensureSessionForAsk(options, providerConfig, question) : null;
|
|
@@ -6306,6 +6307,29 @@ async function buildDataContext(question) {
|
|
|
6306
6307
|
};
|
|
6307
6308
|
}
|
|
6308
6309
|
|
|
6310
|
+
function emptyDataContext(question) {
|
|
6311
|
+
return {
|
|
6312
|
+
enabled: false,
|
|
6313
|
+
layers: [],
|
|
6314
|
+
query: {
|
|
6315
|
+
text: question,
|
|
6316
|
+
terms: [],
|
|
6317
|
+
patterns: { numbers: [], inns: [], streets: [], targetLayers: [] },
|
|
6318
|
+
},
|
|
6319
|
+
schools: [],
|
|
6320
|
+
kindergartens: [],
|
|
6321
|
+
};
|
|
6322
|
+
}
|
|
6323
|
+
|
|
6324
|
+
function shouldUseDataContext(question, options = {}) {
|
|
6325
|
+
if (options.tools || options.files || options.schema || options.output) return true;
|
|
6326
|
+
const normalized = question.toLocaleLowerCase("ru-RU").trim();
|
|
6327
|
+
if (/^(привет|здравствуй|здравствуйте|добрый день|доброе утро|добрый вечер|hi|hello|hey)[!.?\s]*$/iu.test(normalized)) return false;
|
|
6328
|
+
if (/^(спасибо|благодарю|ок|окей|понял|поняла|ясно|хорошо|да|нет)[!.?\s]*$/iu.test(normalized)) return false;
|
|
6329
|
+
if (normalized.length <= 24 && /^(как дела|что нового|ты тут|ты здесь|кто ты)[?.!\s]*$/iu.test(normalized)) return false;
|
|
6330
|
+
return /\b(школ|сад|детсад|детский сад|лицей|гимнази|инн|адрес|телефон|почт|email|сайт|лиценз|руководител|директор|слой|слои|данн|отчет|отчёт|выгруз|csv|json|найди|покажи|список|карточк|организац|учрежден|йошкар|ола|петрова|строител|советск|первомайск)\b/iu.test(normalized);
|
|
6331
|
+
}
|
|
6332
|
+
|
|
6309
6333
|
function extractSearchTerms(question) {
|
|
6310
6334
|
const normalized = question
|
|
6311
6335
|
.toLocaleLowerCase("ru-RU")
|
|
@@ -6402,13 +6426,14 @@ async function buildAiMessages(question, dataContext, history, options = {}, con
|
|
|
6402
6426
|
const memoryText = options.bare ? "" : buildMemoryText();
|
|
6403
6427
|
const projectContext = options.bare ? "" : await buildProjectContextText();
|
|
6404
6428
|
const skillsText = options.bare ? "" : await buildSkillsText(config);
|
|
6429
|
+
const hasDataContext = dataContext.enabled !== false;
|
|
6405
6430
|
const system = [
|
|
6406
|
-
"Ты терминальный AI
|
|
6407
|
-
"Отвечай на русском
|
|
6408
|
-
"Используй только данные из переданного
|
|
6409
|
-
"Если в контексте нет нужных сведений, прямо напиши, что данных недостаточно.",
|
|
6410
|
-
"Не выдумывай адреса, телефоны, лицензии и руководителей.",
|
|
6411
|
-
"Если отвечаешь по конкретным организациям, укажи источник в конце: слой, название и ИНН.",
|
|
6431
|
+
"Ты терминальный AI-агент городского округа Йошкар-Ола.",
|
|
6432
|
+
"Отвечай на русском языке естественно и по смыслу запроса пользователя.",
|
|
6433
|
+
hasDataContext ? "Используй только данные из переданного контекста открытых данных." : "Для обычного диалога отвечай как полноценный AI-ассистент, не перечисляй слои и возможности без запроса пользователя.",
|
|
6434
|
+
hasDataContext ? "Если в контексте нет нужных сведений, прямо напиши, что данных недостаточно." : "",
|
|
6435
|
+
hasDataContext ? "Не выдумывай адреса, телефоны, лицензии и руководителей." : "",
|
|
6436
|
+
hasDataContext ? "Если отвечаешь по конкретным организациям, укажи источник в конце: слой, название и ИНН." : "",
|
|
6412
6437
|
options.schema === "json" ? "Верни валидный JSON без markdown-обертки." : "",
|
|
6413
6438
|
options.schema === "table" ? "Если уместно, верни ответ в виде markdown-таблицы." : "",
|
|
6414
6439
|
memoryText ? `Учитывай пользовательскую память:\n${memoryText}` : "",
|
|
@@ -6418,14 +6443,14 @@ async function buildAiMessages(question, dataContext, history, options = {}, con
|
|
|
6418
6443
|
].filter(Boolean).join(" ");
|
|
6419
6444
|
const contextText = JSON.stringify(dataContext, null, 2);
|
|
6420
6445
|
const recentHistory = history.slice(-6);
|
|
6446
|
+
const userContent = hasDataContext
|
|
6447
|
+
? `Контекст открытых данных городского округа "Город Йошкар-Ола":\n${contextText}\n\nКраткие источники контекста:\n${sourceLines}\n\nВопрос пользователя: ${question}`
|
|
6448
|
+
: question;
|
|
6421
6449
|
|
|
6422
6450
|
return [
|
|
6423
6451
|
{ role: "system", content: system },
|
|
6424
6452
|
...recentHistory,
|
|
6425
|
-
{
|
|
6426
|
-
role: "user",
|
|
6427
|
-
content: `Контекст открытых данных городского округа "Город Йошкар-Ола":\n${contextText}\n\nКраткие источники контекста:\n${sourceLines}\n\nВопрос пользователя: ${question}`,
|
|
6428
|
-
},
|
|
6453
|
+
{ role: "user", content: userContent },
|
|
6429
6454
|
];
|
|
6430
6455
|
}
|
|
6431
6456
|
|