completion-kit 0.27.3 → 0.27.5

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: ce7146633041f98e640bc4178adab7bcd061332d91ede886e925ddf57f7db99e
4
- data.tar.gz: 4ebd7d9c9590f4e0c5d84e92785afc852c0c583f895d2a38a77515b8e62e3d0f
3
+ metadata.gz: f36bc9d9d0e9aa1e0e6ed29dec74bef0021e112c1c2198f737313ccabd02c827
4
+ data.tar.gz: a3dd4f7b50e7bf96389b390fa985954fed6644b0cd33d1eda1edfa92613b6a04
5
5
  SHA512:
6
- metadata.gz: b6ca1e8722e58788cfd684c33c70998a3c730ed2520cc8944ab0f18e8f228cbad4fff888c693091ea0e9f308414d7cdf9e90351ff45b932826d89303c422a0a9
7
- data.tar.gz: 793f163f371634c7fe1c30bd02988d918e35f023e048da655878c4e111ca5df437affba18f2d2f122934f29d8a1d04af14f7fda36a60b24bcbe7ca7cb1b56e2f
6
+ metadata.gz: 74ca0f3de22ea9af05a5afc86771bad4e12e018d2342d76110fc699ad6630345cd7664c2e2169b98bf2c4120cfbd96369b98be42c425ea6206344e2348052819
7
+ data.tar.gz: 42ce6279ed741e065dbeb4e51dba9342f08e7059690852787fbd83a1e0b279435b867d92825f4714e9594c39e5fe117d92d1445a4d651db7f72896d86965501c
@@ -12,20 +12,30 @@ module CompletionKit
12
12
  30 * executions
13
13
  end
14
14
 
15
+ rescue_from(StandardError) do |error|
16
+ Rails.error.report(error, handled: true, context: { job: self.class.name, run_id: @run_id, response_id: @response_id })
17
+ record_terminal_failure!(error)
18
+ enqueue_completion_check
19
+ end
20
+
15
21
  retry_on Faraday::TimeoutError,
16
22
  Faraday::ConnectionFailed,
17
- wait: :polynomially_longer, attempts: 5
23
+ wait: :polynomially_longer, attempts: 5 do |job, error|
24
+ job.send(:record_terminal_failure!, error)
25
+ job.send(:enqueue_completion_check)
26
+ end
18
27
 
19
28
  retry_on CompletionKit::RateLimitError,
20
- wait: method(:rate_limit_wait), attempts: 5
29
+ wait: ->(executions) { rate_limit_wait(executions) }, attempts: 5 do |job, error|
30
+ job.send(:record_terminal_failure!, error)
31
+ job.send(:enqueue_completion_check)
32
+ end
21
33
 
22
34
  discard_on ActiveJob::DeserializationError
23
- discard_on CompletionKit::ConfigurationError
24
35
 
25
- rescue_from(StandardError) do |error|
26
- Rails.error.report(error, handled: true, context: { job: self.class.name, run_id: @run_id, response_id: @response_id })
27
- record_terminal_failure!(error)
28
- enqueue_completion_check
36
+ discard_on CompletionKit::ConfigurationError do |job, error|
37
+ job.send(:record_terminal_failure!, error)
38
+ job.send(:enqueue_completion_check)
29
39
  end
30
40
 
31
41
  before_perform do |job|
@@ -49,7 +59,12 @@ module CompletionKit
49
59
  raise ConfigurationError, client.configuration_errors.join(", ") unless client.configured?
50
60
 
51
61
  text = client.generate_completion(rendered, model: prompt.llm_model, temperature: run.temperature)
52
- raise StandardError, text.to_s.sub(/\AError:\s*/, "") if text.to_s.start_with?("Error:")
62
+
63
+ if text.to_s.start_with?("Error:")
64
+ record_terminal_failure!(ProviderError.from_client_error(text))
65
+ enqueue_completion_check
66
+ return
67
+ end
53
68
 
54
69
  if client.respond_to?(:temperature_dropped?) && client.temperature_dropped? && !run.temperature_ignored?
55
70
  run.update_columns(temperature_ignored: true)
