Module: RLM::Signature

Defined in:
lib/rlm/signature.rb,
lib/rlm/signature/dspy.rb

Defined Under Namespace

Classes: Dspy

Constant Summary collapse

REQUIRED_METHODS =
%i[
  description
  input_fields
  output_fields
  validate_input
  validate_output
].freeze

Class Method Summary collapse

Class Method Details

.assert_valid_input!(signature, input) ⇒ Object

Raises:



40
41
42
43
44
45
# File 'lib/rlm/signature.rb', line 40

def assert_valid_input!(signature, input)
  errors = validate_input(signature, input)
  raise ValidationError, errors.join(", ") unless errors.empty?

  nil
end

.assert_valid_output!(signature, output) ⇒ Object

Raises:



47
48
49
50
51
52
# File 'lib/rlm/signature.rb', line 47

def assert_valid_output!(signature, output)
  errors = validate_output(signature, output)
  raise ValidationError, errors.join(", ") unless errors.empty?

  nil
end

.coerce_output(signature, output) ⇒ Object



34
35
36
37
38
# File 'lib/rlm/signature.rb', line 34

def coerce_output(signature, output)
  return signature.coerce_output(output) if signature.respond_to?(:coerce_output)

  output
end

.name_for(signature) ⇒ Object



54
55
56
57
58
59
# File 'lib/rlm/signature.rb', line 54

def name_for(signature)
  name = signature.name if signature.respond_to?(:name)
  return name unless name.to_s.empty?

  signature.to_s
end

.validate_fields!(signature, method_name) ⇒ Object

Raises:



61
62
63
64
65
66
# File 'lib/rlm/signature.rb', line 61

def validate_fields!(signature, method_name)
  fields = signature.public_send(method_name)
  return if fields.is_a?(Hash)

  raise ConfigurationError, "signature .#{method_name} must return a Hash"
end

.validate_input(signature, input) ⇒ Object



26
27
28
# File 'lib/rlm/signature.rb', line 26

def validate_input(signature, input)
  validate_payload(signature, input, :validate_input)
end

.validate_interface!(signature) ⇒ Object

Raises:



17
18
19
20
21
22
23
24
# File 'lib/rlm/signature.rb', line 17

def validate_interface!(signature)
  missing = REQUIRED_METHODS.reject { |method_name| signature.respond_to?(method_name) }
  raise ConfigurationError, "signature is missing required methods: #{missing.join(", ")}" unless missing.empty?

  validate_fields!(signature, :input_fields)
  validate_fields!(signature, :output_fields)
  signature
end

.validate_output(signature, output) ⇒ Object



30
31
32
# File 'lib/rlm/signature.rb', line 30

def validate_output(signature, output)
  validate_payload(signature, output, :validate_output)
end

.validate_payload(signature, payload, method_name) ⇒ Object

Raises:



68
69
70
71
72
73
74
# File 'lib/rlm/signature.rb', line 68

def validate_payload(signature, payload, method_name)
  validate_interface!(signature)
  errors = signature.public_send(method_name, payload)
  return errors if errors.is_a?(Array)

  raise ConfigurationError, "signature .#{method_name} must return an Array"
end