);
});
- auto recipient_in_role = builder.add_rule("recipient_in_role",
- "\"<|start|>assistant\"? \" to=functions.\" ( " +
- string_join(tool_rules_recipient_in_role, " | ") + " )"
- );
-
auto recipient_in_channel = builder.add_rule("recipient_in_channel",
channel + " \" to=functions.\" ( " +
string_join(tool_rules_recipient_in_channel, " | ") + " )"
);
- builder.add_rule("root", recipient_in_role + " | " + recipient_in_channel);
+ if (data.grammar_lazy) {
+ auto recipient_in_role = builder.add_rule("recipient_in_role",
+ "\"<|start|>assistant\"? \" to=functions.\" ( " +
+ string_join(tool_rules_recipient_in_role, " | ") + " )"
+ );
+
+ builder.add_rule("root", recipient_in_role + " | " + recipient_in_channel);
+ } else {
+ auto not_end = builder.add_rule("not-end",
+ "[^<] | \"<\" [^|] | \"<|\" [^e] | \"<|e\" [^n] | \"<|en\" [^d] | \"<|end\" [^|] | \"<|end|\" [^>]");
+ auto analysis = builder.add_rule("analysis",
+ "\"<|channel|>analysis<|message|>\" ( " + not_end + " )* \"<|end|>\"");
+ auto commentary = builder.add_rule("commentary",
+ "\"<|channel|>commentary<|message|>\" ( " + not_end + " )* \"<|end|>\"");
+
+ auto recipient_in_role = builder.add_rule("recipient_in_role",
+ "\" to=functions.\" ( " + string_join(tool_rules_recipient_in_role, " | ") + " )"
+ );
+
+ builder.add_rule("root",
+ "( " + analysis + " \"<|start|>assistant\" )? " +
+ "( " + commentary + " \"<|start|>assistant\" )? " +
+ "( " + recipient_in_role + " | " + recipient_in_channel + " )"
+ );
+ }
// Trigger on tool calls that appear in the commentary channel
data.grammar_triggers.push_back({