Renamed file and fixed grammar generator issue.

This commit is contained in:
Maximilian Winter 2024-01-12 19:50:24 +01:00
parent 149d00ffd0
commit 5f719de77c
2 changed files with 16 additions and 7 deletions

View file

@ -8,7 +8,7 @@ import requests
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
import importlib import importlib
pydantic_models_to_grammar = importlib.import_module("pydantic-models-to-grammar") from pydantic_models_to_grammar import generate_gbnf_grammar_and_documentation
# Function to get completion on the llama.cpp server with grammar. # Function to get completion on the llama.cpp server with grammar.
def create_completion(prompt, grammar): def create_completion(prompt, grammar):
@ -70,7 +70,7 @@ class Calculator(BaseModel):
# outer_object_content is the name of outer object content. # outer_object_content is the name of outer object content.
# model_prefix is the optional prefix for models in the documentation. (Default="Output Model") # model_prefix is the optional prefix for models in the documentation. (Default="Output Model")
# fields_prefix is the prefix for the model fields in the documentation. (Default="Output Fields") # fields_prefix is the prefix for the model fields in the documentation. (Default="Output Fields")
gbnf_grammar, documentation = pydantic_models_to_grammar.generate_gbnf_grammar_and_documentation( gbnf_grammar, documentation = generate_gbnf_grammar_and_documentation(
pydantic_model_list=[SendMessageToUser, Calculator], outer_object_name="function", pydantic_model_list=[SendMessageToUser, Calculator], outer_object_name="function",
outer_object_content="function_parameters", model_prefix="Function", fields_prefix="Parameters") outer_object_content="function_parameters", model_prefix="Function", fields_prefix="Parameters")
@ -122,7 +122,7 @@ class Book(BaseModel):
# We need no additional parameters other than our list of pydantic models. # We need no additional parameters other than our list of pydantic models.
gbnf_grammar, documentation = pydantic_models_to_grammar.generate_gbnf_grammar_and_documentation([Book]) gbnf_grammar, documentation = generate_gbnf_grammar_and_documentation([Book])
system_message = "You are an advanced AI, tasked to create a dataset entry in JSON for a Book. The following is the expected output model:\n\n" + documentation system_message = "You are an advanced AI, tasked to create a dataset entry in JSON for a Book. The following is the expected output model:\n\n" + documentation

View file

@ -5,7 +5,7 @@ from inspect import isclass, getdoc
from types import NoneType from types import NoneType
from pydantic import BaseModel, create_model, Field from pydantic import BaseModel, create_model, Field
from typing import Any, Type, List, get_args, get_origin, Tuple, Union, Optional from typing import Any, Type, List, get_args, get_origin, Tuple, Union, Optional, _GenericAlias
from enum import Enum from enum import Enum
from typing import get_type_hints, Callable from typing import get_type_hints, Callable
import re import re
@ -290,7 +290,7 @@ def generate_gbnf_rule_for_type(model_name, field_name,
enum_rule = f"{model_name}-{field_name} ::= {' | '.join(enum_values)}" enum_rule = f"{model_name}-{field_name} ::= {' | '.join(enum_values)}"
rules.append(enum_rule) rules.append(enum_rule)
gbnf_type, rules = model_name + "-" + field_name, rules gbnf_type, rules = model_name + "-" + field_name, rules
elif get_origin(field_type) == list: # Array elif get_origin(field_type) == list or field_type == list: # Array
element_type = get_args(field_type)[0] element_type = get_args(field_type)[0]
element_rule_name, additional_rules = generate_gbnf_rule_for_type(model_name, element_rule_name, additional_rules = generate_gbnf_rule_for_type(model_name,
f"{field_name}-element", f"{field_name}-element",
@ -301,7 +301,7 @@ def generate_gbnf_rule_for_type(model_name, field_name,
rules.append(array_rule) rules.append(array_rule)
gbnf_type, rules = model_name + "-" + field_name, rules gbnf_type, rules = model_name + "-" + field_name, rules
elif get_origin(field_type) == set: # Array elif get_origin(field_type) == set or field_type == set: # Array
element_type = get_args(field_type)[0] element_type = get_args(field_type)[0]
element_rule_name, additional_rules = generate_gbnf_rule_for_type(model_name, element_rule_name, additional_rules = generate_gbnf_rule_for_type(model_name,
f"{field_name}-element", f"{field_name}-element",
@ -335,7 +335,16 @@ def generate_gbnf_rule_for_type(model_name, field_name,
union_rules = [] union_rules = []
for union_type in union_types: for union_type in union_types:
if not issubclass(union_type, NoneType): if isinstance(union_type, _GenericAlias):
union_gbnf_type, union_rules_list = generate_gbnf_rule_for_type(model_name,
field_name, union_type,
False,
processed_models, created_rules)
union_rules.append(union_gbnf_type)
rules.extend(union_rules_list)
elif not issubclass(union_type, NoneType):
union_gbnf_type, union_rules_list = generate_gbnf_rule_for_type(model_name, union_gbnf_type, union_rules_list = generate_gbnf_rule_for_type(model_name,
field_name, union_type, field_name, union_type,
False, False,