124 lines
6.5 KiB
JavaScript
124 lines
6.5 KiB
JavaScript
"use strict";
|
||
// @ts-nocheck
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.createAssistantMetaFollowupPolicy = createAssistantMetaFollowupPolicy;
|
||
function collectMessageSamples(input) {
|
||
const values = [
|
||
input.rawUserMessage,
|
||
input.repairedRawUserMessage,
|
||
input.effectiveAddressUserMessage,
|
||
input.repairedEffectiveAddressUserMessage
|
||
];
|
||
return Array.from(new Set(values
|
||
.map((item) => String(item ?? "").trim())
|
||
.filter((item) => item.length > 0)));
|
||
}
|
||
function hasSignalAcrossSamples(samples, detector) {
|
||
return samples.some((sample) => detector(sample));
|
||
}
|
||
function hasImplicitHistoricalCapabilityMetaSignal(samples) {
|
||
return samples.some((sample) => /(?:историческ|история|архив|раньше|ретро|старые\s+данные)/iu.test(sample) &&
|
||
/(?:мож(?:ешь|ем|но)|уме(?:ешь|ете))/iu.test(sample));
|
||
}
|
||
function normalizedSampleText(value) {
|
||
return String(value ?? "")
|
||
.toLowerCase()
|
||
.replace(/\s+/g, " ")
|
||
.replace(/\u0451/gu, "\u0435")
|
||
.trim();
|
||
}
|
||
function hasSchemaDataScopeMetaSignal(samples) {
|
||
return samples.some((sample) => {
|
||
const text = normalizedSampleText(sample);
|
||
if (!text) {
|
||
return false;
|
||
}
|
||
const hasOneCOrSchemaCue = /(?:\b1\s*[cс]\b|1с|metadata|schema|схем|структур|метаданн)/iu.test(text);
|
||
const hasSchemaObjectCue = /(?:справочник|справочники|регистр|регистры|объект(?:ы|ов)?|пол[ея]|связ[ьи]|реквизит|таблиц|раздел(?:ы|ов)?|catalog|register|object|field|relation|link)/iu.test(text);
|
||
const hasDirectSchemaQuestion = /(?:какие\s+(?:справочник|справочники|регистры|объекты|поля|связи|реквизиты)|где\s+(?:лежат|хранятся).*(?:данные|поля)|что\s+есть\s+в\s+1с\s+по)/iu.test(text);
|
||
const hasDocumentSchemaQuestion = /(?:какие\s+(?:поля|связи|реквизиты).{0,80}(?:документ|реализац|поступлен)|(?:документ|реализац|поступлен).{0,80}(?:поля|связи|реквизиты))/iu.test(text);
|
||
return (hasOneCOrSchemaCue && hasSchemaObjectCue) || hasDirectSchemaQuestion || hasDocumentSchemaQuestion;
|
||
});
|
||
}
|
||
function hasBusinessBoundaryQuestionSignal(samples) {
|
||
return samples.some((sample) => {
|
||
const text = normalizedSampleText(sample);
|
||
if (!text) {
|
||
return false;
|
||
}
|
||
const hasClassificationCue = /(?:можно\s+ли\s+считать|это\s+можно\s+считать|как\s+считать|классифиц|объясни\s+аккуратно|это\s+уже|это\s+пока|can\s+this\s+be\s+treated)/iu.test(text);
|
||
const hasBusinessObjectCue = /(?:просроч|открыт\w*\s+задолж|долг|дебитор|кредитор|ликвид|резерв|неликвид|склад|прибыл|марж|оборот|контрагент|покупател|поставщик|overdue|debt|receivable|payable|stock|profit|margin)/iu.test(text);
|
||
return hasClassificationCue && hasBusinessObjectCue;
|
||
});
|
||
}
|
||
function hasContextIntegrityInspectionSignal(samples) {
|
||
return samples.some((sample) => {
|
||
const text = normalizedSampleText(sample);
|
||
return Boolean(text &&
|
||
/(?:проверь\s+себя|не\s+смешал|не\s+перепутал|правильно\s+ли\s+контур|объясни\s+контур|self[-\s]?check)/iu.test(text) &&
|
||
/(?:контрагент|организац|компан|контур|scope|counterparty|organization|company)/iu.test(text));
|
||
});
|
||
}
|
||
function createAssistantMetaFollowupPolicy(deps) {
|
||
function resolveMetaSignalSet(input) {
|
||
const samples = collectMessageSamples(input);
|
||
if (samples.length === 0) {
|
||
return {
|
||
dataScopeMetaQuery: false,
|
||
capabilityMetaQuery: false,
|
||
metaAnswerFollowupSignal: false,
|
||
answerInspectionFollowupSignal: false
|
||
};
|
||
}
|
||
const dataScopeMetaQuery = hasSignalAcrossSamples(samples, deps.hasAssistantDataScopeMetaQuestionSignal) ||
|
||
hasSchemaDataScopeMetaSignal(samples);
|
||
const businessBoundaryQuestion = hasBusinessBoundaryQuestionSignal(samples);
|
||
return {
|
||
dataScopeMetaQuery,
|
||
capabilityMetaQuery: !businessBoundaryQuestion &&
|
||
(hasSignalAcrossSamples(samples, deps.shouldHandleAsAssistantCapabilityMetaQuery) ||
|
||
hasImplicitHistoricalCapabilityMetaSignal(samples)),
|
||
metaAnswerFollowupSignal: hasSignalAcrossSamples(samples, deps.hasMetaAnswerFollowupSignal),
|
||
answerInspectionFollowupSignal: hasSignalAcrossSamples(samples, deps.hasAnswerInspectionFollowupSignal) ||
|
||
hasContextIntegrityInspectionSignal(samples)
|
||
};
|
||
}
|
||
function resolveHardMetaMode(input) {
|
||
if (Boolean(input.dataScopeMetaQuery)) {
|
||
return "data_scope";
|
||
}
|
||
if (Boolean(input.capabilityMetaQuery) && !Boolean(input.dataRetrievalSignal)) {
|
||
return "capability";
|
||
}
|
||
return null;
|
||
}
|
||
function isMetaFollowupOverGroundedAnswer(input) {
|
||
return Boolean(input.followupContext &&
|
||
input.hasPriorAddressAnswerContext &&
|
||
(input.metaAnswerFollowupSignal || input.vatEvaluativeFollowupSignal) &&
|
||
!input.dataScopeMetaQuery &&
|
||
!input.capabilityMetaQuery &&
|
||
!input.aggregateBusinessAnalyticsSignal &&
|
||
!input.dataRetrievalSignal &&
|
||
!input.strongDataSignal &&
|
||
String(input.resolvedMode ?? "") !== "address_query" &&
|
||
String(input.resolvedIntent ?? "") === "unknown" &&
|
||
(!input.llmContractIntent || String(input.llmContractIntent) === "unknown") &&
|
||
String(input.llmContractMode ?? "") !== "address_query");
|
||
}
|
||
function isAnswerInspectionFollowupOverGroundedAnswer(input) {
|
||
return Boolean(input.followupContext &&
|
||
input.hasPriorAddressAnswerContext &&
|
||
input.answerInspectionFollowupSignal &&
|
||
!input.dataScopeMetaQuery &&
|
||
!input.capabilityMetaQuery &&
|
||
!input.aggregateBusinessAnalyticsSignal);
|
||
}
|
||
return {
|
||
resolveMetaSignalSet,
|
||
resolveHardMetaMode,
|
||
isMetaFollowupOverGroundedAnswer,
|
||
isAnswerInspectionFollowupOverGroundedAnswer
|
||
};
|
||
}
|