static L dm_gazelle_reasonAboutChatInput_v2(S userName, S content, O... _) { // GATHER PARAMETERS & CONTEXT bool debug = boolPar debug(_); bool debugRules = boolPar debugRules(_) || debug; LS preContext = cast optPar preContext(_); GazelleEvalContext ctx = cast optPar ctx(_); F0 contextMaker = cast optPar contextMaker(_); if (ctx == null && contextMaker != null) { ctx = contextMaker!; if (debugRules) print("Called contextMaker, got " + n2(ctx.engine.rules, "rule")); } if (ctx == null) ctx = dm_gazelle_stdEvalContext(dm_gazelle_allRulesWithComment(optPar requiredComment(_, "discord"))); Set acceptablePurposes = cast optPar acceptablePurposes(_); if (debug) print(" == PROCESSING INPUT: " + content); // PREPARE RULES // Need input as first condition ctx.engine.dropRulesWhere(r -> cicOneOf(r.comments, "in 1 = statement", "in = statement", "disable")); if (acceptablePurposes != null) { if (debugRules) print("Purposes: " + acceptablePurposes); ctx.engine.dropRulesWhere(r -> !acceptablePurposes.contains(unnull(r.purpose))); if (debugRules) print("Retaining " + n2(ctx.engine.rules, "rule")); } if (debugRules) print("Have rules: " + collect globalID(ctx.engine.rules)); gazelle_addHelpers(ctx, _); // MAKE PARAMETERS O[] params = litparams(firstConditionOnly := true, dialogHistory := preContext, +debug, badComments := optPar badComments(_), acceptablePurposes := optPar acceptablePurposes(_), respondingToHuman := optPar respondingToHuman(_), skipSplitters := optPar skipSplitters(_)); // TREE1 (just input) GazelleTree tree1 = cast optPar tree(_); if (tree1 == null) tree1 = GazelleTree(ctx, content); L l = dm_gazelle_getChildren(tree1, params); // ADDITIONAL MATCHES FOR TREE1 SS inputMap = gazelle_inputMapFromLineAndHistory(content, listPlus(preContext, content)); if (debug) print("reasonAbout inputMap=" + sfu(asTreeMap(inputMap))); dm_gazelle_matchAdditionalInput3(l, inputMap, _); // TREE2 (user says: ...) if (nempty(userName) && !boolPar skipUserName(_)) { GazelleTree tree2 = new(ctx, optCurly(userName) + " says: " + content); if (debug) print("Tree2: " + tree2); l.addAll(dm_gazelle_getChildren(tree2, paramsPlus(_, tree2 := true)); } // TREE3 (user with id x says: ...) Long userID = cast optPar userID(_); if (userID != null && userID != 0 && !boolPar skipUserID(_)) { GazelleTree tree3 = new(ctx, "user with id " + userID + " says: " + content); l.addAll(dm_gazelle_getChildren(tree3, paramsPlus(_, tree3 := true)); } // DROP BAD ENTRIES, SORT if (boolPar skipBad(_, true)) l = [GazelleTree t : l | neq(t.prediction, 'bad)]; gazelle_sortChildren(l); // MATCH ADDITIONAL STATEMENTS dm_gazelle_matchStatements_v2(l, passParams(_, 'debug, 'dm_gazelle_matchStatementsDebug)); for (GazelleTree t : l) t.flush(); // DROP UNSATISFIED ENTRIES int n = l(l); l = gazelle_dropUnsatisfiedEntries(l); if (debug) print("Filtered out " + (n-l(l)) + " unsatisfied entries (keeping " + l(l) + ")"); // DROP DEFAULTS if (!boolPar keepDefaults(_)) gazelle_dropMatchedDefaultRules(l, _); ret l; }