# frozen_string_literal: true module DiscourseAi module AiHelper class Painter def commission_thumbnails(theme, user) stable_diffusion_prompt = difussion_prompt(theme, user) return [] if stable_diffusion_prompt.blank? base64_artifacts = DiscourseAi::Inference::StabilityGenerator .perform!(stable_diffusion_prompt) .dig(:artifacts) .to_a .map { |art| art[:base64] } base64_artifacts.each_with_index.map do |artifact, i| f = Tempfile.new("v1_txt2img_#{i}.png") f.binmode f.write(Base64.decode64(artifact)) f.rewind upload = UploadCreator.new(f, I18n.t("discourse_ai.ai_helper.painter.attribution")).create_for( user.id, ) f.unlink UploadSerializer.new(upload, root: false) end end private def difussion_prompt(text, user) prompt = { insts: <<~TEXT, input: text } Provide me a StableDiffusion prompt to generate an image that illustrates the following post in 40 words or less, be creative. You'll find the post between XML tags. TEXT DiscourseAi::Completions::Llm.proxy(SiteSetting.ai_helper_model).generate( prompt, user: user, ) end end end end