Class: CompletionKit::ProviderCredential

Inherits:
ApplicationRecord show all
Includes:
Turbo::Broadcastable
Defined in:
app/models/completion_kit/provider_credential.rb

Constant Summary collapse

PROVIDERS =
%w[openai anthropic ollama openrouter].freeze
PROVIDER_LABELS =
{
  "openai" => "OpenAI",
  "anthropic" => "Anthropic",
  "ollama" => "Ollama / local endpoint",
  "openrouter" => "OpenRouter"
}.freeze

Constants inherited from ApplicationRecord

ApplicationRecord::TenantScopedUniquenessValidator

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.discovery_in_progress?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'app/models/completion_kit/provider_credential.rb', line 58

def self.discovery_in_progress?
  where(discovery_status: "discovering").exists?
end

Instance Method Details

#as_json(options = {}) ⇒ Object



17
18
19
20
21
22
# File 'app/models/completion_kit/provider_credential.rb', line 17

def as_json(options = {})
  {
    id: id, provider: provider, api_endpoint: api_endpoint,
    created_at: created_at, updated_at: updated_at
  }
end

#available_modelsObject



42
43
44
45
46
# File 'app/models/completion_kit/provider_credential.rb', line 42

def available_models
  LlmClient.for_provider(provider, config_hash).available_models
rescue StandardError
  []
end

#broadcast_discovery_completeObject



93
94
95
96
# File 'app/models/completion_kit/provider_credential.rb', line 93

def broadcast_discovery_complete
  broadcast_discovery_progress
  broadcast_model_dropdowns
end

#broadcast_discovery_progressObject



84
85
86
87
88
89
90
91
# File 'app/models/completion_kit/provider_credential.rb', line 84

def broadcast_discovery_progress
  broadcast_replace_to(
    "completion_kit_provider_#{id}",
    target: "discovery_status_#{id}",
    html: render_partial("completion_kit/provider_credentials/discovery_status", provider_credential: self)
  )
  broadcast_provider_models
end

#broadcast_provider_modelsObject



98
99
100
101
102
103
104
105
106
# File 'app/models/completion_kit/provider_credential.rb', line 98

def broadcast_provider_models
  Turbo::StreamsChannel.broadcast_action_to(
    "completion_kit_provider_#{id}",
    action: "replace",
    target: "provider_models_#{id}",
    method: "morph",
    html: render_partial("completion_kit/provider_credentials/models_card", provider_credential: self)
  )
end

#config_hashObject



34
35
36
37
38
39
40
# File 'app/models/completion_kit/provider_credential.rb', line 34

def config_hash
  {
    provider: provider,
    api_key: api_key,
    api_endpoint: api_endpoint
  }.compact
end

#configured?Boolean

Returns:

  • (Boolean)


48
49
50
51
52
# File 'app/models/completion_kit/provider_credential.rb', line 48

def configured?
  LlmClient.for_provider(provider, config_hash).configured?
rescue StandardError
  false
end

#display_providerObject



24
25
26
# File 'app/models/completion_kit/provider_credential.rb', line 24

def display_provider
  PROVIDER_LABELS[provider] || provider.titleize
end

#judge_countObject



68
69
70
71
72
# File 'app/models/completion_kit/provider_credential.rb', line 68

def judge_count
  model_ids = Model.where(provider: provider).pluck(:model_id)
  return 0 if model_ids.empty?
  Run.where(judge_model: model_ids).distinct.count(:judge_model)
end

#last_used_atObject



74
75
76
77
78
79
80
81
82
# File 'app/models/completion_kit/provider_credential.rb', line 74

def last_used_at
  model_ids = Model.where(provider: provider).pluck(:model_id)
  return nil if model_ids.empty?
  prompt_scope = Prompt.where(llm_model: model_ids).select(:id)
  Run.where("prompt_id IN (:prompts) OR judge_model IN (:models)",
            prompts: prompt_scope, models: model_ids)
     .where.not(status: "pending")
     .maximum(:created_at)
end

#model_countObject



54
55
56
# File 'app/models/completion_kit/provider_credential.rb', line 54

def model_count
  Model.where(provider: provider).active.count
end

#prompt_countObject



62
63
64
65
66
# File 'app/models/completion_kit/provider_credential.rb', line 62

def prompt_count
  model_ids = Model.where(provider: provider).pluck(:model_id)
  return 0 if model_ids.empty?
  Prompt.where(llm_model: model_ids, current: true).count
end