# frozen_string_literal: true module DiscourseAi module AiHelper class Painter def commission_thumbnails(theme, user) stable_diffusion_prompt = difussion_prompt(theme) 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, "ai_helper_image.png").create_for(user.id) f.unlink upload.short_url end end private def difussion_prompt(text) llm_prompt = LlmPrompt.new prompt_for_provider = completion_prompts.find { |prompt| prompt.provider == llm_prompt.enabled_provider } return "" if prompt_for_provider.nil? llm_prompt .generate_and_send_prompt(prompt_for_provider, { text: text }) .dig(:suggestions) .first end def completion_prompts [ CompletionPrompt.new( provider: "anthropic", prompt_type: CompletionPrompt.prompt_types[:text], messages: [{ role: "Human", content: <<~TEXT }], Provide me a StableDiffusion prompt to generate an image that illustrates the following post in 40 words or less, be creative. The post is provided between tags and the Stable Diffusion prompt string should be returned between tags. TEXT ), CompletionPrompt.new( provider: "openai", prompt_type: CompletionPrompt.prompt_types[:text], messages: [{ role: "system", content: <<~TEXT }], Provide me a StableDiffusion prompt to generate an image that illustrates the following post in 40 words or less, be creative. TEXT ), CompletionPrompt.new( provider: "huggingface", prompt_type: CompletionPrompt.prompt_types[:text], messages: [<<~TEXT], ### System: Provide me a StableDiffusion prompt to generate an image that illustrates the following post in 40 words or less, be creative. ### User: {{user_input}} ### Assistant: Here is a StableDiffusion prompt: TEXT ), ] end end end end