ARCH: добавить open-scope totals по организации в MCP discovery
This commit is contained in:
@@ -132,15 +132,24 @@ function comparisonNeedFor(action: string): string | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
function supportsOrganizationScopedOpenTotal(action: string): boolean {
|
||||
return action === "turnover" || action === "payout";
|
||||
}
|
||||
|
||||
function allowsOpenScopeWithoutSubject(input: {
|
||||
family: string | null;
|
||||
action: string;
|
||||
organizationScope: string | null;
|
||||
comparisonNeed: string | null;
|
||||
rankingNeed: string | null;
|
||||
}): boolean {
|
||||
if (input.family !== "value_flow") {
|
||||
return false;
|
||||
}
|
||||
return Boolean(input.rankingNeed || input.comparisonNeed === "incoming_vs_outgoing");
|
||||
if (input.rankingNeed || input.comparisonNeed === "incoming_vs_outgoing") {
|
||||
return true;
|
||||
}
|
||||
return Boolean(input.organizationScope && supportsOrganizationScopedOpenTotal(input.action));
|
||||
}
|
||||
|
||||
function rankingNeedFromRawUtterance(value: string): string | null {
|
||||
@@ -215,6 +224,12 @@ function decompositionCandidatesFor(input: {
|
||||
pushUnique(result, "probe_coverage");
|
||||
return result;
|
||||
}
|
||||
if (input.openScopeWithoutSubject) {
|
||||
pushUnique(result, "collect_scoped_movements");
|
||||
pushUnique(result, input.aggregationNeed === "by_month" ? "aggregate_by_month" : "aggregate_checked_amounts");
|
||||
pushUnique(result, "probe_coverage");
|
||||
return result;
|
||||
}
|
||||
pushUnique(result, "resolve_entity_reference");
|
||||
if (input.action === "net_value_flow") {
|
||||
pushUnique(result, "collect_incoming_movements");
|
||||
@@ -275,6 +290,7 @@ export function buildAssistantMcpDiscoveryDataNeedGraph(
|
||||
const rawUtterance = lower(input.rawUtterance);
|
||||
const aggregationAxis = lower(turnMeaning?.asked_aggregation_axis);
|
||||
const explicitDateScope = toNonEmptyString(turnMeaning?.explicit_date_scope);
|
||||
const explicitOrganizationScope = toNonEmptyString(turnMeaning?.explicit_organization_scope);
|
||||
const subjectCandidates = (turnMeaning?.explicit_entity_candidates ?? [])
|
||||
.map((item) => toNonEmptyString(item))
|
||||
.filter((item): item is string => Boolean(item));
|
||||
@@ -291,6 +307,8 @@ export function buildAssistantMcpDiscoveryDataNeedGraph(
|
||||
subjectCandidates.length === 0 &&
|
||||
allowsOpenScopeWithoutSubject({
|
||||
family: businessFactFamily,
|
||||
action,
|
||||
organizationScope: explicitOrganizationScope,
|
||||
comparisonNeed,
|
||||
rankingNeed
|
||||
});
|
||||
@@ -332,6 +350,9 @@ export function buildAssistantMcpDiscoveryDataNeedGraph(
|
||||
if (comparisonNeed) {
|
||||
pushReason(reasonCodes, `data_need_graph_comparison_${comparisonNeed}`);
|
||||
}
|
||||
if (openScopeWithoutSubject && !rankingNeed && !comparisonNeed) {
|
||||
pushReason(reasonCodes, "data_need_graph_open_scope_total_without_subject");
|
||||
}
|
||||
if (clarificationGaps.length > 0) {
|
||||
pushReason(reasonCodes, "data_need_graph_has_clarification_gaps");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user