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