* fix: fix function call error due to nil properties (429) * refactor: refactoring initializeProperties func in jsonschema pkg (429)
59 lines
2.0 KiB
Go
59 lines
2.0 KiB
Go
// Package jsonschema provides very simple functionality for representing a JSON schema as a
|
|
// (nested) struct. This struct can be used with the chat completion "function call" feature.
|
|
// For more complicated schemas, it is recommended to use a dedicated JSON schema library
|
|
// and/or pass in the schema in []byte format.
|
|
package jsonschema
|
|
|
|
import "encoding/json"
|
|
|
|
type DataType string
|
|
|
|
const (
|
|
Object DataType = "object"
|
|
Number DataType = "number"
|
|
Integer DataType = "integer"
|
|
String DataType = "string"
|
|
Array DataType = "array"
|
|
Null DataType = "null"
|
|
Boolean DataType = "boolean"
|
|
)
|
|
|
|
// Definition is a struct for describing a JSON Schema.
|
|
// It is fairly limited, and you may have better luck using a third-party library.
|
|
type Definition struct {
|
|
// Type specifies the data type of the schema.
|
|
Type DataType `json:"type,omitempty"`
|
|
// Description is the description of the schema.
|
|
Description string `json:"description,omitempty"`
|
|
// Enum is used to restrict a value to a fixed set of values. It must be an array with at least
|
|
// one element, where each element is unique. You will probably only use this with strings.
|
|
Enum []string `json:"enum,omitempty"`
|
|
// Properties describes the properties of an object, if the schema type is Object.
|
|
Properties map[string]Definition `json:"properties"`
|
|
// Required specifies which properties are required, if the schema type is Object.
|
|
Required []string `json:"required,omitempty"`
|
|
// Items specifies which data type an array contains, if the schema type is Array.
|
|
Items *Definition `json:"items,omitempty"`
|
|
}
|
|
|
|
func (d *Definition) MarshalJSON() ([]byte, error) {
|
|
d.initializeProperties()
|
|
return json.Marshal(*d)
|
|
}
|
|
|
|
func (d *Definition) initializeProperties() {
|
|
if d.Properties == nil {
|
|
d.Properties = make(map[string]Definition)
|
|
return
|
|
}
|
|
|
|
for k, v := range d.Properties {
|
|
if v.Properties == nil {
|
|
v.Properties = make(map[string]Definition)
|
|
} else {
|
|
v.initializeProperties()
|
|
}
|
|
d.Properties[k] = v
|
|
}
|
|
}
|