Module: SmartPrompt::SiliconFlow::Image
- Included in:
- SmartPrompt::SiliconFlowAdapter
- Defined in:
- lib/smart_prompt/adapters/siliconflow/image.rb
Overview
Text-to-image (Kolors) + image editing (Qwen-Image-Edit). save_image comes from the ImagePersistence concern.
Constant Summary collapse
- DEFAULT_IMAGE_SIZE =
Default resolution for text-to-image (Kolors accepts these "WxH" values).
"1024x1024".freeze
Instance Method Summary collapse
-
#edit_image(prompt, params = {}) ⇒ Object
Image editing / image-to-image (Qwen/Qwen-Image-Edit-2509 and Kolors composable).
-
#generate_image(prompt, params = {}) ⇒ Object
Text-to-image.
Instance Method Details
#edit_image(prompt, params = {}) ⇒ Object
Image editing / image-to-image (Qwen/Qwen-Image-Edit-2509 and Kolors composable).
image (and optionally +image2+/+image3+) may be a local file path, a base64
data URL, or a public http(s) URL. Edit models reject image_size, so we omit it.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/smart_prompt/adapters/siliconflow/image.rb', line 48 def edit_image(prompt, params = {}) SmartPrompt.logger.info "SiliconFlowAdapter: editing image" raise Error, "Prompt cannot be empty" if prompt.nil? || prompt.to_s.strip.empty? raise Error, "An input image is required for image editing" if params[:image].nil? && params[:image_file].nil? model_name = params[:model] || @config["image_model"] || @config["model"] raise Error, "No model configured for image generation" if model_name.nil? || model_name.to_s.strip.empty? body = { "model" => model_name, "prompt" => prompt.to_s } body["image"] = normalize_input_image(params[:image] || params[:image_file]) body["image2"] = normalize_input_image(params[:image2]) if params[:image2] body["image3"] = normalize_input_image(params[:image3]) if params[:image3] body["negative_prompt"] = params[:negative_prompt] if params[:negative_prompt] body["seed"] = params[:seed] if params[:seed] body["guidance_scale"] = params[:guidance_scale] if params[:guidance_scale] SmartPrompt.logger.info "SiliconFlow image edit params: #{body.except('prompt', 'image', 'image2', 'image3').inspect}" response = begin http_post_json(@image_url, body) rescue LLMAPIError, Error raise rescue => e raise Error, "Failed to call SiliconFlow image edit: #{e.}" end images = parse_image_response(response) SmartPrompt.logger.info "SiliconFlowAdapter: edited into #{images.size} image(s)" images end |
#generate_image(prompt, params = {}) ⇒ Object
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/smart_prompt/adapters/siliconflow/image.rb', line 12 def generate_image(prompt, params = {}) SmartPrompt.logger.info "SiliconFlowAdapter: generating image" raise Error, "Prompt cannot be empty" if prompt.nil? || prompt.to_s.strip.empty? model_name = params[:model] || @config["image_model"] || @config["model"] raise Error, "No model configured for image generation" if model_name.nil? || model_name.to_s.strip.empty? body = { "model" => model_name, "prompt" => prompt.to_s } body["image_size"] = resolve_image_size(params[:image_size] || params[:size]) body["negative_prompt"] = params[:negative_prompt] if params[:negative_prompt] body["seed"] = params[:seed] if params[:seed] body["num_inference_steps"] = params[:num_inference_steps] if params[:num_inference_steps] body["guidance_scale"] = params[:guidance_scale] if params[:guidance_scale] # batch_size only applies to a subset of models (e.g. Kolors); send it only # when the caller explicitly asks for it. batch = params[:batch_size] || params[:n] body["batch_size"] = batch if batch SmartPrompt.logger.info "SiliconFlow image params: #{body.except('prompt').inspect}" response = begin http_post_json(@image_url, body) rescue LLMAPIError, Error raise rescue => e raise Error, "Failed to call SiliconFlow image generation: #{e.}" end images = parse_image_response(response) SmartPrompt.logger.info "SiliconFlowAdapter: generated #{images.size} image(s)" images end |