Skip to content
Kward Search API index

Class: Kward::OpenRouterModelCache

Inherits:
Object
  • Object
show all
Defined in:
lib/kward/openrouter_model_cache.rb

Overview

Fetches and stores the OpenRouter model list available to the configured API key.

Constant Summary collapse

MODELS_URL =
URI("https://openrouter.ai/api/v1/models/user")
VERSION =
1

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_key:, path: ConfigFiles.openrouter_models_cache_path) ⇒ OpenRouterModelCache

Returns a new instance of OpenRouterModelCache.



18
19
20
21
# File 'lib/kward/openrouter_model_cache.rb', line 18

def initialize(api_key:, path: ConfigFiles.openrouter_models_cache_path)
  @api_key = api_key.to_s
  @path = File.expand_path(path)
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



16
17
18
# File 'lib/kward/openrouter_model_cache.rb', line 16

def path
  @path
end

Class Method Details

.model_entry?(entry) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
26
27
28
29
30
# File 'lib/kward/openrouter_model_cache.rb', line 23

def self.model_entry?(entry)
  return false unless entry.is_a?(Hash)

  architecture = entry["architecture"].is_a?(Hash) ? entry["architecture"] : {}
  input_modalities = Array(architecture["input_modalities"]).map(&:to_s)
  output_modalities = Array(architecture["output_modalities"]).map(&:to_s)
  input_modalities.include?("text") && output_modalities.include?("text")
end

Instance Method Details

#matching_key?Boolean

Returns:

  • (Boolean)


64
65
66
67
68
69
# File 'lib/kward/openrouter_model_cache.rb', line 64

def matching_key?
  data = read
  return false unless data

  data["api_key_sha256"] == api_key_sha256
end

#modelsObject



60
61
62
# File 'lib/kward/openrouter_model_cache.rb', line 60

def models
  Array(read&.fetch("models", []))
end

#readObject



49
50
51
52
53
54
55
56
57
58
# File 'lib/kward/openrouter_model_cache.rb', line 49

def read
  return nil unless File.exist?(@path)

  data = JSON.parse(File.read(@path))
  return nil unless data.is_a?(Hash) && data["version"] == VERSION

  data
rescue JSON::ParserError
  nil
end

#refreshObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/kward/openrouter_model_cache.rb', line 32

def refresh
  raise "No OpenRouter API key found. Set OPENROUTER_API_KEY or add openrouter_api_key to your Kward config." if @api_key.empty?

  response = Net::HTTP.start(MODELS_URL.hostname, MODELS_URL.port, use_ssl: true) do |http|
    http.request(refresh_request)
  end
  unless response.is_a?(Net::HTTPSuccess)
    raise "OpenRouter model refresh failed: #{response.code} #{redact(response.body)}"
  end

  entries = model_entries(response.body)
  models = entries.select { |entry| self.class.model_entry?(entry) }.map { |entry| normalize_model(entry) }.uniq { |model| model["id"] }.sort_by { |model| model["id"] }
  data = cache_data(models)
  PrivateFile.write_json(@path, data)
  data
end