ОРРКЕСТРАЦИЯ -Усилить agent canon через scenario-tree acceptance и обязательную проверку follow-up веток

This commit is contained in:
2026-04-14 15:45:07 +03:00
parent 27bd4f18fb
commit 943db0d501
13 changed files with 308 additions and 33 deletions
@@ -1342,8 +1342,8 @@ function hasInventorySaleTraceSignal(text) {
}
function hasInventoryProvenanceSignalV2(text) {
const hasItemCue = /(?:товар|номенклатур|sku|item|product|остат(?:ок|ки)|склад)/iu.test(text);
const hasSupplierCue = /(?:от\s+какого\s+поставщика|у\s+какого\s+поставщика|от\s+кого\s+куплен|поставщик|supplier|vendor)/iu.test(text);
const hasPurchaseCue = /(?:куплен(?:ы|а)?|закупк|происхождени|откуда|когда\s+был\s+куплен|когда\s+куплен|дата\s+закупк|purchase\s+provenance|purchase\s+date)/iu.test(text);
const hasSupplierCue = /(?:от\s+какого\s+поставщика|у\s+какого\s+поставщика|от\s+кого\s+куплен|кто\s+(?:нам\s+)?поставил|кем\s+поставлен|поставщик|supplier|vendor)/iu.test(text);
const hasPurchaseCue = /(?:куплен(?:ы|а)?|закупк|происхождени|откуда|когда\s+был\s+куплен|когда\s+куплен|дата\s+закупк|кто\s+(?:нам\s+)?поставил|кем\s+поставлен|поставлен(?:ы|а)?|purchase\s+provenance|purchase\s+date)/iu.test(text);
return hasItemCue && hasSupplierCue && hasPurchaseCue;
}
function hasInventoryPurchaseDateSignal(text) {
@@ -1605,8 +1605,14 @@ function hasInventorySaleTraceSignal(text: string): boolean {
function hasInventoryProvenanceSignalV2(text: string): boolean {
const hasItemCue = /(?:товар|номенклатур|sku|item|product|остат(?:ок|ки)|склад)/iu.test(text);
const hasSupplierCue = /(?:от\s+какого\s+поставщика|у\s+какого\s+поставщика|от\s+кого\s+куплен|поставщик|supplier|vendor)/iu.test(text);
const hasPurchaseCue = /(?:куплен(?:ы|а)?|закупк|происхождени|откуда|когда\s+был\s+куплен|когда\s+куплен|дата\s+закупк|purchase\s+provenance|purchase\s+date)/iu.test(text);
const hasSupplierCue =
/(?:от\s+какого\s+поставщика|у\s+какого\s+поставщика|от\s+кого\s+куплен|кто\s+(?:нам\s+)?поставил|кем\s+поставлен|поставщик|supplier|vendor)/iu.test(
text
);
const hasPurchaseCue =
/(?:куплен(?:ы|а)?|закупк|происхождени|откуда|когда\s+был\s+куплен|когда\s+куплен|дата\s+закупк|кто\s+(?:нам\s+)?поставил|кем\s+поставлен|поставлен(?:ы|а)?|purchase\s+provenance|purchase\s+date)/iu.test(
text
);
return hasItemCue && hasSupplierCue && hasPurchaseCue;
}
@@ -173,6 +173,17 @@ describe("address query shape classifier", () => {
expect(filters.item).toBe("Кромка с клеем 33 альмандин 137 м");
});
it("keeps colloquial selected-object supplier follow-up in inventory provenance intent", () => {
const mode = detectAddressQuestionMode(
'По выбранному объекту "Кромка с клеем 33 альмандин 137 м": кто поставил этот товар'
);
const result = resolveAddressIntent(
'По выбранному объекту "Кромка с клеем 33 альмандин 137 м": кто поставил этот товар'
);
expect(mode.mode).toBe("address_query");
expect(result.intent).toBe("inventory_purchase_provenance_for_item");
});
it("keeps full supplier anchor with comma suffix for stock-overlap questions", () => {
const filters = extractAddressFilters(
"Какие товары от поставщика Гамма-мебель, ООО сейчас еще лежат на складе Основной склад?",