Class: Leva::PromptOptimizationJob

Inherits:
ApplicationJob show all
Defined in:
app/jobs/leva/prompt_optimization_job.rb

Overview

Background job for running prompt optimization with progress tracking.

This job executes the optimization process asynchronously, updating the OptimizationRun record with progress for live UI updates.

Examples:

Enqueue an optimization job

run = OptimizationRun.create!(dataset: dataset, prompt_name: "My Prompt", mode: :light)
Leva::PromptOptimizationJob.perform_later(optimization_run_id: run.id)

Instance Method Summary collapse

Instance Method Details

#perform(optimization_run_id:) ⇒ Leva::Prompt

Performs the prompt optimization and creates a new Prompt.

Parameters:

  • optimization_run_id (Integer)

    The ID of the OptimizationRun to process

Returns:



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/jobs/leva/prompt_optimization_job.rb', line 19

def perform(optimization_run_id:)
  @run = OptimizationRun.find(optimization_run_id)
  @run.start!

  dataset = @run.dataset

  optimizer = PromptOptimizer.new(
    dataset: dataset,
    mode: @run.mode.to_sym,
    model: @run.model,
    optimizer: @run.optimizer.to_sym,
    progress_callback: method(:update_progress)
  )

  result = optimizer.optimize

  ActiveRecord::Base.transaction do
    prompt = Prompt.create!(
      name: @run.prompt_name,
      system_prompt: result[:system_prompt],
      user_prompt: result[:user_prompt],
      metadata: result[:metadata]
    )

    @run.complete!(prompt)
    prompt
  end
rescue ActiveRecord::RecordNotFound => e
  Rails.logger.error "[Leva::PromptOptimizationJob] OptimizationRun not found: #{e.message}"
  raise
rescue Leva::DspyConfigurationError => e
  Rails.logger.error "[Leva::PromptOptimizationJob] Configuration error: #{e.message}"
  @run&.fail!("Configuration error - please check server logs for details")
  raise
rescue Leva::InsufficientDataError, Leva::OptimizationError => e
  @run&.fail!(e)
  Rails.logger.error "[Leva::PromptOptimizationJob] Optimization failed: #{e.message}"
  raise
rescue StandardError => e
  Rails.logger.error "[Leva::PromptOptimizationJob] Unexpected error: #{e.message}"
  Rails.logger.error e.backtrace.first(10).join("\n")
  @run&.fail!(e.message.truncate(500))
  raise
end