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

GEPA, MIPROv2, SimpleOptimizer

Defined Under Namespace

Classes: Config, OptimizationResult

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Teleprompter.



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

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.



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

def config
  @config
end

#evaluatorObject (readonly)

Returns the value of attribute evaluator.



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

def evaluator
  @evaluator
end

#metricObject (readonly)

Returns the value of attribute metric.



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

def metric
  @metric
end

Instance Method Details

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

Raises:

  • (NotImplementedError)


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

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

#create_evaluator(examples) ⇒ Object



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

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)


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

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



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

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



222
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
# File 'lib/dspy/teleprompt/teleprompter.rb', line 222

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)


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

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