Commit ef5e56d5605ca716785bb8c2427aa86ef4e7bd0e

Authored by YunaiV
1 parent 59c74452

【代码优化】AI:硅基流动的图片生成

yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/factory/AiModelFactoryImpl.java
@@ -207,6 +207,8 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -207,6 +207,8 @@ public class AiModelFactoryImpl implements AiModelFactory {
207 return SpringUtil.getBean(QianFanImageModel.class); 207 return SpringUtil.getBean(QianFanImageModel.class);
208 case ZHI_PU: 208 case ZHI_PU:
209 return SpringUtil.getBean(ZhiPuAiImageModel.class); 209 return SpringUtil.getBean(ZhiPuAiImageModel.class);
  210 + case SILICON_FLOW:
  211 + return SpringUtil.getBean(SiliconFlowImageModel.class);
210 case OPENAI: 212 case OPENAI:
211 return SpringUtil.getBean(OpenAiImageModel.class); 213 return SpringUtil.getBean(OpenAiImageModel.class);
212 case STABLE_DIFFUSION: 214 case STABLE_DIFFUSION:
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/siliconflow/SiliconFlowApiConstants.java
@@ -27,6 +27,8 @@ public final class SiliconFlowApiConstants { @@ -27,6 +27,8 @@ public final class SiliconFlowApiConstants {
27 27
28 public static final String MODEL_DEFAULT = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"; 28 public static final String MODEL_DEFAULT = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B";
29 29
  30 + public static final String DEFAULT_IMAGE_MODEL = "Kwai-Kolors/Kolors";
  31 +
30 public static final String PROVIDER_NAME = "Siiconflow"; 32 public static final String PROVIDER_NAME = "Siiconflow";
31 33
32 } 34 }
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/siliconflow/SiliconFlowImageModel.java
@@ -31,6 +31,7 @@ import org.springframework.ai.openai.api.OpenAiImageApi; @@ -31,6 +31,7 @@ import org.springframework.ai.openai.api.OpenAiImageApi;
31 import org.springframework.ai.openai.metadata.OpenAiImageGenerationMetadata; 31 import org.springframework.ai.openai.metadata.OpenAiImageGenerationMetadata;
32 import org.springframework.ai.retry.RetryUtils; 32 import org.springframework.ai.retry.RetryUtils;
33 import org.springframework.http.ResponseEntity; 33 import org.springframework.http.ResponseEntity;
  34 +import org.springframework.lang.Nullable;
34 import org.springframework.retry.support.RetryTemplate; 35 import org.springframework.retry.support.RetryTemplate;
35 import org.springframework.util.Assert; 36 import org.springframework.util.Assert;
36 37
@@ -82,7 +83,8 @@ public class SiliconFlowImageModel implements ImageModel { @@ -82,7 +83,8 @@ public class SiliconFlowImageModel implements ImageModel {
82 83
83 @Override 84 @Override
84 public ImageResponse call(ImagePrompt imagePrompt) { 85 public ImageResponse call(ImagePrompt imagePrompt) {
85 - SiliconFlowImageApi.SiliconflowImageRequest imageRequest = createRequest(imagePrompt); 86 + SiliconFlowImageOptions requestImageOptions = mergeOptions(imagePrompt.getOptions(), this.defaultOptions);
  87 + SiliconFlowImageApi.SiliconflowImageRequest imageRequest = createRequest(imagePrompt, requestImageOptions);
86 88
87 var observationContext = ImageModelObservationContext.builder() 89 var observationContext = ImageModelObservationContext.builder()
88 .imagePrompt(imagePrompt) 90 .imagePrompt(imagePrompt)
@@ -105,13 +107,14 @@ public class SiliconFlowImageModel implements ImageModel { @@ -105,13 +107,14 @@ public class SiliconFlowImageModel implements ImageModel {
105 }); 107 });
106 } 108 }
107 109
108 - private SiliconFlowImageApi.SiliconflowImageRequest createRequest(ImagePrompt imagePrompt) { 110 + private SiliconFlowImageApi.SiliconflowImageRequest createRequest(ImagePrompt imagePrompt,
  111 + SiliconFlowImageOptions requestImageOptions) {
109 String instructions = imagePrompt.getInstructions().get(0).getText(); 112 String instructions = imagePrompt.getInstructions().get(0).getText();
110 113
111 SiliconFlowImageApi.SiliconflowImageRequest imageRequest = new SiliconFlowImageApi.SiliconflowImageRequest(instructions, 114 SiliconFlowImageApi.SiliconflowImageRequest imageRequest = new SiliconFlowImageApi.SiliconflowImageRequest(instructions,
112 - imagePrompt.getOptions().getModel()); 115 + SiliconFlowApiConstants.DEFAULT_IMAGE_MODEL);
113 116
114 - return ModelOptionsUtils.merge(imagePrompt.getOptions(), imageRequest, SiliconFlowImageApi.SiliconflowImageRequest.class); 117 + return ModelOptionsUtils.merge(requestImageOptions, imageRequest, SiliconFlowImageApi.SiliconflowImageRequest.class);
115 } 118 }
116 119
117 private ImageResponse convertResponse(ResponseEntity<OpenAiImageApi.OpenAiImageResponse> imageResponseEntity, 120 private ImageResponse convertResponse(ResponseEntity<OpenAiImageApi.OpenAiImageResponse> imageResponseEntity,
@@ -131,4 +134,26 @@ public class SiliconFlowImageModel implements ImageModel { @@ -131,4 +134,26 @@ public class SiliconFlowImageModel implements ImageModel {
131 ImageResponseMetadata openAiImageResponseMetadata = new ImageResponseMetadata(imageApiResponse.created()); 134 ImageResponseMetadata openAiImageResponseMetadata = new ImageResponseMetadata(imageApiResponse.created());
132 return new ImageResponse(imageGenerationList, openAiImageResponseMetadata); 135 return new ImageResponse(imageGenerationList, openAiImageResponseMetadata);
133 } 136 }
  137 +
  138 + private SiliconFlowImageOptions mergeOptions(@Nullable ImageOptions runtimeOptions, SiliconFlowImageOptions defaultOptions) {
  139 + var runtimeOptionsForProvider = ModelOptionsUtils.copyToTarget(runtimeOptions, ImageOptions.class,
  140 + SiliconFlowImageOptions.class);
  141 +
  142 + if (runtimeOptionsForProvider == null) {
  143 + return defaultOptions;
  144 + }
  145 +
  146 + return SiliconFlowImageOptions.builder()
  147 + // Handle portable image options
  148 + .model(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getModel(), defaultOptions.getModel()))
  149 + .batchSize(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getN(), defaultOptions.getN()))
  150 + .width(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getWidth(), defaultOptions.getWidth()))
  151 + .height(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getHeight(), defaultOptions.getHeight()))
  152 + // Handle OpenAI specific image options
  153 + .negativePrompt(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getNegativePrompt(), defaultOptions.getNegativePrompt()))
  154 + .numInferenceSteps(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getNumInferenceSteps(), defaultOptions.getNumInferenceSteps()))
  155 + .guidanceScale(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getGuidanceScale(), defaultOptions.getGuidanceScale()))
  156 + .seed(ModelOptionsUtils.mergeOption(runtimeOptionsForProvider.getSeed(), defaultOptions.getSeed()))
  157 + .build();
  158 + }
134 } 159 }
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/siliconflow/SiliconFlowImageOptions.java
@@ -89,12 +89,12 @@ public class SiliconFlowImageOptions implements ImageOptions { @@ -89,12 +89,12 @@ public class SiliconFlowImageOptions implements ImageOptions {
89 89
90 @Override 90 @Override
91 public Integer getN() { 91 public Integer getN() {
92 - return null; 92 + return batchSize;
93 } 93 }
94 94
95 @Override 95 @Override
96 public String getResponseFormat() { 96 public String getResponseFormat() {
97 - return null; 97 + return "url";
98 } 98 }
99 99
100 @Override 100 @Override