Class: CompletionKit::ApiConfig

Inherits:
Object
  • Object
show all
Defined in:
app/services/completion_kit/api_config.rb

Class Method Summary collapse

Class Method Details

.available_models(provider: nil, scope: :generation) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/services/completion_kit/api_config.rb', line 56

def self.available_models(provider: nil, scope: :generation)
  query = case scope
          when :judging then Model.for_judging
          when :generation then Model.for_generation
          else Model.active
          end
  query = query.where(provider: provider) if provider.present?
  models = query.order(:provider, :display_name).map do |m|
    { id: m.model_id, name: m.display_name || m.model_id, provider: m.provider }
  end

  return models if models.any?

  configured = ProviderCredential.pluck(:provider)
  providers = provider.present? ? [provider.to_s] : configured
  providers.flat_map do |provider_name|
    next [] unless configured.include?(provider_name)
    client = LlmClient.for_provider(provider_name, for_provider(provider_name))
    client.available_models.map { |model| model.symbolize_keys.merge(provider: provider_name) }
  rescue StandardError
    []
  end.uniq { |model| model[:id] }
end

.errors_for_model(model_name) ⇒ Object



51
52
53
54
# File 'app/services/completion_kit/api_config.rb', line 51

def self.errors_for_model(model_name)
  client = LlmClient.for_model(model_name, for_model(model_name))
  client.configuration_errors
end

.for_model(model_name) ⇒ Object



3
4
5
6
# File 'app/services/completion_kit/api_config.rb', line 3

def self.for_model(model_name)
  provider = provider_for_model(model_name)
  provider ? for_provider(provider) : {}
end

.for_provider(provider_name) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'app/services/completion_kit/api_config.rb', line 8

def self.for_provider(provider_name)
  provider = provider_name.to_s
  stored = ProviderCredential.find_by(provider: provider)&.config_hash || {}

  defaults = case provider
             when "openai"
               { provider: "openai", api_key: CompletionKit.config.openai_api_key || ENV["OPENAI_API_KEY"] }
             when "anthropic"
               { provider: "anthropic", api_key: CompletionKit.config.anthropic_api_key || ENV["ANTHROPIC_API_KEY"] }
             when "ollama"
               {
                 provider: "ollama",
                 api_key: CompletionKit.config.ollama_api_key || ENV["OLLAMA_API_KEY"],
                 api_endpoint: CompletionKit.config.ollama_api_endpoint || ENV["OLLAMA_API_ENDPOINT"]
               }
             when "openrouter"
               { provider: "openrouter", api_key: ENV["OPENROUTER_API_KEY"] }
             else
               {}
             end

  defaults.merge(stored.compact)
end

.provider_for_model(model_name) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'app/services/completion_kit/api_config.rb', line 32

def self.provider_for_model(model_name)
  available_match = available_models.find { |model| model[:id] == model_name.to_s }
  return available_match[:provider] if available_match

  case model_name.to_s
  when /\Agpt-/
    "openai"
  when /\Aclaude-/
    "anthropic"
  else
    nil
  end
end

.valid_for_model?(model_name) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
# File 'app/services/completion_kit/api_config.rb', line 46

def self.valid_for_model?(model_name)
  client = LlmClient.for_model(model_name, for_model(model_name))
  client.configured?
end