Module: DSPy::Schema::SorbetToonAdapter

Extended by:
T::Sig
Defined in:
lib/dspy/schema/sorbet_toon_adapter.rb

Class Method Summary collapse

Class Method Details

.field_guidance(signature_class, role) ⇒ Object



74
75
76
77
78
# File 'lib/dspy/schema/sorbet_toon_adapter.rb', line 74

def field_guidance(signature_class, role)
  return '' unless signature_class

  Sorbet::Toon::SignatureFormatter.describe_signature(signature_class, role)
end

.log_decode_error(payload, error) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/dspy/schema/sorbet_toon_adapter.rb', line 60

def log_decode_error(payload, error)
  logger = DSPy.logger if DSPy.respond_to?(:logger)
  return unless logger.respond_to?(:warn)

  preview = payload.to_s.lines.first(5).join
  logger.warn(
    event: 'toon.decode_error',
    error: error.message,
    preview: preview,
    length: payload.to_s.length
  )
end

.parse_output(signature_class, toon_string) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/dspy/schema/sorbet_toon_adapter.rb', line 34

def parse_output(signature_class, toon_string)
  payload = strip_code_fences(toon_string)

  Sorbet::Toon.decode(
    payload,
    signature: signature_class,
    role: :output,
    strict: false
  )
rescue Sorbet::Toon::DecodeError => e
  log_decode_error(payload, e)
  raise DSPy::LM::AdapterError,
        "Failed to parse TOON response: #{e.message}. Ensure the model replies with a ```toon``` block using the schema described in the system prompt."
end

.render_expected_output(signature_class, values) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/dspy/schema/sorbet_toon_adapter.rb', line 25

def render_expected_output(signature_class, values)
  Sorbet::Toon.encode(
    values,
    signature: signature_class,
    role: :output
  )
end

.render_input(signature_class, values) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/dspy/schema/sorbet_toon_adapter.rb', line 16

def render_input(signature_class, values)
  Sorbet::Toon.encode(
    values,
    signature: signature_class,
    role: :input
  )
end

.strip_code_fences(text) ⇒ Object



50
51
52
53
54
55
56
57
# File 'lib/dspy/schema/sorbet_toon_adapter.rb', line 50

def strip_code_fences(text)
  return '' if text.nil?

  match = text.match(/```(?:toon)?\s*(.*?)```/m)
  return match[1].strip if match

  text.strip
end