Class: ActiveCanvas::AiModels

Inherits:
Object
  • Object
show all
Defined in:
app/services/active_canvas/ai_models.rb

Constant Summary collapse

DEFAULT_TEXT_MODELS =

Fallback models when database is empty

[
  { id: "gpt-4o", name: "GPT-4o", provider: "openai",
    input_modalities: %w[text image], output_modalities: %w[text] },
  { id: "gpt-4o-mini", name: "GPT-4o Mini", provider: "openai",
    input_modalities: %w[text image], output_modalities: %w[text] },
  { id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4", provider: "anthropic",
    input_modalities: %w[text image], output_modalities: %w[text] },
  { id: "claude-3-5-haiku-20241022", name: "Claude 3.5 Haiku", provider: "anthropic",
    input_modalities: %w[text], output_modalities: %w[text] }
].freeze
DEFAULT_IMAGE_MODELS =
[
  { id: "dall-e-3", name: "DALL-E 3", provider: "openai",
    input_modalities: %w[text], output_modalities: %w[image] },
  { id: "gpt-image-1", name: "GPT Image 1", provider: "openai",
    input_modalities: %w[text], output_modalities: %w[image] }
].freeze
DEFAULT_VISION_MODELS =
[
  { id: "gpt-4o", name: "GPT-4o", provider: "openai",
    input_modalities: %w[text image], output_modalities: %w[text] },
  { id: "gpt-4o-mini", name: "GPT-4o Mini", provider: "openai",
    input_modalities: %w[text image], output_modalities: %w[text] },
  { id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4", provider: "anthropic",
    input_modalities: %w[text image], output_modalities: %w[text] }
].freeze

Class Method Summary collapse

Class Method Details

.all_image_modelsObject



64
65
66
67
68
69
# File 'app/services/active_canvas/ai_models.rb', line 64

def all_image_models
  models = AiModel.active.image_models.order(:provider, :name)
  return models.map(&:as_json_for_editor) if models.any?

  DEFAULT_IMAGE_MODELS
end

.all_text_modelsObject



57
58
59
60
61
62
# File 'app/services/active_canvas/ai_models.rb', line 57

def all_text_models
  models = AiModel.active.text_models.order(:provider, :name)
  return models.map(&:as_json_for_editor) if models.any?

  DEFAULT_TEXT_MODELS
end

.all_vision_modelsObject



71
72
73
74
75
76
# File 'app/services/active_canvas/ai_models.rb', line 71

def all_vision_models
  models = AiModel.active.vision_models.order(:provider, :name)
  return models.map(&:as_json_for_editor) if models.any?

  DEFAULT_VISION_MODELS
end

.find_by_id(model_id) ⇒ Object



78
79
80
# File 'app/services/active_canvas/ai_models.rb', line 78

def find_by_id(model_id)
  AiModel.find_by(model_id: model_id)
end

.image_modelsObject



43
44
45
46
47
48
# File 'app/services/active_canvas/ai_models.rb', line 43

def image_models
  models = fetch_image_models_from_db
  return models if models.any?

  filter_by_configured_providers(DEFAULT_IMAGE_MODELS)
end

.last_synced_atObject



86
87
88
# File 'app/services/active_canvas/ai_models.rb', line 86

def last_synced_at
  AiModel.maximum(:updated_at)
end

.models_synced?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'app/services/active_canvas/ai_models.rb', line 82

def models_synced?
  AiModel.exists?
end

.refresh!Object



32
33
34
# File 'app/services/active_canvas/ai_models.rb', line 32

def refresh!
  AiModel.refresh_from_ruby_llm!
end

.text_modelsObject



36
37
38
39
40
41
# File 'app/services/active_canvas/ai_models.rb', line 36

def text_models
  models = fetch_text_models_from_db
  return models if models.any?

  filter_by_configured_providers(DEFAULT_TEXT_MODELS)
end

.vision_modelsObject



50
51
52
53
54
55
# File 'app/services/active_canvas/ai_models.rb', line 50

def vision_models
  models = fetch_vision_models_from_db
  return models if models.any?

  filter_by_configured_providers(DEFAULT_VISION_MODELS)
end