mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-06-19 07:03:42 +08:00
43 lines
1.4 KiB
Ruby
Vendored
43 lines
1.4 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
module Jobs
|
|
class TopicLocalizationBackfill < ::Jobs::Scheduled
|
|
every 15.minutes
|
|
cluster_concurrency 1
|
|
|
|
def execute(args)
|
|
return if !DiscourseAi::Translation.backfill_enabled?
|
|
|
|
topic_title_llm =
|
|
find_llm_model_for_agent(SiteSetting.ai_translation_topic_title_translator_agent)
|
|
post_raw_llm = find_llm_model_for_agent(SiteSetting.ai_translation_post_raw_translator_agent)
|
|
|
|
if (topic_title_llm && !LlmCreditAllocation.credits_available?(topic_title_llm)) ||
|
|
(post_raw_llm && !LlmCreditAllocation.credits_available?(post_raw_llm))
|
|
Rails.logger.info(
|
|
"Topic localization backfill skipped: insufficient credits. Will resume when credits reset.",
|
|
)
|
|
return
|
|
end
|
|
|
|
limit = SiteSetting.ai_translation_backfill_hourly_rate / (60 / 15) # this job runs in 15-minute intervals
|
|
return if limit == 0
|
|
|
|
pairs = DiscourseAi::Translation::TopicCandidates.needs_localization(limit: limit)
|
|
return if pairs.empty?
|
|
|
|
Jobs.enqueue(:localize_topics, pairs: pairs)
|
|
end
|
|
|
|
private
|
|
|
|
def find_llm_model_for_agent(agent_id)
|
|
return nil if agent_id.blank?
|
|
|
|
agent_klass = AiAgent.find_by_id_from_cache(agent_id)
|
|
return nil if agent_klass.blank?
|
|
|
|
DiscourseAi::Translation::BaseTranslator.preferred_llm_model(agent_klass)
|
|
end
|
|
end
|
|
end
|