diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index b997fe008..c12f285e3 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -28,7 +28,7 @@ 1.0.0-M1 - 2.14.0 + 2.15.1 4.23.0 diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/pom.xml b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/pom.xml new file mode 100644 index 000000000..5a3198ac9 --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/pom.xml @@ -0,0 +1,81 @@ + + + + + + + + spring-cloud-alibaba-examples + com.alibaba.cloud + ${revision} + ../../pom.xml + + 4.0.0 + + spring-cloud-ai-chat-msg-context-example + Spring Cloud Starter Alibaba AI Chat Message Context Holder Example + Example for Chat Message Context Holder By Spring Cloud Alibaba AI + jar + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-ai + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + true + + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/ChatMsgApplication.java b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/ChatMsgApplication.java new file mode 100644 index 000000000..c727befca --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/ChatMsgApplication.java @@ -0,0 +1,35 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.ai.example.tongyi; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author yuluo + * @author yuluo + */ + +@SpringBootApplication +public class ChatMsgApplication { + + public static void main(String[] args) { + + SpringApplication.run(ChatMsgApplication.class, args); + } + +} diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/MessageContextHolder.java b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/MessageContextHolder.java new file mode 100644 index 000000000..347037a6b --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/MessageContextHolder.java @@ -0,0 +1,47 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.ai.example.tongyi.context; + +import java.util.List; + +import org.springframework.ai.chat.messages.Message; + +/** + * @author yuluo + * @author yuluo + */ + +public interface MessageContextHolder { + + /** + * Th default session id key. + * Can use session_id request_id &etc. + */ + String SCA_SESSION_ID = "SCA_SESSION_ID"; + + void addMsg(String sessionId, Message msg); + + void removeMsg(String sessionId); + + List getMsg(String sessionId); + + default String getSCASessionId() { + + return SCA_SESSION_ID; + } + +} diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/defaults/MemoryMessageContextHolder.java b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/defaults/MemoryMessageContextHolder.java new file mode 100644 index 000000000..f67226620 --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/defaults/MemoryMessageContextHolder.java @@ -0,0 +1,76 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.ai.example.tongyi.context.defaults; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + +import com.alibaba.cloud.ai.example.tongyi.context.MessageContextHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.ai.chat.messages.Message; +import org.springframework.stereotype.Component; + +/** + * @author yuluo + * @author yuluo + */ + +@Component +public class MemoryMessageContextHolder implements MessageContextHolder { + + private static final Logger log = LoggerFactory.getLogger(MemoryMessageContextHolder.class); + + private final Map> msgContextHolderMap = new HashMap<>(); + + @Override + public void addMsg(String sessionId, Message msg) { + + msgContextHolderMap.computeIfAbsent(sessionId, k -> new ArrayList<>()); + log.info("addMsg: sessionId={}, msg={}", sessionId, msg); + } + + @Override + public void removeMsg(String sessionId) { + + msgContextHolderMap.remove(sessionId); + } + + @Override + public List getMsg(String sessionId) { + + return new ArrayList<>(msgContextHolderMap.getOrDefault(sessionId, new ArrayList<>())); + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("MessageContextHolderImpl{"); + StringJoiner joiner = new StringJoiner(", ", "{", "}"); + for (Map.Entry> entry : msgContextHolderMap.entrySet()) { + joiner.add(entry.getKey() + "=" + entry.getValue().toString()); + } + sb.append("msgContextHolderMap=").append(joiner); + sb.append('}'); + return sb.toString(); + } +} diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/defaults/RedisMessageContextHolder.java b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/defaults/RedisMessageContextHolder.java new file mode 100644 index 000000000..9aaf2409b --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/context/defaults/RedisMessageContextHolder.java @@ -0,0 +1,52 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.ai.example.tongyi.context.defaults; + +import java.util.List; + +import com.alibaba.cloud.ai.example.tongyi.context.MessageContextHolder; + +import org.springframework.ai.chat.messages.Message; + +/** + * @author yuluo + * @author yuluo + */ + +//@Component +public class RedisMessageContextHolder implements MessageContextHolder { + + @Override + public void addMsg(String sessionId, Message msg) { + + System.out.println("RedisMessageContextHolder addMsg"); + } + + @Override + public void removeMsg(String sessionId) { + + System.out.println("RedisMessageContextHolder removeMsg"); + } + + @Override + public List getMsg(String sessionId) { + + System.out.println("RedisMessageContextHolder getMsg"); + return null; + } + +} diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/controller/ChatMsgController.java b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/controller/ChatMsgController.java new file mode 100644 index 000000000..3f0244204 --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/controller/ChatMsgController.java @@ -0,0 +1,45 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.ai.example.tongyi.controller; + +import com.alibaba.cloud.ai.example.tongyi.service.ChatMsgService; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author yuluo + * @author yuluo + */ + +@RestController +@RequestMapping("/chat") +public class ChatMsgController { + + @Autowired + private ChatMsgService msgService; + + @GetMapping("/msg") + public String completion(@RequestParam String message) { + + return msgService.completion(message); + } + +} diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/service/ChatMsgService.java b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/service/ChatMsgService.java new file mode 100644 index 000000000..7453cf56b --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/java/com/alibaba/cloud/ai/example/tongyi/service/ChatMsgService.java @@ -0,0 +1,69 @@ +/* + * Copyright 2023-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.ai.example.tongyi.service; + +import com.alibaba.cloud.ai.example.tongyi.context.MessageContextHolder; + +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.model.ChatModel; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author yuluo + * @author yuluo + */ + +@Service +public class ChatMsgService { + + private final ChatModel chatModel; + + private final MessageContextHolder messageContextHolder; + + @Autowired + public ChatMsgService(ChatModel chatModel, MessageContextHolder messageContextHolder) { + this.chatModel = chatModel; + this.messageContextHolder = messageContextHolder; + } + + public String completion(String message) { + + // create chat prompt + Prompt prompt = new Prompt(new UserMessage(message)); + + // collect user message + messageContextHolder.addMsg( + messageContextHolder.getSCASessionId(), + prompt.getInstructions().get(0) + ); + + ChatResponse resp = chatModel.call(prompt); + + // collect model response + messageContextHolder.addMsg( + messageContextHolder.getSCASessionId(), + resp.getResult().getOutput() + ); + + return resp.getResult().getOutput().getContent(); + + } + +} diff --git a/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/resources/application.yml b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/resources/application.yml new file mode 100644 index 000000000..ae8fa1f42 --- /dev/null +++ b/spring-cloud-alibaba-examples/ai-example/spring-cloud-ai-chat-msg-context-example/src/main/resources/application.yml @@ -0,0 +1,26 @@ +# +# Copyright 2023-2024 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +server: + port: 8084 + +spring: + application: + name: tongyi-example + +# please setting api-key. suggestion by environment variable. +# Note: api-key is invalid, please apply for a new one. +# export SPRING_CLOUD_AI_TONGYI_API_KEY=sk-a3d73b1709bf4a178c28ed7c8b3b5a345 diff --git a/spring-cloud-alibaba-examples/pom.xml b/spring-cloud-alibaba-examples/pom.xml index def6e1d54..cf858d2fb 100644 --- a/spring-cloud-alibaba-examples/pom.xml +++ b/spring-cloud-alibaba-examples/pom.xml @@ -53,6 +53,7 @@ integrated-example/integrated-frontend ai-example/spring-cloud-ai-example ai-example/spring-cloud-ai-rag-example + ai-example/spring-cloud-ai-chat-msg-context-example spring-cloud-scheduling-example diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/pom.xml index 6b9e0f1fb..2658378b2 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/pom.xml @@ -91,6 +91,12 @@ test + + javax.annotation + jsr250-api + 1.0 + + diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/TongYiAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/TongYiAutoConfiguration.java index 00caf3d8b..30a75dc0b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/TongYiAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/TongYiAutoConfiguration.java @@ -34,7 +34,6 @@ import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.audio.asr.transcription.Transcription; import com.alibaba.dashscope.audio.tts.SpeechSynthesizer; -import com.alibaba.dashscope.common.MessageManager; import com.alibaba.dashscope.embeddings.TextEmbedding; import com.alibaba.dashscope.exception.NoApiKeyException; import com.alibaba.dashscope.utils.ApiKey; @@ -58,7 +57,6 @@ @AutoConfiguration @ConditionalOnClass({ - MessageManager.class, TongYiChatModel.class, TongYiImagesModel.class, TongYiAudioSpeechModel.class, @@ -83,14 +81,6 @@ public Generation generation() { return new Generation(); } - @Bean - @Scope("prototype") - @ConditionalOnMissingBean - public MessageManager msgManager() { - - return new MessageManager(10); - } - @Bean @Scope("prototype") @ConditionalOnMissingBean diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/chat/TongYiChatModel.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/chat/TongYiChatModel.java index 964045e9d..d6c2dbc56 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/chat/TongYiChatModel.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/chat/TongYiChatModel.java @@ -15,18 +15,17 @@ */ package com.alibaba.cloud.ai.tongyi.chat; + import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; - import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException; import com.alibaba.dashscope.aigc.conversation.ConversationParam; import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationOutput; import com.alibaba.dashscope.aigc.generation.GenerationResult; -import com.alibaba.dashscope.common.MessageManager; import com.alibaba.dashscope.common.Role; import com.alibaba.dashscope.exception.InputRequiredException; import com.alibaba.dashscope.exception.NoApiKeyException; @@ -51,7 +50,6 @@ import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.AbstractFunctionCallSupport; import org.springframework.ai.model.function.FunctionCallbackContext; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -85,12 +83,6 @@ public class TongYiChatModel extends */ private TongYiChatOptions defaultOptions; - /** - * User role message manager. - */ - @Autowired - private MessageManager msgManager; - /** * Initializes an instance of the TongYiChatClient. * @param generation DashScope generation client. @@ -144,19 +136,7 @@ public TongYiChatOptions getDefaultOptions() { public ChatResponse call(Prompt prompt) { ConversationParam params = toTongYiChatParams(prompt); - - // TongYi models context loader. - com.alibaba.dashscope.common.Message message = new com.alibaba.dashscope.common.Message(); - message.setRole(Role.USER.getValue()); - message.setContent(prompt.getContents()); - msgManager.add(message); - params.setMessages(msgManager.get()); - - logger.trace("TongYi ConversationOptions: {}", params); GenerationResult chatCompletions = this.callWithFunctionSupport(params); - logger.trace("TongYi ConversationOptions: {}", params); - - msgManager.add(chatCompletions); List generations = chatCompletions @@ -183,7 +163,8 @@ public Flux stream(Prompt prompt) { ConversationParam tongYiChatParams = toTongYiChatParams(prompt); // See https://help.aliyun.com/zh/dashscope/developer-reference/api-details?spm=a2c4g.11186623.0.0.655fc11aRR0jj7#b9ad0a10cfhpe - // tongYiChatParams.setIncrementalOutput(true); + // enable incremental output + tongYiChatParams.setIncrementalOutput(true); try { genRes = generation.streamCall(tongYiChatParams); @@ -226,7 +207,9 @@ public ConversationParam toTongYiChatParams(Prompt prompt) { Set functionsForThisRequest = new HashSet<>(); - List tongYiMessage = prompt.getInstructions().stream() + List tongYiMessage = prompt + .getInstructions() + .stream() .map(this::fromSpringAIMessage) .toList(); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/TongYiAiChatResponseMetadata.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/TongYiAiChatResponseMetadata.java index 2afdcc9bc..e979ab696 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/TongYiAiChatResponseMetadata.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/TongYiAiChatResponseMetadata.java @@ -25,8 +25,6 @@ import org.springframework.ai.chat.metadata.Usage; import org.springframework.util.Assert; - - /** * {@link ChatResponseMetadata} implementation for {@literal Alibaba DashScope}. * diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioSpeechResponseMetadata.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioSpeechResponseMetadata.java index ddd516813..0170a64f7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioSpeechResponseMetadata.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioSpeechResponseMetadata.java @@ -27,8 +27,6 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; - - /** * @author yuluo * @author yuluo diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioTranscriptionResponseMetadata.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioTranscriptionResponseMetadata.java index 6479782fd..1fcc8dfac 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioTranscriptionResponseMetadata.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-ai/src/main/java/com/alibaba/cloud/ai/tongyi/metadata/audio/TongYiAudioTranscriptionResponseMetadata.java @@ -18,18 +18,15 @@ import java.util.HashMap; -import javax.annotation.Nullable; - import com.alibaba.dashscope.audio.asr.transcription.TranscriptionResult; import com.google.gson.JsonObject; import org.springframework.ai.chat.metadata.EmptyRateLimit; import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.model.ResponseMetadata; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; - - /** * @author yuluo * @author yuluo