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 +4 -4
- data/app/assets/javascripts/completion_kit/application.js +10 -6
- data/app/assets/stylesheets/completion_kit/application.css +26 -4
- data/app/controllers/completion_kit/runs_controller.rb +11 -1
- data/app/models/completion_kit/run.rb +34 -26
- data/app/views/completion_kit/runs/_response_row.html.erb +2 -2
- data/app/views/completion_kit/runs/show.html.erb +13 -1
- data/lib/completion_kit/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8936acc5b9ab944e059386e4e3a8d81e460aec2220a49c25ccf0436cf81fe581
|
|
4
|
+
data.tar.gz: b73cfe2e1d78ca7093bddcc1c0bc7b46f9cbf14267731197fa3d57ef1c017d85
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
@
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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 %>← Prev<% end %>
|
|
209
|
+
<% end %>
|
|
210
|
+
<span class="ck-meta-copy">Page <%= @responses_page %> of <%= @responses_total_pages %> · <%= 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 →<% end %>
|
|
213
|
+
<% end %>
|
|
214
|
+
</nav>
|
|
215
|
+
<% end %>
|
|
216
|
+
|
|
205
217
|
<% if @run.status.in?(%w[pending running]) %>
|
|
206
218
|
<script>
|
|
207
219
|
(function() {
|