@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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/cli.js +36 -11
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iola_adm/iola-cli",
3
- "version": "0.1.49",
3
+ "version": "0.1.50",
4
4
  "description": "CLI и AI-агент городского округа Йошкар-Ола.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/adm-iola/iola-cli#readme",
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 dataContext = options.bare ? { layers: [], query: { text: question, terms: [], patterns: { numbers: [], inns: [], streets: [], targetLayers: [] } }, schools: [], kindergartens: [] } : await buildDataContext(question);
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-ассистент CLI-проекта Йошкар-Олы.",
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