Class: PromptEngine::EvalSetsController
- Inherits:
-
ApplicationController
- Object
- ActionController::Base
- ApplicationController
- PromptEngine::EvalSetsController
- Defined in:
- app/controllers/prompt_engine/eval_sets_controller.rb
Instance Method Summary collapse
- #compare ⇒ Object
- #create ⇒ Object
- #destroy ⇒ Object
- #edit ⇒ Object
- #index ⇒ Object
- #metrics ⇒ Object
- #new ⇒ Object
- #run ⇒ Object
- #show ⇒ Object
- #update ⇒ Object
Instance Method Details
#compare ⇒ Object
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 84 def compare unless params[:run_ids].present? && params[:run_ids].is_a?(Array) && params[:run_ids].length == 2 redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "Please select exactly two evaluation runs to compare." return end @run1 = @eval_set.eval_runs.find(params[:run_ids][0]) @run2 = @eval_set.eval_runs.find(params[:run_ids][1]) # Ensure both runs are completed unless @run1.status == "completed" && @run2.status == "completed" redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "Both evaluation runs must be completed to compare them." return end # Calculate comparison metrics @run1_success_rate = (@run1.total_count > 0) ? (@run1.passed_count.to_f / @run1.total_count * 100) : 0 @run2_success_rate = (@run2.total_count > 0) ? (@run2.passed_count.to_f / @run2.total_count * 100) : 0 @success_rate_diff = @run2_success_rate - @run1_success_rate rescue ActiveRecord::RecordNotFound redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "One or both evaluation runs could not be found." end |
#create ⇒ Object
21 22 23 24 25 26 27 28 29 30 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 21 def create @eval_set = @prompt.eval_sets.build(eval_set_params) if @eval_set.save redirect_to prompt_eval_set_path(@prompt, @eval_set), notice: "Evaluation set was successfully created." else flash.now[:alert] = "Please fix the errors below." render :new end end |
#destroy ⇒ Object
44 45 46 47 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 44 def destroy @eval_set.destroy redirect_to prompt_eval_sets_path(@prompt), notice: "Evaluation set was successfully deleted." end |
#edit ⇒ Object
32 33 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 32 def edit end |
#index ⇒ Object
8 9 10 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 8 def index @eval_sets = @prompt.eval_sets end |
#metrics ⇒ Object
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 110 def metrics # Get all completed runs for this eval set @eval_runs = @eval_set.eval_runs.where(status: "completed").order(created_at: :asc) # Calculate metrics data for charts if @eval_runs.any? # Success rate trend data (for line chart) @success_rate_trend = @eval_runs.map do |run| { date: run.created_at.strftime("%b %d, %Y %I:%M %p"), rate: (run.total_count > 0) ? (run.passed_count.to_f / run.total_count * 100).round(2) : 0, version: "v#{run.prompt_version.version_number}" } end # Success rate by version (for bar chart) version_stats = @eval_runs.group_by { |r| r.prompt_version.version_number } @success_rate_by_version = version_stats.map do |version, runs| total_passed = runs.sum(&:passed_count) total_count = runs.sum(&:total_count) { version: "v#{version}", rate: (total_count > 0) ? (total_passed.to_f / total_count * 100).round(2) : 0, runs: runs.count } end.sort_by { |v| v[:version] } # Test case statistics @total_test_cases = @eval_set.test_cases.count @total_runs = @eval_runs.count @overall_pass_rate = begin total_passed = @eval_runs.sum(&:passed_count) total_tests = @eval_runs.sum(&:total_count) (total_tests > 0) ? (total_passed.to_f / total_tests * 100).round(2) : 0 end # Average duration trend @duration_trend = @eval_runs.map do |run| duration = if run.completed_at && run.started_at (run.completed_at - run.started_at).to_i else nil end { date: run.created_at.strftime("%b %d, %Y %I:%M %p"), duration: duration, version: "v#{run.prompt_version.version_number}" } end.compact # Recent activity (last 10 runs) @recent_activity = @eval_runs.last(10).reverse else @success_rate_trend = [] @success_rate_by_version = [] @total_test_cases = @eval_set.test_cases.count @total_runs = 0 @overall_pass_rate = 0 @duration_trend = [] @recent_activity = [] end end |
#new ⇒ Object
17 18 19 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 17 def new @eval_set = @prompt.eval_sets.build end |
#run ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 49 def run # Check if API key is available unless api_key_configured? redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "OpenAI API key not configured. Please configure it in Settings or contact your administrator." return end # Create new eval run with current prompt version @eval_run = @eval_set.eval_runs.create!( prompt_version: @prompt.current_version ) begin # Run evaluation synchronously for MVP PromptEngine::EvaluationRunner.new(@eval_run).execute redirect_to prompt_eval_run_path(@prompt, @eval_run), notice: "Evaluation started successfully" rescue PromptEngine::OpenAiEvalsClient::AuthenticationError => e @eval_run.update!(status: :failed, error_message: e.) redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "Authentication failed: Please check your OpenAI API key in Settings" rescue PromptEngine::OpenAiEvalsClient::RateLimitError => e @eval_run.update!(status: :failed, error_message: e.) redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "Rate limit exceeded: Please try again later" rescue PromptEngine::OpenAiEvalsClient::APIError => e @eval_run.update!(status: :failed, error_message: e.) redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "API error: #{e.}" rescue => e @eval_run.update!(status: :failed, error_message: e.) Rails.logger.error "Evaluation error: #{e.class} - #{e.}" Rails.logger.error e.backtrace.join("\n") redirect_to prompt_eval_set_path(@prompt, @eval_set), alert: "Evaluation failed: #{e.}" end end |
#show ⇒ Object
12 13 14 15 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 12 def show @test_cases = @eval_set.test_cases @recent_runs = @eval_set.eval_runs.order(created_at: :desc).limit(5) end |
#update ⇒ Object
35 36 37 38 39 40 41 42 |
# File 'app/controllers/prompt_engine/eval_sets_controller.rb', line 35 def update if @eval_set.update(eval_set_params) redirect_to prompt_eval_set_path(@prompt, @eval_set), notice: "Evaluation set was successfully updated." else flash.now[:alert] = "Please fix the errors below." render :edit end end |