diff --git a/lib/ruby_llm/schema.rb b/lib/ruby_llm/schema.rb index 65d12a4..cac5603 100644 --- a/lib/ruby_llm/schema.rb +++ b/lib/ruby_llm/schema.rb @@ -51,11 +51,12 @@ def additional_properties(value = nil) @additional_properties = value end - def strict(value = nil) - if value.nil? - return @strict.nil? ? (@strict = true) : @strict + def strict(*args) + if args.empty? + instance_variable_defined?(:@strict) ? @strict : true + else + @strict = args.first end - @strict = value end def validate! diff --git a/lib/ruby_llm/schema/json_output.rb b/lib/ruby_llm/schema/json_output.rb index baf40a5..0fb57a7 100644 --- a/lib/ruby_llm/schema/json_output.rb +++ b/lib/ruby_llm/schema/json_output.rb @@ -10,10 +10,11 @@ def to_json_schema type: "object", properties: self.class.properties, required: self.class.required_properties, - additionalProperties: self.class.additional_properties, - strict: self.class.strict + additionalProperties: self.class.additional_properties } + schema_hash[:strict] = self.class.strict unless self.class.strict.nil? + # Only include $defs if there are definitions schema_hash["$defs"] = self.class.definitions unless self.class.definitions.empty? diff --git a/spec/ruby_llm/schema/strict_spec.rb b/spec/ruby_llm/schema/strict_spec.rb new file mode 100644 index 0000000..1cbf5eb --- /dev/null +++ b/spec/ruby_llm/schema/strict_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe RubyLLM::Schema, ".strict" do + it "outputs strict: true by default" do + schema = Class.new(RubyLLM::Schema) + output = schema.new.to_json_schema + expect(output[:schema][:strict]).to eq(true) + end + + it "omits strict from output when set to nil" do + schema = Class.new(RubyLLM::Schema) { strict nil } + output = schema.new.to_json_schema + expect(output[:schema]).not_to have_key(:strict) + end + + it "outputs strict: true when set to true" do + schema = Class.new(RubyLLM::Schema) { strict true } + output = schema.new.to_json_schema + expect(output[:schema][:strict]).to eq(true) + end + + it "outputs strict: false when set to false" do + schema = Class.new(RubyLLM::Schema) { strict false } + output = schema.new.to_json_schema + expect(output[:schema][:strict]).to eq(false) + end +end