// 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 } }