76 lines
2.6 KiB
TypeScript
76 lines
2.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
||
import { createAssistantMetaFollowupPolicy } from "../src/services/assistantMetaFollowupPolicy";
|
||
|
||
const policy = createAssistantMetaFollowupPolicy({
|
||
hasAssistantDataScopeMetaQuestionSignal: (text: unknown) =>
|
||
/по какой компании|какая база/i.test(String(text ?? "")),
|
||
shouldHandleAsAssistantCapabilityMetaQuery: (text: unknown) =>
|
||
/что ты можешь|что ты умеешь/i.test(String(text ?? "")),
|
||
hasMetaAnswerFollowupSignal: (text: unknown) =>
|
||
/это норм|что думаешь/i.test(String(text ?? ""))
|
||
});
|
||
|
||
describe("assistantMetaFollowupPolicy", () => {
|
||
it("collects meta signals across message variants", () => {
|
||
const signals = policy.resolveMetaSignalSet({
|
||
rawUserMessage: "",
|
||
repairedRawUserMessage: "",
|
||
effectiveAddressUserMessage: "по какой компании мы можем работать?",
|
||
repairedEffectiveAddressUserMessage: ""
|
||
});
|
||
|
||
expect(signals.dataScopeMetaQuery).toBe(true);
|
||
expect(signals.capabilityMetaQuery).toBe(false);
|
||
expect(signals.metaAnswerFollowupSignal).toBe(false);
|
||
});
|
||
|
||
it("treats historical capability phrasing as capability meta follow-up", () => {
|
||
const signals = policy.resolveMetaSignalSet({
|
||
rawUserMessage: "а исторические остатки тоже можешь?",
|
||
repairedRawUserMessage: "",
|
||
effectiveAddressUserMessage: "",
|
||
repairedEffectiveAddressUserMessage: ""
|
||
});
|
||
|
||
expect(signals.capabilityMetaQuery).toBe(true);
|
||
});
|
||
|
||
it("resolves hard meta mode with data retrieval guard", () => {
|
||
expect(
|
||
policy.resolveHardMetaMode({
|
||
dataScopeMetaQuery: true,
|
||
capabilityMetaQuery: false,
|
||
dataRetrievalSignal: false
|
||
})
|
||
).toBe("data_scope");
|
||
|
||
expect(
|
||
policy.resolveHardMetaMode({
|
||
dataScopeMetaQuery: false,
|
||
capabilityMetaQuery: true,
|
||
dataRetrievalSignal: true
|
||
})
|
||
).toBeNull();
|
||
});
|
||
|
||
it("detects evaluative meta follow-up over grounded answer", () => {
|
||
const detected = policy.isMetaFollowupOverGroundedAnswer({
|
||
followupContext: { previous_intent: "vat_payable_forecast" },
|
||
hasPriorAddressAnswerContext: true,
|
||
metaAnswerFollowupSignal: true,
|
||
vatEvaluativeFollowupSignal: false,
|
||
dataScopeMetaQuery: false,
|
||
capabilityMetaQuery: false,
|
||
aggregateBusinessAnalyticsSignal: false,
|
||
dataRetrievalSignal: false,
|
||
strongDataSignal: false,
|
||
resolvedMode: "unsupported",
|
||
resolvedIntent: "unknown",
|
||
llmContractIntent: "unknown",
|
||
llmContractMode: "unsupported"
|
||
});
|
||
|
||
expect(detected).toBe(true);
|
||
});
|
||
});
|