completion-kit 0.28.4 → 0.28.6

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: ff8dc1fe1d84c274b21d8ff9d3dd6e21d547f9c780ba0a071c875abcac3d5459
4
- data.tar.gz: de30042560e897432acbb192aebb6a3735301b644383b2ba49eb123f77e80607
3
+ metadata.gz: 7950505efda6021332c751aba8955d2d03422eac9e4524dec309f0596c17f99a
4
+ data.tar.gz: dd2f48362e9be4880d2616386ed952abe1e6217ec7aa2499a50676c4c2a31d50
5
5
  SHA512:
6
- metadata.gz: abf4fea98a8014b6f8cd7155cc54edfdc40bd23a2d2d08a2a864dcc7764e841a1d2554950aca3b22b48b786151da0f5b8237c4ff82c6924799664d2a6c663cd0
7
- data.tar.gz: 6fc8a7683d26cad922086fafd56cacdbd762f4bc766078a1bf5c0f2335a429ba4ec1c5ccac509bec7650a60e9d20747f29680d28344161f186fdff4dca2d9f62
6
+ metadata.gz: 22906fafff6c64c9add7a22a087180d1cc2cf51afd45a95e4235db07fe8872adf4d29fb354a4bcd52768b0ae6f3dc8682924a5c29ecd6957b54c7433e2865d63
7
+ data.tar.gz: f6548a9160c45b40553659a95ce16ad593b7c3a4d8adb531644bb80d5a6a1fb7d4c88b888cbd24f0852b2a6b4df31f6d22b4d5efec5f95de200d483fdb37913a
@@ -1,5 +1,12 @@
1
1
  module CompletionKit
2
2
  class McpController < Api::V1::BaseController
3
+ skip_before_action :authenticate_api!, only: :stream
4
+
5
+ def stream
6
+ response.set_header("Allow", "POST, DELETE")
7
+ head :method_not_allowed
8
+ end
9
+
3
10
  def handle
4
11
  request_body = JSON.parse(request.body.read)
5
12
 
@@ -16,7 +16,7 @@ module CompletionKit
16
16
  @responses_total = @run.responses.count
17
17
  @responses_per_page = RESPONSES_PER_PAGE
18
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)
19
+ @responses_page = params[:page].to_s.to_i.clamp(1, @responses_total_pages)
20
20
  @responses_offset = (@responses_page - 1) * RESPONSES_PER_PAGE
21
21
  @responses = ordered_responses_relation(@run, params[:sort])
22
22
  .includes(:reviews)
@@ -18,7 +18,7 @@ module CompletionKit
18
18
  discard_on ActiveJob::DeserializationError
19
19
 
20
20
  rescue_from(StandardError) do |error|
21
- if error.is_a?(CompletionKit::ModelDiscoveryService::DiscoveryError)
21
+ unless error.is_a?(CompletionKit::ModelDiscoveryService::DiscoveryError)
22
22
  Rails.error.report(error, handled: true, context: { job: self.class.name, provider_credential_id: arguments.first })
23
23
  end
24
24
  credential = ProviderCredential.find_by(id: arguments.first)
@@ -63,9 +63,19 @@ module CompletionKit
63
63
  return nil if body.blank?
64
64
  data = JSON.parse(body)
65
65
  err = data["error"]
66
- (err.is_a?(Hash) && err["message"]) || data["message"] || (err.is_a?(String) && err) || nil
66
+ message = (err.is_a?(Hash) && err["message"]) || data["message"] || (err.is_a?(String) && err) || nil
67
+ redact_secrets(message)
67
68
  rescue JSON::ParserError
68
- body.to_s.truncate(200)
69
+ redact_secrets(body.to_s.truncate(200))
70
+ end
71
+
72
+ def redact_secrets(text)
73
+ return text if text.blank?
74
+ redacted = text.to_s
75
+ redacted = redacted.gsub(@api_key, "[REDACTED]") if @api_key.present?
76
+ redacted = redacted.gsub(/\bsk-[A-Za-z0-9_-]{6,}/, "[REDACTED]")
77
+ redacted = redacted.gsub(/\bBearer\s+\S+/i, "Bearer [REDACTED]")
78
+ redacted.gsub(/(API key provided:\s*)\S+/i, '\1[REDACTED]')
69
79
  end
70
80
 
71
81
  def fetch_openai_models
@@ -336,11 +346,11 @@ module CompletionKit
336
346
  end
337
347
  else
338
348
  model.supports_generation = false
339
- model.generation_error = "#{response.status} - #{response.body.truncate(500)}"
349
+ model.generation_error = redact_secrets("#{response.status} - #{response.body.truncate(500)}")
340
350
  end
341
351
  rescue StandardError => e
342
352
  model.supports_generation = false
343
- model.generation_error = e.message
353
+ model.generation_error = redact_secrets(e.message)
344
354
  end
345
355
 
346
356
  def probe_judging(model)
@@ -364,11 +374,11 @@ module CompletionKit
364
374
  end
365
375
  else
366
376
  model.supports_judging = false
367
- model.judging_error = "#{response.status} - #{response.body.truncate(500)}"
377
+ model.judging_error = redact_secrets("#{response.status} - #{response.body.truncate(500)}")
368
378
  end
369
379
  rescue StandardError => e
370
380
  model.supports_judging = false
371
- model.judging_error = e.message
381
+ model.judging_error = redact_secrets(e.message)
372
382
  end
373
383
 
374
384
  OPENAI_REASONING_PROBE_BUDGET = 65_536
data/config/routes.rb CHANGED
@@ -102,6 +102,7 @@ CompletionKit::Engine.routes.draw do
102
102
  end
103
103
  end
104
104
 
105
+ get "mcp", to: "mcp#stream"
105
106
  post "mcp", to: "mcp#handle"
106
107
  delete "mcp", to: "mcp#destroy"
107
108
  end
@@ -1,3 +1,3 @@
1
1
  module CompletionKit
2
- VERSION = "0.28.4"
2
+ VERSION = "0.28.6"
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.4
4
+ version: 0.28.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damien Bastin
@@ -189,14 +189,14 @@ dependencies:
189
189
  requirements:
190
190
  - - "~>"
191
191
  - !ruby/object:Gem::Version
192
- version: '0.22'
192
+ version: '1.0'
193
193
  type: :development
194
194
  prerelease: false
195
195
  version_requirements: !ruby/object:Gem::Requirement
196
196
  requirements:
197
197
  - - "~>"
198
198
  - !ruby/object:Gem::Version
199
- version: '0.22'
199
+ version: '1.0'
200
200
  - !ruby/object:Gem::Dependency
201
201
  name: solid_queue
202
202
  requirement: !ruby/object:Gem::Requirement