@@ -14,20 +14,30 @@ module CompletionKit
14
14
  30 * executions
15
15
  end
16
16
 
17
+ rescue_from(StandardError) do |error|
18
+ Rails.error.report(error, handled: true, context: { job: self.class.name, run_id: @run_id, review_id: @review_id })
19
+ record_terminal_failure!(error)
20
+ enqueue_completion_check
21
+ end
22
+
17
23
  retry_on Faraday::TimeoutError,
18
24
  Faraday::ConnectionFailed,
19
- wait: :polynomially_longer, attempts: 5
25
+ wait: :polynomially_longer, attempts: 5 do |job, error|
26
+ job.send(:record_terminal_failure!, error)
27
+ job.send(:enqueue_completion_check)
28
+ end
20
29
 
21
30
  retry_on CompletionKit::RateLimitError,
22
- wait: method(:rate_limit_wait), attempts: 5
31
+ wait: ->(executions) { rate_limit_wait(executions) }, attempts: 5 do |job, error|
32
+ job.send(:record_terminal_failure!, error)
33
+ job.send(:enqueue_completion_check)
34
+ end
23
35
 
24
36
  discard_on ActiveJob::DeserializationError
25
- discard_on CompletionKit::ConfigurationError
26
37
 
27
- rescue_from(StandardError) do |error|
28
- Rails.error.report(error, handled: true, context: { job: self.class.name, run_id: @run_id, review_id: @review_id })
29
- record_terminal_failure!(error)
30
- enqueue_completion_check
38
+ discard_on CompletionKit::ConfigurationError do |job, error|
39
+ job.send(:record_terminal_failure!, error)
40
+ job.send(:enqueue_completion_check)
31
41
  end
32
42
 
33
43
  before_perform do |job|
@@ -52,15 +62,21 @@ module CompletionKit
52
62
  config = ApiConfig.for_model(run.judge_model).merge(judge_model: run.judge_model)
53
63
  judge = JudgeService.new(config)
54
64
 
55
- evaluation = judge.evaluate(
56
- response.response_text,
57
- response.expected_output,
58
- run.prompt&.template,
59
- criteria: metric.instruction.to_s,
60
- rubric_text: metric.display_rubric_text,
61
- input_data: response.input_data,
62
- human_examples: review_examples_for(metric, response)
63
- )
65
+ begin
66
+ evaluation = judge.evaluate(
67
+ response.response_text,
68
+ response.expected_output,
69
+ run.prompt&.template,
70
+ criteria: metric.instruction.to_s,
71
+ rubric_text: metric.display_rubric_text,
72
+ input_data: response.input_data,
73
+ human_examples: review_examples_for(metric, response)
74
+ )
75
+ rescue CompletionKit::ProviderError => e
76
+ record_terminal_failure!(e)
77
+ enqueue_completion_check
78
+ return
79
+ end
64
80
 
65
81
  review = response.reviews.find_or_initialize_by(metric_id: metric.id)
66
82
  current_metric_version = MetricVersion.ensure_current_for(metric)
@@ -30,6 +30,8 @@ module CompletionKit
30
30
  state: "published",
31
31
  published_at: Time.current
32
32
  )
33
+ rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid
34
+ current.find_by(metric_id: metric.id) || raise
33
35
  end
34
36
 
35
37
  def check?
@@ -20,7 +20,7 @@ module CompletionKit
20
20
  human_examples: human_examples)
21
21
 
22
22
  response = @judge_client.generate_completion(judge_prompt, model: @judge_model)
23
- raise StandardError, response if response.start_with?("Error:")
23
+ raise CompletionKit::ProviderError.from_client_error(response) if response.start_with?("Error:")
24
24
  parse_judge_response(response)
25
25
  end
26
26
 
@@ -125,6 +125,8 @@
125
125
  <% end %>
126
126
  <% elsif review.check? && !review.passed.nil? %>
127
127
  <%= ck_check_badge(review.passed) %>
128
+ <% elsif review.status == "failed" %>
129
+ <span class="<%= ck_badge_classes(:failed) %>" title="<%= review.error_message.presence || "Judge failed" %>">Failed</span>
128
130
  <% else %>
