Spaces:
Configuration error
Configuration error
| package functions | |
| import ( | |
| "encoding/json" | |
| "github.com/rs/zerolog/log" | |
| ) | |
| const ( | |
| defaultFunctionNameKey = "name" | |
| defaultFunctionArgumentsKey = "arguments" | |
| ) | |
| type Function struct { | |
| Name string `json:"name"` | |
| Description string `json:"description"` | |
| Strict bool `json:"strict"` | |
| Parameters map[string]interface{} `json:"parameters"` | |
| } | |
| type Functions []Function | |
| type FunctionName struct { | |
| Const string `json:"const"` | |
| } | |
| type Argument struct { | |
| Type string `json:"type"` | |
| Properties map[string]interface{} `json:"properties"` | |
| } | |
| type Tool struct { | |
| Type string `json:"type"` | |
| Function Function `json:"function,omitempty"` | |
| } | |
| type Tools []Tool | |
| // ToJSONNameStructure converts a list of functions to a JSON structure that can be parsed to a grammar | |
| // This allows the LLM to return a response of the type: { "name": "function_name", "arguments": { "arg1": "value1", "arg2": "value2" } } | |
| func (f Functions) ToJSONStructure(name, args string) JSONFunctionStructure { | |
| nameKey := defaultFunctionNameKey | |
| argsKey := defaultFunctionArgumentsKey | |
| if name != "" { | |
| nameKey = name | |
| } | |
| if args != "" { | |
| argsKey = args | |
| } | |
| js := JSONFunctionStructure{} | |
| for _, function := range f { | |
| // t := function.Parameters["type"] | |
| //tt := t.(string) | |
| properties := function.Parameters["properties"] | |
| defs := function.Parameters["$defs"] | |
| dat, _ := json.Marshal(properties) | |
| dat2, _ := json.Marshal(defs) | |
| prop := map[string]interface{}{} | |
| defsD := map[string]interface{}{} | |
| err := json.Unmarshal(dat, &prop) | |
| if err != nil { | |
| log.Error().Err(err).Msg("error unmarshalling dat") | |
| } | |
| err = json.Unmarshal(dat2, &defsD) | |
| if err != nil { | |
| log.Error().Err(err).Msg("error unmarshalling dat2") | |
| } | |
| if js.Defs == nil { | |
| js.Defs = defsD | |
| } | |
| property := map[string]interface{}{} | |
| property[nameKey] = FunctionName{Const: function.Name} | |
| property[argsKey] = Argument{ | |
| Type: "object", | |
| Properties: prop, | |
| } | |
| js.OneOf = append(js.OneOf, Item{ | |
| Type: "object", | |
| Properties: property, | |
| }) | |
| } | |
| return js | |
| } | |
| // Select returns a list of functions containing the function with the given name | |
| func (f Functions) Select(name string) Functions { | |
| var funcs Functions | |
| for _, f := range f { | |
| if f.Name == name { | |
| funcs = []Function{f} | |
| break | |
| } | |
| } | |
| return funcs | |
| } | |