# frozen_string_literal: true module DiscourseAi module Translation class LanguageDetector DETECTION_CHAR_LIMIT = 1000 def initialize(text) @text = text end def detect return nil if !SiteSetting.ai_translation_enabled if ( ai_persona = AiPersona.find_by(id: SiteSetting.ai_translation_locale_detector_persona) ).blank? return nil end persona_klass = ai_persona.class_instance persona = persona_klass.new llm_model = DiscourseAi::Translation::BaseTranslator.preferred_llm_model(persona_klass) return nil if llm_model.blank? bot = DiscourseAi::Personas::Bot.as( ai_persona.user || Discourse.system_user, persona: persona, model: llm_model, ) context = DiscourseAi::Personas::BotContext.new( user: ai_persona.user || Discourse.system_user, skip_tool_details: true, feature_name: "translation", messages: [{ type: :user, content: @text }], ) structured_output = nil bot.reply(context) do |partial, _, type| structured_output = partial if type == :structured_output end structured_output&.read_buffered_property(:locale) || [] end end end end