Class: DailyLlmModelSyncWorker
- Inherits:
-
Object
- Object
- DailyLlmModelSyncWorker
- Includes:
- Sidekiq::Worker
- Defined in:
- app/workers/daily_llm_model_sync_worker.rb
Overview
Nightly sync of the live provider model registry into the llm_models table.
After syncing, validates every model referenced in AiModelConstants against
the refreshed registry and sends a report when issues are detected.
Runs nightly at 3 AM CT via sidekiq-cron. Idempotent — safe to re-run.
Instance Method Summary collapse
Instance Method Details
#perform ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'app/workers/daily_llm_model_sync_worker.rb', line 14 def perform sync_started_at = Time.current before = LlmModel.count LlmModel.refresh! after = LlmModel.count new_models = LlmModel.where("created_at >= ?", sync_started_at).order(:provider, :model_id).to_a # Check all registered constants against the freshly-synced model list. unavailable = AiModelConstants.validate_availability stale_anthropic = AiModelConstants.stale_anthropic_defaults Rails.logger.info "[DailyLlmModelSyncWorker] Synced #{after} models (#{after - before} new)" unavailable.each do |role, info| if info[:status] == :no_fallback Rails.logger.error "[DailyLlmModelSyncWorker] CRITICAL: #{role} primary #{info[:primary].inspect} " \ "not in provider APIs and NO fallback available" else Rails.logger.warn "[DailyLlmModelSyncWorker] #{role}: primary #{info[:primary].inspect} unavailable, " \ "fallback #{info[:active_fallback].inspect} will be used at runtime" end end stale_anthropic.each do |role, info| Rails.logger.warn "[DailyLlmModelSyncWorker] Stale Anthropic default: #{role} = #{info[:current].inspect}, " \ "latest = #{info[:recommended].inspect}" end if (after - before) > 0 || unavailable.any? || stale_anthropic.any? send_report( models_total: after, models_added: after - before, new_models: new_models, unavailable_models: unavailable, stale_defaults: stale_anthropic ) end end |