8000 Add $ref and $defs support to json schema converter · furyhawk/llama-cpp-python@770df34 · GitHub
[go: up one dir, main page]

Skip to content

Commit 770df34

Browse files
committed
Add $ref and $defs support to json schema converter
1 parent faeae18 commit 770df34

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

llama_cpp/llama_grammar.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,7 @@ class SchemaConverter:
13991399
def __init__(self, prop_order):
14001400
self._prop_order = prop_order
14011401
self._rules = {"space": SPACE_RULE}
1402+
self._defs = {}
14021403

14031404
def _format_literal(self, literal):
14041405
escaped = GRAMMAR_LITERAL_ESCAPE_RE.sub(
@@ -1422,6 +1423,11 @@ def visit(self, schema, name):
14221423
schema_type = schema.get("type")
14231424
rule_name = name or "root"
14241425

1426+
if "$defs" in schema:
1427+
# add defs to self._defs for later inlining
1428+
for def_name, def_schema in schema["$defs"].items():
1429+
self._defs[def_name] = def_schema
1430+
14251431
if "oneOf" in schema or "anyOf" in schema:
14261432
rule = " | ".join(
14271433
(
@@ -1471,6 +1477,14 @@ def visit(self, schema, name):
14711477
)
14721478
return self._add_rule(rule_name, rule)
14731479

1480+
elif "$ref" in schema:
1481+
ref = schema["$ref"]
1482+
assert ref.startswith("#/$defs/"), f"Unrecognized schema: {schema}"
1483+
# inline $defs
1484+
def_name = ref[len("#/$defs/") :]
1485+
def_schema = self._defs[def_name]
1486+
return self.visit(def_schema, f'{name}{"-" if name else ""}{def_name}')
1487+
14741488
else:
14751489
assert schema_type in PRIMITIVE_RULES, f"Unrecognized schema: {schema}"
14761490
return self._add_rule(

0 commit comments

Comments
 (0)
0