Class: ImageMetadataSuggester
- Inherits:
-
Object
- Object
- ImageMetadataSuggester
- Defined in:
- app/services/image_metadata_suggester.rb
Overview
Generates AI-powered metadata suggestions for an existing library image.
Uses the image's existing fields (title, tags, meta_title, meta_description,
notes) AND — when available — its vision analysis description to produce
SEO-conscious improvements.
Defined Under Namespace
Classes: Result
Constant Summary collapse
- PREFERRED_MODELS =
Preferred models, in availability order — cheap, fast, multimodal-capable.
All ids come from the central registry (AiModelConstants) so they track the
current snapshots instead of pinning stale ones here. [ *AiModelConstants.candidates(:image_suggestion), AiModelConstants.id(:anthropic_haiku) ].freeze
Class Method Summary collapse
Instance Method Summary collapse
- #call ⇒ Object
-
#initialize(image) ⇒ ImageMetadataSuggester
constructor
A new instance of ImageMetadataSuggester.
Constructor Details
#initialize(image) ⇒ ImageMetadataSuggester
Returns a new instance of ImageMetadataSuggester.
47 48 49 |
# File 'app/services/image_metadata_suggester.rb', line 47 def initialize(image) @image = image end |
Class Method Details
.call(image) ⇒ Object
43 44 45 |
# File 'app/services/image_metadata_suggester.rb', line 43 def self.call(image) new(image).call end |
Instance Method Details
#call ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'app/services/image_metadata_suggester.rb', line 51 def call model = select_model return Result.new(error: 'No LLM model available for metadata suggestions') unless model = generate_suggestions(model) parsed = parse_response(.content.to_s) Result.new( title: parsed[:title], meta_title: parsed[:meta_title], meta_description: parsed[:meta_description], tags: parsed[:tags] || [], notes: parsed[:notes], input_tokens: .input_tokens, output_tokens: .output_tokens, model_id: model ) rescue RubyLLM::RateLimitError => e Rails.logger.warn "[ImageMetadataSuggester] Rate limited for Image #{@image.id}: #{e.}" Result.new(error: "Rate limited — please retry shortly") rescue RubyLLM::Error => e Rails.logger.warn "[ImageMetadataSuggester] RubyLLM error for Image #{@image.id}: #{e.}" Result.new(error: e.) rescue StandardError => e Rails.logger.warn "[ImageMetadataSuggester] Failed for Image #{@image.id}: #{e.}" Result.new(error: e.) end |