completion-kit 0.28.32 → 0.28.34

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: 58dfff9f577e36bd13a32f6670ad1c095c23492238fd50043bd2ccceca648e98
4
- data.tar.gz: 0c8a0d5e4c96e8bccff0a93ede04aef40c650255f1271162537a8a63008314a6
3
+ metadata.gz: b098378de17e0d51976041f5376929f0fd220bc23e86f1044bf89133b3b7210e
4
+ data.tar.gz: 65742e5a42a70e82fe3f4216652e8a80e4b08552eb54cc4a7e8621969a8dd26f
5
5
  SHA512:
6
- metadata.gz: 15b9d07c9bd067885ab2d47ed580d7237dd49e1f6e0b64874a46664db8f02d5c0f1cdde7b183431c9244769a6b96bbb4279d8c5062fc890755bf9b43542ca4cb
7
- data.tar.gz: '08fd16f17461b4960aecffdcc350347120d2a5d786327d982adfab7f3b0cfcdaa1e011eb7e81ec5773c39390baa48f3477bed115358e2d4a043205acd33a58f9'
6
+ metadata.gz: 3ac30e089d1ec6597556b0f4744315d07f1bf94207e174055a6e7ae51ee09f88b180a681ee79cd671cf1887cfee7cd1e99584adda5e95411d8a09ad4c96d5071
7
+ data.tar.gz: ba7069754a2f1048da264f66a29e630f220225be24a7078bc4bc6b5a5004d328b02e42046b6b58c5a53a294d293fd386b81eccfbbd7f3b7cfd59d5b545062741
@@ -4421,6 +4421,8 @@ table.ck-runs-table {
4421
4421
  display: flex;
4422
4422
  align-items: center;
4423
4423
  justify-content: space-between;
4424
+ flex-wrap: wrap;
4425
+ gap: 0.75rem;
4424
4426
  }
4425
4427
 
