Module: Kward::RPC::Redactor

Defined in:
lib/kward/rpc/redactor.rb

Constant Summary collapse

SECRET_KEYS =
/(?:token|secret|api[_-]?key|authorization|password|credential)/i

Class Method Summary collapse

Class Method Details

.redact(value) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/kward/rpc/redactor.rb', line 8

def redact(value)
  case value
  when Hash
    value.each_with_object({}) do |(key, item), result|
      if token_count_key?(key.to_s) && item.is_a?(Numeric)
        result[key] = item
      elsif secret_key?(key)
        result[key] = "[REDACTED]"
      else
        result[key] = redact(item)
      end
    end
  when Array
    value.map { |item| redact(item) }
  when String
    redact_string(value)
  else
    value
  end
end

.redact_string(value) ⇒ Object



29
30
31
32
33
# File 'lib/kward/rpc/redactor.rb', line 29

def redact_string(value)
  value
    .gsub(/Bearer\s+[^\s"']+/i, "Bearer [REDACTED]")
    .gsub(/(sk-[A-Za-z0-9_-]{8,})/, "[REDACTED]")
end

.secret_key?(key) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
39
40
# File 'lib/kward/rpc/redactor.rb', line 35

def secret_key?(key)
  text = key.to_s
  return false if text == "apiKeyProviders"

  text.match?(SECRET_KEYS)
end

.token_count_key?(key) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/kward/rpc/redactor.rb', line 42

def token_count_key?(key)
  key.match?(/\A(?:input|output|cache_read|cache_write|total)_tokens\z/) || key == "estimated"
end