Add grammar_json to the request parameters to facilitate JSON generation

This commit is contained in:
mudler 2023-07-06 18:05:52 +02:00
parent 483fddccf9
commit 55befe396a
4 changed files with 11 additions and 6 deletions

View File

@ -145,6 +145,8 @@ type OpenAIRequest struct {
// A grammar to constrain the LLM output // A grammar to constrain the LLM output
Grammar string `json:"grammar" yaml:"grammar"` Grammar string `json:"grammar" yaml:"grammar"`
// A grammar object
JSONFunctionGrammarObject *grammar.JSONFunctionStructure `json:"grammar_json_functions" yaml:"grammar_json_functions"`
TypicalP float64 `json:"typical_p" yaml:"typical_p"` TypicalP float64 `json:"typical_p" yaml:"typical_p"`
} }
@ -433,6 +435,8 @@ func chatEndpoint(cm *ConfigMerger, o *Option) func(c *fiber.Ctx) error {
// Update input grammar // Update input grammar
jsStruct := funcs.ToJSONStructure() jsStruct := funcs.ToJSONStructure()
config.Grammar = jsStruct.Grammar("") config.Grammar = jsStruct.Grammar("")
} else if input.JSONFunctionGrammarObject != nil {
config.Grammar = input.JSONFunctionGrammarObject.Grammar("")
} }
// functions are not supported in stream mode (yet?) // functions are not supported in stream mode (yet?)
@ -486,6 +490,7 @@ func chatEndpoint(cm *ConfigMerger, o *Option) func(c *fiber.Ctx) error {
} }
predInput = strings.Join(mess, "\n") predInput = strings.Join(mess, "\n")
log.Debug().Msgf("Prompt (before templating): %s", predInput)
if toStream { if toStream {
log.Debug().Msgf("Stream request received") log.Debug().Msgf("Stream request received")
@ -522,7 +527,7 @@ func chatEndpoint(cm *ConfigMerger, o *Option) func(c *fiber.Ctx) error {
log.Debug().Msgf("Template failed loading: %s", err.Error()) log.Debug().Msgf("Template failed loading: %s", err.Error())
} }
log.Debug().Msgf("Prompt: %s", predInput) log.Debug().Msgf("Prompt (after templating): %s", predInput)
if processFunctions { if processFunctions {
log.Debug().Msgf("Grammar: %+v", config.Grammar) log.Debug().Msgf("Grammar: %+v", config.Grammar)
} }

View File

@ -11,8 +11,8 @@ type Function struct {
} }
type Functions []Function type Functions []Function
func (f Functions) ToJSONStructure() JSONStructure { func (f Functions) ToJSONStructure() JSONFunctionStructure {
js := JSONStructure{} js := JSONFunctionStructure{}
for _, function := range f { for _, function := range f {
// t := function.Parameters["type"] // t := function.Parameters["type"]
//tt := t.(string) //tt := t.(string)

View File

@ -211,12 +211,12 @@ type Item struct {
Properties Properties `json:"properties"` Properties Properties `json:"properties"`
} }
type JSONStructure struct { type JSONFunctionStructure struct {
OneOf []Item `json:"oneOf,omitempty"` OneOf []Item `json:"oneOf,omitempty"`
AnyOf []Item `json:"anyOf,omitempty"` AnyOf []Item `json:"anyOf,omitempty"`
} }
func (j JSONStructure) Grammar(propOrder string) string { func (j JSONFunctionStructure) Grammar(propOrder string) string {
dat, _ := json.Marshal(j) dat, _ := json.Marshal(j)
return NewJSONSchemaConverter(propOrder).GrammarFromBytes(dat) return NewJSONSchemaConverter(propOrder).GrammarFromBytes(dat)
} }

View File

@ -66,7 +66,7 @@ var _ = Describe("JSON schema grammar tests", func() {
}) })
It("generates a valid grammar from JSON Objects", func() { It("generates a valid grammar from JSON Objects", func() {
structuredGrammar := JSONStructure{ structuredGrammar := JSONFunctionStructure{
OneOf: []Item{ OneOf: []Item{
{ {
Type: "object", Type: "object",