File size: 1,135 Bytes
7def60a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package functions

import (
	"encoding/json"

	"github.com/mudler/LocalAI/pkg/functions/grammars"
)

type Item struct {
	Type       string                 `json:"type"`
	Properties map[string]interface{} `json:"properties"`
}

type JSONFunctionStructure struct {
	OneOf []Item                 `json:"oneOf,omitempty"`
	AnyOf []Item                 `json:"anyOf,omitempty"`
	Defs  map[string]interface{} `json:"$defs,omitempty"`
}

func (j JSONFunctionStructure) Grammar(options ...func(*grammars.GrammarOption)) (string, error) {
	grammarOpts := &grammars.GrammarOption{}
	grammarOpts.Apply(options...)

	dat, err := json.Marshal(j)
	if err != nil {
		return "", err
	}

	converter := NewSchemaConverter(*grammarOpts)
	return converter.GrammarFromBytes(dat, options...)
}

type SchemaConverter interface {
	GrammarFromBytes([]byte, ...func(*grammars.GrammarOption)) (string, error)
}

func NewSchemaConverter(opt grammars.GrammarOption) SchemaConverter {
	switch {
	case opt.SchemaType == grammars.LLama31Schema:
		return grammars.NewLLama31SchemaConverter(opt.FunctionName)
	}
	return grammars.NewJSONSchemaConverter(opt.PropOrder)
}