4426
4428
  .ck-prompt-preview__header .ck-kicker {
@@ -5686,6 +5688,13 @@ a.tag-mark {
5686
5688
  text-overflow: ellipsis;
5687
5689
  white-space: nowrap;
5688
5690
  }
5691
+ .ck-failure-list__count {
5692
+ margin-left: auto;
5693
+ flex: none;
5694
+ font-family: var(--ck-mono);
5695
+ font-size: 0.72rem;
5696
+ color: var(--ck-dim);
5697
+ }
5689
5698
  .ck-failure-list__item .ck-icon-btn { margin-left: auto; }
5690
5699
 
5691
5700
  /* Flyout: lives inline in the card's always-present footer row, so the
@@ -9,7 +9,7 @@ module CompletionKit
9
9
  ordered_ids = ordered_response_ids
10
10
  current_index = ordered_ids.index(@response.id)
11
11
  @response_number = current_index + 1
12
- @reviews = @response.reviews.includes(:metric)
12
+ @reviews = @response.reviews.includes(:metric, :metric_version)
13
13
  @prev_response = current_index > 0 ? ordered_ids[current_index - 1] : nil
14
14
  @next_response = ordered_ids[current_index + 1]
15
15
  end
@@ -202,6 +202,24 @@ module CompletionKit
202
202
  end
203
203
  end
204
204
 
205
+ def ck_review_section_header(reviews, judge_model)
206
+ kinds = reviews.filter_map(&:effective_metric_type)
207
+ judge = kinds.include?("llm_judge")
208
+ check = kinds.include?("check")
209
+
210
+ heading = if judge && check
211
+ "Judge's review and checks"
212
+ elsif judge
213
+ "Judge's review"
214
+ elsif check
215
+ "Checks"
216
+ else
217
+ "Reviews"
218
+ end
219
+
220
+ {heading: heading, judge_model: judge ? judge_model.presence : nil}
221
+ end
222
+
205
223
  CHECK_KIND_LABELS = {
206
224
  "contains" => "Contains a phrase",
207
225
  "not_contains" => "Does not contain a phrase",
@@ -17,7 +17,11 @@ module CompletionKit
17
17
  after_save_commit :broadcast_run_progress, if: :should_broadcast_progress?
18
18
 
19
19
  def check?
20
- metric_version&.metric_type == "check"
20
+ effective_metric_type == "check"
21
+ end
22
+
23
+ def effective_metric_type
24
+ metric_version&.metric_type || metric&.metric_type
21
25
  end
22
26
 
23
27
  def stale_against_current_judge?
@@ -23,21 +23,23 @@
23
23
  </div>
24
24
 
25
25
  <% if failing_checks[:items].any? %>
26
+ <% worst = failing_checks[:items].group_by { |item| item[:metric_name] }
27
+ .sort_by { |name, items| [-items.length, name.to_s] } %>
26
28
  <ul class="ck-failure-list">
27
- <% failing_checks[:items].first(2).each do |item| %>
29
+ <% worst.first(2).each do |metric_name, items| %>
28
30
  <li class="ck-failure-list__item">
29
31
  <span class="ck-failure-list__surface ck-failure-list__surface--check">fail</span>
30
- <%= link_to item[:metric_name], completion_kit.run_path(item[:run]),
31
- class: "ck-link ck-failure-list__cause", title: "Failed in #{item[:run].name}" %>
32
+ <%= link_to metric_name, completion_kit.run_path(items.first[:run]),
33
+ class: "ck-link ck-failure-list__cause",
34
+ title: "Most recently in #{items.first[:run].name}" %>
35
+ <span class="ck-failure-list__count"><%= items.length %></span>
32
36
  </li>
33
37
  <% end %>
34
38
  </ul>
35
39
  <% end %>
36
40
 
37
41
  <div class="ck-stat-card__foot">
38
- <% if failing_checks[:count] > 2 %>
39
- <span><%= failing_checks[:count] - 2 %> more failing.</span>
40
- <% elsif failing_checks[:count].positive? %>
42
+ <% if failing_checks[:count].positive? %>
41
43
  <span><%= pluralize(failing_checks[:count], "check") %> failing in the window.</span>
42
44
  <% elsif resolved.positive? %>
43
45
  <span>Every check passed in the window.</span>
@@ -95,11 +95,12 @@
95
95
  <% end %>
96
96
 
97
97
  <% if @reviews.any? %>
98
+ <% review_header = ck_review_section_header(@reviews, @run.judge_model) %>
98
99
  <section class="ck-card--spaced">
99
- <div class="ck-prompt-preview__header">
100
- <p class="ck-kicker">Judge's review</p>
101
- <% if @run.judge_model.present? %>
102
- <span class="ck-chip ck-chip--soft" style="text-transform: none;"><%= @run.judge_model %></span>
100
+ <div class="ck-prompt-preview__header" data-ck-review-header>
101
+ <p class="ck-kicker"><%= review_header[:heading] %></p>
102
+ <% if review_header[:judge_model] %>
103
+ <span class="ck-chip ck-chip--soft" style="text-transform: none;"><%= review_header[:judge_model] %></span>
103
104
  <% end %>
104
105
  </div>
105
106
 
@@ -126,7 +127,7 @@
126
127
  <% elsif review.check? && !review.passed.nil? %>
127
128
  <%= ck_check_badge(review.passed) %>
128
129
  <% elsif review.status == "failed" %>
129
- <span class="<%= ck_badge_classes(:failed) %>" title="<%= review.error_message.presence || "Judge failed" %>">Failed</span>
130
+ <span class="<%= ck_badge_classes(:failed) %>" title="<%= review.error_message.presence || (review.check? ? "Check failed" : "Judge failed") %>">Failed</span>
130
131
  <% else %>
131
132
  <span class="<%= ck_badge_classes(:pending) %>">Pending</span>
132
133
  <% end %>
@@ -1,3 +1,3 @@
1
1
  module CompletionKit
2
- VERSION = "0.28.32"
2
+ VERSION = "0.28.34"
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.28.32
4
+ version: 0.28.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damien Bastin
@@ -173,7 +173,7 @@ description: CompletionKit is a prompt testing platform that runs as a Rails eng
173
173
  or a standalone app. Run prompts against real datasets, score every output with
174
174
  an LLM judge against criteria you define, track prompt versions, and get AI-generated
175
175
  improvement suggestions grounded in your actual results. Includes a web UI, REST
176
- API, and a built-in MCP server with 34 tools.
176
+ API, and a built-in MCP server with 53 tools.
177
177
  email:
178
178
  - damien@homemade.software
179
179
  executables: []