Усилить семантический AGENT gate для 1С
This commit is contained in:
+12
-5
@@ -381,6 +381,9 @@ function hasValueFlowActionConflictWithDiscoveryTurnMeaning(input, entryPoint) {
|
||||
if (askedDomain !== "counterparty_value") {
|
||||
return false;
|
||||
}
|
||||
if (askedAction === "net_value_flow") {
|
||||
return true;
|
||||
}
|
||||
if (hasExactBankOperationsAddressReply(input, entryPoint)) {
|
||||
return false;
|
||||
}
|
||||
@@ -388,9 +391,6 @@ function hasValueFlowActionConflictWithDiscoveryTurnMeaning(input, entryPoint) {
|
||||
if (askedAction === "payout") {
|
||||
return detectedIntent !== "supplier_payouts_profile";
|
||||
}
|
||||
if (askedAction === "net_value_flow") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function hasEvidenceLaneConflictWithDiscoveryTurnMeaning(input, entryPoint) {
|
||||
@@ -534,6 +534,10 @@ function hasSemanticConflictWithDiscoveryTurnMeaning(input, entryPoint) {
|
||||
return false;
|
||||
}
|
||||
if (hasExactBankOperationsAddressReply(input, entryPoint)) {
|
||||
const askedAction = toNonEmptyString(readDiscoveryTurnMeaning(entryPoint)?.asked_action_family);
|
||||
if (askedAction === "net_value_flow") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
const detectedIntent = toNonEmptyString(input.addressRuntimeMeta?.detected_intent);
|
||||
@@ -644,6 +648,9 @@ function applyAssistantMcpDiscoveryResponsePolicy(input) {
|
||||
const metadataDiscoveryPriority = hasMetadataDiscoveryPriority(input, entryPoint);
|
||||
const valueFlowActionConflictWithDiscoveryTurnMeaning = hasValueFlowActionConflictWithDiscoveryTurnMeaning(input, entryPoint);
|
||||
const evidenceLaneConflictWithDiscoveryTurnMeaning = hasEvidenceLaneConflictWithDiscoveryTurnMeaning(input, entryPoint);
|
||||
const exactBankOperationsProtectsCurrent = exactBankOperationsAddressReply &&
|
||||
!semanticConflictWithDiscoveryTurnMeaning &&
|
||||
!valueFlowActionConflictWithDiscoveryTurnMeaning;
|
||||
if (!entryPoint) {
|
||||
pushReason(reasonCodes, "mcp_discovery_response_policy_no_entry_point");
|
||||
}
|
||||
@@ -701,7 +708,7 @@ function applyAssistantMcpDiscoveryResponsePolicy(input) {
|
||||
if (exactValueFlowReplyForBusinessOverviewDirectMoneyNeed) {
|
||||
pushReason(reasonCodes, "mcp_discovery_response_policy_keep_exact_value_flow_reply_over_business_overview_direct_money_clarification");
|
||||
}
|
||||
if (exactBankOperationsAddressReply) {
|
||||
if (exactBankOperationsProtectsCurrent) {
|
||||
pushReason(reasonCodes, "mcp_discovery_response_policy_keep_exact_bank_operations_address_reply");
|
||||
}
|
||||
if (inventoryMarginRankingAddressReply) {
|
||||
@@ -736,7 +743,7 @@ function applyAssistantMcpDiscoveryResponsePolicy(input) {
|
||||
!runtimeMatchedExactReply &&
|
||||
!staleMetadataDiscoveryFallbackAgainstExactAddressReply &&
|
||||
!exactValueFlowReplyForBusinessOverviewDirectMoneyNeed &&
|
||||
!exactBankOperationsAddressReply &&
|
||||
!exactBankOperationsProtectsCurrent &&
|
||||
!inventoryMarginRankingAddressReply &&
|
||||
!(deterministicBroadBusinessEvaluationReply && candidate.candidate_status === "clarification_candidate") &&
|
||||
ALLOWED_CANDIDATE_STATUSES.has(candidate.candidate_status) &&
|
||||
|
||||
@@ -537,6 +537,9 @@ function hasValueFlowActionConflictWithDiscoveryTurnMeaning(
|
||||
if (askedDomain !== "counterparty_value") {
|
||||
return false;
|
||||
}
|
||||
if (askedAction === "net_value_flow") {
|
||||
return true;
|
||||
}
|
||||
if (hasExactBankOperationsAddressReply(input, entryPoint)) {
|
||||
return false;
|
||||
}
|
||||
@@ -544,9 +547,6 @@ function hasValueFlowActionConflictWithDiscoveryTurnMeaning(
|
||||
if (askedAction === "payout") {
|
||||
return detectedIntent !== "supplier_payouts_profile";
|
||||
}
|
||||
if (askedAction === "net_value_flow") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -726,6 +726,10 @@ function hasSemanticConflictWithDiscoveryTurnMeaning(
|
||||
return false;
|
||||
}
|
||||
if (hasExactBankOperationsAddressReply(input, entryPoint)) {
|
||||
const askedAction = toNonEmptyString(readDiscoveryTurnMeaning(entryPoint)?.asked_action_family);
|
||||
if (askedAction === "net_value_flow") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
const detectedIntent = toNonEmptyString(input.addressRuntimeMeta?.detected_intent);
|
||||
@@ -870,6 +874,10 @@ export function applyAssistantMcpDiscoveryResponsePolicy(
|
||||
input,
|
||||
entryPoint
|
||||
);
|
||||
const exactBankOperationsProtectsCurrent =
|
||||
exactBankOperationsAddressReply &&
|
||||
!semanticConflictWithDiscoveryTurnMeaning &&
|
||||
!valueFlowActionConflictWithDiscoveryTurnMeaning;
|
||||
|
||||
if (!entryPoint) {
|
||||
pushReason(reasonCodes, "mcp_discovery_response_policy_no_entry_point");
|
||||
@@ -940,7 +948,7 @@ export function applyAssistantMcpDiscoveryResponsePolicy(
|
||||
"mcp_discovery_response_policy_keep_exact_value_flow_reply_over_business_overview_direct_money_clarification"
|
||||
);
|
||||
}
|
||||
if (exactBankOperationsAddressReply) {
|
||||
if (exactBankOperationsProtectsCurrent) {
|
||||
pushReason(reasonCodes, "mcp_discovery_response_policy_keep_exact_bank_operations_address_reply");
|
||||
}
|
||||
if (inventoryMarginRankingAddressReply) {
|
||||
@@ -980,7 +988,7 @@ export function applyAssistantMcpDiscoveryResponsePolicy(
|
||||
!runtimeMatchedExactReply &&
|
||||
!staleMetadataDiscoveryFallbackAgainstExactAddressReply &&
|
||||
!exactValueFlowReplyForBusinessOverviewDirectMoneyNeed &&
|
||||
!exactBankOperationsAddressReply &&
|
||||
!exactBankOperationsProtectsCurrent &&
|
||||
!inventoryMarginRankingAddressReply &&
|
||||
!(deterministicBroadBusinessEvaluationReply && candidate.candidate_status === "clarification_candidate") &&
|
||||
ALLOWED_CANDIDATE_STATUSES.has(candidate.candidate_status) &&
|
||||
|
||||
@@ -700,6 +700,67 @@ describe("assistant MCP discovery response policy", () => {
|
||||
expect(result.reason_codes).not.toContain("mcp_discovery_response_policy_semantic_conflict_allows_candidate_override");
|
||||
});
|
||||
|
||||
it("overrides exact bank operation replies for explicit counterparty received-paid-net questions", () => {
|
||||
const result = applyAssistantMcpDiscoveryResponsePolicy({
|
||||
currentReply:
|
||||
"Exact bank operation answer: found 13 bank operations for Group SVK, showing rows and payment purposes.",
|
||||
currentReplySource: "address_query_runtime_v1",
|
||||
currentReplyType: "factual",
|
||||
addressRuntimeMeta: {
|
||||
detected_intent: "bank_operations_by_counterparty",
|
||||
selected_recipe: "address_bank_operations_by_counterparty_v1",
|
||||
mcp_call_status: "matched_non_empty",
|
||||
capability_route_mode: "exact",
|
||||
answer_grounding_check: {
|
||||
status: "grounded"
|
||||
},
|
||||
assistant_mcp_discovery_entry_point_v1: entryPoint({
|
||||
turn_input: {
|
||||
adapter_status: "ready",
|
||||
should_run_discovery: true,
|
||||
data_need_graph: {
|
||||
business_fact_family: "value_flow",
|
||||
subject_candidates: ["Group SVK"],
|
||||
reason_codes: ["data_need_graph_built", "data_need_graph_bidirectional_value_flow"]
|
||||
},
|
||||
turn_meaning_ref: {
|
||||
asked_domain_family: "counterparty_value",
|
||||
asked_action_family: "net_value_flow",
|
||||
explicit_entity_candidates: ["Group SVK"],
|
||||
explicit_date_scope: "2020",
|
||||
unsupported_but_understood_family: "counterparty_bidirectional_value_flow_or_netting"
|
||||
}
|
||||
},
|
||||
bridge: {
|
||||
bridge_status: "answer_draft_ready",
|
||||
user_facing_response_allowed: true,
|
||||
business_fact_answer_allowed: true,
|
||||
requires_user_clarification: false,
|
||||
answer_draft: {
|
||||
answer_mode: "confirmed_with_bounded_inference",
|
||||
headline: "Group SVK 2020: received 12 093 465 rub., paid 0 rub.; net 12 093 465 rub. toward us.",
|
||||
confirmed_lines: ["received 12 093 465 rub.; paid 0 rub.; net 12 093 465 rub."],
|
||||
inference_lines: [],
|
||||
unknown_lines: [],
|
||||
limitation_lines: [],
|
||||
next_step_line: null
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
expect(result.applied).toBe(true);
|
||||
expect(result.decision).toBe("apply_candidate");
|
||||
expect(result.reply_source).toBe("mcp_discovery_response_candidate_guarded");
|
||||
expect(result.reply_text).toContain("received 12 093 465");
|
||||
expect(result.reply_text).toContain("paid 0");
|
||||
expect(result.reply_text).toContain("net 12 093 465");
|
||||
expect(result.reason_codes).toContain("mcp_discovery_response_policy_value_flow_action_conflict_allows_candidate_override");
|
||||
expect(result.reason_codes).toContain("mcp_discovery_response_policy_semantic_conflict_allows_candidate_override");
|
||||
expect(result.reason_codes).not.toContain("mcp_discovery_response_policy_keep_exact_bank_operations_address_reply");
|
||||
});
|
||||
|
||||
it("overrides an exact ranking-shaped address reply when open-scope ranking still needs organization", () => {
|
||||
const result = applyAssistantMcpDiscoveryResponsePolicy({
|
||||
currentReply:
|
||||
|
||||
Reference in New Issue
Block a user