Class: LLM::Schema

Inherits:
Object
  • Object
show all
Extended by:
Parser
Defined in:
lib/llm/schema.rb,
lib/llm/schema/enum.rb,
lib/llm/schema/leaf.rb,
lib/llm/schema/null.rb,
lib/llm/schema/array.rb,
lib/llm/schema/all_of.rb,
lib/llm/schema/any_of.rb,
lib/llm/schema/number.rb,
lib/llm/schema/object.rb,
lib/llm/schema/one_of.rb,
lib/llm/schema/parser.rb,
lib/llm/schema/string.rb,
lib/llm/schema/boolean.rb,
lib/llm/schema/integer.rb,
lib/llm/schema/version.rb,
lib/llm/schema/renderer.rb

Overview

The LLM::Schema class represents a JSON schema, and provides methods that let you describe and produce a schema that can be used in various contexts that include the validation and generation of JSON data.

Examples:

JavaScript-style

schema = LLM::Schema.new
schema.object({
  name: schema.string.enum("John", "Jane").required,
  age: schema.integer.required,
  hobbies: schema.array(schema.string).required,
  address: schema.object({street: schema.string}).required,
})

Ruby-style

class Address < LLM::Schema
  property :street, String, "Street address"
  required %i[street]
end

class Person < LLM::Schema
  property :name, String, "Person's name"
  property :age, Integer, "Person's age"
  property :hobbies, Array[String], "Person's hobbies"
  property :address, Address, "Person's address"
  required %i[name age hobbies address]
end

See Also:

Defined Under Namespace

Modules: Parser, Renderer, Utils Classes: AllOf, AnyOf, Array, Boolean, Enum, Integer, Leaf, Null, Number, Object, OneOf, String

Constant Summary collapse

VERSION =
"0.1.0"

Constants included from Parser

Parser::METADATA_KEYS

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Parser

parse

Class Method Details

.defaults(defaults) ⇒ LLM::Schema::Object

Parameters:

  • defaults (Hash)

Returns:



128
129
130
131
132
133
134
135
136
# File 'lib/llm/schema.rb', line 128

def self.defaults(defaults)
  lock do
    object.tap do |schema|
      defaults.each do |name, val|
        Utils.fetch(schema.properties, name).default(val)
      end
    end
  end
end

.inherited(klass) ⇒ void

This method returns an undefined value.

Configures a monitor for a subclass



89
90
91
92
93
# File 'lib/llm/schema.rb', line 89

def self.inherited(klass)
  LLM.lock(:inherited) do
    klass.instance_eval { @__monitor = Monitor.new }
  end
end

.objectLLM::Schema::Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:



150
151
152
153
154
# File 'lib/llm/schema.rb', line 150

def self.object
  lock do
    @object ||= schema.object({})
  end
end

.property(name, type, description, options = {}) ⇒ Object

Parameters:

  • name (String)

    The property name

  • type (Class)

    The property type

  • description (String)

    The property description

  • options (Hash) (defaults to: {})

    A hash of options



104
105
106
107
108
109
110
111
# File 'lib/llm/schema.rb', line 104

def self.property(name, type, description, options = {})
  lock do
    prop = Utils.resolve(schema, type)
    options = {description:}.merge(options)
    options.each { (_2 == true) ? prop.public_send(_1) : prop.public_send(_1, *_2) }
    object[name] = prop
  end
end

.required(names) ⇒ LLM::Schema::Object

Mark existing properties as required.

Parameters:

Returns:



117
118
119
120
121
122
123
# File 'lib/llm/schema.rb', line 117

def self.required(names)
  lock do
    object.tap do |schema|
      [*names].each { Utils.fetch(schema.properties, _1).required }
    end
  end
end

.schemaLLM::Schema

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:



141
142
143
144
145
# File 'lib/llm/schema.rb', line 141

def self.schema
  lock do
    @schema ||= LLM::Schema.new
  end
end

.to_sString

Render the schema as a prompt-friendly string.

Returns:



159
160
161
# File 'lib/llm/schema.rb', line 159

def self.to_s
  Renderer.render(object, root: true)
end

Instance Method Details

#all_of(*values) ⇒ LLM::Schema::AllOf

Returns an allOf union

Parameters:

Returns:



199
200
201
# File 'lib/llm/schema.rb', line 199

def all_of(*values)
  AllOf.new(values)
end

#any_of(*values) ⇒ LLM::Schema::AnyOf

Returns an anyOf union

Parameters:

Returns:



191
192
193
# File 'lib/llm/schema.rb', line 191

def any_of(*values)
  AnyOf.new(values)
end

#array(*items) ⇒ LLM::Schema::Array

Returns an array

Parameters:

  • items (Array)

    An array of items

Returns:



183
184
185
# File 'lib/llm/schema.rb', line 183

def array(*items)
  Array.new(*items)
end

#booleanLLM::Schema::Boolean

Returns a boolean



235
236
237
# File 'lib/llm/schema.rb', line 235

def boolean
  Boolean.new
end

#integerLLM::Schema::Integer

Returns an integer



228
229
230
# File 'lib/llm/schema.rb', line 228

def integer
  Integer.new
end

#nullLLM::Schema::Null

Returns null

Returns:



242
243
244
# File 'lib/llm/schema.rb', line 242

def null
  Null.new
end

#numberLLM::Schema::Number

Returns a number

Returns:



221
222
223
# File 'lib/llm/schema.rb', line 221

def number
  Number.new
end

#object(properties) ⇒ LLM::Schema::Object

Returns an object

Parameters:

  • properties (Hash)

    A hash of properties

Returns:



175
176
177
# File 'lib/llm/schema.rb', line 175

def object(properties)
  Object.new(properties)
end

#one_of(*values) ⇒ LLM::Schema::OneOf

Returns a oneOf union

Parameters:

Returns:



207
208
209
# File 'lib/llm/schema.rb', line 207

def one_of(*values)
  OneOf.new(values)
end

#stringLLM::Schema::String

Returns a string

Returns:



214
215
216
# File 'lib/llm/schema.rb', line 214

def string
  String.new
end

#to_sString Also known as: inspect

Render a schema leaf as a prompt-friendly string.

Returns:



249
250
251
# File 'lib/llm/schema.rb', line 249

def to_s
  self.class.to_s
end