Class: DSPy::Teleprompt::Teleprompter

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dspy/teleprompt/teleprompter.rb

Overview

Base class for all DSPy teleprompters (optimizers) Defines the common interface and provides shared functionality for prompt optimization

Direct Known Subclasses

MIPROv2, SimpleOptimizer

Defined Under Namespace

Classes: Config, OptimizationResult

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(metric: nil, config: nil) ⇒ Teleprompter



138
139
140
141
142
# File 'lib/dspy/teleprompt/teleprompter.rb', line 138

def initialize(metric: nil, config: nil)
  @metric = metric
  @config = config || Config.new
  @evaluator = nil
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



124
125
126
# File 'lib/dspy/teleprompt/teleprompter.rb', line 124

def config
  @config
end

#evaluatorObject (readonly)

Returns the value of attribute evaluator.



130
131
132
# File 'lib/dspy/teleprompt/teleprompter.rb', line 130

def evaluator
  @evaluator
end

#metricObject (readonly)

Returns the value of attribute metric.



127
128
129
# File 'lib/dspy/teleprompt/teleprompter.rb', line 127

def metric
  @metric
end

Instance Method Details

#compile(program, trainset:, valset: nil) ⇒ Object

Raises:

  • (NotImplementedError)


152
153
154
# File 'lib/dspy/teleprompt/teleprompter.rb', line 152

def compile(program, trainset:, valset: nil)
  raise NotImplementedError, "Subclasses must implement the compile method"
end

#create_evaluator(examples) ⇒ Object



188
189
190
191
192
193
194
195
196
197
198
# File 'lib/dspy/teleprompt/teleprompter.rb', line 188

def create_evaluator(examples)
  # Use provided metric or create a default one for DSPy::Example objects
  evaluation_metric = @metric || default_metric_for_examples(examples)
  
  @evaluator = DSPy::Evaluate.new(
    nil, # Program will be set during evaluation
    metric: evaluation_metric,
    num_threads: @config.num_threads,
    max_errors: @config.max_errors
  )
end

#ensure_typed_examples(examples, signature_class = nil) ⇒ Object

Raises:

  • (ArgumentError)


179
180
181
182
183
184
# File 'lib/dspy/teleprompt/teleprompter.rb', line 179

def ensure_typed_examples(examples, signature_class = nil)
  # If examples are already DSPy::Example objects, return as-is
  return examples if examples.all? { |ex| ex.is_a?(DSPy::Example) }

  raise ArgumentError, "All examples must be DSPy::Example instances. Legacy format support has been removed. Please convert your examples to use the structured format with :input and :expected keys."
end

#evaluate_program(program, examples, metric: nil) ⇒ Object



208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/dspy/teleprompt/teleprompter.rb', line 208

def evaluate_program(program, examples, metric: nil)
  evaluation_metric = metric || @metric || default_metric_for_examples(examples)
  
  evaluator = DSPy::Evaluate.new(
    program,
    metric: evaluation_metric,
    num_threads: @config.num_threads,
    max_errors: @config.max_errors
  )
  
  evaluator.evaluate(examples, display_progress: false)
end

#save_results(result) ⇒ Object



223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/dspy/teleprompt/teleprompter.rb', line 223

def save_results(result)
  # Legacy file-based saving
  if @config.save_intermediate_results && @config.save_path
    File.open(@config.save_path, 'w') do |f|
      f.write(JSON.pretty_generate(result.to_h))
    end
  end

  # Modern storage system integration
  if @config.save_intermediate_results
    storage_manager = DSPy::Storage::StorageManager.instance
    storage_manager.save_optimization_result(
      result,
      tags: [self.class.name.split('::').last.downcase],
      description: "Optimization by #{self.class.name}",
      metadata: {
        teleprompter_class: self.class.name,
        config: @config.to_h,
        optimization_duration: result.[:optimization_duration] || 0
      }
    )
  end

  # Registry system integration for version management
  if @config.save_intermediate_results
    registry_manager = DSPy::Registry::RegistryManager.instance
    registry_manager.register_optimization_result(
      result,
      metadata: {
        teleprompter_class: self.class.name,
        config: @config.to_h
      }
    )
  end
end

#validate_inputs(program, trainset, valset = nil) ⇒ Object

Raises:

  • (ArgumentError)


164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/dspy/teleprompt/teleprompter.rb', line 164

def validate_inputs(program, trainset, valset = nil)
  raise ArgumentError, "Program cannot be nil" unless program
  raise ArgumentError, "Training set cannot be empty" if trainset.empty?

  if @config.require_validation_examples && (valset.nil? || valset.empty?)
    raise ArgumentError, "Validation set is required but not provided"
  end

  # Validate training examples
  validate_examples(trainset, "training")
  validate_examples(valset, "validation") if valset && valset.any?
end