Class: CompletionKit::RunsController

Inherits:
ApplicationController show all
Includes:
ResponseOrdering, TagFiltering
Defined in:
app/controllers/completion_kit/runs_controller.rb

Constant Summary collapse

RESPONSES_PER_PAGE =
100
RESPONSE_PREVIEW_CHARS =
700

Constants inherited from ApplicationController

ApplicationController::ONBOARDING_DISMISS_COOKIE

Instance Method Summary collapse

Instance Method Details

#compareObject



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'app/controllers/completion_kit/runs_controller.rb', line 89

def compare
  other_id = params[:with]
  if other_id.blank?
    @other_runs = Run.where(dataset_id: @run.dataset_id, prompt_id: @run.prompt_id)
                      .where.not(id: @run.id)
                      .display_scoped
                      .order(created_at: :desc)
                      .limit(50)
    return render(:compare_picker)
  end

  @other_run = Run.find(other_id)
  @comparison = build_run_comparison(@run, @other_run)
  render(:compare)
end

#createObject



42
43
44
45
46
47
48
49
50
51
# File 'app/controllers/completion_kit/runs_controller.rb', line 42

def create
  @run = Run.new(run_params.except(:metric_ids))
  if @run.save
    @run.replace_metrics!(params[:run][:metric_ids])
    redirect_to run_path(@run), notice: "Run was successfully created."
  else
    load_form_collections
    render :new, status: :unprocessable_entity
  end
end

#destroyObject



76
77
78
79
# File 'app/controllers/completion_kit/runs_controller.rb', line 76

def destroy
  @run.destroy
  redirect_to runs_path, notice: "Run was successfully destroyed."
end

#editObject



39
40
# File 'app/controllers/completion_kit/runs_controller.rb', line 39

def edit
end

#generateObject



81
82
83
84
85
86
87
# File 'app/controllers/completion_kit/runs_controller.rb', line 81

def generate
  if @run.start!
    redirect_to run_path(@run)
  else
    redirect_to run_path(@run), alert: @run.failure_summary || @run.errors.full_messages.to_sentence
  end
end

#indexObject



8
9
10
11
12
# File 'app/controllers/completion_kit/runs_controller.rb', line 8

def index
  scope = Run.includes(:prompt, :dataset, :tags).order(created_at: :desc).display_scoped
  @runs = apply_tag_filter(scope).load
  Run.preload_summaries(@runs)
end

#newObject



30
31
32
33
34
35
36
37
# File 'app/controllers/completion_kit/runs_controller.rb', line 30

def new
  @run = Run.new(prompt_id: params[:prompt_id])
  prompt = Prompt.find_by(id: @run.prompt_id)
  if prompt
    last_run = Run.where(prompt_id: prompt.family_versions.ids).display_scoped.order(created_at: :desc).first
    @run.tag_names = last_run.tag_names if last_run
  end
end

#refresh_statusObject



122
123
124
125
126
127
128
129
130
131
132
# File 'app/controllers/completion_kit/runs_controller.rb', line 122

def refresh_status
  respond_to do |format|
    format.turbo_stream do
      render turbo_stream: turbo_stream.replace(
        "run_status_header",
        partial: "completion_kit/runs/status_header",
        locals: { run: @run }
      )
    end
  end
end

#regradeObject



105
106
107
108
109
110
111
# File 'app/controllers/completion_kit/runs_controller.rb', line 105

def regrade
  if @run.regrade!
    redirect_to run_path(@run), notice: "Re-grading existing responses against the current metrics."
  else
    redirect_to run_path(@run), alert: "Nothing to re-grade. The run has no succeeded responses or no metrics attached."
  end
end

#rerunObject



113
114
115
116
117
118
119
120
# File 'app/controllers/completion_kit/runs_controller.rb', line 113

def rerun
  new_run = @run.rerun!
  if new_run.start!
    redirect_to run_path(new_run), notice: "Re-running with the same configuration."
  else
    redirect_to run_path(new_run), alert: new_run.failure_summary || "Could not start the new run."
  end
end

#retry_failuresObject



149
150
151
152
153
154
155
156
157
158
159
# File 'app/controllers/completion_kit/runs_controller.rb', line 149

def retry_failures
  if @run.stale_review_summary.any?
    redirect_to run_path(@run),
                alert: "A metric has a newer version than the one this run was scored against. Retrying failed cases would mix scores from two versions in the same run. Use 'Re-run from scratch' to refresh everything against the current metrics."
    return
  end

  @run.retry_failures!(only: params[:only])
  @run.broadcast_ui
  redirect_to run_path(@run)
end

#showObject



17
18
19
20
21
22
23
24
25
26
27
28
# File 'app/controllers/completion_kit/runs_controller.rb', line 17

def show
  @responses_total = @run.responses.count
  @responses_per_page = RESPONSES_PER_PAGE
  @responses_total_pages = [(@responses_total.to_f / RESPONSES_PER_PAGE).ceil, 1].max
  @responses_page = params[:page].to_s.to_i.clamp(1, @responses_total_pages)
  @responses_offset = (@responses_page - 1) * RESPONSES_PER_PAGE
  @responses = ordered_responses_relation(@run, params[:sort])
                 .with_body_preview(RESPONSE_PREVIEW_CHARS)
                 .includes(:reviews)
                 .limit(RESPONSES_PER_PAGE)
                 .offset(@responses_offset)
end

#suggestObject



134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'app/controllers/completion_kit/runs_controller.rb', line 134

def suggest
  if @run.prompt.nil?
    redirect_to run_path(@run), alert: "A run that only scores existing outputs has no prompt to improve."
    return
  end

  suggestion = @run.suggestions.create!(
    prompt: @run.prompt,
    original_template: @run.prompt.template,
    status: "pending"
  )
  PromptSuggestionJob.perform_later(suggestion.id)
  redirect_to suggestion_path(suggestion, from: "run")
end

#updateObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/controllers/completion_kit/runs_controller.rb', line 53

def update
  if @run.responses.any? && run_generation_changed?
    attrs = run_params.except(:metric_ids).to_h
    attrs.delete("name") if attrs["name"].to_s == @run.name.to_s
    new_run = Run.new(attrs.merge(status: "pending"))
    if new_run.save
      new_run.replace_metrics!(params[:run][:metric_ids]) if params[:run].key?(:metric_ids)
      redirect_to run_path(new_run), notice: "Saved as a new run. The previous run and its results are preserved."
    else
      @run.assign_attributes(run_params.except(:metric_ids))
      new_run.errors.each { |error| @run.errors.add(error.attribute, error.message) }
      load_form_collections
      render :edit, status: :unprocessable_entity
    end
  elsif @run.update(run_params.except(:metric_ids))
    @run.replace_metrics!(params[:run][:metric_ids]) if params[:run].key?(:metric_ids)
    redirect_to run_path(@run), notice: "Run saved."
  else
    load_form_collections
    render :edit, status: :unprocessable_entity
  end
end