Class: DSPy::Example
Overview
Represents a typed training/evaluation example with Signature validation Provides early validation and type safety for evaluation workflows
Instance Attribute Summary collapse
-
#expected ⇒ Object
readonly
Returns the value of attribute expected.
-
#id ⇒ Object
readonly
Returns the value of attribute id.
-
#input ⇒ Object
readonly
Returns the value of attribute input.
-
#metadata ⇒ Object
readonly
Returns the value of attribute metadata.
-
#signature_class ⇒ Object
readonly
Returns the value of attribute signature_class.
Class Method Summary collapse
- .from_h(hash, signature_registry: nil) ⇒ Object
- .validate_batch(signature_class, examples_data) ⇒ Object
Instance Method Summary collapse
- #==(other) ⇒ Object
- #expected_values ⇒ Object
-
#initialize(signature_class:, input:, expected:, id: nil, metadata: nil) ⇒ Example
constructor
A new instance of Example.
- #input_values ⇒ Object
- #inspect ⇒ Object
- #matches_prediction?(prediction) ⇒ Boolean
- #to_h ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(signature_class:, input:, expected:, id: nil, metadata: nil) ⇒ Example
Returns a new instance of Example.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/dspy/example.rb', line 36 def initialize(signature_class:, input:, expected:, id: nil, metadata: nil) @signature_class = signature_class @id = id = &.freeze # Validate and create input struct begin @input = signature_class.input_struct_class.new(**input) rescue ArgumentError => e raise ArgumentError, "Invalid input for #{signature_class.name}: #{e.message}" rescue TypeError => e raise TypeError, "Type error in input for #{signature_class.name}: #{e.message}" end # Validate and create expected output struct begin @expected = signature_class.output_struct_class.new(**expected) rescue ArgumentError => e raise ArgumentError, "Invalid expected output for #{signature_class.name}: #{e.message}" rescue TypeError => e raise TypeError, "Type error in expected output for #{signature_class.name}: #{e.message}" end end |
Instance Attribute Details
#expected ⇒ Object (readonly)
Returns the value of attribute expected.
19 20 21 |
# File 'lib/dspy/example.rb', line 19 def expected @expected end |
#id ⇒ Object (readonly)
Returns the value of attribute id.
22 23 24 |
# File 'lib/dspy/example.rb', line 22 def id @id end |
#input ⇒ Object (readonly)
Returns the value of attribute input.
16 17 18 |
# File 'lib/dspy/example.rb', line 16 def input @input end |
#metadata ⇒ Object (readonly)
Returns the value of attribute metadata.
25 26 27 |
# File 'lib/dspy/example.rb', line 25 def end |
#signature_class ⇒ Object (readonly)
Returns the value of attribute signature_class.
13 14 15 |
# File 'lib/dspy/example.rb', line 13 def signature_class @signature_class end |
Class Method Details
.from_h(hash, signature_registry: nil) ⇒ Object
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/dspy/example.rb', line 124 def self.from_h(hash, signature_registry: nil) signature_class_name = hash[:signature_class] # Resolve signature class signature_class = if signature_registry && signature_registry[signature_class_name] signature_registry[signature_class_name] else # Try to resolve from constant Object.const_get(signature_class_name) end new( signature_class: signature_class, input: hash[:input] || {}, expected: hash[:expected] || {}, id: hash[:id], metadata: hash[:metadata] ) end |
.validate_batch(signature_class, examples_data) ⇒ Object
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/dspy/example.rb', line 152 def self.validate_batch(signature_class, examples_data) errors = [] examples = [] examples_data.each_with_index do |example_data, index| begin # Only support structured format with :input and :expected keys unless example_data.key?(:input) && example_data.key?(:expected) raise ArgumentError, "Example must have :input and :expected keys. Legacy flat format is no longer supported." end example = new( signature_class: signature_class, input: example_data[:input], expected: example_data[:expected], id: example_data[:id] || "example_#{index}" ) examples << example rescue => e errors << "Example #{index}: #{e.message}" end end unless errors.empty? raise ArgumentError, "Validation errors:\n#{errors.join("\n")}" end examples end |
Instance Method Details
#==(other) ⇒ Object
184 185 186 187 188 189 190 |
# File 'lib/dspy/example.rb', line 184 def ==(other) return false unless other.is_a?(Example) @signature_class == other.signature_class && input_values == other.input_values && expected_values == other.expected_values end |
#expected_values ⇒ Object
72 73 74 75 76 77 78 |
# File 'lib/dspy/example.rb', line 72 def expected_values expected_hash = {} @expected.class.props.keys.each do |key| expected_hash[key] = @expected.send(key) end expected_hash end |
#input_values ⇒ Object
62 63 64 65 66 67 68 |
# File 'lib/dspy/example.rb', line 62 def input_values input_hash = {} @input.class.props.keys.each do |key| input_hash[key] = @input.send(key) end input_hash end |
#inspect ⇒ Object
199 200 201 |
# File 'lib/dspy/example.rb', line 199 def inspect to_s end |
#matches_prediction?(prediction) ⇒ Boolean
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/dspy/example.rb', line 82 def matches_prediction?(prediction) return false unless prediction # Compare each expected field with prediction @expected.class.props.keys.all? do |key| expected_value = @expected.send(key) # Extract prediction value prediction_value = case prediction when T::Struct prediction.respond_to?(key) ? prediction.send(key) : nil when Hash prediction[key] || prediction[key.to_s] else prediction.respond_to?(key) ? prediction.send(key) : nil end expected_value == prediction_value end end |
#to_h ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/dspy/example.rb', line 105 def to_h result = { signature_class: @signature_class.name, input: input_values, expected: expected_values } result[:id] = @id if @id result[:metadata] = if result end |
#to_s ⇒ Object
194 195 196 |
# File 'lib/dspy/example.rb', line 194 def to_s "DSPy::Example(#{@signature_class.name}) input=#{input_values} expected=#{expected_values}" end |