Skip to content

Commit 3921e10

Browse files
committed
feat: support minItems/maxItems in JSON grammar converter (by @nopperl)
1 parent e6d6260 commit 3921e10

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

llama_cpp/llama_grammar.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,9 +1498,21 @@ def visit(self, schema: Dict[str, Any], name: str) -> str:
14981498
item_rule_name = self.visit(
14991499
schema["items"], f'{name}{"-" if name else ""}item'
15001500
)
1501-
rule = (
1502-
f'"[" space ({item_rule_name} ("," space {item_rule_name})*)? "]" space'
1503-
)
1501+
list_item_operator = f'("," space {item_rule_name})'
1502+
successive_items = ""
1503+
min_items = schema.get("minItems", 0)
1504+
if min_items > 0:
1505+
first_item = f"({item_rule_name})"
1506+
successive_items = list_item_operator * (min_items - 1)
1507+
min_items -= 1
1508+
else:
1509+
first_item = f"({item_rule_name})?"
1510+
max_items = schema.get("maxItems")
1511+
if max_items is not None and max_items > min_items:
1512+
successive_items += (list_item_operator + "?") * (max_items - min_items - 1)
1513+
else:
1514+
successive_items += list_item_operator + "*"
1515+
rule = f'"[" space {first_item} {successive_items} "]" space'
15041516
return self._add_rule(rule_name, rule)
15051517

15061518
else:

0 commit comments

Comments
 (0)