@iola_adm/iola-cli 0.1.104 → 0.1.105

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 +43 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iola_adm/iola-cli",
3
- "version": "0.1.104",
3
+ "version": "0.1.105",
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
@@ -6551,12 +6551,33 @@ async function localToolAsk(question, providerConfig, options) {
6551
6551
 
6552
6552
  function guardNonPublicQuestion(question) {
6553
6553
  const normalized = String(question || "").toLocaleLowerCase("ru-RU");
6554
+ if (isDangerousInstructionQuestion(normalized)) {
6555
+ return "Не могу помогать с созданием оружия, взрывчатых веществ или инструкциями по причинению вреда.";
6556
+ }
6554
6557
  if (/(зарплат|получа[ею]т|доход|домашн|паспорт|снилс|личн|персональн)/iu.test(normalized)) {
6555
6558
  return "Это поле не входит в открытые публичные данные.";
6556
6559
  }
6560
+ if (isUnsupportedPublicEntityQuestion(normalized)) {
6561
+ return "Сейчас в открытых слоях CLI подключены школы и детские сады. По музеям, маршрутам, больницам и другим организациям я пока не могу давать проверяемые ответы.";
6562
+ }
6557
6563
  return "";
6558
6564
  }
6559
6565
 
6566
+ function isDangerousInstructionQuestion(normalized) {
6567
+ const asksHow = /(как|сдела|собра|изготов|созда|надо|нужн|инструкц|рецепт|схем|компонент)/iu.test(normalized);
6568
+ const weapon = /(бомб|взрывчат|взрывн|детонатор|термит|напалм|оруж|патрон|яд|отрав|боеприпас|мина|гранат)/iu.test(normalized);
6569
+ const nuclear = /(атомн|ядерн|уран|плутони|обогащен)/iu.test(normalized) && /(бомб|оруж|собра|сдела|созда|надо|нужн)/iu.test(normalized);
6570
+ return (asksHow && weapon) || nuclear;
6571
+ }
6572
+
6573
+ function isUnsupportedPublicEntityQuestion(normalized) {
6574
+ const unsupportedEntity = /(музе[йяею]|театр|больниц|поликлиник|аптек|магазин|кафе|ресторан|гостиниц|банк|мфц|библиотек|парк|маршрут|остановк)/iu.test(normalized);
6575
+ if (!unsupportedEntity) return false;
6576
+ const supportedEducation = /(школ|гимнази|лице|детск\w*\s+сад|детсад|садик)/iu.test(normalized);
6577
+ if (supportedEducation) return false;
6578
+ return /(адрес|где|как пройти|как добраться|директ|руководител|заведующ|телефон|сайт|почт|инн|кто|находится)/iu.test(normalized);
6579
+ }
6580
+
6560
6581
  function buildCasualDirectAnswer(question) {
6561
6582
  const normalized = String(question || "").toLocaleLowerCase("ru-RU").trim();
6562
6583
  if (/^(кто ты|что ты|какая ты модель|что ты за модель|что за модель|какая модель|назови модель|ты какая модель|ты кто)([?.!\s]*)$/iu.test(normalized)) {
@@ -6767,8 +6788,10 @@ function validateToolPlan(plan, options = {}) {
6767
6788
  }
6768
6789
 
6769
6790
  async function searchPublicEntities(args = {}) {
6791
+ const layer = normalizeEntityLayer(args.layer);
6792
+ assertSupportedPublicEntityLayer(layer);
6770
6793
  const payload = await postJson(`${await getApiBaseUrl()}/search-entities`, {
6771
- layer: normalizeEntityLayer(args.layer),
6794
+ layer,
6772
6795
  query: args.query || args.entity_name || args.name || "",
6773
6796
  limit: Number(args.limit || 10),
6774
6797
  filters: args.filters || undefined,
@@ -6784,6 +6807,7 @@ async function resolvePublicEntityField(args = {}) {
6784
6807
  const endpoint = `${await getApiBaseUrl()}/resolve-entity-field`;
6785
6808
  const requestedField = normalizeEntityField(args.field);
6786
6809
  const layer = normalizeEntityLayer(args.layer);
6810
+ assertSupportedPublicEntityLayer(layer);
6787
6811
  const strictQuestionNumber = extractEntityNumberFromQuestion(args.source_question, layer);
6788
6812
  const payload = {
6789
6813
  layer,
@@ -6988,9 +7012,24 @@ function normalizeEntityLayer(layer) {
6988
7012
  const value = String(layer || "").toLocaleLowerCase("ru-RU");
6989
7013
  if (value === "school" || value === "schools" || value.includes("школ")) return "schools";
6990
7014
  if (value === "kindergarten" || value === "kindergartens" || value.includes("сад")) return "kindergartens";
7015
+ if (value === "museum" || value === "museums" || value.includes("музе")) return "museums";
6991
7016
  return value || "schools";
6992
7017
  }
6993
7018
 
7019
+ function assertSupportedPublicEntityLayer(layer) {
7020
+ if (layer === "schools" || layer === "kindergartens") return;
7021
+ throw createUnsupportedPublicDatasetError(layer);
7022
+ }
7023
+
7024
+ function createUnsupportedPublicDatasetError(layer) {
7025
+ const detail = {
7026
+ error: "unsupported_public_dataset",
7027
+ message: "Unknown public dataset",
7028
+ layer,
7029
+ };
7030
+ return new Error(`Request failed: 400 Bad Request (local-validation)\n${JSON.stringify({ detail })}`);
7031
+ }
7032
+
6994
7033
  function normalizeEntityField(field) {
6995
7034
  const value = String(field || "").toLocaleLowerCase("ru-RU");
6996
7035
  if (value === "director" || value === "directors" || value === "directs" || value === "direct" || value === "head" || value === "head_name" || value.includes("директ") || value.includes("руковод")) return "director";
@@ -7037,6 +7076,9 @@ function isLocalEntityValidationError(error) {
7037
7076
 
7038
7077
  function formatToolExecutionError(error, plan) {
7039
7078
  const details = parseErrorJsonDetails(error);
7079
+ if (details?.error === "unsupported_public_dataset" || details === "Unknown public dataset") {
7080
+ return "Сейчас в открытых слоях CLI подключены школы и детские сады. По этому типу организаций я пока не могу давать проверяемые ответы.";
7081
+ }
7040
7082
  if (details?.error !== "entity_not_found") return "";
7041
7083
  if (details.local_validation && details.entity_name) {
7042
7084
  return `В открытом слое не нашел организацию по названию "${details.entity_name}". Проверьте название.`;