129
131
  <span class="<%= ck_badge_classes(:pending) %>">Pending</span>
130
132
  <% end %>
@@ -0,0 +1,56 @@
1
+ class DedupeAndUniqueIndexMetricVersions < ActiveRecord::Migration[8.1]
2
+ class MetricVersion < ActiveRecord::Base
3
+ self.table_name = "completion_kit_metric_versions"
4
+ end
5
+
6
+ class Review < ActiveRecord::Base
7
+ self.table_name = "completion_kit_reviews"
8
+ end
9
+
10
+ class Agreement < ActiveRecord::Base
11
+ self.table_name = "completion_kit_agreements"
12
+ end
13
+
14
+ def up
15
+ collapse_duplicate_versions
16
+ collapse_extra_current
17
+
18
+ remove_index :completion_kit_metric_versions, name: "index_ck_metric_versions_on_metric_vnum", if_exists: true
19
+ add_index :completion_kit_metric_versions, [:metric_id, :version_number],
20
+ unique: true, name: "index_ck_metric_versions_on_metric_vnum"
21
+ end
22
+
23
+ def down
24
+ remove_index :completion_kit_metric_versions, name: "index_ck_metric_versions_on_metric_vnum", if_exists: true
25
+ add_index :completion_kit_metric_versions, [:metric_id, :version_number],
26
+ name: "index_ck_metric_versions_on_metric_vnum"
27
+ end
28
+
29
+ private
30
+
31
+ def collapse_duplicate_versions
32
+ MetricVersion.order(:id).pluck(:id, :metric_id, :version_number)
33
+ .group_by { |(_, metric_id, version_number)| [metric_id, version_number] }
34
+ .each_value do |group|
35
+ next if group.size < 2
36
+
37
+ canonical = group.first.first
38
+ losers = group.drop(1).map(&:first)
39
+ Review.where(metric_version_id: losers).update_all(metric_version_id: canonical)
40
+ Agreement.where(metric_version_id: losers).update_all(metric_version_id: canonical)
41
+ MetricVersion.where(id: losers).delete_all
42
+ end
43
+ end
44
+
45
+ def collapse_extra_current
46
+ MetricVersion.where(current: true)
47
+ .order(metric_id: :asc, version_number: :desc, id: :desc)
48
+ .pluck(:id, :metric_id)
49
+ .group_by { |(_, metric_id)| metric_id }
50
+ .each_value do |rows|
51
+ next if rows.size < 2
52
+
53
+ MetricVersion.where(id: rows.drop(1).map(&:first)).update_all(current: false)
54
+ end
55
+ end
56
+ end
@@ -13,4 +13,22 @@ module CompletionKit
13
13
  @retry_after = retry_after
14
14
  end
15
15
  end
16
+
17
+ class ProviderError < Error
18
+ attr_reader :status
19
+
20
+ def initialize(message = nil, status: nil)
21
+ super(message)
22
+ @status = status
23
+ end
24
+
25
+ def self.from_client_error(text)
26
+ detail = text.to_s.sub(/\AError:\s*/, "")
27
+ if (match = detail.match(/\A(\d{3})\s*-\s*(.*)/m))
28
+ new(match[2], status: match[1].to_i)
29
+ else
30
+ new(detail)
31
+ end
32
+ end
33
+ end
16
34
  end
@@ -1,3 +1,3 @@
1
1
  module CompletionKit
2
- VERSION = "0.27.3"
2
+ VERSION = "0.27.5"
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.3
4
+ version: 0.27.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damien Bastin
@@ -480,6 +480,7 @@ files:
480
480
  - db/migrate/20260706000001_add_expected_column_to_completion_kit_runs.rb
481
481
  - db/migrate/20260708000001_add_api_version_to_completion_kit_provider_credentials.rb
482
482
  - db/migrate/20260713000001_add_catalog_model_count_to_completion_kit_provider_credentials.rb
483
+ - db/migrate/20260715000001_dedupe_and_unique_index_metric_versions.rb
483
484
  - lib/completion-kit.rb
484
485
  - lib/completion_kit.rb
485
486
  - lib/completion_kit/concurrency_check.rb