diff --git a/app/controllers/txt2_imgs_controller.rb b/app/controllers/txt2_imgs_controller.rb
index 5e6d0d3..695b3fd 100644
--- a/app/controllers/txt2_imgs_controller.rb
+++ b/app/controllers/txt2_imgs_controller.rb
@@ -1,35 +1,71 @@
class Txt2ImgsController < ApplicationController
+ before_action :authenticate_user!
+
def index
@styles = Styles.load
- api_instance = RStableDiffusionAI::DefaultApi.new
+ config = RStableDiffusionAI::Configuration.new
+ config.host = ENV['SD_API_HOST']
+ config.scheme = ENV['SD_API_SCHEME']
+ config.debugging = true
+
+ client = RStableDiffusionAI::ApiClient.new(config)
+
+ api_instance = RStableDiffusionAI::DefaultApi.new(client)
+
result = api_instance.get_sd_models_sdapi_v1_sd_models_get
@models = result.map { |model| model.model_name }
end
def create
- style = Styles.find_by_name(params[:style_template])
- style = { name: '++ None', prompt: '{prompt}', negative_prompt: '' } if style.nil?
+ style = Styles.find_by_name(image_create_params[:style_template])
+ style ||= { name: 'default', prompt: '{prompt}', negative_prompt: '' }
- prompt = params[:prompt]
+ prompt = image_create_params[:prompt]
merged_prompt = style[:prompt].gsub('{prompt}', prompt)
- merged_negative_prompt = [style[:negative_prompt], image_maker_params[:negative_prompt]].compact.join(', ')
+ merged_negative_prompt = [style[:negative_prompt], image_create_params[:negative_prompt]].compact.join(', ')
+
+ aspect_ratios = {
+ '3:2' => { height: 682, width: 1024 },
+ '1:1' => { height: 1024, width: 1024 },
+ '2:3' => { height: 1024, width: 682 }
+ }
+
+ height, width = aspect_ratios.fetch(image_create_params[:aspect_ratio], { height: 1024, width: 1024 }).values_at(:height,
+ :width)
sd_settings = {
original_prompt: image_create_params[:prompt],
prompt: merged_prompt,
negative_prompt: merged_negative_prompt,
sampler_name: 'DPM++ 2M Karras',
+ width: width,
+ height: height,
+ steps: image_create_params[:steps],
override_settings: { sd_model_checkpoint: image_create_params.delete(:sd_model) }
}.deep_symbolize_keys
- new_settings = image_create_params.to_h.deep_symbolize_keys.merge(sd_settings)
+ Rails.logger.info("sd_settings: #{sd_settings}")
+ # new_settings = image_create_params.to_h.deep_symbolize_keys.merge(sd_settings)
+ render_result = SdRenderJob.perform_now(sd_settings, current_user.id)
+
+ respond_to do |format|
+ format.turbo_stream do
+ render turbo_stream: turbo_stream.replace(
+ 'image_maker',
+ partial: 'txt2_imgs/image_maker',
+ locals: {
+ render_result: render_result
+ }
+ )
+ end
+ end
end
private
def image_create_params
- params.require(:image_maker).permit(:prompt, :style_template)
+ params.require(:image_maker).permit(:style_template, :prompt, :negative_prompt, :sd_model, :aspect_ratio, :steps)
end
end
diff --git a/app/jobs/sd_render_job.rb b/app/jobs/sd_render_job.rb
new file mode 100644
index 0000000..168142f
--- /dev/null
+++ b/app/jobs/sd_render_job.rb
@@ -0,0 +1,20 @@
+class SdRenderJob < ApplicationJob
+ queue_as :default
+
+ def perform(render_settings, user_id)
+ original_prompt = render_settings.delete(:original_prompt)
+ style_template = render_settings.delete(:style_template)
+
+ config = RStableDiffusionAI::Configuration.new
+ config.host = ENV['SD_API_HOST']
+ config.scheme = ENV['SD_API_SCHEME']
+ config.debugging = true
+
+ client = RStableDiffusionAI::ApiClient.new(config)
+
+ api_instance = RStableDiffusionAI::DefaultApi.new(client)
+
+ result = api_instance.text2imgapi_sdapi_v1_txt2img_post(render_settings)
+
+ end
+end
diff --git a/app/views/txt2_imgs/_image_maker.html.erb b/app/views/txt2_imgs/_image_maker.html.erb
new file mode 100644
index 0000000..1c27b89
--- /dev/null
+++ b/app/views/txt2_imgs/_image_maker.html.erb
@@ -0,0 +1,3 @@
+