]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
examples : support minItems/maxItems in JSON grammar converter (#5039)
authornopperl <redacted>
Mon, 19 Feb 2024 14:14:07 +0000 (14:14 +0000)
committerGitHub <redacted>
Mon, 19 Feb 2024 14:14:07 +0000 (16:14 +0200)
* support minLength and maxLength in JSON schema grammar converter

* Update examples/json-schema-to-grammar.py

---------

Co-authored-by: Georgi Gerganov <redacted>
examples/json-schema-to-grammar.py

index 2a4cb65bcfc7ef0782004ddccd317026d1e4f569..6a977f031662eca8ddb1dbcd24a43d1370b37912 100755 (executable)
@@ -87,7 +87,21 @@ class SchemaConverter:
         elif schema_type == 'array' and 'items' in schema:
             # TODO `prefixItems` keyword
             item_rule_name = self.visit(schema['items'], f'{name}{"-" if name else ""}item')
-            rule = f'"[" space ({item_rule_name} ("," space {item_rule_name})*)? "]" space'
+            list_item_operator = f'("," space {item_rule_name})'
+            successive_items = ""
+            min_items = schema.get("minItems", 0)
+            if min_items > 0:
+               first_item = f"({item_rule_name})"
+               successive_items = list_item_operator * (min_items - 1)
+               min_items -= 1
+            else:
+               first_item = f"({item_rule_name})?"
+            max_items = schema.get("maxItems")
+            if max_items is not None and max_items > min_items:
+                successive_items += (list_item_operator + "?") * (max_items - min_items - 1)
+            else:
+                successive_items += list_item_operator + "*"
+            rule = f'"[" space {first_item} {successive_items} "]" space'
             return self._add_rule(rule_name, rule)
 
         else: