Commit 9f9366f1581ff3431b469ec9b5df0015ab02ca6b

Authored by YunaiV
1 parent ea8f532f

feat:【ai】增加 Grok 接入

yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java
@@ -255,6 +255,28 @@ public class AiAutoConfiguration { @@ -255,6 +255,28 @@ public class AiAutoConfiguration {
255 return new SunoApi(yudaoAiProperties.getSuno().getBaseUrl()); 255 return new SunoApi(yudaoAiProperties.getSuno().getBaseUrl());
256 } 256 }
257 257
  258 + public ChatModel buildGrokChatClient(YudaoAiProperties.Grok properties) {
  259 + if (StrUtil.isEmpty(properties.getModel())) {
  260 + properties.setModel(GrokChatModel.MODEL_DEFAULT);
  261 + }
  262 + OpenAiChatModel openAiChatModel = OpenAiChatModel.builder()
  263 + .openAiApi(OpenAiApi.builder()
  264 + .baseUrl(Optional.ofNullable(properties.getBaseUrl())
  265 + .orElse(GrokChatModel.BASE_URL))
  266 + .completionsPath(GrokChatModel.COMPLETE_PATH)
  267 + .apiKey(properties.getApiKey())
  268 + .build())
  269 + .defaultOptions(OpenAiChatOptions.builder()
  270 + .model(properties.getModel())
  271 + .temperature(properties.getTemperature())
  272 + .maxTokens(properties.getMaxTokens())
  273 + .topP(properties.getTopP())
  274 + .build())
  275 + .toolCallingManager(getToolCallingManager())
  276 + .build();
  277 + return new DouBaoChatModel(openAiChatModel);
  278 + }
  279 +
258 // ========== RAG 相关 ========== 280 // ========== RAG 相关 ==========
259 281
260 @Bean 282 @Bean
@@ -289,25 +311,4 @@ public class AiAutoConfiguration { @@ -289,25 +311,4 @@ public class AiAutoConfiguration {
289 return List.of(ToolCallbacks.from(personService)); 311 return List.of(ToolCallbacks.from(personService));
290 } 312 }
291 313
292 - public ChatModel buildGrokChatClient(YudaoAiProperties.Grok properties) {  
293 - if (StrUtil.isEmpty(properties.getModel())) {  
294 - properties.setModel(GrokChatModel.MODEL_DEFAULT);  
295 - }  
296 - OpenAiChatModel openAiChatModel = OpenAiChatModel.builder()  
297 - .openAiApi(OpenAiApi.builder()  
298 - .baseUrl(Optional.ofNullable(properties.getBaseUrl())  
299 - .orElse(GrokChatModel.BASE_URL))  
300 - .completionsPath(GrokChatModel.COMPLETE_PATH)  
301 - .apiKey(properties.getApiKey())  
302 - .build())  
303 - .defaultOptions(OpenAiChatOptions.builder()  
304 - .model(properties.getModel())  
305 - .temperature(properties.getTemperature())  
306 - .maxTokens(properties.getMaxTokens())  
307 - .topP(properties.getTopP())  
308 - .build())  
309 - .toolCallingManager(getToolCallingManager())  
310 - .build();  
311 - return new DouBaoChatModel(openAiChatModel);  
312 - }  
313 } 314 }
314 \ No newline at end of file 315 \ No newline at end of file
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/AiModelFactoryImpl.java
@@ -407,12 +407,6 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -407,12 +407,6 @@ public class AiModelFactoryImpl implements AiModelFactory {
407 .build(); 407 .build();
408 } 408 }
409 409
410 - private ChatModel buildGrokChatModel(String apiKey,String url) {  
411 - YudaoAiProperties.Grok properties = new YudaoAiProperties.Grok()  
412 - .setBaseUrl(url)  
413 - .setApiKey(apiKey);  
414 - return new AiAutoConfiguration().buildGrokChatClient(properties);  
415 - }  
416 /** 410 /**
417 * 可参考 {@link AiAutoConfiguration#douBaoChatClient(YudaoAiProperties)} 411 * 可参考 {@link AiAutoConfiguration#douBaoChatClient(YudaoAiProperties)}
418 */ 412 */
@@ -596,6 +590,13 @@ public class AiModelFactoryImpl implements AiModelFactory { @@ -596,6 +590,13 @@ public class AiModelFactoryImpl implements AiModelFactory {
596 return new StabilityAiImageModel(stabilityAiApi); 590 return new StabilityAiImageModel(stabilityAiApi);
597 } 591 }
598 592
  593 + private ChatModel buildGrokChatModel(String apiKey,String url) {
  594 + YudaoAiProperties.Grok properties = new YudaoAiProperties.Grok()
  595 + .setBaseUrl(url)
  596 + .setApiKey(apiKey);
  597 + return new AiAutoConfiguration().buildGrokChatClient(properties);
  598 + }
  599 +
599 // ========== 各种创建 EmbeddingModel 的方法 ========== 600 // ========== 各种创建 EmbeddingModel 的方法 ==========
600 601
601 /** 602 /**
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java
@@ -68,6 +68,7 @@ public class AiUtils { @@ -68,6 +68,7 @@ public class AiUtils {
68 case OPENAI: 68 case OPENAI:
69 case GEMINI: // 复用 OpenAI 客户端 69 case GEMINI: // 复用 OpenAI 客户端
70 case BAI_CHUAN: // 复用 OpenAI 客户端 70 case BAI_CHUAN: // 复用 OpenAI 客户端
  71 + case GROK: // 复用 OpenAI 客户端
71 return OpenAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) 72 return OpenAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)
72 .toolCallbacks(toolCallbacks).toolContext(toolContext).build(); 73 .toolCallbacks(toolCallbacks).toolContext(toolContext).build();
73 case AZURE_OPENAI: 74 case AZURE_OPENAI:
@@ -79,9 +80,6 @@ public class AiUtils { @@ -79,9 +80,6 @@ public class AiUtils {
79 case OLLAMA: 80 case OLLAMA:
80 return OllamaChatOptions.builder().model(model).temperature(temperature).numPredict(maxTokens) 81 return OllamaChatOptions.builder().model(model).temperature(temperature).numPredict(maxTokens)
81 .toolCallbacks(toolCallbacks).toolContext(toolContext).build(); 82 .toolCallbacks(toolCallbacks).toolContext(toolContext).build();
82 - case GROK:  
83 - return OpenAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)  
84 - .toolCallbacks(toolCallbacks).toolContext(toolContext).build();  
85 default: 83 default:
86 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); 84 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform));
87 } 85 }