completion-kit 0.27.10 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2dcb85f33589d282049d7a4584765911a441409f5954979e15de31051f9c0a3
4
- data.tar.gz: 97f8fffbaf66354429134f7683894b28d2a0aebf84762bf3621cba84b41c4d15
3
+ metadata.gz: 8936acc5b9ab944e059386e4e3a8d81e460aec2220a49c25ccf0436cf81fe581
4
+ data.tar.gz: b73cfe2e1d78ca7093bddcc1c0bc7b46f9cbf14267731197fa3d57ef1c017d85
5
5
  SHA512:
6
- metadata.gz: 46ef5ca8f79d233fa176e85be1cbd3c39d0e40b28de14f561660bf9daa077bb13ed0646402163b0216c8a256d59f78697f6aad84be418b8c69a1df43ae53b217
7
- data.tar.gz: 963d07fce50baf728056614a531b161d84184b85aed7f6458bace1d7dea8212fc4cde83fcc985bb77aa041c402da70c409a2c2e7adadebe5139ac8a37c19ee12
6
+ metadata.gz: 9a12e4bc6077d392c2417c1b8069249dac0ffc700deec0907d27d6191409d5e01dad0947fd7909193582e757c2bce51c4a0c6a56c0b91979bf4cda3bd8f4f89b
7
+ data.tar.gz: b7f892d8c12d8a9612f8f32d78ef9fba167a77dfd8504fb25499e7e5497a521310fa1c664764231827b94e91b1a15720a3d887592a3528ed2a69804252b3513e
@@ -84,23 +84,27 @@ document.addEventListener("turbo:before-stream-render", function() {
84
84
 
85
85
  var ckCsvHoverTimer = null;
86
86
  var ckCsvHoverRow = null;
87
+ var ckHoverRowSelector = ".ck-csv-table tbody tr, .ck-responses-table tbody tr";
88
+ function ckHoverExpandClass(row) {
89
+ return row.closest(".ck-responses-table") ? "ck-response-row--expanded" : "ck-csv-row--expanded";
90
+ }
87
91
  document.addEventListener("mouseover", function(e) {
88
- var row = e.target.closest && e.target.closest(".ck-csv-table tbody tr");
92
+ var row = e.target.closest && e.target.closest(ckHoverRowSelector);
89
93
  if (!row || row === ckCsvHoverRow) return;
90
- if (ckCsvHoverRow) ckCsvHoverRow.classList.remove("ck-csv-row--expanded");
94
+ if (ckCsvHoverRow) ckCsvHoverRow.classList.remove("ck-csv-row--expanded", "ck-response-row--expanded");
91
95
  ckCsvHoverRow = row;
92
96
  clearTimeout(ckCsvHoverTimer);
93
97
  ckCsvHoverTimer = setTimeout(function() {
94
- if (ckCsvHoverRow === row) row.classList.add("ck-csv-row--expanded");
98
+ if (ckCsvHoverRow === row) row.classList.add(ckHoverExpandClass(row));
95
99
  }, 350);
96
100
  });
97
101
  document.addEventListener("mouseout", function(e) {
98
- var row = e.target.closest && e.target.closest(".ck-csv-table tbody tr");
102
+ var row = e.target.closest && e.target.closest(ckHoverRowSelector);
99
103
  if (!row) return;
100
- var related = e.relatedTarget && e.relatedTarget.closest && e.relatedTarget.closest(".ck-csv-table tbody tr");
104
+ var related = e.relatedTarget && e.relatedTarget.closest && e.relatedTarget.closest(ckHoverRowSelector);
101
105
  if (related === row) return;
102
106
  clearTimeout(ckCsvHoverTimer);
103
- row.classList.remove("ck-csv-row--expanded");
107
+ row.classList.remove("ck-csv-row--expanded", "ck-response-row--expanded");
104
108
  if (ckCsvHoverRow === row) ckCsvHoverRow = null;
105
109
  });
106
110
 
@@ -286,6 +286,13 @@ form.button_to {
286
286
  margin-top: 0.45rem;
287
287
  }
288
288
 
289
+ .ck-pagination {
290
+ display: flex;
291
+ align-items: center;
292
+ gap: 1rem;
293
+ margin-top: 1rem;
294
+ }
295
+
289
296
  .ck-title,
290
297
  .ck-section-title,
291
298
  .ck-card-title,
@@ -1602,7 +1609,8 @@ tr:hover .ck-chip--publish {
1602
1609
  border: 0;
1603
1610
  border-radius: 0;
1604
1611
  background: transparent;
1605
- white-space: pre;
1612
+ white-space: pre-wrap;
1613
+ overflow-wrap: anywhere;
1606
1614
  color: #93c5fd;
1607
1615
  font-size: 0.86rem;
1608
1616
  line-height: 1.55;
@@ -4217,12 +4225,26 @@ table.ck-runs-table {
4217
4225
  .ck-response-cell__text {
4218
4226
  width: 100%;
4219
4227
  max-width: 0;
4220
- overflow: hidden;
4221
- text-overflow: ellipsis;
4222
- white-space: nowrap;
4223
4228
  color: var(--ck-muted);
4224
4229
  }
4225
4230
 
4231
+ .ck-response-cell__preview {
4232
+ display: -webkit-box;
4233
+ -webkit-box-orient: vertical;
4234
+ -webkit-line-clamp: 1;
4235
+ line-clamp: 1;
4236
+ overflow: hidden;
4237
+ max-height: 1.7em;
4238
+ overflow-wrap: anywhere;
4239
+ transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1);
4240
+ }
4241
+
4242
+ .ck-response-row--expanded .ck-response-cell__preview {
4243
+ -webkit-line-clamp: 12;
4244
+ line-clamp: 12;
4245
+ max-height: 22em;
4246
+ }
4247
+
4226
4248
  .ck-response-cell__error {
4227
4249
  color: var(--ck-danger);
4228
4250
  }
@@ -10,8 +10,18 @@ module CompletionKit
10
10
  @runs = apply_tag_filter(scope)
11
11
  end
12
12
 
13
+ RESPONSES_PER_PAGE = 100
14
+
13
15
  def show
14
- @responses = ordered_responses_relation(@run, params[:sort]).includes(:reviews)
16
+ @responses_total = @run.responses.count
17
+ @responses_per_page = RESPONSES_PER_PAGE
18
+ @responses_total_pages = [(@responses_total.to_f / RESPONSES_PER_PAGE).ceil, 1].max
19
+ @responses_page = params[:page].to_i.clamp(1, @responses_total_pages)
20
+ @responses_offset = (@responses_page - 1) * RESPONSES_PER_PAGE
21
+ @responses = ordered_responses_relation(@run, params[:sort])
22
+ .includes(:reviews)
23
+ .limit(RESPONSES_PER_PAGE)
24
+ .offset(@responses_offset)
15
25
  end
16
26
 
17
27
  def new
@@ -201,7 +201,6 @@ module CompletionKit
201
201
  end
202
202
  end
203
203
 
204
- failed_row = nil
205
204
  begin
206
205
  transaction do
207
206
  responses.destroy_all
@@ -212,37 +211,46 @@ module CompletionKit
212
211
  failure_summary: nil,
213
212
  error_message: nil
214
213
  )
215
- rows.each_with_index do |row, index|
216
- failed_row = index
217
- input = row.empty? ? nil : row.to_json
218
- attrs = {
219
- status: "pending",
220
- row_index: index,
221
- input_data: input,
222
- expected_output: row[expected_column.presence || "expected_output"]
223
- }
224
- if judge_only?
225
- attrs[:status] = "succeeded"
226
- column = output_column.presence || "actual_output"
227
- attrs[:response_text] = row[column].to_s if dataset && dataset.headers.include?(column)
228
- end
229
214
 
230
- response = responses.create!(attrs)
231
-
232
- if judge_only?
233
- llm_metrics.each { |m| JudgeReviewJob.perform_later(response.id, m.id, id) } if llm_judge_configured?
234
- check_metrics.each { |m| CheckReviewJob.perform_later(response.id, m.id, id) }
235
- else
236
- GenerateRowJob.perform_later(id, response.id)
215
+ now = Time.current
216
+ out_col = output_column.presence || "actual_output"
217
+ exp_col = expected_column.presence || "expected_output"
218
+ judge = judge_only?
219
+ has_output = judge && dataset && dataset.headers.include?(out_col)
220
+ scope_defaults = Response.all.where_values_hash.symbolize_keys
221
+
222
+ response_attrs = rows.each_with_index.map do |row, index|
223
+ {
224
+ run_id: id,
225
+ status: judge ? "succeeded" : "pending",
226
+ row_index: index,
227
+ input_data: row.empty? ? nil : row.to_json,
228
+ expected_output: row[exp_col],
229
+ response_text: (judge && has_output ? row[out_col].to_s : nil),
230
+ attempts: 0,
231
+ created_at: now,
232
+ updated_at: now
233
+ }.merge(scope_defaults)
234
+ end
235
+ Response.insert_all(response_attrs)
236
+ responses.reset
237
+
238
+ response_ids = responses.order(:row_index).pluck(:id)
239
+ if judge
240
+ judge_metrics = llm_judge_configured? ? llm_metrics.to_a : []
241
+ chk_metrics = check_metrics.to_a
242
+ response_ids.each do |rid|
243
+ judge_metrics.each { |m| JudgeReviewJob.perform_later(rid, m.id, id) }
244
+ chk_metrics.each { |m| CheckReviewJob.perform_later(rid, m.id, id) }
237
245
  end
246
+ RunCompletionCheckJob.perform_later(id)
247
+ else
248
+ response_ids.each { |rid| GenerateRowJob.perform_later(id, rid) }
238
249
  end
239
-
240
- RunCompletionCheckJob.perform_later(id) if judge_only?
241
250
  end
242
251
  rescue ActiveRecord::RecordInvalid => e
243
252
  reload
244
- detail = e.record.errors.full_messages.to_sentence
245
- return fail_with_summary!(failed_row ? "Row #{failed_row + 1}: #{detail}" : detail)
253
+ return fail_with_summary!(e.record.errors.full_messages.to_sentence)
246
254
  end
247
255
 
248
256
  safely_broadcast do
@@ -4,9 +4,9 @@
4
4
  <td class="ck-response-cell__text">
5
5
  <% if response.status == "failed" %>
6
6
  <% err = response.error_payload %>
7
- <span class="ck-response-cell__error"><%= err && err[:provider]&.titleize %><%= " #{err[:status]}" if err && err[:status] %> — <%= truncate(err && err[:message].to_s, length: 160) %></span>
7
+ <span class="ck-response-cell__preview ck-response-cell__error"><%= err && err[:provider]&.titleize %><%= " #{err[:status]}" if err && err[:status] %> — <%= truncate(err && err[:message].to_s, length: 600) %></span>
8
8
  <% else %>
9
- <%= truncate(response.response_text.to_s, length: 160) %>
9
+ <span class="ck-response-cell__preview"><%= truncate(response.response_text.to_s, length: 600) %></span>
10
10
  <% end %>
11
11
  </td>
12
12
  <td data-label="Metrics">
@@ -197,11 +197,23 @@
197
197
  </thead>
198
198
  <tbody id="run_responses">
199
199
  <% @responses.each_with_index do |response, idx| %>
200
- <%= render "response_row", run: @run, response: response, index: idx + 1 %>
200
+ <%= render "response_row", run: @run, response: response, index: @responses_offset + idx + 1 %>
201
201
  <% end %>
202
202
  </tbody>
203
203
  </table>
204
204
 
205
+ <% if @responses_total_pages > 1 %>
206
+ <nav class="ck-pagination" aria-label="Response pages">
207
+ <% if @responses_page > 1 %>
208
+ <%= link_to run_path(@run, page: @responses_page - 1, sort: params[:sort]), class: ck_button_classes(:light, variant: :outline) do %>&larr; Prev<% end %>
209
+ <% end %>
210
+ <span class="ck-meta-copy">Page <%= @responses_page %> of <%= @responses_total_pages %> &middot; <%= pluralize(@responses_total, "response") %></span>
211
+ <% if @responses_page < @responses_total_pages %>
212
+ <%= link_to run_path(@run, page: @responses_page + 1, sort: params[:sort]), class: ck_button_classes(:light, variant: :outline) do %>Next &rarr;<% end %>
213
+ <% end %>
214
+ </nav>
215
+ <% end %>
216
+
205
217
  <% if @run.status.in?(%w[pending running]) %>
206
218
  <script>
207
219
  (function() {
@@ -1,3 +1,3 @@
1
1
  module CompletionKit
2
- VERSION = "0.27.10"
2
+ VERSION = "0.28.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: completion-kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.27.10
4
+ version: 0.28.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damien Bastin