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)


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

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

Instance Method Details

#as_json(options = {}) ⇒ Object



14
15
16
17
18
19
# File 'app/models/completion_kit/provider_credential.rb', line 14

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

#available_modelsObject



38
39
40
41
42
# File 'app/models/completion_kit/provider_credential.rb', line 38

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

#broadcast_discovery_completeObject



89
90
91
92
# File 'app/models/completion_kit/provider_credential.rb', line 89

def broadcast_discovery_complete
  broadcast_discovery_progress
  broadcast_model_dropdowns
end

#broadcast_discovery_progressObject



80
81
82
83
84
85
86
87
# File 'app/models/completion_kit/provider_credential.rb', line 80

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



94
95
96
97
98
99
100
101
102
# File 'app/models/completion_kit/provider_credential.rb', line 94

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



30
31
32
33
34
35
36
# File 'app/models/completion_kit/provider_credential.rb', line 30

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

#configured?Boolean

Returns:

  • (Boolean)


44
45
46
47
48
# File 'app/models/completion_kit/provider_credential.rb', line 44

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

#display_providerObject



21
22
23
# File 'app/models/completion_kit/provider_credential.rb', line 21

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

#judge_countObject



64
65
66
67
68
# File 'app/models/completion_kit/provider_credential.rb', line 64

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



70
71
72
73
74
75
76
77
78
# File 'app/models/completion_kit/provider_credential.rb', line 70

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



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

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

#prompt_countObject



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

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